aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/memory-hotplug.txt16
-rw-r--r--arch/x86/Kconfig6
-rw-r--r--arch/x86/include/asm/e820.h2
-rw-r--r--arch/x86/kernel/e820.c5
-rw-r--r--arch/x86/kernel/setup.c23
-rw-r--r--arch/x86/mm/ioremap.c5
6 files changed, 31 insertions, 26 deletions
diff --git a/Documentation/memory-hotplug.txt b/Documentation/memory-hotplug.txt
index 8e5eacbdcfa3..8fd254c73589 100644
--- a/Documentation/memory-hotplug.txt
+++ b/Documentation/memory-hotplug.txt
@@ -210,13 +210,15 @@ If memory device is found, memory hotplug code will be called.
210 210
2114.2 Notify memory hot-add event by hand 2114.2 Notify memory hot-add event by hand
212------------ 212------------
213In some environments, especially virtualized environment, firmware will not 213On powerpc, the firmware does not notify a memory hotplug event to the kernel.
214notify memory hotplug event to the kernel. For such environment, "probe" 214Therefore, "probe" interface is supported to notify the event to the kernel.
215interface is supported. This interface depends on CONFIG_ARCH_MEMORY_PROBE. 215This interface depends on CONFIG_ARCH_MEMORY_PROBE.
216 216
217Now, CONFIG_ARCH_MEMORY_PROBE is supported only by powerpc but it does not 217CONFIG_ARCH_MEMORY_PROBE is supported on powerpc only. On x86, this config
218contain highly architecture codes. Please add config if you need "probe" 218option is disabled by default since ACPI notifies a memory hotplug event to
219interface. 219the kernel, which performs its hotplug operation as the result. Please
220enable this option if you need the "probe" interface for testing purposes
221on x86.
220 222
221Probe interface is located at 223Probe interface is located at
222/sys/devices/system/memory/probe 224/sys/devices/system/memory/probe
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index b710efdec9a0..30322b0427d1 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1344,8 +1344,12 @@ config ARCH_SELECT_MEMORY_MODEL
1344 depends on ARCH_SPARSEMEM_ENABLE 1344 depends on ARCH_SPARSEMEM_ENABLE
1345 1345
1346config ARCH_MEMORY_PROBE 1346config ARCH_MEMORY_PROBE
1347 def_bool y 1347 bool "Enable sysfs memory/probe interface"
1348 depends on X86_64 && MEMORY_HOTPLUG 1348 depends on X86_64 && MEMORY_HOTPLUG
1349 help
1350 This option enables a sysfs memory/probe interface for testing.
1351 See Documentation/memory-hotplug.txt for more information.
1352 If you are unsure how to answer this question, answer N.
1349 1353
1350config ARCH_PROC_KCORE_TEXT 1354config ARCH_PROC_KCORE_TEXT
1351 def_bool y 1355 def_bool y
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h
index cccd07fa5e3a..779c2efe2e97 100644
--- a/arch/x86/include/asm/e820.h
+++ b/arch/x86/include/asm/e820.h
@@ -29,7 +29,7 @@ extern void e820_setup_gap(void);
29extern int e820_search_gap(unsigned long *gapstart, unsigned long *gapsize, 29extern int e820_search_gap(unsigned long *gapstart, unsigned long *gapsize,
30 unsigned long start_addr, unsigned long long end_addr); 30 unsigned long start_addr, unsigned long long end_addr);
31struct setup_data; 31struct setup_data;
32extern void parse_e820_ext(struct setup_data *data); 32extern void parse_e820_ext(u64 phys_addr, u32 data_len);
33 33
34#if defined(CONFIG_X86_64) || \ 34#if defined(CONFIG_X86_64) || \
35 (defined(CONFIG_X86_32) && defined(CONFIG_HIBERNATION)) 35 (defined(CONFIG_X86_32) && defined(CONFIG_HIBERNATION))
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index d32abeabbda5..174da5fc5a7b 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -658,15 +658,18 @@ __init void e820_setup_gap(void)
658 * boot_params.e820_map, others are passed via SETUP_E820_EXT node of 658 * boot_params.e820_map, others are passed via SETUP_E820_EXT node of
659 * linked list of struct setup_data, which is parsed here. 659 * linked list of struct setup_data, which is parsed here.
660 */ 660 */
661void __init parse_e820_ext(struct setup_data *sdata) 661void __init parse_e820_ext(u64 phys_addr, u32 data_len)
662{ 662{
663 int entries; 663 int entries;
664 struct e820entry *extmap; 664 struct e820entry *extmap;
665 struct setup_data *sdata;
665 666
667 sdata = early_memremap(phys_addr, data_len);
666 entries = sdata->len / sizeof(struct e820entry); 668 entries = sdata->len / sizeof(struct e820entry);
667 extmap = (struct e820entry *)(sdata->data); 669 extmap = (struct e820entry *)(sdata->data);
668 __append_e820_map(extmap, entries); 670 __append_e820_map(extmap, entries);
669 sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); 671 sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
672 early_iounmap(sdata, data_len);
670 printk(KERN_INFO "e820: extended physical RAM map:\n"); 673 printk(KERN_INFO "e820: extended physical RAM map:\n");
671 e820_print_map("extended"); 674 e820_print_map("extended");
672} 675}
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index dfa55afccf5e..f0de6294b955 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -426,25 +426,23 @@ static void __init reserve_initrd(void)
426static void __init parse_setup_data(void) 426static void __init parse_setup_data(void)
427{ 427{
428 struct setup_data *data; 428 struct setup_data *data;
429 u64 pa_data; 429 u64 pa_data, pa_next;
430 430
431 pa_data = boot_params.hdr.setup_data; 431 pa_data = boot_params.hdr.setup_data;
432 while (pa_data) { 432 while (pa_data) {
433 u32 data_len, map_len; 433 u32 data_len, map_len, data_type;
434 434
435 map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK), 435 map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK),
436 (u64)sizeof(struct setup_data)); 436 (u64)sizeof(struct setup_data));
437 data = early_memremap(pa_data, map_len); 437 data = early_memremap(pa_data, map_len);
438 data_len = data->len + sizeof(struct setup_data); 438 data_len = data->len + sizeof(struct setup_data);
439 if (data_len > map_len) { 439 data_type = data->type;
440 early_iounmap(data, map_len); 440 pa_next = data->next;
441 data = early_memremap(pa_data, data_len); 441 early_iounmap(data, map_len);
442 map_len = data_len;
443 }
444 442
445 switch (data->type) { 443 switch (data_type) {
446 case SETUP_E820_EXT: 444 case SETUP_E820_EXT:
447 parse_e820_ext(data); 445 parse_e820_ext(pa_data, data_len);
448 break; 446 break;
449 case SETUP_DTB: 447 case SETUP_DTB:
450 add_dtb(pa_data); 448 add_dtb(pa_data);
@@ -452,8 +450,7 @@ static void __init parse_setup_data(void)
452 default: 450 default:
453 break; 451 break;
454 } 452 }
455 pa_data = data->next; 453 pa_data = pa_next;
456 early_iounmap(data, map_len);
457 } 454 }
458} 455}
459 456
@@ -1070,7 +1067,7 @@ void __init setup_arch(char **cmdline_p)
1070 1067
1071 cleanup_highmap(); 1068 cleanup_highmap();
1072 1069
1073 memblock.current_limit = ISA_END_ADDRESS; 1070 memblock_set_current_limit(ISA_END_ADDRESS);
1074 memblock_x86_fill(); 1071 memblock_x86_fill();
1075 1072
1076 /* 1073 /*
@@ -1103,7 +1100,7 @@ void __init setup_arch(char **cmdline_p)
1103 1100
1104 setup_real_mode(); 1101 setup_real_mode();
1105 1102
1106 memblock.current_limit = get_max_mapped(); 1103 memblock_set_current_limit(get_max_mapped());
1107 dma_contiguous_reserve(0); 1104 dma_contiguous_reserve(0);
1108 1105
1109 /* 1106 /*
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 0215e2c563ef..799580cabc78 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -487,7 +487,7 @@ __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
487 unsigned long offset; 487 unsigned long offset;
488 resource_size_t last_addr; 488 resource_size_t last_addr;
489 unsigned int nrpages; 489 unsigned int nrpages;
490 enum fixed_addresses idx0, idx; 490 enum fixed_addresses idx;
491 int i, slot; 491 int i, slot;
492 492
493 WARN_ON(system_state != SYSTEM_BOOTING); 493 WARN_ON(system_state != SYSTEM_BOOTING);
@@ -540,8 +540,7 @@ __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
540 /* 540 /*
541 * Ok, go for it.. 541 * Ok, go for it..
542 */ 542 */
543 idx0 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot; 543 idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot;
544 idx = idx0;
545 while (nrpages > 0) { 544 while (nrpages > 0) {
546 early_set_fixmap(idx, phys_addr, prot); 545 early_set_fixmap(idx, phys_addr, prot);
547 phys_addr += PAGE_SIZE; 546 phys_addr += PAGE_SIZE;