From patchwork Fri Sep 18 22:15:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jim Quinlan X-Patchwork-Id: 11786515 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 47B2C92C for ; Fri, 18 Sep 2020 22:15:59 +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 07444208B8 for ; Fri, 18 Sep 2020 22:15:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="erDCbAJp"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="P2lB7iWY" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 07444208B8 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.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-Type:MIME-Version: Cc:List-Subscribe:List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: References:In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=XwyXr4RFC8Q5lpoEqZBJjD/X9vPi0zglt+ivNhwGmIw=; b=erDCbAJpZdRITKvxZrpjqAsVE //ObzKn3QVnsbV5Dqp0hIxga725irqBOKO+jmEuG64oTc9wRyITtacbsHevopc2tAWc3gRIUqYw9m QdvfZOJBMnRsUDpKLs53G1XoJst33Gsbq7cOEQTmmALeknsJ82c/0iY3ybDE5HDUbDWVxEX+XfLD/ 1dui/ns0ATyZapG1wGFEYCHwkJvc8YpbE0ufvEbK3mDTK2J06NLRQbcGrHQIk8a4h/X7sCRJpebMA mWgadLK/ZJvsLtnAdNlbGs0vVeCYdGzH6AT8fR+Id09ygE4gp6hFVnIHt8ljwLZxtgBiElBO5Aue4 dSNJu6hKQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kJOfS-00027A-Ey; Fri, 18 Sep 2020 22:15:46 +0000 Received: from mail-pj1-x1041.google.com ([2607:f8b0:4864:20::1041]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kJOfI-00023w-Tk for linux-arm-kernel@lists.infradead.org; Fri, 18 Sep 2020 22:15:38 +0000 Received: by mail-pj1-x1041.google.com with SMTP id gf14so3712686pjb.5 for ; Fri, 18 Sep 2020 15:15:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DWa7SYXAmSKoHN/pGI3q6DRejghqz5ob83Bxq30MnGw=; b=P2lB7iWYm9yGJMYOdrhm1trfMwUOW/UvrVvNzDlyPXdYCT0qxMNbMXpBl5mtt0tIYD QUrGkLEhl4BdJGBYyZJ2mgPwlHC8NvclL2aV0tZLEWqCm4CFHRNy3BE6x4OtUDSljFqQ 7jsyfqNz/6yTxDWqs31f04bj2y4jVV6rEnUVw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DWa7SYXAmSKoHN/pGI3q6DRejghqz5ob83Bxq30MnGw=; b=LcaQ08H3SSWXerJnqZ+Wzh3PSu96zXfGgjIqBf4y4wOfXk5XM18VWTKOBb2LvKasBz lRpeABpJMMNwHFYe0/zJm6MwAz49nTnKYIOzgb4waxV0lJhU0apGZBs5tAFHbQFMLciy CScf2weHuT1ThuoMqf806fPPQAyQLPiTaDxt2+T5E6lwVDNBioE4oMb7ghSUtxX6R1j3 TUtlNwec7t0bkK4QVHH1L7tAUeP+DHYtgk66A/L6+YK7J9EQLHIkXu59d9aZIPBf7cpE 3J3g/dMzkvoqPQ7C+BU29C9oPah6zaAIfWe7ZhiW+yAntob8IftNycKwJEbOCARDRJ2y KOMA== X-Gm-Message-State: AOAM531/BTLMqLoUUjltVRytwVd3LhLMAbENd0b3KMJ3HjcJy0RseqH3 dLjysNISpUvwnmUG+yQqAqBMiQ== X-Google-Smtp-Source: ABdhPJzZyPSsZzJRv9rYVo7kdm9wZodrGneH1JhDs+L7UviABtABDlVA09cLfeIiENDPv5Z70Mv0NQ== X-Received: by 2002:a17:902:9695:b029:d1:e598:4007 with SMTP id n21-20020a1709029695b02900d1e5984007mr17456998plp.65.1600467334910; Fri, 18 Sep 2020 15:15:34 -0700 (PDT) Received: from stbsrv-and-01.and.broadcom.net ([192.19.231.250]) by smtp.gmail.com with ESMTPSA id h12sm4224618pfo.68.2020.09.18.15.15.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2020 15:15:34 -0700 (PDT) From: Jim Quinlan To: bcm-kernel-feedback-list@broadcom.com, james.quinlan@broadcom.com Subject: [PATCH v2 2/2] mailbox: Add Broadcom STB mailbox driver Date: Fri, 18 Sep 2020 18:15:15 -0400 Message-Id: <20200918221520.21999-3-james.quinlan@broadcom.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200918221520.21999-1-james.quinlan@broadcom.com> References: <20200918221520.21999-1-james.quinlan@broadcom.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200918_181537_205357_18795BAB X-CRM114-Status: GOOD ( 23.89 ) X-Spam-Score: -3.1 (---) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-3.1 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:1041 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 T_TVD_MIME_NO_HEADERS BODY: No description available. 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 MIME_HEADER_CTYPE_ONLY 'Content-Type' found without required MIME headers -3.0 DKIMWL_WL_HIGH DKIMwl.org - Whitelisted High sender 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: Jassi Brar , Florian Fainelli , open list , "moderated list:BROADCOM BCM7XXX ARM ARCHITECTURE" MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org This is a simple mailbox driver to be used by the SCMI protocol stack. It only implements the agent-to-platform channel; we may implement the platform-to-agent channel in the future. An unusual aspect of this driver is how the completion of an SCMI message is indicated. An SCMI message is initiated with an ARM SMC call, but the return of this call does not indicate the execution or completion of the message. Rather, the message's completion is signaled by an interrupt. Signed-off-by: Jim Quinlan Signed-off-by: Florian Fainelli --- drivers/mailbox/Kconfig | 12 +++ drivers/mailbox/Makefile | 2 + drivers/mailbox/brcmstb-mailbox.c | 173 ++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 drivers/mailbox/brcmstb-mailbox.c diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig index 05b1009e2820..378ebd5a7933 100644 --- a/drivers/mailbox/Kconfig +++ b/drivers/mailbox/Kconfig @@ -254,4 +254,16 @@ config QCOM_IPCC acts as an interrupt controller for receiving interrupts from clients. Say Y here if you want to build this driver. +config BRCMSTB_MBOX + tristate "Broadcom STB Mailbox" + depends on ARM64 || ARM + depends on ARM_SCMI_PROTOCOL && ARCH_BRCMSTB + default ARM_SCMI_PROTOCOL && ARCH_BRCMSTB + help + Mailbox implementation of the Broadcom STB for the sole purposes + of SCMI communication. This is used by the SCMI drivers to + communicate with FW that runs in EL3. This mailbox only implements + the agent-to-platform channgel of SCMI but may be augmented in + the future to add the platform-to-agent channel. + endif diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile index 60d224b723a1..a74efd02eece 100644 --- a/drivers/mailbox/Makefile +++ b/drivers/mailbox/Makefile @@ -54,3 +54,5 @@ obj-$(CONFIG_SUN6I_MSGBOX) += sun6i-msgbox.o obj-$(CONFIG_SPRD_MBOX) += sprd-mailbox.o obj-$(CONFIG_QCOM_IPCC) += qcom-ipcc.o + +obj-$(CONFIG_BRCMSTB_MBOX) += brcmstb-mailbox.o diff --git a/drivers/mailbox/brcmstb-mailbox.c b/drivers/mailbox/brcmstb-mailbox.c new file mode 100644 index 000000000000..27d87938b08c --- /dev/null +++ b/drivers/mailbox/brcmstb-mailbox.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2017, Broadcom */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM) +#include +#endif + +#define BRCM_SCMI_SMC_OEM_FUNC 0x400 +#define BRCM_SCMI_MBOX_NUM 0 +#define BRCM_FID(ch) ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ + IS_ENABLED(CONFIG_ARM64), \ + ARM_SMCCC_OWNER_OEM, \ + BRCM_SCMI_SMC_OEM_FUNC + (ch)) +enum { + A2P_CHAN = 0, + NUM_CHAN +}; + +struct chan_priv { + unsigned int mbox_num; + unsigned int ch; +}; + +struct brcm_mbox { + struct mbox_controller controller; + int irqs[NUM_CHAN]; +}; + +static struct mbox_chan *brcm_mbox_of_xlate(struct mbox_controller *controller, + const struct of_phandle_args *sp) +{ + unsigned int ch = sp->args[0]; + struct brcm_mbox *mbox + = container_of(controller, struct brcm_mbox, controller); + + if (!mbox || ch >= NUM_CHAN) + return ERR_PTR(-ENOENT); + + return &mbox->controller.chans[ch]; +} + +#if defined(CONFIG_ARM64) || defined(CONFIG_ARM) +static int announce_msg(unsigned int mbox_num, unsigned int ch) +{ + struct arm_smccc_res res; + + if (ch >= NUM_CHAN) + return -EIO; + arm_smccc_smc(BRCM_FID(ch), mbox_num, 0, 0, 0, 0, 0, 0, &res); + if (res.a0) + return -EIO; + return 0; +} +#else +#error Func announce_msg() not defined for the current ARCH +#endif + +static int brcm_mbox_send_data(struct mbox_chan *chan, void *data) +{ + struct chan_priv *priv = chan->con_priv; + + return announce_msg(priv->mbox_num, priv->ch); +} + +static int brcm_mbox_startup(struct mbox_chan *chan) +{ + return 0; +} + +static const struct mbox_chan_ops brcm_mbox_ops = { + .send_data = brcm_mbox_send_data, + .startup = brcm_mbox_startup, +}; + +static irqreturn_t brcm_a2p_isr(int irq, void *data) +{ + struct mbox_chan *chan = data; + + mbox_chan_received_data(chan, NULL); + return IRQ_HANDLED; +} + +static int brcm_mbox_probe(struct platform_device *pdev) +{ + struct brcm_mbox *mbox; + struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node; + struct chan_priv *chan_priv; + int ret; + + if (!np) + return -EINVAL; + + mbox = devm_kzalloc(&pdev->dev, sizeof(*mbox), GFP_KERNEL); + if (!mbox) + return -ENOMEM; + + /* Allocate channels */ + mbox->controller.chans = devm_kzalloc( + &pdev->dev, NUM_CHAN * sizeof(struct mbox_chan), GFP_KERNEL); + if (!mbox->controller.chans) + return -ENOMEM; + chan_priv = devm_kzalloc( + &pdev->dev, NUM_CHAN * sizeof(struct chan_priv), GFP_KERNEL); + if (!chan_priv) + return -ENOMEM; + + mbox->irqs[A2P_CHAN] = platform_get_irq(pdev, 0); + ret = devm_request_irq(&pdev->dev, mbox->irqs[A2P_CHAN], brcm_a2p_isr, + IRQF_NO_SUSPEND, "brcm: SCMI a2p intr", + &mbox->controller.chans[A2P_CHAN]); + if (ret) { + dev_err(&pdev->dev, "failed to setup SCMI a2p isr\n"); + return ret; + } + chan_priv[A2P_CHAN].mbox_num = BRCM_SCMI_MBOX_NUM; + chan_priv[A2P_CHAN].ch = A2P_CHAN; + mbox->controller.chans[A2P_CHAN].con_priv = &chan_priv[A2P_CHAN]; + mbox->controller.num_chans++; + mbox->controller.dev = &pdev->dev; + mbox->controller.ops = &brcm_mbox_ops; + mbox->controller.of_xlate = brcm_mbox_of_xlate; + ret = mbox_controller_register(&mbox->controller); + if (ret) { + dev_err(dev, "failed to register BrcmSTB mbox\n"); + return ret; + } + + platform_set_drvdata(pdev, mbox); + return 0; +} + +static int brcm_mbox_remove(struct platform_device *pdev) +{ + struct brcm_mbox *mbox = platform_get_drvdata(pdev); + + mbox_controller_unregister(&mbox->controller); + + return 0; +} + +static const struct of_device_id brcm_mbox_of_match[] = { + { .compatible = "brcm,brcmstb-mbox", }, + {} +}; +MODULE_DEVICE_TABLE(of, brcm_mbox_of_match); + +static struct platform_driver brcm_mbox_driver = { + .probe = brcm_mbox_probe, + .remove = brcm_mbox_remove, + .driver = { + .name = "brcm_mbox", + .of_match_table = brcm_mbox_of_match, + }, +}; + +module_platform_driver(brcm_mbox_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Broadcom STB SCMI Mailbox driver"); +MODULE_AUTHOR("Broadcom");