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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 2000, Silicon Graphics, sprasad@engr.sgi.com
  3.  * Copyright 2000, Kanoj Sarcar, kanoj@sgi.com
  4.  */
  5. /*
  6.  * Contains common definitions and globals for NUMA platform
  7.  * support. For now, SN-IA64 and SN-MIPS are the NUMA platforms.
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/kernel.h>
  11. #include <linux/mm.h>
  12. #include <linux/bootmem.h>
  13. #include <asm/sn/mmzone.h>
  14. #include <asm/efi.h>
  15. extern int numnodes ;
  16. plat_pg_data_t plat_node_data[MAXNODES];
  17. bootmem_data_t bdata[MAXNODES];
  18. int chunktonid[MAXCHUNKS];
  19. int nasid_map[MAXNASIDS];
  20. void __init
  21. init_chunktonid(void)
  22. {
  23. memset(chunktonid, -1, sizeof(chunktonid)) ;
  24. }
  25. void __init
  26. init_nodeidmap(void)
  27. {
  28. memset(nasid_map, -1, sizeof(nasid_map)) ;
  29. }
  30. int cnodeid_map[MAXNODES] ;
  31. void __init
  32. init_cnodeidmap(void)
  33. {
  34. memset(cnodeid_map, -1, sizeof(cnodeid_map)) ;
  35. }
  36. int
  37. numa_debug(void)
  38. {
  39.        panic("NUMA debugn");
  40.        return(0);
  41. }
  42. int __init
  43. build_cnodeid_map(void)
  44. {
  45. int i,j ;
  46. for (i=0,j=0;i<MAXNASIDS;i++) {
  47. if (nasid_map[i] >= 0)
  48. cnodeid_map[j++] = i ;
  49. }
  50. return j ;
  51. }
  52. /*
  53.  * Since efi_memmap_walk merges contiguous banks, this code will need
  54.  * to find all the nasids covered by the input memory descriptor.
  55.  */
  56. static int __init
  57. build_nasid_map(unsigned long start, unsigned long end, void *arg)
  58. {
  59. unsigned long vaddr = start;
  60. int nasid = GetNasId(__pa(vaddr));
  61. while (vaddr < end) {
  62. if (nasid < MAXNASIDS)
  63. nasid_map[nasid] = 0;
  64. else
  65. panic("build_nasid_map");
  66. vaddr = (unsigned long)__va((unsigned long)(++nasid) << 
  67. SN1_NODE_ADDR_SHIFT);
  68. }
  69. return 0;
  70. }
  71. void __init
  72. fix_nasid_map(void)
  73. {
  74. int i ;
  75. int j ;
  76. /* For every nasid */
  77. for (j=0;j<MAXNASIDS;j++) {
  78. for (i=0;i<MAXNODES;i++) {
  79. if (CNODEID_TO_NASID(i) == j)
  80. break ;
  81. }
  82. if (i<MAXNODES)
  83. nasid_map[j] = i ;
  84. }
  85. }
  86. static void __init
  87. dump_bootmem_info(void)
  88. {
  89.         int     i;
  90.         struct bootmem_data *bdata ;
  91. printk("CNODE INFO ....n") ;
  92.         for (i=0;i<numnodes;i++) {
  93. printk("%d ", CNODEID_TO_NASID(i)) ;
  94. }
  95. printk("n") ;
  96. printk("BOOT MEM INFO ....n") ;
  97.         printk("Node   Start                LowPfn               BootmemMapn") ;
  98.         for (i=0;i<numnodes;i++) {
  99.                 bdata = NODE_DATA(i)->bdata ;
  100.                 printk("%d      0x%016lx   0x%016lx   0x%016lxn", i,
  101.                         bdata->node_boot_start, bdata->node_low_pfn,
  102.                         (unsigned long)bdata->node_bootmem_map) ;
  103.         }
  104. }
  105. void __init
  106. discontig_mem_init(void)
  107. {
  108. extern void setup_sn1_bootmem(int);
  109. int maxnodes ;
  110.         init_chunktonid() ;
  111. init_nodeidmap() ;
  112. init_cnodeidmap() ;
  113. efi_memmap_walk(build_nasid_map, 0) ;
  114. maxnodes = build_cnodeid_map() ;
  115. fix_nasid_map() ;
  116. #ifdef CONFIG_DISCONTIGMEM
  117. setup_sn1_bootmem(maxnodes) ;
  118. #endif
  119. numnodes = maxnodes;
  120. dump_bootmem_info() ;
  121. }
  122. void
  123. dump_node_data(void)
  124. {
  125.         int     i;
  126. printk("NODE DATA ....n") ;
  127. printk("Node, Start, Size, MemMap, BitMap, StartP, Mapnr, Size, Idn") ;
  128.         for (i=0;i<numnodes;i++) {
  129. printk("%d, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, %dn", 
  130. CNODEID_TO_NASID(i), NODE_START(i), NODE_SIZE(i), 
  131. (long)NODE_MEM_MAP(i), (long)NODE_DATA(i)->valid_addr_bitmap, 
  132. NODE_DATA(i)->node_start_paddr, 
  133. NODE_DATA(i)->node_start_mapnr,
  134. NODE_DATA(i)->node_size,
  135. NODE_DATA(i)->node_id)  ;
  136. }
  137. }