From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: peng.fan@nxp.com
Cc: ohad@wizery.com, bjorn.andersson@linaro.org,
o.rempel@pengutronix.de, robh+dt@kernel.org,
devicetree@vger.kernel.org, shawnguo@kernel.org,
s.hauer@pengutronix.de, kernel@pengutronix.de,
festevam@gmail.com, linux-imx@nxp.com,
linux-remoteproc@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, paul@crapouillou.net,
matthias.bgg@gmail.com, agross@kernel.org,
patrice.chotard@st.com
Subject: Re: [PATCH V8 10/10] remoteproc: imx_proc: enable virtio/mailbox
Date: Tue, 19 Jan 2021 09:39:48 -0700 [thread overview]
Message-ID: <20210119163948.GC611676@xps15> (raw)
In-Reply-To: <1611041711-15902-11-git-send-email-peng.fan@nxp.com>
On Tue, Jan 19, 2021 at 03:35:11PM +0800, peng.fan@nxp.com wrote:
> From: Peng Fan <peng.fan@nxp.com>
>
> Use virtio/mailbox to build connection between Remote Proccessors
> and Linux. Add work queue to handle incoming messages.
>
> Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com>
> Signed-off-by: Peng Fan <peng.fan@nxp.com>
> ---
> drivers/remoteproc/imx_rproc.c | 116 ++++++++++++++++++++++++++++++++-
> 1 file changed, 113 insertions(+), 3 deletions(-)
Reviewed-by: Mathieu Poirier <mathieu.poirer@linaro.org>
I will pickup this set when Rob has reviewed the DT bindings. In the mean time
you might want to fix the title section in the the .yaml file, the Kconfig
and the MODULE_DESCRIPTION and add a reference to i.MX8.
Thanks,
Mathieu
>
> diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
> index 54ac143ba033..c16a91f8e410 100644
> --- a/drivers/remoteproc/imx_rproc.c
> +++ b/drivers/remoteproc/imx_rproc.c
> @@ -7,6 +7,7 @@
> #include <linux/err.h>
> #include <linux/interrupt.h>
> #include <linux/kernel.h>
> +#include <linux/mailbox_client.h>
> #include <linux/mfd/syscon.h>
> #include <linux/module.h>
> #include <linux/of_address.h>
> @@ -15,6 +16,9 @@
> #include <linux/platform_device.h>
> #include <linux/regmap.h>
> #include <linux/remoteproc.h>
> +#include <linux/workqueue.h>
> +
> +#include "remoteproc_internal.h"
>
> #define IMX7D_SRC_SCR 0x0C
> #define IMX7D_ENABLE_M4 BIT(3)
> @@ -86,6 +90,11 @@ struct imx_rproc {
> const struct imx_rproc_dcfg *dcfg;
> struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX];
> struct clk *clk;
> + struct mbox_client cl;
> + struct mbox_chan *tx_ch;
> + struct mbox_chan *rx_ch;
> + struct work_struct rproc_work;
> + struct workqueue_struct *workqueue;
> };
>
> static const struct imx_rproc_att imx_rproc_att_imx8mq[] = {
> @@ -366,9 +375,33 @@ static int imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
> return 0;
> }
>
> +static void imx_rproc_kick(struct rproc *rproc, int vqid)
> +{
> + struct imx_rproc *priv = rproc->priv;
> + int err;
> + __u32 mmsg;
> +
> + if (!priv->tx_ch) {
> + dev_err(priv->dev, "No initialized mbox tx channel\n");
> + return;
> + }
> +
> + /*
> + * Send the index of the triggered virtqueue as the mu payload.
> + * Let remote processor know which virtqueue is used.
> + */
> + mmsg = vqid << 16;
> +
> + err = mbox_send_message(priv->tx_ch, (void *)&mmsg);
> + if (err < 0)
> + dev_err(priv->dev, "%s: failed (%d, err:%d)\n",
> + __func__, vqid, err);
> +}
> +
> static const struct rproc_ops imx_rproc_ops = {
> .start = imx_rproc_start,
> .stop = imx_rproc_stop,
> + .kick = imx_rproc_kick,
> .da_to_va = imx_rproc_da_to_va,
> .load = rproc_elf_load_segments,
> .parse_fw = imx_rproc_parse_fw,
> @@ -444,6 +477,66 @@ static int imx_rproc_addr_init(struct imx_rproc *priv,
> return 0;
> }
>
> +static void imx_rproc_vq_work(struct work_struct *work)
> +{
> + struct imx_rproc *priv = container_of(work, struct imx_rproc,
> + rproc_work);
> +
> + rproc_vq_interrupt(priv->rproc, 0);
> + rproc_vq_interrupt(priv->rproc, 1);
> +}
> +
> +static void imx_rproc_rx_callback(struct mbox_client *cl, void *msg)
> +{
> + struct rproc *rproc = dev_get_drvdata(cl->dev);
> + struct imx_rproc *priv = rproc->priv;
> +
> + queue_work(priv->workqueue, &priv->rproc_work);
> +}
> +
> +static int imx_rproc_xtr_mbox_init(struct rproc *rproc)
> +{
> + struct imx_rproc *priv = rproc->priv;
> + struct device *dev = priv->dev;
> + struct mbox_client *cl;
> + int ret;
> +
> + if (!of_get_property(dev->of_node, "mbox-names", NULL))
> + return 0;
> +
> + cl = &priv->cl;
> + cl->dev = dev;
> + cl->tx_block = true;
> + cl->tx_tout = 100;
> + cl->knows_txdone = false;
> + cl->rx_callback = imx_rproc_rx_callback;
> +
> + priv->tx_ch = mbox_request_channel_byname(cl, "tx");
> + if (IS_ERR(priv->tx_ch)) {
> + ret = PTR_ERR(priv->tx_ch);
> + return dev_err_probe(cl->dev, ret,
> + "failed to request tx mailbox channel: %d\n", ret);
> + }
> +
> + priv->rx_ch = mbox_request_channel_byname(cl, "rx");
> + if (IS_ERR(priv->rx_ch)) {
> + mbox_free_channel(priv->tx_ch);
> + ret = PTR_ERR(priv->rx_ch);
> + return dev_err_probe(cl->dev, ret,
> + "failed to request rx mailbox channel: %d\n", ret);
> + }
> +
> + return 0;
> +}
> +
> +static void imx_rproc_free_mbox(struct rproc *rproc)
> +{
> + struct imx_rproc *priv = rproc->priv;
> +
> + mbox_free_channel(priv->tx_ch);
> + mbox_free_channel(priv->rx_ch);
> +}
> +
> static int imx_rproc_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -481,18 +574,28 @@ static int imx_rproc_probe(struct platform_device *pdev)
> priv->dev = dev;
>
> dev_set_drvdata(dev, rproc);
> + priv->workqueue = create_workqueue(dev_name(dev));
> + if (!priv->workqueue) {
> + dev_err(dev, "cannot create workqueue\n");
> + ret = -ENOMEM;
> + 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_rproc;
> + goto err_put_mbox;
> }
>
> priv->clk = devm_clk_get(dev, NULL);
> if (IS_ERR(priv->clk)) {
> dev_err(dev, "Failed to get clock\n");
> ret = PTR_ERR(priv->clk);
> - goto err_put_rproc;
> + goto err_put_mbox;
> }
>
> /*
> @@ -502,9 +605,11 @@ static int imx_rproc_probe(struct platform_device *pdev)
> ret = clk_prepare_enable(priv->clk);
> if (ret) {
> dev_err(&rproc->dev, "Failed to enable clock\n");
> - goto err_put_rproc;
> + goto err_put_mbox;
> }
>
> + INIT_WORK(&(priv->rproc_work), imx_rproc_vq_work);
> +
> ret = rproc_add(rproc);
> if (ret) {
> dev_err(dev, "rproc_add failed\n");
> @@ -515,6 +620,10 @@ 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:
> rproc_free(rproc);
>
> @@ -528,6 +637,7 @@ static int imx_rproc_remove(struct platform_device *pdev)
>
> clk_disable_unprepare(priv->clk);
> rproc_del(rproc);
> + imx_rproc_free_mbox(rproc);
> rproc_free(rproc);
>
> return 0;
> --
> 2.28.0
>
next prev parent reply other threads:[~2021-01-19 18:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-19 7:35 [PATCH V8 00/10] remoteproc: imx_rproc: support iMX8MQ/M peng.fan
2021-01-19 7:35 ` [PATCH V8 01/10] dt-bindings: remoteproc: convert imx rproc bindings to json-schema peng.fan
2021-01-19 7:35 ` [PATCH V8 02/10] dt-bindings: remoteproc: imx_rproc: add i.MX8MQ/M support peng.fan
2021-01-19 7:35 ` [PATCH V8 03/10] remoteproc: introduce is_iomem to rproc_mem_entry peng.fan
2021-01-19 7:35 ` [PATCH V8 04/10] remoteproc: add is_iomem to da_to_va peng.fan
2021-01-19 7:35 ` [PATCH V8 05/10] remoteproc: imx_rproc: correct err message peng.fan
2021-01-19 7:35 ` [PATCH V8 06/10] remoteproc: imx_rproc: use devm_ioremap peng.fan
2021-01-19 7:35 ` [PATCH V8 07/10] remoteproc: imx_rproc: add i.MX specific parse fw hook peng.fan
2021-01-19 7:35 ` [PATCH V8 08/10] remoteproc: imx_rproc: support i.MX8MQ/M peng.fan
2021-01-19 7:35 ` [PATCH V8 09/10] remoteproc: imx_rproc: ignore mapping vdev regions peng.fan
2021-01-19 7:35 ` [PATCH V8 10/10] remoteproc: imx_proc: enable virtio/mailbox peng.fan
2021-01-19 16:39 ` Mathieu Poirier [this message]
2021-01-21 1:21 ` Peng Fan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210119163948.GC611676@xps15 \
--to=mathieu.poirier@linaro.org \
--cc=agross@kernel.org \
--cc=bjorn.andersson@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=festevam@gmail.com \
--cc=kernel@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-imx@nxp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=o.rempel@pengutronix.de \
--cc=ohad@wizery.com \
--cc=patrice.chotard@st.com \
--cc=paul@crapouillou.net \
--cc=peng.fan@nxp.com \
--cc=robh+dt@kernel.org \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).