blob: 5862e6460658d29fc8be6b2a9b2a26389522eb1f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Written by Pat Gaughen (gone@us.ibm.com) Mar 2002
3 *
4 */
5
6#ifndef _ASM_MMZONE_H_
7#define _ASM_MMZONE_H_
8
9#include <asm/smp.h>
10
Dave Jones8ff8b272005-07-07 17:56:39 -070011#ifdef CONFIG_NUMA
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070012extern struct pglist_data *node_data[];
13#define NODE_DATA(nid) (node_data[nid])
Linus Torvalds1da177e2005-04-16 15:20:36 -070014
Yinghai Lud49c4282008-06-08 18:31:54 -070015#include <asm/numaq.h>
16/* summit or generic arch */
17#include <asm/srat.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
Joe Perches7491d332008-03-23 01:02:46 -070019extern int get_memcfg_numa_flat(void);
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070020/*
21 * This allows any one NUMA architecture to be compiled
22 * for, and still fall back to the flat function if it
23 * fails.
24 */
25static inline void get_memcfg_numa(void)
26{
Yinghai Lud49c4282008-06-08 18:31:54 -070027
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070028 if (get_memcfg_numaq())
29 return;
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070030 if (get_memcfg_from_srat())
31 return;
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070032 get_memcfg_numa_flat();
33}
34
Dave Jonese8af3002005-07-07 17:56:39 -070035extern int early_pfn_to_nid(unsigned long pfn);
36
Dave Jones8ff8b272005-07-07 17:56:39 -070037#else /* !CONFIG_NUMA */
keith mannthey91023302006-09-25 23:31:03 -070038
Dave Jones8ff8b272005-07-07 17:56:39 -070039#define get_memcfg_numa get_memcfg_numa_flat
keith mannthey91023302006-09-25 23:31:03 -070040
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070041#endif /* CONFIG_NUMA */
42
43#ifdef CONFIG_DISCONTIGMEM
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
45/*
46 * generic node memory support, the following assumptions apply:
47 *
Yinghai Luba924c82008-05-31 22:51:51 -070048 * 1) memory comes in 64Mb contigious chunks which are either present or not
Linus Torvalds1da177e2005-04-16 15:20:36 -070049 * 2) we will not have more than 64Gb in total
50 *
51 * for now assume that 64Gb is max amount of RAM for whole system
52 * 64Gb / 4096bytes/page = 16777216 pages
53 */
54#define MAX_NR_PAGES 16777216
Yinghai Luba924c82008-05-31 22:51:51 -070055#define MAX_ELEMENTS 1024
Linus Torvalds1da177e2005-04-16 15:20:36 -070056#define PAGES_PER_ELEMENT (MAX_NR_PAGES/MAX_ELEMENTS)
57
58extern s8 physnode_map[];
59
60static inline int pfn_to_nid(unsigned long pfn)
61{
62#ifdef CONFIG_NUMA
63 return((int) physnode_map[(pfn) / PAGES_PER_ELEMENT]);
64#else
65 return 0;
66#endif
67}
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069/*
70 * Following are macros that each numa implmentation must define.
71 */
72
Linus Torvalds1da177e2005-04-16 15:20:36 -070073#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
74#define node_end_pfn(nid) \
75({ \
76 pg_data_t *__pgdat = NODE_DATA(nid); \
77 __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
78})
79
Linus Torvalds1da177e2005-04-16 15:20:36 -070080static inline int pfn_valid(int pfn)
81{
82 int nid = pfn_to_nid(pfn);
83
84 if (nid >= 0)
85 return (pfn < node_end_pfn(nid));
86 return 0;
87}
Linus Torvalds1da177e2005-04-16 15:20:36 -070088
89#endif /* CONFIG_DISCONTIGMEM */
Andy Whitcroftb159d432005-06-23 00:07:52 -070090
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070091#ifdef CONFIG_NEED_MULTIPLE_NODES
92
93/*
94 * Following are macros that are specific to this numa platform.
95 */
Bernhard Walle72a7fe32008-02-07 00:15:17 -080096#define reserve_bootmem(addr, size, flags) \
97 reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags))
Andy Whitcroft05b79bd2005-06-23 00:07:57 -070098#define alloc_bootmem(x) \
99 __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS))
Johannes Weiner0ed89b02008-08-13 10:17:24 +0200100#define alloc_bootmem_nopanic(x) \
101 __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \
102 __pa(MAX_DMA_ADDRESS))
Andy Whitcroft05b79bd2005-06-23 00:07:57 -0700103#define alloc_bootmem_low(x) \
104 __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0)
105#define alloc_bootmem_pages(x) \
106 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS))
Johannes Weiner0ed89b02008-08-13 10:17:24 +0200107#define alloc_bootmem_pages_nopanic(x) \
108 __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \
109 __pa(MAX_DMA_ADDRESS))
Andy Whitcroft05b79bd2005-06-23 00:07:57 -0700110#define alloc_bootmem_low_pages(x) \
111 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0)
Andy Whitcroft4af2bfc2006-12-06 20:33:04 -0800112#define alloc_bootmem_node(pgdat, x) \
113({ \
David Rientjesc3c117f2007-05-09 02:35:30 -0700114 struct pglist_data __maybe_unused \
Andy Whitcroft4af2bfc2006-12-06 20:33:04 -0800115 *__alloc_bootmem_node__pgdat = (pgdat); \
116 __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, \
117 __pa(MAX_DMA_ADDRESS)); \
118})
119#define alloc_bootmem_pages_node(pgdat, x) \
120({ \
David Rientjesc3c117f2007-05-09 02:35:30 -0700121 struct pglist_data __maybe_unused \
Andy Whitcroft4af2bfc2006-12-06 20:33:04 -0800122 *__alloc_bootmem_node__pgdat = (pgdat); \
123 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, \
Glauber de Oliveira Costafbac7fc2008-03-19 14:25:22 -0300124 __pa(MAX_DMA_ADDRESS)); \
Andy Whitcroft4af2bfc2006-12-06 20:33:04 -0800125})
126#define alloc_bootmem_low_pages_node(pgdat, x) \
127({ \
David Rientjesc3c117f2007-05-09 02:35:30 -0700128 struct pglist_data __maybe_unused \
Andy Whitcroft4af2bfc2006-12-06 20:33:04 -0800129 *__alloc_bootmem_node__pgdat = (pgdat); \
130 __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0); \
131})
Andy Whitcroft05b79bd2005-06-23 00:07:57 -0700132#endif /* CONFIG_NEED_MULTIPLE_NODES */
133
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134#endif /* _ASM_MMZONE_H_ */