Message ID | 20230217094124.9440-1-iuliana.prodan@oss.nxp.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v5] remoteproc: imx_dsp_rproc: add module parameter to ignore ready flag from remote processor | expand |
Hi Iuliana, On Fri, Feb 17, 2023 at 11:41:24AM +0200, Iuliana Prodan (OSS) wrote: > From: Iuliana Prodan <iuliana.prodan@nxp.com> > > There are cases when we want to test a simple "hello world" > application on the DSP and we don't have IPC between the cores. > Therefore, do not wait for a confirmation from the remote processor > at start. > > Added "no_mailboxes" flag while inserting the module to not initialize > any mailboxes, and so ignore remote processor reply after start. > By default, this is off - do not ignore reply from rproc. > > Signed-off-by: Iuliana Prodan <iuliana.prodan@nxp.com> > Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> > --- > Changes since v4 > - s/ignore_dsp_ready/no_mailboxes > - make imx_dsp_rproc_mbox_init() a function pointer which, > based on the no_mailboxes module parameter, can initialize > the mailboxes (= imx_dsp_rproc_mbox_alloc()), in case they exists, > otherwise does nothing (= imx_dsp_rproc_mbox_no_alloc()). > > Changes since v3 > - do not instantiate static var to 0, this is done by default > - do not initialize mailbox if not IPC between the core > > Changes since v2 > - s/ignoreready/ignore_dsp_ready > > Changes since v1 > - change BIT(31) to BIT(1) for REMOTE_SKIP_WAIT > --- > drivers/remoteproc/imx_dsp_rproc.c | 33 ++++++++++++++++++++++++++++-- > 1 file changed, 31 insertions(+), 2 deletions(-) > > diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c > index 95da1cbefacf..85eea85b1655 100644 > --- a/drivers/remoteproc/imx_dsp_rproc.c > +++ b/drivers/remoteproc/imx_dsp_rproc.c > @@ -28,6 +28,15 @@ > > #define DSP_RPROC_CLK_MAX 5 > > +/* > + * Module parameters > + */ > +static unsigned int no_mailboxes; > +module_param_named(no_mailboxes, no_mailboxes, int, 0644); > +MODULE_PARM_DESC(no_mailboxes, > + "There is no mailbox between cores, so ignore remote proc " > + "reply after start, default is 0 (off)."); > + > #define REMOTE_IS_READY BIT(0) > #define REMOTE_READY_WAIT_MAX_RETRIES 500 > > @@ -172,6 +181,9 @@ static const struct imx_rproc_att imx_dsp_rproc_att_imx8ulp[] = { > { 0x30000000, 0x90000000, 0x10000000, 0}, > }; > > +/* Initialize the mailboxes between cores, if exists */ > +static int (*imx_dsp_rproc_mbox_init)(struct imx_dsp_rproc *priv); > + > /* Reset function for DSP on i.MX8MP */ > static int imx8mp_dsp_reset(struct imx_dsp_rproc *priv) > { > @@ -492,12 +504,12 @@ static void imx_dsp_rproc_rxdb_callback(struct mbox_client *cl, void *data) > } > > /** > - * imx_dsp_rproc_mbox_init() - request mailbox channels > + * imx_dsp_rproc_mbox_alloc() - request mailbox channels > * @priv: private data pointer > * > * Request three mailbox channels (tx, rx, rxdb). > */ > -static int imx_dsp_rproc_mbox_init(struct imx_dsp_rproc *priv) > +static int imx_dsp_rproc_mbox_alloc(struct imx_dsp_rproc *priv) > { > struct device *dev = priv->rproc->dev.parent; > struct mbox_client *cl; > @@ -560,6 +572,18 @@ static int imx_dsp_rproc_mbox_init(struct imx_dsp_rproc *priv) > return ret; > } > > +/** > + * imx_dsp_rproc_mbox_no_alloc() > + * > + * Empty function for no mailbox between cores > + * > + * Always return 0 > + */ > +static int imx_dsp_rproc_mbox_no_alloc(struct imx_dsp_rproc *priv) > +{ > + return 0; > +} > + > static void imx_dsp_rproc_free_mbox(struct imx_dsp_rproc *priv) > { > mbox_free_channel(priv->tx_ch); > @@ -903,6 +927,11 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev) > priv->rproc = rproc; > priv->dsp_dcfg = dsp_dcfg; > > + if (no_mailboxes) > + imx_dsp_rproc_mbox_init = imx_dsp_rproc_mbox_no_alloc; > + else > + imx_dsp_rproc_mbox_init = imx_dsp_rproc_mbox_alloc; > + This looks good now. The merge window for the 6.3 cycle opens on Sunday, which I find too close to start adding new things. As such I will apply your patch to my local branch and publish it in three weeks when v6.3-rc2 comes out. Thanks, Mathieu > dev_set_drvdata(dev, rproc); > > INIT_WORK(&priv->rproc_work, imx_dsp_rproc_vq_work); > -- > 2.17.1 >
diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c index 95da1cbefacf..85eea85b1655 100644 --- a/drivers/remoteproc/imx_dsp_rproc.c +++ b/drivers/remoteproc/imx_dsp_rproc.c @@ -28,6 +28,15 @@ #define DSP_RPROC_CLK_MAX 5 +/* + * Module parameters + */ +static unsigned int no_mailboxes; +module_param_named(no_mailboxes, no_mailboxes, int, 0644); +MODULE_PARM_DESC(no_mailboxes, + "There is no mailbox between cores, so ignore remote proc " + "reply after start, default is 0 (off)."); + #define REMOTE_IS_READY BIT(0) #define REMOTE_READY_WAIT_MAX_RETRIES 500 @@ -172,6 +181,9 @@ static const struct imx_rproc_att imx_dsp_rproc_att_imx8ulp[] = { { 0x30000000, 0x90000000, 0x10000000, 0}, }; +/* Initialize the mailboxes between cores, if exists */ +static int (*imx_dsp_rproc_mbox_init)(struct imx_dsp_rproc *priv); + /* Reset function for DSP on i.MX8MP */ static int imx8mp_dsp_reset(struct imx_dsp_rproc *priv) { @@ -492,12 +504,12 @@ static void imx_dsp_rproc_rxdb_callback(struct mbox_client *cl, void *data) } /** - * imx_dsp_rproc_mbox_init() - request mailbox channels + * imx_dsp_rproc_mbox_alloc() - request mailbox channels * @priv: private data pointer * * Request three mailbox channels (tx, rx, rxdb). */ -static int imx_dsp_rproc_mbox_init(struct imx_dsp_rproc *priv) +static int imx_dsp_rproc_mbox_alloc(struct imx_dsp_rproc *priv) { struct device *dev = priv->rproc->dev.parent; struct mbox_client *cl; @@ -560,6 +572,18 @@ static int imx_dsp_rproc_mbox_init(struct imx_dsp_rproc *priv) return ret; } +/** + * imx_dsp_rproc_mbox_no_alloc() + * + * Empty function for no mailbox between cores + * + * Always return 0 + */ +static int imx_dsp_rproc_mbox_no_alloc(struct imx_dsp_rproc *priv) +{ + return 0; +} + static void imx_dsp_rproc_free_mbox(struct imx_dsp_rproc *priv) { mbox_free_channel(priv->tx_ch); @@ -903,6 +927,11 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev) priv->rproc = rproc; priv->dsp_dcfg = dsp_dcfg; + if (no_mailboxes) + imx_dsp_rproc_mbox_init = imx_dsp_rproc_mbox_no_alloc; + else + imx_dsp_rproc_mbox_init = imx_dsp_rproc_mbox_alloc; + dev_set_drvdata(dev, rproc); INIT_WORK(&priv->rproc_work, imx_dsp_rproc_vq_work);