From: Dafna Hirschfeld <dhirschf...@habana.ai>

There are cases such when FW runs MBIST, that preboot is expected to take
longer than the usual. In such cases the firmware reports status
SECURITY_READY/IN_PREBOOT and we extend the timeout waiting for it.
This is currently implemented for Gaudi2 only.

Signed-off-by: Dafna Hirschfeld <dhirschf...@habana.ai>
Reviewed-by: Oded Gabbay <ogab...@kernel.org>
Signed-off-by: Oded Gabbay <ogab...@kernel.org>
---
 drivers/accel/habanalabs/common/firmware_if.c | 26 ++++++++++++++++---
 drivers/accel/habanalabs/common/habanalabs.h  |  3 +++
 drivers/accel/habanalabs/gaudi2/gaudi2.c      |  2 ++
 drivers/accel/habanalabs/gaudi2/gaudi2P.h     |  1 +
 4 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/drivers/accel/habanalabs/common/firmware_if.c 
b/drivers/accel/habanalabs/common/firmware_if.c
index 2a6dfea3d27d..0fb360cca9cc 100644
--- a/drivers/accel/habanalabs/common/firmware_if.c
+++ b/drivers/accel/habanalabs/common/firmware_if.c
@@ -1474,8 +1474,9 @@ static void detect_cpu_boot_status(struct hl_device 
*hdev, u32 status)
 int hl_fw_wait_preboot_ready(struct hl_device *hdev)
 {
        struct pre_fw_load_props *pre_fw_load = &hdev->fw_loader.pre_fw_load;
-       u32 status;
-       int rc;
+       u32 status = 0, timeout;
+       int rc, tries = 1;
+       bool preboot_still_runs;
 
        /* Need to check two possible scenarios:
         *
@@ -1485,6 +1486,8 @@ int hl_fw_wait_preboot_ready(struct hl_device *hdev)
         * All other status values - for older firmwares where the uboot was
         * loaded from the FLASH
         */
+       timeout = pre_fw_load->wait_for_preboot_timeout;
+retry:
        rc = hl_poll_timeout(
                hdev,
                pre_fw_load->cpu_boot_status_reg,
@@ -1493,7 +1496,24 @@ int hl_fw_wait_preboot_ready(struct hl_device *hdev)
                (status == CPU_BOOT_STATUS_READY_TO_BOOT) ||
                (status == CPU_BOOT_STATUS_WAITING_FOR_BOOT_FIT),
                hdev->fw_poll_interval_usec,
-               pre_fw_load->wait_for_preboot_timeout);
+               timeout);
+       /*
+        * if F/W reports "security-ready" it means preboot might take longer.
+        * If the field 'wait_for_preboot_extended_timeout' is non 0 we wait 
again
+        * with that timeout
+        */
+       preboot_still_runs = (status == CPU_BOOT_STATUS_SECURITY_READY ||
+                               status == CPU_BOOT_STATUS_IN_PREBOOT ||
+                               status == CPU_BOOT_STATUS_FW_SHUTDOWN_PREP ||
+                               status == CPU_BOOT_STATUS_DRAM_RDY);
+
+       if (rc && tries && preboot_still_runs) {
+               tries--;
+               if (pre_fw_load->wait_for_preboot_extended_timeout) {
+                       timeout = 
pre_fw_load->wait_for_preboot_extended_timeout;
+                       goto retry;
+               }
+       }
 
        if (rc) {
                detect_cpu_boot_status(hdev, status);
diff --git a/drivers/accel/habanalabs/common/habanalabs.h 
b/drivers/accel/habanalabs/common/habanalabs.h
index 874ae76cbd78..3c224942a758 100644
--- a/drivers/accel/habanalabs/common/habanalabs.h
+++ b/drivers/accel/habanalabs/common/habanalabs.h
@@ -1410,6 +1410,8 @@ struct dynamic_fw_load_mgr {
  * @boot_err0_reg: boot_err0 register address
  * @boot_err1_reg: boot_err1 register address
  * @wait_for_preboot_timeout: timeout to poll for preboot ready
+ * @wait_for_preboot_extended_timeout: timeout to pull for preboot ready in 
case where we know
+ *             preboot needs longer time.
  */
 struct pre_fw_load_props {
        u32 cpu_boot_status_reg;
@@ -1418,6 +1420,7 @@ struct pre_fw_load_props {
        u32 boot_err0_reg;
        u32 boot_err1_reg;
        u32 wait_for_preboot_timeout;
+       u32 wait_for_preboot_extended_timeout;
 };
 
 /**
diff --git a/drivers/accel/habanalabs/gaudi2/gaudi2.c 
b/drivers/accel/habanalabs/gaudi2/gaudi2.c
index 867175431418..35db02e5010b 100644
--- a/drivers/accel/habanalabs/gaudi2/gaudi2.c
+++ b/drivers/accel/habanalabs/gaudi2/gaudi2.c
@@ -4825,6 +4825,8 @@ static void gaudi2_init_firmware_preload_params(struct 
hl_device *hdev)
        pre_fw_load->boot_err0_reg = mmCPU_BOOT_ERR0;
        pre_fw_load->boot_err1_reg = mmCPU_BOOT_ERR1;
        pre_fw_load->wait_for_preboot_timeout = GAUDI2_PREBOOT_REQ_TIMEOUT_USEC;
+       pre_fw_load->wait_for_preboot_extended_timeout =
+               GAUDI2_PREBOOT_EXTENDED_REQ_TIMEOUT_USEC;
 }
 
 static void gaudi2_init_firmware_loader(struct hl_device *hdev)
diff --git a/drivers/accel/habanalabs/gaudi2/gaudi2P.h 
b/drivers/accel/habanalabs/gaudi2/gaudi2P.h
index 14e281fd9895..9b9eef0d97d6 100644
--- a/drivers/accel/habanalabs/gaudi2/gaudi2P.h
+++ b/drivers/accel/habanalabs/gaudi2/gaudi2P.h
@@ -84,6 +84,7 @@
 #define CORESIGHT_TIMEOUT_USEC                 100000          /* 100 ms */
 
 #define GAUDI2_PREBOOT_REQ_TIMEOUT_USEC                25000000        /* 25s 
*/
+#define GAUDI2_PREBOOT_EXTENDED_REQ_TIMEOUT_USEC 85000000      /* 85s */
 
 #define GAUDI2_BOOT_FIT_REQ_TIMEOUT_USEC       10000000        /* 10s */
 
-- 
2.34.1

Reply via email to