x86: add hpet sanity checks
Some BIOSes advertise HPET at 0x0. We really do no want to allocate a resource there. Check for it and leave early. Other BIOSes tell us the HPET is at 0xfed0000000000000 instead of 0xfed00000. Add a check and fix it up with a warning on user request. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
committed by
Thomas Gleixner
parent
bbbd99955b
commit
f4df73c291
@@ -637,6 +637,38 @@ static int __init acpi_parse_hpet(struct acpi_table_header *table)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hpet_address = hpet_tbl->address.address;
|
hpet_address = hpet_tbl->address.address;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some broken BIOSes advertise HPET at 0x0. We really do not
|
||||||
|
* want to allocate a resource there.
|
||||||
|
*/
|
||||||
|
if (!hpet_address) {
|
||||||
|
printk(KERN_WARNING PREFIX
|
||||||
|
"HPET id: %#x base: %#lx is invalid\n",
|
||||||
|
hpet_tbl->id, hpet_address);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
/*
|
||||||
|
* Some even more broken BIOSes advertise HPET at
|
||||||
|
* 0xfed0000000000000 instead of 0xfed00000. Fix it up and add
|
||||||
|
* some noise:
|
||||||
|
*/
|
||||||
|
if (hpet_address == 0xfed0000000000000UL) {
|
||||||
|
if (!hpet_force_user) {
|
||||||
|
printk(KERN_WARNING PREFIX "HPET id: %#x "
|
||||||
|
"base: 0xfed0000000000000 is bogus\n "
|
||||||
|
"try hpet=force on the kernel command line to "
|
||||||
|
"fix it up to 0xfed00000.\n", hpet_tbl->id);
|
||||||
|
hpet_address = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printk(KERN_WARNING PREFIX
|
||||||
|
"HPET id: %#x base: 0xfed0000000000000 fixed up "
|
||||||
|
"to 0xfed00000.\n", hpet_tbl->id);
|
||||||
|
hpet_address >>= 32;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
|
printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
|
||||||
hpet_tbl->id, hpet_address);
|
hpet_tbl->id, hpet_address);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user