From: Peng Fan <[email protected]>
V2:
Depends on https://patchwork.kernel.org/project/linux-remoteproc/list/?series=621311
Tested on i.MX8QXP/QM/8MP
Addressed Mathieu's comments
Drop V1 patch 5/9, patch 3/9 is replaced with upper dependency patchset
Move V1 patch 4/9 out to https://patchwork.kernel.org/project/linux-remoteproc/patch/[email protected]/
Update commit log
Drop magic number to get entry address from device tree in patch 4/6
The V1 patchset:
https://patchwork.kernel.org/project/linux-remoteproc/patch/[email protected]/
Peng Fan (6):
dt-bindings: remoteproc: imx_rproc: support i.MX8QXP
dt-bindings: remoteproc: imx_rproc: support i.MX8QM
remoteproc: imx_rproc: support attaching to i.MX8QXP M4
remoteproc: imx_rproc: support kicking Mcore from Linux for i.MX8QXP
remoteproc: imx_rproc: support i.MX8QM
remoteproc: imx_rproc: request mbox channel later
.../bindings/remoteproc/fsl,imx-rproc.yaml | 19 ++
drivers/remoteproc/imx_rproc.c | 240 +++++++++++++++++-
2 files changed, 246 insertions(+), 13 deletions(-)
--
2.30.0
From: Peng Fan <[email protected]>
It is possible that when remote processor crash, the communication
channel will be broken with garbage value in mailbox, such as
when Linux is issuing a message through mailbox, remote processor
crashes, we need free & rebuild the mailbox channels to make sure
no garbage value in mailbox channels.
So move the request/free to start/stop for managing remote procesosr in
Linux, move to attach/detach for remote processor is out of control of
Linux.
Signed-off-by: Peng Fan <[email protected]>
---
drivers/remoteproc/imx_rproc.c | 31 ++++++++++++++++++++-----------
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index adedecf8def6..c03d479f1b09 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -83,6 +83,9 @@ struct imx_rproc_mem {
#define ATT_CORE_MASK 0xffff
#define ATT_CORE(I) BIT((I))
+static int imx_rproc_xtr_mbox_init(struct rproc *rproc);
+static void imx_rproc_free_mbox(struct rproc *rproc);
+
struct imx_rproc {
struct device *dev;
struct regmap *regmap;
@@ -323,6 +326,10 @@ static int imx_rproc_start(struct rproc *rproc)
struct arm_smccc_res res;
int ret;
+ ret = imx_rproc_xtr_mbox_init(rproc);
+ if (ret)
+ return ret;
+
switch (dcfg->method) {
case IMX_RPROC_MMIO:
ret = regmap_update_bits(priv->regmap, dcfg->src_reg, dcfg->src_mask,
@@ -373,6 +380,8 @@ static int imx_rproc_stop(struct rproc *rproc)
if (ret)
dev_err(dev, "Failed to stop remote core\n");
+ else
+ imx_rproc_free_mbox(rproc);
return ret;
}
@@ -552,7 +561,7 @@ static void imx_rproc_kick(struct rproc *rproc, int vqid)
static int imx_rproc_attach(struct rproc *rproc)
{
- return 0;
+ return imx_rproc_xtr_mbox_init(rproc);
}
/* Only support detach when doing attach recovery */
@@ -561,6 +570,8 @@ static int imx_rproc_detach(struct rproc *rproc)
if (rproc->state != RPROC_CRASHED)
return -ENOTSUPP;
+ imx_rproc_free_mbox(rproc);
+
return 0;
}
@@ -695,6 +706,9 @@ static int imx_rproc_xtr_mbox_init(struct rproc *rproc)
struct mbox_client *cl;
int ret;
+ if (priv->tx_ch && priv->rx_ch)
+ return 0;
+
if (!of_get_property(dev->of_node, "mbox-names", NULL))
return 0;
@@ -729,6 +743,8 @@ static void imx_rproc_free_mbox(struct rproc *rproc)
mbox_free_channel(priv->tx_ch);
mbox_free_channel(priv->rx_ch);
+ priv->tx_ch = NULL;
+ priv->rx_ch = NULL;
}
static int imx_rproc_partition_notify(struct notifier_block *nb,
@@ -961,23 +977,19 @@ static int imx_rproc_probe(struct platform_device *pdev)
goto err_put_rproc;
}
- ret = imx_rproc_xtr_mbox_init(rproc);
- if (ret)
- goto err_put_wkq;
-
ret = imx_rproc_addr_init(priv, pdev);
if (ret) {
dev_err(dev, "failed on imx_rproc_addr_init\n");
- goto err_put_mbox;
+ goto err_put_wkq;
}
ret = imx_rproc_detect_mode(priv);
if (ret)
- goto err_put_mbox;
+ goto err_put_wkq;
ret = imx_rproc_clk_enable(priv);
if (ret)
- goto err_put_mbox;
+ goto err_put_wkq;
INIT_WORK(&priv->rproc_work, imx_rproc_vq_work);
@@ -994,8 +1006,6 @@ static int imx_rproc_probe(struct platform_device *pdev)
err_put_clk:
clk_disable_unprepare(priv->clk);
-err_put_mbox:
- imx_rproc_free_mbox(rproc);
err_put_wkq:
destroy_workqueue(priv->workqueue);
err_put_rproc:
@@ -1011,7 +1021,6 @@ static int imx_rproc_remove(struct platform_device *pdev)
clk_disable_unprepare(priv->clk);
rproc_del(rproc);
- imx_rproc_free_mbox(rproc);
destroy_workqueue(priv->workqueue);
rproc_free(rproc);
--
2.30.0
From: Peng Fan <[email protected]>
Add i.MX8QM compatible
There are two general purpose M4, so add reg property to indicate the
id.
Signed-off-by: Peng Fan <[email protected]>
---
.../devicetree/bindings/remoteproc/fsl,imx-rproc.yaml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
index f25c203dd2f9..41d366cff3cd 100644
--- a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
+++ b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
@@ -20,6 +20,7 @@ properties:
- fsl,imx8mn-cm7
- fsl,imx8mp-cm7
- fsl,imx8qxp-cm4
+ - fsl,imx8qm-cm4
- fsl,imx8ulp-cm33
- fsl,imx7d-cm4
- fsl,imx7ulp-cm4
@@ -68,6 +69,9 @@ properties:
power-domains:
maxItems: 8
+ reg:
+ maxItems: 1
+
rsrc-id:
description:
This property is to specify the resource id of the remote processor in SoC
--
2.30.0
From: Peng Fan <[email protected]>
When M4 is kicked by SCFW, M4 runs in its own hardware partition, Linux
could only do IPC with M4, it could not start, stop, update image.
When M4 crash reboot, it could notify Linux, so Linux could prepare to
reattach to M4 after M4 recovery.
Signed-off-by: Peng Fan <[email protected]>
---
drivers/remoteproc/imx_rproc.c | 99 ++++++++++++++++++++++++++++++++++
1 file changed, 99 insertions(+)
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index f2bfc9077c19..6ed53c660c18 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -6,6 +6,7 @@
#include <linux/arm-smccc.h>
#include <linux/clk.h>
#include <linux/err.h>
+#include <linux/firmware/imx/sci.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/mailbox_client.h>
@@ -59,6 +60,8 @@
#define IMX_SIP_RPROC_STARTED 0x01
#define IMX_SIP_RPROC_STOP 0x02
+#define IMX_SC_IRQ_GROUP_REBOOTED 5
+
/**
* struct imx_rproc_mem - slim internal memory structure
* @cpu_addr: MPU virtual address of the memory region
@@ -89,6 +92,23 @@ struct imx_rproc {
struct work_struct rproc_work;
struct workqueue_struct *workqueue;
void __iomem *rsc_table;
+ struct imx_sc_ipc *ipc_handle;
+ struct notifier_block proc_nb;
+ u32 rproc_pt; /* partition id */
+ u32 rsrc; /* resource id */
+};
+
+static const struct imx_rproc_att imx_rproc_att_imx8qxp[] = {
+ /* dev addr , sys addr , size , flags */
+ { 0x08000000, 0x08000000, 0x10000000, 0},
+ /* TCML/U */
+ { 0x1FFE0000, 0x34FE0000, 0x00040000, ATT_OWN | ATT_IOMEM },
+ /* OCRAM(Low 96KB) */
+ { 0x21000000, 0x00100000, 0x00018000, 0},
+ /* OCRAM */
+ { 0x21100000, 0x00100000, 0x00040000, 0},
+ /* DDR (Data) */
+ { 0x80000000, 0x80000000, 0x60000000, 0 },
};
static const struct imx_rproc_att imx_rproc_att_imx8mn[] = {
@@ -235,6 +255,12 @@ static const struct imx_rproc_dcfg imx_rproc_cfg_imx8ulp = {
.method = IMX_RPROC_NONE,
};
+static const struct imx_rproc_dcfg imx_rproc_cfg_imx8qxp = {
+ .att = imx_rproc_att_imx8qxp,
+ .att_size = ARRAY_SIZE(imx_rproc_att_imx8qxp),
+ .method = IMX_RPROC_SCU_API,
+};
+
static const struct imx_rproc_dcfg imx_rproc_cfg_imx7ulp = {
.att = imx_rproc_att_imx7ulp,
.att_size = ARRAY_SIZE(imx_rproc_att_imx7ulp),
@@ -490,6 +516,15 @@ static int imx_rproc_attach(struct rproc *rproc)
return 0;
}
+/* Only support detach when doing attach recovery */
+static int imx_rproc_detach(struct rproc *rproc)
+{
+ if (rproc->state != RPROC_CRASHED)
+ return -EOPNOTSUPP;
+
+ return 0;
+}
+
static struct resource_table *imx_rproc_get_loaded_rsc_table(struct rproc *rproc, size_t *table_sz)
{
struct imx_rproc *priv = rproc->priv;
@@ -505,6 +540,7 @@ static struct resource_table *imx_rproc_get_loaded_rsc_table(struct rproc *rproc
static const struct rproc_ops imx_rproc_ops = {
.prepare = imx_rproc_prepare,
.attach = imx_rproc_attach,
+ .detach = imx_rproc_detach,
.start = imx_rproc_start,
.stop = imx_rproc_stop,
.kick = imx_rproc_kick,
@@ -651,6 +687,22 @@ static void imx_rproc_free_mbox(struct rproc *rproc)
mbox_free_channel(priv->rx_ch);
}
+static int imx_rproc_partition_notify(struct notifier_block *nb,
+ unsigned long event, void *group)
+{
+ struct imx_rproc *priv = container_of(nb, struct imx_rproc, proc_nb);
+
+ /* Ignore other irqs */
+ if (!((event & BIT(priv->rproc_pt)) && (*(u8 *)group == IMX_SC_IRQ_GROUP_REBOOTED)))
+ return 0;
+
+ rproc_report_crash(priv->rproc, RPROC_WATCHDOG);
+
+ pr_info("Partition%d reset!\n", priv->rproc_pt);
+
+ return 0;
+}
+
static int imx_rproc_detect_mode(struct imx_rproc *priv)
{
struct regmap_config config = { .name = "imx-rproc" };
@@ -660,6 +712,7 @@ static int imx_rproc_detect_mode(struct imx_rproc *priv)
struct arm_smccc_res res;
int ret;
u32 val;
+ u8 pt;
switch (dcfg->method) {
case IMX_RPROC_NONE:
@@ -670,6 +723,51 @@ static int imx_rproc_detect_mode(struct imx_rproc *priv)
if (res.a0)
priv->rproc->state = RPROC_DETACHED;
return 0;
+ case IMX_RPROC_SCU_API:
+ ret = imx_scu_get_handle(&priv->ipc_handle);
+ if (ret)
+ return ret;
+ ret = of_property_read_u32(dev->of_node, "rsrc-id", &priv->rsrc);
+ if (ret) {
+ dev_err(dev, "no rsrc-id\n");
+ return ret;
+ }
+
+ /*
+ * If Mcore resource is not owned by Acore partition, It is kicked by ROM,
+ * and Linux could only do IPC with Mcore and nothing else.
+ */
+ if (imx_sc_rm_is_resource_owned(priv->ipc_handle, priv->rsrc))
+ return 0;
+
+ rproc_set_feature(priv->rproc, RPROC_FEAT_ATTACH_RECOVERY);
+ priv->rproc->state = RPROC_DETACHED;
+
+ /* Get partition id and enable irq in SCFW */
+ ret = imx_sc_rm_get_resource_owner(priv->ipc_handle, priv->rsrc, &pt);
+ if (ret) {
+ dev_err(dev, "not able to get resource owner\n");
+ return ret;
+ }
+
+ priv->rproc_pt = pt;
+ priv->proc_nb.notifier_call = imx_rproc_partition_notify;
+
+ ret = imx_scu_irq_register_notifier(&priv->proc_nb);
+ if (ret) {
+ dev_warn(dev, "register scu notifier failed.\n");
+ return ret;
+ }
+
+ ret = imx_scu_irq_group_enable(IMX_SC_IRQ_GROUP_REBOOTED,
+ BIT(priv->rproc_pt), true);
+ if (ret) {
+ imx_scu_irq_unregister_notifier(&priv->proc_nb);
+ dev_warn(dev, "Enable irq failed.\n");
+ return ret;
+ }
+
+ return 0;
default:
break;
}
@@ -823,6 +921,7 @@ static const struct of_device_id imx_rproc_of_match[] = {
{ .compatible = "fsl,imx8mm-cm4", .data = &imx_rproc_cfg_imx8mq },
{ .compatible = "fsl,imx8mn-cm7", .data = &imx_rproc_cfg_imx8mn },
{ .compatible = "fsl,imx8mp-cm7", .data = &imx_rproc_cfg_imx8mn },
+ { .compatible = "fsl,imx8qxp-cm4", .data = &imx_rproc_cfg_imx8qxp },
{ .compatible = "fsl,imx8ulp-cm33", .data = &imx_rproc_cfg_imx8ulp },
{},
};
--
2.30.0
On Wed, Mar 09, 2022 at 06:21:14PM +0800, Peng Fan (OSS) wrote:
> From: Peng Fan <[email protected]>
>
> Add i.MX8QM compatible
>
> There are two general purpose M4, so add reg property to indicate the
> id.
Where does the id come from? Is this just an index?
>
> Signed-off-by: Peng Fan <[email protected]>
> ---
> .../devicetree/bindings/remoteproc/fsl,imx-rproc.yaml | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> index f25c203dd2f9..41d366cff3cd 100644
> --- a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> +++ b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> @@ -20,6 +20,7 @@ properties:
> - fsl,imx8mn-cm7
> - fsl,imx8mp-cm7
> - fsl,imx8qxp-cm4
> + - fsl,imx8qm-cm4
> - fsl,imx8ulp-cm33
> - fsl,imx7d-cm4
> - fsl,imx7ulp-cm4
> @@ -68,6 +69,9 @@ properties:
> power-domains:
> maxItems: 8
>
> + reg:
> + maxItems: 1
> +
> rsrc-id:
> description:
> This property is to specify the resource id of the remote processor in SoC
> --
> 2.30.0
>
>
> Subject: Re: [PATCH V2 2/6] dt-bindings: remoteproc: imx_rproc: support
> i.MX8QM
>
> On Wed, Mar 09, 2022 at 06:21:14PM +0800, Peng Fan (OSS) wrote:
> > From: Peng Fan <[email protected]>
> >
> > Add i.MX8QM compatible
> >
> > There are two general purpose M4, so add reg property to indicate the
> > id.
>
> Where does the id come from? Is this just an index?
It is software use to identify which is m4_0 and which is m4_1,
just an index.
Thanks,
Peng.
>
> >
> > Signed-off-by: Peng Fan <[email protected]>
> > ---
> > .../devicetree/bindings/remoteproc/fsl,imx-rproc.yaml | 4
> ++++
> > 1 file changed, 4 insertions(+)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > index f25c203dd2f9..41d366cff3cd 100644
> > --- a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > +++ b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > @@ -20,6 +20,7 @@ properties:
> > - fsl,imx8mn-cm7
> > - fsl,imx8mp-cm7
> > - fsl,imx8qxp-cm4
> > + - fsl,imx8qm-cm4
> > - fsl,imx8ulp-cm33
> > - fsl,imx7d-cm4
> > - fsl,imx7ulp-cm4
> > @@ -68,6 +69,9 @@ properties:
> > power-domains:
> > maxItems: 8
> >
> > + reg:
> > + maxItems: 1
> > +
> > rsrc-id:
> > description:
> > This property is to specify the resource id of the remote
> > processor in SoC
> > --
> > 2.30.0
> >
> >
On Thu 10 Mar 19:58 CST 2022, Peng Fan wrote:
> > Subject: Re: [PATCH V2 2/6] dt-bindings: remoteproc: imx_rproc: support
> > i.MX8QM
> >
> > On Wed, Mar 09, 2022 at 06:21:14PM +0800, Peng Fan (OSS) wrote:
> > > From: Peng Fan <[email protected]>
> > >
> > > Add i.MX8QM compatible
> > >
> > > There are two general purpose M4, so add reg property to indicate the
> > > id.
> >
> > Where does the id come from? Is this just an index?
>
> It is software use to identify which is m4_0 and which is m4_1,
> just an index.
>
"reg" is supposed to represent some sort of identifier on the parent
bus, as such it doesn't seem to be the appropriate property to provide
an arbitrary 0 or 1 to identify which of the two m4s this is.
Regards,
Bjorn
> Thanks,
> Peng.
>
> >
> > >
> > > Signed-off-by: Peng Fan <[email protected]>
> > > ---
> > > .../devicetree/bindings/remoteproc/fsl,imx-rproc.yaml | 4
> > ++++
> > > 1 file changed, 4 insertions(+)
> > >
> > > diff --git
> > > a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > > b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > > index f25c203dd2f9..41d366cff3cd 100644
> > > --- a/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > > +++ b/Documentation/devicetree/bindings/remoteproc/fsl,imx-rproc.yaml
> > > @@ -20,6 +20,7 @@ properties:
> > > - fsl,imx8mn-cm7
> > > - fsl,imx8mp-cm7
> > > - fsl,imx8qxp-cm4
> > > + - fsl,imx8qm-cm4
> > > - fsl,imx8ulp-cm33
> > > - fsl,imx7d-cm4
> > > - fsl,imx7ulp-cm4
> > > @@ -68,6 +69,9 @@ properties:
> > > power-domains:
> > > maxItems: 8
> > >
> > > + reg:
> > > + maxItems: 1
> > > +
> > > rsrc-id:
> > > description:
> > > This property is to specify the resource id of the remote
> > > processor in SoC
> > > --
> > > 2.30.0
> > >
> > >