Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1515443 > unrolled thread
| Started by | Ruxandra Ioana Radulescu <ruxandra.radulescu@nxp.com> |
|---|---|
| First post | 2016-11-04 22:50 +0100 |
| Last post | 2016-11-10 01:40 +0100 |
| Articles | 2 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
RE: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver Ruxandra Ioana Radulescu <ruxandra.radulescu@nxp.com> - 2016-11-04 22:50 +0100
RE: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver Stuart Yoder <stuart.yoder@nxp.com> - 2016-11-10 01:40 +0100
| From | Ruxandra Ioana Radulescu <ruxandra.radulescu@nxp.com> |
|---|---|
| Date | 2016-11-04 22:50 +0100 |
| Subject | RE: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver |
| Message-ID | <szUx3-7cG-15@gated-at.bofh.it> |
> -----Original Message-----
> From: Stuart Yoder
> Sent: Thursday, November 03, 2016 4:38 PM
> To: Ruxandra Ioana Radulescu <ruxandra.radulescu@nxp.com>
> 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 <german.rivera@nxp.com>; devel@driverdev.osuosl.org;
> linux-kernel@vger.kernel.org; agraf@suse.de; arnd@arndb.de; Leo Li
> <leoyang.li@nxp.com>; Roy Pledge <roy.pledge@nxp.com>; Haiying Wang
> <haiying.wang@nxp.com>; Stuart Yoder <stuart.yoder@nxp.com>
> Subject: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver
>
> From: Roy Pledge <roy.pledge@nxp.com>
>
> 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 <roy.pledge@nxp.com>
> Signed-off-by: Haiying Wang <haiying.wang@nxp.com>
> Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
> ---
> 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 <linux/types.h>
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/interrupt.h>
> +#include <linux/msi.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/delay.h>
> +
> +#include <linux/fsl/mc.h>
> +#include <linux/fsl/dpaa2-io.h>
> +
> +#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
[toc] | [next] | [standalone]
| From | Stuart Yoder <stuart.yoder@nxp.com> |
|---|---|
| Date | 2016-11-10 01:40 +0100 |
| Message-ID | <sBLzj-6wR-11@gated-at.bofh.it> |
| In reply to | #1515443 |
> -----Original Message-----
> From: Ruxandra Ioana Radulescu
> Sent: Friday, November 04, 2016 10:11 AM
> To: Stuart Yoder <stuart.yoder@nxp.com>; gregkh@linuxfoundation.org
> Cc: German Rivera <german.rivera@nxp.com>; devel@driverdev.osuosl.org; linux-kernel@vger.kernel.org;
> agraf@suse.de; arnd@arndb.de; Leo Li <leoyang.li@nxp.com>; Roy Pledge <roy.pledge@nxp.com>; Haiying Wang
> <haiying.wang@nxp.com>; Stuart Yoder <stuart.yoder@nxp.com>
> Subject: RE: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver
>
> > -----Original Message-----
> > From: Stuart Yoder
> > Sent: Thursday, November 03, 2016 4:38 PM
> > To: Ruxandra Ioana Radulescu <ruxandra.radulescu@nxp.com>
> > 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 <german.rivera@nxp.com>; devel@driverdev.osuosl.org;
> > linux-kernel@vger.kernel.org; agraf@suse.de; arnd@arndb.de; Leo Li
> > <leoyang.li@nxp.com>; Roy Pledge <roy.pledge@nxp.com>; Haiying Wang
> > <haiying.wang@nxp.com>; Stuart Yoder <stuart.yoder@nxp.com>
> > Subject: [PATCH 8/9] bus: fsl-mc: dpio: add the DPAA2 DPIO object driver
> >
> > From: Roy Pledge <roy.pledge@nxp.com>
> >
> > 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 <roy.pledge@nxp.com>
> > Signed-off-by: Haiying Wang <haiying.wang@nxp.com>
> > Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
> > ---
> > 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 <linux/types.h>
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/msi.h>
> > +#include <linux/dma-mapping.h>
> > +#include <linux/delay.h>
> > +
> > +#include <linux/fsl/mc.h>
> > +#include <linux/fsl/dpaa2-io.h>
> > +
> > +#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?
We need to error out in that case. DPIO can't handle >= NR_CPUS.
Stuart
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web