diff options
Diffstat (limited to 'arch/x86_64/kernel/setup.c')
-rw-r--r-- | arch/x86_64/kernel/setup.c | 169 |
1 files changed, 17 insertions, 152 deletions
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 60477244d1a3..3d98b696881d 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
@@ -138,128 +138,6 @@ struct resource code_resource = { | |||
138 | .flags = IORESOURCE_RAM, | 138 | .flags = IORESOURCE_RAM, |
139 | }; | 139 | }; |
140 | 140 | ||
141 | #define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM) | ||
142 | |||
143 | static struct resource system_rom_resource = { | ||
144 | .name = "System ROM", | ||
145 | .start = 0xf0000, | ||
146 | .end = 0xfffff, | ||
147 | .flags = IORESOURCE_ROM, | ||
148 | }; | ||
149 | |||
150 | static struct resource extension_rom_resource = { | ||
151 | .name = "Extension ROM", | ||
152 | .start = 0xe0000, | ||
153 | .end = 0xeffff, | ||
154 | .flags = IORESOURCE_ROM, | ||
155 | }; | ||
156 | |||
157 | static struct resource adapter_rom_resources[] = { | ||
158 | { .name = "Adapter ROM", .start = 0xc8000, .end = 0, | ||
159 | .flags = IORESOURCE_ROM }, | ||
160 | { .name = "Adapter ROM", .start = 0, .end = 0, | ||
161 | .flags = IORESOURCE_ROM }, | ||
162 | { .name = "Adapter ROM", .start = 0, .end = 0, | ||
163 | .flags = IORESOURCE_ROM }, | ||
164 | { .name = "Adapter ROM", .start = 0, .end = 0, | ||
165 | .flags = IORESOURCE_ROM }, | ||
166 | { .name = "Adapter ROM", .start = 0, .end = 0, | ||
167 | .flags = IORESOURCE_ROM }, | ||
168 | { .name = "Adapter ROM", .start = 0, .end = 0, | ||
169 | .flags = IORESOURCE_ROM } | ||
170 | }; | ||
171 | |||
172 | static struct resource video_rom_resource = { | ||
173 | .name = "Video ROM", | ||
174 | .start = 0xc0000, | ||
175 | .end = 0xc7fff, | ||
176 | .flags = IORESOURCE_ROM, | ||
177 | }; | ||
178 | |||
179 | static struct resource video_ram_resource = { | ||
180 | .name = "Video RAM area", | ||
181 | .start = 0xa0000, | ||
182 | .end = 0xbffff, | ||
183 | .flags = IORESOURCE_RAM, | ||
184 | }; | ||
185 | |||
186 | #define romsignature(x) (*(unsigned short *)(x) == 0xaa55) | ||
187 | |||
188 | static int __init romchecksum(unsigned char *rom, unsigned long length) | ||
189 | { | ||
190 | unsigned char *p, sum = 0; | ||
191 | |||
192 | for (p = rom; p < rom + length; p++) | ||
193 | sum += *p; | ||
194 | return sum == 0; | ||
195 | } | ||
196 | |||
197 | static void __init probe_roms(void) | ||
198 | { | ||
199 | unsigned long start, length, upper; | ||
200 | unsigned char *rom; | ||
201 | int i; | ||
202 | |||
203 | /* video rom */ | ||
204 | upper = adapter_rom_resources[0].start; | ||
205 | for (start = video_rom_resource.start; start < upper; start += 2048) { | ||
206 | rom = isa_bus_to_virt(start); | ||
207 | if (!romsignature(rom)) | ||
208 | continue; | ||
209 | |||
210 | video_rom_resource.start = start; | ||
211 | |||
212 | /* 0 < length <= 0x7f * 512, historically */ | ||
213 | length = rom[2] * 512; | ||
214 | |||
215 | /* if checksum okay, trust length byte */ | ||
216 | if (length && romchecksum(rom, length)) | ||
217 | video_rom_resource.end = start + length - 1; | ||
218 | |||
219 | request_resource(&iomem_resource, &video_rom_resource); | ||
220 | break; | ||
221 | } | ||
222 | |||
223 | start = (video_rom_resource.end + 1 + 2047) & ~2047UL; | ||
224 | if (start < upper) | ||
225 | start = upper; | ||
226 | |||
227 | /* system rom */ | ||
228 | request_resource(&iomem_resource, &system_rom_resource); | ||
229 | upper = system_rom_resource.start; | ||
230 | |||
231 | /* check for extension rom (ignore length byte!) */ | ||
232 | rom = isa_bus_to_virt(extension_rom_resource.start); | ||
233 | if (romsignature(rom)) { | ||
234 | length = extension_rom_resource.end - extension_rom_resource.start + 1; | ||
235 | if (romchecksum(rom, length)) { | ||
236 | request_resource(&iomem_resource, &extension_rom_resource); | ||
237 | upper = extension_rom_resource.start; | ||
238 | } | ||
239 | } | ||
240 | |||
241 | /* check for adapter roms on 2k boundaries */ | ||
242 | for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper; | ||
243 | start += 2048) { | ||
244 | rom = isa_bus_to_virt(start); | ||
245 | if (!romsignature(rom)) | ||
246 | continue; | ||
247 | |||
248 | /* 0 < length <= 0x7f * 512, historically */ | ||
249 | length = rom[2] * 512; | ||
250 | |||
251 | /* but accept any length that fits if checksum okay */ | ||
252 | if (!length || start + length > upper || !romchecksum(rom, length)) | ||
253 | continue; | ||
254 | |||
255 | adapter_rom_resources[i].start = start; | ||
256 | adapter_rom_resources[i].end = start + length - 1; | ||
257 | request_resource(&iomem_resource, &adapter_rom_resources[i]); | ||
258 | |||
259 | start = adapter_rom_resources[i++].end & ~2047UL; | ||
260 | } | ||
261 | } | ||
262 | |||
263 | #ifdef CONFIG_PROC_VMCORE | 141 | #ifdef CONFIG_PROC_VMCORE |
264 | /* elfcorehdr= specifies the location of elf core header | 142 | /* elfcorehdr= specifies the location of elf core header |
265 | * stored by the crashed kernel. This option will be passed | 143 | * stored by the crashed kernel. This option will be passed |
@@ -444,6 +322,11 @@ void __init setup_arch(char **cmdline_p) | |||
444 | /* reserve ebda region */ | 322 | /* reserve ebda region */ |
445 | if (ebda_addr) | 323 | if (ebda_addr) |
446 | reserve_bootmem_generic(ebda_addr, ebda_size); | 324 | reserve_bootmem_generic(ebda_addr, ebda_size); |
325 | #ifdef CONFIG_NUMA | ||
326 | /* reserve nodemap region */ | ||
327 | if (nodemap_addr) | ||
328 | reserve_bootmem_generic(nodemap_addr, nodemap_size); | ||
329 | #endif | ||
447 | 330 | ||
448 | #ifdef CONFIG_SMP | 331 | #ifdef CONFIG_SMP |
449 | /* | 332 | /* |
@@ -519,15 +402,11 @@ void __init setup_arch(char **cmdline_p) | |||
519 | init_apic_mappings(); | 402 | init_apic_mappings(); |
520 | 403 | ||
521 | /* | 404 | /* |
522 | * Request address space for all standard RAM and ROM resources | 405 | * We trust e820 completely. No explicit ROM probing in memory. |
523 | * and also for regions reported as reserved by the e820. | 406 | */ |
524 | */ | ||
525 | probe_roms(); | ||
526 | e820_reserve_resources(); | 407 | e820_reserve_resources(); |
527 | e820_mark_nosave_regions(); | 408 | e820_mark_nosave_regions(); |
528 | 409 | ||
529 | request_resource(&iomem_resource, &video_ram_resource); | ||
530 | |||
531 | { | 410 | { |
532 | unsigned i; | 411 | unsigned i; |
533 | /* request I/O space for devices used on all i[345]86 PCs */ | 412 | /* request I/O space for devices used on all i[345]86 PCs */ |
@@ -1063,7 +942,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1063 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 942 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1064 | NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL, | 943 | NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL, |
1065 | NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL, | 944 | NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL, |
1066 | NULL, "fxsr_opt", NULL, "rdtscp", NULL, "lm", "3dnowext", "3dnow", | 945 | NULL, "fxsr_opt", "pdpe1gb", "rdtscp", NULL, "lm", |
946 | "3dnowext", "3dnow", | ||
1067 | 947 | ||
1068 | /* Transmeta-defined */ | 948 | /* Transmeta-defined */ |
1069 | "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL, | 949 | "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL, |
@@ -1081,7 +961,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1081 | /* Intel-defined (#2) */ | 961 | /* Intel-defined (#2) */ |
1082 | "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est", | 962 | "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est", |
1083 | "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL, | 963 | "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL, |
1084 | NULL, NULL, "dca", NULL, NULL, NULL, NULL, NULL, | 964 | NULL, NULL, "dca", NULL, NULL, NULL, NULL, "popcnt", |
1085 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 965 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1086 | 966 | ||
1087 | /* VIA/Cyrix/Centaur-defined */ | 967 | /* VIA/Cyrix/Centaur-defined */ |
@@ -1091,8 +971,10 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1091 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 971 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1092 | 972 | ||
1093 | /* AMD-defined (#2) */ | 973 | /* AMD-defined (#2) */ |
1094 | "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL, | 974 | "lahf_lm", "cmp_legacy", "svm", "extapic", "cr8_legacy", |
1095 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 975 | "altmovcr8", "abm", "sse4a", |
976 | "misalignsse", "3dnowprefetch", | ||
977 | "osvw", "ibs", NULL, NULL, NULL, NULL, | ||
1096 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 978 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1097 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 979 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1098 | }; | 980 | }; |
@@ -1103,6 +985,9 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1103 | "ttp", /* thermal trip */ | 985 | "ttp", /* thermal trip */ |
1104 | "tm", | 986 | "tm", |
1105 | "stc", | 987 | "stc", |
988 | "100mhzsteps", | ||
989 | "hwpstate", | ||
990 | NULL, /* tsc invariant mapped to constant_tsc */ | ||
1106 | NULL, | 991 | NULL, |
1107 | /* nothing */ /* constant_tsc - moved to flags */ | 992 | /* nothing */ /* constant_tsc - moved to flags */ |
1108 | }; | 993 | }; |
@@ -1219,23 +1104,3 @@ struct seq_operations cpuinfo_op = { | |||
1219 | .stop = c_stop, | 1104 | .stop = c_stop, |
1220 | .show = show_cpuinfo, | 1105 | .show = show_cpuinfo, |
1221 | }; | 1106 | }; |
1222 | |||
1223 | #if defined(CONFIG_INPUT_PCSPKR) || defined(CONFIG_INPUT_PCSPKR_MODULE) | ||
1224 | #include <linux/platform_device.h> | ||
1225 | static __init int add_pcspkr(void) | ||
1226 | { | ||
1227 | struct platform_device *pd; | ||
1228 | int ret; | ||
1229 | |||
1230 | pd = platform_device_alloc("pcspkr", -1); | ||
1231 | if (!pd) | ||
1232 | return -ENOMEM; | ||
1233 | |||
1234 | ret = platform_device_add(pd); | ||
1235 | if (ret) | ||
1236 | platform_device_put(pd); | ||
1237 | |||
1238 | return ret; | ||
1239 | } | ||
1240 | device_initcall(add_pcspkr); | ||
1241 | #endif | ||