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