1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds #ifndef _LINUX_NUMA_H 31da177e4SLinus Torvalds #define _LINUX_NUMA_H 4d7a73e3fSKent Overstreet #include <linux/init.h> 55d30f92eSDan Williams #include <linux/types.h> 614a8262fSYury Norov #include <linux/nodemask.h> 71da177e4SLinus Torvalds 88f012db2SAlison Schofield #define NUMA_NO_MEMBLK (-1) 94e25b257SLee Schermerhorn numa_valid_node(int nid)108043832eSMike Rapoport (IBM)static inline bool numa_valid_node(int nid) 118043832eSMike Rapoport (IBM) { 128043832eSMike Rapoport (IBM) return nid >= 0 && nid < MAX_NUMNODES; 138043832eSMike Rapoport (IBM) } 148043832eSMike Rapoport (IBM) 151e5d8e1eSDan Williams /* optionally keep NUMA memory info available post init */ 161e5d8e1eSDan Williams #ifdef CONFIG_NUMA_KEEP_MEMINFO 171e5d8e1eSDan Williams #define __initdata_or_meminfo 181e5d8e1eSDan Williams #else 191e5d8e1eSDan Williams #define __initdata_or_meminfo __initdata 201e5d8e1eSDan Williams #endif 211e5d8e1eSDan Williams 22b2ca916cSDan Williams #ifdef CONFIG_NUMA 23a927bd6bSDan Williams #include <asm/sparsemem.h> 24a927bd6bSDan Williams 2546bcce50SMike Rapoport (Microsoft) extern struct pglist_data *node_data[]; 2646bcce50SMike Rapoport (Microsoft) #define NODE_DATA(nid) (node_data[nid]) 2746bcce50SMike Rapoport (Microsoft) 283515863dSMike Rapoport (Microsoft) void __init alloc_node_data(int nid); 29ec164cf1SMike Rapoport (Microsoft) void __init alloc_offline_node_data(int nid); 30ec164cf1SMike Rapoport (Microsoft) 315d30f92eSDan Williams /* Generic implementation available */ 32b1f099b1SYury Norov int numa_nearest_node(int node, unsigned int state); 33a927bd6bSDan Williams 34*16d79f2aSAndrea Righi int nearest_node_nodemask(int node, nodemask_t *mask); 35*16d79f2aSAndrea Righi 36a927bd6bSDan Williams #ifndef memory_add_physaddr_to_nid 37d7a73e3fSKent Overstreet int memory_add_physaddr_to_nid(u64 start); 38a927bd6bSDan Williams #endif 39d7a73e3fSKent Overstreet 40a927bd6bSDan Williams #ifndef phys_to_target_node 41d7a73e3fSKent Overstreet int phys_to_target_node(u64 start); 42a927bd6bSDan Williams #endif 43d7a73e3fSKent Overstreet 44f9f67e5aSRobert Richter int numa_fill_memblks(u64 start, u64 end); 45d7a73e3fSKent Overstreet 46a927bd6bSDan Williams #else /* !CONFIG_NUMA */ numa_nearest_node(int node,unsigned int state)47b1f099b1SYury Norovstatic inline int numa_nearest_node(int node, unsigned int state) 48b2ca916cSDan Williams { 49b2ca916cSDan Williams return NUMA_NO_NODE; 50b2ca916cSDan Williams } 51b1f099b1SYury Norov nearest_node_nodemask(int node,nodemask_t * mask)52*16d79f2aSAndrea Righistatic inline int nearest_node_nodemask(int node, nodemask_t *mask) 53*16d79f2aSAndrea Righi { 54*16d79f2aSAndrea Righi return NUMA_NO_NODE; 55*16d79f2aSAndrea Righi } 56*16d79f2aSAndrea Righi memory_add_physaddr_to_nid(u64 start)57a927bd6bSDan Williamsstatic inline int memory_add_physaddr_to_nid(u64 start) 58a927bd6bSDan Williams { 59a927bd6bSDan Williams return 0; 60a927bd6bSDan Williams } phys_to_target_node(u64 start)61a927bd6bSDan Williamsstatic inline int phys_to_target_node(u64 start) 62a927bd6bSDan Williams { 63a927bd6bSDan Williams return 0; 64a927bd6bSDan Williams } 65ec164cf1SMike Rapoport (Microsoft) alloc_offline_node_data(int nid)66ec164cf1SMike Rapoport (Microsoft)static inline void alloc_offline_node_data(int nid) {} 67b2ca916cSDan Williams #endif 68b2ca916cSDan Williams 69b1f099b1SYury Norov #define numa_map_to_online_node(node) numa_nearest_node(node, N_ONLINE) 70b1f099b1SYury Norov 7150468e43SJarkko Sakkinen #ifdef CONFIG_HAVE_ARCH_NODE_DEV_GROUP 7250468e43SJarkko Sakkinen extern const struct attribute_group arch_node_dev_group; 7350468e43SJarkko Sakkinen #endif 7450468e43SJarkko Sakkinen 751da177e4SLinus Torvalds #endif /* _LINUX_NUMA_H */ 76