From patchwork Wed May 24 10:16:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 100426 Delivered-To: patch@linaro.org Received: by 10.140.96.100 with SMTP id j91csp201687qge; Wed, 24 May 2017 03:17:08 -0700 (PDT) X-Received: by 10.99.119.137 with SMTP id s131mr37485816pgc.116.1495621028096; Wed, 24 May 2017 03:17:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495621028; cv=none; d=google.com; s=arc-20160816; b=z3OBAJ0rVTMm0XBFkeA9uP9LDCWcJLbl/XxYUxjTwc1/eko728i90IbICyTsElGlrb oXlsz8DEncRWLObzUCU+5EunQlhDJAEuZdt2QOi9vRgOma+NO4nGiDmYST8kbPpzc7iw /ZbGoFcRmDxEBHmekAq2V5BTF2WSaoABjCV+DS+Buqr2o0UPDreDuAVZ+XEkjqUMMS3b UEp0z3YtLT27OOrBrRDRdBRhre1xrlR6OwY9xDRnxU3AjcFmHA4fBOUNcbuqH5bW5CKu dSOnsn7vIiVU83RYyaltax0XE68KdhaNzPMLPdF3dtPWGV/Zah1Fsrwhi/gDbGIl8ftY PzLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=1ynMPdaWPwdE5NFEU6jIsyVocyFLM/yNUqzKGQJgb0I=; b=PoLwmp8NDLGdx/Nwv3IvY20rXZlvk5Kk4ZVGmyJbhpYcjPmAyDDyPqFszddA3tFXTH 17jXiewqJVrjIBDskfQGidlRbT5BS0DF4tR8ggaNubXVEttYjGGvtMjklNjo1hhsoIaN JsRi74WarJbYY7+mTpR/i+JdkClaM4ETCin3OQpAfb64Uo++6Coa+q/DbtfMvSyYoA1Z Wbc2UUhWKAAARKCMUKSDOpTbC+o9DT97RMu9s+H6FH0u168JZVR+QXJNeapKNJd0TWy1 ZzBB5XEPS4ZN7M3qT6fg2Z39430VUCaQVAksWUSClQJ7VodK99PUitwTQCAQ6EMCfA2g jDTA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m29si23728586pgc.78.2017.05.24.03.17.07; Wed, 24 May 2017 03:17:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965411AbdEXKRG (ORCPT + 7 others); Wed, 24 May 2017 06:17:06 -0400 Received: from foss.arm.com ([217.140.101.70]:35526 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936667AbdEXKRD (ORCPT ); Wed, 24 May 2017 06:17:03 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3DB1B2B; Wed, 24 May 2017 03:17:03 -0700 (PDT) Received: from e107155-lin.cambridge.arm.com (unknown [10.1.211.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 26F3D3F578; Wed, 24 May 2017 03:17:02 -0700 (PDT) From: Sudeep Holla To: linux-kernel@vger.kernel.org, Jassi Brar Cc: Sudeep Holla , devicetree@vger.kernel.org, Alexey Klimov , Jassi Brar Subject: [PATCH v2 3/6] mailbox: arm_mhu: migrate to threaded irq handler Date: Wed, 24 May 2017 11:16:40 +0100 Message-Id: <1495621003-4291-4-git-send-email-sudeep.holla@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495621003-4291-1-git-send-email-sudeep.holla@arm.com> References: <1495621003-4291-1-git-send-email-sudeep.holla@arm.com> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org In preparation to introduce support for doorbells which require the interrupt handlers to be threaded, this patch moves the existing interrupt handler to threaded handler. Also it moves out the registering and freeing of the handlers from the mailbox startup and shutdown methods. This also is required to support doorbells. Cc: Alexey Klimov Cc: Jassi Brar Signed-off-by: Sudeep Holla --- drivers/mailbox/arm_mhu.c | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/mailbox/arm_mhu.c b/drivers/mailbox/arm_mhu.c index be0f293a9457..ebe17c097f43 100644 --- a/drivers/mailbox/arm_mhu.c +++ b/drivers/mailbox/arm_mhu.c @@ -84,27 +84,15 @@ static int mhu_startup(struct mbox_chan *chan) { struct mhu_link *mlink = chan->con_priv; u32 val; - int ret; val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS); writel_relaxed(val, mlink->tx_reg + INTR_CLR_OFS); - ret = request_irq(mlink->irq, mhu_rx_interrupt, - IRQF_SHARED, "mhu_link", chan); - if (ret) { - dev_err(chan->mbox->dev, - "Unable to acquire IRQ %d\n", mlink->irq); - return ret; - } - return 0; } static void mhu_shutdown(struct mbox_chan *chan) { - struct mhu_link *mlink = chan->con_priv; - - free_irq(mlink->irq, chan); } static const struct mbox_chan_ops mhu_ops = { @@ -132,13 +120,6 @@ static int mhu_probe(struct amba_device *adev, const struct amba_id *id) return PTR_ERR(mhu->base); } - for (i = 0; i < MHU_CHANS; i++) { - mhu->chan[i].con_priv = &mhu->mlink[i]; - mhu->mlink[i].irq = adev->irq[i]; - mhu->mlink[i].rx_reg = mhu->base + mhu_reg[i]; - mhu->mlink[i].tx_reg = mhu->mlink[i].rx_reg + TX_REG_OFFSET; - } - mhu->mbox.dev = dev; mhu->mbox.chans = &mhu->chan[0]; mhu->mbox.num_chans = MHU_CHANS; @@ -155,6 +136,28 @@ static int mhu_probe(struct amba_device *adev, const struct amba_id *id) return err; } + for (i = 0; i < MHU_CHANS; i++) { + int irq = mhu->mlink[i].irq = adev->irq[i]; + + if (irq <= 0) { + dev_dbg(dev, "No IRQ found for Channel %d\n", i); + continue; + } + + mhu->chan[i].con_priv = &mhu->mlink[i]; + mhu->mlink[i].rx_reg = mhu->base + mhu_reg[i]; + mhu->mlink[i].tx_reg = mhu->mlink[i].rx_reg + TX_REG_OFFSET; + + err = devm_request_threaded_irq(dev, irq, NULL, + mhu_rx_interrupt, IRQF_ONESHOT, + "mhu_link", &mhu->chan[i]); + if (err) { + dev_err(dev, "Can't claim IRQ %d\n", irq); + mbox_controller_unregister(&mhu->mbox); + return err; + } + } + dev_info(dev, "ARM MHU Mailbox registered\n"); return 0; } From patchwork Wed May 24 10:16:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sudeep Holla X-Patchwork-Id: 100438 Delivered-To: patch@linaro.org Received: by 10.140.96.100 with SMTP id j91csp202485qge; Wed, 24 May 2017 03:19:26 -0700 (PDT) X-Received: by 10.98.207.132 with SMTP id b126mr36913221pfg.167.1495621166508; Wed, 24 May 2017 03:19:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495621166; cv=none; d=google.com; s=arc-20160816; b=HEVuVIeGm1DgPNdQdm8H1vcS5PzjV3aLJV/9JFLRS0LeqPs99Y2J3DmNYiQxhxCSK7 NocspokO5zFwryMzK4ohf1kCJn0cqwjeP641PrPeWssGwYNhV6rr5S0dQdamwj0Vq+P1 BmE2iDBUhsXP0tGnrE4vRpSQq36wCvWq8ASdXiwiCIZ2ajjKMVwwa/f0fylvUPw+Ccoo Am9s7N4sEBsdKT0/+cYN1u0aq6VZbwNow5Fq16JmvZuufRHLIGAd0gWys/oSbee7d1tY tggjPmDuwd87prCQRZOsxZv4YIz4g0qG40XVbXrGnbLm0zrlf2i2y7JdaojvErUxmH4H wFBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=PQYEzJCeoR8oDOUrwJcvxgo0rSaXB4l9KZl0rv/l+cw=; b=M2bkjVMufZ8LkMA2OgMH2zKzotBCe/UsdoTq25oSwvLTThkGTG7/AfC7vWt7gfGFA4 zKoH7QkZmfIRJnYaNSKu+6PCAn26zKvoSjWTjrs/ieyOxu+Cb2xkX3klsGfLAzpdipep DR78CSRVlhwADLur36LEEpVsJu+gjhep/pTi58MXIer037EgzwJKL55PFckEPRmsOOXH llijBGhr0abw+tJanEnJ/bwH3zbKopXYzd6WnaYXBbKLU+V4UYXgf+3uk+HswF7jYPEI jEdo9rjg4g8jRx3L0UjH5QtpUw058/5og3q7FD95SaWYI9LpPujTYs+G8lhBuDU0bwzW 2E1w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q72si24334015pfl.405.2017.05.24.03.19.26; Wed, 24 May 2017 03:19:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S939348AbdEXKTY (ORCPT + 7 others); Wed, 24 May 2017 06:19:24 -0400 Received: from foss.arm.com ([217.140.101.70]:35538 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966966AbdEXKRG (ORCPT ); Wed, 24 May 2017 06:17:06 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id ECBD52B; Wed, 24 May 2017 03:17:05 -0700 (PDT) Received: from e107155-lin.cambridge.arm.com (unknown [10.1.211.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D505A3F578; Wed, 24 May 2017 03:17:04 -0700 (PDT) From: Sudeep Holla To: linux-kernel@vger.kernel.org, Jassi Brar Cc: Sudeep Holla , devicetree@vger.kernel.org, Alexey Klimov , Jassi Brar Subject: [PATCH v2 5/6] mailbox: arm_mhu: add full support for the doorbells Date: Wed, 24 May 2017 11:16:42 +0100 Message-Id: <1495621003-4291-6-git-send-email-sudeep.holla@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495621003-4291-1-git-send-email-sudeep.holla@arm.com> References: <1495621003-4291-1-git-send-email-sudeep.holla@arm.com> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org We now have the basic infrastructure and binding to support doorbells on ARM MHU controller. This patch adds all the necessary mailbox operations to add support for the doorbells. Maximum of 32 doorbells are supported on each physical channel, however the total number of doorbells is restricted to 20 in order to save memory. It can increased if required in future. Cc: Alexey Klimov Cc: Jassi Brar Signed-off-by: Sudeep Holla --- drivers/mailbox/arm_mhu.c | 136 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 6 deletions(-) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/mailbox/arm_mhu.c b/drivers/mailbox/arm_mhu.c index ae06924eb6f4..79d2392d7f3b 100644 --- a/drivers/mailbox/arm_mhu.c +++ b/drivers/mailbox/arm_mhu.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -94,6 +95,14 @@ mhu_mbox_to_channel(struct mbox_controller *mbox, return NULL; } +static void mhu_mbox_clear_irq(struct mbox_chan *chan) +{ + struct mhu_channel *chan_info = chan->con_priv; + void __iomem *base = chan_info->mhu->mlink[chan_info->pchan].rx_reg; + + writel_relaxed(BIT(chan_info->doorbell), base + INTR_CLR_OFS); +} + static unsigned int mhu_mbox_irq_to_pchan_num(struct arm_mhu *mhu, int irq) { unsigned int pchan; @@ -105,6 +114,95 @@ static unsigned int mhu_mbox_irq_to_pchan_num(struct arm_mhu *mhu, int irq) return pchan; } +static struct mbox_chan *mhu_mbox_irq_to_channel(struct arm_mhu *mhu, + unsigned int pchan) +{ + unsigned long bits; + unsigned int doorbell; + struct mbox_chan *chan = NULL; + struct mbox_controller *mbox = &mhu->mbox; + void __iomem *base = mhu->mlink[pchan].rx_reg; + + bits = readl_relaxed(base + INTR_STAT_OFS); + if (!bits) + /* No IRQs fired in specified physical channel */ + return NULL; + + /* An IRQ has fired, find the associated channel */ + for (doorbell = 0; bits; doorbell++) { + if (!test_and_clear_bit(doorbell, &bits)) + continue; + + chan = mhu_mbox_to_channel(mbox, pchan, doorbell); + if (chan) + break; + } + + return chan; +} + +static irqreturn_t mhu_mbox_thread_handler(int irq, void *data) +{ + struct mbox_chan *chan; + struct arm_mhu *mhu = data; + unsigned int pchan = mhu_mbox_irq_to_pchan_num(mhu, irq); + + while (NULL != (chan = mhu_mbox_irq_to_channel(mhu, pchan))) { + mbox_chan_received_data(chan, NULL); + mhu_mbox_clear_irq(chan); + } + + return IRQ_HANDLED; +} + +static bool mhu_doorbell_last_tx_done(struct mbox_chan *chan) +{ + struct mhu_channel *chan_info = chan->con_priv; + void __iomem *base = chan_info->mhu->mlink[chan_info->pchan].tx_reg; + + if (readl_relaxed(base + INTR_STAT_OFS) & BIT(chan_info->doorbell)) + return false; + + return true; +} + +static int mhu_doorbell_send_data(struct mbox_chan *chan, void *data) +{ + struct mhu_channel *chan_info = chan->con_priv; + void __iomem *base = chan_info->mhu->mlink[chan_info->pchan].tx_reg; + + /* Send event to co-processor */ + writel_relaxed(BIT(chan_info->doorbell), base + INTR_SET_OFS); + + return 0; +} + +static int mhu_doorbell_startup(struct mbox_chan *chan) +{ + mhu_mbox_clear_irq(chan); + return 0; +} + +static void mhu_doorbell_shutdown(struct mbox_chan *chan) +{ + struct mhu_channel *chan_info = chan->con_priv; + struct mbox_controller *mbox = &chan_info->mhu->mbox; + int i; + + for (i = 0; i < mbox->num_chans; i++) + if (chan == &mbox->chans[i]) + break; + + if (mbox->num_chans == i) { + dev_warn(mbox->dev, "Request to free non-existent channel\n"); + return; + } + + /* Reset channel */ + mhu_mbox_clear_irq(chan); + chan->con_priv = NULL; +} + static struct mbox_chan *mhu_mbox_xlate(struct mbox_controller *mbox, const struct of_phandle_args *spec) { @@ -227,15 +325,34 @@ static const struct mbox_chan_ops mhu_ops = { .last_tx_done = mhu_last_tx_done, }; +static const struct mbox_chan_ops mhu_doorbell_ops = { + .send_data = mhu_doorbell_send_data, + .startup = mhu_doorbell_startup, + .shutdown = mhu_doorbell_shutdown, + .last_tx_done = mhu_doorbell_last_tx_done, +}; + static const struct mhu_mbox_pdata arm_mhu_pdata = { .num_pchans = 3, .num_doorbells = 1, .support_doorbells = false, }; +static const struct mhu_mbox_pdata arm_mhu_doorbell_pdata = { + .num_pchans = 2, /* Secure can't be used */ + .num_doorbells = 32, + .support_doorbells = true, +}; + static const struct of_device_id mhu_mbox_match[] = { - { .compatible = "arm,mhu", .data = (void *)&arm_mhu_pdata }, - {} + { + .compatible = "arm,mhu", + .data = (void *)&arm_mhu_pdata + }, { + .compatible = "arm,mhu-doorbell", + .data = (void *)&arm_mhu_doorbell_pdata + }, { + } }; MODULE_DEVICE_TABLE(of, mhu_mbox_match); @@ -243,6 +360,7 @@ MODULE_DEVICE_TABLE(of, mhu_mbox_match); static int mhu_probe(struct amba_device *adev, const struct amba_id *id) { int i, err, max_chans; + irq_handler_t handler; struct arm_mhu *mhu; struct mbox_chan *chans; struct mhu_mbox_pdata *pdata; @@ -287,7 +405,6 @@ static int mhu_probe(struct amba_device *adev, const struct amba_id *id) mhu->mbox.dev = dev; mhu->mbox.chans = chans; mhu->mbox.num_chans = max_chans; - mhu->mbox.ops = &mhu_ops; mhu->mbox.txdone_irq = false; mhu->mbox.txdone_poll = true; mhu->mbox.txpoll_period = 1; @@ -295,6 +412,14 @@ static int mhu_probe(struct amba_device *adev, const struct amba_id *id) mhu->mbox.of_xlate = mhu_mbox_xlate; amba_set_drvdata(adev, mhu); + if (pdata->support_doorbells) { + mhu->mbox.ops = &mhu_doorbell_ops; + handler = mhu_mbox_thread_handler; + } else { + mhu->mbox.ops = &mhu_ops; + handler = mhu_rx_interrupt; + } + err = mbox_controller_register(&mhu->mbox); if (err) { dev_err(dev, "Failed to register mailboxes %d\n", err); @@ -312,9 +437,8 @@ static int mhu_probe(struct amba_device *adev, const struct amba_id *id) mhu->mlink[i].rx_reg = mhu->base + mhu_reg[i]; mhu->mlink[i].tx_reg = mhu->mlink[i].rx_reg + TX_REG_OFFSET; - err = devm_request_threaded_irq(dev, irq, NULL, - mhu_rx_interrupt, IRQF_ONESHOT, - "mhu_link", mhu); + err = devm_request_threaded_irq(dev, irq, NULL, handler, + IRQF_ONESHOT, "mhu_link", mhu); if (err) { dev_err(dev, "Can't claim IRQ %d\n", irq); mbox_controller_unregister(&mhu->mbox);