diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2010-08-25 19:38:20 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-08-25 20:10:49 -0400 |
commit | 9ea77bdb39b62c9bf9fd3cdd1c25a9420bccd380 (patch) | |
tree | 8fc6396e340bdc9fb38c90569dafa1abb34080d4 | |
parent | d0cd7425fab774a480cce17c2f649984312d0b55 (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.txt | 5 | ||||
-rw-r--r-- | arch/x86/Kconfig | 2 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 28 |
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 | ||
1329 | config X86_LOW_RESERVE | 1329 | config 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 | ||
621 | static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10; | ||
622 | |||
621 | static void __init trim_bios_range(void) | 623 | static 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 | ||
646 | static 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 | |||
666 | early_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 |