memory.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

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