habanalabs/gaudi: derive security status from pci id
authorOfir Bitton <obitton@habana.ai>
Thu, 1 Apr 2021 10:43:40 +0000 (13:43 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Fri, 9 Apr 2021 11:09:25 +0000 (14:09 +0300)
As F/ security indication must be available before driver approaches
PCI bus, F/W security should be derived from PCI id rather than be
fetched during boot handshake with F/W.

Signed-off-by: Ofir Bitton <obitton@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/misc/habanalabs/common/device.c
drivers/misc/habanalabs/common/firmware_if.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/common/habanalabs_drv.c
drivers/misc/habanalabs/common/mmu/mmu.c
drivers/misc/habanalabs/common/sysfs.c
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/goya/goya.c

index 2ed4f2bedc08aee0f7e87ae91264537fe08ed636..00e92b6788284eaf293f8e2d55bc966c7f3d2528 100644 (file)
@@ -327,6 +327,10 @@ static int device_early_init(struct hl_device *hdev)
                gaudi_set_asic_funcs(hdev);
                strscpy(hdev->asic_name, "GAUDI", sizeof(hdev->asic_name));
                break;
+       case ASIC_GAUDI_SEC:
+               gaudi_set_asic_funcs(hdev);
+               strscpy(hdev->asic_name, "GAUDI SEC", sizeof(hdev->asic_name));
+               break;
        default:
                dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
                        hdev->asic_type);
index 532a2fd7bfb4679425aa10380090f092e093676e..652571d3b8e6d642d7cdc4de188d14bffbdbc3f1 100644 (file)
@@ -819,16 +819,16 @@ int hl_fw_read_preboot_status(struct hl_device *hdev, u32 cpu_boot_status_reg,
        if (security_status & CPU_BOOT_DEV_STS0_ENABLED) {
                prop->fw_security_status_valid = 1;
 
+               /* FW security should be derived from PCI ID, we keep this
+                * check for backward compatibility
+                */
                if (security_status & CPU_BOOT_DEV_STS0_SECURITY_EN)
                        prop->fw_security_disabled = false;
-               else
-                       prop->fw_security_disabled = true;
 
                if (security_status & CPU_BOOT_DEV_STS0_FW_HARD_RST_EN)
                        prop->hard_reset_done_by_fw = true;
        } else {
                prop->fw_security_status_valid = 0;
-               prop->fw_security_disabled = true;
        }
 
        dev_dbg(hdev->dev, "Firmware preboot security status %#x\n",
index 867986ef4588ee2bdbc985d6c816247519319b9b..c1b46126c5222d426f233d935d5aeb5e126b50c3 100644 (file)
@@ -766,11 +766,13 @@ struct hl_eq {
  * @ASIC_INVALID: Invalid ASIC type.
  * @ASIC_GOYA: Goya device.
  * @ASIC_GAUDI: Gaudi device.
+ * @ASIC_GAUDI_SEC: Gaudi secured device (HL-2000).
  */
 enum hl_asic_type {
        ASIC_INVALID,
        ASIC_GOYA,
-       ASIC_GAUDI
+       ASIC_GAUDI,
+       ASIC_GAUDI_SEC
 };
 
 struct hl_cs_parser;
index 59896566dca1e24002634c86932ad4619722caa8..7135f1e03864107b6bcdf8b6040f1f8ff15dfe3e 100644 (file)
@@ -47,10 +47,12 @@ MODULE_PARM_DESC(memory_scrub,
 
 #define PCI_IDS_GOYA                   0x0001
 #define PCI_IDS_GAUDI                  0x1000
+#define PCI_IDS_GAUDI_SEC              0x1010
 
 static const struct pci_device_id ids[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_HABANALABS, PCI_IDS_GOYA), },
        { PCI_DEVICE(PCI_VENDOR_ID_HABANALABS, PCI_IDS_GAUDI), },
+       { PCI_DEVICE(PCI_VENDOR_ID_HABANALABS, PCI_IDS_GAUDI_SEC), },
        { 0, }
 };
 MODULE_DEVICE_TABLE(pci, ids);
@@ -74,6 +76,9 @@ static enum hl_asic_type get_asic_type(u16 device)
        case PCI_IDS_GAUDI:
                asic_type = ASIC_GAUDI;
                break;
+       case PCI_IDS_GAUDI_SEC:
+               asic_type = ASIC_GAUDI_SEC;
+               break;
        default:
                asic_type = ASIC_INVALID;
                break;
@@ -82,6 +87,16 @@ static enum hl_asic_type get_asic_type(u16 device)
        return asic_type;
 }
 
+static bool is_asic_secured(enum hl_asic_type asic_type)
+{
+       switch (asic_type) {
+       case ASIC_GAUDI_SEC:
+               return true;
+       default:
+               return false;
+       }
+}
+
 /*
  * hl_device_open - open function for habanalabs device
  *
@@ -287,6 +302,12 @@ int create_hdev(struct hl_device **dev, struct pci_dev *pdev,
                hdev->asic_type = asic_type;
        }
 
+       if (pdev)
+               hdev->asic_prop.fw_security_disabled =
+                               !is_asic_secured(pdev->device);
+       else
+               hdev->asic_prop.fw_security_disabled = true;
+
        /* Assign status description string */
        strncpy(hdev->status[HL_DEVICE_STATUS_MALFUNCTION],
                                        "disabled", HL_STR_MAX);
index ae1778103e23d9244debf46e1fcc30ccca4ceb4d..b37189956b146604f5562426a78fb808f8dec281 100644 (file)
@@ -591,6 +591,7 @@ int hl_mmu_if_set_funcs(struct hl_device *hdev)
        switch (hdev->asic_type) {
        case ASIC_GOYA:
        case ASIC_GAUDI:
+       case ASIC_GAUDI_SEC:
                hl_mmu_v1_set_funcs(hdev, &hdev->mmu_func[MMU_DR_PGT]);
                break;
        default:
index c7ac5dc0cda48ad8fffa3bcd301b3b18ff35c685..9fa61573a89de89e15d4f80e5a228bb66a890536 100644 (file)
@@ -257,6 +257,9 @@ static ssize_t device_type_show(struct device *dev,
        case ASIC_GAUDI:
                str = "GAUDI";
                break;
+       case ASIC_GAUDI_SEC:
+               str = "GAUDI SEC";
+               break;
        default:
                dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
                                hdev->asic_type);
index 62e3c63bec20af85d21285a4cd6e02c669611f6d..841748392e496dc2b441276abc82bbe55dbf3afa 100644 (file)
@@ -575,8 +575,6 @@ static int gaudi_get_fixed_properties(struct hl_device *hdev)
        for (i = 0 ; i < HL_MAX_DCORES ; i++)
                prop->first_available_cq[i] = USHRT_MAX;
 
-       /* disable fw security for now, set it in a later stage */
-       prop->fw_security_disabled = true;
        prop->fw_security_status_valid = false;
        prop->hard_reset_done_by_fw = false;
 
index 9d49ba649db0c2fe49ffe2b4115f5c41aae6fe55..44dd4d8d88225cbb4d214205296a7e8d0aaafea8 100644 (file)
@@ -484,8 +484,6 @@ int goya_get_fixed_properties(struct hl_device *hdev)
        for (i = 0 ; i < HL_MAX_DCORES ; i++)
                prop->first_available_cq[i] = USHRT_MAX;
 
-       /* disable fw security for now, set it in a later stage */
-       prop->fw_security_disabled = true;
        prop->fw_security_status_valid = false;
        prop->hard_reset_done_by_fw = false;