aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@st.com>2011-08-05 06:02:38 -0400
committerVinod Koul <vinod.koul@intel.com>2011-08-25 10:03:39 -0400
commitfa6a940bf129c5417b602a4cdfe88b3dbd8e5898 (patch)
tree03355a9b00c59e00cfe157e5a5b7cb06e098bc4b /drivers
parent16a2e7d359b9fc64fb8a6717c0642691b1e60bb7 (diff)
dmaengine/amba-pl08x: max_bytes_per_lli is TRANSFER_SIZE * src_width (not MIN(width))
max_bytes_per_lli = bd.srcbus.buswidth * PL080_CONTROL_TRANSFER_SIZE_MASK; This is confirmed by ARM support guys. Below is summary of mail exchange with them: [Viresh] What is the total data to be transferred in case source and destination bus widths are different. Suppose, source bus width is 2 bytes and destination is 4 bytes. Now in order to transfer 80 bytes, what should be value of TransferSize field in control reg: 40? or 20?. [David from ARM] The value that is programmed into the TransferSize field should be the number of <SourceWidth> transfers needed to achieve the required data transfer. So, to transfer 80 bytes, with a Source Width of 2, the TransferSize field = should be programmed with: Total transfer size ------------------- = 40 <source width> [Viresh] Will this change if source is 4 bytes and dest is 2? [David] Yes - the calculation then becomes: Total transfer size ------------------- =20 <source width> Also, max_bytes_per_lli must be calculated after fixing src and dest widths not before that. So move this code to the correct place. This patch also removes max_bytes_per_lli from earlier print message, as till that point max_bytes_per_lli is unknown. Signed-off-by: Viresh Kumar <viresh.kumar@st.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dma/amba-pl08x.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
index be9a1c718f9a..e5930d512b00 100644
--- a/drivers/dma/amba-pl08x.c
+++ b/drivers/dma/amba-pl08x.c
@@ -604,23 +604,17 @@ static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
604 bd.srcbus.buswidth = bd.srcbus.maxwidth; 604 bd.srcbus.buswidth = bd.srcbus.maxwidth;
605 bd.dstbus.buswidth = bd.dstbus.maxwidth; 605 bd.dstbus.buswidth = bd.dstbus.maxwidth;
606 606
607 /*
608 * Bytes transferred == tsize * MIN(buswidths), not max(buswidths)
609 */
610 max_bytes_per_lli = min(bd.srcbus.buswidth, bd.dstbus.buswidth) *
611 PL080_CONTROL_TRANSFER_SIZE_MASK;
612
613 /* We need to count this down to zero */ 607 /* We need to count this down to zero */
614 bd.remainder = txd->len; 608 bd.remainder = txd->len;
615 609
616 pl08x_choose_master_bus(&bd, &mbus, &sbus, cctl); 610 pl08x_choose_master_bus(&bd, &mbus, &sbus, cctl);
617 611
618 dev_vdbg(&pl08x->adev->dev, "src=0x%08x%s/%u dst=0x%08x%s/%u len=%zu llimax=%zu\n", 612 dev_vdbg(&pl08x->adev->dev, "src=0x%08x%s/%u dst=0x%08x%s/%u len=%zu\n",
619 bd.srcbus.addr, cctl & PL080_CONTROL_SRC_INCR ? "+" : "", 613 bd.srcbus.addr, cctl & PL080_CONTROL_SRC_INCR ? "+" : "",
620 bd.srcbus.buswidth, 614 bd.srcbus.buswidth,
621 bd.dstbus.addr, cctl & PL080_CONTROL_DST_INCR ? "+" : "", 615 bd.dstbus.addr, cctl & PL080_CONTROL_DST_INCR ? "+" : "",
622 bd.dstbus.buswidth, 616 bd.dstbus.buswidth,
623 bd.remainder, max_bytes_per_lli); 617 bd.remainder);
624 dev_vdbg(&pl08x->adev->dev, "mbus=%s sbus=%s\n", 618 dev_vdbg(&pl08x->adev->dev, "mbus=%s sbus=%s\n",
625 mbus == &bd.srcbus ? "src" : "dst", 619 mbus == &bd.srcbus ? "src" : "dst",
626 sbus == &bd.srcbus ? "src" : "dst"); 620 sbus == &bd.srcbus ? "src" : "dst");
@@ -660,6 +654,10 @@ static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
660 sbus->buswidth = 1; 654 sbus->buswidth = 1;
661 } 655 }
662 656
657 /* Bytes transferred = tsize * src width, not MIN(buswidths) */
658 max_bytes_per_lli = bd.srcbus.buswidth *
659 PL080_CONTROL_TRANSFER_SIZE_MASK;
660
663 /* 661 /*
664 * Make largest possible LLIs until less than one bus 662 * Make largest possible LLIs until less than one bus
665 * width left 663 * width left