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

sa11x0-dma.c (27446B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * SA11x0 DMAengine support
      4 *
      5 * Copyright (C) 2012 Russell King
      6 *   Derived in part from arch/arm/mach-sa1100/dma.c,
      7 *   Copyright (C) 2000, 2001 by Nicolas Pitre
      8 */
      9#include <linux/sched.h>
     10#include <linux/device.h>
     11#include <linux/dmaengine.h>
     12#include <linux/init.h>
     13#include <linux/interrupt.h>
     14#include <linux/kernel.h>
     15#include <linux/module.h>
     16#include <linux/platform_device.h>
     17#include <linux/slab.h>
     18#include <linux/spinlock.h>
     19
     20#include "virt-dma.h"
     21
     22#define NR_PHY_CHAN	6
     23#define DMA_ALIGN	3
     24#define DMA_MAX_SIZE	0x1fff
     25#define DMA_CHUNK_SIZE	0x1000
     26
     27#define DMA_DDAR	0x00
     28#define DMA_DCSR_S	0x04
     29#define DMA_DCSR_C	0x08
     30#define DMA_DCSR_R	0x0c
     31#define DMA_DBSA	0x10
     32#define DMA_DBTA	0x14
     33#define DMA_DBSB	0x18
     34#define DMA_DBTB	0x1c
     35#define DMA_SIZE	0x20
     36
     37#define DCSR_RUN	(1 << 0)
     38#define DCSR_IE		(1 << 1)
     39#define DCSR_ERROR	(1 << 2)
     40#define DCSR_DONEA	(1 << 3)
     41#define DCSR_STRTA	(1 << 4)
     42#define DCSR_DONEB	(1 << 5)
     43#define DCSR_STRTB	(1 << 6)
     44#define DCSR_BIU	(1 << 7)
     45
     46#define DDAR_RW		(1 << 0)	/* 0 = W, 1 = R */
     47#define DDAR_E		(1 << 1)	/* 0 = LE, 1 = BE */
     48#define DDAR_BS		(1 << 2)	/* 0 = BS4, 1 = BS8 */
     49#define DDAR_DW		(1 << 3)	/* 0 = 8b, 1 = 16b */
     50#define DDAR_Ser0UDCTr	(0x0 << 4)
     51#define DDAR_Ser0UDCRc	(0x1 << 4)
     52#define DDAR_Ser1SDLCTr	(0x2 << 4)
     53#define DDAR_Ser1SDLCRc	(0x3 << 4)
     54#define DDAR_Ser1UARTTr	(0x4 << 4)
     55#define DDAR_Ser1UARTRc	(0x5 << 4)
     56#define DDAR_Ser2ICPTr	(0x6 << 4)
     57#define DDAR_Ser2ICPRc	(0x7 << 4)
     58#define DDAR_Ser3UARTTr	(0x8 << 4)
     59#define DDAR_Ser3UARTRc	(0x9 << 4)
     60#define DDAR_Ser4MCP0Tr	(0xa << 4)
     61#define DDAR_Ser4MCP0Rc	(0xb << 4)
     62#define DDAR_Ser4MCP1Tr	(0xc << 4)
     63#define DDAR_Ser4MCP1Rc	(0xd << 4)
     64#define DDAR_Ser4SSPTr	(0xe << 4)
     65#define DDAR_Ser4SSPRc	(0xf << 4)
     66
     67struct sa11x0_dma_sg {
     68	u32			addr;
     69	u32			len;
     70};
     71
     72struct sa11x0_dma_desc {
     73	struct virt_dma_desc	vd;
     74
     75	u32			ddar;
     76	size_t			size;
     77	unsigned		period;
     78	bool			cyclic;
     79
     80	unsigned		sglen;
     81	struct sa11x0_dma_sg	sg[];
     82};
     83
     84struct sa11x0_dma_phy;
     85
     86struct sa11x0_dma_chan {
     87	struct virt_dma_chan	vc;
     88
     89	/* protected by c->vc.lock */
     90	struct sa11x0_dma_phy	*phy;
     91	enum dma_status		status;
     92
     93	/* protected by d->lock */
     94	struct list_head	node;
     95
     96	u32			ddar;
     97	const char		*name;
     98};
     99
    100struct sa11x0_dma_phy {
    101	void __iomem		*base;
    102	struct sa11x0_dma_dev	*dev;
    103	unsigned		num;
    104
    105	struct sa11x0_dma_chan	*vchan;
    106
    107	/* Protected by c->vc.lock */
    108	unsigned		sg_load;
    109	struct sa11x0_dma_desc	*txd_load;
    110	unsigned		sg_done;
    111	struct sa11x0_dma_desc	*txd_done;
    112	u32			dbs[2];
    113	u32			dbt[2];
    114	u32			dcsr;
    115};
    116
    117struct sa11x0_dma_dev {
    118	struct dma_device	slave;
    119	void __iomem		*base;
    120	spinlock_t		lock;
    121	struct tasklet_struct	task;
    122	struct list_head	chan_pending;
    123	struct sa11x0_dma_phy	phy[NR_PHY_CHAN];
    124};
    125
    126static struct sa11x0_dma_chan *to_sa11x0_dma_chan(struct dma_chan *chan)
    127{
    128	return container_of(chan, struct sa11x0_dma_chan, vc.chan);
    129}
    130
    131static struct sa11x0_dma_dev *to_sa11x0_dma(struct dma_device *dmadev)
    132{
    133	return container_of(dmadev, struct sa11x0_dma_dev, slave);
    134}
    135
    136static struct sa11x0_dma_desc *sa11x0_dma_next_desc(struct sa11x0_dma_chan *c)
    137{
    138	struct virt_dma_desc *vd = vchan_next_desc(&c->vc);
    139
    140	return vd ? container_of(vd, struct sa11x0_dma_desc, vd) : NULL;
    141}
    142
    143static void sa11x0_dma_free_desc(struct virt_dma_desc *vd)
    144{
    145	kfree(container_of(vd, struct sa11x0_dma_desc, vd));
    146}
    147
    148static void sa11x0_dma_start_desc(struct sa11x0_dma_phy *p, struct sa11x0_dma_desc *txd)
    149{
    150	list_del(&txd->vd.node);
    151	p->txd_load = txd;
    152	p->sg_load = 0;
    153
    154	dev_vdbg(p->dev->slave.dev, "pchan %u: txd %p[%x]: starting: DDAR:%x\n",
    155		p->num, &txd->vd, txd->vd.tx.cookie, txd->ddar);
    156}
    157
    158static void noinline sa11x0_dma_start_sg(struct sa11x0_dma_phy *p,
    159	struct sa11x0_dma_chan *c)
    160{
    161	struct sa11x0_dma_desc *txd = p->txd_load;
    162	struct sa11x0_dma_sg *sg;
    163	void __iomem *base = p->base;
    164	unsigned dbsx, dbtx;
    165	u32 dcsr;
    166
    167	if (!txd)
    168		return;
    169
    170	dcsr = readl_relaxed(base + DMA_DCSR_R);
    171
    172	/* Don't try to load the next transfer if both buffers are started */
    173	if ((dcsr & (DCSR_STRTA | DCSR_STRTB)) == (DCSR_STRTA | DCSR_STRTB))
    174		return;
    175
    176	if (p->sg_load == txd->sglen) {
    177		if (!txd->cyclic) {
    178			struct sa11x0_dma_desc *txn = sa11x0_dma_next_desc(c);
    179
    180			/*
    181			 * We have reached the end of the current descriptor.
    182			 * Peek at the next descriptor, and if compatible with
    183			 * the current, start processing it.
    184			 */
    185			if (txn && txn->ddar == txd->ddar) {
    186				txd = txn;
    187				sa11x0_dma_start_desc(p, txn);
    188			} else {
    189				p->txd_load = NULL;
    190				return;
    191			}
    192		} else {
    193			/* Cyclic: reset back to beginning */
    194			p->sg_load = 0;
    195		}
    196	}
    197
    198	sg = &txd->sg[p->sg_load++];
    199
    200	/* Select buffer to load according to channel status */
    201	if (((dcsr & (DCSR_BIU | DCSR_STRTB)) == (DCSR_BIU | DCSR_STRTB)) ||
    202	    ((dcsr & (DCSR_BIU | DCSR_STRTA)) == 0)) {
    203		dbsx = DMA_DBSA;
    204		dbtx = DMA_DBTA;
    205		dcsr = DCSR_STRTA | DCSR_IE | DCSR_RUN;
    206	} else {
    207		dbsx = DMA_DBSB;
    208		dbtx = DMA_DBTB;
    209		dcsr = DCSR_STRTB | DCSR_IE | DCSR_RUN;
    210	}
    211
    212	writel_relaxed(sg->addr, base + dbsx);
    213	writel_relaxed(sg->len, base + dbtx);
    214	writel(dcsr, base + DMA_DCSR_S);
    215
    216	dev_dbg(p->dev->slave.dev, "pchan %u: load: DCSR:%02x DBS%c:%08x DBT%c:%08x\n",
    217		p->num, dcsr,
    218		'A' + (dbsx == DMA_DBSB), sg->addr,
    219		'A' + (dbtx == DMA_DBTB), sg->len);
    220}
    221
    222static void noinline sa11x0_dma_complete(struct sa11x0_dma_phy *p,
    223	struct sa11x0_dma_chan *c)
    224{
    225	struct sa11x0_dma_desc *txd = p->txd_done;
    226
    227	if (++p->sg_done == txd->sglen) {
    228		if (!txd->cyclic) {
    229			vchan_cookie_complete(&txd->vd);
    230
    231			p->sg_done = 0;
    232			p->txd_done = p->txd_load;
    233
    234			if (!p->txd_done)
    235				tasklet_schedule(&p->dev->task);
    236		} else {
    237			if ((p->sg_done % txd->period) == 0)
    238				vchan_cyclic_callback(&txd->vd);
    239
    240			/* Cyclic: reset back to beginning */
    241			p->sg_done = 0;
    242		}
    243	}
    244
    245	sa11x0_dma_start_sg(p, c);
    246}
    247
    248static irqreturn_t sa11x0_dma_irq(int irq, void *dev_id)
    249{
    250	struct sa11x0_dma_phy *p = dev_id;
    251	struct sa11x0_dma_dev *d = p->dev;
    252	struct sa11x0_dma_chan *c;
    253	u32 dcsr;
    254
    255	dcsr = readl_relaxed(p->base + DMA_DCSR_R);
    256	if (!(dcsr & (DCSR_ERROR | DCSR_DONEA | DCSR_DONEB)))
    257		return IRQ_NONE;
    258
    259	/* Clear reported status bits */
    260	writel_relaxed(dcsr & (DCSR_ERROR | DCSR_DONEA | DCSR_DONEB),
    261		p->base + DMA_DCSR_C);
    262
    263	dev_dbg(d->slave.dev, "pchan %u: irq: DCSR:%02x\n", p->num, dcsr);
    264
    265	if (dcsr & DCSR_ERROR) {
    266		dev_err(d->slave.dev, "pchan %u: error. DCSR:%02x DDAR:%08x DBSA:%08x DBTA:%08x DBSB:%08x DBTB:%08x\n",
    267			p->num, dcsr,
    268			readl_relaxed(p->base + DMA_DDAR),
    269			readl_relaxed(p->base + DMA_DBSA),
    270			readl_relaxed(p->base + DMA_DBTA),
    271			readl_relaxed(p->base + DMA_DBSB),
    272			readl_relaxed(p->base + DMA_DBTB));
    273	}
    274
    275	c = p->vchan;
    276	if (c) {
    277		unsigned long flags;
    278
    279		spin_lock_irqsave(&c->vc.lock, flags);
    280		/*
    281		 * Now that we're holding the lock, check that the vchan
    282		 * really is associated with this pchan before touching the
    283		 * hardware.  This should always succeed, because we won't
    284		 * change p->vchan or c->phy while the channel is actively
    285		 * transferring.
    286		 */
    287		if (c->phy == p) {
    288			if (dcsr & DCSR_DONEA)
    289				sa11x0_dma_complete(p, c);
    290			if (dcsr & DCSR_DONEB)
    291				sa11x0_dma_complete(p, c);
    292		}
    293		spin_unlock_irqrestore(&c->vc.lock, flags);
    294	}
    295
    296	return IRQ_HANDLED;
    297}
    298
    299static void sa11x0_dma_start_txd(struct sa11x0_dma_chan *c)
    300{
    301	struct sa11x0_dma_desc *txd = sa11x0_dma_next_desc(c);
    302
    303	/* If the issued list is empty, we have no further txds to process */
    304	if (txd) {
    305		struct sa11x0_dma_phy *p = c->phy;
    306
    307		sa11x0_dma_start_desc(p, txd);
    308		p->txd_done = txd;
    309		p->sg_done = 0;
    310
    311		/* The channel should not have any transfers started */
    312		WARN_ON(readl_relaxed(p->base + DMA_DCSR_R) &
    313				      (DCSR_STRTA | DCSR_STRTB));
    314
    315		/* Clear the run and start bits before changing DDAR */
    316		writel_relaxed(DCSR_RUN | DCSR_STRTA | DCSR_STRTB,
    317			       p->base + DMA_DCSR_C);
    318		writel_relaxed(txd->ddar, p->base + DMA_DDAR);
    319
    320		/* Try to start both buffers */
    321		sa11x0_dma_start_sg(p, c);
    322		sa11x0_dma_start_sg(p, c);
    323	}
    324}
    325
    326static void sa11x0_dma_tasklet(struct tasklet_struct *t)
    327{
    328	struct sa11x0_dma_dev *d = from_tasklet(d, t, task);
    329	struct sa11x0_dma_phy *p;
    330	struct sa11x0_dma_chan *c;
    331	unsigned pch, pch_alloc = 0;
    332
    333	dev_dbg(d->slave.dev, "tasklet enter\n");
    334
    335	list_for_each_entry(c, &d->slave.channels, vc.chan.device_node) {
    336		spin_lock_irq(&c->vc.lock);
    337		p = c->phy;
    338		if (p && !p->txd_done) {
    339			sa11x0_dma_start_txd(c);
    340			if (!p->txd_done) {
    341				/* No current txd associated with this channel */
    342				dev_dbg(d->slave.dev, "pchan %u: free\n", p->num);
    343
    344				/* Mark this channel free */
    345				c->phy = NULL;
    346				p->vchan = NULL;
    347			}
    348		}
    349		spin_unlock_irq(&c->vc.lock);
    350	}
    351
    352	spin_lock_irq(&d->lock);
    353	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
    354		p = &d->phy[pch];
    355
    356		if (p->vchan == NULL && !list_empty(&d->chan_pending)) {
    357			c = list_first_entry(&d->chan_pending,
    358				struct sa11x0_dma_chan, node);
    359			list_del_init(&c->node);
    360
    361			pch_alloc |= 1 << pch;
    362
    363			/* Mark this channel allocated */
    364			p->vchan = c;
    365
    366			dev_dbg(d->slave.dev, "pchan %u: alloc vchan %p\n", pch, &c->vc);
    367		}
    368	}
    369	spin_unlock_irq(&d->lock);
    370
    371	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
    372		if (pch_alloc & (1 << pch)) {
    373			p = &d->phy[pch];
    374			c = p->vchan;
    375
    376			spin_lock_irq(&c->vc.lock);
    377			c->phy = p;
    378
    379			sa11x0_dma_start_txd(c);
    380			spin_unlock_irq(&c->vc.lock);
    381		}
    382	}
    383
    384	dev_dbg(d->slave.dev, "tasklet exit\n");
    385}
    386
    387
    388static void sa11x0_dma_free_chan_resources(struct dma_chan *chan)
    389{
    390	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    391	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
    392	unsigned long flags;
    393
    394	spin_lock_irqsave(&d->lock, flags);
    395	list_del_init(&c->node);
    396	spin_unlock_irqrestore(&d->lock, flags);
    397
    398	vchan_free_chan_resources(&c->vc);
    399}
    400
    401static dma_addr_t sa11x0_dma_pos(struct sa11x0_dma_phy *p)
    402{
    403	unsigned reg;
    404	u32 dcsr;
    405
    406	dcsr = readl_relaxed(p->base + DMA_DCSR_R);
    407
    408	if ((dcsr & (DCSR_BIU | DCSR_STRTA)) == DCSR_STRTA ||
    409	    (dcsr & (DCSR_BIU | DCSR_STRTB)) == DCSR_BIU)
    410		reg = DMA_DBSA;
    411	else
    412		reg = DMA_DBSB;
    413
    414	return readl_relaxed(p->base + reg);
    415}
    416
    417static enum dma_status sa11x0_dma_tx_status(struct dma_chan *chan,
    418	dma_cookie_t cookie, struct dma_tx_state *state)
    419{
    420	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    421	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
    422	struct sa11x0_dma_phy *p;
    423	struct virt_dma_desc *vd;
    424	unsigned long flags;
    425	enum dma_status ret;
    426
    427	ret = dma_cookie_status(&c->vc.chan, cookie, state);
    428	if (ret == DMA_COMPLETE)
    429		return ret;
    430
    431	if (!state)
    432		return c->status;
    433
    434	spin_lock_irqsave(&c->vc.lock, flags);
    435	p = c->phy;
    436
    437	/*
    438	 * If the cookie is on our issue queue, then the residue is
    439	 * its total size.
    440	 */
    441	vd = vchan_find_desc(&c->vc, cookie);
    442	if (vd) {
    443		state->residue = container_of(vd, struct sa11x0_dma_desc, vd)->size;
    444	} else if (!p) {
    445		state->residue = 0;
    446	} else {
    447		struct sa11x0_dma_desc *txd;
    448		size_t bytes = 0;
    449
    450		if (p->txd_done && p->txd_done->vd.tx.cookie == cookie)
    451			txd = p->txd_done;
    452		else if (p->txd_load && p->txd_load->vd.tx.cookie == cookie)
    453			txd = p->txd_load;
    454		else
    455			txd = NULL;
    456
    457		ret = c->status;
    458		if (txd) {
    459			dma_addr_t addr = sa11x0_dma_pos(p);
    460			unsigned i;
    461
    462			dev_vdbg(d->slave.dev, "tx_status: addr:%pad\n", &addr);
    463
    464			for (i = 0; i < txd->sglen; i++) {
    465				dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x\n",
    466					i, txd->sg[i].addr, txd->sg[i].len);
    467				if (addr >= txd->sg[i].addr &&
    468				    addr < txd->sg[i].addr + txd->sg[i].len) {
    469					unsigned len;
    470
    471					len = txd->sg[i].len -
    472						(addr - txd->sg[i].addr);
    473					dev_vdbg(d->slave.dev, "tx_status: [%u] +%x\n",
    474						i, len);
    475					bytes += len;
    476					i++;
    477					break;
    478				}
    479			}
    480			for (; i < txd->sglen; i++) {
    481				dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x ++\n",
    482					i, txd->sg[i].addr, txd->sg[i].len);
    483				bytes += txd->sg[i].len;
    484			}
    485		}
    486		state->residue = bytes;
    487	}
    488	spin_unlock_irqrestore(&c->vc.lock, flags);
    489
    490	dev_vdbg(d->slave.dev, "tx_status: bytes 0x%x\n", state->residue);
    491
    492	return ret;
    493}
    494
    495/*
    496 * Move pending txds to the issued list, and re-init pending list.
    497 * If not already pending, add this channel to the list of pending
    498 * channels and trigger the tasklet to run.
    499 */
    500static void sa11x0_dma_issue_pending(struct dma_chan *chan)
    501{
    502	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    503	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
    504	unsigned long flags;
    505
    506	spin_lock_irqsave(&c->vc.lock, flags);
    507	if (vchan_issue_pending(&c->vc)) {
    508		if (!c->phy) {
    509			spin_lock(&d->lock);
    510			if (list_empty(&c->node)) {
    511				list_add_tail(&c->node, &d->chan_pending);
    512				tasklet_schedule(&d->task);
    513				dev_dbg(d->slave.dev, "vchan %p: issued\n", &c->vc);
    514			}
    515			spin_unlock(&d->lock);
    516		}
    517	} else
    518		dev_dbg(d->slave.dev, "vchan %p: nothing to issue\n", &c->vc);
    519	spin_unlock_irqrestore(&c->vc.lock, flags);
    520}
    521
    522static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
    523	struct dma_chan *chan, struct scatterlist *sg, unsigned int sglen,
    524	enum dma_transfer_direction dir, unsigned long flags, void *context)
    525{
    526	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    527	struct sa11x0_dma_desc *txd;
    528	struct scatterlist *sgent;
    529	unsigned i, j = sglen;
    530	size_t size = 0;
    531
    532	/* SA11x0 channels can only operate in their native direction */
    533	if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
    534		dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
    535			&c->vc, c->ddar, dir);
    536		return NULL;
    537	}
    538
    539	/* Do not allow zero-sized txds */
    540	if (sglen == 0)
    541		return NULL;
    542
    543	for_each_sg(sg, sgent, sglen, i) {
    544		dma_addr_t addr = sg_dma_address(sgent);
    545		unsigned int len = sg_dma_len(sgent);
    546
    547		if (len > DMA_MAX_SIZE)
    548			j += DIV_ROUND_UP(len, DMA_MAX_SIZE & ~DMA_ALIGN) - 1;
    549		if (addr & DMA_ALIGN) {
    550			dev_dbg(chan->device->dev, "vchan %p: bad buffer alignment: %pad\n",
    551				&c->vc, &addr);
    552			return NULL;
    553		}
    554	}
    555
    556	txd = kzalloc(struct_size(txd, sg, j), GFP_ATOMIC);
    557	if (!txd) {
    558		dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
    559		return NULL;
    560	}
    561
    562	j = 0;
    563	for_each_sg(sg, sgent, sglen, i) {
    564		dma_addr_t addr = sg_dma_address(sgent);
    565		unsigned len = sg_dma_len(sgent);
    566
    567		size += len;
    568
    569		do {
    570			unsigned tlen = len;
    571
    572			/*
    573			 * Check whether the transfer will fit.  If not, try
    574			 * to split the transfer up such that we end up with
    575			 * equal chunks - but make sure that we preserve the
    576			 * alignment.  This avoids small segments.
    577			 */
    578			if (tlen > DMA_MAX_SIZE) {
    579				unsigned mult = DIV_ROUND_UP(tlen,
    580					DMA_MAX_SIZE & ~DMA_ALIGN);
    581
    582				tlen = (tlen / mult) & ~DMA_ALIGN;
    583			}
    584
    585			txd->sg[j].addr = addr;
    586			txd->sg[j].len = tlen;
    587
    588			addr += tlen;
    589			len -= tlen;
    590			j++;
    591		} while (len);
    592	}
    593
    594	txd->ddar = c->ddar;
    595	txd->size = size;
    596	txd->sglen = j;
    597
    598	dev_dbg(chan->device->dev, "vchan %p: txd %p: size %zu nr %u\n",
    599		&c->vc, &txd->vd, txd->size, txd->sglen);
    600
    601	return vchan_tx_prep(&c->vc, &txd->vd, flags);
    602}
    603
    604static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
    605	struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
    606	enum dma_transfer_direction dir, unsigned long flags)
    607{
    608	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    609	struct sa11x0_dma_desc *txd;
    610	unsigned i, j, k, sglen, sgperiod;
    611
    612	/* SA11x0 channels can only operate in their native direction */
    613	if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
    614		dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
    615			&c->vc, c->ddar, dir);
    616		return NULL;
    617	}
    618
    619	sgperiod = DIV_ROUND_UP(period, DMA_MAX_SIZE & ~DMA_ALIGN);
    620	sglen = size * sgperiod / period;
    621
    622	/* Do not allow zero-sized txds */
    623	if (sglen == 0)
    624		return NULL;
    625
    626	txd = kzalloc(struct_size(txd, sg, sglen), GFP_ATOMIC);
    627	if (!txd) {
    628		dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
    629		return NULL;
    630	}
    631
    632	for (i = k = 0; i < size / period; i++) {
    633		size_t tlen, len = period;
    634
    635		for (j = 0; j < sgperiod; j++, k++) {
    636			tlen = len;
    637
    638			if (tlen > DMA_MAX_SIZE) {
    639				unsigned mult = DIV_ROUND_UP(tlen, DMA_MAX_SIZE & ~DMA_ALIGN);
    640				tlen = (tlen / mult) & ~DMA_ALIGN;
    641			}
    642
    643			txd->sg[k].addr = addr;
    644			txd->sg[k].len = tlen;
    645			addr += tlen;
    646			len -= tlen;
    647		}
    648
    649		WARN_ON(len != 0);
    650	}
    651
    652	WARN_ON(k != sglen);
    653
    654	txd->ddar = c->ddar;
    655	txd->size = size;
    656	txd->sglen = sglen;
    657	txd->cyclic = 1;
    658	txd->period = sgperiod;
    659
    660	return vchan_tx_prep(&c->vc, &txd->vd, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
    661}
    662
    663static int sa11x0_dma_device_config(struct dma_chan *chan,
    664				    struct dma_slave_config *cfg)
    665{
    666	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    667	u32 ddar = c->ddar & ((0xf << 4) | DDAR_RW);
    668	dma_addr_t addr;
    669	enum dma_slave_buswidth width;
    670	u32 maxburst;
    671
    672	if (ddar & DDAR_RW) {
    673		addr = cfg->src_addr;
    674		width = cfg->src_addr_width;
    675		maxburst = cfg->src_maxburst;
    676	} else {
    677		addr = cfg->dst_addr;
    678		width = cfg->dst_addr_width;
    679		maxburst = cfg->dst_maxburst;
    680	}
    681
    682	if ((width != DMA_SLAVE_BUSWIDTH_1_BYTE &&
    683	     width != DMA_SLAVE_BUSWIDTH_2_BYTES) ||
    684	    (maxburst != 4 && maxburst != 8))
    685		return -EINVAL;
    686
    687	if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
    688		ddar |= DDAR_DW;
    689	if (maxburst == 8)
    690		ddar |= DDAR_BS;
    691
    692	dev_dbg(c->vc.chan.device->dev, "vchan %p: dma_slave_config addr %pad width %u burst %u\n",
    693		&c->vc, &addr, width, maxburst);
    694
    695	c->ddar = ddar | (addr & 0xf0000000) | (addr & 0x003ffffc) << 6;
    696
    697	return 0;
    698}
    699
    700static int sa11x0_dma_device_pause(struct dma_chan *chan)
    701{
    702	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    703	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
    704	struct sa11x0_dma_phy *p;
    705	unsigned long flags;
    706
    707	dev_dbg(d->slave.dev, "vchan %p: pause\n", &c->vc);
    708	spin_lock_irqsave(&c->vc.lock, flags);
    709	if (c->status == DMA_IN_PROGRESS) {
    710		c->status = DMA_PAUSED;
    711
    712		p = c->phy;
    713		if (p) {
    714			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_C);
    715		} else {
    716			spin_lock(&d->lock);
    717			list_del_init(&c->node);
    718			spin_unlock(&d->lock);
    719		}
    720	}
    721	spin_unlock_irqrestore(&c->vc.lock, flags);
    722
    723	return 0;
    724}
    725
    726static int sa11x0_dma_device_resume(struct dma_chan *chan)
    727{
    728	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    729	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
    730	struct sa11x0_dma_phy *p;
    731	unsigned long flags;
    732
    733	dev_dbg(d->slave.dev, "vchan %p: resume\n", &c->vc);
    734	spin_lock_irqsave(&c->vc.lock, flags);
    735	if (c->status == DMA_PAUSED) {
    736		c->status = DMA_IN_PROGRESS;
    737
    738		p = c->phy;
    739		if (p) {
    740			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_S);
    741		} else if (!list_empty(&c->vc.desc_issued)) {
    742			spin_lock(&d->lock);
    743			list_add_tail(&c->node, &d->chan_pending);
    744			spin_unlock(&d->lock);
    745		}
    746	}
    747	spin_unlock_irqrestore(&c->vc.lock, flags);
    748
    749	return 0;
    750}
    751
    752static int sa11x0_dma_device_terminate_all(struct dma_chan *chan)
    753{
    754	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    755	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
    756	struct sa11x0_dma_phy *p;
    757	LIST_HEAD(head);
    758	unsigned long flags;
    759
    760	dev_dbg(d->slave.dev, "vchan %p: terminate all\n", &c->vc);
    761	/* Clear the tx descriptor lists */
    762	spin_lock_irqsave(&c->vc.lock, flags);
    763	vchan_get_all_descriptors(&c->vc, &head);
    764
    765	p = c->phy;
    766	if (p) {
    767		dev_dbg(d->slave.dev, "pchan %u: terminating\n", p->num);
    768		/* vchan is assigned to a pchan - stop the channel */
    769		writel(DCSR_RUN | DCSR_IE |
    770		       DCSR_STRTA | DCSR_DONEA |
    771		       DCSR_STRTB | DCSR_DONEB,
    772		       p->base + DMA_DCSR_C);
    773
    774		if (p->txd_load) {
    775			if (p->txd_load != p->txd_done)
    776				list_add_tail(&p->txd_load->vd.node, &head);
    777			p->txd_load = NULL;
    778		}
    779		if (p->txd_done) {
    780			list_add_tail(&p->txd_done->vd.node, &head);
    781			p->txd_done = NULL;
    782		}
    783		c->phy = NULL;
    784		spin_lock(&d->lock);
    785		p->vchan = NULL;
    786		spin_unlock(&d->lock);
    787		tasklet_schedule(&d->task);
    788	}
    789	spin_unlock_irqrestore(&c->vc.lock, flags);
    790	vchan_dma_desc_free_list(&c->vc, &head);
    791
    792	return 0;
    793}
    794
    795struct sa11x0_dma_channel_desc {
    796	u32 ddar;
    797	const char *name;
    798};
    799
    800#define CD(d1, d2) { .ddar = DDAR_##d1 | d2, .name = #d1 }
    801static const struct sa11x0_dma_channel_desc chan_desc[] = {
    802	CD(Ser0UDCTr, 0),
    803	CD(Ser0UDCRc, DDAR_RW),
    804	CD(Ser1SDLCTr, 0),
    805	CD(Ser1SDLCRc, DDAR_RW),
    806	CD(Ser1UARTTr, 0),
    807	CD(Ser1UARTRc, DDAR_RW),
    808	CD(Ser2ICPTr, 0),
    809	CD(Ser2ICPRc, DDAR_RW),
    810	CD(Ser3UARTTr, 0),
    811	CD(Ser3UARTRc, DDAR_RW),
    812	CD(Ser4MCP0Tr, 0),
    813	CD(Ser4MCP0Rc, DDAR_RW),
    814	CD(Ser4MCP1Tr, 0),
    815	CD(Ser4MCP1Rc, DDAR_RW),
    816	CD(Ser4SSPTr, 0),
    817	CD(Ser4SSPRc, DDAR_RW),
    818};
    819
    820static const struct dma_slave_map sa11x0_dma_map[] = {
    821	{ "sa11x0-ir", "tx", "Ser2ICPTr" },
    822	{ "sa11x0-ir", "rx", "Ser2ICPRc" },
    823	{ "sa11x0-ssp", "tx", "Ser4SSPTr" },
    824	{ "sa11x0-ssp", "rx", "Ser4SSPRc" },
    825};
    826
    827static bool sa11x0_dma_filter_fn(struct dma_chan *chan, void *param)
    828{
    829	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
    830	const char *p = param;
    831
    832	return !strcmp(c->name, p);
    833}
    834
    835static int sa11x0_dma_init_dmadev(struct dma_device *dmadev,
    836	struct device *dev)
    837{
    838	unsigned i;
    839
    840	INIT_LIST_HEAD(&dmadev->channels);
    841	dmadev->dev = dev;
    842	dmadev->device_free_chan_resources = sa11x0_dma_free_chan_resources;
    843	dmadev->device_config = sa11x0_dma_device_config;
    844	dmadev->device_pause = sa11x0_dma_device_pause;
    845	dmadev->device_resume = sa11x0_dma_device_resume;
    846	dmadev->device_terminate_all = sa11x0_dma_device_terminate_all;
    847	dmadev->device_tx_status = sa11x0_dma_tx_status;
    848	dmadev->device_issue_pending = sa11x0_dma_issue_pending;
    849
    850	for (i = 0; i < ARRAY_SIZE(chan_desc); i++) {
    851		struct sa11x0_dma_chan *c;
    852
    853		c = kzalloc(sizeof(*c), GFP_KERNEL);
    854		if (!c) {
    855			dev_err(dev, "no memory for channel %u\n", i);
    856			return -ENOMEM;
    857		}
    858
    859		c->status = DMA_IN_PROGRESS;
    860		c->ddar = chan_desc[i].ddar;
    861		c->name = chan_desc[i].name;
    862		INIT_LIST_HEAD(&c->node);
    863
    864		c->vc.desc_free = sa11x0_dma_free_desc;
    865		vchan_init(&c->vc, dmadev);
    866	}
    867
    868	return dma_async_device_register(dmadev);
    869}
    870
    871static int sa11x0_dma_request_irq(struct platform_device *pdev, int nr,
    872	void *data)
    873{
    874	int irq = platform_get_irq(pdev, nr);
    875
    876	if (irq <= 0)
    877		return -ENXIO;
    878
    879	return request_irq(irq, sa11x0_dma_irq, 0, dev_name(&pdev->dev), data);
    880}
    881
    882static void sa11x0_dma_free_irq(struct platform_device *pdev, int nr,
    883	void *data)
    884{
    885	int irq = platform_get_irq(pdev, nr);
    886	if (irq > 0)
    887		free_irq(irq, data);
    888}
    889
    890static void sa11x0_dma_free_channels(struct dma_device *dmadev)
    891{
    892	struct sa11x0_dma_chan *c, *cn;
    893
    894	list_for_each_entry_safe(c, cn, &dmadev->channels, vc.chan.device_node) {
    895		list_del(&c->vc.chan.device_node);
    896		tasklet_kill(&c->vc.task);
    897		kfree(c);
    898	}
    899}
    900
    901static int sa11x0_dma_probe(struct platform_device *pdev)
    902{
    903	struct sa11x0_dma_dev *d;
    904	struct resource *res;
    905	unsigned i;
    906	int ret;
    907
    908	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    909	if (!res)
    910		return -ENXIO;
    911
    912	d = kzalloc(sizeof(*d), GFP_KERNEL);
    913	if (!d) {
    914		ret = -ENOMEM;
    915		goto err_alloc;
    916	}
    917
    918	spin_lock_init(&d->lock);
    919	INIT_LIST_HEAD(&d->chan_pending);
    920
    921	d->slave.filter.fn = sa11x0_dma_filter_fn;
    922	d->slave.filter.mapcnt = ARRAY_SIZE(sa11x0_dma_map);
    923	d->slave.filter.map = sa11x0_dma_map;
    924
    925	d->base = ioremap(res->start, resource_size(res));
    926	if (!d->base) {
    927		ret = -ENOMEM;
    928		goto err_ioremap;
    929	}
    930
    931	tasklet_setup(&d->task, sa11x0_dma_tasklet);
    932
    933	for (i = 0; i < NR_PHY_CHAN; i++) {
    934		struct sa11x0_dma_phy *p = &d->phy[i];
    935
    936		p->dev = d;
    937		p->num = i;
    938		p->base = d->base + i * DMA_SIZE;
    939		writel_relaxed(DCSR_RUN | DCSR_IE | DCSR_ERROR |
    940			DCSR_DONEA | DCSR_STRTA | DCSR_DONEB | DCSR_STRTB,
    941			p->base + DMA_DCSR_C);
    942		writel_relaxed(0, p->base + DMA_DDAR);
    943
    944		ret = sa11x0_dma_request_irq(pdev, i, p);
    945		if (ret) {
    946			while (i) {
    947				i--;
    948				sa11x0_dma_free_irq(pdev, i, &d->phy[i]);
    949			}
    950			goto err_irq;
    951		}
    952	}
    953
    954	dma_cap_set(DMA_SLAVE, d->slave.cap_mask);
    955	dma_cap_set(DMA_CYCLIC, d->slave.cap_mask);
    956	d->slave.device_prep_slave_sg = sa11x0_dma_prep_slave_sg;
    957	d->slave.device_prep_dma_cyclic = sa11x0_dma_prep_dma_cyclic;
    958	d->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
    959	d->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
    960	d->slave.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
    961				   BIT(DMA_SLAVE_BUSWIDTH_2_BYTES);
    962	d->slave.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
    963				   BIT(DMA_SLAVE_BUSWIDTH_2_BYTES);
    964	ret = sa11x0_dma_init_dmadev(&d->slave, &pdev->dev);
    965	if (ret) {
    966		dev_warn(d->slave.dev, "failed to register slave async device: %d\n",
    967			ret);
    968		goto err_slave_reg;
    969	}
    970
    971	platform_set_drvdata(pdev, d);
    972	return 0;
    973
    974 err_slave_reg:
    975	sa11x0_dma_free_channels(&d->slave);
    976	for (i = 0; i < NR_PHY_CHAN; i++)
    977		sa11x0_dma_free_irq(pdev, i, &d->phy[i]);
    978 err_irq:
    979	tasklet_kill(&d->task);
    980	iounmap(d->base);
    981 err_ioremap:
    982	kfree(d);
    983 err_alloc:
    984	return ret;
    985}
    986
    987static int sa11x0_dma_remove(struct platform_device *pdev)
    988{
    989	struct sa11x0_dma_dev *d = platform_get_drvdata(pdev);
    990	unsigned pch;
    991
    992	dma_async_device_unregister(&d->slave);
    993
    994	sa11x0_dma_free_channels(&d->slave);
    995	for (pch = 0; pch < NR_PHY_CHAN; pch++)
    996		sa11x0_dma_free_irq(pdev, pch, &d->phy[pch]);
    997	tasklet_kill(&d->task);
    998	iounmap(d->base);
    999	kfree(d);
   1000
   1001	return 0;
   1002}
   1003
   1004static __maybe_unused int sa11x0_dma_suspend(struct device *dev)
   1005{
   1006	struct sa11x0_dma_dev *d = dev_get_drvdata(dev);
   1007	unsigned pch;
   1008
   1009	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
   1010		struct sa11x0_dma_phy *p = &d->phy[pch];
   1011		u32 dcsr, saved_dcsr;
   1012
   1013		dcsr = saved_dcsr = readl_relaxed(p->base + DMA_DCSR_R);
   1014		if (dcsr & DCSR_RUN) {
   1015			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_C);
   1016			dcsr = readl_relaxed(p->base + DMA_DCSR_R);
   1017		}
   1018
   1019		saved_dcsr &= DCSR_RUN | DCSR_IE;
   1020		if (dcsr & DCSR_BIU) {
   1021			p->dbs[0] = readl_relaxed(p->base + DMA_DBSB);
   1022			p->dbt[0] = readl_relaxed(p->base + DMA_DBTB);
   1023			p->dbs[1] = readl_relaxed(p->base + DMA_DBSA);
   1024			p->dbt[1] = readl_relaxed(p->base + DMA_DBTA);
   1025			saved_dcsr |= (dcsr & DCSR_STRTA ? DCSR_STRTB : 0) |
   1026				      (dcsr & DCSR_STRTB ? DCSR_STRTA : 0);
   1027		} else {
   1028			p->dbs[0] = readl_relaxed(p->base + DMA_DBSA);
   1029			p->dbt[0] = readl_relaxed(p->base + DMA_DBTA);
   1030			p->dbs[1] = readl_relaxed(p->base + DMA_DBSB);
   1031			p->dbt[1] = readl_relaxed(p->base + DMA_DBTB);
   1032			saved_dcsr |= dcsr & (DCSR_STRTA | DCSR_STRTB);
   1033		}
   1034		p->dcsr = saved_dcsr;
   1035
   1036		writel(DCSR_STRTA | DCSR_STRTB, p->base + DMA_DCSR_C);
   1037	}
   1038
   1039	return 0;
   1040}
   1041
   1042static __maybe_unused int sa11x0_dma_resume(struct device *dev)
   1043{
   1044	struct sa11x0_dma_dev *d = dev_get_drvdata(dev);
   1045	unsigned pch;
   1046
   1047	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
   1048		struct sa11x0_dma_phy *p = &d->phy[pch];
   1049		struct sa11x0_dma_desc *txd = NULL;
   1050		u32 dcsr = readl_relaxed(p->base + DMA_DCSR_R);
   1051
   1052		WARN_ON(dcsr & (DCSR_BIU | DCSR_STRTA | DCSR_STRTB | DCSR_RUN));
   1053
   1054		if (p->txd_done)
   1055			txd = p->txd_done;
   1056		else if (p->txd_load)
   1057			txd = p->txd_load;
   1058
   1059		if (!txd)
   1060			continue;
   1061
   1062		writel_relaxed(txd->ddar, p->base + DMA_DDAR);
   1063
   1064		writel_relaxed(p->dbs[0], p->base + DMA_DBSA);
   1065		writel_relaxed(p->dbt[0], p->base + DMA_DBTA);
   1066		writel_relaxed(p->dbs[1], p->base + DMA_DBSB);
   1067		writel_relaxed(p->dbt[1], p->base + DMA_DBTB);
   1068		writel_relaxed(p->dcsr, p->base + DMA_DCSR_S);
   1069	}
   1070
   1071	return 0;
   1072}
   1073
   1074static const struct dev_pm_ops sa11x0_dma_pm_ops = {
   1075	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sa11x0_dma_suspend, sa11x0_dma_resume)
   1076};
   1077
   1078static struct platform_driver sa11x0_dma_driver = {
   1079	.driver = {
   1080		.name	= "sa11x0-dma",
   1081		.pm	= &sa11x0_dma_pm_ops,
   1082	},
   1083	.probe		= sa11x0_dma_probe,
   1084	.remove		= sa11x0_dma_remove,
   1085};
   1086
   1087static int __init sa11x0_dma_init(void)
   1088{
   1089	return platform_driver_register(&sa11x0_dma_driver);
   1090}
   1091subsys_initcall(sa11x0_dma_init);
   1092
   1093static void __exit sa11x0_dma_exit(void)
   1094{
   1095	platform_driver_unregister(&sa11x0_dma_driver);
   1096}
   1097module_exit(sa11x0_dma_exit);
   1098
   1099MODULE_AUTHOR("Russell King");
   1100MODULE_DESCRIPTION("SA-11x0 DMA driver");
   1101MODULE_LICENSE("GPL v2");
   1102MODULE_ALIAS("platform:sa11x0-dma");