Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* K8 NUMA support */ |
2 | /* Copyright 2002,2003 by Andi Kleen, SuSE Labs */ | |
3 | /* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */ | |
4 | #ifndef _ASM_X86_64_MMZONE_H | |
5 | #define _ASM_X86_64_MMZONE_H 1 | |
6 | ||
7 | #include <linux/config.h> | |
8 | ||
9 | #ifdef CONFIG_DISCONTIGMEM | |
10 | ||
11 | #define VIRTUAL_BUG_ON(x) | |
12 | ||
13 | #include <asm/smp.h> | |
14 | ||
15 | #define NODEMAPSIZE 0xff | |
16 | ||
17 | /* Simple perfect hash to map physical addresses to node numbers */ | |
18 | extern int memnode_shift; | |
19 | extern u8 memnodemap[NODEMAPSIZE]; | |
20 | extern int maxnode; | |
21 | ||
22 | extern struct pglist_data *node_data[]; | |
23 | ||
24 | static inline __attribute__((pure)) int phys_to_nid(unsigned long addr) | |
25 | { | |
26 | int nid; | |
27 | VIRTUAL_BUG_ON((addr >> memnode_shift) >= NODEMAPSIZE); | |
28 | nid = memnodemap[addr >> memnode_shift]; | |
29 | VIRTUAL_BUG_ON(nid > maxnode); | |
30 | return nid; | |
31 | } | |
32 | ||
33 | #define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT) | |
34 | ||
35 | #define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr)) | |
36 | #define NODE_DATA(nid) (node_data[nid]) | |
37 | ||
1da177e4 LT |
38 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) |
39 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \ | |
40 | NODE_DATA(nid)->node_spanned_pages) | |
41 | ||
42 | #define local_mapnr(kvaddr) \ | |
43 | ( (__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr)) ) | |
44 | ||
45 | /* AK: this currently doesn't deal with invalid addresses. We'll see | |
46 | if the 2.5 kernel doesn't pass them | |
47 | (2.4 used to). */ | |
48 | #define pfn_to_page(pfn) ({ \ | |
49 | int nid = phys_to_nid(((unsigned long)(pfn)) << PAGE_SHIFT); \ | |
408fde81 | 50 | ((pfn) - node_start_pfn(nid)) + NODE_DATA(nid)->node_mem_map; \ |
1da177e4 LT |
51 | }) |
52 | ||
53 | #define page_to_pfn(page) \ | |
54 | (long)(((page) - page_zone(page)->zone_mem_map) + page_zone(page)->zone_start_pfn) | |
55 | ||
56 | #define pfn_valid(pfn) ((pfn) >= num_physpages ? 0 : \ | |
57 | ({ u8 nid__ = pfn_to_nid(pfn); \ | |
58 | nid__ != 0xff && (pfn) >= node_start_pfn(nid__) && (pfn) <= node_end_pfn(nid__); })) | |
59 | #endif | |
60 | #endif |