On Tue, Aug 19, 2025 at 10:24:36PM +0530, Mukesh Ojha wrote: > Currently, remoteproc and non-remoteproc subsystems use different > variants of the MDT loader helper API, primarily due to the handling of > the metadata context. Remoteproc subsystems retain this context until > authentication and reset, while non-remoteproc subsystems (e.g., video, > graphics) do not require it. > > Unify the metadata loading process for both remoteproc and > non-remoteproc subsystems by introducing a dedicated PAS context > initialization function. > > By introducing qcom_scm_pas_ctx_init(), we can standardize the API usage > across subsystems and reduce the number of parameters passed to MDT > loader functions, improving code clarity and maintainability. > > Signed-off-by: Mukesh Ojha <mukesh.ojha@xxxxxxxxxxxxxxxx> > --- > drivers/firmware/qcom/qcom_scm.c | 26 ++++++++++++++++++++++++++ > include/linux/firmware/qcom/qcom_scm.h | 11 +++++++++++ > 2 files changed, 37 insertions(+) > > diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c > index 96d5cf40a74c..33187d4f4aef 100644 > --- a/drivers/firmware/qcom/qcom_scm.c > +++ b/drivers/firmware/qcom/qcom_scm.c > @@ -558,6 +558,32 @@ static void qcom_scm_set_download_mode(u32 dload_mode) > dev_err(__scm->dev, "failed to set download mode: %d\n", ret); > } > > +void *qcom_scm_pas_ctx_init(struct device *dev, u32 peripheral, phys_addr_t mem_phys, > + size_t mem_size, bool save_mdt_ctx) Since we export this for other drivers/module, consider adding kerneldoc comments. > +{ > + struct qcom_scm_pas_ctx *ctx; > + > + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return NULL; > + > + ctx->dev = dev; > + ctx->peripheral = peripheral; > + ctx->mem_phys = mem_phys; > + ctx->mem_size = mem_size; > + ctx->save_mdt_ctx = save_mdt_ctx; > + ctx->metadata = NULL; This seems unnecessary. > + > + if (save_mdt_ctx) { > + ctx->metadata = devm_kzalloc(dev, sizeof(*ctx->metadata), GFP_KERNEL); > + if (!ctx->metadata) > + return NULL; Do we really need to pass this burden to the caller to pass save_mdt_ctx as true/false? What happens if we always keep metadata in qcom_scm_pas_ctx struct and let clients use it if needed. > + } > + > + return ctx; > +} > +EXPORT_SYMBOL_GPL(qcom_scm_pas_ctx_init); Is there an equivalant ctx_destroy() function? It would be confusing for drivers to call this in their probe and not doing anything upon error or in their bus::remove callbacks. I don't know if we really want to convert the whole function under devres or just provide a destroy callback. > + > /** > * qcom_scm_pas_init_image() - Initialize peripheral authentication service > * state machine for a given peripheral, using the > diff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmware/qcom/qcom_scm.h > index a55ca771286b..b7eb206561a9 100644 > --- a/include/linux/firmware/qcom/qcom_scm.h > +++ b/include/linux/firmware/qcom/qcom_scm.h > @@ -72,6 +72,17 @@ struct qcom_scm_pas_metadata { > ssize_t size; > }; > > +struct qcom_scm_pas_ctx { > + struct device *dev; > + u32 peripheral; > + phys_addr_t mem_phys; > + size_t mem_size; > + struct qcom_scm_pas_metadata *metadata; > + bool save_mdt_ctx; As mentioned above, can we just include qcom_scm_pas_metadata struct all the time? Thanks, Pavan