On Wed, Aug 20, 2025 at 12:48:55PM +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.
> > 
> > Add context aware qcom_mdt_pas_load() function which uses context
> > returned from qcom_scm_pas_ctx_init() and use it till subsystems
> > is out of set. This will also help in unifying the API used by
> > remoteproc and non-remoteproc subsystems drivers.
> > 
> > Signed-off-by: Mukesh Ojha <[email protected]>
> > ---
> > If this approach is preferred, will convert all subsystem drivers to use the
> > same set of API's using context and completely get away with qcom_mdt_load()
> > 
> > -Mukesh
> > 
> >   drivers/remoteproc/qcom_q6v5_pas.c  | 53 ++++++++++++++---------------
> >   drivers/soc/qcom/mdt_loader.c       | 26 ++++++++++----
> >   include/linux/soc/qcom/mdt_loader.h | 22 ++++++------
> >   3 files changed, 56 insertions(+), 45 deletions(-)
> > 
> > diff --git a/drivers/remoteproc/qcom_q6v5_pas.c 
> > b/drivers/remoteproc/qcom_q6v5_pas.c
> > index 55a7da801183..e376c0338576 100644
> > --- a/drivers/remoteproc/qcom_q6v5_pas.c
> > +++ b/drivers/remoteproc/qcom_q6v5_pas.c
> > @@ -115,8 +115,8 @@ struct qcom_pas {
> >     struct qcom_rproc_ssr ssr_subdev;
> >     struct qcom_sysmon *sysmon;
> > -   struct qcom_scm_pas_metadata pas_metadata;
> > -   struct qcom_scm_pas_metadata dtb_pas_metadata;
> > +   struct qcom_scm_pas_ctx *pas_ctx;
> > +   struct qcom_scm_pas_ctx *dtb_pas_ctx;
> >   };
> >   static void qcom_pas_segment_dump(struct rproc *rproc,
> > @@ -209,9 +209,9 @@ static int qcom_pas_unprepare(struct rproc *rproc)
> >      * auth_and_reset() was successful, but in other cases clean it up
> >      * here.
> >      */
> > -   qcom_scm_pas_metadata_release(&pas->pas_metadata);
> > +   qcom_scm_pas_metadata_release(pas->pas_ctx->metadata);
> >     if (pas->dtb_pas_id)
> > -           qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
> > +           qcom_scm_pas_metadata_release(pas->dtb_pas_ctx->metadata);
> >     return 0;
> >   }
> > @@ -235,15 +235,8 @@ static int qcom_pas_load(struct rproc *rproc, const 
> > struct firmware *fw)
> >                     return ret;
> >             }
> > -           ret = qcom_mdt_pas_init(pas->dev, pas->dtb_firmware, 
> > pas->dtb_firmware_name,
> > -                                   pas->dtb_pas_id, pas->dtb_mem_phys,
> > -                                   &pas->dtb_pas_metadata);
> > -           if (ret)
> > -                   goto release_dtb_firmware;
> > -
> > -           ret = qcom_mdt_load_no_init(pas->dev, pas->dtb_firmware, 
> > pas->dtb_firmware_name,
> > -                                       pas->dtb_mem_region, 
> > pas->dtb_mem_phys,
> > -                                       pas->dtb_mem_size, 
> > &pas->dtb_mem_reloc);
> > +           ret = qcom_mdt_pas_load(pas->dtb_pas_ctx, pas->dtb_firmware, 
> > pas->dtb_firmware_name,
> > +                                   pas->dtb_mem_region, 
> > &pas->dtb_mem_reloc);
> >             if (ret)
> >                     goto release_dtb_metadata;
> >     }
> > @@ -251,9 +244,7 @@ static int qcom_pas_load(struct rproc *rproc, const 
> > struct firmware *fw)
> >     return 0;
> >   release_dtb_metadata:
> > -   qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
> > -
> > -release_dtb_firmware:
> > +   qcom_scm_pas_metadata_release(pas->dtb_pas_ctx->metadata);
> >     release_firmware(pas->dtb_firmware);
> >     return ret;
> > @@ -301,14 +292,8 @@ static int qcom_pas_start(struct rproc *rproc)
> >             }
> >     }
> > -   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->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);
> >     if (ret)
> >             goto release_pas_metadata;
> > @@ -328,9 +313,9 @@ static int qcom_pas_start(struct rproc *rproc)
> >             goto release_pas_metadata;
> >     }
> > -   qcom_scm_pas_metadata_release(&pas->pas_metadata);
> > +   qcom_scm_pas_metadata_release(pas->pas_ctx->metadata);
> >     if (pas->dtb_pas_id)
> > -           qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
> > +           qcom_scm_pas_metadata_release(pas->dtb_pas_ctx->metadata);
> >     /* firmware is used to pass reference from qcom_pas_start(), drop it 
> > now */
> >     pas->firmware = NULL;
> > @@ -338,9 +323,9 @@ static int qcom_pas_start(struct rproc *rproc)
> >     return 0;
> >   release_pas_metadata:
> > -   qcom_scm_pas_metadata_release(&pas->pas_metadata);
> > +   qcom_scm_pas_metadata_release(pas->pas_ctx->metadata);
> >     if (pas->dtb_pas_id)
> > -           qcom_scm_pas_metadata_release(&pas->dtb_pas_metadata);
> > +           qcom_scm_pas_metadata_release(pas->dtb_pas_ctx->metadata);
> >   disable_px_supply:
> >     if (pas->px_supply)
> >             regulator_disable(pas->px_supply);
> > @@ -774,6 +759,18 @@ static int qcom_pas_probe(struct platform_device *pdev)
> >     }
> >     qcom_add_ssr_subdev(rproc, &pas->ssr_subdev, desc->ssr_name);
> > +
> > +   pas->pas_ctx = qcom_scm_pas_ctx_init(pas->dev, pas->pas_id, 
> > pas->mem_phys,
> > +                                        pas->mem_size, true);
> > +   if (!pas->pas_ctx)
> > +           goto remove_ssr_sysmon;
> 
> this function already returns -ENOMEM you don't set ret to any particular
> value so if qcom_scm_pas_ctx_init() returned NULL, you would exit your probe
> function here "error out" with returning ret = 0

Ack.

> 
> Please ERR_PTR() in qcom_scm_pas_ctx_init() and return the error up the call
> stack via your remove_ssr_sysmon jump label.

Sure.

> 
> ---
> bod

-- 
-Mukesh Ojha

Reply via email to