]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_04_f12c73e7fa7ebf9ad6defee2c4fb2664e743e970
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.arch / x2APIC_PATCH_04_f12c73e7fa7ebf9ad6defee2c4fb2664e743e970
CommitLineData
2cb7cef9
BS
1From: Yinghai Lu <yhlu.kernel@gmail.com>
2Subject: dmar: fix using early fixmap mapping for DMAR table parsing
3References: fate #303948 and fate #303984
4Patch-Mainline: queued for .28
5Commit-ID: f12c73e7fa7ebf9ad6defee2c4fb2664e743e970
6
7Signed-off-by: Thomas Renninger <trenn@suse.de>
8
9Very early detection of the DMAR tables will setup fixmap mapping. For
10parsing these tables later (while enabling dma and/or interrupt remapping),
11early fixmap mapping shouldn't be used. Fix it by calling table detection
12routines again, which will call generic apci_get_table() for setting up
13the correct mapping.
14
15Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
16Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
17Signed-off-by: Ingo Molnar <mingo@elte.hu>
18
19---
20 drivers/pci/dmar.c | 49 ++++++++++++++++++++++++++++---------------------
21 include/linux/dmar.h | 1 -
22 2 files changed, 28 insertions(+), 22 deletions(-)
23
24Index: linux-2.6.26/drivers/pci/dmar.c
25===================================================================
26--- linux-2.6.26.orig/drivers/pci/dmar.c
27+++ linux-2.6.26/drivers/pci/dmar.c
28@@ -289,6 +289,24 @@ dmar_table_print_dmar_entry(struct acpi_
29 }
30 }
31
32+/**
33+ * dmar_table_detect - checks to see if the platform supports DMAR devices
34+ */
35+static int __init dmar_table_detect(void)
36+{
37+ acpi_status status = AE_OK;
38+
39+ /* if we could find DMAR table, then there are DMAR devices */
40+ status = acpi_get_table(ACPI_SIG_DMAR, 0,
41+ (struct acpi_table_header **)&dmar_tbl);
42+
43+ if (ACPI_SUCCESS(status) && !dmar_tbl) {
44+ printk (KERN_WARNING PREFIX "Unable to map DMAR\n");
45+ status = AE_NOT_FOUND;
46+ }
47+
48+ return (ACPI_SUCCESS(status) ? 1 : 0);
49+}
50
51 /**
52 * parse_dmar_table - parses the DMA reporting table
53@@ -300,6 +318,12 @@ parse_dmar_table(void)
54 struct acpi_dmar_header *entry_header;
55 int ret = 0;
56
57+ /*
58+ * Do it again, earlier dmar_tbl mapping could be mapped with
59+ * fixed map.
60+ */
61+ dmar_table_detect();
62+
63 dmar = (struct acpi_table_dmar *)dmar_tbl;
64 if (!dmar)
65 return -ENODEV;
66@@ -432,30 +456,11 @@ int __init dmar_table_init(void)
67 return 0;
68 }
69
70-/**
71- * early_dmar_detect - checks to see if the platform supports DMAR devices
72- */
73-int __init early_dmar_detect(void)
74-{
75- acpi_status status = AE_OK;
76-
77- /* if we could find DMAR table, then there are DMAR devices */
78- status = acpi_get_table(ACPI_SIG_DMAR, 0,
79- (struct acpi_table_header **)&dmar_tbl);
80-
81- if (ACPI_SUCCESS(status) && !dmar_tbl) {
82- printk (KERN_WARNING PREFIX "Unable to map DMAR\n");
83- status = AE_NOT_FOUND;
84- }
85-
86- return (ACPI_SUCCESS(status) ? 1 : 0);
87-}
88-
89 void __init detect_intel_iommu(void)
90 {
91 int ret;
92
93- ret = early_dmar_detect();
94+ ret = dmar_table_detect();
95
96 #ifdef CONFIG_DMAR
97 {
98@@ -481,14 +486,16 @@ void __init detect_intel_iommu(void)
99 " x2apic support\n");
100
101 dmar_disabled = 1;
102- return;
103+ goto end;
104 }
105
106 if (ret && !no_iommu && !iommu_detected && !swiotlb &&
107 !dmar_disabled)
108 iommu_detected = 1;
109 }
110+end:
111 #endif
112+ dmar_tbl = NULL;
113 }
114
115
116Index: linux-2.6.26/include/linux/dmar.h
117===================================================================
118--- linux-2.6.26.orig/include/linux/dmar.h
119+++ linux-2.6.26/include/linux/dmar.h
120@@ -45,7 +45,6 @@ extern struct list_head dmar_drhd_units;
121 list_for_each_entry(drhd, &dmar_drhd_units, list)
122
123 extern int dmar_table_init(void);
124-extern int early_dmar_detect(void);
125 extern int dmar_dev_scope_init(void);
126
127 /* Intel IOMMU detection */