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

img-mdc-dma.c (28477B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * IMG Multi-threaded DMA Controller (MDC)
      4 *
      5 * Copyright (C) 2009,2012,2013 Imagination Technologies Ltd.
      6 * Copyright (C) 2014 Google, Inc.
      7 */
      8
      9#include <linux/clk.h>
     10#include <linux/dma-mapping.h>
     11#include <linux/dmaengine.h>
     12#include <linux/dmapool.h>
     13#include <linux/interrupt.h>
     14#include <linux/io.h>
     15#include <linux/irq.h>
     16#include <linux/kernel.h>
     17#include <linux/mfd/syscon.h>
     18#include <linux/module.h>
     19#include <linux/of.h>
     20#include <linux/of_device.h>
     21#include <linux/of_dma.h>
     22#include <linux/platform_device.h>
     23#include <linux/pm_runtime.h>
     24#include <linux/regmap.h>
     25#include <linux/slab.h>
     26#include <linux/spinlock.h>
     27
     28#include "dmaengine.h"
     29#include "virt-dma.h"
     30
     31#define MDC_MAX_DMA_CHANNELS			32
     32
     33#define MDC_GENERAL_CONFIG			0x000
     34#define MDC_GENERAL_CONFIG_LIST_IEN		BIT(31)
     35#define MDC_GENERAL_CONFIG_IEN			BIT(29)
     36#define MDC_GENERAL_CONFIG_LEVEL_INT		BIT(28)
     37#define MDC_GENERAL_CONFIG_INC_W		BIT(12)
     38#define MDC_GENERAL_CONFIG_INC_R		BIT(8)
     39#define MDC_GENERAL_CONFIG_PHYSICAL_W		BIT(7)
     40#define MDC_GENERAL_CONFIG_WIDTH_W_SHIFT	4
     41#define MDC_GENERAL_CONFIG_WIDTH_W_MASK		0x7
     42#define MDC_GENERAL_CONFIG_PHYSICAL_R		BIT(3)
     43#define MDC_GENERAL_CONFIG_WIDTH_R_SHIFT	0
     44#define MDC_GENERAL_CONFIG_WIDTH_R_MASK		0x7
     45
     46#define MDC_READ_PORT_CONFIG			0x004
     47#define MDC_READ_PORT_CONFIG_STHREAD_SHIFT	28
     48#define MDC_READ_PORT_CONFIG_STHREAD_MASK	0xf
     49#define MDC_READ_PORT_CONFIG_RTHREAD_SHIFT	24
     50#define MDC_READ_PORT_CONFIG_RTHREAD_MASK	0xf
     51#define MDC_READ_PORT_CONFIG_WTHREAD_SHIFT	16
     52#define MDC_READ_PORT_CONFIG_WTHREAD_MASK	0xf
     53#define MDC_READ_PORT_CONFIG_BURST_SIZE_SHIFT	4
     54#define MDC_READ_PORT_CONFIG_BURST_SIZE_MASK	0xff
     55#define MDC_READ_PORT_CONFIG_DREQ_ENABLE	BIT(1)
     56
     57#define MDC_READ_ADDRESS			0x008
     58
     59#define MDC_WRITE_ADDRESS			0x00c
     60
     61#define MDC_TRANSFER_SIZE			0x010
     62#define MDC_TRANSFER_SIZE_MASK			0xffffff
     63
     64#define MDC_LIST_NODE_ADDRESS			0x014
     65
     66#define MDC_CMDS_PROCESSED			0x018
     67#define MDC_CMDS_PROCESSED_CMDS_PROCESSED_SHIFT	16
     68#define MDC_CMDS_PROCESSED_CMDS_PROCESSED_MASK	0x3f
     69#define MDC_CMDS_PROCESSED_INT_ACTIVE		BIT(8)
     70#define MDC_CMDS_PROCESSED_CMDS_DONE_SHIFT	0
     71#define MDC_CMDS_PROCESSED_CMDS_DONE_MASK	0x3f
     72
     73#define MDC_CONTROL_AND_STATUS			0x01c
     74#define MDC_CONTROL_AND_STATUS_CANCEL		BIT(20)
     75#define MDC_CONTROL_AND_STATUS_LIST_EN		BIT(4)
     76#define MDC_CONTROL_AND_STATUS_EN		BIT(0)
     77
     78#define MDC_ACTIVE_TRANSFER_SIZE		0x030
     79
     80#define MDC_GLOBAL_CONFIG_A				0x900
     81#define MDC_GLOBAL_CONFIG_A_THREAD_ID_WIDTH_SHIFT	16
     82#define MDC_GLOBAL_CONFIG_A_THREAD_ID_WIDTH_MASK	0xff
     83#define MDC_GLOBAL_CONFIG_A_DMA_CONTEXTS_SHIFT		8
     84#define MDC_GLOBAL_CONFIG_A_DMA_CONTEXTS_MASK		0xff
     85#define MDC_GLOBAL_CONFIG_A_SYS_DAT_WIDTH_SHIFT		0
     86#define MDC_GLOBAL_CONFIG_A_SYS_DAT_WIDTH_MASK		0xff
     87
     88struct mdc_hw_list_desc {
     89	u32 gen_conf;
     90	u32 readport_conf;
     91	u32 read_addr;
     92	u32 write_addr;
     93	u32 xfer_size;
     94	u32 node_addr;
     95	u32 cmds_done;
     96	u32 ctrl_status;
     97	/*
     98	 * Not part of the list descriptor, but instead used by the CPU to
     99	 * traverse the list.
    100	 */
    101	struct mdc_hw_list_desc *next_desc;
    102};
    103
    104struct mdc_tx_desc {
    105	struct mdc_chan *chan;
    106	struct virt_dma_desc vd;
    107	dma_addr_t list_phys;
    108	struct mdc_hw_list_desc *list;
    109	bool cyclic;
    110	bool cmd_loaded;
    111	unsigned int list_len;
    112	unsigned int list_period_len;
    113	size_t list_xfer_size;
    114	unsigned int list_cmds_done;
    115};
    116
    117struct mdc_chan {
    118	struct mdc_dma *mdma;
    119	struct virt_dma_chan vc;
    120	struct dma_slave_config config;
    121	struct mdc_tx_desc *desc;
    122	int irq;
    123	unsigned int periph;
    124	unsigned int thread;
    125	unsigned int chan_nr;
    126};
    127
    128struct mdc_dma_soc_data {
    129	void (*enable_chan)(struct mdc_chan *mchan);
    130	void (*disable_chan)(struct mdc_chan *mchan);
    131};
    132
    133struct mdc_dma {
    134	struct dma_device dma_dev;
    135	void __iomem *regs;
    136	struct clk *clk;
    137	struct dma_pool *desc_pool;
    138	struct regmap *periph_regs;
    139	spinlock_t lock;
    140	unsigned int nr_threads;
    141	unsigned int nr_channels;
    142	unsigned int bus_width;
    143	unsigned int max_burst_mult;
    144	unsigned int max_xfer_size;
    145	const struct mdc_dma_soc_data *soc;
    146	struct mdc_chan channels[MDC_MAX_DMA_CHANNELS];
    147};
    148
    149static inline u32 mdc_readl(struct mdc_dma *mdma, u32 reg)
    150{
    151	return readl(mdma->regs + reg);
    152}
    153
    154static inline void mdc_writel(struct mdc_dma *mdma, u32 val, u32 reg)
    155{
    156	writel(val, mdma->regs + reg);
    157}
    158
    159static inline u32 mdc_chan_readl(struct mdc_chan *mchan, u32 reg)
    160{
    161	return mdc_readl(mchan->mdma, mchan->chan_nr * 0x040 + reg);
    162}
    163
    164static inline void mdc_chan_writel(struct mdc_chan *mchan, u32 val, u32 reg)
    165{
    166	mdc_writel(mchan->mdma, val, mchan->chan_nr * 0x040 + reg);
    167}
    168
    169static inline struct mdc_chan *to_mdc_chan(struct dma_chan *c)
    170{
    171	return container_of(to_virt_chan(c), struct mdc_chan, vc);
    172}
    173
    174static inline struct mdc_tx_desc *to_mdc_desc(struct dma_async_tx_descriptor *t)
    175{
    176	struct virt_dma_desc *vdesc = container_of(t, struct virt_dma_desc, tx);
    177
    178	return container_of(vdesc, struct mdc_tx_desc, vd);
    179}
    180
    181static inline struct device *mdma2dev(struct mdc_dma *mdma)
    182{
    183	return mdma->dma_dev.dev;
    184}
    185
    186static inline unsigned int to_mdc_width(unsigned int bytes)
    187{
    188	return ffs(bytes) - 1;
    189}
    190
    191static inline void mdc_set_read_width(struct mdc_hw_list_desc *ldesc,
    192				      unsigned int bytes)
    193{
    194	ldesc->gen_conf |= to_mdc_width(bytes) <<
    195		MDC_GENERAL_CONFIG_WIDTH_R_SHIFT;
    196}
    197
    198static inline void mdc_set_write_width(struct mdc_hw_list_desc *ldesc,
    199				       unsigned int bytes)
    200{
    201	ldesc->gen_conf |= to_mdc_width(bytes) <<
    202		MDC_GENERAL_CONFIG_WIDTH_W_SHIFT;
    203}
    204
    205static void mdc_list_desc_config(struct mdc_chan *mchan,
    206				 struct mdc_hw_list_desc *ldesc,
    207				 enum dma_transfer_direction dir,
    208				 dma_addr_t src, dma_addr_t dst, size_t len)
    209{
    210	struct mdc_dma *mdma = mchan->mdma;
    211	unsigned int max_burst, burst_size;
    212
    213	ldesc->gen_conf = MDC_GENERAL_CONFIG_IEN | MDC_GENERAL_CONFIG_LIST_IEN |
    214		MDC_GENERAL_CONFIG_LEVEL_INT | MDC_GENERAL_CONFIG_PHYSICAL_W |
    215		MDC_GENERAL_CONFIG_PHYSICAL_R;
    216	ldesc->readport_conf =
    217		(mchan->thread << MDC_READ_PORT_CONFIG_STHREAD_SHIFT) |
    218		(mchan->thread << MDC_READ_PORT_CONFIG_RTHREAD_SHIFT) |
    219		(mchan->thread << MDC_READ_PORT_CONFIG_WTHREAD_SHIFT);
    220	ldesc->read_addr = src;
    221	ldesc->write_addr = dst;
    222	ldesc->xfer_size = len - 1;
    223	ldesc->node_addr = 0;
    224	ldesc->cmds_done = 0;
    225	ldesc->ctrl_status = MDC_CONTROL_AND_STATUS_LIST_EN |
    226		MDC_CONTROL_AND_STATUS_EN;
    227	ldesc->next_desc = NULL;
    228
    229	if (IS_ALIGNED(dst, mdma->bus_width) &&
    230	    IS_ALIGNED(src, mdma->bus_width))
    231		max_burst = mdma->bus_width * mdma->max_burst_mult;
    232	else
    233		max_burst = mdma->bus_width * (mdma->max_burst_mult - 1);
    234
    235	if (dir == DMA_MEM_TO_DEV) {
    236		ldesc->gen_conf |= MDC_GENERAL_CONFIG_INC_R;
    237		ldesc->readport_conf |= MDC_READ_PORT_CONFIG_DREQ_ENABLE;
    238		mdc_set_read_width(ldesc, mdma->bus_width);
    239		mdc_set_write_width(ldesc, mchan->config.dst_addr_width);
    240		burst_size = min(max_burst, mchan->config.dst_maxburst *
    241				 mchan->config.dst_addr_width);
    242	} else if (dir == DMA_DEV_TO_MEM) {
    243		ldesc->gen_conf |= MDC_GENERAL_CONFIG_INC_W;
    244		ldesc->readport_conf |= MDC_READ_PORT_CONFIG_DREQ_ENABLE;
    245		mdc_set_read_width(ldesc, mchan->config.src_addr_width);
    246		mdc_set_write_width(ldesc, mdma->bus_width);
    247		burst_size = min(max_burst, mchan->config.src_maxburst *
    248				 mchan->config.src_addr_width);
    249	} else {
    250		ldesc->gen_conf |= MDC_GENERAL_CONFIG_INC_R |
    251			MDC_GENERAL_CONFIG_INC_W;
    252		mdc_set_read_width(ldesc, mdma->bus_width);
    253		mdc_set_write_width(ldesc, mdma->bus_width);
    254		burst_size = max_burst;
    255	}
    256	ldesc->readport_conf |= (burst_size - 1) <<
    257		MDC_READ_PORT_CONFIG_BURST_SIZE_SHIFT;
    258}
    259
    260static void mdc_list_desc_free(struct mdc_tx_desc *mdesc)
    261{
    262	struct mdc_dma *mdma = mdesc->chan->mdma;
    263	struct mdc_hw_list_desc *curr, *next;
    264	dma_addr_t curr_phys, next_phys;
    265
    266	curr = mdesc->list;
    267	curr_phys = mdesc->list_phys;
    268	while (curr) {
    269		next = curr->next_desc;
    270		next_phys = curr->node_addr;
    271		dma_pool_free(mdma->desc_pool, curr, curr_phys);
    272		curr = next;
    273		curr_phys = next_phys;
    274	}
    275}
    276
    277static void mdc_desc_free(struct virt_dma_desc *vd)
    278{
    279	struct mdc_tx_desc *mdesc = to_mdc_desc(&vd->tx);
    280
    281	mdc_list_desc_free(mdesc);
    282	kfree(mdesc);
    283}
    284
    285static struct dma_async_tx_descriptor *mdc_prep_dma_memcpy(
    286	struct dma_chan *chan, dma_addr_t dest, dma_addr_t src, size_t len,
    287	unsigned long flags)
    288{
    289	struct mdc_chan *mchan = to_mdc_chan(chan);
    290	struct mdc_dma *mdma = mchan->mdma;
    291	struct mdc_tx_desc *mdesc;
    292	struct mdc_hw_list_desc *curr, *prev = NULL;
    293	dma_addr_t curr_phys;
    294
    295	if (!len)
    296		return NULL;
    297
    298	mdesc = kzalloc(sizeof(*mdesc), GFP_NOWAIT);
    299	if (!mdesc)
    300		return NULL;
    301	mdesc->chan = mchan;
    302	mdesc->list_xfer_size = len;
    303
    304	while (len > 0) {
    305		size_t xfer_size;
    306
    307		curr = dma_pool_alloc(mdma->desc_pool, GFP_NOWAIT, &curr_phys);
    308		if (!curr)
    309			goto free_desc;
    310
    311		if (prev) {
    312			prev->node_addr = curr_phys;
    313			prev->next_desc = curr;
    314		} else {
    315			mdesc->list_phys = curr_phys;
    316			mdesc->list = curr;
    317		}
    318
    319		xfer_size = min_t(size_t, mdma->max_xfer_size, len);
    320
    321		mdc_list_desc_config(mchan, curr, DMA_MEM_TO_MEM, src, dest,
    322				     xfer_size);
    323
    324		prev = curr;
    325
    326		mdesc->list_len++;
    327		src += xfer_size;
    328		dest += xfer_size;
    329		len -= xfer_size;
    330	}
    331
    332	return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags);
    333
    334free_desc:
    335	mdc_desc_free(&mdesc->vd);
    336
    337	return NULL;
    338}
    339
    340static int mdc_check_slave_width(struct mdc_chan *mchan,
    341				 enum dma_transfer_direction dir)
    342{
    343	enum dma_slave_buswidth width;
    344
    345	if (dir == DMA_MEM_TO_DEV)
    346		width = mchan->config.dst_addr_width;
    347	else
    348		width = mchan->config.src_addr_width;
    349
    350	switch (width) {
    351	case DMA_SLAVE_BUSWIDTH_1_BYTE:
    352	case DMA_SLAVE_BUSWIDTH_2_BYTES:
    353	case DMA_SLAVE_BUSWIDTH_4_BYTES:
    354	case DMA_SLAVE_BUSWIDTH_8_BYTES:
    355		break;
    356	default:
    357		return -EINVAL;
    358	}
    359
    360	if (width > mchan->mdma->bus_width)
    361		return -EINVAL;
    362
    363	return 0;
    364}
    365
    366static struct dma_async_tx_descriptor *mdc_prep_dma_cyclic(
    367	struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
    368	size_t period_len, enum dma_transfer_direction dir,
    369	unsigned long flags)
    370{
    371	struct mdc_chan *mchan = to_mdc_chan(chan);
    372	struct mdc_dma *mdma = mchan->mdma;
    373	struct mdc_tx_desc *mdesc;
    374	struct mdc_hw_list_desc *curr, *prev = NULL;
    375	dma_addr_t curr_phys;
    376
    377	if (!buf_len && !period_len)
    378		return NULL;
    379
    380	if (!is_slave_direction(dir))
    381		return NULL;
    382
    383	if (mdc_check_slave_width(mchan, dir) < 0)
    384		return NULL;
    385
    386	mdesc = kzalloc(sizeof(*mdesc), GFP_NOWAIT);
    387	if (!mdesc)
    388		return NULL;
    389	mdesc->chan = mchan;
    390	mdesc->cyclic = true;
    391	mdesc->list_xfer_size = buf_len;
    392	mdesc->list_period_len = DIV_ROUND_UP(period_len,
    393					      mdma->max_xfer_size);
    394
    395	while (buf_len > 0) {
    396		size_t remainder = min(period_len, buf_len);
    397
    398		while (remainder > 0) {
    399			size_t xfer_size;
    400
    401			curr = dma_pool_alloc(mdma->desc_pool, GFP_NOWAIT,
    402					      &curr_phys);
    403			if (!curr)
    404				goto free_desc;
    405
    406			if (!prev) {
    407				mdesc->list_phys = curr_phys;
    408				mdesc->list = curr;
    409			} else {
    410				prev->node_addr = curr_phys;
    411				prev->next_desc = curr;
    412			}
    413
    414			xfer_size = min_t(size_t, mdma->max_xfer_size,
    415					  remainder);
    416
    417			if (dir == DMA_MEM_TO_DEV) {
    418				mdc_list_desc_config(mchan, curr, dir,
    419						     buf_addr,
    420						     mchan->config.dst_addr,
    421						     xfer_size);
    422			} else {
    423				mdc_list_desc_config(mchan, curr, dir,
    424						     mchan->config.src_addr,
    425						     buf_addr,
    426						     xfer_size);
    427			}
    428
    429			prev = curr;
    430
    431			mdesc->list_len++;
    432			buf_addr += xfer_size;
    433			buf_len -= xfer_size;
    434			remainder -= xfer_size;
    435		}
    436	}
    437	prev->node_addr = mdesc->list_phys;
    438
    439	return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags);
    440
    441free_desc:
    442	mdc_desc_free(&mdesc->vd);
    443
    444	return NULL;
    445}
    446
    447static struct dma_async_tx_descriptor *mdc_prep_slave_sg(
    448	struct dma_chan *chan, struct scatterlist *sgl,
    449	unsigned int sg_len, enum dma_transfer_direction dir,
    450	unsigned long flags, void *context)
    451{
    452	struct mdc_chan *mchan = to_mdc_chan(chan);
    453	struct mdc_dma *mdma = mchan->mdma;
    454	struct mdc_tx_desc *mdesc;
    455	struct scatterlist *sg;
    456	struct mdc_hw_list_desc *curr, *prev = NULL;
    457	dma_addr_t curr_phys;
    458	unsigned int i;
    459
    460	if (!sgl)
    461		return NULL;
    462
    463	if (!is_slave_direction(dir))
    464		return NULL;
    465
    466	if (mdc_check_slave_width(mchan, dir) < 0)
    467		return NULL;
    468
    469	mdesc = kzalloc(sizeof(*mdesc), GFP_NOWAIT);
    470	if (!mdesc)
    471		return NULL;
    472	mdesc->chan = mchan;
    473
    474	for_each_sg(sgl, sg, sg_len, i) {
    475		dma_addr_t buf = sg_dma_address(sg);
    476		size_t buf_len = sg_dma_len(sg);
    477
    478		while (buf_len > 0) {
    479			size_t xfer_size;
    480
    481			curr = dma_pool_alloc(mdma->desc_pool, GFP_NOWAIT,
    482					      &curr_phys);
    483			if (!curr)
    484				goto free_desc;
    485
    486			if (!prev) {
    487				mdesc->list_phys = curr_phys;
    488				mdesc->list = curr;
    489			} else {
    490				prev->node_addr = curr_phys;
    491				prev->next_desc = curr;
    492			}
    493
    494			xfer_size = min_t(size_t, mdma->max_xfer_size,
    495					  buf_len);
    496
    497			if (dir == DMA_MEM_TO_DEV) {
    498				mdc_list_desc_config(mchan, curr, dir, buf,
    499						     mchan->config.dst_addr,
    500						     xfer_size);
    501			} else {
    502				mdc_list_desc_config(mchan, curr, dir,
    503						     mchan->config.src_addr,
    504						     buf, xfer_size);
    505			}
    506
    507			prev = curr;
    508
    509			mdesc->list_len++;
    510			mdesc->list_xfer_size += xfer_size;
    511			buf += xfer_size;
    512			buf_len -= xfer_size;
    513		}
    514	}
    515
    516	return vchan_tx_prep(&mchan->vc, &mdesc->vd, flags);
    517
    518free_desc:
    519	mdc_desc_free(&mdesc->vd);
    520
    521	return NULL;
    522}
    523
    524static void mdc_issue_desc(struct mdc_chan *mchan)
    525{
    526	struct mdc_dma *mdma = mchan->mdma;
    527	struct virt_dma_desc *vd;
    528	struct mdc_tx_desc *mdesc;
    529	u32 val;
    530
    531	vd = vchan_next_desc(&mchan->vc);
    532	if (!vd)
    533		return;
    534
    535	list_del(&vd->node);
    536
    537	mdesc = to_mdc_desc(&vd->tx);
    538	mchan->desc = mdesc;
    539
    540	dev_dbg(mdma2dev(mdma), "Issuing descriptor on channel %d\n",
    541		mchan->chan_nr);
    542
    543	mdma->soc->enable_chan(mchan);
    544
    545	val = mdc_chan_readl(mchan, MDC_GENERAL_CONFIG);
    546	val |= MDC_GENERAL_CONFIG_LIST_IEN | MDC_GENERAL_CONFIG_IEN |
    547		MDC_GENERAL_CONFIG_LEVEL_INT | MDC_GENERAL_CONFIG_PHYSICAL_W |
    548		MDC_GENERAL_CONFIG_PHYSICAL_R;
    549	mdc_chan_writel(mchan, val, MDC_GENERAL_CONFIG);
    550	val = (mchan->thread << MDC_READ_PORT_CONFIG_STHREAD_SHIFT) |
    551		(mchan->thread << MDC_READ_PORT_CONFIG_RTHREAD_SHIFT) |
    552		(mchan->thread << MDC_READ_PORT_CONFIG_WTHREAD_SHIFT);
    553	mdc_chan_writel(mchan, val, MDC_READ_PORT_CONFIG);
    554	mdc_chan_writel(mchan, mdesc->list_phys, MDC_LIST_NODE_ADDRESS);
    555	val = mdc_chan_readl(mchan, MDC_CONTROL_AND_STATUS);
    556	val |= MDC_CONTROL_AND_STATUS_LIST_EN;
    557	mdc_chan_writel(mchan, val, MDC_CONTROL_AND_STATUS);
    558}
    559
    560static void mdc_issue_pending(struct dma_chan *chan)
    561{
    562	struct mdc_chan *mchan = to_mdc_chan(chan);
    563	unsigned long flags;
    564
    565	spin_lock_irqsave(&mchan->vc.lock, flags);
    566	if (vchan_issue_pending(&mchan->vc) && !mchan->desc)
    567		mdc_issue_desc(mchan);
    568	spin_unlock_irqrestore(&mchan->vc.lock, flags);
    569}
    570
    571static enum dma_status mdc_tx_status(struct dma_chan *chan,
    572	dma_cookie_t cookie, struct dma_tx_state *txstate)
    573{
    574	struct mdc_chan *mchan = to_mdc_chan(chan);
    575	struct mdc_tx_desc *mdesc;
    576	struct virt_dma_desc *vd;
    577	unsigned long flags;
    578	size_t bytes = 0;
    579	int ret;
    580
    581	ret = dma_cookie_status(chan, cookie, txstate);
    582	if (ret == DMA_COMPLETE)
    583		return ret;
    584
    585	if (!txstate)
    586		return ret;
    587
    588	spin_lock_irqsave(&mchan->vc.lock, flags);
    589	vd = vchan_find_desc(&mchan->vc, cookie);
    590	if (vd) {
    591		mdesc = to_mdc_desc(&vd->tx);
    592		bytes = mdesc->list_xfer_size;
    593	} else if (mchan->desc && mchan->desc->vd.tx.cookie == cookie) {
    594		struct mdc_hw_list_desc *ldesc;
    595		u32 val1, val2, done, processed, residue;
    596		int i, cmds;
    597
    598		mdesc = mchan->desc;
    599
    600		/*
    601		 * Determine the number of commands that haven't been
    602		 * processed (handled by the IRQ handler) yet.
    603		 */
    604		do {
    605			val1 = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED) &
    606				~MDC_CMDS_PROCESSED_INT_ACTIVE;
    607			residue = mdc_chan_readl(mchan,
    608						 MDC_ACTIVE_TRANSFER_SIZE);
    609			val2 = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED) &
    610				~MDC_CMDS_PROCESSED_INT_ACTIVE;
    611		} while (val1 != val2);
    612
    613		done = (val1 >> MDC_CMDS_PROCESSED_CMDS_DONE_SHIFT) &
    614			MDC_CMDS_PROCESSED_CMDS_DONE_MASK;
    615		processed = (val1 >> MDC_CMDS_PROCESSED_CMDS_PROCESSED_SHIFT) &
    616			MDC_CMDS_PROCESSED_CMDS_PROCESSED_MASK;
    617		cmds = (done - processed) %
    618			(MDC_CMDS_PROCESSED_CMDS_DONE_MASK + 1);
    619
    620		/*
    621		 * If the command loaded event hasn't been processed yet, then
    622		 * the difference above includes an extra command.
    623		 */
    624		if (!mdesc->cmd_loaded)
    625			cmds--;
    626		else
    627			cmds += mdesc->list_cmds_done;
    628
    629		bytes = mdesc->list_xfer_size;
    630		ldesc = mdesc->list;
    631		for (i = 0; i < cmds; i++) {
    632			bytes -= ldesc->xfer_size + 1;
    633			ldesc = ldesc->next_desc;
    634		}
    635		if (ldesc) {
    636			if (residue != MDC_TRANSFER_SIZE_MASK)
    637				bytes -= ldesc->xfer_size - residue;
    638			else
    639				bytes -= ldesc->xfer_size + 1;
    640		}
    641	}
    642	spin_unlock_irqrestore(&mchan->vc.lock, flags);
    643
    644	dma_set_residue(txstate, bytes);
    645
    646	return ret;
    647}
    648
    649static unsigned int mdc_get_new_events(struct mdc_chan *mchan)
    650{
    651	u32 val, processed, done1, done2;
    652	unsigned int ret;
    653
    654	val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED);
    655	processed = (val >> MDC_CMDS_PROCESSED_CMDS_PROCESSED_SHIFT) &
    656				MDC_CMDS_PROCESSED_CMDS_PROCESSED_MASK;
    657	/*
    658	 * CMDS_DONE may have incremented between reading CMDS_PROCESSED
    659	 * and clearing INT_ACTIVE.  Re-read CMDS_PROCESSED to ensure we
    660	 * didn't miss a command completion.
    661	 */
    662	do {
    663		val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED);
    664
    665		done1 = (val >> MDC_CMDS_PROCESSED_CMDS_DONE_SHIFT) &
    666			MDC_CMDS_PROCESSED_CMDS_DONE_MASK;
    667
    668		val &= ~((MDC_CMDS_PROCESSED_CMDS_PROCESSED_MASK <<
    669			  MDC_CMDS_PROCESSED_CMDS_PROCESSED_SHIFT) |
    670			 MDC_CMDS_PROCESSED_INT_ACTIVE);
    671
    672		val |= done1 << MDC_CMDS_PROCESSED_CMDS_PROCESSED_SHIFT;
    673
    674		mdc_chan_writel(mchan, val, MDC_CMDS_PROCESSED);
    675
    676		val = mdc_chan_readl(mchan, MDC_CMDS_PROCESSED);
    677
    678		done2 = (val >> MDC_CMDS_PROCESSED_CMDS_DONE_SHIFT) &
    679			MDC_CMDS_PROCESSED_CMDS_DONE_MASK;
    680	} while (done1 != done2);
    681
    682	if (done1 >= processed)
    683		ret = done1 - processed;
    684	else
    685		ret = ((MDC_CMDS_PROCESSED_CMDS_PROCESSED_MASK + 1) -
    686			processed) + done1;
    687
    688	return ret;
    689}
    690
    691static int mdc_terminate_all(struct dma_chan *chan)
    692{
    693	struct mdc_chan *mchan = to_mdc_chan(chan);
    694	unsigned long flags;
    695	LIST_HEAD(head);
    696
    697	spin_lock_irqsave(&mchan->vc.lock, flags);
    698
    699	mdc_chan_writel(mchan, MDC_CONTROL_AND_STATUS_CANCEL,
    700			MDC_CONTROL_AND_STATUS);
    701
    702	if (mchan->desc) {
    703		vchan_terminate_vdesc(&mchan->desc->vd);
    704		mchan->desc = NULL;
    705	}
    706	vchan_get_all_descriptors(&mchan->vc, &head);
    707
    708	mdc_get_new_events(mchan);
    709
    710	spin_unlock_irqrestore(&mchan->vc.lock, flags);
    711
    712	vchan_dma_desc_free_list(&mchan->vc, &head);
    713
    714	return 0;
    715}
    716
    717static void mdc_synchronize(struct dma_chan *chan)
    718{
    719	struct mdc_chan *mchan = to_mdc_chan(chan);
    720
    721	vchan_synchronize(&mchan->vc);
    722}
    723
    724static int mdc_slave_config(struct dma_chan *chan,
    725			    struct dma_slave_config *config)
    726{
    727	struct mdc_chan *mchan = to_mdc_chan(chan);
    728	unsigned long flags;
    729
    730	spin_lock_irqsave(&mchan->vc.lock, flags);
    731	mchan->config = *config;
    732	spin_unlock_irqrestore(&mchan->vc.lock, flags);
    733
    734	return 0;
    735}
    736
    737static int mdc_alloc_chan_resources(struct dma_chan *chan)
    738{
    739	struct mdc_chan *mchan = to_mdc_chan(chan);
    740	struct device *dev = mdma2dev(mchan->mdma);
    741
    742	return pm_runtime_get_sync(dev);
    743}
    744
    745static void mdc_free_chan_resources(struct dma_chan *chan)
    746{
    747	struct mdc_chan *mchan = to_mdc_chan(chan);
    748	struct mdc_dma *mdma = mchan->mdma;
    749	struct device *dev = mdma2dev(mdma);
    750
    751	mdc_terminate_all(chan);
    752	mdma->soc->disable_chan(mchan);
    753	pm_runtime_put(dev);
    754}
    755
    756static irqreturn_t mdc_chan_irq(int irq, void *dev_id)
    757{
    758	struct mdc_chan *mchan = (struct mdc_chan *)dev_id;
    759	struct mdc_tx_desc *mdesc;
    760	unsigned int i, new_events;
    761
    762	spin_lock(&mchan->vc.lock);
    763
    764	dev_dbg(mdma2dev(mchan->mdma), "IRQ on channel %d\n", mchan->chan_nr);
    765
    766	new_events = mdc_get_new_events(mchan);
    767
    768	if (!new_events)
    769		goto out;
    770
    771	mdesc = mchan->desc;
    772	if (!mdesc) {
    773		dev_warn(mdma2dev(mchan->mdma),
    774			 "IRQ with no active descriptor on channel %d\n",
    775			 mchan->chan_nr);
    776		goto out;
    777	}
    778
    779	for (i = 0; i < new_events; i++) {
    780		/*
    781		 * The first interrupt in a transfer indicates that the
    782		 * command list has been loaded, not that a command has
    783		 * been completed.
    784		 */
    785		if (!mdesc->cmd_loaded) {
    786			mdesc->cmd_loaded = true;
    787			continue;
    788		}
    789
    790		mdesc->list_cmds_done++;
    791		if (mdesc->cyclic) {
    792			mdesc->list_cmds_done %= mdesc->list_len;
    793			if (mdesc->list_cmds_done % mdesc->list_period_len == 0)
    794				vchan_cyclic_callback(&mdesc->vd);
    795		} else if (mdesc->list_cmds_done == mdesc->list_len) {
    796			mchan->desc = NULL;
    797			vchan_cookie_complete(&mdesc->vd);
    798			mdc_issue_desc(mchan);
    799			break;
    800		}
    801	}
    802out:
    803	spin_unlock(&mchan->vc.lock);
    804
    805	return IRQ_HANDLED;
    806}
    807
    808static struct dma_chan *mdc_of_xlate(struct of_phandle_args *dma_spec,
    809				     struct of_dma *ofdma)
    810{
    811	struct mdc_dma *mdma = ofdma->of_dma_data;
    812	struct dma_chan *chan;
    813
    814	if (dma_spec->args_count != 3)
    815		return NULL;
    816
    817	list_for_each_entry(chan, &mdma->dma_dev.channels, device_node) {
    818		struct mdc_chan *mchan = to_mdc_chan(chan);
    819
    820		if (!(dma_spec->args[1] & BIT(mchan->chan_nr)))
    821			continue;
    822		if (dma_get_slave_channel(chan)) {
    823			mchan->periph = dma_spec->args[0];
    824			mchan->thread = dma_spec->args[2];
    825			return chan;
    826		}
    827	}
    828
    829	return NULL;
    830}
    831
    832#define PISTACHIO_CR_PERIPH_DMA_ROUTE(ch)	(0x120 + 0x4 * ((ch) / 4))
    833#define PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(ch) (8 * ((ch) % 4))
    834#define PISTACHIO_CR_PERIPH_DMA_ROUTE_MASK	0x3f
    835
    836static void pistachio_mdc_enable_chan(struct mdc_chan *mchan)
    837{
    838	struct mdc_dma *mdma = mchan->mdma;
    839
    840	regmap_update_bits(mdma->periph_regs,
    841			   PISTACHIO_CR_PERIPH_DMA_ROUTE(mchan->chan_nr),
    842			   PISTACHIO_CR_PERIPH_DMA_ROUTE_MASK <<
    843			   PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr),
    844			   mchan->periph <<
    845			   PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr));
    846}
    847
    848static void pistachio_mdc_disable_chan(struct mdc_chan *mchan)
    849{
    850	struct mdc_dma *mdma = mchan->mdma;
    851
    852	regmap_update_bits(mdma->periph_regs,
    853			   PISTACHIO_CR_PERIPH_DMA_ROUTE(mchan->chan_nr),
    854			   PISTACHIO_CR_PERIPH_DMA_ROUTE_MASK <<
    855			   PISTACHIO_CR_PERIPH_DMA_ROUTE_SHIFT(mchan->chan_nr),
    856			   0);
    857}
    858
    859static const struct mdc_dma_soc_data pistachio_mdc_data = {
    860	.enable_chan = pistachio_mdc_enable_chan,
    861	.disable_chan = pistachio_mdc_disable_chan,
    862};
    863
    864static const struct of_device_id mdc_dma_of_match[] = {
    865	{ .compatible = "img,pistachio-mdc-dma", .data = &pistachio_mdc_data, },
    866	{ },
    867};
    868MODULE_DEVICE_TABLE(of, mdc_dma_of_match);
    869
    870static int img_mdc_runtime_suspend(struct device *dev)
    871{
    872	struct mdc_dma *mdma = dev_get_drvdata(dev);
    873
    874	clk_disable_unprepare(mdma->clk);
    875
    876	return 0;
    877}
    878
    879static int img_mdc_runtime_resume(struct device *dev)
    880{
    881	struct mdc_dma *mdma = dev_get_drvdata(dev);
    882
    883	return clk_prepare_enable(mdma->clk);
    884}
    885
    886static int mdc_dma_probe(struct platform_device *pdev)
    887{
    888	struct mdc_dma *mdma;
    889	struct resource *res;
    890	unsigned int i;
    891	u32 val;
    892	int ret;
    893
    894	mdma = devm_kzalloc(&pdev->dev, sizeof(*mdma), GFP_KERNEL);
    895	if (!mdma)
    896		return -ENOMEM;
    897	platform_set_drvdata(pdev, mdma);
    898
    899	mdma->soc = of_device_get_match_data(&pdev->dev);
    900
    901	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    902	mdma->regs = devm_ioremap_resource(&pdev->dev, res);
    903	if (IS_ERR(mdma->regs))
    904		return PTR_ERR(mdma->regs);
    905
    906	mdma->periph_regs = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
    907							    "img,cr-periph");
    908	if (IS_ERR(mdma->periph_regs))
    909		return PTR_ERR(mdma->periph_regs);
    910
    911	mdma->clk = devm_clk_get(&pdev->dev, "sys");
    912	if (IS_ERR(mdma->clk))
    913		return PTR_ERR(mdma->clk);
    914
    915	dma_cap_zero(mdma->dma_dev.cap_mask);
    916	dma_cap_set(DMA_SLAVE, mdma->dma_dev.cap_mask);
    917	dma_cap_set(DMA_PRIVATE, mdma->dma_dev.cap_mask);
    918	dma_cap_set(DMA_CYCLIC, mdma->dma_dev.cap_mask);
    919	dma_cap_set(DMA_MEMCPY, mdma->dma_dev.cap_mask);
    920
    921	val = mdc_readl(mdma, MDC_GLOBAL_CONFIG_A);
    922	mdma->nr_channels = (val >> MDC_GLOBAL_CONFIG_A_DMA_CONTEXTS_SHIFT) &
    923		MDC_GLOBAL_CONFIG_A_DMA_CONTEXTS_MASK;
    924	mdma->nr_threads =
    925		1 << ((val >> MDC_GLOBAL_CONFIG_A_THREAD_ID_WIDTH_SHIFT) &
    926		      MDC_GLOBAL_CONFIG_A_THREAD_ID_WIDTH_MASK);
    927	mdma->bus_width =
    928		(1 << ((val >> MDC_GLOBAL_CONFIG_A_SYS_DAT_WIDTH_SHIFT) &
    929		       MDC_GLOBAL_CONFIG_A_SYS_DAT_WIDTH_MASK)) / 8;
    930	/*
    931	 * Although transfer sizes of up to MDC_TRANSFER_SIZE_MASK + 1 bytes
    932	 * are supported, this makes it possible for the value reported in
    933	 * MDC_ACTIVE_TRANSFER_SIZE to be ambiguous - an active transfer size
    934	 * of MDC_TRANSFER_SIZE_MASK may indicate either that 0 bytes or
    935	 * MDC_TRANSFER_SIZE_MASK + 1 bytes are remaining.  To eliminate this
    936	 * ambiguity, restrict transfer sizes to one bus-width less than the
    937	 * actual maximum.
    938	 */
    939	mdma->max_xfer_size = MDC_TRANSFER_SIZE_MASK + 1 - mdma->bus_width;
    940
    941	of_property_read_u32(pdev->dev.of_node, "dma-channels",
    942			     &mdma->nr_channels);
    943	ret = of_property_read_u32(pdev->dev.of_node,
    944				   "img,max-burst-multiplier",
    945				   &mdma->max_burst_mult);
    946	if (ret)
    947		return ret;
    948
    949	mdma->dma_dev.dev = &pdev->dev;
    950	mdma->dma_dev.device_prep_slave_sg = mdc_prep_slave_sg;
    951	mdma->dma_dev.device_prep_dma_cyclic = mdc_prep_dma_cyclic;
    952	mdma->dma_dev.device_prep_dma_memcpy = mdc_prep_dma_memcpy;
    953	mdma->dma_dev.device_alloc_chan_resources = mdc_alloc_chan_resources;
    954	mdma->dma_dev.device_free_chan_resources = mdc_free_chan_resources;
    955	mdma->dma_dev.device_tx_status = mdc_tx_status;
    956	mdma->dma_dev.device_issue_pending = mdc_issue_pending;
    957	mdma->dma_dev.device_terminate_all = mdc_terminate_all;
    958	mdma->dma_dev.device_synchronize = mdc_synchronize;
    959	mdma->dma_dev.device_config = mdc_slave_config;
    960
    961	mdma->dma_dev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
    962	mdma->dma_dev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
    963	for (i = 1; i <= mdma->bus_width; i <<= 1) {
    964		mdma->dma_dev.src_addr_widths |= BIT(i);
    965		mdma->dma_dev.dst_addr_widths |= BIT(i);
    966	}
    967
    968	INIT_LIST_HEAD(&mdma->dma_dev.channels);
    969	for (i = 0; i < mdma->nr_channels; i++) {
    970		struct mdc_chan *mchan = &mdma->channels[i];
    971
    972		mchan->mdma = mdma;
    973		mchan->chan_nr = i;
    974		mchan->irq = platform_get_irq(pdev, i);
    975		if (mchan->irq < 0)
    976			return mchan->irq;
    977
    978		ret = devm_request_irq(&pdev->dev, mchan->irq, mdc_chan_irq,
    979				       IRQ_TYPE_LEVEL_HIGH,
    980				       dev_name(&pdev->dev), mchan);
    981		if (ret < 0)
    982			return ret;
    983
    984		mchan->vc.desc_free = mdc_desc_free;
    985		vchan_init(&mchan->vc, &mdma->dma_dev);
    986	}
    987
    988	mdma->desc_pool = dmam_pool_create(dev_name(&pdev->dev), &pdev->dev,
    989					   sizeof(struct mdc_hw_list_desc),
    990					   4, 0);
    991	if (!mdma->desc_pool)
    992		return -ENOMEM;
    993
    994	pm_runtime_enable(&pdev->dev);
    995	if (!pm_runtime_enabled(&pdev->dev)) {
    996		ret = img_mdc_runtime_resume(&pdev->dev);
    997		if (ret)
    998			return ret;
    999	}
   1000
   1001	ret = dma_async_device_register(&mdma->dma_dev);
   1002	if (ret)
   1003		goto suspend;
   1004
   1005	ret = of_dma_controller_register(pdev->dev.of_node, mdc_of_xlate, mdma);
   1006	if (ret)
   1007		goto unregister;
   1008
   1009	dev_info(&pdev->dev, "MDC with %u channels and %u threads\n",
   1010		 mdma->nr_channels, mdma->nr_threads);
   1011
   1012	return 0;
   1013
   1014unregister:
   1015	dma_async_device_unregister(&mdma->dma_dev);
   1016suspend:
   1017	if (!pm_runtime_enabled(&pdev->dev))
   1018		img_mdc_runtime_suspend(&pdev->dev);
   1019	pm_runtime_disable(&pdev->dev);
   1020	return ret;
   1021}
   1022
   1023static int mdc_dma_remove(struct platform_device *pdev)
   1024{
   1025	struct mdc_dma *mdma = platform_get_drvdata(pdev);
   1026	struct mdc_chan *mchan, *next;
   1027
   1028	of_dma_controller_free(pdev->dev.of_node);
   1029	dma_async_device_unregister(&mdma->dma_dev);
   1030
   1031	list_for_each_entry_safe(mchan, next, &mdma->dma_dev.channels,
   1032				 vc.chan.device_node) {
   1033		list_del(&mchan->vc.chan.device_node);
   1034
   1035		devm_free_irq(&pdev->dev, mchan->irq, mchan);
   1036
   1037		tasklet_kill(&mchan->vc.task);
   1038	}
   1039
   1040	pm_runtime_disable(&pdev->dev);
   1041	if (!pm_runtime_status_suspended(&pdev->dev))
   1042		img_mdc_runtime_suspend(&pdev->dev);
   1043
   1044	return 0;
   1045}
   1046
   1047#ifdef CONFIG_PM_SLEEP
   1048static int img_mdc_suspend_late(struct device *dev)
   1049{
   1050	struct mdc_dma *mdma = dev_get_drvdata(dev);
   1051	int i;
   1052
   1053	/* Check that all channels are idle */
   1054	for (i = 0; i < mdma->nr_channels; i++) {
   1055		struct mdc_chan *mchan = &mdma->channels[i];
   1056
   1057		if (unlikely(mchan->desc))
   1058			return -EBUSY;
   1059	}
   1060
   1061	return pm_runtime_force_suspend(dev);
   1062}
   1063
   1064static int img_mdc_resume_early(struct device *dev)
   1065{
   1066	return pm_runtime_force_resume(dev);
   1067}
   1068#endif /* CONFIG_PM_SLEEP */
   1069
   1070static const struct dev_pm_ops img_mdc_pm_ops = {
   1071	SET_RUNTIME_PM_OPS(img_mdc_runtime_suspend,
   1072			   img_mdc_runtime_resume, NULL)
   1073	SET_LATE_SYSTEM_SLEEP_PM_OPS(img_mdc_suspend_late,
   1074				     img_mdc_resume_early)
   1075};
   1076
   1077static struct platform_driver mdc_dma_driver = {
   1078	.driver = {
   1079		.name = "img-mdc-dma",
   1080		.pm = &img_mdc_pm_ops,
   1081		.of_match_table = of_match_ptr(mdc_dma_of_match),
   1082	},
   1083	.probe = mdc_dma_probe,
   1084	.remove = mdc_dma_remove,
   1085};
   1086module_platform_driver(mdc_dma_driver);
   1087
   1088MODULE_DESCRIPTION("IMG Multi-threaded DMA Controller (MDC) driver");
   1089MODULE_AUTHOR("Andrew Bresticker <abrestic@chromium.org>");
   1090MODULE_LICENSE("GPL v2");