===================================================================
@@ -58,12 +58,15 @@
#define EDMA_DESCRIPTORS 16
struct edma_pset {
+ u32 len;
+ dma_addr_t addr;
struct edmacc_param hwpar;
};
struct edma_desc {
struct virt_dma_desc vdesc;
struct list_head node;
+ enum dma_transfer_direction direction;
int cyclic;
int absync;
int pset_nr;
@@ -341,16 +344,20 @@ static int edma_config_pset(struct dma_c
cidx = acnt * bcnt;
}
+ epset->len = dma_length;
+
if (direction == DMA_MEM_TO_DEV) {
src_bidx = acnt;
src_cidx = cidx;
dst_bidx = 0;
dst_cidx = 0;
+ epset->addr = src_addr;
} else if (direction == DMA_DEV_TO_MEM) {
src_bidx = 0;
src_cidx = 0;
dst_bidx = acnt;
dst_cidx = cidx;
+ epset->addr = dst_addr;
} else {
dev_err(dev, "%s: direction not implemented yet\n", __func__);
return -EINVAL;
@@ -423,6 +430,7 @@ static struct dma_async_tx_descriptor *e
edesc->pset_nr = sg_len;
edesc->residue = 0;
+ edesc->direction = direction;
/* Allocate a PaRAM slot, if needed */
nslots = min_t(unsigned, MAX_NR_SG, sg_len);
@@ -536,6 +544,7 @@ static struct dma_async_tx_descriptor *e
edesc->cyclic = 1;
edesc->pset_nr = nslots;
edesc->residue = buf_len;
+ edesc->direction = direction;
dev_dbg(dev, "%s: nslots=%d\n", __func__, nslots);
dev_dbg(dev, "%s: period_len=%d\n", __func__, period_len);
For granular accounting we need to store the direction and the information for the individual psets: - source or destination address, depending on direction - length Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- drivers/dma/edma.c | 9 +++++++++ 1 file changed, 9 insertions(+)