diff options
author | Keshavamurthy, Anil S <anil.s.keshavamurthy@intel.com> | 2007-10-21 19:41:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 11:13:18 -0400 |
commit | ba39592764ed20cee09aae5352e603a27bf56b0d (patch) | |
tree | efe7ec88bbd4d6b08b639830352c68411a7ef7fb /Documentation/Intel-IOMMU.txt | |
parent | f8de50eb6b085572ea773f26e066835ea3d3028b (diff) |
Intel IOMMU: Intel IOMMU driver
Actual intel IOMMU driver. Hardware spec can be found at:
http://www.intel.com/technology/virtualization
This driver sets X86_64 'dma_ops', so hook into standard DMA APIs. In this
way, PCI driver will get virtual DMA address. This change is transparent to
PCI drivers.
[akpm@linux-foundation.org: remove unneeded cast]
[akpm@linux-foundation.org: build fix]
[bunk@stusta.de: fix duplicate CONFIG_DMAR Makefile line]
Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Muli Ben-Yehuda <muli@il.ibm.com>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>
Cc: Arjan van de Ven <arjan@infradead.org>
Cc: Ashok Raj <ashok.raj@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Adrian Bunk <bunk@stusta.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation/Intel-IOMMU.txt')
-rw-r--r-- | Documentation/Intel-IOMMU.txt | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Documentation/Intel-IOMMU.txt b/Documentation/Intel-IOMMU.txt new file mode 100644 index 000000000000..cbb4dbaef761 --- /dev/null +++ b/Documentation/Intel-IOMMU.txt | |||
@@ -0,0 +1,93 @@ | |||
1 | Linux IOMMU Support | ||
2 | =================== | ||
3 | |||
4 | The architecture spec can be obtained from the below location. | ||
5 | |||
6 | http://www.intel.com/technology/virtualization/ | ||
7 | |||
8 | This guide gives a quick cheat sheet for some basic understanding. | ||
9 | |||
10 | Some Keywords | ||
11 | |||
12 | DMAR - DMA remapping | ||
13 | DRHD - DMA Engine Reporting Structure | ||
14 | RMRR - Reserved memory Region Reporting Structure | ||
15 | ZLR - Zero length reads from PCI devices | ||
16 | IOVA - IO Virtual address. | ||
17 | |||
18 | Basic stuff | ||
19 | ----------- | ||
20 | |||
21 | ACPI enumerates and lists the different DMA engines in the platform, and | ||
22 | device scope relationships between PCI devices and which DMA engine controls | ||
23 | them. | ||
24 | |||
25 | What is RMRR? | ||
26 | ------------- | ||
27 | |||
28 | There are some devices the BIOS controls, for e.g USB devices to perform | ||
29 | PS2 emulation. The regions of memory used for these devices are marked | ||
30 | reserved in the e820 map. When we turn on DMA translation, DMA to those | ||
31 | regions will fail. Hence BIOS uses RMRR to specify these regions along with | ||
32 | devices that need to access these regions. OS is expected to setup | ||
33 | unity mappings for these regions for these devices to access these regions. | ||
34 | |||
35 | How is IOVA generated? | ||
36 | --------------------- | ||
37 | |||
38 | Well behaved drivers call pci_map_*() calls before sending command to device | ||
39 | that needs to perform DMA. Once DMA is completed and mapping is no longer | ||
40 | required, device performs a pci_unmap_*() calls to unmap the region. | ||
41 | |||
42 | The Intel IOMMU driver allocates a virtual address per domain. Each PCIE | ||
43 | device has its own domain (hence protection). Devices under p2p bridges | ||
44 | share the virtual address with all devices under the p2p bridge due to | ||
45 | transaction id aliasing for p2p bridges. | ||
46 | |||
47 | IOVA generation is pretty generic. We used the same technique as vmalloc() | ||
48 | but these are not global address spaces, but separate for each domain. | ||
49 | Different DMA engines may support different number of domains. | ||
50 | |||
51 | We also allocate gaurd pages with each mapping, so we can attempt to catch | ||
52 | any overflow that might happen. | ||
53 | |||
54 | |||
55 | Graphics Problems? | ||
56 | ------------------ | ||
57 | If you encounter issues with graphics devices, you can try adding | ||
58 | option intel_iommu=igfx_off to turn off the integrated graphics engine. | ||
59 | |||
60 | Some exceptions to IOVA | ||
61 | ----------------------- | ||
62 | Interrupt ranges are not address translated, (0xfee00000 - 0xfeefffff). | ||
63 | The same is true for peer to peer transactions. Hence we reserve the | ||
64 | address from PCI MMIO ranges so they are not allocated for IOVA addresses. | ||
65 | |||
66 | Boot Message Sample | ||
67 | ------------------- | ||
68 | |||
69 | Something like this gets printed indicating presence of DMAR tables | ||
70 | in ACPI. | ||
71 | |||
72 | ACPI: DMAR (v001 A M I OEMDMAR 0x00000001 MSFT 0x00000097) @ 0x000000007f5b5ef0 | ||
73 | |||
74 | When DMAR is being processed and initialized by ACPI, prints DMAR locations | ||
75 | and any RMRR's processed. | ||
76 | |||
77 | ACPI DMAR:Host address width 36 | ||
78 | ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed90000 | ||
79 | ACPI DMAR:DRHD (flags: 0x00000000)base: 0x00000000fed91000 | ||
80 | ACPI DMAR:DRHD (flags: 0x00000001)base: 0x00000000fed93000 | ||
81 | ACPI DMAR:RMRR base: 0x00000000000ed000 end: 0x00000000000effff | ||
82 | ACPI DMAR:RMRR base: 0x000000007f600000 end: 0x000000007fffffff | ||
83 | |||
84 | When DMAR is enabled for use, you will notice.. | ||
85 | |||
86 | PCI-DMA: Using DMAR IOMMU | ||
87 | |||
88 | TBD | ||
89 | ---- | ||
90 | |||
91 | - For compatibility testing, could use unity map domain for all devices, just | ||
92 | provide a 1-1 for all useful memory under a single domain for all devices. | ||
93 | - API for paravirt ops for abstracting functionlity for VMM folks. | ||