home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-i386 / mmzone.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  3.2 KB  |  127 lines

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