init.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /*
  2. * linux/arch/m68k/mm/init.c
  3. *
  4. * Copyright (C) 1995 Hamish Macdonald
  5. *
  6. * Contains common initialization routines, specific init code moved
  7. * to motorola.c and sun3mmu.c
  8. */
  9. #include <linux/module.h>
  10. #include <linux/signal.h>
  11. #include <linux/sched.h>
  12. #include <linux/mm.h>
  13. #include <linux/swap.h>
  14. #include <linux/kernel.h>
  15. #include <linux/string.h>
  16. #include <linux/types.h>
  17. #include <linux/init.h>
  18. #include <linux/bootmem.h>
  19. #include <linux/gfp.h>
  20. #include <asm/setup.h>
  21. #include <asm/uaccess.h>
  22. #include <asm/page.h>
  23. #include <asm/pgalloc.h>
  24. #include <asm/traps.h>
  25. #include <asm/machdep.h>
  26. #include <asm/io.h>
  27. #ifdef CONFIG_ATARI
  28. #include <asm/atari_stram.h>
  29. #endif
  30. #include <asm/sections.h>
  31. #include <asm/tlb.h>
  32. /*
  33. * ZERO_PAGE is a special page that is used for zero-initialized
  34. * data and COW.
  35. */
  36. void *empty_zero_page;
  37. EXPORT_SYMBOL(empty_zero_page);
  38. #ifdef CONFIG_MMU
  39. pg_data_t pg_data_map[MAX_NUMNODES];
  40. EXPORT_SYMBOL(pg_data_map);
  41. int m68k_virt_to_node_shift;
  42. #ifndef CONFIG_SINGLE_MEMORY_CHUNK
  43. pg_data_t *pg_data_table[65];
  44. EXPORT_SYMBOL(pg_data_table);
  45. #endif
  46. void __init m68k_setup_node(int node)
  47. {
  48. #ifndef CONFIG_SINGLE_MEMORY_CHUNK
  49. struct mem_info *info = m68k_memory + node;
  50. int i, end;
  51. i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift();
  52. end = (unsigned long)phys_to_virt(info->addr + info->size - 1) >> __virt_to_node_shift();
  53. for (; i <= end; i++) {
  54. if (pg_data_table[i])
  55. printk("overlap at %u for chunk %u\n", i, node);
  56. pg_data_table[i] = pg_data_map + node;
  57. }
  58. #endif
  59. pg_data_map[node].bdata = bootmem_node_data + node;
  60. node_set_online(node);
  61. }
  62. extern void init_pointer_table(unsigned long ptable);
  63. extern pmd_t *zero_pgtable;
  64. #else /* CONFIG_MMU */
  65. /*
  66. * paging_init() continues the virtual memory environment setup which
  67. * was begun by the code in arch/head.S.
  68. * The parameters are pointers to where to stick the starting and ending
  69. * addresses of available kernel virtual memory.
  70. */
  71. void __init paging_init(void)
  72. {
  73. /*
  74. * Make sure start_mem is page aligned, otherwise bootmem and
  75. * page_alloc get different views of the world.
  76. */
  77. unsigned long end_mem = memory_end & PAGE_MASK;
  78. unsigned long zones_size[MAX_NR_ZONES] = { 0, };
  79. high_memory = (void *) end_mem;
  80. empty_zero_page = alloc_bootmem_pages(PAGE_SIZE);
  81. memset(empty_zero_page, 0, PAGE_SIZE);
  82. /*
  83. * Set up SFC/DFC registers (user data space).
  84. */
  85. set_fs (USER_DS);
  86. zones_size[ZONE_DMA] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
  87. free_area_init(zones_size);
  88. }
  89. void free_initmem(void)
  90. {
  91. #ifdef CONFIG_RAMKERNEL
  92. unsigned long addr;
  93. /*
  94. * The following code should be cool even if these sections
  95. * are not page aligned.
  96. */
  97. addr = PAGE_ALIGN((unsigned long) __init_begin);
  98. /* next to check that the page we free is not a partial page */
  99. for (; addr + PAGE_SIZE < ((unsigned long) __init_end); addr += PAGE_SIZE) {
  100. ClearPageReserved(virt_to_page(addr));
  101. init_page_count(virt_to_page(addr));
  102. free_page(addr);
  103. totalram_pages++;
  104. }
  105. pr_notice("Freeing unused kernel memory: %luk freed (0x%x - 0x%x)\n",
  106. (addr - PAGE_ALIGN((unsigned long) __init_begin)) >> 10,
  107. (int)(PAGE_ALIGN((unsigned long) __init_begin)),
  108. (int)(addr - PAGE_SIZE));
  109. #endif
  110. }
  111. #endif /* CONFIG_MMU */
  112. #if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE)
  113. #define VECTORS &vectors[0]
  114. #else
  115. #define VECTORS _ramvec
  116. #endif
  117. void __init print_memmap(void)
  118. {
  119. #define UL(x) ((unsigned long) (x))
  120. #define MLK(b, t) UL(b), UL(t), (UL(t) - UL(b)) >> 10
  121. #define MLM(b, t) UL(b), UL(t), (UL(t) - UL(b)) >> 20
  122. #define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), 1024)
  123. pr_notice("Virtual kernel memory layout:\n"
  124. " vector : 0x%08lx - 0x%08lx (%4ld KiB)\n"
  125. " kmap : 0x%08lx - 0x%08lx (%4ld MiB)\n"
  126. " vmalloc : 0x%08lx - 0x%08lx (%4ld MiB)\n"
  127. " lowmem : 0x%08lx - 0x%08lx (%4ld MiB)\n"
  128. " .init : 0x%p" " - 0x%p" " (%4d KiB)\n"
  129. " .text : 0x%p" " - 0x%p" " (%4d KiB)\n"
  130. " .data : 0x%p" " - 0x%p" " (%4d KiB)\n"
  131. " .bss : 0x%p" " - 0x%p" " (%4d KiB)\n",
  132. MLK(VECTORS, VECTORS + 256),
  133. MLM(KMAP_START, KMAP_END),
  134. MLM(VMALLOC_START, VMALLOC_END),
  135. MLM(PAGE_OFFSET, (unsigned long)high_memory),
  136. MLK_ROUNDUP(__init_begin, __init_end),
  137. MLK_ROUNDUP(_stext, _etext),
  138. MLK_ROUNDUP(_sdata, _edata),
  139. MLK_ROUNDUP(__bss_start, __bss_stop));
  140. }
  141. void __init mem_init(void)
  142. {
  143. pg_data_t *pgdat;
  144. int codepages = 0;
  145. int datapages = 0;
  146. int initpages = 0;
  147. int i;
  148. /* this will put all memory onto the freelists */
  149. totalram_pages = num_physpages = 0;
  150. for_each_online_pgdat(pgdat) {
  151. num_physpages += pgdat->node_present_pages;
  152. totalram_pages += free_all_bootmem_node(pgdat);
  153. for (i = 0; i < pgdat->node_spanned_pages; i++) {
  154. struct page *page = pgdat->node_mem_map + i;
  155. char *addr = page_to_virt(page);
  156. if (!PageReserved(page))
  157. continue;
  158. if (addr >= _text &&
  159. addr < _etext)
  160. codepages++;
  161. else if (addr >= __init_begin &&
  162. addr < __init_end)
  163. initpages++;
  164. else
  165. datapages++;
  166. }
  167. }
  168. #if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
  169. /* insert pointer tables allocated so far into the tablelist */
  170. init_pointer_table((unsigned long)kernel_pg_dir);
  171. for (i = 0; i < PTRS_PER_PGD; i++) {
  172. if (pgd_present(kernel_pg_dir[i]))
  173. init_pointer_table(__pgd_page(kernel_pg_dir[i]));
  174. }
  175. /* insert also pointer table that we used to unmap the zero page */
  176. if (zero_pgtable)
  177. init_pointer_table((unsigned long)zero_pgtable);
  178. #endif
  179. pr_info("Memory: %luk/%luk available (%dk kernel code, %dk data, %dk init)\n",
  180. nr_free_pages() << (PAGE_SHIFT-10),
  181. totalram_pages << (PAGE_SHIFT-10),
  182. codepages << (PAGE_SHIFT-10),
  183. datapages << (PAGE_SHIFT-10),
  184. initpages << (PAGE_SHIFT-10));
  185. print_memmap();
  186. }
  187. #ifdef CONFIG_BLK_DEV_INITRD
  188. void free_initrd_mem(unsigned long start, unsigned long end)
  189. {
  190. int pages = 0;
  191. for (; start < end; start += PAGE_SIZE) {
  192. ClearPageReserved(virt_to_page(start));
  193. init_page_count(virt_to_page(start));
  194. free_page(start);
  195. totalram_pages++;
  196. pages++;
  197. }
  198. pr_notice("Freeing initrd memory: %dk freed\n",
  199. pages << (PAGE_SHIFT - 10));
  200. }
  201. #endif