Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933807AbcKDVp7 (ORCPT ); Fri, 4 Nov 2016 17:45:59 -0400 Received: from mail-db5eur01on0043.outbound.protection.outlook.com ([104.47.2.43]:60612 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933584AbcKDVp4 (ORCPT ); Fri, 4 Nov 2016 17:45:56 -0400 From: Ruxandra Ioana Radulescu To: Stuart Yoder , "gregkh@linuxfoundation.org" CC: German Rivera , "devel@driverdev.osuosl.org" , "linux-kernel@vger.kernel.org" , "agraf@suse.de" , "arnd@arndb.de" , Leo Li , Roy Pledge , Haiying Wang , Stuart Yoder Subject: RE: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver Thread-Topic: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver Thread-Index: AQHSK6SUAF2ytlfJTECvWCh2Z1kO06DHaH8ggAGa7YA= Date: Fri, 4 Nov 2016 15:11:19 +0000 Message-ID: References: <1477058509-12547-1-git-send-email-stuart.yoder@nxp.com> <1477058509-12547-9-git-send-email-stuart.yoder@nxp.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=ruxandra.radulescu@nxp.com; x-originating-ip: [192.88.146.1] x-ms-office365-filtering-correlation-id: 2425a089-6d51-48a4-8f50-08d404c4d4d7 x-microsoft-exchange-diagnostics: 1;VI1PR0401MB2637;7:X749aWGPhH774vmSkBIY+yq75vjOaopi7OTQxSePhEtCexhtNR095/Dez6TXEA8avCwIZ9ncO5tu3t5uGswYIi96NLJWEEwithKNd5Yph3LNJRY9r3oQkwYv8gVIA/H8mFYNbXMGcEQDsmMzoGirr9NTFVSwxLiKcOJ0ZuWG/+6fLt9luakg0D2VBvbahLdx6ivK2kUwIjiPhu5ChYI1w8p/VhFEQiW3eLbWOh4r2nTLDwJcwcJ9YIk2IW/lxWorRcet/h8NK1noBmOQ0foLp6gPo+nSIKjLrAW2iheluM66Wg8sBYhhVTEM+zLUlgfcml5ytlU76ESgvrBIf9EumGSCmyWRMPlmXk/li2fHFyk= x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0401MB2637; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(9452136761055)(185117386973197)(275809806118684); x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(6045074)(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6046074)(6072074);SRVR:VI1PR0401MB2637;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0401MB2637; x-forefront-prvs: 01165471DB x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(6009001)(7916002)(377454003)(199003)(13464003)(189002)(4326007)(105586002)(122556002)(54356999)(86362001)(5001770100001)(76176999)(66066001)(68736007)(97736004)(101416001)(106356001)(106116001)(50986999)(3660700001)(3280700002)(74316002)(92566002)(2900100001)(7736002)(3900700001)(305945005)(7846002)(2501003)(9686002)(33656002)(2950100002)(5660300001)(5002640100001)(11100500001)(7696004)(10400500002)(3846002)(6116002)(19580395003)(81156014)(8936002)(81166006)(77096005)(87936001)(102836003)(8676002)(586003)(2906002)(189998001)(19580405001)(76576001)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR0401MB2637;H:VI1PR0402MB2847.eurprd04.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Nov 2016 15:11:19.3917 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0401MB2637 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id uA4Lk5md023963 Content-Length: 7622 Lines: 235 > -----Original Message----- > From: Stuart Yoder > Sent: Thursday, November 03, 2016 4:38 PM > To: Ruxandra Ioana Radulescu > Subject: FW: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object > driver > > > > -----Original Message----- > From: Stuart Yoder [mailto:stuart.yoder@nxp.com] > Sent: Friday, October 21, 2016 9:02 AM > To: gregkh@linuxfoundation.org > Cc: German Rivera ; devel@driverdev.osuosl.org; > linux-kernel@vger.kernel.org; agraf@suse.de; arnd@arndb.de; Leo Li > ; Roy Pledge ; Haiying Wang > ; Stuart Yoder > Subject: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver > > From: Roy Pledge > > The DPIO driver registers with the fsl-mc bus to handle bus-related > events for DPIO objects. Key responsibility is mapping I/O > regions, setting up interrupt handlers, and calling the DPIO > service initialization during probe. > > Signed-off-by: Roy Pledge > Signed-off-by: Haiying Wang > Signed-off-by: Stuart Yoder > --- > drivers/bus/fsl-mc/dpio/Makefile | 2 +- > drivers/bus/fsl-mc/dpio/dpio-driver.c | 289 > ++++++++++++++++++++++++++++++++++ > 2 files changed, 290 insertions(+), 1 deletion(-) > create mode 100644 drivers/bus/fsl-mc/dpio/dpio-driver.c > > diff --git a/drivers/bus/fsl-mc/dpio/Makefile b/drivers/bus/fsl- > mc/dpio/Makefile > index 0778da7..837d330 100644 > --- a/drivers/bus/fsl-mc/dpio/Makefile > +++ b/drivers/bus/fsl-mc/dpio/Makefile > @@ -6,4 +6,4 @@ subdir-ccflags-y := -Werror > > obj-$(CONFIG_FSL_MC_DPIO) += fsl-mc-dpio.o > > -fsl-mc-dpio-objs := dpio.o qbman-portal.o dpio-service.o > +fsl-mc-dpio-objs := dpio.o qbman-portal.o dpio-service.o dpio-driver.o > diff --git a/drivers/bus/fsl-mc/dpio/dpio-driver.c b/drivers/bus/fsl- > mc/dpio/dpio-driver.c > new file mode 100644 > index 0000000..ad04a2c > --- /dev/null > +++ b/drivers/bus/fsl-mc/dpio/dpio-driver.c > @@ -0,0 +1,289 @@ > +/* > + * Copyright 2014-2016 Freescale Semiconductor Inc. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions are > met: > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the > distribution. > + * * Neither the name of Freescale Semiconductor nor the > + * names of its contributors may be used to endorse or promote > products > + * derived from this software without specific prior written permission. > + * > + * ALTERNATIVELY, this software may be distributed under the terms of the > + * GNU General Public License ("GPL") as published by the Free Software > + * Foundation, either version 2 of that License or (at your option) any > + * later version. > + * > + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND > ANY > + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, > THE IMPLIED > + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR > PURPOSE ARE > + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR > ANY > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL DAMAGES > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF > THE USE OF THIS > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +#include "qbman-portal.h" > +#include "dpio.h" > +#include "dpio-cmd.h" > + > +MODULE_LICENSE("Dual BSD/GPL"); > +MODULE_AUTHOR("Freescale Semiconductor, Inc"); > +MODULE_DESCRIPTION("DPIO Driver"); > + > +struct dpio_priv { > + struct dpaa2_io *io; > +}; > + > +static irqreturn_t dpio_irq_handler(int irq_num, void *arg) > +{ > + struct device *dev = (struct device *)arg; > + struct dpio_priv *priv = dev_get_drvdata(dev); > + > + return dpaa2_io_irq(priv->io); > +} > + > +static void unregister_dpio_irq_handlers(struct fsl_mc_device *dpio_dev) > +{ > + struct fsl_mc_device_irq *irq; > + > + irq = dpio_dev->irqs[0]; > + > + /* clear the affinity hint */ > + irq_set_affinity_hint(irq->msi_desc->irq, NULL); > +} > + > +static int register_dpio_irq_handlers(struct fsl_mc_device *dpio_dev, int > cpu) > +{ > + struct dpio_priv *priv; > + int error; > + struct fsl_mc_device_irq *irq; > + cpumask_t mask; > + > + priv = dev_get_drvdata(&dpio_dev->dev); > + > + irq = dpio_dev->irqs[0]; > + error = devm_request_irq(&dpio_dev->dev, > + irq->msi_desc->irq, > + dpio_irq_handler, > + 0, > + dev_name(&dpio_dev->dev), > + &dpio_dev->dev); > + if (error < 0) { > + dev_err(&dpio_dev->dev, > + "devm_request_irq() failed: %d\n", > + error); > + return error; > + } > + > + /* set the affinity hint */ > + cpumask_clear(&mask); > + cpumask_set_cpu(cpu, &mask); > + if (irq_set_affinity_hint(irq->msi_desc->irq, &mask)) > + dev_err(&dpio_dev->dev, > + "irq_set_affinity failed irq %d cpu %d\n", > + irq->msi_desc->irq, cpu); > + > + return 0; > +} > + > +static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev) > +{ > + struct dpio_attr dpio_attrs; > + struct dpaa2_io_desc desc; > + struct dpio_priv *priv; > + int err = -ENOMEM; > + struct device *dev = &dpio_dev->dev; > + static int next_cpu = -1; > + > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + goto err_priv_alloc; > + > + dev_set_drvdata(dev, priv); > + > + err = fsl_mc_portal_allocate(dpio_dev, 0, &dpio_dev->mc_io); > + if (err) { > + dev_dbg(dev, "MC portal allocation failed\n"); > + err = -EPROBE_DEFER; > + goto err_mcportal; > + } > + > + err = dpio_open(dpio_dev->mc_io, 0, dpio_dev->obj_desc.id, > + &dpio_dev->mc_handle); > + if (err) { > + dev_err(dev, "dpio_open() failed\n"); > + goto err_open; > + } > + > + err = dpio_get_attributes(dpio_dev->mc_io, 0, dpio_dev- > >mc_handle, > + &dpio_attrs); > + if (err) { > + dev_err(dev, "dpio_get_attributes() failed %d\n", err); > + goto err_get_attr; > + } > + desc.qman_version = dpio_attrs.qbman_version; > + > + err = dpio_enable(dpio_dev->mc_io, 0, dpio_dev->mc_handle); > + if (err) { > + dev_err(dev, "dpio_enable() failed %d\n", err); > + goto err_get_attr; > + } > + > + /* initialize DPIO descriptor */ > + desc.receives_notifications = dpio_attrs.num_priorities ? 1 : 0; > + desc.has_8prio = dpio_attrs.num_priorities == 8 ? 1 : 0; > + desc.dpio_id = dpio_dev->obj_desc.id; > + > + /* get the cpu to use for the affinity hint */ > + if (next_cpu == -1) > + next_cpu = cpumask_first(cpu_online_mask); > + else > + next_cpu = cpumask_next(next_cpu, cpu_online_mask); > + desc.cpu = next_cpu; What happens if there's more DPIOs than cores and cpumask_next returns nr_cpu_ids? Thanks, Ioana