Re: [PATCH v9 02/19] media: iris: Add Gen2 firmware autodetect and fallback

From: Vikash Garodia

Date: Fri Sep 25 2026 - 08:56:07 EST




On 9/24/2026 6:06 PM, Bryan O'Donoghue wrote:
On 31/07/2026 00:48, Dmitry Baryshkov wrote:
+
+/*
+ * Detect the firmware generation and publish the descriptor. Run only after
+ * qcom_mdt_load() has succeeded, so the driver commits to a HFI generation
+ * only for a firmware image that has actually been loaded.
+ *
+ * The generation is detected from the loaded image (@data / @size point at the
+ * reserved memory region populated by qcom_mdt_load()) rather than from the
+ * request_firmware() blob: for a split .mdt the latter holds only the ELF
+ * headers, while QC_IMAGE_VERSION_STRING lives in the .bNN data segments.
+ *
+ * The descriptor and firmware data are published exactly once, before any
+ * session exists, so the lockless readers in the ioctl paths never observe a
+ * reassignment. Later bring-ups reuse the already published descriptor.
+ */
+static void iris_detect_firmware(struct iris_core *core, const char *fw_name,
+                 const u8 *data, size_t size,
+                 const struct iris_firmware_desc *desc)
+{
+    if (core->iris_firmware_desc)
+        return;
+
+    /*
+     * With a DT firmware-name override on a dual-generation platform the
+     * image on disk decides the generation, so inspect it and switch to the
+     * Gen1 descriptor when a Gen1 image was loaded.
+     */
+    if (desc == core->iris_platform_data->firmware_desc_gen2 &&
+        core->iris_platform_data->firmware_desc_gen1 &&
+        of_property_present(dev_of_node(core->dev), "firmware-name") &&
+        !iris_detect_gen2_from_fwdata(data, size)) {
+        dev_info(core->dev, "Gen1 FW detected in %s\n", fw_name);
+        desc = core->iris_platform_data->firmware_desc_gen1;
+    }
+
+    /* Publish iris_firmware_data first, then iris_firmware_desc (the guard). */
+    core->iris_firmware_data = desc->firmware_data;
+    core->iris_firmware_desc = desc;
+}
+

In function ‘iris_detect_firmware’,
    inlined from ‘iris_load_fw_to_memory’ at drivers/media/platform/ qcom/iris/iris_firmware.c:216:3:
drivers/media/platform/qcom/iris/iris_firmware.c:161:12: warning: ‘desc’ may be used uninitialized [-Wmaybe-uninitialized]
  161 |         if (desc == core->iris_platform_data- >firmware_desc_gen2 &&
      |            ^
drivers/media/platform/qcom/iris/iris_firmware.c: In function ‘iris_load_fw_to_memory’:
drivers/media/platform/qcom/iris/iris_firmware.c:176:42: note: ‘desc’ was declared here
  176 |         const struct iris_firmware_desc *desc;
      |                                          ^~~~
In function ‘iris_detect_firmware’,
    inlined from ‘iris_load_fw_to_memory’ at drivers/media/platform/ qcom/iris/iris_firmware.c:216:3:
drivers/media/platform/qcom/iris/iris_firmware.c:170:40: warning: ‘desc’ may be used uninitialized [-Wmaybe-uninitialized]
  170 |         core->iris_firmware_data = desc->firmware_data;
      |                                    ~~~~^~~~~~~~~~~~~~~
drivers/media/platform/qcom/iris/iris_firmware.c: In function ‘iris_load_fw_to_memory’:
drivers/media/platform/qcom/iris/iris_firmware.c:176:42: note: ‘desc’ was declared here
  176 |         const struct iris_firmware_desc *desc;
      |                                          ^~~~
. "$TS_DIR"/lib/common-end.sh
#!/bin/sh
# Copyright 2024 Google LLC

Proposed fix

╰─$ git diff
diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/ media/platform/qcom/iris/iris_firmware.c
index dfc4c184646c6..39558a300d38c 100644
--- a/drivers/media/platform/qcom/iris/iris_firmware.c
+++ b/drivers/media/platform/qcom/iris/iris_firmware.c
@@ -153,6 +153,9 @@ static void iris_detect_firmware(struct iris_core *core, const char *fw_name,
       if (core->iris_firmware_desc)
               return;

+      if (!desc)
+              return;
+

Reviewed-by: Vikash Garodia <vikash.garodia@xxxxxxxxxxxxxxxx>