31 #include <linux/types.h>
34 #include <linux/string.h>
35 #include <linux/pci.h>
43 #include <asm/iommu.h>
44 #include <asm/pci-bridge.h>
45 #include <asm/machdep.h>
46 #include <asm/cacheflush.h>
53 static unsigned long dart_tablesize;
56 static u32 *dart_vbase;
58 static u32 *dart_copy;
62 static unsigned int __iomem *dart;
65 static unsigned int dart_emptyval;
68 static int iommu_table_dart_inited;
69 static int dart_dirty;
70 static int dart_is_u4;
72 #define DART_U4_BYPASS_BASE 0x8000000000ull
78 static inline void dart_tlb_invalidate_all(
void)
81 unsigned int reg, inv_bit;
107 if (l == (1L << limit)) {
115 panic(
"DART: TLB did not flush after waiting a long "
119 spin_unlock_irqrestore(&invalidate_lock, flags);
122 static inline void dart_tlb_invalidate_one(
unsigned long bus_rpn)
142 if (l == (1L << limit)) {
147 panic(
"DART: TLB did not flush after waiting a long "
151 spin_unlock_irqrestore(&invalidate_lock, flags);
158 dart_tlb_invalidate_all();
164 long npages,
unsigned long uaddr,
172 DBG(
"dart: build at: %lx, %lx, addr: %x\n", index, npages, uaddr);
196 dart_tlb_invalidate_one(rpn++);
204 static void dart_free(
struct iommu_table *tbl,
long index,
long npages)
213 DBG(
"dart: free at: %lx, %lx\n", index, npages);
218 *(dp++) = dart_emptyval;
235 panic(
"DART: can't get register base ! ");
253 dart =
ioremap(
r.start, resource_size(&
r));
255 panic(
"DART: Cannot map registers!");
261 for (i = 0; i < dart_tablesize/4; i++)
262 dart_vbase[i] = dart_emptyval;
281 dart_tlb_invalidate_all();
284 dart_is_u4 ?
"U4" :
"U3");
289 static void iommu_table_dart_setup(
void)
291 iommu_table_dart.it_busno = 0;
292 iommu_table_dart.it_offset = 0;
294 iommu_table_dart.it_size = dart_tablesize /
sizeof(
u32);
297 iommu_table_dart.it_base = (
unsigned long)dart_vbase;
298 iommu_table_dart.it_index = 0;
299 iommu_table_dart.it_blocksize = 1;
305 set_bit(iommu_table_dart.it_size - 1, iommu_table_dart.it_map);
308 static void dma_dev_setup_dart(
struct device *
dev)
316 set_iommu_table_base(dev, &iommu_table_dart);
319 static void pci_dma_dev_setup_dart(
struct pci_dev *dev)
321 dma_dev_setup_dart(&dev->
dev);
324 static void pci_dma_bus_setup_dart(
struct pci_bus *
bus)
326 if (!iommu_table_dart_inited) {
327 iommu_table_dart_inited = 1;
328 iommu_table_dart_setup();
332 static bool dart_device_on_pcie(
struct device *dev)
347 static int dart_dma_set_mask(
struct device *dev,
u64 dma_mask)
358 if (dart_device_on_pcie(dev) && dma_mask >=
DMA_BIT_MASK(40)) {
359 dev_info(dev,
"Using 64-bit DMA iommu bypass\n");
362 dev_info(dev,
"Using 32-bit DMA via iommu\n");
365 dma_dev_setup_dart(dev);
385 if (dart_init(dn) != 0)
389 ppc_md.tce_build = dart_build;
390 ppc_md.tce_free = dart_free;
391 ppc_md.tce_flush = dart_flush;
395 ppc_md.dma_set_mask = dart_dma_set_mask;
397 ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_dart;
398 ppc_md.pci_dma_bus_setup = pci_dma_bus_setup_dart;
414 static void iommu_dart_save(
void)
416 memcpy(dart_copy, dart_vbase, 2*1024*1024);
419 static void iommu_dart_restore(
void)
421 memcpy(dart_vbase, dart_copy, 2*1024*1024);
422 dart_tlb_invalidate_all();
425 static int __init iommu_init_late_dart(
void)
427 unsigned long tbasepfn;
436 register_nosave_region_late(tbasepfn,
447 ppc_md.iommu_save = iommu_dart_save;
448 ppc_md.iommu_restore = iommu_dart_restore;
472 dart_tablesize = 1
UL << 21;