From: vinod.koul@intel.com (Koul, Vinod)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 10/18] dmaengine/amba-pl08x: Get rid of pl08x_pre_boundary()
Date: Fri, 29 Jul 2011 17:49:40 +0530 [thread overview]
Message-ID: <1311941980.1536.534.camel@vkoul-udesk3> (raw)
In-Reply-To: <c147ba3a755935e93fdb40b5531a6e18d34e0fd7.1311936524.git.viresh.kumar@st.com>
On Fri, 2011-07-29 at 16:19 +0530, Viresh Kumar wrote:
> Pl080 Manual says: "Bursts do not cross the 1KB address boundary"
>
> We can program the controller to cross 1 KB boundary on a burst and controller
> can take care of this boundary condition by itself.
>
> Following is the discussion with ARM Technical Support Guys (David):
> [Viresh] Manual says: "Bursts do not cross the 1KB address boundary"
>
> What does that actually mean? As, Maximum size transferable with a single LLI is
> 4095 * 4 =16380 ~ 16KB. So, if we don't have src/dest address aligned to burst
> size, we can't use this big of an LLI.
>
> [David] There is a difference between bursts describing the total data
> transferred by the DMA controller and AHB bursts. Bursts described by the
> programmable parameters in the PL080 have no direct connection with the bursts
> that are seen on the AHB bus.
>
> The statement that "Bursts do not cross the 1KB address boundary" in the TRM is
> referring to AHB bursts, where this limitation is a requirement of the AHB spec.
> You can still issue bursts within the PL080 that are in excess o f 1KB. The
^^^^^^
of
> PL080 will make sure that its bursts are broken down into legal AHB bursts which
> will be formatted to ensure that no AHB burst crosses a 1KB boundary.
>
> Based on above discussion, this patch removes all code related to 1 KB boundary
> as we are not required to handle this in driver.
>
> Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
> ---
> drivers/dma/amba-pl08x.c | 136 ++++---------------------------------------
> include/linux/amba/pl08x.h | 2 -
> 2 files changed, 13 insertions(+), 125 deletions(-)
>
> diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
> index b9137bc..04f7889 100644
> --- a/drivers/dma/amba-pl08x.c
> +++ b/drivers/dma/amba-pl08x.c
> @@ -149,14 +149,6 @@ struct pl08x_driver_data {
> * PL08X specific defines
> */
>
> -/*
> - * Memory boundaries: the manual for PL08x says that the controller
> - * cannot read past a 1KiB boundary, so these defines are used to
> - * create transfer LLIs that do not cross such boundaries.
> - */
> -#define PL08X_BOUNDARY_SHIFT (10) /* 1KB 0x400 */
> -#define PL08X_BOUNDARY_SIZE (1 << PL08X_BOUNDARY_SHIFT)
> -
> /* Size (bytes) of each LLI buffer allocated for one transfer */
> # define PL08X_LLI_TSFR_SIZE 0x2000
>
> @@ -561,18 +553,6 @@ static void pl08x_fill_lli_for_desc(struct pl08x_lli_build_data *bd,
> }
>
> /*
> - * Return number of bytes to fill to boundary, or len.
> - * This calculation works for any value of addr.
> - */
> -static inline size_t pl08x_pre_boundary(u32 addr, size_t len)
> -{
> - size_t boundary_len = PL08X_BOUNDARY_SIZE -
> - (addr & (PL08X_BOUNDARY_SIZE - 1));
> -
> - return min(boundary_len, len);
> -}
> -
> -/*
> * This fills in the table of LLIs for the transfer descriptor
> * Note that we assume we never have to change the burst sizes
> * Return 0 for error
> @@ -679,121 +659,30 @@ static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
> * width left
> */
> while (bd.remainder > (mbus->buswidth - 1)) {
> - size_t lli_len, target_len, tsize, odd_bytes;
> + size_t lli_len, tsize;
>
> /*
> * If enough left try to send max possible,
> * otherwise try to send the remainder
> */
> - target_len = min(bd.remainder, max_bytes_per_lli);
> -
> + lli_len = min(bd.remainder, max_bytes_per_lli);
> /*
> - * Set bus lengths for incrementing buses to the
> - * number of bytes which fill to next memory boundary,
> - * limiting on the target length calculated above.
> + * Check against minimum bus alignment: Calculate actual
> + * transfer size in relation to bus width and get a
> + * maximum remainder of the smallest bus width - 1
> */
> - if (cctl & PL080_CONTROL_SRC_INCR)
> - bd.srcbus.fill_bytes =
> - pl08x_pre_boundary(bd.srcbus.addr,
> - target_len);
> - else
> - bd.srcbus.fill_bytes = target_len;
> -
> - if (cctl & PL080_CONTROL_DST_INCR)
> - bd.dstbus.fill_bytes =
> - pl08x_pre_boundary(bd.dstbus.addr,
> - target_len);
> - else
> - bd.dstbus.fill_bytes = target_len;
> -
> - /* Find the nearest */
> - lli_len = min(bd.srcbus.fill_bytes,
> - bd.dstbus.fill_bytes);
> -
> - BUG_ON(lli_len > bd.remainder);
> -
> - if (lli_len <= 0) {
> - dev_err(&pl08x->adev->dev,
> - "%s lli_len is %zu, <= 0\n",
> - __func__, lli_len);
> - return 0;
> - }
> + tsize = lli_len / min(mbus->buswidth, sbus->buswidth);
> + lli_len = tsize * min(mbus->buswidth, sbus->buswidth);
>
> - if (lli_len == target_len) {
> - /*
> - * Can send what we wanted.
> - * Maintain alignment
> - */
> - lli_len = (lli_len/mbus->buswidth) *
> - mbus->buswidth;
> - odd_bytes = 0;
> - } else {
> - /*
> - * So now we know how many bytes to transfer
> - * to get to the nearest boundary. The next
> - * LLI will past the boundary. However, we
> - * may be working to a boundary on the slave
> - * bus. We need to ensure the master stays
> - * aligned, and that we are working in
> - * multiples of the bus widths.
> - */
> - odd_bytes = lli_len % mbus->buswidth;
> - lli_len -= odd_bytes;
> - }
> -
> - if (lli_len) {
> - /*
> - * Check against minimum bus alignment:
> - * Calculate actual transfer size in relation
> - * to bus width an get a maximum remainder of
> - * the smallest bus width - 1
> - */
> - /* FIXME: use round_down()? */
> - tsize = lli_len / min(mbus->buswidth,
> - sbus->buswidth);
> - lli_len = tsize * min(mbus->buswidth,
> - sbus->buswidth);
> -
> - if (target_len != lli_len) {
> - dev_vdbg(&pl08x->adev->dev,
> - "%s can't send what we want. Desired "
> - "0x%08zx, lli of 0x%08zx bytes in txd "
> - "of 0x%08zx\n", __func__, target_len,
> - lli_len, txd->len);
> - }
> -
> - cctl = pl08x_cctl_bits(cctl,
> - bd.srcbus.buswidth,
> - bd.dstbus.buswidth,
> - tsize);
> -
> - dev_vdbg(&pl08x->adev->dev,
> + dev_vdbg(&pl08x->adev->dev,
> "%s fill lli with single lli chunk of "
> "size 0x%08zx (remainder 0x%08zx)\n",
> __func__, lli_len, bd.remainder);
> - pl08x_fill_lli_for_desc(&bd, num_llis++,
> - lli_len, cctl);
> - total_bytes += lli_len;
> - }
>
> - if (odd_bytes) {
> - /*
> - * Creep past the boundary, maintaining
> - * master alignment
> - */
> - int j;
> - for (j = 0; (j < mbus->buswidth)
> - && (bd.remainder); j++) {
> - cctl = pl08x_cctl_bits(cctl, 1, 1, 1);
> - dev_vdbg(&pl08x->adev->dev,
> - "%s align with boundary, single"
> - " byte (remain 0x%08zx)\n",
> - __func__, bd.remainder);
> - pl08x_fill_lli_for_desc(&bd,
> - num_llis++, 1, cctl);
> - total_bytes++;
> - }
> - }
> + cctl = pl08x_cctl_bits(cctl, bd.srcbus.buswidth,
> + bd.dstbus.buswidth, tsize);
> + pl08x_fill_lli_for_desc(&bd, num_llis++, lli_len, cctl);
> + total_bytes += lli_len;
> }
>
> /*
> @@ -808,6 +697,7 @@ static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
> total_bytes++;
> }
> }
> +
> if (total_bytes != txd->len) {
> dev_err(&pl08x->adev->dev,
> "%s size of encoded lli:s don't match total txd, "
> diff --git a/include/linux/amba/pl08x.h b/include/linux/amba/pl08x.h
> index 5509a50..98628a8 100644
> --- a/include/linux/amba/pl08x.h
> +++ b/include/linux/amba/pl08x.h
> @@ -77,13 +77,11 @@ struct pl08x_channel_data {
> * @addr: current address
> * @maxwidth: the maximum width of a transfer on this bus
> * @buswidth: the width of this bus in bytes: 1, 2 or 4
> - * @fill_bytes: bytes required to fill to the next bus memory boundary
> */
> struct pl08x_bus_data {
> dma_addr_t addr;
> u8 maxwidth;
> u8 buswidth;
> - size_t fill_bytes;
> };
>
> /**
--
~Vinod
next prev parent reply other threads:[~2011-07-29 12:19 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-29 10:49 [PATCH 00/18] dmaengine/amba-pl08x updates Viresh Kumar
2011-07-29 10:49 ` [PATCH 01/18] ARM: asm/pl080.h: Protect against multiple inclusion of header file Viresh Kumar
2011-07-30 22:16 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 02/18] dmaengine/amba-pl08x: Resolve formatting issues Viresh Kumar
2011-07-29 11:00 ` Russell King - ARM Linux
2011-07-29 11:21 ` viresh kumar
2011-07-29 12:05 ` Koul, Vinod
2011-07-29 15:25 ` viresh kumar
2011-07-29 10:49 ` [PATCH 03/18] dmaengine/amba-pl08x: Complete doc comment for struct pl08x_txd Viresh Kumar
2011-07-29 10:49 ` [PATCH 04/18] dmaengine/amba-pl08x: Remove redundant comment and rewrite original Viresh Kumar
2011-07-29 12:09 ` Koul, Vinod
2011-07-29 15:47 ` viresh kumar
2011-07-29 16:34 ` Russell King - ARM Linux
2011-07-30 22:32 ` Linus Walleij
2011-07-30 22:57 ` Russell King - ARM Linux
2011-07-30 23:37 ` Linus Walleij
2011-07-31 5:51 ` viresh kumar
2011-07-31 9:06 ` Russell King - ARM Linux
2011-07-29 10:49 ` [PATCH 05/18] dmaengine/amba-pl08x: Changing few prints to dev_dbg from dev_info Viresh Kumar
2011-07-30 22:34 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 06/18] dmaengine/amba-pl08x: Simplify pl08x_ensure_on() Viresh Kumar
2011-07-30 22:36 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 07/18] dmaengine/amba-pl08x: Enable/Disable amba_pclk with channel requests Viresh Kumar
2011-07-30 12:07 ` Russell King - ARM Linux
2011-07-30 13:05 ` Russell King - ARM Linux
2011-07-30 23:53 ` Linus Walleij
2011-07-31 0:04 ` Linus Walleij
2011-07-31 17:04 ` Russell King - ARM Linux
2011-08-02 9:05 ` Linus Walleij
2011-08-03 12:55 ` Russell King - ARM Linux
2011-08-09 19:50 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 08/18] dmaengine/amba-pl08x: No need to check "ch->signal < 0" Viresh Kumar
2011-07-31 0:09 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 09/18] dmaengine/amba-pl08x: Schedule tasklet in case of error interrupt Viresh Kumar
2011-07-29 12:16 ` Koul, Vinod
2011-07-29 13:02 ` Russell King - ARM Linux
2011-07-29 15:30 ` viresh kumar
2011-08-04 4:25 ` Koul, Vinod
2011-08-04 5:54 ` viresh kumar
2011-08-04 5:32 ` Koul, Vinod
2011-08-14 8:29 ` Russell King - ARM Linux
2011-07-31 0:19 ` Linus Walleij
2011-07-31 5:33 ` viresh kumar
2011-07-29 10:49 ` [PATCH 10/18] dmaengine/amba-pl08x: Get rid of pl08x_pre_boundary() Viresh Kumar
2011-07-29 11:05 ` Russell King - ARM Linux
2011-07-29 12:32 ` Koul, Vinod
2011-07-29 15:58 ` viresh kumar
2011-07-29 12:19 ` Koul, Vinod [this message]
2011-07-29 15:40 ` viresh kumar
2011-07-31 0:24 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 11/18] dmaengine/amba-pl08x: max_bytes_per_lli is TRANSFER_SIZE * src_width (not MIN(width)) Viresh Kumar
2011-07-31 0:27 ` Linus Walleij
2011-07-31 9:09 ` Russell King - ARM Linux
2011-07-29 10:49 ` [PATCH 12/18] dmaengine/amba-pl08x: Add prep_single_byte_llis() routine Viresh Kumar
2011-07-29 11:06 ` Russell King - ARM Linux
2011-07-29 11:30 ` viresh kumar
2011-07-29 10:49 ` [PATCH 13/18] dmaengine/amba-pl08x: Align lli_len to max(src.width, dst.width) Viresh Kumar
2011-07-29 12:43 ` Koul, Vinod
2011-07-29 15:39 ` viresh kumar
2011-07-31 0:30 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 14/18] dmaengine/amba-pl08x: Choose peripheral bus as master bus Viresh Kumar
2011-07-31 0:36 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 15/18] dmaengine/amba-pl08x: Pass flow controller information with slave channel data Viresh Kumar
2011-07-29 11:10 ` Russell King - ARM Linux
2011-07-29 11:31 ` viresh kumar
2011-07-31 0:40 ` Linus Walleij
2011-07-31 5:36 ` viresh kumar
2011-07-29 10:49 ` [PATCH 16/18] dmaengine/amba-pl08x: Add support for sg len greater than one for slave transfers Viresh Kumar
2011-07-31 0:41 ` Linus Walleij
2011-08-14 8:36 ` Russell King - ARM Linux
2011-08-15 10:11 ` Linus Walleij
2011-08-18 8:38 ` Viresh Kumar
2011-08-21 8:33 ` Russell King - ARM Linux
2011-08-23 4:22 ` Viresh Kumar
2011-08-23 5:20 ` Koul, Vinod
2011-08-26 3:41 ` Viresh Kumar
2011-08-26 8:03 ` Linus Walleij
2011-08-26 8:51 ` Viresh Kumar
2011-09-01 10:07 ` Viresh Kumar
2011-09-07 18:42 ` Koul, Vinod
2011-09-07 23:01 ` Linus Walleij
2011-09-08 3:50 ` Viresh Kumar
2011-09-08 10:29 ` Linus Walleij
2011-09-08 21:54 ` [PATCH 16/18] dmaengine/ambhe rest oa-pl08x: " Vinod Koul
2011-09-20 6:19 ` Vinod Koul
2011-09-20 6:27 ` Viresh Kumar
2011-09-20 8:08 ` Vinod Koul
2011-07-29 10:49 ` [PATCH 17/18] dmaengine/amba-pl08x: Check txd->llis_va before freeing dma_pool Viresh Kumar
2011-07-31 0:44 ` Linus Walleij
2011-07-29 10:49 ` [PATCH 18/18] dmaengine/amba-pl08x: Call pl08x_free_txd() instead of calling kfree() directly Viresh Kumar
2011-07-29 11:15 ` Russell King - ARM Linux
2011-07-29 11:38 ` viresh kumar
2011-07-31 0:45 ` Linus Walleij
2011-07-31 5:39 ` viresh kumar
2011-07-29 10:57 ` [PATCH 00/18] dmaengine/amba-pl08x updates Russell King - ARM Linux
2011-07-29 11:14 ` viresh kumar
2011-07-29 11:19 ` Russell King - ARM Linux
2011-07-29 11:23 ` viresh kumar
2011-07-29 12:43 ` Russell King - ARM Linux
2011-07-29 15:22 ` viresh kumar
2011-07-29 11:58 ` Koul, Vinod
2011-08-01 5:30 ` viresh kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1311941980.1536.534.camel@vkoul-udesk3 \
--to=vinod.koul@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).