discontig.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * linux/arch/m32r/mm/discontig.c
  4. *
  5. * Discontig memory support
  6. *
  7. * Copyright (c) 2003 Hitoshi Yamamoto
  8. */
  9. #include <linux/mm.h>
  10. #include <linux/bootmem.h>
  11. #include <linux/mmzone.h>
  12. #include <linux/initrd.h>
  13. #include <linux/nodemask.h>
  14. #include <linux/module.h>
  15. #include <linux/pfn.h>
  16. #include <asm/setup.h>
  17. extern char _end[];
  18. struct pglist_data *node_data[MAX_NUMNODES];
  19. EXPORT_SYMBOL(node_data);
  20. pg_data_t m32r_node_data[MAX_NUMNODES];
  21. /* Memory profile */
  22. typedef struct {
  23. unsigned long start_pfn;
  24. unsigned long pages;
  25. unsigned long holes;
  26. unsigned long free_pfn;
  27. } mem_prof_t;
  28. static mem_prof_t mem_prof[MAX_NUMNODES];
  29. extern unsigned long memory_start;
  30. extern unsigned long memory_end;
  31. static void __init mem_prof_init(void)
  32. {
  33. unsigned long start_pfn, holes, free_pfn;
  34. const unsigned long zone_alignment = 1UL << (MAX_ORDER - 1);
  35. unsigned long ul;
  36. mem_prof_t *mp;
  37. /* Node#0 SDRAM */
  38. mp = &mem_prof[0];
  39. mp->start_pfn = PFN_UP(CONFIG_MEMORY_START);
  40. mp->pages = PFN_DOWN(memory_end - memory_start);
  41. mp->holes = 0;
  42. mp->free_pfn = PFN_UP(__pa(_end));
  43. /* Node#1 internal SRAM */
  44. mp = &mem_prof[1];
  45. start_pfn = free_pfn = PFN_UP(CONFIG_IRAM_START);
  46. holes = 0;
  47. if (start_pfn & (zone_alignment - 1)) {
  48. ul = zone_alignment;
  49. while (start_pfn >= ul)
  50. ul += zone_alignment;
  51. start_pfn = ul - zone_alignment;
  52. holes = free_pfn - start_pfn;
  53. }
  54. mp->start_pfn = start_pfn;
  55. mp->pages = PFN_DOWN(CONFIG_IRAM_SIZE) + holes;
  56. mp->holes = holes;
  57. mp->free_pfn = PFN_UP(CONFIG_IRAM_START);
  58. }
  59. unsigned long __init setup_memory(void)
  60. {
  61. unsigned long bootmap_size;
  62. unsigned long min_pfn;
  63. int nid;
  64. mem_prof_t *mp;
  65. max_low_pfn = 0;
  66. min_low_pfn = -1;
  67. mem_prof_init();
  68. for_each_online_node(nid) {
  69. mp = &mem_prof[nid];
  70. NODE_DATA(nid)=(pg_data_t *)&m32r_node_data[nid];
  71. NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
  72. min_pfn = mp->start_pfn;
  73. max_pfn = mp->start_pfn + mp->pages;
  74. bootmap_size = init_bootmem_node(NODE_DATA(nid), mp->free_pfn,
  75. mp->start_pfn, max_pfn);
  76. free_bootmem_node(NODE_DATA(nid), PFN_PHYS(mp->start_pfn),
  77. PFN_PHYS(mp->pages));
  78. reserve_bootmem_node(NODE_DATA(nid), PFN_PHYS(mp->start_pfn),
  79. PFN_PHYS(mp->free_pfn - mp->start_pfn) + bootmap_size,
  80. BOOTMEM_DEFAULT);
  81. if (max_low_pfn < max_pfn)
  82. max_low_pfn = max_pfn;
  83. if (min_low_pfn > min_pfn)
  84. min_low_pfn = min_pfn;
  85. }
  86. #ifdef CONFIG_BLK_DEV_INITRD
  87. if (LOADER_TYPE && INITRD_START) {
  88. if (INITRD_START + INITRD_SIZE <= PFN_PHYS(max_low_pfn)) {
  89. reserve_bootmem_node(NODE_DATA(0), INITRD_START,
  90. INITRD_SIZE, BOOTMEM_DEFAULT);
  91. initrd_start = INITRD_START + PAGE_OFFSET;
  92. initrd_end = initrd_start + INITRD_SIZE;
  93. printk("initrd:start[%08lx],size[%08lx]\n",
  94. initrd_start, INITRD_SIZE);
  95. } else {
  96. printk("initrd extends beyond end of memory "
  97. "(0x%08lx > 0x%08llx)\ndisabling initrd\n",
  98. INITRD_START + INITRD_SIZE,
  99. (unsigned long long)PFN_PHYS(max_low_pfn));
  100. initrd_start = 0;
  101. }
  102. }
  103. #endif /* CONFIG_BLK_DEV_INITRD */
  104. return max_low_pfn;
  105. }
  106. #define START_PFN(nid) (NODE_DATA(nid)->bdata->node_min_pfn)
  107. #define MAX_LOW_PFN(nid) (NODE_DATA(nid)->bdata->node_low_pfn)
  108. void __init zone_sizes_init(void)
  109. {
  110. unsigned long zones_size[MAX_NR_ZONES], zholes_size[MAX_NR_ZONES];
  111. unsigned long low, start_pfn;
  112. int nid, i;
  113. mem_prof_t *mp;
  114. for_each_online_node(nid) {
  115. mp = &mem_prof[nid];
  116. for (i = 0 ; i < MAX_NR_ZONES ; i++) {
  117. zones_size[i] = 0;
  118. zholes_size[i] = 0;
  119. }
  120. start_pfn = START_PFN(nid);
  121. low = MAX_LOW_PFN(nid);
  122. zones_size[ZONE_DMA] = low - start_pfn;
  123. zholes_size[ZONE_DMA] = mp->holes;
  124. node_set_state(nid, N_NORMAL_MEMORY);
  125. free_area_init_node(nid, zones_size, start_pfn, zholes_size);
  126. }
  127. /*
  128. * For test
  129. * Use all area of internal RAM.
  130. * see __alloc_pages()
  131. */
  132. NODE_DATA(1)->node_zones->watermark[WMARK_MIN] = 0;
  133. NODE_DATA(1)->node_zones->watermark[WMARK_LOW] = 0;
  134. NODE_DATA(1)->node_zones->watermark[WMARK_HIGH] = 0;
  135. }