Commit b75cce27 authored by Ofir Bitton's avatar Ofir Bitton Committed by Greg Kroah-Hartman
Browse files

habanalabs: save f/w preboot major version



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

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>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9138c242
Loading
Loading
Loading
Loading
+20 −10
Original line number Diff line number Diff line
@@ -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 */
+2 −0
Original line number Diff line number Diff line
@@ -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;