[POWERPC] Cell IOMMU: n_pte_pages is in 4K page units, not IOMMU_PAGE_SIZE
authorMichael Ellerman <michael@ellerman.id.au>
Fri, 29 Feb 2008 07:33:26 +0000 (18:33 +1100)
committerArnd Bergmann <arnd@arndb.de>
Mon, 3 Mar 2008 07:03:15 +0000 (08:03 +0100)
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>
arch/powerpc/platforms/cell/iommu.c

index 187a723eafcde594aba7c9d174dc14edfd3f531d..7a861cb960d2fd0ab67624981764343f37e00d66 100644 (file)
@@ -348,9 +348,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,
@@ -377,8 +376,8 @@ static unsigned long *cell_iommu_alloc_ptab(struct cbe_iommu *iommu,
                        pr_debug("\toverlap at %d, skipping\n", i);
                        continue;
                }
-               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]);
        }