e820_64.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. /*
  2. * Handle the memory map.
  3. * The functions here do the job until bootmem takes over.
  4. *
  5. * Getting sanitize_e820_map() in sync with i386 version by applying change:
  6. * - Provisions for empty E820 memory regions (reported by certain BIOSes).
  7. * Alex Achenbach <xela@slit.de>, December 2002.
  8. * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
  9. *
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/types.h>
  13. #include <linux/init.h>
  14. #include <linux/bootmem.h>
  15. #include <linux/ioport.h>
  16. #include <linux/string.h>
  17. #include <linux/kexec.h>
  18. #include <linux/module.h>
  19. #include <linux/mm.h>
  20. #include <linux/suspend.h>
  21. #include <linux/pfn.h>
  22. #include <asm/pgtable.h>
  23. #include <asm/page.h>
  24. #include <asm/e820.h>
  25. #include <asm/proto.h>
  26. #include <asm/setup.h>
  27. #include <asm/sections.h>
  28. #include <asm/kdebug.h>
  29. #include <asm/trampoline.h>
  30. /*
  31. * PFN of last memory page.
  32. */
  33. unsigned long end_pfn;
  34. /*
  35. * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
  36. * The direct mapping extends to max_pfn_mapped, so that we can directly access
  37. * apertures, ACPI and other tables without having to play with fixmaps.
  38. */
  39. unsigned long max_pfn_mapped;
  40. /*
  41. * Last pfn which the user wants to use.
  42. */
  43. static unsigned long __initdata end_user_pfn = MAXMEM>>PAGE_SHIFT;
  44. /*
  45. * Early reserved memory areas.
  46. */
  47. #define MAX_EARLY_RES 20
  48. struct early_res {
  49. unsigned long start, end;
  50. char name[16];
  51. };
  52. static struct early_res early_res[MAX_EARLY_RES] __initdata = {
  53. { 0, PAGE_SIZE, "BIOS data page" }, /* BIOS data page */
  54. #ifdef CONFIG_X86_TRAMPOLINE
  55. { TRAMPOLINE_BASE, TRAMPOLINE_BASE + 2 * PAGE_SIZE, "TRAMPOLINE" },
  56. #endif
  57. {}
  58. };
  59. void __init reserve_early(unsigned long start, unsigned long end, char *name)
  60. {
  61. int i;
  62. struct early_res *r;
  63. for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
  64. r = &early_res[i];
  65. if (end > r->start && start < r->end)
  66. panic("Overlapping early reservations %lx-%lx %s to %lx-%lx %s\n",
  67. start, end - 1, name?name:"", r->start, r->end - 1, r->name);
  68. }
  69. if (i >= MAX_EARLY_RES)
  70. panic("Too many early reservations");
  71. r = &early_res[i];
  72. r->start = start;
  73. r->end = end;
  74. if (name)
  75. strncpy(r->name, name, sizeof(r->name) - 1);
  76. }
  77. void __init free_early(unsigned long start, unsigned long end)
  78. {
  79. struct early_res *r;
  80. int i, j;
  81. for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
  82. r = &early_res[i];
  83. if (start == r->start && end == r->end)
  84. break;
  85. }
  86. if (i >= MAX_EARLY_RES || !early_res[i].end)
  87. panic("free_early on not reserved area: %lx-%lx!", start, end);
  88. for (j = i + 1; j < MAX_EARLY_RES && early_res[j].end; j++)
  89. ;
  90. memmove(&early_res[i], &early_res[i + 1],
  91. (j - 1 - i) * sizeof(struct early_res));
  92. early_res[j - 1].end = 0;
  93. }
  94. void __init early_res_to_bootmem(unsigned long start, unsigned long end)
  95. {
  96. int i;
  97. unsigned long final_start, final_end;
  98. for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
  99. struct early_res *r = &early_res[i];
  100. final_start = max(start, r->start);
  101. final_end = min(end, r->end);
  102. if (final_start >= final_end)
  103. continue;
  104. printk(KERN_INFO " early res: %d [%lx-%lx] %s\n", i,
  105. final_start, final_end - 1, r->name);
  106. reserve_bootmem_generic(final_start, final_end - final_start);
  107. }
  108. }
  109. /* Check for already reserved areas */
  110. static inline int __init
  111. bad_addr(unsigned long *addrp, unsigned long size, unsigned long align)
  112. {
  113. int i;
  114. unsigned long addr = *addrp, last;
  115. int changed = 0;
  116. again:
  117. last = addr + size;
  118. for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
  119. struct early_res *r = &early_res[i];
  120. if (last >= r->start && addr < r->end) {
  121. *addrp = addr = round_up(r->end, align);
  122. changed = 1;
  123. goto again;
  124. }
  125. }
  126. return changed;
  127. }
  128. /* Check for already reserved areas */
  129. static inline int __init
  130. bad_addr_size(unsigned long *addrp, unsigned long *sizep, unsigned long align)
  131. {
  132. int i;
  133. unsigned long addr = *addrp, last;
  134. unsigned long size = *sizep;
  135. int changed = 0;
  136. again:
  137. last = addr + size;
  138. for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
  139. struct early_res *r = &early_res[i];
  140. if (last > r->start && addr < r->start) {
  141. size = r->start - addr;
  142. changed = 1;
  143. goto again;
  144. }
  145. if (last > r->end && addr < r->end) {
  146. addr = round_up(r->end, align);
  147. size = last - addr;
  148. changed = 1;
  149. goto again;
  150. }
  151. if (last <= r->end && addr >= r->start) {
  152. (*sizep)++;
  153. return 0;
  154. }
  155. }
  156. if (changed) {
  157. *addrp = addr;
  158. *sizep = size;
  159. }
  160. return changed;
  161. }
  162. /*
  163. * Find a free area with specified alignment in a specific range.
  164. */
  165. unsigned long __init find_e820_area(unsigned long start, unsigned long end,
  166. unsigned long size, unsigned long align)
  167. {
  168. int i;
  169. for (i = 0; i < e820.nr_map; i++) {
  170. struct e820entry *ei = &e820.map[i];
  171. unsigned long addr, last;
  172. unsigned long ei_last;
  173. if (ei->type != E820_RAM)
  174. continue;
  175. addr = round_up(ei->addr, align);
  176. ei_last = ei->addr + ei->size;
  177. if (addr < start)
  178. addr = round_up(start, align);
  179. if (addr >= ei_last)
  180. continue;
  181. while (bad_addr(&addr, size, align) && addr+size <= ei_last)
  182. ;
  183. last = addr + size;
  184. if (last > ei_last)
  185. continue;
  186. if (last > end)
  187. continue;
  188. return addr;
  189. }
  190. return -1UL;
  191. }
  192. /*
  193. * Find next free range after *start
  194. */
  195. unsigned long __init find_e820_area_size(unsigned long start,
  196. unsigned long *sizep,
  197. unsigned long align)
  198. {
  199. int i;
  200. for (i = 0; i < e820.nr_map; i++) {
  201. struct e820entry *ei = &e820.map[i];
  202. unsigned long addr, last;
  203. unsigned long ei_last;
  204. if (ei->type != E820_RAM)
  205. continue;
  206. addr = round_up(ei->addr, align);
  207. ei_last = ei->addr + ei->size;
  208. if (addr < start)
  209. addr = round_up(start, align);
  210. if (addr >= ei_last)
  211. continue;
  212. *sizep = ei_last - addr;
  213. while (bad_addr_size(&addr, sizep, align) &&
  214. addr + *sizep <= ei_last)
  215. ;
  216. last = addr + *sizep;
  217. if (last > ei_last)
  218. continue;
  219. return addr;
  220. }
  221. return -1UL;
  222. }
  223. /*
  224. * Find the highest page frame number we have available
  225. */
  226. unsigned long __init e820_end_of_ram(void)
  227. {
  228. unsigned long end_pfn;
  229. end_pfn = find_max_pfn_with_active_regions();
  230. if (end_pfn > max_pfn_mapped)
  231. max_pfn_mapped = end_pfn;
  232. if (max_pfn_mapped > MAXMEM>>PAGE_SHIFT)
  233. max_pfn_mapped = MAXMEM>>PAGE_SHIFT;
  234. if (end_pfn > end_user_pfn)
  235. end_pfn = end_user_pfn;
  236. if (end_pfn > max_pfn_mapped)
  237. end_pfn = max_pfn_mapped;
  238. printk(KERN_INFO "max_pfn_mapped = %lu\n", max_pfn_mapped);
  239. return end_pfn;
  240. }
  241. /*
  242. * Mark e820 reserved areas as busy for the resource manager.
  243. */
  244. void __init e820_reserve_resources(void)
  245. {
  246. int i;
  247. struct resource *res;
  248. res = alloc_bootmem_low(sizeof(struct resource) * e820.nr_map);
  249. for (i = 0; i < e820.nr_map; i++) {
  250. switch (e820.map[i].type) {
  251. case E820_RAM: res->name = "System RAM"; break;
  252. case E820_ACPI: res->name = "ACPI Tables"; break;
  253. case E820_NVS: res->name = "ACPI Non-volatile Storage"; break;
  254. default: res->name = "reserved";
  255. }
  256. res->start = e820.map[i].addr;
  257. res->end = res->start + e820.map[i].size - 1;
  258. res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
  259. insert_resource(&iomem_resource, res);
  260. res++;
  261. }
  262. }
  263. /*
  264. * Find the ranges of physical addresses that do not correspond to
  265. * e820 RAM areas and mark the corresponding pages as nosave for software
  266. * suspend and suspend to RAM.
  267. *
  268. * This function requires the e820 map to be sorted and without any
  269. * overlapping entries and assumes the first e820 area to be RAM.
  270. */
  271. void __init e820_mark_nosave_regions(void)
  272. {
  273. int i;
  274. unsigned long paddr;
  275. paddr = round_down(e820.map[0].addr + e820.map[0].size, PAGE_SIZE);
  276. for (i = 1; i < e820.nr_map; i++) {
  277. struct e820entry *ei = &e820.map[i];
  278. if (paddr < ei->addr)
  279. register_nosave_region(PFN_DOWN(paddr),
  280. PFN_UP(ei->addr));
  281. paddr = round_down(ei->addr + ei->size, PAGE_SIZE);
  282. if (ei->type != E820_RAM)
  283. register_nosave_region(PFN_UP(ei->addr),
  284. PFN_DOWN(paddr));
  285. if (paddr >= (end_pfn << PAGE_SHIFT))
  286. break;
  287. }
  288. }
  289. /*
  290. * Finds an active region in the address range from start_pfn to end_pfn and
  291. * returns its range in ei_startpfn and ei_endpfn for the e820 entry.
  292. */
  293. static int __init e820_find_active_region(const struct e820entry *ei,
  294. unsigned long start_pfn,
  295. unsigned long end_pfn,
  296. unsigned long *ei_startpfn,
  297. unsigned long *ei_endpfn)
  298. {
  299. *ei_startpfn = round_up(ei->addr, PAGE_SIZE) >> PAGE_SHIFT;
  300. *ei_endpfn = round_down(ei->addr + ei->size, PAGE_SIZE) >> PAGE_SHIFT;
  301. /* Skip map entries smaller than a page */
  302. if (*ei_startpfn >= *ei_endpfn)
  303. return 0;
  304. /* Check if max_pfn_mapped should be updated */
  305. if (ei->type != E820_RAM && *ei_endpfn > max_pfn_mapped)
  306. max_pfn_mapped = *ei_endpfn;
  307. /* Skip if map is outside the node */
  308. if (ei->type != E820_RAM || *ei_endpfn <= start_pfn ||
  309. *ei_startpfn >= end_pfn)
  310. return 0;
  311. /* Check for overlaps */
  312. if (*ei_startpfn < start_pfn)
  313. *ei_startpfn = start_pfn;
  314. if (*ei_endpfn > end_pfn)
  315. *ei_endpfn = end_pfn;
  316. /* Obey end_user_pfn to save on memmap */
  317. if (*ei_startpfn >= end_user_pfn)
  318. return 0;
  319. if (*ei_endpfn > end_user_pfn)
  320. *ei_endpfn = end_user_pfn;
  321. return 1;
  322. }
  323. /* Walk the e820 map and register active regions within a node */
  324. void __init
  325. e820_register_active_regions(int nid, unsigned long start_pfn,
  326. unsigned long end_pfn)
  327. {
  328. unsigned long ei_startpfn;
  329. unsigned long ei_endpfn;
  330. int i;
  331. for (i = 0; i < e820.nr_map; i++)
  332. if (e820_find_active_region(&e820.map[i],
  333. start_pfn, end_pfn,
  334. &ei_startpfn, &ei_endpfn))
  335. add_active_range(nid, ei_startpfn, ei_endpfn);
  336. }
  337. /*
  338. * Find the hole size (in bytes) in the memory range.
  339. * @start: starting address of the memory range to scan
  340. * @end: ending address of the memory range to scan
  341. */
  342. unsigned long __init e820_hole_size(unsigned long start, unsigned long end)
  343. {
  344. unsigned long start_pfn = start >> PAGE_SHIFT;
  345. unsigned long end_pfn = end >> PAGE_SHIFT;
  346. unsigned long ei_startpfn, ei_endpfn, ram = 0;
  347. int i;
  348. for (i = 0; i < e820.nr_map; i++) {
  349. if (e820_find_active_region(&e820.map[i],
  350. start_pfn, end_pfn,
  351. &ei_startpfn, &ei_endpfn))
  352. ram += ei_endpfn - ei_startpfn;
  353. }
  354. return end - start - (ram << PAGE_SHIFT);
  355. }
  356. static void early_panic(char *msg)
  357. {
  358. early_printk(msg);
  359. panic(msg);
  360. }
  361. /* We're not void only for x86 32-bit compat */
  362. char *__init machine_specific_memory_setup(void)
  363. {
  364. char *who = "BIOS-e820";
  365. /*
  366. * Try to copy the BIOS-supplied E820-map.
  367. *
  368. * Otherwise fake a memory map; one section from 0k->640k,
  369. * the next section from 1mb->appropriate_mem_k
  370. */
  371. sanitize_e820_map(boot_params.e820_map,
  372. ARRAY_SIZE(boot_params.e820_map),
  373. &boot_params.e820_entries);
  374. if (copy_e820_map(boot_params.e820_map, boot_params.e820_entries) < 0)
  375. early_panic("Cannot find a valid memory map");
  376. printk(KERN_INFO "BIOS-provided physical RAM map:\n");
  377. e820_print_map(who);
  378. /* In case someone cares... */
  379. return who;
  380. }
  381. static int __init parse_memopt(char *p)
  382. {
  383. if (!p)
  384. return -EINVAL;
  385. end_user_pfn = memparse(p, &p);
  386. end_user_pfn >>= PAGE_SHIFT;
  387. return 0;
  388. }
  389. early_param("mem", parse_memopt);
  390. static int userdef __initdata;
  391. static int __init parse_memmap_opt(char *p)
  392. {
  393. char *oldp;
  394. unsigned long long start_at, mem_size;
  395. if (!strcmp(p, "exactmap")) {
  396. #ifdef CONFIG_CRASH_DUMP
  397. /*
  398. * If we are doing a crash dump, we still need to know
  399. * the real mem size before original memory map is
  400. * reset.
  401. */
  402. e820_register_active_regions(0, 0, -1UL);
  403. saved_max_pfn = e820_end_of_ram();
  404. remove_all_active_ranges();
  405. #endif
  406. max_pfn_mapped = 0;
  407. e820.nr_map = 0;
  408. userdef = 1;
  409. return 0;
  410. }
  411. oldp = p;
  412. mem_size = memparse(p, &p);
  413. if (p == oldp)
  414. return -EINVAL;
  415. userdef = 1;
  416. if (*p == '@') {
  417. start_at = memparse(p+1, &p);
  418. add_memory_region(start_at, mem_size, E820_RAM);
  419. } else if (*p == '#') {
  420. start_at = memparse(p+1, &p);
  421. add_memory_region(start_at, mem_size, E820_ACPI);
  422. } else if (*p == '$') {
  423. start_at = memparse(p+1, &p);
  424. add_memory_region(start_at, mem_size, E820_RESERVED);
  425. } else {
  426. end_user_pfn = (mem_size >> PAGE_SHIFT);
  427. }
  428. return *p == '\0' ? 0 : -EINVAL;
  429. }
  430. early_param("memmap", parse_memmap_opt);
  431. void __init finish_e820_parsing(void)
  432. {
  433. if (userdef) {
  434. char nr = e820.nr_map;
  435. if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr) < 0)
  436. early_panic("Invalid user supplied memory map");
  437. e820.nr_map = nr;
  438. printk(KERN_INFO "user-defined physical RAM map:\n");
  439. e820_print_map("user");
  440. }
  441. }
  442. int __init arch_get_ram_range(int slot, u64 *addr, u64 *size)
  443. {
  444. int i;
  445. if (slot < 0 || slot >= e820.nr_map)
  446. return -1;
  447. for (i = slot; i < e820.nr_map; i++) {
  448. if (e820.map[i].type != E820_RAM)
  449. continue;
  450. break;
  451. }
  452. if (i == e820.nr_map || e820.map[i].addr > (max_pfn << PAGE_SHIFT))
  453. return -1;
  454. *addr = e820.map[i].addr;
  455. *size = min_t(u64, e820.map[i].size + e820.map[i].addr,
  456. max_pfn << PAGE_SHIFT) - *addr;
  457. return i + 1;
  458. }