home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / x86 / include / asm / mmzone_32.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-09  |  3.5 KB  |  137 lines

  1. /*
  2.  * Written by Pat Gaughen (gone@us.ibm.com) Mar 2002
  3.  *
  4.  */
  5.  
  6. #ifndef _ASM_X86_MMZONE_32_H
  7. #define _ASM_X86_MMZONE_32_H
  8.  
  9. #include <asm/smp.h>
  10.  
  11. #ifdef CONFIG_NUMA
  12. extern struct pglist_data *node_data[];
  13. #define NODE_DATA(nid)    (node_data[nid])
  14.  
  15. #include <asm/numaq.h>
  16. /* summit or generic arch */
  17. #include <asm/srat.h>
  18.  
  19. extern int get_memcfg_numa_flat(void);
  20. /*
  21.  * This allows any one NUMA architecture to be compiled
  22.  * for, and still fall back to the flat function if it
  23.  * fails.
  24.  */
  25. static inline void get_memcfg_numa(void)
  26. {
  27.  
  28.     if (get_memcfg_numaq())
  29.         return;
  30.     if (get_memcfg_from_srat())
  31.         return;
  32.     get_memcfg_numa_flat();
  33. }
  34.  
  35. extern void resume_map_numa_kva(pgd_t *pgd);
  36.  
  37. #else /* !CONFIG_NUMA */
  38.  
  39. #define get_memcfg_numa get_memcfg_numa_flat
  40.  
  41. static inline void resume_map_numa_kva(pgd_t *pgd) {}
  42.  
  43. #endif /* CONFIG_NUMA */
  44.  
  45. #ifdef CONFIG_DISCONTIGMEM
  46.  
  47. /*
  48.  * generic node memory support, the following assumptions apply:
  49.  *
  50.  * 1) memory comes in 64Mb contigious chunks which are either present or not
  51.  * 2) we will not have more than 64Gb in total
  52.  *
  53.  * for now assume that 64Gb is max amount of RAM for whole system
  54.  *    64Gb / 4096bytes/page = 16777216 pages
  55.  */
  56. #define MAX_NR_PAGES 16777216
  57. #define MAX_ELEMENTS 1024
  58. #define PAGES_PER_ELEMENT (MAX_NR_PAGES/MAX_ELEMENTS)
  59.  
  60. extern s8 physnode_map[];
  61.  
  62. static inline int pfn_to_nid(unsigned long pfn)
  63. {
  64. #ifdef CONFIG_NUMA
  65.     return((int) physnode_map[(pfn) / PAGES_PER_ELEMENT]);
  66. #else
  67.     return 0;
  68. #endif
  69. }
  70.  
  71. /*
  72.  * Following are macros that each numa implmentation must define.
  73.  */
  74.  
  75. #define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
  76. #define node_end_pfn(nid)                        \
  77. ({                                    \
  78.     pg_data_t *__pgdat = NODE_DATA(nid);                \
  79.     __pgdat->node_start_pfn + __pgdat->node_spanned_pages;        \
  80. })
  81.  
  82. static inline int pfn_valid(int pfn)
  83. {
  84.     int nid = pfn_to_nid(pfn);
  85.  
  86.     if (nid >= 0)
  87.         return (pfn < node_end_pfn(nid));
  88.     return 0;
  89. }
  90.  
  91. #endif /* CONFIG_DISCONTIGMEM */
  92.  
  93. #ifdef CONFIG_NEED_MULTIPLE_NODES
  94.  
  95. /*
  96.  * Following are macros that are specific to this numa platform.
  97.  */
  98. #define reserve_bootmem(addr, size, flags) \
  99.     reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags))
  100. #define alloc_bootmem(x) \
  101.     __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
  102. #define alloc_bootmem_nopanic(x) \
  103.     __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \
  104.                 __pa(MAX_DMA_ADDRESS))
  105. #define alloc_bootmem_low(x) \
  106.     __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0)
  107. #define alloc_bootmem_pages(x) \
  108.     __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
  109. #define alloc_bootmem_pages_nopanic(x) \
  110.     __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \
  111.                 __pa(MAX_DMA_ADDRESS))
  112. #define alloc_bootmem_low_pages(x) \
  113.     __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0)
  114. #define alloc_bootmem_node(pgdat, x)                    \
  115. ({                                    \
  116.     struct pglist_data  __maybe_unused            \
  117.                 *__alloc_bootmem_node__pgdat = (pgdat);    \
  118.     __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES,    \
  119.                         __pa(MAX_DMA_ADDRESS));    \
  120. })
  121. #define alloc_bootmem_pages_node(pgdat, x)                \
  122. ({                                    \
  123.     struct pglist_data  __maybe_unused            \
  124.                 *__alloc_bootmem_node__pgdat = (pgdat);    \
  125.     __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE,        \
  126.                         __pa(MAX_DMA_ADDRESS));    \
  127. })
  128. #define alloc_bootmem_low_pages_node(pgdat, x)                \
  129. ({                                    \
  130.     struct pglist_data  __maybe_unused            \
  131.                 *__alloc_bootmem_node__pgdat = (pgdat);    \
  132.     __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0);        \
  133. })
  134. #endif /* CONFIG_NEED_MULTIPLE_NODES */
  135.  
  136. #endif /* _ASM_X86_MMZONE_32_H */
  137.