Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e1cfc72 authored by Linus Walleij's avatar Linus Walleij Committed by Vinod Koul
Browse files

dmaengine: pl08x: Add support for Faraday Technology FTDMAC020



After reading the specs for the Faraday Technology FTDMAC020 found
in the Gemini platform, it becomes pretty evident that this is just
another PL08x derivative, and should be handled like such by simply
extending the existing PL08x driver to handle the quirks in this
hardware.

This patch makes memcpy work and has been tested on the Gemini and
also regression-tested on the Nomadik NHK15 using dmatest with
10 threads per channel without a hinch for hours.

I have not implemented slave DMA in those codepaths, because this
device (Gemini) does not use slave DMA, and it seems like devices
using FTDMAC020 for device DMA have a slightly different register
layout so some real hardware is needed to proceed with this. I
left some FIXME etc in the code for this.

I had to do some refactorings of some helper functions, but I have
not split those into separate patches because these refactorings
do not make much sense without the increased complexity of handling
the FTDMAC020.

The DMA test would hang the platform on me on the Gemini after a
few thousand iterations, however after turning of the caches the
problem immediately disappeared and I could run the DMA engine
with 10 threads pers physical channel for days in a row without
a crash. I think there is no problem with the DMA driver: instead
it is something fishy in the FA526 cache handling code that get
pretty heavily exercised by the DMA engine and we need to go and
fix that instead.

Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
parent ebe9b300
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -62,8 +62,10 @@ config AMBA_PL08X
	select DMA_ENGINE
	select DMA_VIRTUAL_CHANNELS
	help
	  Platform has a PL08x DMAC device
	  which can provide DMA engine support
	  Say yes if your platform has a PL08x DMAC device which can
	  provide DMA engine support. This includes the original ARM
	  PL080 and PL081, Samsungs PL080 derivative and Faraday
	  Technology's FTDMAC020 PL080 derivative.

config AMCC_PPC440SPE_ADMA
	tristate "AMCC PPC440SPe ADMA support"
+612 −155

File changed.

Preview size limit exceeded, changes collapsed.

+82 −1
Original line number Diff line number Diff line
@@ -44,7 +44,14 @@

#define PL080_SYNC				(0x34)

/* Per channel configuration registers */
/* The Faraday Technology FTDMAC020 variant registers */
#define FTDMAC020_CH_BUSY			(0x20)
/* Identical to PL080_CONFIG */
#define FTDMAC020_CSR				(0x24)
/* Identical to PL080_SYNC */
#define FTDMAC020_SYNC				(0x2C)
#define FTDMAC020_REVISION			(0x30)
#define FTDMAC020_FEATURE			(0x34)

/* Per channel configuration registers */
#define PL080_Cx_BASE(x)			((0x100 + (x * 0x20)))
@@ -55,6 +62,13 @@
#define PL080_CH_CONFIG				(0x10)
#define PL080S_CH_CONTROL2			(0x10)
#define PL080S_CH_CONFIG			(0x14)
/* The Faraday FTDMAC020 derivative shuffles the registers around */
#define FTDMAC020_CH_CSR			(0x00)
#define FTDMAC020_CH_CFG			(0x04)
#define FTDMAC020_CH_SRC_ADDR			(0x08)
#define FTDMAC020_CH_DST_ADDR			(0x0C)
#define FTDMAC020_CH_LLP			(0x10)
#define FTDMAC020_CH_SIZE			(0x14)

#define PL080_LLI_ADDR_MASK			(0x3fffffff << 2)
#define PL080_LLI_ADDR_SHIFT			(2)
@@ -119,6 +133,73 @@
#define PL080_FLOW_PER2MEM_PER			(0x6)
#define PL080_FLOW_SRC2DST_SRC			(0x7)

#define FTDMAC020_CH_CSR_TC_MSK			BIT(31)
/* Later versions have a threshold in bits 24..26,  */
#define FTDMAC020_CH_CSR_FIFOTH_MSK		(0x7 << 24)
#define FTDMAC020_CH_CSR_FIFOTH_SHIFT		(24)
#define FTDMAC020_CH_CSR_CHPR1_MSK		(0x3 << 22)
#define FTDMAC020_CH_CSR_PROT3			BIT(21)
#define FTDMAC020_CH_CSR_PROT2			BIT(20)
#define FTDMAC020_CH_CSR_PROT1			BIT(19)
#define FTDMAC020_CH_CSR_SRC_SIZE_MSK		(0x7 << 16)
#define FTDMAC020_CH_CSR_SRC_SIZE_SHIFT		(16)
#define FTDMAC020_CH_CSR_ABT			BIT(15)
#define FTDMAC020_CH_CSR_SRC_WIDTH_MSK		(0x7 << 11)
#define FTDMAC020_CH_CSR_SRC_WIDTH_SHIFT	(11)
#define FTDMAC020_CH_CSR_DST_WIDTH_MSK		(0x7 << 8)
#define FTDMAC020_CH_CSR_DST_WIDTH_SHIFT	(8)
#define FTDMAC020_CH_CSR_MODE			BIT(7)
/* 00 = increase, 01 = decrease, 10 = fix */
#define FTDMAC020_CH_CSR_SRCAD_CTL_MSK		(0x3 << 5)
#define FTDMAC020_CH_CSR_SRCAD_CTL_SHIFT	(5)
#define FTDMAC020_CH_CSR_DSTAD_CTL_MSK		(0x3 << 3)
#define FTDMAC020_CH_CSR_DSTAD_CTL_SHIFT	(3)
#define FTDMAC020_CH_CSR_SRC_SEL		BIT(2)
#define FTDMAC020_CH_CSR_DST_SEL		BIT(1)
#define FTDMAC020_CH_CSR_EN			BIT(0)

/* FIFO threshold setting */
#define FTDMAC020_CH_CSR_FIFOTH_1		(0x0)
#define FTDMAC020_CH_CSR_FIFOTH_2		(0x1)
#define FTDMAC020_CH_CSR_FIFOTH_4		(0x2)
#define FTDMAC020_CH_CSR_FIFOTH_8		(0x3)
#define FTDMAC020_CH_CSR_FIFOTH_16		(0x4)
/* The FTDMAC020 supports 64bit wide transfers */
#define FTDMAC020_WIDTH_64BIT			(0x3)
/* Address can be increased, decreased or fixed */
#define FTDMAC020_CH_CSR_SRCAD_CTL_INC		(0x0)
#define FTDMAC020_CH_CSR_SRCAD_CTL_DEC		(0x1)
#define FTDMAC020_CH_CSR_SRCAD_CTL_FIXED	(0x2)

#define FTDMAC020_CH_CFG_LLP_CNT_MASK		(0xf << 16)
#define FTDMAC020_CH_CFG_LLP_CNT_SHIFT		(16)
#define FTDMAC020_CH_CFG_BUSY			BIT(8)
#define FTDMAC020_CH_CFG_INT_ABT_MASK		BIT(2)
#define FTDMAC020_CH_CFG_INT_ERR_MASK		BIT(1)
#define FTDMAC020_CH_CFG_INT_TC_MASK		BIT(0)

/* Inside the LLIs, the applicable CSR fields are mapped differently */
#define FTDMAC020_LLI_TC_MSK			BIT(28)
#define FTDMAC020_LLI_SRC_WIDTH_MSK		(0x7 << 25)
#define FTDMAC020_LLI_SRC_WIDTH_SHIFT		(25)
#define FTDMAC020_LLI_DST_WIDTH_MSK		(0x7 << 22)
#define FTDMAC020_LLI_DST_WIDTH_SHIFT		(22)
#define FTDMAC020_LLI_SRCAD_CTL_MSK		(0x3 << 20)
#define FTDMAC020_LLI_SRCAD_CTL_SHIFT		(20)
#define FTDMAC020_LLI_DSTAD_CTL_MSK		(0x3 << 18)
#define FTDMAC020_LLI_DSTAD_CTL_SHIFT		(18)
#define FTDMAC020_LLI_SRC_SEL			BIT(17)
#define FTDMAC020_LLI_DST_SEL			BIT(16)
#define FTDMAC020_LLI_TRANSFER_SIZE_MASK	(0xfff << 0)
#define FTDMAC020_LLI_TRANSFER_SIZE_SHIFT	(0)

#define FTDMAC020_CFG_LLP_CNT_MASK		(0x0f << 16)
#define FTDMAC020_CFG_LLP_CNT_SHIFT		(16)
#define FTDMAC020_CFG_BUSY			BIT(8)
#define FTDMAC020_CFG_INT_ABT_MSK		BIT(2)
#define FTDMAC020_CFG_INT_ERR_MSK		BIT(1)
#define FTDMAC020_CFG_INT_TC_MSK		BIT(0)

/* DMA linked list chain structure */

struct pl080_lli {