aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2010-08-25 19:38:20 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2010-08-25 20:10:49 -0400
commit9ea77bdb39b62c9bf9fd3cdd1c25a9420bccd380 (patch)
tree8fc6396e340bdc9fb38c90569dafa1abb34080d4
parentd0cd7425fab774a480cce17c2f649984312d0b55 (diff)
x86, bios: Make the x86 early memory reservation a kernel option
Add a kernel command-line option so the x86 early memory reservation size can be adjusted at runtime instead of only at compile time. Suggested-by: Andrew Morton <akpm@linux-foundation.org> LKML-Reference: <tip-d0cd7425fab774a480cce17c2f649984312d0b55@git.kernel.org> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r--Documentation/kernel-parameters.txt5
-rw-r--r--arch/x86/Kconfig2
-rw-r--r--arch/x86/kernel/setup.c28
3 files changed, 32 insertions, 3 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 2c85c0692b01..41ce93e71ded 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2150,6 +2150,11 @@ and is between 256 and 4096 characters. It is defined in the file
2150 Reserves a hole at the top of the kernel virtual 2150 Reserves a hole at the top of the kernel virtual
2151 address space. 2151 address space.
2152 2152
2153 reservelow= [X86]
2154 Format: nn[K]
2155 Set the amount of memory to reserve for BIOS at
2156 the bottom of the address space.
2157
2153 reset_devices [KNL] Force drivers to reset the underlying device 2158 reset_devices [KNL] Force drivers to reset the underlying device
2154 during initialization. 2159 during initialization.
2155 2160
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 683ae8f9bd0b..d3590008c5dc 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1326,7 +1326,7 @@ config X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK
1326 Set whether the default state of memory_corruption_check is 1326 Set whether the default state of memory_corruption_check is
1327 on or off. 1327 on or off.
1328 1328
1329config X86_LOW_RESERVE 1329config X86_RESERVE_LOW
1330 int "Amount of low memory, in kilobytes, to reserve for the BIOS" 1330 int "Amount of low memory, in kilobytes, to reserve for the BIOS"
1331 default 64 1331 default 64
1332 range 4 640 1332 range 4 640
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index eb87f1c83f91..af277e369def 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -618,6 +618,8 @@ static __init void reserve_ibft_region(void)
618 reserve_early_overlap_ok(addr, addr + size, "ibft"); 618 reserve_early_overlap_ok(addr, addr + size, "ibft");
619} 619}
620 620
621static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
622
621static void __init trim_bios_range(void) 623static void __init trim_bios_range(void)
622{ 624{
623 /* 625 /*
@@ -627,9 +629,9 @@ static void __init trim_bios_range(void)
627 * 629 *
628 * This typically reserves additional memory (64KiB by default) 630 * This typically reserves additional memory (64KiB by default)
629 * since some BIOSes are known to corrupt low memory. See the 631 * since some BIOSes are known to corrupt low memory. See the
630 * Kconfig help text for X86_LOW_RESERVE. 632 * Kconfig help text for X86_RESERVE_LOW.
631 */ 633 */
632 e820_update_range(0, ALIGN(CONFIG_X86_LOW_RESERVE << 10, PAGE_SIZE), 634 e820_update_range(0, ALIGN(reserve_low, PAGE_SIZE),
633 E820_RAM, E820_RESERVED); 635 E820_RAM, E820_RESERVED);
634 636
635 /* 637 /*
@@ -641,6 +643,28 @@ static void __init trim_bios_range(void)
641 sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); 643 sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
642} 644}
643 645
646static int __init parse_reservelow(char *p)
647{
648 unsigned long long size;
649
650 if (!p)
651 return -EINVAL;
652
653 size = memparse(p, &p);
654
655 if (size < 4096)
656 size = 4096;
657
658 if (size > 640*1024)
659 size = 640*1024;
660
661 reserve_low = size;
662
663 return 0;
664}
665
666early_param("reservelow", parse_reservelow);
667
644/* 668/*
645 * Determine if we were loaded by an EFI loader. If so, then we have also been 669 * Determine if we were loaded by an EFI loader. If so, then we have also been
646 * passed the efi memmap, systab, etc., so we should use these data structures 670 * passed the efi memmap, systab, etc., so we should use these data structures