aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/cell/iommu.c
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2008-02-29 02:33:26 -0500
committerArnd Bergmann <arnd@arndb.de>2008-03-03 02:03:15 -0500
commit3d3e6da17d6af42a3fd4891fb09d93dca002e590 (patch)
tree935904836cd15fdc438076dc135c54a6c6ecca2c /arch/powerpc/platforms/cell/iommu.c
parent7d432ff1b7db87e78eb74d42631d2a23ca6f26f2 (diff)
[POWERPC] Cell IOMMU: n_pte_pages is in 4K page units, not IOMMU_PAGE_SIZE
We use n_pte_pages to calculate the stride through the page tables, but we also use it to set the NPPT value in the segment table entry. That is defined as the number of 4K pages per segment, so we should calculate it as such regardless of the IOMMU page size. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/powerpc/platforms/cell/iommu.c')
-rw-r--r--arch/powerpc/platforms/cell/iommu.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
index 187a723eafcd..7a861cb960d2 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -348,9 +348,8 @@ static unsigned long *cell_iommu_alloc_ptab(struct cbe_iommu *iommu,
348 ptab = page_address(page); 348 ptab = page_address(page);
349 memset(ptab, 0, ptab_size); 349 memset(ptab, 0, ptab_size);
350 350
351 /* number of pages needed for a page table */ 351 /* number of 4K pages needed for a page table */
352 n_pte_pages = (pages_per_segment * 352 n_pte_pages = (pages_per_segment * sizeof(unsigned long)) >> 12;
353 sizeof(unsigned long)) >> IOMMU_PAGE_SHIFT;
354 353
355 pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n", 354 pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n",
356 __FUNCTION__, iommu->nid, iommu->stab, ptab, 355 __FUNCTION__, iommu->nid, iommu->stab, ptab,
@@ -377,8 +376,8 @@ static unsigned long *cell_iommu_alloc_ptab(struct cbe_iommu *iommu,
377 pr_debug("\toverlap at %d, skipping\n", i); 376 pr_debug("\toverlap at %d, skipping\n", i);
378 continue; 377 continue;
379 } 378 }
380 iommu->stab[i] = reg | (__pa(ptab) + n_pte_pages * 379 iommu->stab[i] = reg | (__pa(ptab) + (n_pte_pages << 12) *
381 IOMMU_PAGE_SIZE * (i - start_seg)); 380 (i - start_seg));
382 pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]); 381 pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]);
383 } 382 }
384 383