diff options
Diffstat (limited to 'arch/x86/kernel/quirks.c')
-rw-r--r-- | arch/x86/kernel/quirks.c | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c index d89a648fe710..d13858818100 100644 --- a/arch/x86/kernel/quirks.c +++ b/arch/x86/kernel/quirks.c | |||
@@ -65,6 +65,7 @@ static enum { | |||
65 | ICH_FORCE_HPET_RESUME, | 65 | ICH_FORCE_HPET_RESUME, |
66 | VT8237_FORCE_HPET_RESUME, | 66 | VT8237_FORCE_HPET_RESUME, |
67 | NVIDIA_FORCE_HPET_RESUME, | 67 | NVIDIA_FORCE_HPET_RESUME, |
68 | ATI_FORCE_HPET_RESUME, | ||
68 | } force_hpet_resume_type; | 69 | } force_hpet_resume_type; |
69 | 70 | ||
70 | static void __iomem *rcba_base; | 71 | static void __iomem *rcba_base; |
@@ -158,6 +159,8 @@ static void ich_force_enable_hpet(struct pci_dev *dev) | |||
158 | 159 | ||
159 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_0, | 160 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_0, |
160 | ich_force_enable_hpet); | 161 | ich_force_enable_hpet); |
162 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, | ||
163 | ich_force_enable_hpet); | ||
161 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, | 164 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, |
162 | ich_force_enable_hpet); | 165 | ich_force_enable_hpet); |
163 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, | 166 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, |
@@ -174,6 +177,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, | |||
174 | 177 | ||
175 | static struct pci_dev *cached_dev; | 178 | static struct pci_dev *cached_dev; |
176 | 179 | ||
180 | static void hpet_print_force_info(void) | ||
181 | { | ||
182 | printk(KERN_INFO "HPET not enabled in BIOS. " | ||
183 | "You might try hpet=force boot option\n"); | ||
184 | } | ||
185 | |||
177 | static void old_ich_force_hpet_resume(void) | 186 | static void old_ich_force_hpet_resume(void) |
178 | { | 187 | { |
179 | u32 val; | 188 | u32 val; |
@@ -253,8 +262,12 @@ static void old_ich_force_enable_hpet_user(struct pci_dev *dev) | |||
253 | { | 262 | { |
254 | if (hpet_force_user) | 263 | if (hpet_force_user) |
255 | old_ich_force_enable_hpet(dev); | 264 | old_ich_force_enable_hpet(dev); |
265 | else | ||
266 | hpet_print_force_info(); | ||
256 | } | 267 | } |
257 | 268 | ||
269 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, | ||
270 | old_ich_force_enable_hpet_user); | ||
258 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, | 271 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, |
259 | old_ich_force_enable_hpet_user); | 272 | old_ich_force_enable_hpet_user); |
260 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, | 273 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, |
@@ -290,9 +303,14 @@ static void vt8237_force_enable_hpet(struct pci_dev *dev) | |||
290 | { | 303 | { |
291 | u32 uninitialized_var(val); | 304 | u32 uninitialized_var(val); |
292 | 305 | ||
293 | if (!hpet_force_user || hpet_address || force_hpet_address) | 306 | if (hpet_address || force_hpet_address) |
294 | return; | 307 | return; |
295 | 308 | ||
309 | if (!hpet_force_user) { | ||
310 | hpet_print_force_info(); | ||
311 | return; | ||
312 | } | ||
313 | |||
296 | pci_read_config_dword(dev, 0x68, &val); | 314 | pci_read_config_dword(dev, 0x68, &val); |
297 | /* | 315 | /* |
298 | * Bit 7 is HPET enable bit. | 316 | * Bit 7 is HPET enable bit. |
@@ -330,6 +348,36 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, | |||
330 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, | 348 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, |
331 | vt8237_force_enable_hpet); | 349 | vt8237_force_enable_hpet); |
332 | 350 | ||
351 | static void ati_force_hpet_resume(void) | ||
352 | { | ||
353 | pci_write_config_dword(cached_dev, 0x14, 0xfed00000); | ||
354 | printk(KERN_DEBUG "Force enabled HPET at resume\n"); | ||
355 | } | ||
356 | |||
357 | static void ati_force_enable_hpet(struct pci_dev *dev) | ||
358 | { | ||
359 | u32 uninitialized_var(val); | ||
360 | |||
361 | if (hpet_address || force_hpet_address) | ||
362 | return; | ||
363 | |||
364 | if (!hpet_force_user) { | ||
365 | hpet_print_force_info(); | ||
366 | return; | ||
367 | } | ||
368 | |||
369 | pci_write_config_dword(dev, 0x14, 0xfed00000); | ||
370 | pci_read_config_dword(dev, 0x14, &val); | ||
371 | force_hpet_address = val; | ||
372 | force_hpet_resume_type = ATI_FORCE_HPET_RESUME; | ||
373 | dev_printk(KERN_DEBUG, &dev->dev, "Force enabled HPET at 0x%lx\n", | ||
374 | force_hpet_address); | ||
375 | cached_dev = dev; | ||
376 | return; | ||
377 | } | ||
378 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS, | ||
379 | ati_force_enable_hpet); | ||
380 | |||
333 | /* | 381 | /* |
334 | * Undocumented chipset feature taken from LinuxBIOS. | 382 | * Undocumented chipset feature taken from LinuxBIOS. |
335 | */ | 383 | */ |
@@ -343,8 +391,13 @@ static void nvidia_force_enable_hpet(struct pci_dev *dev) | |||
343 | { | 391 | { |
344 | u32 uninitialized_var(val); | 392 | u32 uninitialized_var(val); |
345 | 393 | ||
346 | if (!hpet_force_user || hpet_address || force_hpet_address) | 394 | if (hpet_address || force_hpet_address) |
395 | return; | ||
396 | |||
397 | if (!hpet_force_user) { | ||
398 | hpet_print_force_info(); | ||
347 | return; | 399 | return; |
400 | } | ||
348 | 401 | ||
349 | pci_write_config_dword(dev, 0x44, 0xfed00001); | 402 | pci_write_config_dword(dev, 0x44, 0xfed00001); |
350 | pci_read_config_dword(dev, 0x44, &val); | 403 | pci_read_config_dword(dev, 0x44, &val); |
@@ -397,6 +450,9 @@ void force_hpet_resume(void) | |||
397 | case NVIDIA_FORCE_HPET_RESUME: | 450 | case NVIDIA_FORCE_HPET_RESUME: |
398 | nvidia_force_hpet_resume(); | 451 | nvidia_force_hpet_resume(); |
399 | return; | 452 | return; |
453 | case ATI_FORCE_HPET_RESUME: | ||
454 | ati_force_hpet_resume(); | ||
455 | return; | ||
400 | default: | 456 | default: |
401 | break; | 457 | break; |
402 | } | 458 | } |