2005-04-17 02:20:36 +04:00
/*
* Written by Pat Gaughen ( gone @ us . ibm . com ) Mar 2002
*
*/
# ifndef _ASM_MMZONE_H_
# define _ASM_MMZONE_H_
# include <asm/smp.h>
2005-07-08 04:56:39 +04:00
# ifdef CONFIG_NUMA
2005-06-23 11:07:57 +04:00
extern struct pglist_data * node_data [ ] ;
# define NODE_DATA(nid) (node_data[nid])
2005-04-17 02:20:36 +04:00
2005-07-08 04:56:39 +04:00
# ifdef CONFIG_X86_NUMAQ
# include <asm/numaq.h>
2006-08-27 12:23:55 +04:00
# elif defined(CONFIG_ACPI_SRAT) /* summit or generic arch */
2005-07-08 04:56:39 +04:00
# include <asm/srat.h>
# endif
2005-04-17 02:20:36 +04:00
2005-06-23 11:07:57 +04:00
extern int get_memcfg_numa_flat ( void ) ;
/*
* This allows any one NUMA architecture to be compiled
* for , and still fall back to the flat function if it
* fails .
*/
static inline void get_memcfg_numa ( void )
{
# ifdef CONFIG_X86_NUMAQ
if ( get_memcfg_numaq ( ) )
return ;
2005-09-10 00:01:23 +04:00
# elif defined(CONFIG_ACPI_SRAT)
2005-06-23 11:07:57 +04:00
if ( get_memcfg_from_srat ( ) )
return ;
# endif
get_memcfg_numa_flat ( ) ;
}
2005-07-08 04:56:39 +04:00
extern int early_pfn_to_nid ( unsigned long pfn ) ;
2006-09-26 10:31:03 +04:00
extern void numa_kva_reserve ( void ) ;
2005-07-08 04:56:39 +04:00
2005-07-08 04:56:39 +04:00
# else /* !CONFIG_NUMA */
2006-09-26 10:31:03 +04:00
2005-07-08 04:56:39 +04:00
# define get_memcfg_numa get_memcfg_numa_flat
# define get_zholes_size(n) (0)
2006-09-26 10:31:03 +04:00
static inline void numa_kva_reserve ( void )
{
}
2005-06-23 11:07:57 +04:00
# endif /* CONFIG_NUMA */
# ifdef CONFIG_DISCONTIGMEM
2005-04-17 02:20:36 +04:00
/*
* generic node memory support , the following assumptions apply :
*
* 1 ) memory comes in 256 Mb contigious chunks which are either present or not
* 2 ) we will not have more than 64 Gb in total
*
* for now assume that 64 Gb is max amount of RAM for whole system
* 64 Gb / 4096 bytes / page = 16777216 pages
*/
# define MAX_NR_PAGES 16777216
# define MAX_ELEMENTS 256
# define PAGES_PER_ELEMENT (MAX_NR_PAGES / MAX_ELEMENTS)
extern s8 physnode_map [ ] ;
static inline int pfn_to_nid ( unsigned long pfn )
{
# ifdef CONFIG_NUMA
return ( ( int ) physnode_map [ ( pfn ) / PAGES_PER_ELEMENT ] ) ;
# else
return 0 ;
# endif
}
/*
* Following are macros that each numa implmentation must define .
*/
# define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
# define node_end_pfn(nid) \
( { \
pg_data_t * __pgdat = NODE_DATA ( nid ) ; \
__pgdat - > node_start_pfn + __pgdat - > node_spanned_pages ; \
} )
# ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */
# define pfn_valid(pfn) ((pfn) < num_physpages)
# else
static inline int pfn_valid ( int pfn )
{
int nid = pfn_to_nid ( pfn ) ;
if ( nid > = 0 )
return ( pfn < node_end_pfn ( nid ) ) ;
return 0 ;
}
2005-06-23 11:07:57 +04:00
# endif /* CONFIG_X86_NUMAQ */
# endif /* CONFIG_DISCONTIGMEM */
# ifdef CONFIG_NEED_MULTIPLE_NODES
2005-04-17 02:20:36 +04:00
/*
2005-06-23 11:07:57 +04:00
* Following are macros that are specific to this numa platform .
2005-04-17 02:20:36 +04:00
*/
2005-06-23 11:07:57 +04:00
# define reserve_bootmem(addr, size) \
reserve_bootmem_node ( NODE_DATA ( 0 ) , ( addr ) , ( size ) )
# define alloc_bootmem(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , SMP_CACHE_BYTES , __pa ( MAX_DMA_ADDRESS ) )
# define alloc_bootmem_low(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , SMP_CACHE_BYTES , 0 )
# define alloc_bootmem_pages(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , __pa ( MAX_DMA_ADDRESS ) )
# define alloc_bootmem_low_pages(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , 0 )
2006-12-07 07:33:04 +03:00
# define alloc_bootmem_node(pgdat, x) \
( { \
2007-05-09 13:35:30 +04:00
struct pglist_data __maybe_unused \
2006-12-07 07:33:04 +03:00
* __alloc_bootmem_node__pgdat = ( pgdat ) ; \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , SMP_CACHE_BYTES , \
__pa ( MAX_DMA_ADDRESS ) ) ; \
} )
# define alloc_bootmem_pages_node(pgdat, x) \
( { \
2007-05-09 13:35:30 +04:00
struct pglist_data __maybe_unused \
2006-12-07 07:33:04 +03:00
* __alloc_bootmem_node__pgdat = ( pgdat ) ; \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , \
__pa ( MAX_DMA_ADDRESS ) ) \
} )
# define alloc_bootmem_low_pages_node(pgdat, x) \
( { \
2007-05-09 13:35:30 +04:00
struct pglist_data __maybe_unused \
2006-12-07 07:33:04 +03:00
* __alloc_bootmem_node__pgdat = ( pgdat ) ; \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , 0 ) ; \
} )
2005-06-23 11:07:57 +04:00
# endif /* CONFIG_NEED_MULTIPLE_NODES */
2005-06-23 11:07:52 +04:00
2005-04-17 02:20:36 +04:00
# endif /* _ASM_MMZONE_H_ */