diff options
Diffstat (limited to 'arch/x86/kernel/early-quirks.c')
-rw-r--r-- | arch/x86/kernel/early-quirks.c | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 733c4f8d42ea..3ce029ffaa55 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
@@ -95,7 +95,8 @@ static void __init nvidia_bugs(int num, int slot, int func) | |||
95 | 95 | ||
96 | } | 96 | } |
97 | 97 | ||
98 | static u32 ati_ixp4x0_rev(int num, int slot, int func) | 98 | #if defined(CONFIG_ACPI) && defined(CONFIG_X86_IO_APIC) |
99 | static u32 __init ati_ixp4x0_rev(int num, int slot, int func) | ||
99 | { | 100 | { |
100 | u32 d; | 101 | u32 d; |
101 | u8 b; | 102 | u8 b; |
@@ -115,7 +116,6 @@ static u32 ati_ixp4x0_rev(int num, int slot, int func) | |||
115 | 116 | ||
116 | static void __init ati_bugs(int num, int slot, int func) | 117 | static void __init ati_bugs(int num, int slot, int func) |
117 | { | 118 | { |
118 | #if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC) | ||
119 | u32 d; | 119 | u32 d; |
120 | u8 b; | 120 | u8 b; |
121 | 121 | ||
@@ -138,9 +138,56 @@ static void __init ati_bugs(int num, int slot, int func) | |||
138 | printk(KERN_INFO "If you got timer trouble " | 138 | printk(KERN_INFO "If you got timer trouble " |
139 | "try acpi_use_timer_override\n"); | 139 | "try acpi_use_timer_override\n"); |
140 | } | 140 | } |
141 | #endif | ||
142 | } | 141 | } |
143 | 142 | ||
143 | static u32 __init ati_sbx00_rev(int num, int slot, int func) | ||
144 | { | ||
145 | u32 old, d; | ||
146 | |||
147 | d = read_pci_config(num, slot, func, 0x70); | ||
148 | old = d; | ||
149 | d &= ~(1<<8); | ||
150 | write_pci_config(num, slot, func, 0x70, d); | ||
151 | d = read_pci_config(num, slot, func, 0x8); | ||
152 | d &= 0xff; | ||
153 | write_pci_config(num, slot, func, 0x70, old); | ||
154 | |||
155 | return d; | ||
156 | } | ||
157 | |||
158 | static void __init ati_bugs_contd(int num, int slot, int func) | ||
159 | { | ||
160 | u32 d, rev; | ||
161 | |||
162 | if (acpi_use_timer_override) | ||
163 | return; | ||
164 | |||
165 | rev = ati_sbx00_rev(num, slot, func); | ||
166 | if (rev > 0x13) | ||
167 | return; | ||
168 | |||
169 | /* check for IRQ0 interrupt swap */ | ||
170 | d = read_pci_config(num, slot, func, 0x64); | ||
171 | if (!(d & (1<<14))) | ||
172 | acpi_skip_timer_override = 1; | ||
173 | |||
174 | if (acpi_skip_timer_override) { | ||
175 | printk(KERN_INFO "SB600 revision 0x%x\n", rev); | ||
176 | printk(KERN_INFO "Ignoring ACPI timer override.\n"); | ||
177 | printk(KERN_INFO "If you got timer trouble " | ||
178 | "try acpi_use_timer_override\n"); | ||
179 | } | ||
180 | } | ||
181 | #else | ||
182 | static void __init ati_bugs(int num, int slot, int func) | ||
183 | { | ||
184 | } | ||
185 | |||
186 | static void __init ati_bugs_contd(int num, int slot, int func) | ||
187 | { | ||
188 | } | ||
189 | #endif | ||
190 | |||
144 | #ifdef CONFIG_DMAR | 191 | #ifdef CONFIG_DMAR |
145 | static void __init intel_g33_dmar(int num, int slot, int func) | 192 | static void __init intel_g33_dmar(int num, int slot, int func) |
146 | { | 193 | { |
@@ -176,6 +223,8 @@ static struct chipset early_qrk[] __initdata = { | |||
176 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config }, | 223 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config }, |
177 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS, | 224 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS, |
178 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, | 225 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, |
226 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, | ||
227 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd }, | ||
179 | #ifdef CONFIG_DMAR | 228 | #ifdef CONFIG_DMAR |
180 | { PCI_VENDOR_ID_INTEL, 0x29c0, | 229 | { PCI_VENDOR_ID_INTEL, 0x29c0, |
181 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar }, | 230 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar }, |