aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-20 04:19:54 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-08-27 11:12:52 -0400
commit6b18ae3e2ff62daa9f181401759161dd8de0aadf (patch)
tree3e1c61c26c29a1a81d5f54917a92c37334d3c607 /arch/x86
parent816c25e7d4fb6fd40022a376e8b7f45b1edf5a89 (diff)
x86: Move memory_setup to x86_init_ops
memory_setup is overridden by x86_quirks and by paravirts with weak functions and quirks. Unify the whole mess and make it an unconditional x86_init_ops function which defaults to the standard function and can be overridden by the early platform code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/include/asm/e820.h2
-rw-r--r--arch/x86/include/asm/paravirt_types.h1
-rw-r--r--arch/x86/include/asm/setup.h1
-rw-r--r--arch/x86/include/asm/x86_init.h2
-rw-r--r--arch/x86/kernel/apic/numaq_32.c1
-rw-r--r--arch/x86/kernel/e820.c19
-rw-r--r--arch/x86/kernel/paravirt.c6
-rw-r--r--arch/x86/kernel/visws_quirks.c3
-rw-r--r--arch/x86/kernel/x86_init.c2
-rw-r--r--arch/x86/lguest/boot.c3
-rw-r--r--arch/x86/xen/enlighten.c3
11 files changed, 11 insertions, 32 deletions
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h
index 7ecba4d8508..40b4e614fe7 100644
--- a/arch/x86/include/asm/e820.h
+++ b/arch/x86/include/asm/e820.h
@@ -126,8 +126,6 @@ extern void e820_reserve_resources(void);
126extern void e820_reserve_resources_late(void); 126extern void e820_reserve_resources_late(void);
127extern void setup_memory_map(void); 127extern void setup_memory_map(void);
128extern char *default_machine_specific_memory_setup(void); 128extern char *default_machine_specific_memory_setup(void);
129extern char *machine_specific_memory_setup(void);
130extern char *memory_setup(void);
131#endif /* __KERNEL__ */ 129#endif /* __KERNEL__ */
132#endif /* __ASSEMBLY__ */ 130#endif /* __ASSEMBLY__ */
133 131
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 2b3371bae29..6d668968b6b 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -81,7 +81,6 @@ struct pv_init_ops {
81 81
82 /* Basic arch-specific setup */ 82 /* Basic arch-specific setup */
83 void (*arch_setup)(void); 83 void (*arch_setup)(void);
84 char *(*memory_setup)(void);
85 void (*post_allocator_init)(void); 84 void (*post_allocator_init)(void);
86 85
87 /* Print a banner to identify the environment */ 86 /* Print a banner to identify the environment */
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index 19769ac6061..9cba9d6ca88 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -22,7 +22,6 @@ struct x86_quirks {
22 int (*arch_pre_intr_init)(void); 22 int (*arch_pre_intr_init)(void);
23 int (*arch_intr_init)(void); 23 int (*arch_intr_init)(void);
24 int (*arch_trap_init)(void); 24 int (*arch_trap_init)(void);
25 char * (*arch_memory_setup)(void);
26 int (*mach_get_smp_config)(unsigned int early); 25 int (*mach_get_smp_config)(unsigned int early);
27 int (*mach_find_smp_config)(unsigned int reserve); 26 int (*mach_find_smp_config)(unsigned int reserve);
28 27
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index 8a971cb3dd3..6c084f2a6c3 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -7,12 +7,14 @@
7 * @reserve_resources: reserve the standard resources for the 7 * @reserve_resources: reserve the standard resources for the
8 * platform 8 * platform
9 * @reserve_ebda_region: reserve the extended bios data area 9 * @reserve_ebda_region: reserve the extended bios data area
10 * @memory_setup: platform specific memory setup
10 * 11 *
11 */ 12 */
12struct x86_init_resources { 13struct x86_init_resources {
13 void (*probe_roms)(void); 14 void (*probe_roms)(void);
14 void (*reserve_resources)(void); 15 void (*reserve_resources)(void);
15 void (*reserve_ebda_region)(void); 16 void (*reserve_ebda_region)(void);
17 char *(*memory_setup)(void);
16}; 18};
17 19
18/** 20/**
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c
index ca96e68f0d2..403c062f69e 100644
--- a/arch/x86/kernel/apic/numaq_32.c
+++ b/arch/x86/kernel/apic/numaq_32.c
@@ -260,7 +260,6 @@ static struct x86_quirks numaq_x86_quirks __initdata = {
260 .arch_pre_time_init = numaq_pre_time_init, 260 .arch_pre_time_init = numaq_pre_time_init,
261 .arch_time_init = NULL, 261 .arch_time_init = NULL,
262 .arch_pre_intr_init = NULL, 262 .arch_pre_intr_init = NULL,
263 .arch_memory_setup = NULL,
264 .arch_intr_init = NULL, 263 .arch_intr_init = NULL,
265 .arch_trap_init = NULL, 264 .arch_trap_init = NULL,
266 .mach_get_smp_config = NULL, 265 .mach_get_smp_config = NULL,
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index 5cb5725b2ba..0d804b907e8 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -1455,28 +1455,11 @@ char *__init default_machine_specific_memory_setup(void)
1455 return who; 1455 return who;
1456} 1456}
1457 1457
1458char *__init __attribute__((weak)) machine_specific_memory_setup(void)
1459{
1460 if (x86_quirks->arch_memory_setup) {
1461 char *who = x86_quirks->arch_memory_setup();
1462
1463 if (who)
1464 return who;
1465 }
1466 return default_machine_specific_memory_setup();
1467}
1468
1469/* Overridden in paravirt.c if CONFIG_PARAVIRT */
1470char * __init __attribute__((weak)) memory_setup(void)
1471{
1472 return machine_specific_memory_setup();
1473}
1474
1475void __init setup_memory_map(void) 1458void __init setup_memory_map(void)
1476{ 1459{
1477 char *who; 1460 char *who;
1478 1461
1479 who = memory_setup(); 1462 who = x86_init.resources.memory_setup();
1480 memcpy(&e820_saved, &e820, sizeof(struct e820map)); 1463 memcpy(&e820_saved, &e820, sizeof(struct e820map));
1481 printk(KERN_INFO "BIOS-provided physical RAM map:\n"); 1464 printk(KERN_INFO "BIOS-provided physical RAM map:\n");
1482 e820_print_map(who); 1465 e820_print_map(who);
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index 70ec9b951d7..532c9a2626c 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -60,11 +60,6 @@ static void __init default_banner(void)
60 pv_info.name); 60 pv_info.name);
61} 61}
62 62
63char *memory_setup(void)
64{
65 return pv_init_ops.memory_setup();
66}
67
68/* Simple instruction patching code. */ 63/* Simple instruction patching code. */
69#define DEF_NATIVE(ops, name, code) \ 64#define DEF_NATIVE(ops, name, code) \
70 extern const char start_##ops##_##name[], end_##ops##_##name[]; \ 65 extern const char start_##ops##_##name[], end_##ops##_##name[]; \
@@ -322,7 +317,6 @@ struct pv_init_ops pv_init_ops = {
322 .patch = native_patch, 317 .patch = native_patch,
323 .banner = default_banner, 318 .banner = default_banner,
324 .arch_setup = paravirt_nop, 319 .arch_setup = paravirt_nop,
325 .memory_setup = machine_specific_memory_setup,
326}; 320};
327 321
328struct pv_time_ops pv_time_ops = { 322struct pv_time_ops pv_time_ops = {
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c
index 31ffc24eec4..97c670df1ae 100644
--- a/arch/x86/kernel/visws_quirks.c
+++ b/arch/x86/kernel/visws_quirks.c
@@ -239,7 +239,6 @@ static int visws_trap_init(void);
239static struct x86_quirks visws_x86_quirks __initdata = { 239static struct x86_quirks visws_x86_quirks __initdata = {
240 .arch_time_init = visws_time_init, 240 .arch_time_init = visws_time_init,
241 .arch_pre_intr_init = visws_pre_intr_init, 241 .arch_pre_intr_init = visws_pre_intr_init,
242 .arch_memory_setup = visws_memory_setup,
243 .arch_intr_init = NULL, 242 .arch_intr_init = NULL,
244 .arch_trap_init = visws_trap_init, 243 .arch_trap_init = visws_trap_init,
245 .mach_get_smp_config = visws_get_smp_config, 244 .mach_get_smp_config = visws_get_smp_config,
@@ -263,6 +262,8 @@ void __init visws_early_detect(void)
263 */ 262 */
264 x86_quirks = &visws_x86_quirks; 263 x86_quirks = &visws_x86_quirks;
265 264
265 x86_init.resources.memory_setup = visws_memory_setup;
266
266 /* 267 /*
267 * Install reboot quirks: 268 * Install reboot quirks:
268 */ 269 */
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index 1fff49a6858..1965bff3489 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -7,6 +7,7 @@
7 7
8#include <asm/bios_ebda.h> 8#include <asm/bios_ebda.h>
9#include <asm/setup.h> 9#include <asm/setup.h>
10#include <asm/e820.h>
10 11
11void __cpuinit x86_init_noop(void) { } 12void __cpuinit x86_init_noop(void) { }
12 13
@@ -20,5 +21,6 @@ struct __initdata x86_init_ops x86_init = {
20 .probe_roms = x86_init_noop, 21 .probe_roms = x86_init_noop,
21 .reserve_resources = reserve_standard_io_resources, 22 .reserve_resources = reserve_standard_io_resources,
22 .reserve_ebda_region = reserve_ebda_region, 23 .reserve_ebda_region = reserve_ebda_region,
24 .memory_setup = default_machine_specific_memory_setup,
23 }, 25 },
24}; 26};
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index d677fa9ca65..11445c176de 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -1270,7 +1270,6 @@ __init void lguest_init(void)
1270 pv_irq_ops.safe_halt = lguest_safe_halt; 1270 pv_irq_ops.safe_halt = lguest_safe_halt;
1271 1271
1272 /* Setup operations */ 1272 /* Setup operations */
1273 pv_init_ops.memory_setup = lguest_memory_setup;
1274 pv_init_ops.patch = lguest_patch; 1273 pv_init_ops.patch = lguest_patch;
1275 1274
1276 /* Intercepts of various CPU instructions */ 1275 /* Intercepts of various CPU instructions */
@@ -1325,6 +1324,8 @@ __init void lguest_init(void)
1325 pv_time_ops.time_init = lguest_time_init; 1324 pv_time_ops.time_init = lguest_time_init;
1326 pv_time_ops.get_tsc_khz = lguest_tsc_khz; 1325 pv_time_ops.get_tsc_khz = lguest_tsc_khz;
1327 1326
1327 x86_init.resources.memory_setup = lguest_memory_setup;
1328
1328 /* 1329 /*
1329 * Now is a good time to look at the implementations of these functions 1330 * Now is a good time to look at the implementations of these functions
1330 * before returning to the rest of lguest_init(). 1331 * before returning to the rest of lguest_init().
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index e90540a46a0..50b20c64f0b 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -841,7 +841,6 @@ static const struct pv_init_ops xen_init_ops __initdata = {
841 .patch = xen_patch, 841 .patch = xen_patch,
842 842
843 .banner = xen_banner, 843 .banner = xen_banner,
844 .memory_setup = xen_memory_setup,
845 .arch_setup = xen_arch_setup, 844 .arch_setup = xen_arch_setup,
846 .post_allocator_init = xen_post_allocator_init, 845 .post_allocator_init = xen_post_allocator_init,
847}; 846};
@@ -982,6 +981,8 @@ asmlinkage void __init xen_start_kernel(void)
982 pv_apic_ops = xen_apic_ops; 981 pv_apic_ops = xen_apic_ops;
983 pv_mmu_ops = xen_mmu_ops; 982 pv_mmu_ops = xen_mmu_ops;
984 983
984 x86_init.resources.memory_setup = xen_memory_setup;
985
985#ifdef CONFIG_X86_64 986#ifdef CONFIG_X86_64
986 /* 987 /*
987 * Setup percpu state. We only need to do this for 64-bit 988 * Setup percpu state. We only need to do this for 64-bit