diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-19 20:28:58 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-19 20:28:58 -0400 |
| commit | cbdad8dc18b8ddd6c8b48c4ef26d46f00b5af923 (patch) | |
| tree | 6354f5685db502e748b801873ed07ba1a7fa1f09 /arch/x86/include/asm | |
| parent | 51509a283a908d73b20371addc67ee3ae7189934 (diff) | |
| parent | 86b9523ab1517f6edeb87295329c901930d3732d (diff) | |
Merge branch 'core-iommu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-iommu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, gart: Rename pci-gart_64.c to amd_gart_64.c
x86/amd-iommu: Use threaded interupt handler
arch/x86/kernel/pci-iommu_table.c: Convert sprintf_symbol to %pS
x86/amd-iommu: Add support for invalidate_all command
x86/amd-iommu: Add extended feature detection
x86/amd-iommu: Add ATS enable/disable code
x86/amd-iommu: Add flag to indicate IOTLB support
x86/amd-iommu: Flush device IOTLB if ATS is enabled
x86/amd-iommu: Select PCI_IOV with AMD IOMMU driver
PCI: Move ATS declarations in seperate header file
dma-debug: print information about leaked entry
x86/amd-iommu: Flush all internal TLBs when IOMMUs are enabled
x86/amd-iommu: Rename iommu_flush_device
x86/amd-iommu: Improve handling of full command buffer
x86/amd-iommu: Rename iommu_flush* to domain_flush*
x86/amd-iommu: Remove command buffer resetting logic
x86/amd-iommu: Cleanup completion-wait handling
x86/amd-iommu: Cleanup inv_pages command handling
x86/amd-iommu: Move inv-dte command building to own function
x86/amd-iommu: Move compl-wait command building to own function
Diffstat (limited to 'arch/x86/include/asm')
| -rw-r--r-- | arch/x86/include/asm/amd_iommu_proto.h | 13 | ||||
| -rw-r--r-- | arch/x86/include/asm/amd_iommu_types.h | 28 |
2 files changed, 34 insertions, 7 deletions
diff --git a/arch/x86/include/asm/amd_iommu_proto.h b/arch/x86/include/asm/amd_iommu_proto.h index 916bc8111a01..55d95eb789b3 100644 --- a/arch/x86/include/asm/amd_iommu_proto.h +++ b/arch/x86/include/asm/amd_iommu_proto.h | |||
| @@ -19,13 +19,12 @@ | |||
| 19 | #ifndef _ASM_X86_AMD_IOMMU_PROTO_H | 19 | #ifndef _ASM_X86_AMD_IOMMU_PROTO_H |
| 20 | #define _ASM_X86_AMD_IOMMU_PROTO_H | 20 | #define _ASM_X86_AMD_IOMMU_PROTO_H |
| 21 | 21 | ||
| 22 | struct amd_iommu; | 22 | #include <asm/amd_iommu_types.h> |
| 23 | 23 | ||
| 24 | extern int amd_iommu_init_dma_ops(void); | 24 | extern int amd_iommu_init_dma_ops(void); |
| 25 | extern int amd_iommu_init_passthrough(void); | 25 | extern int amd_iommu_init_passthrough(void); |
| 26 | extern irqreturn_t amd_iommu_int_thread(int irq, void *data); | ||
| 26 | extern irqreturn_t amd_iommu_int_handler(int irq, void *data); | 27 | extern irqreturn_t amd_iommu_int_handler(int irq, void *data); |
| 27 | extern void amd_iommu_flush_all_domains(void); | ||
| 28 | extern void amd_iommu_flush_all_devices(void); | ||
| 29 | extern void amd_iommu_apply_erratum_63(u16 devid); | 28 | extern void amd_iommu_apply_erratum_63(u16 devid); |
| 30 | extern void amd_iommu_reset_cmd_buffer(struct amd_iommu *iommu); | 29 | extern void amd_iommu_reset_cmd_buffer(struct amd_iommu *iommu); |
| 31 | extern int amd_iommu_init_devices(void); | 30 | extern int amd_iommu_init_devices(void); |
| @@ -44,4 +43,12 @@ static inline bool is_rd890_iommu(struct pci_dev *pdev) | |||
| 44 | (pdev->device == PCI_DEVICE_ID_RD890_IOMMU); | 43 | (pdev->device == PCI_DEVICE_ID_RD890_IOMMU); |
| 45 | } | 44 | } |
| 46 | 45 | ||
| 46 | static inline bool iommu_feature(struct amd_iommu *iommu, u64 f) | ||
| 47 | { | ||
| 48 | if (!(iommu->cap & (1 << IOMMU_CAP_EFR))) | ||
| 49 | return false; | ||
| 50 | |||
| 51 | return !!(iommu->features & f); | ||
| 52 | } | ||
| 53 | |||
| 47 | #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ | 54 | #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ |
diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h index e3509fc303bf..4c9982995414 100644 --- a/arch/x86/include/asm/amd_iommu_types.h +++ b/arch/x86/include/asm/amd_iommu_types.h | |||
| @@ -68,12 +68,25 @@ | |||
| 68 | #define MMIO_CONTROL_OFFSET 0x0018 | 68 | #define MMIO_CONTROL_OFFSET 0x0018 |
| 69 | #define MMIO_EXCL_BASE_OFFSET 0x0020 | 69 | #define MMIO_EXCL_BASE_OFFSET 0x0020 |
| 70 | #define MMIO_EXCL_LIMIT_OFFSET 0x0028 | 70 | #define MMIO_EXCL_LIMIT_OFFSET 0x0028 |
| 71 | #define MMIO_EXT_FEATURES 0x0030 | ||
| 71 | #define MMIO_CMD_HEAD_OFFSET 0x2000 | 72 | #define MMIO_CMD_HEAD_OFFSET 0x2000 |
| 72 | #define MMIO_CMD_TAIL_OFFSET 0x2008 | 73 | #define MMIO_CMD_TAIL_OFFSET 0x2008 |
| 73 | #define MMIO_EVT_HEAD_OFFSET 0x2010 | 74 | #define MMIO_EVT_HEAD_OFFSET 0x2010 |
| 74 | #define MMIO_EVT_TAIL_OFFSET 0x2018 | 75 | #define MMIO_EVT_TAIL_OFFSET 0x2018 |
| 75 | #define MMIO_STATUS_OFFSET 0x2020 | 76 | #define MMIO_STATUS_OFFSET 0x2020 |
| 76 | 77 | ||
| 78 | |||
| 79 | /* Extended Feature Bits */ | ||
| 80 | #define FEATURE_PREFETCH (1ULL<<0) | ||
| 81 | #define FEATURE_PPR (1ULL<<1) | ||
| 82 | #define FEATURE_X2APIC (1ULL<<2) | ||
| 83 | #define FEATURE_NX (1ULL<<3) | ||
| 84 | #define FEATURE_GT (1ULL<<4) | ||
| 85 | #define FEATURE_IA (1ULL<<6) | ||
| 86 | #define FEATURE_GA (1ULL<<7) | ||
| 87 | #define FEATURE_HE (1ULL<<8) | ||
| 88 | #define FEATURE_PC (1ULL<<9) | ||
| 89 | |||
| 77 | /* MMIO status bits */ | 90 | /* MMIO status bits */ |
| 78 | #define MMIO_STATUS_COM_WAIT_INT_MASK 0x04 | 91 | #define MMIO_STATUS_COM_WAIT_INT_MASK 0x04 |
| 79 | 92 | ||
| @@ -113,7 +126,9 @@ | |||
| 113 | /* command specific defines */ | 126 | /* command specific defines */ |
| 114 | #define CMD_COMPL_WAIT 0x01 | 127 | #define CMD_COMPL_WAIT 0x01 |
| 115 | #define CMD_INV_DEV_ENTRY 0x02 | 128 | #define CMD_INV_DEV_ENTRY 0x02 |
| 116 | #define CMD_INV_IOMMU_PAGES 0x03 | 129 | #define CMD_INV_IOMMU_PAGES 0x03 |
| 130 | #define CMD_INV_IOTLB_PAGES 0x04 | ||
| 131 | #define CMD_INV_ALL 0x08 | ||
| 117 | 132 | ||
| 118 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 | 133 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 |
| 119 | #define CMD_COMPL_WAIT_INT_MASK 0x02 | 134 | #define CMD_COMPL_WAIT_INT_MASK 0x02 |
| @@ -215,6 +230,8 @@ | |||
| 215 | #define IOMMU_PTE_IR (1ULL << 61) | 230 | #define IOMMU_PTE_IR (1ULL << 61) |
| 216 | #define IOMMU_PTE_IW (1ULL << 62) | 231 | #define IOMMU_PTE_IW (1ULL << 62) |
| 217 | 232 | ||
| 233 | #define DTE_FLAG_IOTLB 0x01 | ||
| 234 | |||
| 218 | #define IOMMU_PAGE_MASK (((1ULL << 52) - 1) & ~0xfffULL) | 235 | #define IOMMU_PAGE_MASK (((1ULL << 52) - 1) & ~0xfffULL) |
| 219 | #define IOMMU_PTE_PRESENT(pte) ((pte) & IOMMU_PTE_P) | 236 | #define IOMMU_PTE_PRESENT(pte) ((pte) & IOMMU_PTE_P) |
| 220 | #define IOMMU_PTE_PAGE(pte) (phys_to_virt((pte) & IOMMU_PAGE_MASK)) | 237 | #define IOMMU_PTE_PAGE(pte) (phys_to_virt((pte) & IOMMU_PAGE_MASK)) |
| @@ -227,6 +244,7 @@ | |||
| 227 | /* IOMMU capabilities */ | 244 | /* IOMMU capabilities */ |
| 228 | #define IOMMU_CAP_IOTLB 24 | 245 | #define IOMMU_CAP_IOTLB 24 |
| 229 | #define IOMMU_CAP_NPCACHE 26 | 246 | #define IOMMU_CAP_NPCACHE 26 |
| 247 | #define IOMMU_CAP_EFR 27 | ||
| 230 | 248 | ||
| 231 | #define MAX_DOMAIN_ID 65536 | 249 | #define MAX_DOMAIN_ID 65536 |
| 232 | 250 | ||
| @@ -249,6 +267,8 @@ extern bool amd_iommu_dump; | |||
| 249 | 267 | ||
| 250 | /* global flag if IOMMUs cache non-present entries */ | 268 | /* global flag if IOMMUs cache non-present entries */ |
| 251 | extern bool amd_iommu_np_cache; | 269 | extern bool amd_iommu_np_cache; |
| 270 | /* Only true if all IOMMUs support device IOTLBs */ | ||
| 271 | extern bool amd_iommu_iotlb_sup; | ||
| 252 | 272 | ||
| 253 | /* | 273 | /* |
| 254 | * Make iterating over all IOMMUs easier | 274 | * Make iterating over all IOMMUs easier |
| @@ -371,6 +391,9 @@ struct amd_iommu { | |||
| 371 | /* flags read from acpi table */ | 391 | /* flags read from acpi table */ |
| 372 | u8 acpi_flags; | 392 | u8 acpi_flags; |
| 373 | 393 | ||
| 394 | /* Extended features */ | ||
| 395 | u64 features; | ||
| 396 | |||
| 374 | /* | 397 | /* |
| 375 | * Capability pointer. There could be more than one IOMMU per PCI | 398 | * Capability pointer. There could be more than one IOMMU per PCI |
| 376 | * device function if there are more than one AMD IOMMU capability | 399 | * device function if there are more than one AMD IOMMU capability |
| @@ -409,9 +432,6 @@ struct amd_iommu { | |||
| 409 | /* if one, we need to send a completion wait command */ | 432 | /* if one, we need to send a completion wait command */ |
| 410 | bool need_sync; | 433 | bool need_sync; |
| 411 | 434 | ||
| 412 | /* becomes true if a command buffer reset is running */ | ||
| 413 | bool reset_in_progress; | ||
| 414 | |||
| 415 | /* default dma_ops domain for that IOMMU */ | 435 | /* default dma_ops domain for that IOMMU */ |
| 416 | struct dma_ops_domain *default_dom; | 436 | struct dma_ops_domain *default_dom; |
| 417 | 437 | ||
