linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] DMA 4GB boundary protection
@ 2007-03-02 21:49 Jake Moilanen
  2007-03-02 22:27 ` Olof Johansson
  2007-03-03 23:29 ` Olof Johansson
  0 siblings, 2 replies; 25+ messages in thread
From: Jake Moilanen @ 2007-03-02 21:49 UTC (permalink / raw)
  To: paulus, olof; +Cc: linuxppc-dev

There are many adapters which can not handle DMAing acrosss any 4 GB
boundary.  For instance the latest Emulex adapters.  

This normally is not an issue as firmware gives us dma-windows under
4gigs.  However, some of the new System-P boxes have dma-windows above
4gigs, and this present a problem.

I propose fixing it in the IOMMU allocation instead of making each
driver protect against it as it is more efficient, and won't require
changing every driver which has not considered this issue.

This patch checks to see if the mapping spans a 4 gig boundary, and if
it does, retries the allocation.  It tries the next allocation at the
start of the crossed 4 gig boundary.

Signed-off-by: Jake Moilanen <moilanen@austin.ibm.com>
---

 arch/powerpc/kernel/iommu.c |   10 ++++++++++
 1 files changed, 10 insertions(+)

Index: powerpc/arch/powerpc/kernel/iommu.c
===================================================================
--- powerpc.orig/arch/powerpc/kernel/iommu.c
+++ powerpc/arch/powerpc/kernel/iommu.c
@@ -76,6 +76,7 @@ static unsigned long iommu_range_alloc(s
                                        unsigned int align_order)
 { 
 	unsigned long n, end, i, start;
+	unsigned long start_addr, end_addr;
 	unsigned long limit;
 	int largealloc = npages > 15;
 	int pass = 0;
@@ -146,6 +147,15 @@ static unsigned long iommu_range_alloc(s
 		}
 	}
 
+	/* DMA cannot cross 4 GB boundary */
+	start_addr = (n + tbl->it_offset) << PAGE_SHIFT;
+	end_addr = (end + tbl->it_offset) << PAGE_SHIFT;
+	if ((start_addr >> 32) != (end_addr >> 32)) {
+		end_addr &= 0xffffffff00000000l;
+		start = (end_addr >> PAGE_SHIFT) - tbl->it_offset;
+		goto again;
+	}
+
 	for (i = n; i < end; i++)
 		if (test_bit(i, tbl->it_map)) {
 			start = i+1;

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2007-04-24  3:07 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-02 21:49 [PATCH] DMA 4GB boundary protection Jake Moilanen
2007-03-02 22:27 ` Olof Johansson
2007-03-03  8:27   ` Benjamin Herrenschmidt
2007-03-03 23:25     ` Olof Johansson
2007-03-04  5:17     ` Christoph Hellwig
2007-03-04  5:52       ` Olof Johansson
2007-03-03 23:29 ` Olof Johansson
2007-03-03 23:32   ` Segher Boessenkool
2007-03-03 23:57     ` Olof Johansson
2007-03-21 21:05   ` Jake Moilanen
2007-03-21 21:39     ` Olof Johansson
2007-03-22 17:53     ` Olof Johansson
2007-03-22 17:47       ` Jake Moilanen
2007-03-22 22:52       ` Segher Boessenkool
2007-03-27 20:10       ` Jake Moilanen
2007-03-27 20:55         ` Benjamin Herrenschmidt
2007-03-27 23:48         ` Paul Mackerras
2007-03-28 15:56         ` Olof Johansson
2007-03-28 18:17           ` Jake Moilanen
2007-03-28 23:23             ` Benjamin Herrenschmidt
2007-03-29 13:44               ` Jake Moilanen
2007-03-29 14:52                 ` Olof Johansson
2007-03-29 21:54                 ` Benjamin Herrenschmidt
2007-04-23 12:22                 ` Paul Mackerras
2007-04-24  3:07                   ` Olof Johansson

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).