cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sun4i-dma.c (36312B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright (C) 2014 Emilio López
      4 * Emilio López <emilio@elopez.com.ar>
      5 */
      6
      7#include <linux/bitmap.h>
      8#include <linux/bitops.h>
      9#include <linux/clk.h>
     10#include <linux/dmaengine.h>
     11#include <linux/dmapool.h>
     12#include <linux/interrupt.h>
     13#include <linux/module.h>
     14#include <linux/of_dma.h>
     15#include <linux/platform_device.h>
     16#include <linux/slab.h>
     17#include <linux/spinlock.h>
     18
     19#include "virt-dma.h"
     20
     21/** Common macros to normal and dedicated DMA registers **/
     22
     23#define SUN4I_DMA_CFG_LOADING			BIT(31)
     24#define SUN4I_DMA_CFG_DST_DATA_WIDTH(width)	((width) << 25)
     25#define SUN4I_DMA_CFG_DST_BURST_LENGTH(len)	((len) << 23)
     26#define SUN4I_DMA_CFG_DST_ADDR_MODE(mode)	((mode) << 21)
     27#define SUN4I_DMA_CFG_DST_DRQ_TYPE(type)	((type) << 16)
     28#define SUN4I_DMA_CFG_SRC_DATA_WIDTH(width)	((width) << 9)
     29#define SUN4I_DMA_CFG_SRC_BURST_LENGTH(len)	((len) << 7)
     30#define SUN4I_DMA_CFG_SRC_ADDR_MODE(mode)	((mode) << 5)
     31#define SUN4I_DMA_CFG_SRC_DRQ_TYPE(type)	(type)
     32
     33/** Normal DMA register values **/
     34
     35/* Normal DMA source/destination data request type values */
     36#define SUN4I_NDMA_DRQ_TYPE_SDRAM		0x16
     37#define SUN4I_NDMA_DRQ_TYPE_LIMIT		(0x1F + 1)
     38
     39/** Normal DMA register layout **/
     40
     41/* Dedicated DMA source/destination address mode values */
     42#define SUN4I_NDMA_ADDR_MODE_LINEAR		0
     43#define SUN4I_NDMA_ADDR_MODE_IO			1
     44
     45/* Normal DMA configuration register layout */
     46#define SUN4I_NDMA_CFG_CONT_MODE		BIT(30)
     47#define SUN4I_NDMA_CFG_WAIT_STATE(n)		((n) << 27)
     48#define SUN4I_NDMA_CFG_DST_NON_SECURE		BIT(22)
     49#define SUN4I_NDMA_CFG_BYTE_COUNT_MODE_REMAIN	BIT(15)
     50#define SUN4I_NDMA_CFG_SRC_NON_SECURE		BIT(6)
     51
     52/** Dedicated DMA register values **/
     53
     54/* Dedicated DMA source/destination address mode values */
     55#define SUN4I_DDMA_ADDR_MODE_LINEAR		0
     56#define SUN4I_DDMA_ADDR_MODE_IO			1
     57#define SUN4I_DDMA_ADDR_MODE_HORIZONTAL_PAGE	2
     58#define SUN4I_DDMA_ADDR_MODE_VERTICAL_PAGE	3
     59
     60/* Dedicated DMA source/destination data request type values */
     61#define SUN4I_DDMA_DRQ_TYPE_SDRAM		0x1
     62#define SUN4I_DDMA_DRQ_TYPE_LIMIT		(0x1F + 1)
     63
     64/** Dedicated DMA register layout **/
     65
     66/* Dedicated DMA configuration register layout */
     67#define SUN4I_DDMA_CFG_BUSY			BIT(30)
     68#define SUN4I_DDMA_CFG_CONT_MODE		BIT(29)
     69#define SUN4I_DDMA_CFG_DST_NON_SECURE		BIT(28)
     70#define SUN4I_DDMA_CFG_BYTE_COUNT_MODE_REMAIN	BIT(15)
     71#define SUN4I_DDMA_CFG_SRC_NON_SECURE		BIT(12)
     72
     73/* Dedicated DMA parameter register layout */
     74#define SUN4I_DDMA_PARA_DST_DATA_BLK_SIZE(n)	(((n) - 1) << 24)
     75#define SUN4I_DDMA_PARA_DST_WAIT_CYCLES(n)	(((n) - 1) << 16)
     76#define SUN4I_DDMA_PARA_SRC_DATA_BLK_SIZE(n)	(((n) - 1) << 8)
     77#define SUN4I_DDMA_PARA_SRC_WAIT_CYCLES(n)	(((n) - 1) << 0)
     78
     79/** DMA register offsets **/
     80
     81/* General register offsets */
     82#define SUN4I_DMA_IRQ_ENABLE_REG		0x0
     83#define SUN4I_DMA_IRQ_PENDING_STATUS_REG	0x4
     84
     85/* Normal DMA register offsets */
     86#define SUN4I_NDMA_CHANNEL_REG_BASE(n)		(0x100 + (n) * 0x20)
     87#define SUN4I_NDMA_CFG_REG			0x0
     88#define SUN4I_NDMA_SRC_ADDR_REG			0x4
     89#define SUN4I_NDMA_DST_ADDR_REG		0x8
     90#define SUN4I_NDMA_BYTE_COUNT_REG		0xC
     91
     92/* Dedicated DMA register offsets */
     93#define SUN4I_DDMA_CHANNEL_REG_BASE(n)		(0x300 + (n) * 0x20)
     94#define SUN4I_DDMA_CFG_REG			0x0
     95#define SUN4I_DDMA_SRC_ADDR_REG			0x4
     96#define SUN4I_DDMA_DST_ADDR_REG		0x8
     97#define SUN4I_DDMA_BYTE_COUNT_REG		0xC
     98#define SUN4I_DDMA_PARA_REG			0x18
     99
    100/** DMA Driver **/
    101
    102/*
    103 * Normal DMA has 8 channels, and Dedicated DMA has another 8, so
    104 * that's 16 channels. As for endpoints, there's 29 and 21
    105 * respectively. Given that the Normal DMA endpoints (other than
    106 * SDRAM) can be used as tx/rx, we need 78 vchans in total
    107 */
    108#define SUN4I_NDMA_NR_MAX_CHANNELS	8
    109#define SUN4I_DDMA_NR_MAX_CHANNELS	8
    110#define SUN4I_DMA_NR_MAX_CHANNELS					\
    111	(SUN4I_NDMA_NR_MAX_CHANNELS + SUN4I_DDMA_NR_MAX_CHANNELS)
    112#define SUN4I_NDMA_NR_MAX_VCHANS	(29 * 2 - 1)
    113#define SUN4I_DDMA_NR_MAX_VCHANS	21
    114#define SUN4I_DMA_NR_MAX_VCHANS						\
    115	(SUN4I_NDMA_NR_MAX_VCHANS + SUN4I_DDMA_NR_MAX_VCHANS)
    116
    117/* This set of SUN4I_DDMA timing parameters were found experimentally while
    118 * working with the SPI driver and seem to make it behave correctly */
    119#define SUN4I_DDMA_MAGIC_SPI_PARAMETERS \
    120	(SUN4I_DDMA_PARA_DST_DATA_BLK_SIZE(1) |			\
    121	 SUN4I_DDMA_PARA_SRC_DATA_BLK_SIZE(1) |				\
    122	 SUN4I_DDMA_PARA_DST_WAIT_CYCLES(2) |				\
    123	 SUN4I_DDMA_PARA_SRC_WAIT_CYCLES(2))
    124
    125struct sun4i_dma_pchan {
    126	/* Register base of channel */
    127	void __iomem			*base;
    128	/* vchan currently being serviced */
    129	struct sun4i_dma_vchan		*vchan;
    130	/* Is this a dedicated pchan? */
    131	int				is_dedicated;
    132};
    133
    134struct sun4i_dma_vchan {
    135	struct virt_dma_chan		vc;
    136	struct dma_slave_config		cfg;
    137	struct sun4i_dma_pchan		*pchan;
    138	struct sun4i_dma_promise	*processing;
    139	struct sun4i_dma_contract	*contract;
    140	u8				endpoint;
    141	int				is_dedicated;
    142};
    143
    144struct sun4i_dma_promise {
    145	u32				cfg;
    146	u32				para;
    147	dma_addr_t			src;
    148	dma_addr_t			dst;
    149	size_t				len;
    150	struct list_head		list;
    151};
    152
    153/* A contract is a set of promises */
    154struct sun4i_dma_contract {
    155	struct virt_dma_desc		vd;
    156	struct list_head		demands;
    157	struct list_head		completed_demands;
    158	int				is_cyclic;
    159};
    160
    161struct sun4i_dma_dev {
    162	DECLARE_BITMAP(pchans_used, SUN4I_DMA_NR_MAX_CHANNELS);
    163	struct dma_device		slave;
    164	struct sun4i_dma_pchan		*pchans;
    165	struct sun4i_dma_vchan		*vchans;
    166	void __iomem			*base;
    167	struct clk			*clk;
    168	int				irq;
    169	spinlock_t			lock;
    170};
    171
    172static struct sun4i_dma_dev *to_sun4i_dma_dev(struct dma_device *dev)
    173{
    174	return container_of(dev, struct sun4i_dma_dev, slave);
    175}
    176
    177static struct sun4i_dma_vchan *to_sun4i_dma_vchan(struct dma_chan *chan)
    178{
    179	return container_of(chan, struct sun4i_dma_vchan, vc.chan);
    180}
    181
    182static struct sun4i_dma_contract *to_sun4i_dma_contract(struct virt_dma_desc *vd)
    183{
    184	return container_of(vd, struct sun4i_dma_contract, vd);
    185}
    186
    187static struct device *chan2dev(struct dma_chan *chan)
    188{
    189	return &chan->dev->device;
    190}
    191
    192static int convert_burst(u32 maxburst)
    193{
    194	if (maxburst > 8)
    195		return -EINVAL;
    196
    197	/* 1 -> 0, 4 -> 1, 8 -> 2 */
    198	return (maxburst >> 2);
    199}
    200
    201static int convert_buswidth(enum dma_slave_buswidth addr_width)
    202{
    203	if (addr_width > DMA_SLAVE_BUSWIDTH_4_BYTES)
    204		return -EINVAL;
    205
    206	/* 8 (1 byte) -> 0, 16 (2 bytes) -> 1, 32 (4 bytes) -> 2 */
    207	return (addr_width >> 1);
    208}
    209
    210static void sun4i_dma_free_chan_resources(struct dma_chan *chan)
    211{
    212	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    213
    214	vchan_free_chan_resources(&vchan->vc);
    215}
    216
    217static struct sun4i_dma_pchan *find_and_use_pchan(struct sun4i_dma_dev *priv,
    218						  struct sun4i_dma_vchan *vchan)
    219{
    220	struct sun4i_dma_pchan *pchan = NULL, *pchans = priv->pchans;
    221	unsigned long flags;
    222	int i, max;
    223
    224	/*
    225	 * pchans 0-SUN4I_NDMA_NR_MAX_CHANNELS are normal, and
    226	 * SUN4I_NDMA_NR_MAX_CHANNELS+ are dedicated ones
    227	 */
    228	if (vchan->is_dedicated) {
    229		i = SUN4I_NDMA_NR_MAX_CHANNELS;
    230		max = SUN4I_DMA_NR_MAX_CHANNELS;
    231	} else {
    232		i = 0;
    233		max = SUN4I_NDMA_NR_MAX_CHANNELS;
    234	}
    235
    236	spin_lock_irqsave(&priv->lock, flags);
    237	for_each_clear_bit_from(i, priv->pchans_used, max) {
    238		pchan = &pchans[i];
    239		pchan->vchan = vchan;
    240		set_bit(i, priv->pchans_used);
    241		break;
    242	}
    243	spin_unlock_irqrestore(&priv->lock, flags);
    244
    245	return pchan;
    246}
    247
    248static void release_pchan(struct sun4i_dma_dev *priv,
    249			  struct sun4i_dma_pchan *pchan)
    250{
    251	unsigned long flags;
    252	int nr = pchan - priv->pchans;
    253
    254	spin_lock_irqsave(&priv->lock, flags);
    255
    256	pchan->vchan = NULL;
    257	clear_bit(nr, priv->pchans_used);
    258
    259	spin_unlock_irqrestore(&priv->lock, flags);
    260}
    261
    262static void configure_pchan(struct sun4i_dma_pchan *pchan,
    263			    struct sun4i_dma_promise *d)
    264{
    265	/*
    266	 * Configure addresses and misc parameters depending on type
    267	 * SUN4I_DDMA has an extra field with timing parameters
    268	 */
    269	if (pchan->is_dedicated) {
    270		writel_relaxed(d->src, pchan->base + SUN4I_DDMA_SRC_ADDR_REG);
    271		writel_relaxed(d->dst, pchan->base + SUN4I_DDMA_DST_ADDR_REG);
    272		writel_relaxed(d->len, pchan->base + SUN4I_DDMA_BYTE_COUNT_REG);
    273		writel_relaxed(d->para, pchan->base + SUN4I_DDMA_PARA_REG);
    274		writel_relaxed(d->cfg, pchan->base + SUN4I_DDMA_CFG_REG);
    275	} else {
    276		writel_relaxed(d->src, pchan->base + SUN4I_NDMA_SRC_ADDR_REG);
    277		writel_relaxed(d->dst, pchan->base + SUN4I_NDMA_DST_ADDR_REG);
    278		writel_relaxed(d->len, pchan->base + SUN4I_NDMA_BYTE_COUNT_REG);
    279		writel_relaxed(d->cfg, pchan->base + SUN4I_NDMA_CFG_REG);
    280	}
    281}
    282
    283static void set_pchan_interrupt(struct sun4i_dma_dev *priv,
    284				struct sun4i_dma_pchan *pchan,
    285				int half, int end)
    286{
    287	u32 reg;
    288	int pchan_number = pchan - priv->pchans;
    289	unsigned long flags;
    290
    291	spin_lock_irqsave(&priv->lock, flags);
    292
    293	reg = readl_relaxed(priv->base + SUN4I_DMA_IRQ_ENABLE_REG);
    294
    295	if (half)
    296		reg |= BIT(pchan_number * 2);
    297	else
    298		reg &= ~BIT(pchan_number * 2);
    299
    300	if (end)
    301		reg |= BIT(pchan_number * 2 + 1);
    302	else
    303		reg &= ~BIT(pchan_number * 2 + 1);
    304
    305	writel_relaxed(reg, priv->base + SUN4I_DMA_IRQ_ENABLE_REG);
    306
    307	spin_unlock_irqrestore(&priv->lock, flags);
    308}
    309
    310/*
    311 * Execute pending operations on a vchan
    312 *
    313 * When given a vchan, this function will try to acquire a suitable
    314 * pchan and, if successful, will configure it to fulfill a promise
    315 * from the next pending contract.
    316 *
    317 * This function must be called with &vchan->vc.lock held.
    318 */
    319static int __execute_vchan_pending(struct sun4i_dma_dev *priv,
    320				   struct sun4i_dma_vchan *vchan)
    321{
    322	struct sun4i_dma_promise *promise = NULL;
    323	struct sun4i_dma_contract *contract = NULL;
    324	struct sun4i_dma_pchan *pchan;
    325	struct virt_dma_desc *vd;
    326	int ret;
    327
    328	lockdep_assert_held(&vchan->vc.lock);
    329
    330	/* We need a pchan to do anything, so secure one if available */
    331	pchan = find_and_use_pchan(priv, vchan);
    332	if (!pchan)
    333		return -EBUSY;
    334
    335	/*
    336	 * Channel endpoints must not be repeated, so if this vchan
    337	 * has already submitted some work, we can't do anything else
    338	 */
    339	if (vchan->processing) {
    340		dev_dbg(chan2dev(&vchan->vc.chan),
    341			"processing something to this endpoint already\n");
    342		ret = -EBUSY;
    343		goto release_pchan;
    344	}
    345
    346	do {
    347		/* Figure out which contract we're working with today */
    348		vd = vchan_next_desc(&vchan->vc);
    349		if (!vd) {
    350			dev_dbg(chan2dev(&vchan->vc.chan),
    351				"No pending contract found");
    352			ret = 0;
    353			goto release_pchan;
    354		}
    355
    356		contract = to_sun4i_dma_contract(vd);
    357		if (list_empty(&contract->demands)) {
    358			/* The contract has been completed so mark it as such */
    359			list_del(&contract->vd.node);
    360			vchan_cookie_complete(&contract->vd);
    361			dev_dbg(chan2dev(&vchan->vc.chan),
    362				"Empty contract found and marked complete");
    363		}
    364	} while (list_empty(&contract->demands));
    365
    366	/* Now find out what we need to do */
    367	promise = list_first_entry(&contract->demands,
    368				   struct sun4i_dma_promise, list);
    369	vchan->processing = promise;
    370
    371	/* ... and make it reality */
    372	if (promise) {
    373		vchan->contract = contract;
    374		vchan->pchan = pchan;
    375		set_pchan_interrupt(priv, pchan, contract->is_cyclic, 1);
    376		configure_pchan(pchan, promise);
    377	}
    378
    379	return 0;
    380
    381release_pchan:
    382	release_pchan(priv, pchan);
    383	return ret;
    384}
    385
    386static int sanitize_config(struct dma_slave_config *sconfig,
    387			   enum dma_transfer_direction direction)
    388{
    389	switch (direction) {
    390	case DMA_MEM_TO_DEV:
    391		if ((sconfig->dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) ||
    392		    !sconfig->dst_maxburst)
    393			return -EINVAL;
    394
    395		if (sconfig->src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
    396			sconfig->src_addr_width = sconfig->dst_addr_width;
    397
    398		if (!sconfig->src_maxburst)
    399			sconfig->src_maxburst = sconfig->dst_maxburst;
    400
    401		break;
    402
    403	case DMA_DEV_TO_MEM:
    404		if ((sconfig->src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) ||
    405		    !sconfig->src_maxburst)
    406			return -EINVAL;
    407
    408		if (sconfig->dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED)
    409			sconfig->dst_addr_width = sconfig->src_addr_width;
    410
    411		if (!sconfig->dst_maxburst)
    412			sconfig->dst_maxburst = sconfig->src_maxburst;
    413
    414		break;
    415	default:
    416		return 0;
    417	}
    418
    419	return 0;
    420}
    421
    422/*
    423 * Generate a promise, to be used in a normal DMA contract.
    424 *
    425 * A NDMA promise contains all the information required to program the
    426 * normal part of the DMA Engine and get data copied. A non-executed
    427 * promise will live in the demands list on a contract. Once it has been
    428 * completed, it will be moved to the completed demands list for later freeing.
    429 * All linked promises will be freed when the corresponding contract is freed
    430 */
    431static struct sun4i_dma_promise *
    432generate_ndma_promise(struct dma_chan *chan, dma_addr_t src, dma_addr_t dest,
    433		      size_t len, struct dma_slave_config *sconfig,
    434		      enum dma_transfer_direction direction)
    435{
    436	struct sun4i_dma_promise *promise;
    437	int ret;
    438
    439	ret = sanitize_config(sconfig, direction);
    440	if (ret)
    441		return NULL;
    442
    443	promise = kzalloc(sizeof(*promise), GFP_NOWAIT);
    444	if (!promise)
    445		return NULL;
    446
    447	promise->src = src;
    448	promise->dst = dest;
    449	promise->len = len;
    450	promise->cfg = SUN4I_DMA_CFG_LOADING |
    451		SUN4I_NDMA_CFG_BYTE_COUNT_MODE_REMAIN;
    452
    453	dev_dbg(chan2dev(chan),
    454		"src burst %d, dst burst %d, src buswidth %d, dst buswidth %d",
    455		sconfig->src_maxburst, sconfig->dst_maxburst,
    456		sconfig->src_addr_width, sconfig->dst_addr_width);
    457
    458	/* Source burst */
    459	ret = convert_burst(sconfig->src_maxburst);
    460	if (ret < 0)
    461		goto fail;
    462	promise->cfg |= SUN4I_DMA_CFG_SRC_BURST_LENGTH(ret);
    463
    464	/* Destination burst */
    465	ret = convert_burst(sconfig->dst_maxburst);
    466	if (ret < 0)
    467		goto fail;
    468	promise->cfg |= SUN4I_DMA_CFG_DST_BURST_LENGTH(ret);
    469
    470	/* Source bus width */
    471	ret = convert_buswidth(sconfig->src_addr_width);
    472	if (ret < 0)
    473		goto fail;
    474	promise->cfg |= SUN4I_DMA_CFG_SRC_DATA_WIDTH(ret);
    475
    476	/* Destination bus width */
    477	ret = convert_buswidth(sconfig->dst_addr_width);
    478	if (ret < 0)
    479		goto fail;
    480	promise->cfg |= SUN4I_DMA_CFG_DST_DATA_WIDTH(ret);
    481
    482	return promise;
    483
    484fail:
    485	kfree(promise);
    486	return NULL;
    487}
    488
    489/*
    490 * Generate a promise, to be used in a dedicated DMA contract.
    491 *
    492 * A DDMA promise contains all the information required to program the
    493 * Dedicated part of the DMA Engine and get data copied. A non-executed
    494 * promise will live in the demands list on a contract. Once it has been
    495 * completed, it will be moved to the completed demands list for later freeing.
    496 * All linked promises will be freed when the corresponding contract is freed
    497 */
    498static struct sun4i_dma_promise *
    499generate_ddma_promise(struct dma_chan *chan, dma_addr_t src, dma_addr_t dest,
    500		      size_t len, struct dma_slave_config *sconfig)
    501{
    502	struct sun4i_dma_promise *promise;
    503	int ret;
    504
    505	promise = kzalloc(sizeof(*promise), GFP_NOWAIT);
    506	if (!promise)
    507		return NULL;
    508
    509	promise->src = src;
    510	promise->dst = dest;
    511	promise->len = len;
    512	promise->cfg = SUN4I_DMA_CFG_LOADING |
    513		SUN4I_DDMA_CFG_BYTE_COUNT_MODE_REMAIN;
    514
    515	/* Source burst */
    516	ret = convert_burst(sconfig->src_maxburst);
    517	if (ret < 0)
    518		goto fail;
    519	promise->cfg |= SUN4I_DMA_CFG_SRC_BURST_LENGTH(ret);
    520
    521	/* Destination burst */
    522	ret = convert_burst(sconfig->dst_maxburst);
    523	if (ret < 0)
    524		goto fail;
    525	promise->cfg |= SUN4I_DMA_CFG_DST_BURST_LENGTH(ret);
    526
    527	/* Source bus width */
    528	ret = convert_buswidth(sconfig->src_addr_width);
    529	if (ret < 0)
    530		goto fail;
    531	promise->cfg |= SUN4I_DMA_CFG_SRC_DATA_WIDTH(ret);
    532
    533	/* Destination bus width */
    534	ret = convert_buswidth(sconfig->dst_addr_width);
    535	if (ret < 0)
    536		goto fail;
    537	promise->cfg |= SUN4I_DMA_CFG_DST_DATA_WIDTH(ret);
    538
    539	return promise;
    540
    541fail:
    542	kfree(promise);
    543	return NULL;
    544}
    545
    546/*
    547 * Generate a contract
    548 *
    549 * Contracts function as DMA descriptors. As our hardware does not support
    550 * linked lists, we need to implement SG via software. We use a contract
    551 * to hold all the pieces of the request and process them serially one
    552 * after another. Each piece is represented as a promise.
    553 */
    554static struct sun4i_dma_contract *generate_dma_contract(void)
    555{
    556	struct sun4i_dma_contract *contract;
    557
    558	contract = kzalloc(sizeof(*contract), GFP_NOWAIT);
    559	if (!contract)
    560		return NULL;
    561
    562	INIT_LIST_HEAD(&contract->demands);
    563	INIT_LIST_HEAD(&contract->completed_demands);
    564
    565	return contract;
    566}
    567
    568/*
    569 * Get next promise on a cyclic transfer
    570 *
    571 * Cyclic contracts contain a series of promises which are executed on a
    572 * loop. This function returns the next promise from a cyclic contract,
    573 * so it can be programmed into the hardware.
    574 */
    575static struct sun4i_dma_promise *
    576get_next_cyclic_promise(struct sun4i_dma_contract *contract)
    577{
    578	struct sun4i_dma_promise *promise;
    579
    580	promise = list_first_entry_or_null(&contract->demands,
    581					   struct sun4i_dma_promise, list);
    582	if (!promise) {
    583		list_splice_init(&contract->completed_demands,
    584				 &contract->demands);
    585		promise = list_first_entry(&contract->demands,
    586					   struct sun4i_dma_promise, list);
    587	}
    588
    589	return promise;
    590}
    591
    592/*
    593 * Free a contract and all its associated promises
    594 */
    595static void sun4i_dma_free_contract(struct virt_dma_desc *vd)
    596{
    597	struct sun4i_dma_contract *contract = to_sun4i_dma_contract(vd);
    598	struct sun4i_dma_promise *promise, *tmp;
    599
    600	/* Free all the demands and completed demands */
    601	list_for_each_entry_safe(promise, tmp, &contract->demands, list)
    602		kfree(promise);
    603
    604	list_for_each_entry_safe(promise, tmp, &contract->completed_demands, list)
    605		kfree(promise);
    606
    607	kfree(contract);
    608}
    609
    610static struct dma_async_tx_descriptor *
    611sun4i_dma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest,
    612			  dma_addr_t src, size_t len, unsigned long flags)
    613{
    614	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    615	struct dma_slave_config *sconfig = &vchan->cfg;
    616	struct sun4i_dma_promise *promise;
    617	struct sun4i_dma_contract *contract;
    618
    619	contract = generate_dma_contract();
    620	if (!contract)
    621		return NULL;
    622
    623	/*
    624	 * We can only do the copy to bus aligned addresses, so
    625	 * choose the best one so we get decent performance. We also
    626	 * maximize the burst size for this same reason.
    627	 */
    628	sconfig->src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
    629	sconfig->dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
    630	sconfig->src_maxburst = 8;
    631	sconfig->dst_maxburst = 8;
    632
    633	if (vchan->is_dedicated)
    634		promise = generate_ddma_promise(chan, src, dest, len, sconfig);
    635	else
    636		promise = generate_ndma_promise(chan, src, dest, len, sconfig,
    637						DMA_MEM_TO_MEM);
    638
    639	if (!promise) {
    640		kfree(contract);
    641		return NULL;
    642	}
    643
    644	/* Configure memcpy mode */
    645	if (vchan->is_dedicated) {
    646		promise->cfg |= SUN4I_DMA_CFG_SRC_DRQ_TYPE(SUN4I_DDMA_DRQ_TYPE_SDRAM) |
    647				SUN4I_DMA_CFG_DST_DRQ_TYPE(SUN4I_DDMA_DRQ_TYPE_SDRAM);
    648	} else {
    649		promise->cfg |= SUN4I_DMA_CFG_SRC_DRQ_TYPE(SUN4I_NDMA_DRQ_TYPE_SDRAM) |
    650				SUN4I_DMA_CFG_DST_DRQ_TYPE(SUN4I_NDMA_DRQ_TYPE_SDRAM);
    651	}
    652
    653	/* Fill the contract with our only promise */
    654	list_add_tail(&promise->list, &contract->demands);
    655
    656	/* And add it to the vchan */
    657	return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
    658}
    659
    660static struct dma_async_tx_descriptor *
    661sun4i_dma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf, size_t len,
    662			  size_t period_len, enum dma_transfer_direction dir,
    663			  unsigned long flags)
    664{
    665	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    666	struct dma_slave_config *sconfig = &vchan->cfg;
    667	struct sun4i_dma_promise *promise;
    668	struct sun4i_dma_contract *contract;
    669	dma_addr_t src, dest;
    670	u32 endpoints;
    671	int nr_periods, offset, plength, i;
    672	u8 ram_type, io_mode, linear_mode;
    673
    674	if (!is_slave_direction(dir)) {
    675		dev_err(chan2dev(chan), "Invalid DMA direction\n");
    676		return NULL;
    677	}
    678
    679	contract = generate_dma_contract();
    680	if (!contract)
    681		return NULL;
    682
    683	contract->is_cyclic = 1;
    684
    685	if (vchan->is_dedicated) {
    686		io_mode = SUN4I_DDMA_ADDR_MODE_IO;
    687		linear_mode = SUN4I_DDMA_ADDR_MODE_LINEAR;
    688		ram_type = SUN4I_DDMA_DRQ_TYPE_SDRAM;
    689	} else {
    690		io_mode = SUN4I_NDMA_ADDR_MODE_IO;
    691		linear_mode = SUN4I_NDMA_ADDR_MODE_LINEAR;
    692		ram_type = SUN4I_NDMA_DRQ_TYPE_SDRAM;
    693	}
    694
    695	if (dir == DMA_MEM_TO_DEV) {
    696		src = buf;
    697		dest = sconfig->dst_addr;
    698		endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(vchan->endpoint) |
    699			    SUN4I_DMA_CFG_DST_ADDR_MODE(io_mode) |
    700			    SUN4I_DMA_CFG_SRC_DRQ_TYPE(ram_type) |
    701			    SUN4I_DMA_CFG_SRC_ADDR_MODE(linear_mode);
    702	} else {
    703		src = sconfig->src_addr;
    704		dest = buf;
    705		endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(ram_type) |
    706			    SUN4I_DMA_CFG_DST_ADDR_MODE(linear_mode) |
    707			    SUN4I_DMA_CFG_SRC_DRQ_TYPE(vchan->endpoint) |
    708			    SUN4I_DMA_CFG_SRC_ADDR_MODE(io_mode);
    709	}
    710
    711	/*
    712	 * We will be using half done interrupts to make two periods
    713	 * out of a promise, so we need to program the DMA engine less
    714	 * often
    715	 */
    716
    717	/*
    718	 * The engine can interrupt on half-transfer, so we can use
    719	 * this feature to program the engine half as often as if we
    720	 * didn't use it (keep in mind the hardware doesn't support
    721	 * linked lists).
    722	 *
    723	 * Say you have a set of periods (| marks the start/end, I for
    724	 * interrupt, P for programming the engine to do a new
    725	 * transfer), the easy but slow way would be to do
    726	 *
    727	 *  |---|---|---|---| (periods / promises)
    728	 *  P  I,P I,P I,P  I
    729	 *
    730	 * Using half transfer interrupts you can do
    731	 *
    732	 *  |-------|-------| (promises as configured on hw)
    733	 *  |---|---|---|---| (periods)
    734	 *  P   I  I,P  I   I
    735	 *
    736	 * Which requires half the engine programming for the same
    737	 * functionality.
    738	 */
    739	nr_periods = DIV_ROUND_UP(len / period_len, 2);
    740	for (i = 0; i < nr_periods; i++) {
    741		/* Calculate the offset in the buffer and the length needed */
    742		offset = i * period_len * 2;
    743		plength = min((len - offset), (period_len * 2));
    744		if (dir == DMA_MEM_TO_DEV)
    745			src = buf + offset;
    746		else
    747			dest = buf + offset;
    748
    749		/* Make the promise */
    750		if (vchan->is_dedicated)
    751			promise = generate_ddma_promise(chan, src, dest,
    752							plength, sconfig);
    753		else
    754			promise = generate_ndma_promise(chan, src, dest,
    755							plength, sconfig, dir);
    756
    757		if (!promise) {
    758			/* TODO: should we free everything? */
    759			return NULL;
    760		}
    761		promise->cfg |= endpoints;
    762
    763		/* Then add it to the contract */
    764		list_add_tail(&promise->list, &contract->demands);
    765	}
    766
    767	/* And add it to the vchan */
    768	return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
    769}
    770
    771static struct dma_async_tx_descriptor *
    772sun4i_dma_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
    773			unsigned int sg_len, enum dma_transfer_direction dir,
    774			unsigned long flags, void *context)
    775{
    776	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    777	struct dma_slave_config *sconfig = &vchan->cfg;
    778	struct sun4i_dma_promise *promise;
    779	struct sun4i_dma_contract *contract;
    780	u8 ram_type, io_mode, linear_mode;
    781	struct scatterlist *sg;
    782	dma_addr_t srcaddr, dstaddr;
    783	u32 endpoints, para;
    784	int i;
    785
    786	if (!sgl)
    787		return NULL;
    788
    789	if (!is_slave_direction(dir)) {
    790		dev_err(chan2dev(chan), "Invalid DMA direction\n");
    791		return NULL;
    792	}
    793
    794	contract = generate_dma_contract();
    795	if (!contract)
    796		return NULL;
    797
    798	if (vchan->is_dedicated) {
    799		io_mode = SUN4I_DDMA_ADDR_MODE_IO;
    800		linear_mode = SUN4I_DDMA_ADDR_MODE_LINEAR;
    801		ram_type = SUN4I_DDMA_DRQ_TYPE_SDRAM;
    802	} else {
    803		io_mode = SUN4I_NDMA_ADDR_MODE_IO;
    804		linear_mode = SUN4I_NDMA_ADDR_MODE_LINEAR;
    805		ram_type = SUN4I_NDMA_DRQ_TYPE_SDRAM;
    806	}
    807
    808	if (dir == DMA_MEM_TO_DEV)
    809		endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(vchan->endpoint) |
    810			    SUN4I_DMA_CFG_DST_ADDR_MODE(io_mode) |
    811			    SUN4I_DMA_CFG_SRC_DRQ_TYPE(ram_type) |
    812			    SUN4I_DMA_CFG_SRC_ADDR_MODE(linear_mode);
    813	else
    814		endpoints = SUN4I_DMA_CFG_DST_DRQ_TYPE(ram_type) |
    815			    SUN4I_DMA_CFG_DST_ADDR_MODE(linear_mode) |
    816			    SUN4I_DMA_CFG_SRC_DRQ_TYPE(vchan->endpoint) |
    817			    SUN4I_DMA_CFG_SRC_ADDR_MODE(io_mode);
    818
    819	for_each_sg(sgl, sg, sg_len, i) {
    820		/* Figure out addresses */
    821		if (dir == DMA_MEM_TO_DEV) {
    822			srcaddr = sg_dma_address(sg);
    823			dstaddr = sconfig->dst_addr;
    824		} else {
    825			srcaddr = sconfig->src_addr;
    826			dstaddr = sg_dma_address(sg);
    827		}
    828
    829		/*
    830		 * These are the magic DMA engine timings that keep SPI going.
    831		 * I haven't seen any interface on DMAEngine to configure
    832		 * timings, and so far they seem to work for everything we
    833		 * support, so I've kept them here. I don't know if other
    834		 * devices need different timings because, as usual, we only
    835		 * have the "para" bitfield meanings, but no comment on what
    836		 * the values should be when doing a certain operation :|
    837		 */
    838		para = SUN4I_DDMA_MAGIC_SPI_PARAMETERS;
    839
    840		/* And make a suitable promise */
    841		if (vchan->is_dedicated)
    842			promise = generate_ddma_promise(chan, srcaddr, dstaddr,
    843							sg_dma_len(sg),
    844							sconfig);
    845		else
    846			promise = generate_ndma_promise(chan, srcaddr, dstaddr,
    847							sg_dma_len(sg),
    848							sconfig, dir);
    849
    850		if (!promise)
    851			return NULL; /* TODO: should we free everything? */
    852
    853		promise->cfg |= endpoints;
    854		promise->para = para;
    855
    856		/* Then add it to the contract */
    857		list_add_tail(&promise->list, &contract->demands);
    858	}
    859
    860	/*
    861	 * Once we've got all the promises ready, add the contract
    862	 * to the pending list on the vchan
    863	 */
    864	return vchan_tx_prep(&vchan->vc, &contract->vd, flags);
    865}
    866
    867static int sun4i_dma_terminate_all(struct dma_chan *chan)
    868{
    869	struct sun4i_dma_dev *priv = to_sun4i_dma_dev(chan->device);
    870	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    871	struct sun4i_dma_pchan *pchan = vchan->pchan;
    872	LIST_HEAD(head);
    873	unsigned long flags;
    874
    875	spin_lock_irqsave(&vchan->vc.lock, flags);
    876	vchan_get_all_descriptors(&vchan->vc, &head);
    877	spin_unlock_irqrestore(&vchan->vc.lock, flags);
    878
    879	/*
    880	 * Clearing the configuration register will halt the pchan. Interrupts
    881	 * may still trigger, so don't forget to disable them.
    882	 */
    883	if (pchan) {
    884		if (pchan->is_dedicated)
    885			writel(0, pchan->base + SUN4I_DDMA_CFG_REG);
    886		else
    887			writel(0, pchan->base + SUN4I_NDMA_CFG_REG);
    888		set_pchan_interrupt(priv, pchan, 0, 0);
    889		release_pchan(priv, pchan);
    890	}
    891
    892	spin_lock_irqsave(&vchan->vc.lock, flags);
    893	/* Clear these so the vchan is usable again */
    894	vchan->processing = NULL;
    895	vchan->pchan = NULL;
    896	spin_unlock_irqrestore(&vchan->vc.lock, flags);
    897
    898	vchan_dma_desc_free_list(&vchan->vc, &head);
    899
    900	return 0;
    901}
    902
    903static int sun4i_dma_config(struct dma_chan *chan,
    904			    struct dma_slave_config *config)
    905{
    906	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    907
    908	memcpy(&vchan->cfg, config, sizeof(*config));
    909
    910	return 0;
    911}
    912
    913static struct dma_chan *sun4i_dma_of_xlate(struct of_phandle_args *dma_spec,
    914					   struct of_dma *ofdma)
    915{
    916	struct sun4i_dma_dev *priv = ofdma->of_dma_data;
    917	struct sun4i_dma_vchan *vchan;
    918	struct dma_chan *chan;
    919	u8 is_dedicated = dma_spec->args[0];
    920	u8 endpoint = dma_spec->args[1];
    921
    922	/* Check if type is Normal or Dedicated */
    923	if (is_dedicated != 0 && is_dedicated != 1)
    924		return NULL;
    925
    926	/* Make sure the endpoint looks sane */
    927	if ((is_dedicated && endpoint >= SUN4I_DDMA_DRQ_TYPE_LIMIT) ||
    928	    (!is_dedicated && endpoint >= SUN4I_NDMA_DRQ_TYPE_LIMIT))
    929		return NULL;
    930
    931	chan = dma_get_any_slave_channel(&priv->slave);
    932	if (!chan)
    933		return NULL;
    934
    935	/* Assign the endpoint to the vchan */
    936	vchan = to_sun4i_dma_vchan(chan);
    937	vchan->is_dedicated = is_dedicated;
    938	vchan->endpoint = endpoint;
    939
    940	return chan;
    941}
    942
    943static enum dma_status sun4i_dma_tx_status(struct dma_chan *chan,
    944					   dma_cookie_t cookie,
    945					   struct dma_tx_state *state)
    946{
    947	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    948	struct sun4i_dma_pchan *pchan = vchan->pchan;
    949	struct sun4i_dma_contract *contract;
    950	struct sun4i_dma_promise *promise;
    951	struct virt_dma_desc *vd;
    952	unsigned long flags;
    953	enum dma_status ret;
    954	size_t bytes = 0;
    955
    956	ret = dma_cookie_status(chan, cookie, state);
    957	if (!state || (ret == DMA_COMPLETE))
    958		return ret;
    959
    960	spin_lock_irqsave(&vchan->vc.lock, flags);
    961	vd = vchan_find_desc(&vchan->vc, cookie);
    962	if (!vd)
    963		goto exit;
    964	contract = to_sun4i_dma_contract(vd);
    965
    966	list_for_each_entry(promise, &contract->demands, list)
    967		bytes += promise->len;
    968
    969	/*
    970	 * The hardware is configured to return the remaining byte
    971	 * quantity. If possible, replace the first listed element's
    972	 * full size with the actual remaining amount
    973	 */
    974	promise = list_first_entry_or_null(&contract->demands,
    975					   struct sun4i_dma_promise, list);
    976	if (promise && pchan) {
    977		bytes -= promise->len;
    978		if (pchan->is_dedicated)
    979			bytes += readl(pchan->base + SUN4I_DDMA_BYTE_COUNT_REG);
    980		else
    981			bytes += readl(pchan->base + SUN4I_NDMA_BYTE_COUNT_REG);
    982	}
    983
    984exit:
    985
    986	dma_set_residue(state, bytes);
    987	spin_unlock_irqrestore(&vchan->vc.lock, flags);
    988
    989	return ret;
    990}
    991
    992static void sun4i_dma_issue_pending(struct dma_chan *chan)
    993{
    994	struct sun4i_dma_dev *priv = to_sun4i_dma_dev(chan->device);
    995	struct sun4i_dma_vchan *vchan = to_sun4i_dma_vchan(chan);
    996	unsigned long flags;
    997
    998	spin_lock_irqsave(&vchan->vc.lock, flags);
    999
   1000	/*
   1001	 * If there are pending transactions for this vchan, push one of
   1002	 * them into the engine to get the ball rolling.
   1003	 */
   1004	if (vchan_issue_pending(&vchan->vc))
   1005		__execute_vchan_pending(priv, vchan);
   1006
   1007	spin_unlock_irqrestore(&vchan->vc.lock, flags);
   1008}
   1009
   1010static irqreturn_t sun4i_dma_interrupt(int irq, void *dev_id)
   1011{
   1012	struct sun4i_dma_dev *priv = dev_id;
   1013	struct sun4i_dma_pchan *pchans = priv->pchans, *pchan;
   1014	struct sun4i_dma_vchan *vchan;
   1015	struct sun4i_dma_contract *contract;
   1016	struct sun4i_dma_promise *promise;
   1017	unsigned long pendirq, irqs, disableirqs;
   1018	int bit, i, free_room, allow_mitigation = 1;
   1019
   1020	pendirq = readl_relaxed(priv->base + SUN4I_DMA_IRQ_PENDING_STATUS_REG);
   1021
   1022handle_pending:
   1023
   1024	disableirqs = 0;
   1025	free_room = 0;
   1026
   1027	for_each_set_bit(bit, &pendirq, 32) {
   1028		pchan = &pchans[bit >> 1];
   1029		vchan = pchan->vchan;
   1030		if (!vchan) /* a terminated channel may still interrupt */
   1031			continue;
   1032		contract = vchan->contract;
   1033
   1034		/*
   1035		 * Disable the IRQ and free the pchan if it's an end
   1036		 * interrupt (odd bit)
   1037		 */
   1038		if (bit & 1) {
   1039			spin_lock(&vchan->vc.lock);
   1040
   1041			/*
   1042			 * Move the promise into the completed list now that
   1043			 * we're done with it
   1044			 */
   1045			list_move_tail(&vchan->processing->list,
   1046				       &contract->completed_demands);
   1047
   1048			/*
   1049			 * Cyclic DMA transfers are special:
   1050			 * - There's always something we can dispatch
   1051			 * - We need to run the callback
   1052			 * - Latency is very important, as this is used by audio
   1053			 * We therefore just cycle through the list and dispatch
   1054			 * whatever we have here, reusing the pchan. There's
   1055			 * no need to run the thread after this.
   1056			 *
   1057			 * For non-cyclic transfers we need to look around,
   1058			 * so we can program some more work, or notify the
   1059			 * client that their transfers have been completed.
   1060			 */
   1061			if (contract->is_cyclic) {
   1062				promise = get_next_cyclic_promise(contract);
   1063				vchan->processing = promise;
   1064				configure_pchan(pchan, promise);
   1065				vchan_cyclic_callback(&contract->vd);
   1066			} else {
   1067				vchan->processing = NULL;
   1068				vchan->pchan = NULL;
   1069
   1070				free_room = 1;
   1071				disableirqs |= BIT(bit);
   1072				release_pchan(priv, pchan);
   1073			}
   1074
   1075			spin_unlock(&vchan->vc.lock);
   1076		} else {
   1077			/* Half done interrupt */
   1078			if (contract->is_cyclic)
   1079				vchan_cyclic_callback(&contract->vd);
   1080			else
   1081				disableirqs |= BIT(bit);
   1082		}
   1083	}
   1084
   1085	/* Disable the IRQs for events we handled */
   1086	spin_lock(&priv->lock);
   1087	irqs = readl_relaxed(priv->base + SUN4I_DMA_IRQ_ENABLE_REG);
   1088	writel_relaxed(irqs & ~disableirqs,
   1089		       priv->base + SUN4I_DMA_IRQ_ENABLE_REG);
   1090	spin_unlock(&priv->lock);
   1091
   1092	/* Writing 1 to the pending field will clear the pending interrupt */
   1093	writel_relaxed(pendirq, priv->base + SUN4I_DMA_IRQ_PENDING_STATUS_REG);
   1094
   1095	/*
   1096	 * If a pchan was freed, we may be able to schedule something else,
   1097	 * so have a look around
   1098	 */
   1099	if (free_room) {
   1100		for (i = 0; i < SUN4I_DMA_NR_MAX_VCHANS; i++) {
   1101			vchan = &priv->vchans[i];
   1102			spin_lock(&vchan->vc.lock);
   1103			__execute_vchan_pending(priv, vchan);
   1104			spin_unlock(&vchan->vc.lock);
   1105		}
   1106	}
   1107
   1108	/*
   1109	 * Handle newer interrupts if some showed up, but only do it once
   1110	 * to avoid a too long a loop
   1111	 */
   1112	if (allow_mitigation) {
   1113		pendirq = readl_relaxed(priv->base +
   1114					SUN4I_DMA_IRQ_PENDING_STATUS_REG);
   1115		if (pendirq) {
   1116			allow_mitigation = 0;
   1117			goto handle_pending;
   1118		}
   1119	}
   1120
   1121	return IRQ_HANDLED;
   1122}
   1123
   1124static int sun4i_dma_probe(struct platform_device *pdev)
   1125{
   1126	struct sun4i_dma_dev *priv;
   1127	struct resource *res;
   1128	int i, j, ret;
   1129
   1130	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
   1131	if (!priv)
   1132		return -ENOMEM;
   1133
   1134	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
   1135	priv->base = devm_ioremap_resource(&pdev->dev, res);
   1136	if (IS_ERR(priv->base))
   1137		return PTR_ERR(priv->base);
   1138
   1139	priv->irq = platform_get_irq(pdev, 0);
   1140	if (priv->irq < 0)
   1141		return priv->irq;
   1142
   1143	priv->clk = devm_clk_get(&pdev->dev, NULL);
   1144	if (IS_ERR(priv->clk)) {
   1145		dev_err(&pdev->dev, "No clock specified\n");
   1146		return PTR_ERR(priv->clk);
   1147	}
   1148
   1149	platform_set_drvdata(pdev, priv);
   1150	spin_lock_init(&priv->lock);
   1151
   1152	dma_cap_zero(priv->slave.cap_mask);
   1153	dma_cap_set(DMA_PRIVATE, priv->slave.cap_mask);
   1154	dma_cap_set(DMA_MEMCPY, priv->slave.cap_mask);
   1155	dma_cap_set(DMA_CYCLIC, priv->slave.cap_mask);
   1156	dma_cap_set(DMA_SLAVE, priv->slave.cap_mask);
   1157
   1158	INIT_LIST_HEAD(&priv->slave.channels);
   1159	priv->slave.device_free_chan_resources	= sun4i_dma_free_chan_resources;
   1160	priv->slave.device_tx_status		= sun4i_dma_tx_status;
   1161	priv->slave.device_issue_pending	= sun4i_dma_issue_pending;
   1162	priv->slave.device_prep_slave_sg	= sun4i_dma_prep_slave_sg;
   1163	priv->slave.device_prep_dma_memcpy	= sun4i_dma_prep_dma_memcpy;
   1164	priv->slave.device_prep_dma_cyclic	= sun4i_dma_prep_dma_cyclic;
   1165	priv->slave.device_config		= sun4i_dma_config;
   1166	priv->slave.device_terminate_all	= sun4i_dma_terminate_all;
   1167	priv->slave.copy_align			= 2;
   1168	priv->slave.src_addr_widths		= BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
   1169						  BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) |
   1170						  BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
   1171	priv->slave.dst_addr_widths		= BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
   1172						  BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) |
   1173						  BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
   1174	priv->slave.directions			= BIT(DMA_DEV_TO_MEM) |
   1175						  BIT(DMA_MEM_TO_DEV);
   1176	priv->slave.residue_granularity		= DMA_RESIDUE_GRANULARITY_BURST;
   1177
   1178	priv->slave.dev = &pdev->dev;
   1179
   1180	priv->pchans = devm_kcalloc(&pdev->dev, SUN4I_DMA_NR_MAX_CHANNELS,
   1181				    sizeof(struct sun4i_dma_pchan), GFP_KERNEL);
   1182	priv->vchans = devm_kcalloc(&pdev->dev, SUN4I_DMA_NR_MAX_VCHANS,
   1183				    sizeof(struct sun4i_dma_vchan), GFP_KERNEL);
   1184	if (!priv->vchans || !priv->pchans)
   1185		return -ENOMEM;
   1186
   1187	/*
   1188	 * [0..SUN4I_NDMA_NR_MAX_CHANNELS) are normal pchans, and
   1189	 * [SUN4I_NDMA_NR_MAX_CHANNELS..SUN4I_DMA_NR_MAX_CHANNELS) are
   1190	 * dedicated ones
   1191	 */
   1192	for (i = 0; i < SUN4I_NDMA_NR_MAX_CHANNELS; i++)
   1193		priv->pchans[i].base = priv->base +
   1194			SUN4I_NDMA_CHANNEL_REG_BASE(i);
   1195
   1196	for (j = 0; i < SUN4I_DMA_NR_MAX_CHANNELS; i++, j++) {
   1197		priv->pchans[i].base = priv->base +
   1198			SUN4I_DDMA_CHANNEL_REG_BASE(j);
   1199		priv->pchans[i].is_dedicated = 1;
   1200	}
   1201
   1202	for (i = 0; i < SUN4I_DMA_NR_MAX_VCHANS; i++) {
   1203		struct sun4i_dma_vchan *vchan = &priv->vchans[i];
   1204
   1205		spin_lock_init(&vchan->vc.lock);
   1206		vchan->vc.desc_free = sun4i_dma_free_contract;
   1207		vchan_init(&vchan->vc, &priv->slave);
   1208	}
   1209
   1210	ret = clk_prepare_enable(priv->clk);
   1211	if (ret) {
   1212		dev_err(&pdev->dev, "Couldn't enable the clock\n");
   1213		return ret;
   1214	}
   1215
   1216	/*
   1217	 * Make sure the IRQs are all disabled and accounted for. The bootloader
   1218	 * likes to leave these dirty
   1219	 */
   1220	writel(0, priv->base + SUN4I_DMA_IRQ_ENABLE_REG);
   1221	writel(0xFFFFFFFF, priv->base + SUN4I_DMA_IRQ_PENDING_STATUS_REG);
   1222
   1223	ret = devm_request_irq(&pdev->dev, priv->irq, sun4i_dma_interrupt,
   1224			       0, dev_name(&pdev->dev), priv);
   1225	if (ret) {
   1226		dev_err(&pdev->dev, "Cannot request IRQ\n");
   1227		goto err_clk_disable;
   1228	}
   1229
   1230	ret = dma_async_device_register(&priv->slave);
   1231	if (ret) {
   1232		dev_warn(&pdev->dev, "Failed to register DMA engine device\n");
   1233		goto err_clk_disable;
   1234	}
   1235
   1236	ret = of_dma_controller_register(pdev->dev.of_node, sun4i_dma_of_xlate,
   1237					 priv);
   1238	if (ret) {
   1239		dev_err(&pdev->dev, "of_dma_controller_register failed\n");
   1240		goto err_dma_unregister;
   1241	}
   1242
   1243	dev_dbg(&pdev->dev, "Successfully probed SUN4I_DMA\n");
   1244
   1245	return 0;
   1246
   1247err_dma_unregister:
   1248	dma_async_device_unregister(&priv->slave);
   1249err_clk_disable:
   1250	clk_disable_unprepare(priv->clk);
   1251	return ret;
   1252}
   1253
   1254static int sun4i_dma_remove(struct platform_device *pdev)
   1255{
   1256	struct sun4i_dma_dev *priv = platform_get_drvdata(pdev);
   1257
   1258	/* Disable IRQ so no more work is scheduled */
   1259	disable_irq(priv->irq);
   1260
   1261	of_dma_controller_free(pdev->dev.of_node);
   1262	dma_async_device_unregister(&priv->slave);
   1263
   1264	clk_disable_unprepare(priv->clk);
   1265
   1266	return 0;
   1267}
   1268
   1269static const struct of_device_id sun4i_dma_match[] = {
   1270	{ .compatible = "allwinner,sun4i-a10-dma" },
   1271	{ /* sentinel */ },
   1272};
   1273MODULE_DEVICE_TABLE(of, sun4i_dma_match);
   1274
   1275static struct platform_driver sun4i_dma_driver = {
   1276	.probe	= sun4i_dma_probe,
   1277	.remove	= sun4i_dma_remove,
   1278	.driver	= {
   1279		.name		= "sun4i-dma",
   1280		.of_match_table	= sun4i_dma_match,
   1281	},
   1282};
   1283
   1284module_platform_driver(sun4i_dma_driver);
   1285
   1286MODULE_DESCRIPTION("Allwinner A10 Dedicated DMA Controller Driver");
   1287MODULE_AUTHOR("Emilio López <emilio@elopez.com.ar>");
   1288MODULE_LICENSE("GPL");