diff options
Diffstat (limited to 'arch/x86/mach-default/setup.c')
-rw-r--r-- | arch/x86/mach-default/setup.c | 74 |
1 files changed, 31 insertions, 43 deletions
diff --git a/arch/x86/mach-default/setup.c b/arch/x86/mach-default/setup.c index 0c28a071824c..48278fa7d3de 100644 --- a/arch/x86/mach-default/setup.c +++ b/arch/x86/mach-default/setup.c | |||
@@ -10,6 +10,14 @@ | |||
10 | #include <asm/e820.h> | 10 | #include <asm/e820.h> |
11 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
12 | 12 | ||
13 | /* | ||
14 | * Any quirks to be performed to initialize timers/irqs/etc? | ||
15 | */ | ||
16 | int (*arch_time_init_quirk)(void); | ||
17 | int (*arch_pre_intr_init_quirk)(void); | ||
18 | int (*arch_intr_init_quirk)(void); | ||
19 | int (*arch_trap_init_quirk)(void); | ||
20 | |||
13 | #ifdef CONFIG_HOTPLUG_CPU | 21 | #ifdef CONFIG_HOTPLUG_CPU |
14 | #define DEFAULT_SEND_IPI (1) | 22 | #define DEFAULT_SEND_IPI (1) |
15 | #else | 23 | #else |
@@ -29,6 +37,10 @@ int no_broadcast=DEFAULT_SEND_IPI; | |||
29 | **/ | 37 | **/ |
30 | void __init pre_intr_init_hook(void) | 38 | void __init pre_intr_init_hook(void) |
31 | { | 39 | { |
40 | if (arch_pre_intr_init_quirk) { | ||
41 | if (arch_pre_intr_init_quirk()) | ||
42 | return; | ||
43 | } | ||
32 | init_ISA_irqs(); | 44 | init_ISA_irqs(); |
33 | } | 45 | } |
34 | 46 | ||
@@ -52,6 +64,10 @@ static struct irqaction irq2 = { | |||
52 | **/ | 64 | **/ |
53 | void __init intr_init_hook(void) | 65 | void __init intr_init_hook(void) |
54 | { | 66 | { |
67 | if (arch_intr_init_quirk) { | ||
68 | if (arch_intr_init_quirk()) | ||
69 | return; | ||
70 | } | ||
55 | #ifdef CONFIG_X86_LOCAL_APIC | 71 | #ifdef CONFIG_X86_LOCAL_APIC |
56 | apic_intr_init(); | 72 | apic_intr_init(); |
57 | #endif | 73 | #endif |
@@ -65,7 +81,7 @@ void __init intr_init_hook(void) | |||
65 | * | 81 | * |
66 | * Description: | 82 | * Description: |
67 | * generally used to activate any machine specific identification | 83 | * generally used to activate any machine specific identification |
68 | * routines that may be needed before setup_arch() runs. On VISWS | 84 | * routines that may be needed before setup_arch() runs. On Voyager |
69 | * this is used to get the board revision and type. | 85 | * this is used to get the board revision and type. |
70 | **/ | 86 | **/ |
71 | void __init pre_setup_arch_hook(void) | 87 | void __init pre_setup_arch_hook(void) |
@@ -81,6 +97,10 @@ void __init pre_setup_arch_hook(void) | |||
81 | **/ | 97 | **/ |
82 | void __init trap_init_hook(void) | 98 | void __init trap_init_hook(void) |
83 | { | 99 | { |
100 | if (arch_trap_init_quirk) { | ||
101 | if (arch_trap_init_quirk()) | ||
102 | return; | ||
103 | } | ||
84 | } | 104 | } |
85 | 105 | ||
86 | static struct irqaction irq0 = { | 106 | static struct irqaction irq0 = { |
@@ -99,6 +119,16 @@ static struct irqaction irq0 = { | |||
99 | **/ | 119 | **/ |
100 | void __init time_init_hook(void) | 120 | void __init time_init_hook(void) |
101 | { | 121 | { |
122 | if (arch_time_init_quirk) { | ||
123 | /* | ||
124 | * A nonzero return code does not mean failure, it means | ||
125 | * that the architecture quirk does not want any | ||
126 | * generic (timer) setup to be performed after this: | ||
127 | */ | ||
128 | if (arch_time_init_quirk()) | ||
129 | return; | ||
130 | } | ||
131 | |||
102 | irq0.mask = cpumask_of_cpu(0); | 132 | irq0.mask = cpumask_of_cpu(0); |
103 | setup_irq(0, &irq0); | 133 | setup_irq(0, &irq0); |
104 | } | 134 | } |
@@ -142,45 +172,3 @@ static int __init print_ipi_mode(void) | |||
142 | 172 | ||
143 | late_initcall(print_ipi_mode); | 173 | late_initcall(print_ipi_mode); |
144 | 174 | ||
145 | /** | ||
146 | * machine_specific_memory_setup - Hook for machine specific memory setup. | ||
147 | * | ||
148 | * Description: | ||
149 | * This is included late in kernel/setup.c so that it can make | ||
150 | * use of all of the static functions. | ||
151 | **/ | ||
152 | |||
153 | char * __init machine_specific_memory_setup(void) | ||
154 | { | ||
155 | char *who; | ||
156 | |||
157 | |||
158 | who = "BIOS-e820"; | ||
159 | |||
160 | /* | ||
161 | * Try to copy the BIOS-supplied E820-map. | ||
162 | * | ||
163 | * Otherwise fake a memory map; one section from 0k->640k, | ||
164 | * the next section from 1mb->appropriate_mem_k | ||
165 | */ | ||
166 | sanitize_e820_map(boot_params.e820_map, &boot_params.e820_entries); | ||
167 | if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) | ||
168 | < 0) { | ||
169 | unsigned long mem_size; | ||
170 | |||
171 | /* compare results from other methods and take the greater */ | ||
172 | if (boot_params.alt_mem_k | ||
173 | < boot_params.screen_info.ext_mem_k) { | ||
174 | mem_size = boot_params.screen_info.ext_mem_k; | ||
175 | who = "BIOS-88"; | ||
176 | } else { | ||
177 | mem_size = boot_params.alt_mem_k; | ||
178 | who = "BIOS-e801"; | ||
179 | } | ||
180 | |||
181 | e820.nr_map = 0; | ||
182 | add_memory_region(0, LOWMEMSIZE(), E820_RAM); | ||
183 | add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM); | ||
184 | } | ||
185 | return who; | ||
186 | } | ||