2 * Written by Kanoj Sarcar (kanoj@sgi.com) Aug 99
3 * Adapted for the alpha wildfire architecture Jan 2001.
8 #include <linux/config.h>
9 #ifdef CONFIG_NUMA_SCHED
10 #include <linux/numa_sched.h>
13 #include <asm/sn/types.h>
14 #include <asm/sn/addrs.h>
15 #include <asm/sn/arch.h>
16 #include <asm/sn/klkernvars.h>
19 typedef struct plat_pglist_data {
22 kern_vars_t kern_vars;
24 #if defined(CONFIG_NUMA) && defined(CONFIG_NUMA_SCHED)
25 struct numa_schedule_data schedule_data;
29 struct bootmem_data_t; /* stupid forward decl. */
32 * Following are macros that are specific to this numa platform.
35 extern plat_pg_data_t *plat_node_data[];
37 #define ALPHA_PA_TO_NID(pa) \
39 ? alpha_mv.pa_to_nid(pa) \
41 #define NODE_MEM_START(nid) \
42 (alpha_mv.node_mem_start \
43 ? alpha_mv.node_mem_start(nid) \
45 #define NODE_MEM_SIZE(nid) \
46 (alpha_mv.node_mem_size \
47 ? alpha_mv.node_mem_size(nid) \
48 : ((nid) ? (0UL) : (~0UL)))
49 #define MAX_NUMNODES 128 /* marvel */
51 #define PHYSADDR_TO_NID(pa) ALPHA_PA_TO_NID(pa)
52 #define PLAT_NODE_DATA(n) (plat_node_data[(n)])
53 #define PLAT_NODE_DATA_STARTNR(n) \
54 (PLAT_NODE_DATA(n)->gendata.node_start_mapnr)
55 #define PLAT_NODE_DATA_SIZE(n) (PLAT_NODE_DATA(n)->gendata.node_size)
58 #define PLAT_NODE_DATA_LOCALNR(p, n) \
59 (((p) - PLAT_NODE_DATA(n)->gendata.node_start_paddr) >> PAGE_SHIFT)
61 static inline unsigned long
62 PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
65 temp = p - PLAT_NODE_DATA(n)->gendata.node_start_paddr;
66 return (temp >> PAGE_SHIFT);
70 #ifdef CONFIG_DISCONTIGMEM
73 * Following are macros that each numa implmentation must define.
77 * Given a kernel address, find the home node of the underlying memory.
79 #define KVADDR_TO_NID(kaddr) PHYSADDR_TO_NID(__pa(kaddr))
82 * Return a pointer to the node data for node n.
84 #define NODE_DATA(n) (&((PLAT_NODE_DATA(n))->gendata))
87 * NODE_MEM_MAP gives the kaddr for the mem_map of the node.
89 #define NODE_MEM_MAP(nid) (NODE_DATA(nid)->node_mem_map)
92 * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
93 * and returns the mem_map of that node.
95 #define ADDR_TO_MAPBASE(kaddr) \
96 NODE_MEM_MAP(KVADDR_TO_NID((unsigned long)(kaddr)))
99 * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
100 * and returns the kaddr corresponding to first physical page in the
103 #define LOCAL_BASE_ADDR(kaddr) ((unsigned long)__va(NODE_DATA(KVADDR_TO_NID(kaddr))->node_start_paddr))
105 #define LOCAL_MAP_NR(kvaddr) \
106 (((unsigned long)(kvaddr)-LOCAL_BASE_ADDR(kvaddr)) >> PAGE_SHIFT)
108 #define kern_addr_valid(kaddr) test_bit(LOCAL_MAP_NR(kaddr), \
109 NODE_DATA(KVADDR_TO_NID(kaddr))->valid_addr_bitmap)
111 #define virt_to_page(kaddr) (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr))
112 #define VALID_PAGE(page) (((page) - mem_map) < max_mapnr)
115 #ifdef CONFIG_NUMA_SCHED
116 #define NODE_SCHEDULE_DATA(nid) (&((PLAT_NODE_DATA(nid))->schedule_data))
119 #define cputonode(cpu) \
120 (alpha_mv.cpuid_to_nid ? alpha_mv.cpuid_to_nid(cpu) : 0)
122 #define numa_node_id() cputonode(smp_processor_id())
123 #endif /* CONFIG_NUMA */
125 #endif /* CONFIG_DISCONTIGMEM */
127 #endif /* _ASM_MMZONE_H_ */