From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94B53C433E0 for ; Tue, 19 Jan 2021 18:42:34 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2596222E00 for ; Tue, 19 Jan 2021 18:42:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2596222E00 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=c0dhB1CPTzavyreXIHMapugx65VSqjLhDVu/wbCN8ac=; b=3g9oqHjOWumxXVqQQIP/ra3tP tDBaeJiYT9o3OjWY37rFXKWkUW/nZtcIeiMqbriOHlMeRUp1zP4NeOcIQ4ZzK4hIMAL8dM5H7+GRD UnoEpsbJi29XjvreaYiRPSEWZ8CFR28OP3pIHYoDJEhMfPZrCgOjSTV35Tw9VQI7zfRcEr8r6fZET ntvMvbsrnDcV3T70SD/Y3tJmNPpWvL9r3+JpTpYTSGiydZx7eO1fI29JSqpBZEhjOxXErr7QIzcVR zSTv98H6hWivClirLIurwmBKztYbXSWfRa9Oh//1P694J2MJgsYavwn+8/lxPX4Wdjq6nIGpCO03v mijIUfXSA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1u2w-0003r5-Gq; Tue, 19 Jan 2021 16:39:58 +0000 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1u2t-0003q0-4g for linux-arm-kernel@lists.infradead.org; Tue, 19 Jan 2021 16:39:56 +0000 Received: by mail-pl1-x633.google.com with SMTP id q4so10814135plr.7 for ; Tue, 19 Jan 2021 08:39:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=cTdtY4qgSag2E2xJ3jmFdRITmCSY9t7wixAtSeoxg2Q=; b=aCdcBXR98AKemYk1+rhoQq3w5sl00WP94W9fCQXp2GYqIbMgOeObEGYjxzu2OHDRO5 JNnsEeVYEnnxWjq9JYN0N5Es5VJ6o8poBtybD4qmqmh+rtRYqdcWoS6ZPLvmB86VqKvp KuwOo2wVfkXaKHST7hTie1Zwm+VmOHtTC+BkN5PrmnPa+oDrKx5SvzRSPHggm6ulyFUW j+cymDA+einZLR931KJ6XZ/xF54na30P2hXeZrfAa+CsmNp0pLfqhX6DXf51S3FRYpCy JD5rtGrBY59cPndSADv8WZZ1j+0nBFiz6eSDCgJfZCqNCKBOqXZw+i6ne3frB35NnWCk XfAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=cTdtY4qgSag2E2xJ3jmFdRITmCSY9t7wixAtSeoxg2Q=; b=JcEpVqSnQaDtxAAPfF0DdWYwTK1eIw0H0kD8rseYTwtdVLbS9+aZzkbjd+VgbO8dwJ TS16ZFuRrnWXRJlgTAVpjSSY1scbKoXg2D/R/0vjPUz/xlitH04yBQT/xA7MS43kSx62 +p6uFyKeQnH+8L+soMkf24k50U6VAUxSMLZrjKR29BSoQFNRracb5/SFUQdW9EzLqCIR rMvAXxaMDCSBdjCwWhQoYp58Sd4CQImDoWAGUouq6DFpfoe9lMlupgTj5JR2UhiIgjZL ky+QyzT/Vyvx/RnV2EgitU8yFhrCDY5lIs7iPmnFeJvdjPycz6Z68iEwW8uvOyMH0YHu RE5g== X-Gm-Message-State: AOAM530aKnHIiCPS4G51EzchkxpxktI3Jp0+4qsbkZ/UZHKPRW25dHac DB+w3X2f1rgT76kGod2+6OGhGA== X-Google-Smtp-Source: ABdhPJwsgG18vPsJQ0f/5DyB3vrcEJ5GeHpm0/VCYtLLtHmxk+zq/mqzsg8nE5P3A0ADiB+MatltVA== X-Received: by 2002:a17:90b:11d4:: with SMTP id gv20mr575460pjb.116.1611074390788; Tue, 19 Jan 2021 08:39:50 -0800 (PST) Received: from xps15 (S0106889e681aac74.cg.shawcable.net. [68.147.0.187]) by smtp.gmail.com with ESMTPSA id j23sm19036043pgj.34.2021.01.19.08.39.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Jan 2021 08:39:50 -0800 (PST) Date: Tue, 19 Jan 2021 09:39:48 -0700 From: Mathieu Poirier To: peng.fan@nxp.com Subject: Re: [PATCH V8 10/10] remoteproc: imx_proc: enable virtio/mailbox Message-ID: <20210119163948.GC611676@xps15> References: <1611041711-15902-1-git-send-email-peng.fan@nxp.com> <1611041711-15902-11-git-send-email-peng.fan@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1611041711-15902-11-git-send-email-peng.fan@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210119_113955_280003_F483C3D1 X-CRM114-Status: GOOD ( 25.90 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ohad@wizery.com, devicetree@vger.kernel.org, patrice.chotard@st.com, festevam@gmail.com, s.hauer@pengutronix.de, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, bjorn.andersson@linaro.org, paul@crapouillou.net, o.rempel@pengutronix.de, robh+dt@kernel.org, agross@kernel.org, linux-imx@nxp.com, kernel@pengutronix.de, matthias.bgg@gmail.com, shawnguo@kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Tue, Jan 19, 2021 at 03:35:11PM +0800, peng.fan@nxp.com wrote: > From: Peng Fan > > Use virtio/mailbox to build connection between Remote Proccessors > and Linux. Add work queue to handle incoming messages. > > Reviewed-by: Richard Zhu > Signed-off-by: Peng Fan > --- > drivers/remoteproc/imx_rproc.c | 116 ++++++++++++++++++++++++++++++++- > 1 file changed, 113 insertions(+), 3 deletions(-) Reviewed-by: Mathieu Poirier 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 > #include > #include > +#include > #include > #include > #include > @@ -15,6 +16,9 @@ > #include > #include > #include > +#include > + > +#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 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel