[PATCH v8 04/12] media: iris: Add context bank hooks for platform specific initialization
From: Vishnu Reddy
Date: Wed Jun 10 2026 - 02:36:51 EST
The glymur platform requires a dedicated firmware context bank device to
boot firmware where linux runs as the hypervisor and driver needs to
manually manage the firmware IOMMU mapping.
Add init and deinit hooks in the vpu ops for context bank setup. These
hooks allow platform specific code to initialize and tear down context
banks.
Reviewed-by: Vikash Garodia <vikash.garodia@xxxxxxxxxxxxxxxx>
Signed-off-by: Vishnu Reddy <busanna.reddy@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/iris/iris_core.c | 9 ++++++++-
drivers/media/platform/qcom/iris/iris_vpu_common.c | 14 ++++++++++++++
drivers/media/platform/qcom/iris/iris_vpu_common.h | 4 ++++
3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/qcom/iris/iris_core.c b/drivers/media/platform/qcom/iris/iris_core.c
index 52bf56e517f9..89dbe9bbf6b0 100644
--- a/drivers/media/platform/qcom/iris/iris_core.c
+++ b/drivers/media/platform/qcom/iris/iris_core.c
@@ -19,6 +19,7 @@ void iris_core_deinit(struct iris_core *core)
iris_fw_unload(core);
iris_vpu_power_off(core);
iris_hfi_queues_deinit(core);
+ iris_deinit_cb_devs(core);
core->state = IRIS_CORE_DEINIT;
}
mutex_unlock(&core->lock);
@@ -58,10 +59,14 @@ int iris_core_init(struct iris_core *core)
core->state = IRIS_CORE_INIT;
- ret = iris_hfi_queues_init(core);
+ ret = iris_init_cb_devs(core);
if (ret)
goto error;
+ ret = iris_hfi_queues_init(core);
+ if (ret)
+ goto error_deinit_cb_devs;
+
ret = iris_vpu_power_on(core);
if (ret)
goto error_queue_deinit;
@@ -94,6 +99,8 @@ int iris_core_init(struct iris_core *core)
iris_vpu_power_off(core);
error_queue_deinit:
iris_hfi_queues_deinit(core);
+error_deinit_cb_devs:
+ iris_deinit_cb_devs(core);
error:
core->state = IRIS_CORE_DEINIT;
exit:
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.c b/drivers/media/platform/qcom/iris/iris_vpu_common.c
index ab41da1f47c8..8bdfee672954 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_common.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_common.c
@@ -319,6 +319,20 @@ int iris_vpu_switch_to_hwmode(struct iris_core *core)
return core->iris_platform_data->vpu_ops->set_hwmode(core);
}
+int iris_init_cb_devs(struct iris_core *core)
+{
+ if (core->iris_platform_data->vpu_ops->init_cb_devs)
+ return core->iris_platform_data->vpu_ops->init_cb_devs(core);
+
+ return 0;
+}
+
+void iris_deinit_cb_devs(struct iris_core *core)
+{
+ if (core->iris_platform_data->vpu_ops->deinit_cb_devs)
+ core->iris_platform_data->vpu_ops->deinit_cb_devs(core);
+}
+
int iris_vpu35_vpu4x_power_off_controller(struct iris_core *core)
{
u32 clk_rst_tbl_size = core->iris_platform_data->clk_rst_tbl_size;
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.h b/drivers/media/platform/qcom/iris/iris_vpu_common.h
index 09799a375c14..e0dc109bbe6a 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_common.h
+++ b/drivers/media/platform/qcom/iris/iris_vpu_common.h
@@ -22,6 +22,8 @@ struct vpu_ops {
void (*program_bootup_registers)(struct iris_core *core);
u64 (*calc_freq)(struct iris_inst *inst, size_t data_size);
int (*set_hwmode)(struct iris_core *core);
+ int (*init_cb_devs)(struct iris_core *core);
+ void (*deinit_cb_devs)(struct iris_core *core);
};
int iris_vpu_boot_firmware(struct iris_core *core);
@@ -33,6 +35,8 @@ int iris_vpu_power_on_controller(struct iris_core *core);
int iris_vpu_power_on_hw(struct iris_core *core);
int iris_vpu_set_hwmode(struct iris_core *core);
int iris_vpu_switch_to_hwmode(struct iris_core *core);
+int iris_init_cb_devs(struct iris_core *core);
+void iris_deinit_cb_devs(struct iris_core *core);
int iris_vpu_power_on(struct iris_core *core);
int iris_vpu_power_off_controller(struct iris_core *core);
void iris_vpu_power_off_hw(struct iris_core *core);
--
2.34.1