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 <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/cell/iommu.c |    9 ++++-----
 1 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/platforms/cell/iommu.c 
b/arch/powerpc/platforms/cell/iommu.c
index 2c703f6..a7bbc0a 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -347,9 +347,8 @@ static unsigned long *cell_iommu_alloc_ptab(struct 
cbe_iommu *iommu,
        ptab = page_address(page);
        memset(ptab, 0, ptab_size);
 
-       /* number of pages needed for a page table */
-       n_pte_pages = (pages_per_segment *
-                      sizeof(unsigned long)) >> IOMMU_PAGE_SHIFT;
+       /* number of 4K pages needed for a page table */
+       n_pte_pages = (pages_per_segment * sizeof(unsigned long)) >> 12;
 
        pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n",
                        __FUNCTION__, iommu->nid, iommu->stab, ptab,
@@ -369,8 +368,8 @@ static unsigned long *cell_iommu_alloc_ptab(struct 
cbe_iommu *iommu,
 
        pr_debug("Setting up IOMMU stab:\n");
        for (i = start_seg; i < (start_seg + segments); i++) {
-               iommu->stab[i] = reg | (__pa(ptab) + n_pte_pages *
-                                       IOMMU_PAGE_SIZE * (i - start_seg));
+               iommu->stab[i] = reg | (__pa(ptab) + (n_pte_pages << 12) *
+                                       (i - start_seg));
                pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]);
        }
 
-- 
1.5.2.rc1.1884.g59b20

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to