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. */
2008-10-22 22:26:29 -07:00
# ifndef _ASM_X86_MMZONE_64_H
# define _ASM_X86_MMZONE_64_H
2005-04-16 15:20:36 -07:00
2005-06-23 00:08:06 -07:00
# ifdef CONFIG_NUMA
2005-04-16 15:20:36 -07:00
2008-06-12 13:56:40 +02:00
# include <linux/mmdebug.h>
2005-04-16 15:20:36 -07:00
# include <asm/smp.h>
/* Simple perfect hash to map physical addresses to node numbers */
2006-03-25 16:31:46 +01:00
struct memnode {
int shift ;
2007-02-13 13:26:19 +01:00
unsigned int mapsize ;
2008-01-30 13:33:25 +01:00
s16 * map ;
2008-03-23 01:02:47 -07:00
s16 embedded_map [ 64 - 8 ] ;
2008-01-30 13:33:25 +01:00
} ____cacheline_aligned ; /* total size = 128 bytes */
2006-03-25 16:31:46 +01:00
extern struct memnode memnode ;
# define memnode_shift memnode.shift
# define memnodemap memnode.map
2007-02-13 13:26:19 +01:00
# define memnodemapsize memnode.mapsize
2005-04-16 15:20:36 -07:00
extern struct pglist_data * node_data [ ] ;
2008-03-23 01:02:47 -07:00
static inline __attribute__ ( ( pure ) ) int phys_to_nid ( unsigned long addr )
{
unsigned nid ;
2007-02-13 13:26:19 +01:00
VIRTUAL_BUG_ON ( ! memnodemap ) ;
2008-03-23 01:02:47 -07:00
nid = memnodemap [ addr > > memnode_shift ] ;
VIRTUAL_BUG_ON ( nid > = MAX_NUMNODES | | ! node_data [ nid ] ) ;
return nid ;
}
2005-04-16 15:20:36 -07:00
# define NODE_DATA(nid) (node_data[nid])
# define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
2008-03-23 01:02:47 -07:00
# define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
2005-04-16 15:20:36 -07:00
NODE_DATA ( nid ) - > node_spanned_pages )
2005-06-23 00:08:06 -07:00
# endif
2008-10-22 22:26:29 -07:00
# endif /* _ASM_X86_MMZONE_64_H */