diff options
author | Fenghua Yu <fenghua.yu@intel.com> | 2008-10-17 15:14:13 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2008-10-17 15:14:13 -0400 |
commit | 62fdd7678a26efadd6ac5c2869543caff77d2df0 (patch) | |
tree | 0dd67208590c4540ff6a4476579a55bcac0d1fce /arch/ia64/kernel/acpi.c | |
parent | 6bb7a935489dab20802dde6c2cb7d8582f4849bf (diff) |
[IA64] Add Variable Page Size and IA64 Support in Intel IOMMU
The patch contains Intel IOMMU IA64 specific code. It defines new
machvec dig_vtd, hooks for IOMMU, DMAR table detection, cache line flush
function, etc.
For a generic kernel with CONFIG_DMAR=y, if Intel IOMMU is detected,
dig_vtd is used for machinve vector. Otherwise, kernel falls back to
dig machine vector. Kernel parameter "machvec=dig" or "intel_iommu=off"
can be used to force kernel to boot dig machine vector.
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/acpi.c')
-rw-r--r-- | arch/ia64/kernel/acpi.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 5d1eb7ee2bf6..8cc2f8a610c4 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -91,6 +91,9 @@ acpi_get_sysname(void) | |||
91 | struct acpi_table_rsdp *rsdp; | 91 | struct acpi_table_rsdp *rsdp; |
92 | struct acpi_table_xsdt *xsdt; | 92 | struct acpi_table_xsdt *xsdt; |
93 | struct acpi_table_header *hdr; | 93 | struct acpi_table_header *hdr; |
94 | #ifdef CONFIG_DMAR | ||
95 | u64 i, nentries; | ||
96 | #endif | ||
94 | 97 | ||
95 | rsdp_phys = acpi_find_rsdp(); | 98 | rsdp_phys = acpi_find_rsdp(); |
96 | if (!rsdp_phys) { | 99 | if (!rsdp_phys) { |
@@ -123,6 +126,18 @@ acpi_get_sysname(void) | |||
123 | return "sn2"; | 126 | return "sn2"; |
124 | } | 127 | } |
125 | 128 | ||
129 | #ifdef CONFIG_DMAR | ||
130 | /* Look for Intel IOMMU */ | ||
131 | nentries = (hdr->length - sizeof(*hdr)) / | ||
132 | sizeof(xsdt->table_offset_entry[0]); | ||
133 | for (i = 0; i < nentries; i++) { | ||
134 | hdr = __va(xsdt->table_offset_entry[i]); | ||
135 | if (strncmp(hdr->signature, ACPI_SIG_DMAR, | ||
136 | sizeof(ACPI_SIG_DMAR) - 1) == 0) | ||
137 | return "dig_vtd"; | ||
138 | } | ||
139 | #endif | ||
140 | |||
126 | return "dig"; | 141 | return "dig"; |
127 | #else | 142 | #else |
128 | # if defined (CONFIG_IA64_HP_SIM) | 143 | # if defined (CONFIG_IA64_HP_SIM) |
@@ -137,6 +152,8 @@ acpi_get_sysname(void) | |||
137 | return "uv"; | 152 | return "uv"; |
138 | # elif defined (CONFIG_IA64_DIG) | 153 | # elif defined (CONFIG_IA64_DIG) |
139 | return "dig"; | 154 | return "dig"; |
155 | # elif defined(CONFIG_IA64_DIG_VTD) | ||
156 | return "dig_vtd"; | ||
140 | # else | 157 | # else |
141 | # error Unknown platform. Fix acpi.c. | 158 | # error Unknown platform. Fix acpi.c. |
142 | # endif | 159 | # endif |