diff options
author | Paul Mackerras <paulus@samba.org> | 2008-01-23 18:07:21 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-01-23 18:07:21 -0500 |
commit | 9156ad48338e0306e508ead5c0d9986050744475 (patch) | |
tree | 37f3a90e38190052ecf3cdf9171dfdddd37b56fd /arch/powerpc/kernel/iommu.c | |
parent | fa28237cfcc5827553044cbd6ee52e33692b0faa (diff) | |
parent | 8f7b3d156d348b6766833cd4e272d0d19b501e64 (diff) |
Merge branch 'linux-2.6'
Diffstat (limited to 'arch/powerpc/kernel/iommu.c')
-rw-r--r-- | arch/powerpc/kernel/iommu.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 47c3fe55242f..a3c406aca664 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
@@ -278,6 +278,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
278 | unsigned long flags; | 278 | unsigned long flags; |
279 | struct scatterlist *s, *outs, *segstart; | 279 | struct scatterlist *s, *outs, *segstart; |
280 | int outcount, incount, i; | 280 | int outcount, incount, i; |
281 | unsigned int align; | ||
281 | unsigned long handle; | 282 | unsigned long handle; |
282 | 283 | ||
283 | BUG_ON(direction == DMA_NONE); | 284 | BUG_ON(direction == DMA_NONE); |
@@ -309,7 +310,12 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
309 | /* Allocate iommu entries for that segment */ | 310 | /* Allocate iommu entries for that segment */ |
310 | vaddr = (unsigned long) sg_virt(s); | 311 | vaddr = (unsigned long) sg_virt(s); |
311 | npages = iommu_num_pages(vaddr, slen); | 312 | npages = iommu_num_pages(vaddr, slen); |
312 | entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0); | 313 | align = 0; |
314 | if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && slen >= PAGE_SIZE && | ||
315 | (vaddr & ~PAGE_MASK) == 0) | ||
316 | align = PAGE_SHIFT - IOMMU_PAGE_SHIFT; | ||
317 | entry = iommu_range_alloc(tbl, npages, &handle, | ||
318 | mask >> IOMMU_PAGE_SHIFT, align); | ||
313 | 319 | ||
314 | DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); | 320 | DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); |
315 | 321 | ||
@@ -570,7 +576,7 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
570 | { | 576 | { |
571 | dma_addr_t dma_handle = DMA_ERROR_CODE; | 577 | dma_addr_t dma_handle = DMA_ERROR_CODE; |
572 | unsigned long uaddr; | 578 | unsigned long uaddr; |
573 | unsigned int npages; | 579 | unsigned int npages, align; |
574 | 580 | ||
575 | BUG_ON(direction == DMA_NONE); | 581 | BUG_ON(direction == DMA_NONE); |
576 | 582 | ||
@@ -578,8 +584,13 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
578 | npages = iommu_num_pages(uaddr, size); | 584 | npages = iommu_num_pages(uaddr, size); |
579 | 585 | ||
580 | if (tbl) { | 586 | if (tbl) { |
587 | align = 0; | ||
588 | if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && size >= PAGE_SIZE && | ||
589 | ((unsigned long)vaddr & ~PAGE_MASK) == 0) | ||
590 | align = PAGE_SHIFT - IOMMU_PAGE_SHIFT; | ||
591 | |||
581 | dma_handle = iommu_alloc(tbl, vaddr, npages, direction, | 592 | dma_handle = iommu_alloc(tbl, vaddr, npages, direction, |
582 | mask >> IOMMU_PAGE_SHIFT, 0); | 593 | mask >> IOMMU_PAGE_SHIFT, align); |
583 | if (dma_handle == DMA_ERROR_CODE) { | 594 | if (dma_handle == DMA_ERROR_CODE) { |
584 | if (printk_ratelimit()) { | 595 | if (printk_ratelimit()) { |
585 | printk(KERN_INFO "iommu_alloc failed, " | 596 | printk(KERN_INFO "iommu_alloc failed, " |