Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp390781pxb; Tue, 9 Feb 2021 03:07:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJxSv2mv+dxGh2rBREc4gG/imiMzPwb1Iutnu30rWDME/CpqnNabPSqQ/srYPWE7evx2FJjy X-Received: by 2002:a17:906:d84:: with SMTP id m4mr21696609eji.437.1612868838953; Tue, 09 Feb 2021 03:07:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612868838; cv=none; d=google.com; s=arc-20160816; b=NAC97oBLtZyztPaMpAOkfzooBwPGUk5wQfSQDEwXofaeNWPDsXcaVZhBkcezLAC4qx NFg5WhjfbwEBGyi3D7xXCktV7OAynlLbXMfuyPLuXtbfL1Fa0bhOGigaI15+hQzZjvlY Ga5RvX1cCWxYZNtD2c/Bf9R5fooLc+rMvqKZsIy9qd8eDcdAq5ey3eDp3YQ7cpaNuKgw 7SSb3Kv7MAJaxEDQUtWKRIV9h/3ovjwFn1WGN50ot7UkURV6Nj6ypTvpY+CN8kEa0vAn SiNCdANJiog9h3At3VZEuxyXtHvyXwGLyY7B7L2Q8W9qdoWgtJWAWTbYMD7cMVjXuzN1 VzLw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=skhiqf6XHdrL85W8XLfMMk82wIY2NH/2YVOEeXuwU+Y=; b=vj0qI0GdSSJxUbmuzx0xALFx0E9V8r9m4LnvOkAt6Y/aNBTPdd5XumAGkjaos3eDy9 WwgpNRCJTMbp/xeamKefQuP9fZE/7XxTc8+jTayys1xQ2hEhpvzDBFwT+xADlDx8ng/P tC/RAxKXGNUfA95ABf7DFQpjx7ii4Gg1pjQpijR73BODGlaY8W1lZw/MYn663s1cZwRR WItRdIwgXhqDGlYAaS3bRwet3JjeRNAeBtnjBn3ya6GAOEaR8MA51KnOiv8vGiDAdgnl QqEXLqh6XRWni+J5jB6TYm5U6SE/X26k40Zt0WUUjEkU1V9Fvwudc96qFXvcOu6Hx3NO Ui1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=f2OpeBCH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b5si12494910edq.1.2021.02.09.03.06.53; Tue, 09 Feb 2021 03:07:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=f2OpeBCH; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229984AbhBILFT (ORCPT + 99 others); Tue, 9 Feb 2021 06:05:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232133AbhBIK6y (ORCPT ); Tue, 9 Feb 2021 05:58:54 -0500 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0134CC061788; Tue, 9 Feb 2021 02:57:39 -0800 (PST) Received: by mail-qv1-xf2e.google.com with SMTP id f18so2291523qvm.9; Tue, 09 Feb 2021 02:57:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=skhiqf6XHdrL85W8XLfMMk82wIY2NH/2YVOEeXuwU+Y=; b=f2OpeBCHl+zFdH0iUc9cip0quELq/fMwsKCque7GtLZ86SCbDhvgt7NtMgHcTJn1cD JWPSSZNaBXiVcziAw2X3vtUwR2RL18ND+Ua9ks2gN5PT97XhjprWkpkJZGVjbGx0isaS 9OvX9T8F53Q6I4RZU6OWRByJGL6oi9956SD4BEL9846tU6FDt7PQb2DntVZr0Qqu1TQO lQdiLX2/H3VI50tRZIeNwDyBziHDqqoz/tui5MzaWTBBvTlLpgmPIH9VBA8jFaS26HDY 70RYPHdgWSNdZZePCR9bZurYF/iOxfl1kA9QM3v8aB+aF2lK7ObyTLAIrXWtJkm20eaG BQIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=skhiqf6XHdrL85W8XLfMMk82wIY2NH/2YVOEeXuwU+Y=; b=kqHzfGxAtvnOwoTSATXgaM5aSOwu6SB2kYH/DUYP4mHM36a5I+AVFdxphj9cNNcSWk Sss6nItE3z6KHNeuinOaFfcsxidV/ZfrcI4p0u9N1oM3SwFxiRXHZUL1kw1ZEo3/cJPH Q7fFOHzzf2JEaxVqC/BPLvMpA+cooqI/rQZE9oX8rfXBBryDliRtP2Y7OWdL51CKvR5+ BkEl7+Q5klfVCErwyBEByUJyWy+Gj8fgOm1JMdwG6KnG8PBA9UM5/4jkgw2cpA9m9BEk 0k5mxDLGh+62sJ+OzsF1FB+J3Lwys+c+pFVOFc3XHdxuoWsM4C3fY+ovIv2XOypc0K8l uIVw== X-Gm-Message-State: AOAM530cIMyr+P9LW27rBHQAhKyjeocXp+4f8QFf7p7rosfeRrqYTMsE 6HkGYx+e7Yg747VikHc8MSLdRGVcqQVoWWvukQ+ttGPmqkVbVQ== X-Received: by 2002:a05:6214:10e7:: with SMTP id q7mr13191326qvt.16.1612868258202; Tue, 09 Feb 2021 02:57:38 -0800 (PST) MIME-Version: 1.0 References: <1612785064-3072-1-git-send-email-orsonzhai@gmail.com> <1612785064-3072-2-git-send-email-orsonzhai@gmail.com> <20210209040855.GA25057@lenovo> In-Reply-To: <20210209040855.GA25057@lenovo> From: Baolin Wang Date: Tue, 9 Feb 2021 18:57:33 +0800 Message-ID: Subject: Re: [PATCH 2/3] mailbox: sprd: Add supplementary inbox support To: Baolin Wang , Rob Herring , Jassi Brar , Chunyan Zhang , Mark Brown , Devicetree List , LKML , Haidong Yao , Orson Zhai Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Feb 9, 2021 at 12:09 PM Orson Zhai wrote: > > On Mon, Feb 08, 2021 at 10:27:47PM +0800, Baolin Wang wrote: > > On Mon, Feb 8, 2021 at 7:52 PM Orson Zhai wrote: > > > > > > From: Orson Zhai > > > > > > Some sensors connected to Unisoc mailbox will send data very frequently. > > > This makes channel 0 very busy and the messages from other remote cores > > > not able to be handled as soon as possible. > > > > > > Then a supplementary inbox is added to the host core side for transferring > > > mass but not emergency messages from the remote cores, such as step > > > counting sensor, with an independent FIFO and interrupt. > > > > So this is another part of the mailbox hardware, containing a batch of > > hardware channels? > > No. Actually it is an inbox assigned to one of the remote cores before but > being exposed to host cpu core for now. > > > I did not see it before, its function is similar > > with inbox/outbox? > > Exactly same with any other channel. > But only the part of outbox is exposed to host side. Inbox part of this channel > is still kept for original remote core to use. > > It's a trick (un-documented) from our ASIC designers to resolve some special requirements. > I was also shocked when hearing it :) Understood :) > > I guess other vendors will add another mailbox module to resovle this, but our guys might > consider the hardware cost... OK. Thanks for your explanation. It will be helpful if you can add these backgroud into the comments in case someone else will be confusing again for the new supplementary inbox :) > > > > > > Signed-off-by: Orson Zhai > > > --- > > > drivers/mailbox/sprd-mailbox.c | 93 ++++++++++++++++++++++++++++++++++-------- > > > 1 file changed, 75 insertions(+), 18 deletions(-) > > > > > > diff --git a/drivers/mailbox/sprd-mailbox.c b/drivers/mailbox/sprd-mailbox.c > > > index e606f52..74648db 100644 > > > --- a/drivers/mailbox/sprd-mailbox.c > > > +++ b/drivers/mailbox/sprd-mailbox.c > > > @@ -11,6 +11,7 @@ > > > #include > > > #include > > > #include > > > +#include > > > #include > > > #include > > > > > > @@ -50,13 +51,17 @@ > > > #define SPRD_OUTBOX_FIFO_NOT_EMPTY_IRQ BIT(0) > > > #define SPRD_OUTBOX_FIFO_IRQ_MASK GENMASK(4, 0) > > > > > > +#define SPRD_OUTBOX_BASE_SPAN 0x1000 > > > #define SPRD_MBOX_CHAN_MAX 8 > > > +#define SPRD_SUPP_INBOX_ID_SC9860 6 > > > > > > struct sprd_mbox_priv { > > > struct mbox_controller mbox; > > > struct device *dev; > > > void __iomem *inbox_base; > > > void __iomem *outbox_base; > > > + /* Base register address for supplementary outbox */ > > > + void __iomem *supp_base; > > > struct clk *clk; > > > u32 outbox_fifo_depth; > > > > > > @@ -96,14 +101,13 @@ static u32 sprd_mbox_get_fifo_len(struct sprd_mbox_priv *priv, u32 fifo_sts) > > > return fifo_len; > > > } > > > > > > -static irqreturn_t sprd_mbox_outbox_isr(int irq, void *data) > > > +static inline irqreturn_t do_outbox_isr(void __iomem *base, struct sprd_mbox_priv *priv) > > > > No need to add an explicit 'inline' tag, the compiler can do the smart > > things than us. > > I thought it will help to increase perfermance of isr execution before. > > Will fix at next. > > > > > > { > > > - struct sprd_mbox_priv *priv = data; > > > struct mbox_chan *chan; > > > u32 fifo_sts, fifo_len, msg[2]; > > > int i, id; > > > > > > - fifo_sts = readl(priv->outbox_base + SPRD_MBOX_FIFO_STS); > > > + fifo_sts = readl(base + SPRD_MBOX_FIFO_STS); > > > > > > fifo_len = sprd_mbox_get_fifo_len(priv, fifo_sts); > > > if (!fifo_len) { > > > @@ -112,23 +116,41 @@ static irqreturn_t sprd_mbox_outbox_isr(int irq, void *data) > > > } > > > > > > for (i = 0; i < fifo_len; i++) { > > > - msg[0] = readl(priv->outbox_base + SPRD_MBOX_MSG_LOW); > > > - msg[1] = readl(priv->outbox_base + SPRD_MBOX_MSG_HIGH); > > > - id = readl(priv->outbox_base + SPRD_MBOX_ID); > > > + msg[0] = readl(base + SPRD_MBOX_MSG_LOW); > > > + msg[1] = readl(base + SPRD_MBOX_MSG_HIGH); > > > + id = readl(base + SPRD_MBOX_ID); > > > > > > chan = &priv->chan[id]; > > > - mbox_chan_received_data(chan, (void *)msg); > > > + if (chan->cl) > > > + mbox_chan_received_data(chan, (void *)msg); > > > + else > > > + dev_warn_ratelimited(priv->dev, > > > + "message's been dropped at ch[%d]\n", id); > > > > > > /* Trigger to update outbox FIFO pointer */ > > > - writel(0x1, priv->outbox_base + SPRD_MBOX_TRIGGER); > > > + writel(0x1, base + SPRD_MBOX_TRIGGER); > > > } > > > > > > /* Clear irq status after reading all message. */ > > > - writel(SPRD_MBOX_IRQ_CLR, priv->outbox_base + SPRD_MBOX_IRQ_STS); > > > + writel(SPRD_MBOX_IRQ_CLR, base + SPRD_MBOX_IRQ_STS); > > > > > > return IRQ_HANDLED; > > > } > > > > > > +static irqreturn_t sprd_mbox_outbox_isr(int irq, void *data) > > > +{ > > > + struct sprd_mbox_priv *priv = data; > > > + > > > + return do_outbox_isr(priv->outbox_base, priv); > > > +} > > > + > > > +static irqreturn_t sprd_mbox_supp_isr(int irq, void *data) > > > +{ > > > + struct sprd_mbox_priv *priv = data; > > > + > > > + return do_outbox_isr(priv->supp_base, priv); > > > +} > > > + > > > static irqreturn_t sprd_mbox_inbox_isr(int irq, void *data) > > > { > > > struct sprd_mbox_priv *priv = data; > > > @@ -231,6 +253,14 @@ static int sprd_mbox_startup(struct mbox_chan *chan) > > > val = readl(priv->outbox_base + SPRD_MBOX_IRQ_MSK); > > > val &= ~SPRD_OUTBOX_FIFO_NOT_EMPTY_IRQ; > > > writel(val, priv->outbox_base + SPRD_MBOX_IRQ_MSK); > > > + > > > + /* Enable supplementary outbox as the fundamental one */ > > > + if (priv->supp_base) { > > > + writel(0x0, priv->supp_base + SPRD_MBOX_FIFO_RST); > > > + val = readl(priv->supp_base + SPRD_MBOX_IRQ_MSK); > > > + val &= ~SPRD_OUTBOX_FIFO_NOT_EMPTY_IRQ; > > > + writel(val, priv->supp_base + SPRD_MBOX_IRQ_MSK); > > > + } > > > } > > > mutex_unlock(&priv->lock); > > > > > > @@ -246,6 +276,10 @@ static void sprd_mbox_shutdown(struct mbox_chan *chan) > > > /* Disable inbox & outbox interrupt */ > > > writel(SPRD_INBOX_FIFO_IRQ_MASK, priv->inbox_base + SPRD_MBOX_IRQ_MSK); > > > writel(SPRD_OUTBOX_FIFO_IRQ_MASK, priv->outbox_base + SPRD_MBOX_IRQ_MSK); > > > + > > > + if (priv->supp_base) > > > + writel(SPRD_OUTBOX_FIFO_IRQ_MASK, > > > + priv->supp_base + SPRD_MBOX_IRQ_MSK); > > > } > > > mutex_unlock(&priv->lock); > > > } > > > @@ -268,8 +302,8 @@ static int sprd_mbox_probe(struct platform_device *pdev) > > > { > > > struct device *dev = &pdev->dev; > > > struct sprd_mbox_priv *priv; > > > - int ret, inbox_irq, outbox_irq; > > > - unsigned long id; > > > + int ret, inbox_irq, outbox_irq, supp_irq; > > > + unsigned long id, supp; > > > > > > priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > > > if (!priv) > > > @@ -280,11 +314,15 @@ static int sprd_mbox_probe(struct platform_device *pdev) > > > mutex_init(&priv->lock); > > > > > > /* > > > - * The Spreadtrum mailbox uses an inbox to send messages to the target > > > - * core, and uses an outbox to receive messages from other cores. > > > + * Unisoc mailbox uses an inbox to send messages to the target > > > + * core, and uses (an) outbox(es) to receive messages from other > > > + * cores. > > > + * > > > + * Thus in general the mailbox controller supplies 2 different > > > + * register addresses and IRQ numbers for inbox and outbox. > > > * > > > - * Thus the mailbox controller supplies 2 different register addresses > > > - * and IRQ numbers for inbox and outbox. > > > + * If necessary, a supplementary inbox could be enabled optionally > > > + * with an independent FIFO and an extra interrupt. > > > */ > > > priv->inbox_base = devm_platform_ioremap_resource(pdev, 0); > > > if (IS_ERR(priv->inbox_base)) > > > @@ -310,7 +348,7 @@ static int sprd_mbox_probe(struct platform_device *pdev) > > > return ret; > > > } > > > > > > - inbox_irq = platform_get_irq(pdev, 0); > > > + inbox_irq = platform_get_irq_byname(pdev, "inbox"); > > > > I think you should put the dt changes before this patch. > > OK. > > Thanks, > Orson > > > > > if (inbox_irq < 0) > > > return inbox_irq; > > > > > > @@ -321,7 +359,7 @@ static int sprd_mbox_probe(struct platform_device *pdev) > > > return ret; > > > } > > > > > > - outbox_irq = platform_get_irq(pdev, 1); > > > + outbox_irq = platform_get_irq_byname(pdev, "outbox"); > > > if (outbox_irq < 0) > > > return outbox_irq; > > > > > > @@ -332,6 +370,24 @@ static int sprd_mbox_probe(struct platform_device *pdev) > > > return ret; > > > } > > > > > > + /* Supplementary outbox IRQ is optional */ > > > + supp_irq = platform_get_irq_byname(pdev, "supp-outbox"); > > > + if (supp_irq > 0) { > > > + ret = devm_request_irq(dev, supp_irq, sprd_mbox_supp_isr, > > > + IRQF_NO_SUSPEND, dev_name(dev), priv); > > > + if (ret) { > > > + dev_err(dev, "failed to request outbox IRQ: %d\n", ret); > > > + return ret; > > > + } > > > + > > > + supp = (unsigned long) of_device_get_match_data(dev); > > > + if (!supp) { > > > + dev_err(dev, "no supplementary outbox specified\n"); > > > + return -ENODEV; > > > + } > > > + priv->supp_base = priv->outbox_base + (SPRD_OUTBOX_BASE_SPAN * supp); > > > + } > > > + > > > /* Get the default outbox FIFO depth */ > > > priv->outbox_fifo_depth = > > > readl(priv->outbox_base + SPRD_MBOX_FIFO_DEPTH) + 1; > > > @@ -354,7 +410,8 @@ static int sprd_mbox_probe(struct platform_device *pdev) > > > } > > > > > > static const struct of_device_id sprd_mbox_of_match[] = { > > > - { .compatible = "sprd,sc9860-mailbox", }, > > > + { .compatible = "sprd,sc9860-mailbox", > > > + .data = (void *)SPRD_SUPP_INBOX_ID_SC9860 }, > > > { }, > > > }; > > > MODULE_DEVICE_TABLE(of, sprd_mbox_of_match); > > > -- > > > 2.7.4 > > > > > > > > > -- > > Baolin Wang -- Baolin Wang