lkml.org 
[lkml]   [2008]   [Jul]   [23]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
DateWed, 23 Jul 2008 09:01:34 +0200
From"pHilipp Zabel" <>
SubjectRe: [patch 44/47] pxamci: fix byte aligned DMA transfers
Hi,

On Wed, Jul 23, 2008 at 1:17 AM, Greg KH <gregkh@suse.de> wrote:
> 2.6.25-stable review patch.  If anyone has any objections, please let us
> know.

There is an ugly typo in the patch below that was fixed by Karl Beldan:
http://git.kernel.org/?p=linux/kernel/git/drzeus/mmc.git;a=commit;h=28bbe535df5c461c25eb57affb30e007072429c3

Not sure how you handle this, maybe this patch should only go in
together with the other.

> ------------------
> From: Philipp Zabel <philipp.zabel@gmail.com>
>
> commit 97f8571e663c808ad2d01a396627235167291556 upstream
>
> The pxa27x DMA controller defaults to 64-bit alignment. This caused
> the SCR reads to fail (and, depending on card type, error out) when
> card->raw_scr was not aligned on a 8-byte boundary.
>
> For performance reasons all scatter-gather addresses passed to
> pxamci_request should be aligned on 8-byte boundaries, but if
> this can't be guaranteed, byte aligned DMA transfers in the
> have to be enabled in the controller to get correct behaviour.
>
> Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
>
> ---
>  drivers/mmc/host/pxamci.c |   13 +++++++++++++
>  1 file changed, 13 insertions(+)
>
> --- a/drivers/mmc/host/pxamci.c
> +++ b/drivers/mmc/host/pxamci.c
> @@ -114,6 +114,7 @@ static void pxamci_setup_data(struct pxa
>        unsigned int nob = data->blocks;
>        unsigned long long clks;
>        unsigned int timeout;
> +       bool dalgn = 0;
>        u32 dcmd;
>        int i;
>
> @@ -152,6 +153,9 @@ static void pxamci_setup_data(struct pxa
>                host->sg_cpu[i].dcmd = dcmd | length;
>                if (length & 31 && !(data->flags & MMC_DATA_READ))
>                        host->sg_cpu[i].dcmd |= DCMD_ENDIRQEN;
> +               /* Not aligned to 8-byte boundary? */
> +               if (sg_dma_address(&data->sg[i]) & 0x7)
> +                       dalgn = 1;
>                if (data->flags & MMC_DATA_READ) {
>                        host->sg_cpu[i].dsadr = host->res->start + MMC_RXFIFO;
>                        host->sg_cpu[i].dtadr = sg_dma_address(&data->sg[i]);
> @@ -165,6 +169,15 @@ static void pxamci_setup_data(struct pxa
>        host->sg_cpu[host->dma_len - 1].ddadr = DDADR_STOP;
>        wmb();
>
> +       /*
> +        * The PXA27x DMA controller encounters overhead when working with
> +        * unaligned (to 8-byte boundaries) data, so switch on byte alignment
> +        * mode only if we have unaligned data.
> +        */
> +       if (dalgn)
> +               DALGN |= (1 << host->dma);
> +       else
> +               DALGN &= (1 << host->dma);
                         ^^^^^ here

>        DDADR(host->dma) = host->sg_dma;
>        DCSR(host->dma) = DCSR_RUN;
>  }
>
> --
>

regards
Philipp


\
 
 \ /
  Last update: 2008-07-23 09:03    [from the cache]
©2003-2008