habanalabs: save f/w preboot minor version
authorSagiv Ozeri <sozeri@habana.ai>
Tue, 28 Jun 2022 10:25:48 +0000 (13:25 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Tue, 12 Jul 2022 06:09:29 +0000 (09:09 +0300)
We need this property for backward compatibility against the f/w.

Signed-off-by: Sagiv Ozeri <sozeri@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/misc/habanalabs/common/firmware_if.c
drivers/misc/habanalabs/common/habanalabs.h

index 64c5cdfc6dcf97b20b5a9f47644fed3053a8a891..04ca4aaee44630a38e9dae866e2e101701a89a98 100644 (file)
@@ -41,7 +41,7 @@ static char *extract_fw_ver_from_str(const char *fw_str)
        ver_offset = str - fw_str;
 
        /* Copy until the next whitespace */
-       whitespace =  strnstr(str, " ", VERSION_MAX_LEN - ver_offset);
+       whitespace = strnstr(str, " ", VERSION_MAX_LEN - ver_offset);
        if (!whitespace)
                goto free_fw_ver;
 
@@ -54,6 +54,43 @@ free_fw_ver:
        return NULL;
 }
 
+static int extract_fw_sub_versions(struct hl_device *hdev, char *preboot_ver)
+{
+       char major[8], minor[8], *first_dot, *second_dot;
+       int rc;
+
+       first_dot = strnstr(preboot_ver, ".", 10);
+       if (first_dot) {
+               strscpy(major, preboot_ver, first_dot - preboot_ver + 1);
+               rc = kstrtou32(major, 10, &hdev->fw_major_version);
+       } else {
+               rc = -EINVAL;
+       }
+
+       if (rc) {
+               dev_err(hdev->dev, "Error %d parsing preboot major version\n", rc);
+               goto out;
+       }
+
+       /* skip the first dot */
+       first_dot++;
+
+       second_dot = strnstr(first_dot, ".", 10);
+       if (second_dot) {
+               strscpy(minor, first_dot, second_dot - first_dot + 1);
+               rc = kstrtou32(minor, 10, &hdev->fw_minor_version);
+       } else {
+               rc = -EINVAL;
+       }
+
+       if (rc)
+               dev_err(hdev->dev, "Error %d parsing preboot minor version\n", rc);
+
+out:
+       kfree(preboot_ver);
+       return rc;
+}
+
 static int hl_request_fw(struct hl_device *hdev,
                                const struct firmware **firmware_p,
                                const char *fw_name)
@@ -2012,18 +2049,14 @@ static int hl_fw_dynamic_read_device_fw_version(struct hl_device *hdev,
 
                preboot_ver = extract_fw_ver_from_str(prop->preboot_ver);
                if (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);
+                       /* This function takes care of freeing preboot_ver */
+                       rc = extract_fw_sub_versions(hdev, preboot_ver);
+                       if (rc)
                                return rc;
-                       }
                }
 
                break;
index 7e84f2ce49ae046fce7621e00cf0550ce246c790..72cb12f2068a2f8ce57d4f9104a247d7abbf2adb 100644 (file)
@@ -3012,7 +3012,8 @@ struct hl_reset_info {
  * @last_error: holds information about last session in which CS timeout or razwi error occurred.
  * @reset_info: holds current device reset information.
  * @stream_master_qid_arr: pointer to array with QIDs of master streams.
- * @fw_major_version: major version of current loaded preboot
+ * @fw_major_version: major version of current loaded preboot.
+ * @fw_minor_version: minor version of current loaded preboot.
  * @dram_used_mem: current DRAM memory consumption.
  * @memory_scrub_val: the value to which the dram will be scrubbed to using cb scrub_device_dram
  * @timeout_jiffies: device CS timeout value.
@@ -3186,6 +3187,7 @@ struct hl_device {
 
        u32                             *stream_master_qid_arr;
        u32                             fw_major_version;
+       u32                             fw_minor_version;
        atomic64_t                      dram_used_mem;
        u64                             memory_scrub_val;
        u64                             timeout_jiffies;