1 #ifndef _ASM_X8664_NUMA_H
2 #define _ASM_X8664_NUMA_H 1
3 
4 #include <xen/cpumask.h>
5 
6 #define NODES_SHIFT 6
7 
8 typedef u8 nodeid_t;
9 
10 extern int srat_rev;
11 
12 extern nodeid_t      cpu_to_node[NR_CPUS];
13 extern cpumask_t     node_to_cpumask[];
14 
15 #define cpu_to_node(cpu)		(cpu_to_node[cpu])
16 #define parent_node(node)		(node)
17 #define node_to_first_cpu(node)  (__ffs(node_to_cpumask[node]))
18 #define node_to_cpumask(node)    (node_to_cpumask[node])
19 
20 struct node {
21 	u64 start,end;
22 };
23 
24 extern int compute_hash_shift(struct node *nodes, int numnodes,
25 			      nodeid_t *nodeids);
26 extern nodeid_t pxm_to_node(unsigned int pxm);
27 
28 #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT))
29 #define VIRTUAL_BUG_ON(x)
30 
31 extern void numa_add_cpu(int cpu);
32 extern void numa_init_array(void);
33 extern bool numa_off;
34 
35 
36 extern int srat_disabled(void);
37 extern void numa_set_node(int cpu, nodeid_t node);
38 extern nodeid_t setup_node(unsigned int pxm);
39 extern void srat_detect_node(int cpu);
40 
41 extern void setup_node_bootmem(nodeid_t nodeid, u64 start, u64 end);
42 extern nodeid_t apicid_to_node[];
43 extern void init_cpu_to_node(void);
44 
clear_node_cpumask(int cpu)45 static inline void clear_node_cpumask(int cpu)
46 {
47 	cpumask_clear_cpu(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
48 }
49 
50 /* Simple perfect hash to map pdx to node numbers */
51 extern int memnode_shift;
52 extern unsigned long memnodemapsize;
53 extern u8 *memnodemap;
54 
55 struct node_data {
56     unsigned long node_start_pfn;
57     unsigned long node_spanned_pages;
58 };
59 
60 extern struct node_data node_data[];
61 
phys_to_nid(paddr_t addr)62 static inline __attribute__((pure)) nodeid_t phys_to_nid(paddr_t addr)
63 {
64 	nodeid_t nid;
65 	VIRTUAL_BUG_ON((paddr_to_pdx(addr) >> memnode_shift) >= memnodemapsize);
66 	nid = memnodemap[paddr_to_pdx(addr) >> memnode_shift];
67 	VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]);
68 	return nid;
69 }
70 
71 #define NODE_DATA(nid)		(&(node_data[nid]))
72 
73 #define node_start_pfn(nid)	(NODE_DATA(nid)->node_start_pfn)
74 #define node_spanned_pages(nid)	(NODE_DATA(nid)->node_spanned_pages)
75 #define node_end_pfn(nid)       (NODE_DATA(nid)->node_start_pfn + \
76 				 NODE_DATA(nid)->node_spanned_pages)
77 
78 extern int valid_numa_range(u64 start, u64 end, nodeid_t node);
79 
80 void srat_parse_regions(u64 addr);
81 extern u8 __node_distance(nodeid_t a, nodeid_t b);
82 unsigned int arch_get_dma_bitsize(void);
83 
84 #endif
85