From torvalds@linux-foundation.org Sat Jul 5 16:17:53 2008 -0700 Return-Path: Received: from woody.linux-foundation.org (woody.linux-foundation.org [127.0.0.1]) by woody.linux-foundation.org (8.14.2/8.14.2) with ESMTP id m65NHrMl003556 for ; Sat, 5 Jul 2008 16:17:53 -0700 Received: from imap1.linux-foundation.org [140.211.169.55] by woody.linux-foundation.org with IMAP (fetchmail-6.3.8) for (single-drop); Sat, 05 Jul 2008 16:17:53 -0700 (PDT) Received: from smtp1.linux-foundation.org (smtp1.linux-foundation.org [140.211.169.13]) by imap1.linux-foundation.org (8.13.5.20060308/8.13.5/Debian-3ubuntu1.1) with ESMTP id m65NGNAD010669 for ; Sat, 5 Jul 2008 16:16:23 -0700 Received: from smtp.drzeus.cx (server.drzeus.cx [85.8.24.28]) by smtp1.linux-foundation.org (8.14.2/8.13.5/Debian-3ubuntu1.1) with ESMTP id m65NFhCI026377 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sat, 5 Jul 2008 16:15:46 -0700 Received: from mjolnir.drzeus.cx (wlan248.drzeus.cx [::ffff:10.8.2.248]) (AUTH: LOGIN drzeus, TLS: TLSv1/SSLv3,256bits,AES256-SHA) by smtp.drzeus.cx with esmtp; Sun, 06 Jul 2008 01:15:39 +0200 id 0000000000128003.000000004870009B.00003DBE Date: Sun, 6 Jul 2008 01:15:34 +0200 From: Pierre Ossman To: Linus Torvalds Cc: LKML , Philipp Zabel , Stable branch Subject: [PATCH] pxamci: fix byte aligned DMA transfers Message-ID: <20080706011534.6dc71f5a@mjolnir.drzeus.cx> X-Mailer: Claws Mail 3.4.0 (GTK+ 2.13.3; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg=PGP-SHA1; boundary="=_freyr.drzeus.cx-15806-1215299739-0001-2" Received-SPF: none (domain of drzeus-list@drzeus.cx does not designate permitted sender hosts) X-Spam-Status: No, hits=-6.02 required=5 tests=AWL,BAYES_00,OSDL_HEADER_SUBJECT_BRACKETED,PATCH_SUBJECT_OSDL X-Spam-Checker-Version: SpamAssassin 3.2.4-osdl_revision__1.47__ X-MIMEDefang-Filter: lf$Revision: 1.188 $ X-Scanned-By: MIMEDefang 2.63 on 140.211.169.13 X-IMAPbase: 1215365788 1 Status: RO X-Status: X-Keywords: X-UID: 1 This is a MIME-formatted message. If you see this text it means that your E-mail software does not support MIME-formatted messages. --=_freyr.drzeus.cx-15806-1215299739-0001-2 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable From: Philipp Zabel 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 Signed-off-by: Pierre Ossman --- drivers/mmc/host/pxamci.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index 65210fc..d89475d 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c @@ -114,6 +114,7 @@ static void pxamci_setup_data(struct pxamci_host *host,= struct mmc_data *data) unsigned int nob =3D data->blocks; unsigned long long clks; unsigned int timeout; + bool dalgn =3D 0; u32 dcmd; int i; =20 @@ -152,6 +153,9 @@ static void pxamci_setup_data(struct pxamci_host *host,= struct mmc_data *data) host->sg_cpu[i].dcmd =3D dcmd | length; if (length & 31 && !(data->flags & MMC_DATA_READ)) host->sg_cpu[i].dcmd |=3D DCMD_ENDIRQEN; + /* Not aligned to 8-byte boundary? */ + if (sg_dma_address(&data->sg[i]) & 0x7) + dalgn =3D 1; if (data->flags & MMC_DATA_READ) { host->sg_cpu[i].dsadr =3D host->res->start + MMC_RXFIFO; host->sg_cpu[i].dtadr =3D sg_dma_address(&data->sg[i]); @@ -165,6 +169,15 @@ static void pxamci_setup_data(struct pxamci_host *host= , struct mmc_data *data) host->sg_cpu[host->dma_len - 1].ddadr =3D DDADR_STOP; wmb(); =20 + /* + * 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 |=3D (1 << host->dma); + else + DALGN &=3D (1 << host->dma); DDADR(host->dma) =3D host->sg_dma; DCSR(host->dma) =3D DCSR_RUN; } --=20 -- Pierre Ossman Linux kernel, MMC maintainer http://www.kernel.org rdesktop, core developer http://www.rdesktop.org WARNING: This correspondence is being monitored by the Swedish government. Make sure your server uses encryption for SMTP traffic and consider using PGP for end-to-end encryption. --=_freyr.drzeus.cx-15806-1215299739-0001-2 Content-Type: application/pgp-signature; name="signature.asc" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkhwAJsACgkQ7b8eESbyJLjDpwCgyde8Uz/u6iHD5/JwFyH6r8hA dvQAoMH38ZvMg355D4R0jXmUXYfJzJds =YuR1 -----END PGP SIGNATURE----- --=_freyr.drzeus.cx-15806-1215299739-0001-2--