Re: [PATCH v2 06/12] remoteproc: stm32: Get coprocessor state
From: Mathieu Poirier
Date: Fri May 01 2020 - 13:40:37 EST
On Wed, Apr 29, 2020 at 03:38:24PM +0200, Arnaud POULIQUEN wrote:
>
>
> On 4/24/20 10:24 PM, Mathieu Poirier wrote:
> > Introduce the required mechanic to get the state of the M4 when the
> > remoteproc core is initialising.
> >
> > Mainly based on the work published by Arnaud Pouliquen [1].
> >
> > [1]. https://patchwork.kernel.org/project/linux-remoteproc/list/?series=239877
> >
> > Signed-off-by: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx>
> > Reviewed-by: Loic Pallardy <loic.pallardy@xxxxxx>
> > ---
> > drivers/remoteproc/stm32_rproc.c | 29 +++++++++++++++++++++++++++++
> > 1 file changed, 29 insertions(+)
> >
> > diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
> > index a285f338bed8..89fbd2ffac93 100644
> > --- a/drivers/remoteproc/stm32_rproc.c
> > +++ b/drivers/remoteproc/stm32_rproc.c
> > @@ -38,6 +38,15 @@
> > #define STM32_MBX_VQ1_ID 1
> > #define STM32_MBX_SHUTDOWN "shutdown"
> >
> > +#define RSC_TBL_SIZE (1024)
> > +
> > +#define M4_STATE_OFF 0
> > +#define M4_STATE_INI 1
> > +#define M4_STATE_CRUN 2
> > +#define M4_STATE_CSTOP 3
> > +#define M4_STATE_STANDBY 4
> > +#define M4_STATE_CRASH 5
> > +
> > struct stm32_syscon {
> > struct regmap *map;
> > u32 reg;
> > @@ -635,12 +644,23 @@ static int stm32_rproc_parse_dt(struct platform_device *pdev,
> > return 0;
> > }
> >
> > +static int stm32_rproc_get_m4_status(struct stm32_rproc *ddata,
> > + unsigned int *state)
> > +{
> > + /* See stm32_rproc_parse_dt() */
> > + if (!ddata->m4_state.map)
> > + return -EINVAL;
> > +
> > + return regmap_read(ddata->m4_state.map, ddata->m4_state.reg, state);
> > +}
> i would manage here the default state depending on the error types
> if (!ddata->m4_state.map {
> /*
> * We couldn't get the coprocessor's state, assume
> * it is not running.
> */
> state = M4_STATE_OFF;
>
> return 0;
> }
>
> return regmap_read(ddata->m4_state.map, ddata->m4_state.reg, state);
>
>
>
> > +
> > static int stm32_rproc_probe(struct platform_device *pdev)
> > {
> > struct device *dev = &pdev->dev;
> > struct stm32_rproc *ddata;
> > struct device_node *np = dev->of_node;
> > struct rproc *rproc;
> > + unsigned int state;
> > bool auto_boot = false;
> > int ret;
> >
> > @@ -664,6 +684,15 @@ static int stm32_rproc_probe(struct platform_device *pdev)
> > if (ret)
> > goto free_rproc;
> >
> > + ret = stm32_rproc_get_m4_status(ddata, &state);
> > + if (ret) {
> > + /*
> > + * We couldn't get the coprocessor's state, assume
> > + * it is not running.
> > + */
> > + state = M4_STATE_OFF;
>
> So here just handle the error;
Ok
>
> Regards
> Arnaud
> > + }
> > +
> > rproc->auto_boot = auto_boot;
> > rproc->has_iommu = false;
> > ddata->workqueue = create_workqueue(dev_name(dev));
> >