memory.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * memory.c: PROM library functions for acquiring/using memory descriptors
  3.  *           given to us from the ARCS firmware.
  4.  *
  5.  * Copyright (C) 1996 by David S. Miller
  6.  * Copyright (C) 1999, 2000, 2001 by Ralf Baechle
  7.  * Copyright (C) 1999, 2000 by Silicon Graphics, Inc.
  8.  *
  9.  * PROM library functions for acquiring/using memory descriptors given to us
  10.  * from the ARCS firmware.  This is only used when CONFIG_ARC_MEMORY is set
  11.  * because on some machines like SGI IP27 the ARC memory configuration data
  12.  * completly bogus and alternate easier to use mechanisms are available.
  13.  */
  14. #include <linux/init.h>
  15. #include <linux/kernel.h>
  16. #include <linux/types.h>
  17. #include <linux/sched.h>
  18. #include <linux/mm.h>
  19. #include <linux/bootmem.h>
  20. #include <linux/swap.h>
  21. #include <asm/sgialib.h>
  22. #include <asm/page.h>
  23. #include <asm/pgtable.h>
  24. #include <asm/bootinfo.h>
  25. #undef DEBUG
  26. struct linux_mdesc * __init ArcGetMemoryDescriptor(struct linux_mdesc *Current)
  27. {
  28. return (struct linux_mdesc *) ARC_CALL1(get_mdesc, Current);
  29. }
  30. #ifdef DEBUG /* convenient for debugging */
  31. static char *arcs_mtypes[8] = {
  32. "Exception Block",
  33. "ARCS Romvec Page",
  34. "Free/Contig RAM",
  35. "Generic Free RAM",
  36. "Bad Memory",
  37. "Standalone Program Pages",
  38. "ARCS Temp Storage Area",
  39. "ARCS Permanent Storage Area"
  40. };
  41. static char *arc_mtypes[8] = {
  42. "Exception Block",
  43. "SystemParameterBlock",
  44. "FreeMemory",
  45. "Bad Memory",
  46. "LoadedProgram",
  47. "FirmwareTemporary",
  48. "FirmwarePermanent",
  49. "FreeContiguous"
  50. };
  51. #define mtypes(a) (prom_flags & PROM_FLAG_ARCS) ? arcs_mtypes[a.arcs] 
  52. : arc_mtypes[a.arc]
  53. #endif
  54. static inline int memtype_classify_arcs (union linux_memtypes type)
  55. {
  56. switch (type.arcs) {
  57. case arcs_fcontig:
  58. case arcs_free:
  59. return BOOT_MEM_RAM;
  60. case arcs_atmp:
  61. return BOOT_MEM_ROM_DATA;
  62. case arcs_eblock:
  63. case arcs_rvpage:
  64. case arcs_bmem:
  65. case arcs_prog:
  66. case arcs_aperm:
  67. return BOOT_MEM_RESERVED;
  68. default:
  69. BUG();
  70. }
  71. while(1); /* Nuke warning.  */
  72. }
  73. static inline int memtype_classify_arc (union linux_memtypes type)
  74. {
  75. switch (type.arc) {
  76. case arc_free:
  77. case arc_fcontig:
  78. return BOOT_MEM_RAM;
  79. case arc_atmp:
  80. return BOOT_MEM_ROM_DATA;
  81. case arc_eblock:
  82. case arc_rvpage:
  83. case arc_bmem:
  84. case arc_prog:
  85. case arc_aperm:
  86. return BOOT_MEM_RESERVED;
  87. default:
  88. BUG();
  89. }
  90. while(1); /* Nuke warning.  */
  91. }
  92. static int __init prom_memtype_classify (union linux_memtypes type)
  93. {
  94. if (prom_flags & PROM_FLAG_ARCS) /* SGI is ``different'' ... */
  95. return memtype_classify_arcs(type);
  96. return memtype_classify_arc(type);
  97. }
  98. void __init prom_meminit(void)
  99. {
  100. struct linux_mdesc *p;
  101. #ifdef DEBUG
  102. int i = 0;
  103. prom_printf("ARCS MEMORY DESCRIPTOR dump:n");
  104. p = ArcGetMemoryDescriptor(PROM_NULL_MDESC);
  105. while(p) {
  106. prom_printf("[%d,%p]: base<%08lx> pages<%08lx> type<%s>n",
  107.     i, p, p->base, p->pages, mtypes(p->type));
  108. p = ArcGetMemoryDescriptor(p);
  109. i++;
  110. }
  111. #endif
  112. p = PROM_NULL_MDESC;
  113. while ((p = ArcGetMemoryDescriptor(p))) {
  114. unsigned long base, size;
  115. long type;
  116. base = p->base << PAGE_SHIFT;
  117. size = p->pages << PAGE_SHIFT;
  118. type = prom_memtype_classify(p->type);
  119. add_memory_region(base, size, type);
  120. }
  121. }
  122. void __init prom_free_prom_memory (void)
  123. {
  124. unsigned long freed = 0;
  125. unsigned long addr;
  126. int i;
  127. for (i = 0; i < boot_mem_map.nr_map; i++) {
  128. if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
  129. continue;
  130. addr = boot_mem_map.map[i].addr;
  131. while (addr < boot_mem_map.map[i].addr
  132.       + boot_mem_map.map[i].size) {
  133. ClearPageReserved(virt_to_page(__va(addr)));
  134. set_page_count(virt_to_page(__va(addr)), 1);
  135. free_page((unsigned long)__va(addr));
  136. addr += PAGE_SIZE;
  137. freed += PAGE_SIZE;
  138. }
  139. }
  140. printk(KERN_INFO "Freeing prom memory: %ldkb freedn", freed >> 10);
  141. }