Re: [PATCH v3 3/4] dmaengine: Add Broadcom SBA RAID driver
On Fri, Feb 10, 2017 at 11:20 PM, Dan Williamswrote: > On Fri, Feb 10, 2017 at 1:07 AM, Anup Patel wrote: >> The Broadcom stream buffer accelerator (SBA) provides offloading >> capabilities for RAID operations. This SBA offload engine is >> accessible via Broadcom SoC specific ring manager. >> >> This patch adds Broadcom SBA RAID driver which provides one >> DMA device with RAID capabilities using one or more Broadcom >> SoC specific ring manager channels. The SBA RAID driver in its >> current shape implements memcpy, xor, and pq operations. >> >> Signed-off-by: Anup Patel >> Reviewed-by: Ray Jui >> --- >> drivers/dma/Kconfig| 13 + >> drivers/dma/Makefile |1 + >> drivers/dma/bcm-sba-raid.c | 1711 >> >> 3 files changed, 1725 insertions(+) >> create mode 100644 drivers/dma/bcm-sba-raid.c >> >> diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig >> index 263495d..bf8fb84 100644 >> --- a/drivers/dma/Kconfig >> +++ b/drivers/dma/Kconfig >> @@ -99,6 +99,19 @@ config AXI_DMAC >> controller is often used in Analog Device's reference designs for >> FPGA >> platforms. >> >> +config BCM_SBA_RAID >> + tristate "Broadcom SBA RAID engine support" >> + depends on (ARM64 && MAILBOX && RAID6_PQ) || COMPILE_TEST >> + select DMA_ENGINE >> + select DMA_ENGINE_RAID >> + select ASYNC_TX_ENABLE_CHANNEL_SWITCH > > ASYNC_TX_ENABLE_CHANNEL_SWITCH violates the DMA mapping API and > Russell has warned it's especially problematic on ARM [1]. If you > need channel switching for this offload engine to be useful then you > need to move DMA mapping and channel switching responsibilities to MD > itself. > > [1]: > http://lists.infradead.org/pipermail/linux-arm-kernel/2011-January/036753.html In case of BCM-SBA-RAID, the underlying "struct device" for each DMA channel is the mailbox controller "struct device" (i.e. Ring Manager device). This is because Ring Manager HW is the front facing device which we program to submit work to BCM-SBA-RAID HW. This means DMA channels provided by BCM-SBA-RAID driver will use same "struct device" for DMA mappings hence channel switching between BCM-SBA-RAID DMA channels is safe. Due to above, we can safely enable ASYNC_TX_ENABLE_CHANNEL_SWITCH option for BCM-SBA-RAID driver. Regards, Anup
Re: [PATCH v3 3/4] dmaengine: Add Broadcom SBA RAID driver
On Mon, Feb 13, 2017 at 2:43 PM, Anup Patelwrote: > On Fri, Feb 10, 2017 at 11:20 PM, Dan Williams > wrote: >> On Fri, Feb 10, 2017 at 1:07 AM, Anup Patel wrote: >>> The Broadcom stream buffer accelerator (SBA) provides offloading >>> capabilities for RAID operations. This SBA offload engine is >>> accessible via Broadcom SoC specific ring manager. >>> >>> This patch adds Broadcom SBA RAID driver which provides one >>> DMA device with RAID capabilities using one or more Broadcom >>> SoC specific ring manager channels. The SBA RAID driver in its >>> current shape implements memcpy, xor, and pq operations. >>> >>> Signed-off-by: Anup Patel >>> Reviewed-by: Ray Jui >>> --- >>> drivers/dma/Kconfig| 13 + >>> drivers/dma/Makefile |1 + >>> drivers/dma/bcm-sba-raid.c | 1711 >>> >>> 3 files changed, 1725 insertions(+) >>> create mode 100644 drivers/dma/bcm-sba-raid.c >>> >>> diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig >>> index 263495d..bf8fb84 100644 >>> --- a/drivers/dma/Kconfig >>> +++ b/drivers/dma/Kconfig >>> @@ -99,6 +99,19 @@ config AXI_DMAC >>> controller is often used in Analog Device's reference designs for >>> FPGA >>> platforms. >>> >>> +config BCM_SBA_RAID >>> + tristate "Broadcom SBA RAID engine support" >>> + depends on (ARM64 && MAILBOX && RAID6_PQ) || COMPILE_TEST >>> + select DMA_ENGINE >>> + select DMA_ENGINE_RAID >>> + select ASYNC_TX_ENABLE_CHANNEL_SWITCH >> >> ASYNC_TX_ENABLE_CHANNEL_SWITCH violates the DMA mapping API and >> Russell has warned it's especially problematic on ARM [1]. If you >> need channel switching for this offload engine to be useful then you >> need to move DMA mapping and channel switching responsibilities to MD >> itself. >> >> [1]: >> http://lists.infradead.org/pipermail/linux-arm-kernel/2011-January/036753.html > > Actually driver works fine with/without > ASYNC_TX_ENABLE_CHANNEL_SWITCH enabled > so I am fine with removing dependency on this config option. I stand corrected. Previously, when I had tried removing ASYNC_TX_ENABLE_CHANNEL_SWITCH from BCM_SBA_RAID config option it worked because other drivers such xgene-dma and mv_xor_v2 are selecting this option. The BCM-SBA-RAID driver requires ASYNC_TX_ENABLE_CHANNEL_SWITCH option There is no issue reported for ASYNC_TX_ENABLE_CHANNEL_SWITCH with ARM64 kernel. The issue you pointed out was with ARM kernel. We will have to select ASYNC_TX_ENABLE_CHANNEL_SWITCH for BCM-SBA-RAID driver just like other ARM64 RAID drivers such as xgene-dma and mv_xor_v2. (Refer, XGENE_DMA and MV_XOR_V2 options) Regards, Anup
Re: [PATCH v3 3/4] dmaengine: Add Broadcom SBA RAID driver
On Fri, Feb 10, 2017 at 11:20 PM, Dan Williamswrote: > On Fri, Feb 10, 2017 at 1:07 AM, Anup Patel wrote: >> The Broadcom stream buffer accelerator (SBA) provides offloading >> capabilities for RAID operations. This SBA offload engine is >> accessible via Broadcom SoC specific ring manager. >> >> This patch adds Broadcom SBA RAID driver which provides one >> DMA device with RAID capabilities using one or more Broadcom >> SoC specific ring manager channels. The SBA RAID driver in its >> current shape implements memcpy, xor, and pq operations. >> >> Signed-off-by: Anup Patel >> Reviewed-by: Ray Jui >> --- >> drivers/dma/Kconfig| 13 + >> drivers/dma/Makefile |1 + >> drivers/dma/bcm-sba-raid.c | 1711 >> >> 3 files changed, 1725 insertions(+) >> create mode 100644 drivers/dma/bcm-sba-raid.c >> >> diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig >> index 263495d..bf8fb84 100644 >> --- a/drivers/dma/Kconfig >> +++ b/drivers/dma/Kconfig >> @@ -99,6 +99,19 @@ config AXI_DMAC >> controller is often used in Analog Device's reference designs for >> FPGA >> platforms. >> >> +config BCM_SBA_RAID >> + tristate "Broadcom SBA RAID engine support" >> + depends on (ARM64 && MAILBOX && RAID6_PQ) || COMPILE_TEST >> + select DMA_ENGINE >> + select DMA_ENGINE_RAID >> + select ASYNC_TX_ENABLE_CHANNEL_SWITCH > > ASYNC_TX_ENABLE_CHANNEL_SWITCH violates the DMA mapping API and > Russell has warned it's especially problematic on ARM [1]. If you > need channel switching for this offload engine to be useful then you > need to move DMA mapping and channel switching responsibilities to MD > itself. > > [1]: > http://lists.infradead.org/pipermail/linux-arm-kernel/2011-January/036753.html Actually driver works fine with/without ASYNC_TX_ENABLE_CHANNEL_SWITCH enabled so I am fine with removing dependency on this config option. > > > [..] >> diff --git a/drivers/dma/bcm-sba-raid.c b/drivers/dma/bcm-sba-raid.c >> new file mode 100644 >> index 000..bab9918 >> --- /dev/null >> +++ b/drivers/dma/bcm-sba-raid.c >> @@ -0,0 +1,1711 @@ >> +/* >> + * Copyright (C) 2017 Broadcom >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License version 2 as >> + * published by the Free Software Foundation. >> + */ >> + >> +/* >> + * Broadcom SBA RAID Driver >> + * >> + * The Broadcom stream buffer accelerator (SBA) provides offloading >> + * capabilities for RAID operations. The SBA offload engine is accessible >> + * via Broadcom SoC specific ring manager. Two or more offload engines >> + * can share same Broadcom SoC specific ring manager due to this Broadcom >> + * SoC specific ring manager driver is implemented as a mailbox controller >> + * driver and offload engine drivers are implemented as mallbox clients. >> + * >> + * Typically, Broadcom SoC specific ring manager will implement larger >> + * number of hardware rings over one or more SBA hardware devices. By >> + * design, the internal buffer size of SBA hardware device is limited >> + * but all offload operations supported by SBA can be broken down into >> + * multiple small size requests and executed parallely on multiple SBA >> + * hardware devices for achieving high through-put. >> + * >> + * The Broadcom SBA RAID driver does not require any register programming >> + * except submitting request to SBA hardware device via mailbox channels. >> + * This driver implements a DMA device with one DMA channel using a set >> + * of mailbox channels provided by Broadcom SoC specific ring manager >> + * driver. To exploit parallelism (as described above), all DMA request >> + * coming to SBA RAID DMA channel are broken down to smaller requests >> + * and submitted to multiple mailbox channels in round-robin fashion. >> + * For having more SBA DMA channels, we can create more SBA device nodes >> + * in Broadcom SoC specific DTS based on number of hardware rings supported >> + * by Broadcom SoC ring manager. >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#include "dmaengine.h" >> + >> +/* SBA command helper macros */ >> +#define SBA_DEC(_d, _s, _m)(((_d) >> (_s)) & (_m)) >> +#define SBA_ENC(_d, _v, _s, _m)\ >> + do {\ >> + (_d) &= ~((u64)(_m) << (_s)); \ >> + (_d) |= (((u64)(_v) & (_m)) << (_s)); \ >> + } while (0) > > Reusing a macro argument multiple times is problematic, consider > SBA_ENC(..., arg++, ...), and hiding assignments in a macro make this > hard to read. The compiler should inline it
Re: [PATCH v3 3/4] dmaengine: Add Broadcom SBA RAID driver
On Fri, Feb 10, 2017 at 1:07 AM, Anup Patelwrote: > The Broadcom stream buffer accelerator (SBA) provides offloading > capabilities for RAID operations. This SBA offload engine is > accessible via Broadcom SoC specific ring manager. > > This patch adds Broadcom SBA RAID driver which provides one > DMA device with RAID capabilities using one or more Broadcom > SoC specific ring manager channels. The SBA RAID driver in its > current shape implements memcpy, xor, and pq operations. > > Signed-off-by: Anup Patel > Reviewed-by: Ray Jui > --- > drivers/dma/Kconfig| 13 + > drivers/dma/Makefile |1 + > drivers/dma/bcm-sba-raid.c | 1711 > > 3 files changed, 1725 insertions(+) > create mode 100644 drivers/dma/bcm-sba-raid.c > > diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig > index 263495d..bf8fb84 100644 > --- a/drivers/dma/Kconfig > +++ b/drivers/dma/Kconfig > @@ -99,6 +99,19 @@ config AXI_DMAC > controller is often used in Analog Device's reference designs for > FPGA > platforms. > > +config BCM_SBA_RAID > + tristate "Broadcom SBA RAID engine support" > + depends on (ARM64 && MAILBOX && RAID6_PQ) || COMPILE_TEST > + select DMA_ENGINE > + select DMA_ENGINE_RAID > + select ASYNC_TX_ENABLE_CHANNEL_SWITCH ASYNC_TX_ENABLE_CHANNEL_SWITCH violates the DMA mapping API and Russell has warned it's especially problematic on ARM [1]. If you need channel switching for this offload engine to be useful then you need to move DMA mapping and channel switching responsibilities to MD itself. [1]: http://lists.infradead.org/pipermail/linux-arm-kernel/2011-January/036753.html [..] > diff --git a/drivers/dma/bcm-sba-raid.c b/drivers/dma/bcm-sba-raid.c > new file mode 100644 > index 000..bab9918 > --- /dev/null > +++ b/drivers/dma/bcm-sba-raid.c > @@ -0,0 +1,1711 @@ > +/* > + * Copyright (C) 2017 Broadcom > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + */ > + > +/* > + * Broadcom SBA RAID Driver > + * > + * The Broadcom stream buffer accelerator (SBA) provides offloading > + * capabilities for RAID operations. The SBA offload engine is accessible > + * via Broadcom SoC specific ring manager. Two or more offload engines > + * can share same Broadcom SoC specific ring manager due to this Broadcom > + * SoC specific ring manager driver is implemented as a mailbox controller > + * driver and offload engine drivers are implemented as mallbox clients. > + * > + * Typically, Broadcom SoC specific ring manager will implement larger > + * number of hardware rings over one or more SBA hardware devices. By > + * design, the internal buffer size of SBA hardware device is limited > + * but all offload operations supported by SBA can be broken down into > + * multiple small size requests and executed parallely on multiple SBA > + * hardware devices for achieving high through-put. > + * > + * The Broadcom SBA RAID driver does not require any register programming > + * except submitting request to SBA hardware device via mailbox channels. > + * This driver implements a DMA device with one DMA channel using a set > + * of mailbox channels provided by Broadcom SoC specific ring manager > + * driver. To exploit parallelism (as described above), all DMA request > + * coming to SBA RAID DMA channel are broken down to smaller requests > + * and submitted to multiple mailbox channels in round-robin fashion. > + * For having more SBA DMA channels, we can create more SBA device nodes > + * in Broadcom SoC specific DTS based on number of hardware rings supported > + * by Broadcom SoC ring manager. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "dmaengine.h" > + > +/* SBA command helper macros */ > +#define SBA_DEC(_d, _s, _m)(((_d) >> (_s)) & (_m)) > +#define SBA_ENC(_d, _v, _s, _m)\ > + do {\ > + (_d) &= ~((u64)(_m) << (_s)); \ > + (_d) |= (((u64)(_v) & (_m)) << (_s)); \ > + } while (0) Reusing a macro argument multiple times is problematic, consider SBA_ENC(..., arg++, ...), and hiding assignments in a macro make this hard to read. The compiler should inline it properly if you just make this a function that returns a value. You could also mark it __pure. [..] > + > +static struct sba_request *sba_alloc_request(struct sba_device *sba) > +{ > + unsigned long flags; > + struct sba_request *req = NULL; > + > + spin_lock_irqsave(>reqs_lock, flags); > + > + if
[PATCH v3 3/4] dmaengine: Add Broadcom SBA RAID driver
The Broadcom stream buffer accelerator (SBA) provides offloading capabilities for RAID operations. This SBA offload engine is accessible via Broadcom SoC specific ring manager. This patch adds Broadcom SBA RAID driver which provides one DMA device with RAID capabilities using one or more Broadcom SoC specific ring manager channels. The SBA RAID driver in its current shape implements memcpy, xor, and pq operations. Signed-off-by: Anup PatelReviewed-by: Ray Jui --- drivers/dma/Kconfig| 13 + drivers/dma/Makefile |1 + drivers/dma/bcm-sba-raid.c | 1711 3 files changed, 1725 insertions(+) create mode 100644 drivers/dma/bcm-sba-raid.c diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index 263495d..bf8fb84 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig @@ -99,6 +99,19 @@ config AXI_DMAC controller is often used in Analog Device's reference designs for FPGA platforms. +config BCM_SBA_RAID + tristate "Broadcom SBA RAID engine support" + depends on (ARM64 && MAILBOX && RAID6_PQ) || COMPILE_TEST + select DMA_ENGINE + select DMA_ENGINE_RAID + select ASYNC_TX_ENABLE_CHANNEL_SWITCH + default ARCH_BCM_IPROC + help + Enable support for Broadcom SBA RAID Engine. The SBA RAID + engine is available on most of the Broadcom iProc SoCs. It + has the capability to offload memcpy, xor and pq computation + for raid5/6. + config COH901318 bool "ST-Ericsson COH901318 DMA support" select DMA_ENGINE diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile index a4fa336..ba96bdd 100644 --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_AMCC_PPC440SPE_ADMA) += ppc4xx/ obj-$(CONFIG_AT_HDMAC) += at_hdmac.o obj-$(CONFIG_AT_XDMAC) += at_xdmac.o obj-$(CONFIG_AXI_DMAC) += dma-axi-dmac.o +obj-$(CONFIG_BCM_SBA_RAID) += bcm-sba-raid.o obj-$(CONFIG_COH901318) += coh901318.o coh901318_lli.o obj-$(CONFIG_DMA_BCM2835) += bcm2835-dma.o obj-$(CONFIG_DMA_JZ4740) += dma-jz4740.o diff --git a/drivers/dma/bcm-sba-raid.c b/drivers/dma/bcm-sba-raid.c new file mode 100644 index 000..bab9918 --- /dev/null +++ b/drivers/dma/bcm-sba-raid.c @@ -0,0 +1,1711 @@ +/* + * Copyright (C) 2017 Broadcom + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * Broadcom SBA RAID Driver + * + * The Broadcom stream buffer accelerator (SBA) provides offloading + * capabilities for RAID operations. The SBA offload engine is accessible + * via Broadcom SoC specific ring manager. Two or more offload engines + * can share same Broadcom SoC specific ring manager due to this Broadcom + * SoC specific ring manager driver is implemented as a mailbox controller + * driver and offload engine drivers are implemented as mallbox clients. + * + * Typically, Broadcom SoC specific ring manager will implement larger + * number of hardware rings over one or more SBA hardware devices. By + * design, the internal buffer size of SBA hardware device is limited + * but all offload operations supported by SBA can be broken down into + * multiple small size requests and executed parallely on multiple SBA + * hardware devices for achieving high through-put. + * + * The Broadcom SBA RAID driver does not require any register programming + * except submitting request to SBA hardware device via mailbox channels. + * This driver implements a DMA device with one DMA channel using a set + * of mailbox channels provided by Broadcom SoC specific ring manager + * driver. To exploit parallelism (as described above), all DMA request + * coming to SBA RAID DMA channel are broken down to smaller requests + * and submitted to multiple mailbox channels in round-robin fashion. + * For having more SBA DMA channels, we can create more SBA device nodes + * in Broadcom SoC specific DTS based on number of hardware rings supported + * by Broadcom SoC ring manager. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dmaengine.h" + +/* SBA command helper macros */ +#define SBA_DEC(_d, _s, _m)(((_d) >> (_s)) & (_m)) +#define SBA_ENC(_d, _v, _s, _m)\ + do {\ + (_d) &= ~((u64)(_m) << (_s)); \ + (_d) |= (((u64)(_v) & (_m)) << (_s)); \ + } while (0) + +/* SBA command related defines */ +#define SBA_TYPE_SHIFT 48 +#define SBA_TYPE_MASK GENMASK(1, 0) +#define SBA_TYPE_A 0x0 +#define SBA_TYPE_B 0x2