diff options
author | Koby Elbaz <kelbaz@habana.ai> | 2021-05-18 15:43:47 +0300 |
---|---|---|
committer | Oded Gabbay <ogabbay@kernel.org> | 2021-06-18 15:23:40 +0300 |
commit | 3649eaea2754e0d64a5a6726e46093b490c226d7 (patch) | |
tree | ff875f5a50d94cb577c7abe4717d4faa9debd324 /drivers/misc/habanalabs/gaudi | |
parent | 7feffb6815450bbcbed96a870a36a56f20608640 (diff) | |
download | linux-3649eaea2754e0d64a5a6726e46093b490c226d7.tar.xz |
habanalabs/gaudi: disable GIC usage if security is enabled
Security is set based on PCI ID, and after reading preboot status bits.
GIC usage is set in both scenarios since GIC can't be used when security
is enabled.
Moreover, writing to GIC/SP is enabled only after Linux is fully loaded.
Signed-off-by: Koby Elbaz <kelbaz@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Diffstat (limited to 'drivers/misc/habanalabs/gaudi')
-rw-r--r-- | drivers/misc/habanalabs/gaudi/gaudi.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c index 1fa12394e3b6..4249dffdb7f7 100644 --- a/drivers/misc/habanalabs/gaudi/gaudi.c +++ b/drivers/misc/habanalabs/gaudi/gaudi.c @@ -689,6 +689,12 @@ static int gaudi_early_init(struct hl_device *hdev) /* If FW security is enabled at this point it means no access to ELBI */ if (!hdev->asic_prop.fw_security_disabled) { hdev->asic_prop.iatu_done_by_fw = true; + + /* + * GIC-security-bit can ONLY be set by CPUCP, so in this stage + * decision can only be taken based on PCI ID security. + */ + hdev->asic_prop.gic_interrupts_enable = false; goto pci_init; } @@ -3829,6 +3835,7 @@ static void gaudi_init_firmware_loader(struct hl_device *hdev) struct fw_load_mgr *fw_loader = &hdev->fw_loader; /* fill common fields */ + fw_loader->linux_loaded = false; fw_loader->boot_fit_img.image_name = GAUDI_BOOT_FIT_FILE; fw_loader->linux_img.image_name = GAUDI_LINUX_FW_FILE; fw_loader->cpu_timeout = GAUDI_CPU_TIMEOUT_USEC; @@ -4103,11 +4110,13 @@ static void gaudi_hw_fini(struct hl_device *hdev, bool hard_reset) else WREG32(mmPSOC_GLOBAL_CONF_KMD_MSG_TO_CPU, KMD_MSG_GOTO_WFE); - irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ? - mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR : - le32_to_cpu(dyn_regs->gic_host_irq_ctrl); + if (hdev->fw_loader.linux_loaded) { + irq_handler_offset = hdev->asic_prop.gic_interrupts_enable ? + mmGIC_DISTRIBUTOR__5_GICD_SETSPI_NSR : + le32_to_cpu(dyn_regs->gic_host_irq_ctrl); - WREG32(irq_handler_offset, GAUDI_EVENT_HALT_MACHINE); + WREG32(irq_handler_offset, GAUDI_EVENT_HALT_MACHINE); + } if (hdev->asic_prop.fw_security_disabled && !hdev->asic_prop.hard_reset_done_by_fw) { |