2005-04-16 15:20:36 -07:00
/* K8 NUMA support */
/* Copyright 2002,2003 by Andi Kleen, SuSE Labs */
/* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */
# ifndef _ASM_X86_64_MMZONE_H
# define _ASM_X86_64_MMZONE_H 1
# include <linux/config.h>
2005-06-23 00:08:06 -07:00
# ifdef CONFIG_NUMA
2005-04-16 15:20:36 -07:00
# define VIRTUAL_BUG_ON(x)
# include <asm/smp.h>
2005-09-12 18:49:24 +02:00
# define NODEMAPSIZE 0xfff
2005-04-16 15:20:36 -07:00
/* Simple perfect hash to map physical addresses to node numbers */
extern int memnode_shift ;
extern u8 memnodemap [ NODEMAPSIZE ] ;
extern struct pglist_data * node_data [ ] ;
static inline __attribute__ ( ( pure ) ) int phys_to_nid ( unsigned long addr )
{
2005-11-05 17:25:54 +01:00
unsigned nid ;
2005-04-16 15:20:36 -07:00
VIRTUAL_BUG_ON ( ( addr > > memnode_shift ) > = NODEMAPSIZE ) ;
nid = memnodemap [ addr > > memnode_shift ] ;
2005-11-05 17:25:54 +01:00
VIRTUAL_BUG_ON ( nid > = MAX_NUMNODES | | ! node_data [ nid ] ) ;
2005-04-16 15:20:36 -07:00
return nid ;
}
# define NODE_DATA(nid) (node_data[nid])
# define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
# define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
NODE_DATA ( nid ) - > node_spanned_pages )
2005-06-23 00:08:06 -07:00
# ifdef CONFIG_DISCONTIGMEM
# define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
# define kvaddr_to_nid(kaddr) phys_to_nid(__pa(kaddr))
2005-04-16 15:20:36 -07:00
2006-01-11 22:46:27 +01:00
extern struct page * pfn_to_page ( unsigned long pfn ) ;
extern unsigned long page_to_pfn ( struct page * page ) ;
extern int pfn_valid ( unsigned long pfn ) ;
2005-04-16 15:20:36 -07:00
# endif
2005-06-23 00:08:06 -07:00
# define local_mapnr(kvaddr) \
( ( __pa ( kvaddr ) > > PAGE_SHIFT ) - node_start_pfn ( kvaddr_to_nid ( kvaddr ) ) )
# endif
2005-04-16 15:20:36 -07:00
# endif