X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fpowerpc%2Fsysdev%2Fdart_iommu.c;h=38087bd6e3cf4273d5efeb38baa68ccf90328245;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=03b4477dd7f0a88e4e6ac0797a9a3c4d29cda7bf;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c index 03b4477dd..38087bd6e 100644 --- a/arch/powerpc/sysdev/dart_iommu.c +++ b/arch/powerpc/sysdev/dart_iommu.c @@ -27,6 +27,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -100,8 +101,8 @@ retry: if (l == (1L << limit)) { if (limit < 4) { limit++; - reg = DART_IN(DART_CNTL); - reg &= ~inv_bit; + reg = DART_IN(DART_CNTL); + reg &= ~inv_bit; DART_OUT(DART_CNTL, reg); goto retry; } else @@ -110,40 +111,11 @@ retry: } } -static inline void dart_tlb_invalidate_one(unsigned long bus_rpn) -{ - unsigned int reg; - unsigned int l, limit; - - reg = DART_CNTL_U4_ENABLE | DART_CNTL_U4_IONE | - (bus_rpn & DART_CNTL_U4_IONE_MASK); - DART_OUT(DART_CNTL, reg); - - limit = 0; -wait_more: - l = 0; - while ((DART_IN(DART_CNTL) & DART_CNTL_U4_IONE) && l < (1L << limit)) { - rmb(); - l++; - } - - if (l == (1L << limit)) { - if (limit < 4) { - limit++; - goto wait_more; - } else - panic("DART: TLB did not flush after waiting a long " - "time. Buggy U4 ?"); - } -} - static void dart_flush(struct iommu_table *tbl) { - mb(); - if (dart_dirty) { + if (dart_dirty) dart_tlb_invalidate_all(); - dart_dirty = 0; - } + dart_dirty = 0; } static void dart_build(struct iommu_table *tbl, long index, @@ -152,7 +124,6 @@ static void dart_build(struct iommu_table *tbl, long index, { unsigned int *dp; unsigned int rpn; - long l; DBG("dart: build at: %lx, %lx, addr: %x\n", index, npages, uaddr); @@ -164,8 +135,7 @@ static void dart_build(struct iommu_table *tbl, long index, /* On U3, all memory is contigous, so we can move this * out of the loop. */ - l = npages; - while (l--) { + while (npages--) { rpn = virt_to_abs(uaddr) >> DART_PAGE_SHIFT; *(dp++) = DARTMAP_VALID | (rpn & DARTMAP_RPNMASK); @@ -173,18 +143,7 @@ static void dart_build(struct iommu_table *tbl, long index, uaddr += DART_PAGE_SIZE; } - /* make sure all updates have reached memory */ - mb(); - in_be32((unsigned __iomem *)dp); - mb(); - - if (dart_is_u4) { - rpn = index; - while (npages--) - dart_tlb_invalidate_one(rpn++); - } else { - dart_dirty = 1; - } + dart_dirty = 1; } @@ -287,7 +246,7 @@ static void iommu_table_dart_setup(void) iommu_table_dart.it_base = (unsigned long)dart_vbase; iommu_table_dart.it_index = 0; iommu_table_dart.it_blocksize = 1; - iommu_init_table(&iommu_table_dart, -1); + iommu_init_table(&iommu_table_dart); /* Reserve the last page of the DART to avoid possible prefetch * past the DART mapped area