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@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)
+{
+ 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;
+
+ if (save_mdt_ctx) {
+ ctx->metadata = devm_kzalloc(dev, sizeof(*ctx->metadata), GFP_KERNEL);
+ if (!ctx->metadata)
+ return NULL;
+ }
+
+ return ctx;
+}
+EXPORT_SYMBOL_GPL(qcom_scm_pas_ctx_init);
+
/**
* 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;
+};
+
+void *qcom_scm_pas_ctx_init(struct device *dev, u32 peripheral, phys_addr_t mem_phys,
+ size_t mem_size, bool save_mdt_ctx);
int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size,
struct qcom_scm_pas_metadata *ctx);
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx);
--
2.50.1
On 19/08/2025 17:54, 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@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) > +{ > + struct qcom_scm_pas_ctx *ctx; > + > + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); > + if (!ctx) > + return NULL; > + > + ctx->dev = dev; > + ctx->peripheral = peripheral; One things that is confusing here is renaming this variable to peripheral. It gets initialised from a thing called "pas_id" and then gets sent into other functions which name the incoming variable as pas_id. i.e. you will want to do - ret = qcom_mdt_pas_init(pas->dev, pas->firmware, rproc->firmware, pas->pas_id, - pas->mem_phys, &pas->pas_metadata); - if (ret) - goto disable_px_supply; - - ret = qcom_mdt_load_no_init(pas->dev, pas->firmware, rproc->firmware, pas->pas_id, - pas->mem_region, pas->mem_phys, pas->mem_size, - &pas->mem_reloc); + ret = qcom_mdt_pas_load(pas->pas_ctx, pas->firmware, rproc->firmware, - pas->mem_region, &pas->dtb_mem_reloc); ++ pas->pas_id, pas->mem_region, &pas->dtb_mem_reloc); and - return __qcom_mdt_load(ctx->dev, fw, firmware, mem_region, ctx->mem_phys, + return __qcom_mdt_load(ctx->dev, fw, firmware, ctx->peripheral, mem_region, ctx->mem_phys, ctx->mem_size, reloc_base); But it should be ctx->pas_id to be consistent and make it obvious what data is being passed. Can you stick to the established naming convention and stick with pas_id here ? Even if the above fixups on 6.17 aren't right the point is it only adds confusion to randomly change variable names for no reason. Please stick to the established naming convention. -- bod
On 19/08/2025 17:54, 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. You've introduced what PAS is in the cover letter but you haven't done so in the commit log where you use it. "Peripheral Authentication Service (PAS)" should be defined in this patch somewhere so we know what PAS means. > > 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@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) > +{ > + 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; > + > + if (save_mdt_ctx) { You could check metadata != NULL and drop the bool ctx->save_mdt_ctx entirely. --- bod
On Wed, Aug 20, 2025 at 12:40:51PM +0100, Bryan O'Donoghue wrote: > On 19/08/2025 17:54, 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. > > You've introduced what PAS is in the cover letter but you haven't done so in > the commit log where you use it. > > "Peripheral Authentication Service (PAS)" should be defined in this patch > somewhere so we know what PAS means. Ack. > > > > > 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@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) > > +{ > > + 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; > > + > > + if (save_mdt_ctx) { > > You could check metadata != NULL and drop the bool ctx->save_mdt_ctx > entirely. Ack. > > --- > bod -- -Mukesh Ojha
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@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. > +{ > + 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
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.ojha@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
© 2016 - 2025 Red Hat, Inc.