]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
habanalabs: save f/w preboot major version
authorOfir Bitton <obitton@habana.ai>
Mon, 7 Mar 2022 17:53:36 +0000 (19:53 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 22 May 2022 18:57:35 +0000 (20:57 +0200)
We need this property for doing backward compatibility hacks against
the 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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/habanalabs/common/firmware_if.c
drivers/misc/habanalabs/common/habanalabs.h

index 2665919dbbddde9e01c5d09e4ffbe2d852b1640f..42dce28ca81567cf72e1371e106263748b3ef5b8 100644 (file)
@@ -1911,7 +1911,7 @@ static int hl_fw_dynamic_request_descriptor(struct hl_device *hdev,
  * @fwc: the firmware component
  * @fw_version: fw component's version string
  */
-static void hl_fw_dynamic_read_device_fw_version(struct hl_device *hdev,
+static int hl_fw_dynamic_read_device_fw_version(struct hl_device *hdev,
                                        enum hl_fw_component fwc,
                                        const char *fw_version)
 {
@@ -1935,23 +1935,33 @@ static void hl_fw_dynamic_read_device_fw_version(struct hl_device *hdev,
                                                VERSION_MAX_LEN);
                if (preboot_ver && preboot_ver != prop->preboot_ver) {
                        strscpy(btl_ver, prop->preboot_ver,
-                               min((int) (preboot_ver - prop->preboot_ver),
-                                                                       31));
+                               min((int) (preboot_ver - prop->preboot_ver), 31));
                        dev_info(hdev->dev, "%s\n", btl_ver);
                }
 
                preboot_ver = extract_fw_ver_from_str(prop->preboot_ver);
                if (preboot_ver) {
-                       dev_info(hdev->dev, "preboot version %s\n",
-                                                               preboot_ver);
+                       char major[8];
+                       int rc;
+
+                       dev_info(hdev->dev, "preboot version %s\n", preboot_ver);
+                       sprintf(major, "%.2s", preboot_ver);
                        kfree(preboot_ver);
+
+                       rc = kstrtou32(major, 10, &hdev->fw_major_version);
+                       if (rc) {
+                               dev_err(hdev->dev, "Error %d parsing preboot major version\n", rc);
+                               return rc;
+                       }
                }
 
                break;
        default:
                dev_warn(hdev->dev, "Undefined FW component: %d\n", fwc);
-               return;
+               return -EINVAL;
        }
+
+       return 0;
 }
 
 /**
@@ -2123,9 +2133,10 @@ static int hl_fw_dynamic_load_image(struct hl_device *hdev,
                goto release_fw;
 
        /* read preboot version */
-       hl_fw_dynamic_read_device_fw_version(hdev, cur_fwc,
+       rc = hl_fw_dynamic_read_device_fw_version(hdev, cur_fwc,
                                fw_loader->dynamic_loader.comm_desc.cur_fw_ver);
-
+       if (rc)
+               goto release_fw;
 
        /* update state according to boot stage */
        if (cur_fwc == FW_COMP_BOOT_FIT) {
@@ -2392,9 +2403,8 @@ static int hl_fw_dynamic_init_cpu(struct hl_device *hdev,
                        goto protocol_err;
 
                /* read preboot version */
-               hl_fw_dynamic_read_device_fw_version(hdev, FW_COMP_PREBOOT,
+               return hl_fw_dynamic_read_device_fw_version(hdev, FW_COMP_PREBOOT,
                                fw_loader->dynamic_loader.comm_desc.cur_fw_ver);
-               return 0;
        }
 
        /* load boot fit to FW */
index 3e7012f7b1a302610f387a4646b0485ea6d310ae..9c70d95883a21e87808ca308645ad258372f405b 100644 (file)
@@ -2647,6 +2647,7 @@ struct hl_reset_info {
  * @reset_info: holds current device reset information.
  * @last_error: holds information about last session in which CS timeout or razwi error occurred.
  * @stream_master_qid_arr: pointer to array with QIDs of master streams.
+ * @fw_major_version: major version of current loaded preboot
  * @dram_used_mem: current DRAM memory consumption.
  * @timeout_jiffies: device CS timeout value.
  * @max_power: the max power of the device, as configured by the sysadmin. This
@@ -2785,6 +2786,7 @@ struct hl_device {
        struct hl_reset_info            reset_info;
 
        u32                             *stream_master_qid_arr;
+       u32                             fw_major_version;
        atomic64_t                      dram_used_mem;
        u64                             timeout_jiffies;
        u64                             max_power;