habanalabs/gaudi: derive security status from pci id
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>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user