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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * memory.c: memory initialisation code.
  3.  *
  4.  * Copyright (C) 1998 Harald Koerfgen, Frieder Streffer and Paul M. Antoine
  5.  * Copyright (C) 2000 Maciej W. Rozycki
  6.  *
  7.  * $Id: memory.c,v 1.3 1999/10/09 00:00:58 ralf Exp $
  8.  */
  9. #include <linux/init.h>
  10. #include <linux/config.h>
  11. #include <linux/kernel.h>
  12. #include <linux/mm.h>
  13. #include <linux/bootmem.h>
  14. #include <asm/addrspace.h>
  15. #include <asm/page.h>
  16. #include <asm/bootinfo.h>
  17. #include <asm/dec/machtype.h>
  18. #include "prom.h"
  19. typedef struct {
  20. int pagesize;
  21. unsigned char bitmap[0];
  22. } memmap;
  23. extern int (*rex_getbitmap)(memmap *);
  24. #undef PROM_DEBUG
  25. #ifdef PROM_DEBUG
  26. extern int (*prom_printf)(char *, ...);
  27. #endif
  28. volatile unsigned long mem_err = 0; /* So we know an error occurred */
  29. /*
  30.  * Probe memory in 4MB chunks, waiting for an error to tell us we've fallen
  31.  * off the end of real memory.  Only suitable for the 2100/3100's (PMAX).
  32.  */
  33. #define CHUNK_SIZE 0x400000
  34. static void __init pmax_setup_memory_region(void)
  35. {
  36. volatile unsigned char *memory_page, dummy;
  37. char old_handler[0x80];
  38. extern char genexcept_early;
  39. /* Install exception handler */
  40. memcpy(&old_handler, (void *)(KSEG0 + 0x80), 0x80);
  41. memcpy((void *)(KSEG0 + 0x80), &genexcept_early, 0x80);
  42. /* read unmapped and uncached (KSEG1)
  43.  * DECstations have at least 4MB RAM
  44.  * Assume less than 480MB of RAM, as this is max for 5000/2xx
  45.  * FIXME this should be replaced by the first free page!
  46.  */
  47. for (memory_page = (unsigned char *) KSEG1 + CHUNK_SIZE;
  48.      (mem_err== 0) && (memory_page < ((unsigned char *) KSEG1+0x1E000000));
  49.         memory_page += CHUNK_SIZE) {
  50. dummy = *memory_page;
  51. }
  52. memcpy((void *)(KSEG0 + 0x80), &old_handler, 0x80);
  53. add_memory_region(0, (unsigned long)memory_page - KSEG1 - CHUNK_SIZE,
  54.   BOOT_MEM_RAM);
  55. }
  56. /*
  57.  * Use the REX prom calls to get hold of the memory bitmap, and thence
  58.  * determine memory size.
  59.  */
  60. static void __init rex_setup_memory_region(void)
  61. {
  62. int i, bitmap_size;
  63. unsigned long mem_start = 0, mem_size = 0;
  64. memmap *bm;
  65. /* some free 64k */
  66. bm = (memmap *) 0x80028000;
  67. bitmap_size = rex_getbitmap(bm);
  68. for (i = 0; i < bitmap_size; i++) {
  69. /* FIXME: very simplistically only add full sets of pages */
  70. if (bm->bitmap[i] == 0xff)
  71. mem_size += (8 * bm->pagesize);
  72. else if (!mem_size)
  73. mem_start += (8 * bm->pagesize);
  74. else {
  75. add_memory_region(mem_start, mem_size, BOOT_MEM_RAM);
  76. mem_start += mem_size + (8 * bm->pagesize);
  77. mem_size = 0;
  78. }
  79. }
  80. if (mem_size)
  81. add_memory_region(mem_start, mem_size, BOOT_MEM_RAM);
  82. }
  83. void __init prom_meminit(unsigned int magic)
  84. {
  85. if (magic != REX_PROM_MAGIC)
  86. pmax_setup_memory_region();
  87. else
  88. rex_setup_memory_region();
  89. }
  90. void __init prom_free_prom_memory (void)
  91. {
  92. unsigned long addr, end;
  93. extern char _ftext;
  94. /*
  95.  * Free everything below the kernel itself but leave
  96.  * the first page reserved for the exception handlers.
  97.  */
  98. #ifdef CONFIG_DECLANCE
  99. /*
  100.  * Leave 128 KB reserved for Lance memory for
  101.  * IOASIC DECstations.
  102.  *
  103.  * XXX: save this address for use in dec_lance.c?
  104.  */
  105. if (IOASIC)
  106. end = __pa(&_ftext) - 0x00020000;
  107. else
  108. #endif
  109. end = __pa(&_ftext);
  110. addr = PAGE_SIZE;
  111. while (addr < end) {
  112. ClearPageReserved(virt_to_page(__va(addr)));
  113. set_page_count(virt_to_page(__va(addr)), 1);
  114. free_page((unsigned long)__va(addr));
  115. addr += PAGE_SIZE;
  116. }
  117. printk("Freeing unused PROM memory: %ldk freedn",
  118.        (end - PAGE_SIZE) >> 10);
  119. }