|
@@ -2459,16 +2459,25 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,
|
|
|
/* Select max possible burst size */
|
|
|
burst = pl330->pcfg.data_bus_width / 8;
|
|
|
|
|
|
- while (burst > 1) {
|
|
|
- if (!(len % burst))
|
|
|
- break;
|
|
|
+ /*
|
|
|
+ * Make sure we use a burst size that aligns with all the memcpy
|
|
|
+ * parameters because our DMA programming algorithm doesn't cope with
|
|
|
+ * transfers which straddle an entry in the DMA device's MFIFO.
|
|
|
+ */
|
|
|
+ while ((src | dst | len) & (burst - 1))
|
|
|
burst /= 2;
|
|
|
- }
|
|
|
|
|
|
desc->rqcfg.brst_size = 0;
|
|
|
while (burst != (1 << desc->rqcfg.brst_size))
|
|
|
desc->rqcfg.brst_size++;
|
|
|
|
|
|
+ /*
|
|
|
+ * If burst size is smaller than bus width then make sure we only
|
|
|
+ * transfer one at a time to avoid a burst stradling an MFIFO entry.
|
|
|
+ */
|
|
|
+ if (desc->rqcfg.brst_size * 8 < pl330->pcfg.data_bus_width)
|
|
|
+ desc->rqcfg.brst_len = 1;
|
|
|
+
|
|
|
desc->rqcfg.brst_len = get_burst_len(desc, len);
|
|
|
|
|
|
desc->txd.flags = flags;
|