]>
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 | ||
2b97690f | 9 | #ifdef CONFIG_NUMA |
1da177e4 LT |
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 | ||
1da177e4 LT |
33 | #define NODE_DATA(nid) (node_data[nid]) |
34 | ||
1da177e4 LT |
35 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) |
36 | #define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \ | |
37 | NODE_DATA(nid)->node_spanned_pages) | |
38 | ||
2b97690f MT |
39 | #ifdef CONFIG_DISCONTIGMEM |
40 | ||
41 | #define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT) | |
42 | #define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr)) | |
1da177e4 LT |
43 | |
44 | /* AK: this currently doesn't deal with invalid addresses. We'll see | |
45 | if the 2.5 kernel doesn't pass them | |
46 | (2.4 used to). */ | |
47 | #define pfn_to_page(pfn) ({ \ | |
48 | int nid = phys_to_nid(((unsigned long)(pfn)) << PAGE_SHIFT); \ | |
408fde81 | 49 | ((pfn) - node_start_pfn(nid)) + NODE_DATA(nid)->node_mem_map; \ |
1da177e4 LT |
50 | }) |
51 | ||
52 | #define page_to_pfn(page) \ | |
53 | (long)(((page) - page_zone(page)->zone_mem_map) + page_zone(page)->zone_start_pfn) | |
54 | ||
55 | #define pfn_valid(pfn) ((pfn) >= num_physpages ? 0 : \ | |
56 | ({ u8 nid__ = pfn_to_nid(pfn); \ | |
57 | nid__ != 0xff && (pfn) >= node_start_pfn(nid__) && (pfn) <= node_end_pfn(nid__); })) | |
58 | #endif | |
2b97690f MT |
59 | |
60 | #define local_mapnr(kvaddr) \ | |
61 | ( (__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr)) ) | |
62 | #endif | |
1da177e4 | 63 | #endif |