]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: iris: Fix firmware reference leak and unmap memory after load
authorStephan Gerhold <stephan.gerhold@linaro.org>
Mon, 18 Aug 2025 09:50:41 +0000 (11:50 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 9 Sep 2025 13:59:20 +0000 (15:59 +0200)
When we succeed loading the firmware, we don't want to hold on to the
firmware pointer anymore, since it won't be freed anywhere else. The same
applies for the mapped memory. Unmapping the memory is particularly
important since the memory will be protected after the Iris firmware is
started, so we need to make sure there will be no accidental access to this
region (even if just a speculative one from the CPU).

Almost the same firmware loading code also exists in venus/firmware.c,
there it is implemented correctly.

Fix this by dropping the early "return ret" and move the call of
qcom_scm_pas_auth_and_reset() out of iris_load_fw_to_memory(). We should
unmap the memory before bringing the firmware out of reset.

Cc: stable@vger.kernel.org
Fixes: d19b163356b8 ("media: iris: implement video firmware load/unload")
Signed-off-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/qcom/iris/iris_firmware.c

index f1b5cd56db3225d0a97e07d3a63c24814deeba78..9ab499fad946446a87036720f49c9c8d311f3060 100644 (file)
@@ -60,16 +60,7 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name)
 
        ret = qcom_mdt_load(dev, firmware, fw_name,
                            pas_id, mem_virt, mem_phys, res_size, NULL);
-       if (ret)
-               goto err_mem_unmap;
-
-       ret = qcom_scm_pas_auth_and_reset(pas_id);
-       if (ret)
-               goto err_mem_unmap;
-
-       return ret;
 
-err_mem_unmap:
        memunmap(mem_virt);
 err_release_fw:
        release_firmware(firmware);
@@ -94,6 +85,12 @@ int iris_fw_load(struct iris_core *core)
                return -ENOMEM;
        }
 
+       ret = qcom_scm_pas_auth_and_reset(core->iris_platform_data->pas_id);
+       if (ret)  {
+               dev_err(core->dev, "auth and reset failed: %d\n", ret);
+               return ret;
+       }
+
        ret = qcom_scm_mem_protect_video_var(cp_config->cp_start,
                                             cp_config->cp_size,
                                             cp_config->cp_nonpixel_start,