Commit 618d3adc authored by Jake Moilanen's avatar Jake Moilanen Committed by Paul Mackerras

[POWERPC] DMA 4GB boundary protection

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: default avatarJake Moilanen <moilanen@austin.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 723ec731
...@@ -76,6 +76,7 @@ static unsigned long iommu_range_alloc(struct iommu_table *tbl, ...@@ -76,6 +76,7 @@ static unsigned long iommu_range_alloc(struct iommu_table *tbl,
unsigned int align_order) unsigned int align_order)
{ {
unsigned long n, end, i, start; unsigned long n, end, i, start;
unsigned long start_addr, end_addr;
unsigned long limit; unsigned long limit;
int largealloc = npages > 15; int largealloc = npages > 15;
int pass = 0; int pass = 0;
...@@ -146,6 +147,15 @@ static unsigned long iommu_range_alloc(struct iommu_table *tbl, ...@@ -146,6 +147,15 @@ static unsigned long iommu_range_alloc(struct iommu_table *tbl,
} }
} }
/* 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++) for (i = n; i < end; i++)
if (test_bit(i, tbl->it_map)) { if (test_bit(i, tbl->it_map)) {
start = i+1; start = i+1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment