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 /arch/x86/kernel/setup.c | |
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>
Diffstat (limited to 'arch/x86/kernel/setup.c')
-rw-r--r-- | arch/x86/kernel/setup.c | 28 |
1 files changed, 26 insertions, 2 deletions
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 |