Merge branch 'x86-bios-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-bios-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, bios: Make the x86 early memory reservation a kernel option x86, bios: By default, reserve the low 64K for all BIOSes
This commit is contained in:
@@ -619,79 +619,7 @@ static __init void reserve_ibft_region(void)
|
||||
reserve_early_overlap_ok(addr, addr + size, "ibft");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_RESERVE_LOW_64K
|
||||
static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
|
||||
{
|
||||
printk(KERN_NOTICE
|
||||
"%s detected: BIOS may corrupt low RAM, working around it.\n",
|
||||
d->ident);
|
||||
|
||||
e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
|
||||
sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* List of systems that have known low memory corruption BIOS problems */
|
||||
static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
|
||||
#ifdef CONFIG_X86_RESERVE_LOW_64K
|
||||
{
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "AMI BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "Phoenix BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "Phoenix/MSC BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix/MSC"),
|
||||
},
|
||||
},
|
||||
/*
|
||||
* AMI BIOS with low memory corruption was found on Intel DG45ID and
|
||||
* DG45FC boards.
|
||||
* It has a different DMI_BIOS_VENDOR = "Intel Corp.", for now we will
|
||||
* match only DMI_BOARD_NAME and see if there is more bad products
|
||||
* with this vendor.
|
||||
*/
|
||||
{
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "AMI BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "DG45ID"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "AMI BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "DG45FC"),
|
||||
},
|
||||
},
|
||||
/*
|
||||
* The Dell Inspiron Mini 1012 has DMI_BIOS_VENDOR = "Dell Inc.", so
|
||||
* match on the product name.
|
||||
*/
|
||||
{
|
||||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "Phoenix BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{}
|
||||
};
|
||||
static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
|
||||
|
||||
static void __init trim_bios_range(void)
|
||||
{
|
||||
@@ -699,8 +627,14 @@ static void __init trim_bios_range(void)
|
||||
* A special case is the first 4Kb of memory;
|
||||
* This is a BIOS owned area, not kernel ram, but generally
|
||||
* not listed as such in the E820 table.
|
||||
*
|
||||
* This typically reserves additional memory (64KiB by default)
|
||||
* since some BIOSes are known to corrupt low memory. See the
|
||||
* Kconfig help text for X86_RESERVE_LOW.
|
||||
*/
|
||||
e820_update_range(0, PAGE_SIZE, E820_RAM, E820_RESERVED);
|
||||
e820_update_range(0, ALIGN(reserve_low, PAGE_SIZE),
|
||||
E820_RAM, E820_RESERVED);
|
||||
|
||||
/*
|
||||
* special case: Some BIOSen report the PC BIOS
|
||||
* area (640->1Mb) as ram even though it is not.
|
||||
@@ -710,6 +644,28 @@ static void __init trim_bios_range(void)
|
||||
sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
|
||||
}
|
||||
|
||||
static int __init parse_reservelow(char *p)
|
||||
{
|
||||
unsigned long long size;
|
||||
|
||||
if (!p)
|
||||
return -EINVAL;
|
||||
|
||||
size = memparse(p, &p);
|
||||
|
||||
if (size < 4096)
|
||||
size = 4096;
|
||||
|
||||
if (size > 640*1024)
|
||||
size = 640*1024;
|
||||
|
||||
reserve_low = size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("reservelow", parse_reservelow);
|
||||
|
||||
/*
|
||||
* Determine if we were loaded by an EFI loader. If so, then we have also been
|
||||
* passed the efi memmap, systab, etc., so we should use these data structures
|
||||
@@ -865,8 +821,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
dmi_scan_machine();
|
||||
|
||||
dmi_check_system(bad_bios_dmi_table);
|
||||
|
||||
/*
|
||||
* VMware detection requires dmi to be available, so this
|
||||
* needs to be done after dmi_scan_machine, for the BP.
|
||||
|
Reference in New Issue
Block a user