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 int early_pfn_to_nid(unsigned long pfn); 36 37 #else /* !CONFIG_NUMA */ 38 39 #define get_memcfg_numa get_memcfg_numa_flat 40 41 #endif /* CONFIG_NUMA */ 42 43 #ifdef CONFIG_DISCONTIGMEM 44 45 /* 46 * generic node memory support, the following assumptions apply: 47 * 48 * 1) memory comes in 64Mb contigious chunks which are either present or not 49 * 2) we will not have more than 64Gb in total 50 * 51 * for now assume that 64Gb is max amount of RAM for whole system 52 * 64Gb / 4096bytes/page = 16777216 pages 53 */ 54 #define MAX_NR_PAGES 16777216 55 #define MAX_ELEMENTS 1024 56 #define PAGES_PER_ELEMENT (MAX_NR_PAGES/MAX_ELEMENTS) 57 58 extern s8 physnode_map[]; 59 60 static inline int pfn_to_nid(unsigned long pfn) 61 { 62 #ifdef CONFIG_NUMA 63 return((int) physnode_map[(pfn) / PAGES_PER_ELEMENT]); 64 #else 65 return 0; 66 #endif 67 } 68 69 /* 70 * Following are macros that each numa implmentation must define. 71 */ 72 73 #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) 74 #define node_end_pfn(nid) \ 75 ({ \ 76 pg_data_t *__pgdat = NODE_DATA(nid); \ 77 __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \ 78 }) 79 80 static inline int pfn_valid(int pfn) 81 { 82 int nid = pfn_to_nid(pfn); 83 84 if (nid >= 0) 85 return (pfn < node_end_pfn(nid)); 86 return 0; 87 } 88 89 #endif /* CONFIG_DISCONTIGMEM */ 90 91 #ifdef CONFIG_NEED_MULTIPLE_NODES 92 93 /* 94 * Following are macros that are specific to this numa platform. 95 */ 96 #define reserve_bootmem(addr, size, flags) \ 97 reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) 98 #define alloc_bootmem(x) \ 99 __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) 100 #define alloc_bootmem_nopanic(x) \ 101 __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \ 102 __pa(MAX_DMA_ADDRESS)) 103 #define alloc_bootmem_low(x) \ 104 __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) 105 #define alloc_bootmem_pages(x) \ 106 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) 107 #define alloc_bootmem_pages_nopanic(x) \ 108 __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \ 109 __pa(MAX_DMA_ADDRESS)) 110 #define alloc_bootmem_low_pages(x) \ 111 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) 112 #define alloc_bootmem_node(pgdat, x) \ 113 ({ \ 114 struct pglist_data __maybe_unused \ 115 *__alloc_bootmem_node__pgdat = (pgdat); \ 116 __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, \ 117 __pa(MAX_DMA_ADDRESS)); \ 118 }) 119 #define alloc_bootmem_pages_node(pgdat, x) \ 120 ({ \ 121 struct pglist_data __maybe_unused \ 122 *__alloc_bootmem_node__pgdat = (pgdat); \ 123 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, \ 124 __pa(MAX_DMA_ADDRESS)); \ 125 }) 126 #define alloc_bootmem_low_pages_node(pgdat, x) \ 127 ({ \ 128 struct pglist_data __maybe_unused \ 129 *__alloc_bootmem_node__pgdat = (pgdat); \ 130 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0); \ 131 }) 132 #endif /* CONFIG_NEED_MULTIPLE_NODES */ 133 134 #endif /* _ASM_X86_MMZONE_32_H */ 135