diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2008-02-29 02:33:23 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2008-03-03 02:03:15 -0500 |
commit | 0d7386ebffd8506b28c37a7d5541132a576f64e2 (patch) | |
tree | 11787b0cc75354af5fe44187cb36840f8dfac18c | |
parent | f9660e8a6c16e17935777cdee5194842904c2d72 (diff) |
[POWERPC] Use it_offset not pte_offset in cell IOMMU code
The cell IOMMU tce build and free routines use pte_offset to convert
the index passed from the generic IOMMU code into a page table offset.
This takes into account the SPIDER_DMA_OFFSET which sets the top bit
of every DMA address.
However it doesn't cater for the IOMMU window starting at a non-zero
address, as the base of the window is not incorporated into pte_offset
at all.
As it turns out tbl->it_offset already contains the value we need, it
takes into account the base of the window and also pte_offset. So use
it instead!
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r-- | arch/powerpc/platforms/cell/iommu.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c index bbe838996470..4e75919bf6b9 100644 --- a/arch/powerpc/platforms/cell/iommu.c +++ b/arch/powerpc/platforms/cell/iommu.c | |||
@@ -200,7 +200,7 @@ static void tce_build_cell(struct iommu_table *tbl, long index, long npages, | |||
200 | (window->ioid & IOPTE_IOID_Mask); | 200 | (window->ioid & IOPTE_IOID_Mask); |
201 | #endif | 201 | #endif |
202 | 202 | ||
203 | io_pte = (unsigned long *)tbl->it_base + (index - window->pte_offset); | 203 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); |
204 | 204 | ||
205 | for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE) | 205 | for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE) |
206 | io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask); | 206 | io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask); |
@@ -232,7 +232,7 @@ static void tce_free_cell(struct iommu_table *tbl, long index, long npages) | |||
232 | | (window->ioid & IOPTE_IOID_Mask); | 232 | | (window->ioid & IOPTE_IOID_Mask); |
233 | #endif | 233 | #endif |
234 | 234 | ||
235 | io_pte = (unsigned long *)tbl->it_base + (index - window->pte_offset); | 235 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); |
236 | 236 | ||
237 | for (i = 0; i < npages; i++) | 237 | for (i = 0; i < npages; i++) |
238 | io_pte[i] = pte; | 238 | io_pte[i] = pte; |