aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/kernel/acpi.c
diff options
context:
space:
mode:
authorFenghua Yu <fenghua.yu@intel.com>2008-10-17 15:14:13 -0400
committerTony Luck <tony.luck@intel.com>2008-10-17 15:14:13 -0400
commit62fdd7678a26efadd6ac5c2869543caff77d2df0 (patch)
tree0dd67208590c4540ff6a4476579a55bcac0d1fce /arch/ia64/kernel/acpi.c
parent6bb7a935489dab20802dde6c2cb7d8582f4849bf (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.c17
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