On Tue, Aug 19, 2025 at 10:47:45PM +0530, Pavan Kondeti wrote: > 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.o...@oss.qualcomm.com> > > --- > > 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. >
Sure. > > +{ > > + 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. Yes, it is redundant. > > + > > + 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. > Do not wanted to be aggressive like changing every driver which uses qcom_mdt_load(), Hence, taken this safe approach of adapting the current way. Obviously, it is the one approach where I was looking to unify API's across remoteproc or non-remoteproc subsystems and that's why I have put comment in the 2/11 if we feel fine to do it for other drivers too. > > + } > > + > > + 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. > I dont disagree., will wait for some more comments. > > + > > /** > > * 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 -- -Mukesh Ojha