1 #include <linux/kernel.h>
2 #include <linux/types.h>
3 #include <linux/init.h>
4 #include <linux/bootmem.h>
5 #include <linux/ioport.h>
6 #include <linux/string.h>
7 #include <linux/kexec.h>
8 #include <linux/module.h>
10 #include <linux/pfn.h>
11 #include <linux/uaccess.h>
12 #include <linux/suspend.h>
14 #include <asm/pgtable.h>
17 #include <asm/setup.h>
19 static struct resource system_rom_resource = {
23 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
26 static struct resource extension_rom_resource = {
27 .name = "Extension ROM",
30 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
33 static struct resource adapter_rom_resources[] = { {
34 .name = "Adapter ROM",
37 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
39 .name = "Adapter ROM",
42 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
44 .name = "Adapter ROM",
47 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
49 .name = "Adapter ROM",
52 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
54 .name = "Adapter ROM",
57 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
59 .name = "Adapter ROM",
62 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
65 static struct resource video_rom_resource = {
69 .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
72 #define ROMSIGNATURE 0xaa55
74 static int __init romsignature(const unsigned char *rom)
76 const unsigned short * const ptr = (const unsigned short *)rom;
79 return probe_kernel_address(ptr, sig) == 0 && sig == ROMSIGNATURE;
82 static int __init romchecksum(const unsigned char *rom, unsigned long length)
86 for (sum = 0; length && probe_kernel_address(rom++, c) == 0; length--)
88 return !length && !sum;
91 static void __init probe_roms(void)
93 const unsigned char *rom;
94 unsigned long start, length, upper;
99 upper = adapter_rom_resources[0].start;
100 for (start = video_rom_resource.start; start < upper; start += 2048) {
101 rom = isa_bus_to_virt(start);
102 if (!romsignature(rom))
105 video_rom_resource.start = start;
107 if (probe_kernel_address(rom + 2, c) != 0)
110 /* 0 < length <= 0x7f * 512, historically */
113 /* if checksum okay, trust length byte */
114 if (length && romchecksum(rom, length))
115 video_rom_resource.end = start + length - 1;
117 request_resource(&iomem_resource, &video_rom_resource);
121 start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
126 request_resource(&iomem_resource, &system_rom_resource);
127 upper = system_rom_resource.start;
129 /* check for extension rom (ignore length byte!) */
130 rom = isa_bus_to_virt(extension_rom_resource.start);
131 if (romsignature(rom)) {
132 length = extension_rom_resource.end - extension_rom_resource.start + 1;
133 if (romchecksum(rom, length)) {
134 request_resource(&iomem_resource, &extension_rom_resource);
135 upper = extension_rom_resource.start;
139 /* check for adapter roms on 2k boundaries */
140 for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper; start += 2048) {
141 rom = isa_bus_to_virt(start);
142 if (!romsignature(rom))
145 if (probe_kernel_address(rom + 2, c) != 0)
148 /* 0 < length <= 0x7f * 512, historically */
151 /* but accept any length that fits if checksum okay */
152 if (!length || start + length > upper || !romchecksum(rom, length))
155 adapter_rom_resources[i].start = start;
156 adapter_rom_resources[i].end = start + length - 1;
157 request_resource(&iomem_resource, &adapter_rom_resources[i]);
159 start = adapter_rom_resources[i++].end & ~2047UL;
164 * Request address space for all standard RAM and ROM resources
165 * and also for regions reported as reserved by the e820.
167 void __init init_iomem_resources(struct resource *code_resource,
168 struct resource *data_resource,
169 struct resource *bss_resource)
174 for (i = 0; i < e820.nr_map; i++) {
175 struct resource *res;
176 #ifndef CONFIG_RESOURCES_64BIT
177 if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL)
180 res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
181 switch (e820.map[i].type) {
182 case E820_RAM: res->name = "System RAM"; break;
183 case E820_ACPI: res->name = "ACPI Tables"; break;
184 case E820_NVS: res->name = "ACPI Non-volatile Storage"; break;
185 default: res->name = "reserved";
187 res->start = e820.map[i].addr;
188 res->end = res->start + e820.map[i].size - 1;
189 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
190 if (request_resource(&iomem_resource, res)) {
194 if (e820.map[i].type == E820_RAM) {
196 * We don't know which RAM region contains kernel data,
197 * so we try it repeatedly and let the resource manager
200 request_resource(res, code_resource);
201 request_resource(res, data_resource);
202 request_resource(res, bss_resource);
204 if (crashk_res.start != crashk_res.end)
205 request_resource(res, &crashk_res);
211 #if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION)
213 * e820_mark_nosave_regions - Find the ranges of physical addresses that do not
214 * correspond to e820 RAM areas and mark the corresponding pages as nosave for
217 * This function requires the e820 map to be sorted and without any
218 * overlapping entries and assumes the first e820 area to be RAM.
220 void __init e820_mark_nosave_regions(void)
225 pfn = PFN_DOWN(e820.map[0].addr + e820.map[0].size);
226 for (i = 1; i < e820.nr_map; i++) {
227 struct e820entry *ei = &e820.map[i];
229 if (pfn < PFN_UP(ei->addr))
230 register_nosave_region(pfn, PFN_UP(ei->addr));
232 pfn = PFN_DOWN(ei->addr + ei->size);
233 if (ei->type != E820_RAM)
234 register_nosave_region(PFN_UP(ei->addr), pfn);
236 if (pfn >= max_low_pfn)
243 * Find the highest page frame number we have available
245 void __init propagate_e820_map(void)
251 for (i = 0; i < e820.nr_map; i++) {
252 unsigned long start, end;
254 if (e820.map[i].type != E820_RAM)
256 start = PFN_UP(e820.map[i].addr);
257 end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
262 memory_present(0, start, end);
267 * Register fully available low RAM pages with the bootmem allocator.
269 void __init register_bootmem_low_pages(unsigned long max_low_pfn)
273 for (i = 0; i < e820.nr_map; i++) {
274 unsigned long curr_pfn, last_pfn, size;
276 * Reserve usable low memory
278 if (e820.map[i].type != E820_RAM)
281 * We are rounding up the start address of usable memory:
283 curr_pfn = PFN_UP(e820.map[i].addr);
284 if (curr_pfn >= max_low_pfn)
287 * ... and at the end of the usable range downwards:
289 last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
291 if (last_pfn > max_low_pfn)
292 last_pfn = max_low_pfn;
295 * .. finally, did all the rounding and playing
296 * around just make the area go away?
298 if (last_pfn <= curr_pfn)
301 size = last_pfn - curr_pfn;
302 free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
306 void __init limit_regions(unsigned long long size)
308 unsigned long long current_addr;
311 e820_print_map("limit_regions start");
312 for (i = 0; i < e820.nr_map; i++) {
313 current_addr = e820.map[i].addr + e820.map[i].size;
314 if (current_addr < size)
317 if (e820.map[i].type != E820_RAM)
320 if (e820.map[i].addr >= size) {
322 * This region starts past the end of the
323 * requested size, skip it completely.
328 e820.map[i].size -= current_addr - size;
330 e820_print_map("limit_regions endfor");
333 e820_print_map("limit_regions endfunc");
336 /* Overridden in paravirt.c if CONFIG_PARAVIRT */
337 char * __init __attribute__((weak)) memory_setup(void)
339 return machine_specific_memory_setup();
342 void __init setup_memory_map(void)
344 printk(KERN_INFO "BIOS-provided physical RAM map:\n");
345 e820_print_map(memory_setup());
348 static int __initdata user_defined_memmap;
351 * "mem=nopentium" disables the 4MB page tables.
352 * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
353 * to <mem>, overriding the bios size.
354 * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
355 * <start> to <start>+<mem>, overriding the bios size.
357 * HPA tells me bootloaders need to parse mem=, so no new
358 * option should be mem= [also see Documentation/i386/boot.txt]
360 static int __init parse_mem(char *arg)
365 if (strcmp(arg, "nopentium") == 0) {
366 setup_clear_cpu_cap(X86_FEATURE_PSE);
368 /* If the user specifies memory size, we
369 * limit the BIOS-provided memory map to
370 * that size. exactmap can be used to specify
371 * the exact map. mem=number can be used to
372 * trim the existing memory map.
374 unsigned long long mem_size;
376 mem_size = memparse(arg, &arg);
377 limit_regions(mem_size);
378 user_defined_memmap = 1;
382 early_param("mem", parse_mem);
384 static int __init parse_memmap(char *arg)
389 if (strcmp(arg, "exactmap") == 0) {
390 #ifdef CONFIG_CRASH_DUMP
391 /* If we are doing a crash dump, we
392 * still need to know the real mem
393 * size before original memory map is
396 propagate_e820_map();
397 saved_max_pfn = max_pfn;
400 user_defined_memmap = 1;
402 /* If the user specifies memory size, we
403 * limit the BIOS-provided memory map to
404 * that size. exactmap can be used to specify
405 * the exact map. mem=number can be used to
406 * trim the existing memory map.
408 unsigned long long start_at, mem_size;
410 mem_size = memparse(arg, &arg);
412 start_at = memparse(arg+1, &arg);
413 add_memory_region(start_at, mem_size, E820_RAM);
414 } else if (*arg == '#') {
415 start_at = memparse(arg+1, &arg);
416 add_memory_region(start_at, mem_size, E820_ACPI);
417 } else if (*arg == '$') {
418 start_at = memparse(arg+1, &arg);
419 add_memory_region(start_at, mem_size, E820_RESERVED);
421 limit_regions(mem_size);
422 user_defined_memmap = 1;
427 early_param("memmap", parse_memmap);
429 void __init finish_e820_parsing(void)
431 if (user_defined_memmap) {
432 printk(KERN_INFO "user-defined physical RAM map:\n");
433 e820_print_map("user");