Commit ea9770e6 authored by Sagiv Ozeri's avatar Sagiv Ozeri Committed by Oded Gabbay
Browse files

habanalabs: save f/w preboot minor version



We need this property for backward compatibility against the f/w.

Signed-off-by: default avatarSagiv Ozeri <sozeri@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
parent d6a66d59
Loading
Loading
Loading
Loading
+41 −8
Original line number Diff line number Diff line
@@ -54,6 +54,43 @@ static char *extract_fw_ver_from_str(const char *fw_str)
	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,19 +2049,15 @@ 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;
	default:
+3 −1
Original line number Diff line number Diff line
@@ -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;