diff options
author | Viresh Kumar <viresh.kumar@st.com> | 2011-08-05 06:02:38 -0400 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2011-08-25 10:03:39 -0400 |
commit | fa6a940bf129c5417b602a4cdfe88b3dbd8e5898 (patch) | |
tree | 03355a9b00c59e00cfe157e5a5b7cb06e098bc4b /drivers | |
parent | 16a2e7d359b9fc64fb8a6717c0642691b1e60bb7 (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.c | 14 |
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 |