e820_32.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  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>
  9. #include <linux/mm.h>
  10. #include <linux/pfn.h>
  11. #include <linux/uaccess.h>
  12. #include <linux/suspend.h>
  13. #include <asm/pgtable.h>
  14. #include <asm/page.h>
  15. #include <asm/e820.h>
  16. #include <asm/setup.h>
  17. static struct resource system_rom_resource = {
  18. .name = "System ROM",
  19. .start = 0xf0000,
  20. .end = 0xfffff,
  21. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  22. };
  23. static struct resource extension_rom_resource = {
  24. .name = "Extension ROM",
  25. .start = 0xe0000,
  26. .end = 0xeffff,
  27. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  28. };
  29. static struct resource adapter_rom_resources[] = { {
  30. .name = "Adapter ROM",
  31. .start = 0xc8000,
  32. .end = 0,
  33. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  34. }, {
  35. .name = "Adapter ROM",
  36. .start = 0,
  37. .end = 0,
  38. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  39. }, {
  40. .name = "Adapter ROM",
  41. .start = 0,
  42. .end = 0,
  43. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  44. }, {
  45. .name = "Adapter ROM",
  46. .start = 0,
  47. .end = 0,
  48. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  49. }, {
  50. .name = "Adapter ROM",
  51. .start = 0,
  52. .end = 0,
  53. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  54. }, {
  55. .name = "Adapter ROM",
  56. .start = 0,
  57. .end = 0,
  58. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  59. } };
  60. static struct resource video_rom_resource = {
  61. .name = "Video ROM",
  62. .start = 0xc0000,
  63. .end = 0xc7fff,
  64. .flags = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
  65. };
  66. #define ROMSIGNATURE 0xaa55
  67. static int __init romsignature(const unsigned char *rom)
  68. {
  69. const unsigned short * const ptr = (const unsigned short *)rom;
  70. unsigned short sig;
  71. return probe_kernel_address(ptr, sig) == 0 && sig == ROMSIGNATURE;
  72. }
  73. static int __init romchecksum(const unsigned char *rom, unsigned long length)
  74. {
  75. unsigned char sum, c;
  76. for (sum = 0; length && probe_kernel_address(rom++, c) == 0; length--)
  77. sum += c;
  78. return !length && !sum;
  79. }
  80. static void __init probe_roms(void)
  81. {
  82. const unsigned char *rom;
  83. unsigned long start, length, upper;
  84. unsigned char c;
  85. int i;
  86. /* video rom */
  87. upper = adapter_rom_resources[0].start;
  88. for (start = video_rom_resource.start; start < upper; start += 2048) {
  89. rom = isa_bus_to_virt(start);
  90. if (!romsignature(rom))
  91. continue;
  92. video_rom_resource.start = start;
  93. if (probe_kernel_address(rom + 2, c) != 0)
  94. continue;
  95. /* 0 < length <= 0x7f * 512, historically */
  96. length = c * 512;
  97. /* if checksum okay, trust length byte */
  98. if (length && romchecksum(rom, length))
  99. video_rom_resource.end = start + length - 1;
  100. request_resource(&iomem_resource, &video_rom_resource);
  101. break;
  102. }
  103. start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
  104. if (start < upper)
  105. start = upper;
  106. /* system rom */
  107. request_resource(&iomem_resource, &system_rom_resource);
  108. upper = system_rom_resource.start;
  109. /* check for extension rom (ignore length byte!) */
  110. rom = isa_bus_to_virt(extension_rom_resource.start);
  111. if (romsignature(rom)) {
  112. length = extension_rom_resource.end - extension_rom_resource.start + 1;
  113. if (romchecksum(rom, length)) {
  114. request_resource(&iomem_resource, &extension_rom_resource);
  115. upper = extension_rom_resource.start;
  116. }
  117. }
  118. /* check for adapter roms on 2k boundaries */
  119. for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper; start += 2048) {
  120. rom = isa_bus_to_virt(start);
  121. if (!romsignature(rom))
  122. continue;
  123. if (probe_kernel_address(rom + 2, c) != 0)
  124. continue;
  125. /* 0 < length <= 0x7f * 512, historically */
  126. length = c * 512;
  127. /* but accept any length that fits if checksum okay */
  128. if (!length || start + length > upper || !romchecksum(rom, length))
  129. continue;
  130. adapter_rom_resources[i].start = start;
  131. adapter_rom_resources[i].end = start + length - 1;
  132. request_resource(&iomem_resource, &adapter_rom_resources[i]);
  133. start = adapter_rom_resources[i++].end & ~2047UL;
  134. }
  135. }
  136. /*
  137. * Request address space for all standard RAM and ROM resources
  138. * and also for regions reported as reserved by the e820.
  139. */
  140. void __init init_iomem_resources(struct resource *code_resource,
  141. struct resource *data_resource,
  142. struct resource *bss_resource)
  143. {
  144. int i;
  145. probe_roms();
  146. for (i = 0; i < e820.nr_map; i++) {
  147. struct resource *res;
  148. #ifndef CONFIG_RESOURCES_64BIT
  149. if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL)
  150. continue;
  151. #endif
  152. res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
  153. switch (e820.map[i].type) {
  154. case E820_RAM: res->name = "System RAM"; break;
  155. case E820_ACPI: res->name = "ACPI Tables"; break;
  156. case E820_NVS: res->name = "ACPI Non-volatile Storage"; break;
  157. default: res->name = "reserved";
  158. }
  159. res->start = e820.map[i].addr;
  160. res->end = res->start + e820.map[i].size - 1;
  161. res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
  162. if (request_resource(&iomem_resource, res)) {
  163. kfree(res);
  164. continue;
  165. }
  166. if (e820.map[i].type == E820_RAM) {
  167. /*
  168. * We don't know which RAM region contains kernel data,
  169. * so we try it repeatedly and let the resource manager
  170. * test it.
  171. */
  172. request_resource(res, code_resource);
  173. request_resource(res, data_resource);
  174. request_resource(res, bss_resource);
  175. #ifdef CONFIG_KEXEC
  176. if (crashk_res.start != crashk_res.end)
  177. request_resource(res, &crashk_res);
  178. #endif
  179. }
  180. }
  181. }
  182. #if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION)
  183. /**
  184. * e820_mark_nosave_regions - Find the ranges of physical addresses that do not
  185. * correspond to e820 RAM areas and mark the corresponding pages as nosave for
  186. * hibernation.
  187. *
  188. * This function requires the e820 map to be sorted and without any
  189. * overlapping entries and assumes the first e820 area to be RAM.
  190. */
  191. void __init e820_mark_nosave_regions(void)
  192. {
  193. int i;
  194. unsigned long pfn;
  195. pfn = PFN_DOWN(e820.map[0].addr + e820.map[0].size);
  196. for (i = 1; i < e820.nr_map; i++) {
  197. struct e820entry *ei = &e820.map[i];
  198. if (pfn < PFN_UP(ei->addr))
  199. register_nosave_region(pfn, PFN_UP(ei->addr));
  200. pfn = PFN_DOWN(ei->addr + ei->size);
  201. if (ei->type != E820_RAM)
  202. register_nosave_region(PFN_UP(ei->addr), pfn);
  203. if (pfn >= max_low_pfn)
  204. break;
  205. }
  206. }
  207. #endif
  208. /*
  209. * Find the highest page frame number we have available
  210. */
  211. void __init propagate_e820_map(void)
  212. {
  213. int i;
  214. max_pfn = 0;
  215. for (i = 0; i < e820.nr_map; i++) {
  216. unsigned long start, end;
  217. /* RAM? */
  218. if (e820.map[i].type != E820_RAM)
  219. continue;
  220. start = PFN_UP(e820.map[i].addr);
  221. end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
  222. if (start >= end)
  223. continue;
  224. if (end > max_pfn)
  225. max_pfn = end;
  226. memory_present(0, start, end);
  227. }
  228. }
  229. /*
  230. * Register fully available low RAM pages with the bootmem allocator.
  231. */
  232. void __init register_bootmem_low_pages(unsigned long max_low_pfn)
  233. {
  234. int i;
  235. for (i = 0; i < e820.nr_map; i++) {
  236. unsigned long curr_pfn, last_pfn, size;
  237. /*
  238. * Reserve usable low memory
  239. */
  240. if (e820.map[i].type != E820_RAM)
  241. continue;
  242. /*
  243. * We are rounding up the start address of usable memory:
  244. */
  245. curr_pfn = PFN_UP(e820.map[i].addr);
  246. if (curr_pfn >= max_low_pfn)
  247. continue;
  248. /*
  249. * ... and at the end of the usable range downwards:
  250. */
  251. last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
  252. if (last_pfn > max_low_pfn)
  253. last_pfn = max_low_pfn;
  254. /*
  255. * .. finally, did all the rounding and playing
  256. * around just make the area go away?
  257. */
  258. if (last_pfn <= curr_pfn)
  259. continue;
  260. size = last_pfn - curr_pfn;
  261. free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
  262. }
  263. }
  264. void __init limit_regions(unsigned long long size)
  265. {
  266. unsigned long long current_addr;
  267. int i;
  268. e820_print_map("limit_regions start");
  269. for (i = 0; i < e820.nr_map; i++) {
  270. current_addr = e820.map[i].addr + e820.map[i].size;
  271. if (current_addr < size)
  272. continue;
  273. if (e820.map[i].type != E820_RAM)
  274. continue;
  275. if (e820.map[i].addr >= size) {
  276. /*
  277. * This region starts past the end of the
  278. * requested size, skip it completely.
  279. */
  280. e820.nr_map = i;
  281. } else {
  282. e820.nr_map = i + 1;
  283. e820.map[i].size -= current_addr - size;
  284. }
  285. e820_print_map("limit_regions endfor");
  286. return;
  287. }
  288. e820_print_map("limit_regions endfunc");
  289. }
  290. /* Overridden in paravirt.c if CONFIG_PARAVIRT */
  291. char * __init __attribute__((weak)) memory_setup(void)
  292. {
  293. return machine_specific_memory_setup();
  294. }
  295. void __init setup_memory_map(void)
  296. {
  297. printk(KERN_INFO "BIOS-provided physical RAM map:\n");
  298. e820_print_map(memory_setup());
  299. }
  300. static int __initdata user_defined_memmap;
  301. /*
  302. * "mem=nopentium" disables the 4MB page tables.
  303. * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
  304. * to <mem>, overriding the bios size.
  305. * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
  306. * <start> to <start>+<mem>, overriding the bios size.
  307. *
  308. * HPA tells me bootloaders need to parse mem=, so no new
  309. * option should be mem= [also see Documentation/i386/boot.txt]
  310. */
  311. static int __init parse_mem(char *arg)
  312. {
  313. if (!arg)
  314. return -EINVAL;
  315. if (strcmp(arg, "nopentium") == 0) {
  316. setup_clear_cpu_cap(X86_FEATURE_PSE);
  317. } else {
  318. /* If the user specifies memory size, we
  319. * limit the BIOS-provided memory map to
  320. * that size. exactmap can be used to specify
  321. * the exact map. mem=number can be used to
  322. * trim the existing memory map.
  323. */
  324. unsigned long long mem_size;
  325. mem_size = memparse(arg, &arg);
  326. limit_regions(mem_size);
  327. user_defined_memmap = 1;
  328. }
  329. return 0;
  330. }
  331. early_param("mem", parse_mem);
  332. static int __init parse_memmap(char *arg)
  333. {
  334. if (!arg)
  335. return -EINVAL;
  336. if (strcmp(arg, "exactmap") == 0) {
  337. #ifdef CONFIG_CRASH_DUMP
  338. /* If we are doing a crash dump, we
  339. * still need to know the real mem
  340. * size before original memory map is
  341. * reset.
  342. */
  343. propagate_e820_map();
  344. saved_max_pfn = max_pfn;
  345. #endif
  346. e820.nr_map = 0;
  347. user_defined_memmap = 1;
  348. } else {
  349. /* If the user specifies memory size, we
  350. * limit the BIOS-provided memory map to
  351. * that size. exactmap can be used to specify
  352. * the exact map. mem=number can be used to
  353. * trim the existing memory map.
  354. */
  355. unsigned long long start_at, mem_size;
  356. mem_size = memparse(arg, &arg);
  357. if (*arg == '@') {
  358. start_at = memparse(arg+1, &arg);
  359. add_memory_region(start_at, mem_size, E820_RAM);
  360. } else if (*arg == '#') {
  361. start_at = memparse(arg+1, &arg);
  362. add_memory_region(start_at, mem_size, E820_ACPI);
  363. } else if (*arg == '$') {
  364. start_at = memparse(arg+1, &arg);
  365. add_memory_region(start_at, mem_size, E820_RESERVED);
  366. } else {
  367. limit_regions(mem_size);
  368. user_defined_memmap = 1;
  369. }
  370. }
  371. return 0;
  372. }
  373. early_param("memmap", parse_memmap);
  374. void __init finish_e820_parsing(void)
  375. {
  376. if (user_defined_memmap) {
  377. printk(KERN_INFO "user-defined physical RAM map:\n");
  378. e820_print_map("user");
  379. }
  380. }