diff options
Diffstat (limited to 'arch/sparc64/kernel/pci_iommu.c')
-rw-r--r-- | arch/sparc64/kernel/pci_iommu.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/arch/sparc64/kernel/pci_iommu.c b/arch/sparc64/kernel/pci_iommu.c index 66712772f494..9e405cbbcb0d 100644 --- a/arch/sparc64/kernel/pci_iommu.c +++ b/arch/sparc64/kernel/pci_iommu.c | |||
@@ -37,17 +37,21 @@ | |||
37 | /* Must be invoked under the IOMMU lock. */ | 37 | /* Must be invoked under the IOMMU lock. */ |
38 | static void __iommu_flushall(struct iommu *iommu) | 38 | static void __iommu_flushall(struct iommu *iommu) |
39 | { | 39 | { |
40 | unsigned long tag; | 40 | if (iommu->iommu_flushinv) { |
41 | int entry; | 41 | pci_iommu_write(iommu->iommu_flushinv, ~(u64)0); |
42 | } else { | ||
43 | unsigned long tag; | ||
44 | int entry; | ||
42 | 45 | ||
43 | tag = iommu->iommu_flush + (0xa580UL - 0x0210UL); | 46 | tag = iommu->iommu_flush + (0xa580UL - 0x0210UL); |
44 | for (entry = 0; entry < 16; entry++) { | 47 | for (entry = 0; entry < 16; entry++) { |
45 | pci_iommu_write(tag, 0); | 48 | pci_iommu_write(tag, 0); |
46 | tag += 8; | 49 | tag += 8; |
47 | } | 50 | } |
48 | 51 | ||
49 | /* Ensure completion of previous PIO writes. */ | 52 | /* Ensure completion of previous PIO writes. */ |
50 | (void) pci_iommu_read(iommu->write_complete_reg); | 53 | (void) pci_iommu_read(iommu->write_complete_reg); |
54 | } | ||
51 | } | 55 | } |
52 | 56 | ||
53 | #define IOPTE_CONSISTENT(CTX) \ | 57 | #define IOPTE_CONSISTENT(CTX) \ |