Commit 6bbb77b9 authored by Ofir Bitton's avatar Ofir Bitton Committed by Oded Gabbay

habanalabs: full FW hard reset support

Driver must fetch FW hard reset capability at every FW boot stage:
preboot, CPU boot, CPU application.
If hard reset is triggered, driver will take into consideration
only the last capability received.
Signed-off-by: default avatarOfir Bitton <obitton@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent 0024c094
...@@ -629,32 +629,36 @@ int hl_fw_read_preboot_status(struct hl_device *hdev, u32 cpu_boot_status_reg, ...@@ -629,32 +629,36 @@ int hl_fw_read_preboot_status(struct hl_device *hdev, u32 cpu_boot_status_reg,
/* We read security status multiple times during boot: /* We read security status multiple times during boot:
* 1. preboot - a. Check whether the security status bits are valid * 1. preboot - a. Check whether the security status bits are valid
* b. Check whether fw security is enabled * b. Check whether fw security is enabled
* c. Check whether hard reset is done by fw * c. Check whether hard reset is done by preboot
* 2. boot cpu - we get boot cpu security status * 2. boot cpu - a. Fetch boot cpu security status
* 3. FW application - we get FW application security status * b. Check whether hard reset is done by boot cpu
* 3. FW application - a. Fetch fw application security status
* b. Check whether hard reset is done by fw app
* *
* Preboot: * Preboot:
* Check security status bit (CPU_BOOT_DEV_STS0_ENABLED), if it is set * Check security status bit (CPU_BOOT_DEV_STS0_ENABLED), if it is set
* check security enabled bit (CPU_BOOT_DEV_STS0_SECURITY_EN) * check security enabled bit (CPU_BOOT_DEV_STS0_SECURITY_EN)
*/ */
if (security_status & CPU_BOOT_DEV_STS0_ENABLED) { if (security_status & CPU_BOOT_DEV_STS0_ENABLED) {
hdev->asic_prop.fw_security_status_valid = 1; prop->fw_security_status_valid = 1;
if (!(security_status & CPU_BOOT_DEV_STS0_SECURITY_EN)) if (security_status & CPU_BOOT_DEV_STS0_SECURITY_EN)
prop->fw_security_disabled = false;
else
prop->fw_security_disabled = true; prop->fw_security_disabled = true;
if (security_status & CPU_BOOT_DEV_STS0_FW_HARD_RST_EN) if (security_status & CPU_BOOT_DEV_STS0_FW_HARD_RST_EN)
hdev->asic_prop.hard_reset_done_by_fw = true; prop->hard_reset_done_by_fw = true;
} else { } else {
hdev->asic_prop.fw_security_status_valid = 0; prop->fw_security_status_valid = 0;
prop->fw_security_disabled = true; prop->fw_security_disabled = true;
} }
dev_dbg(hdev->dev, "Firmware hard-reset is %s\n", dev_dbg(hdev->dev, "Firmware preboot hard-reset is %s\n",
hdev->asic_prop.hard_reset_done_by_fw ? "enabled" : "disabled"); prop->hard_reset_done_by_fw ? "enabled" : "disabled");
dev_info(hdev->dev, "firmware-level security is %s\n", dev_info(hdev->dev, "firmware-level security is %s\n",
prop->fw_security_disabled ? "disabled" : "enabled"); prop->fw_security_disabled ? "disabled" : "enabled");
return 0; return 0;
} }
...@@ -664,6 +668,7 @@ int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg, ...@@ -664,6 +668,7 @@ int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg,
u32 cpu_security_boot_status_reg, u32 boot_err0_reg, u32 cpu_security_boot_status_reg, u32 boot_err0_reg,
bool skip_bmc, u32 cpu_timeout, u32 boot_fit_timeout) bool skip_bmc, u32 cpu_timeout, u32 boot_fit_timeout)
{ {
struct asic_fixed_properties *prop = &hdev->asic_prop;
u32 status; u32 status;
int rc; int rc;
...@@ -732,11 +737,22 @@ int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg, ...@@ -732,11 +737,22 @@ int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg,
/* Read U-Boot version now in case we will later fail */ /* Read U-Boot version now in case we will later fail */
hdev->asic_funcs->read_device_fw_version(hdev, FW_COMP_UBOOT); hdev->asic_funcs->read_device_fw_version(hdev, FW_COMP_UBOOT);
/* Clear reset status since we need to read it again from boot CPU */
prop->hard_reset_done_by_fw = false;
/* Read boot_cpu security bits */ /* Read boot_cpu security bits */
if (hdev->asic_prop.fw_security_status_valid) if (prop->fw_security_status_valid) {
hdev->asic_prop.fw_boot_cpu_security_map = prop->fw_boot_cpu_security_map =
RREG32(cpu_security_boot_status_reg); RREG32(cpu_security_boot_status_reg);
if (prop->fw_boot_cpu_security_map &
CPU_BOOT_DEV_STS0_FW_HARD_RST_EN)
prop->hard_reset_done_by_fw = true;
}
dev_dbg(hdev->dev, "Firmware boot CPU hard-reset is %s\n",
prop->hard_reset_done_by_fw ? "enabled" : "disabled");
if (rc) { if (rc) {
detect_cpu_boot_status(hdev, status); detect_cpu_boot_status(hdev, status);
rc = -EIO; rc = -EIO;
...@@ -805,11 +821,22 @@ int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg, ...@@ -805,11 +821,22 @@ int hl_fw_init_cpu(struct hl_device *hdev, u32 cpu_boot_status_reg,
goto out; goto out;
} }
/* Clear reset status since we need to read again from app */
prop->hard_reset_done_by_fw = false;
/* Read FW application security bits */ /* Read FW application security bits */
if (hdev->asic_prop.fw_security_status_valid) if (prop->fw_security_status_valid) {
hdev->asic_prop.fw_app_security_map = prop->fw_app_security_map =
RREG32(cpu_security_boot_status_reg); RREG32(cpu_security_boot_status_reg);
if (prop->fw_app_security_map &
CPU_BOOT_DEV_STS0_FW_HARD_RST_EN)
prop->hard_reset_done_by_fw = true;
}
dev_dbg(hdev->dev, "Firmware application CPU hard-reset is %s\n",
prop->hard_reset_done_by_fw ? "enabled" : "disabled");
dev_info(hdev->dev, "Successfully loaded firmware to device\n"); dev_info(hdev->dev, "Successfully loaded firmware to device\n");
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment