Commit | Line | Data |
---|---|---|
867e359b CM |
1 | /* |
2 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation, version 2. | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | |
11 | * NON INFRINGEMENT. See the GNU General Public License for | |
12 | * more details. | |
13 | */ | |
14 | ||
15 | #ifndef _ASM_TILE_MMZONE_H | |
16 | #define _ASM_TILE_MMZONE_H | |
17 | ||
18 | extern struct pglist_data node_data[]; | |
19 | #define NODE_DATA(nid) (&node_data[nid]) | |
20 | ||
21 | extern void get_memcfg_numa(void); | |
22 | ||
23 | #ifdef CONFIG_DISCONTIGMEM | |
24 | ||
25 | #include <asm/page.h> | |
26 | ||
27 | /* | |
28 | * Generally, memory ranges are always doled out by the hypervisor in | |
29 | * fixed-size, power-of-two increments. That would make computing the node | |
30 | * very easy. We could just take a couple high bits of the PA, which | |
31 | * denote the memory shim, and we'd be done. However, when we're doing | |
32 | * memory striping, this may not be true; PAs with different high bit | |
33 | * values might be in the same node. Thus, we keep a lookup table to | |
34 | * translate the high bits of the PFN to the node number. | |
35 | */ | |
36 | extern int highbits_to_node[]; | |
37 | ||
38 | static inline int pfn_to_nid(unsigned long pfn) | |
39 | { | |
40 | return highbits_to_node[__pfn_to_highbits(pfn)]; | |
41 | } | |
42 | ||
43 | /* | |
44 | * Following are macros that each numa implmentation must define. | |
45 | */ | |
46 | ||
47 | #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) | |
48 | #define node_end_pfn(nid) \ | |
49 | ({ \ | |
50 | pg_data_t *__pgdat = NODE_DATA(nid); \ | |
51 | __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \ | |
52 | }) | |
53 | ||
54 | #define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr) | |
55 | ||
56 | static inline int pfn_valid(int pfn) | |
57 | { | |
58 | int nid = pfn_to_nid(pfn); | |
59 | ||
60 | if (nid >= 0) | |
61 | return (pfn < node_end_pfn(nid)); | |
62 | return 0; | |
63 | } | |
64 | ||
65 | /* Information on the NUMA nodes that we compute early */ | |
66 | extern unsigned long node_start_pfn[]; | |
67 | extern unsigned long node_end_pfn[]; | |
68 | extern unsigned long node_memmap_pfn[]; | |
69 | extern unsigned long node_percpu_pfn[]; | |
70 | extern unsigned long node_free_pfn[]; | |
71 | #ifdef CONFIG_HIGHMEM | |
72 | extern unsigned long node_lowmem_end_pfn[]; | |
73 | #endif | |
74 | #ifdef CONFIG_PCI | |
75 | extern unsigned long pci_reserve_start_pfn; | |
76 | extern unsigned long pci_reserve_end_pfn; | |
77 | #endif | |
78 | ||
79 | #endif /* CONFIG_DISCONTIGMEM */ | |
80 | ||
81 | #endif /* _ASM_TILE_MMZONE_H */ |