2006-03-27 13:15:25 +04:00
# ifndef __ASM_MEMORY_MODEL_H
# define __ASM_MEMORY_MODEL_H
# ifdef __KERNEL__
# ifndef __ASSEMBLY__
# if defined(CONFIG_FLATMEM)
# ifndef ARCH_PFN_OFFSET
# define ARCH_PFN_OFFSET (0UL)
# endif
# elif defined(CONFIG_DISCONTIGMEM)
# ifndef arch_pfn_to_nid
# define arch_pfn_to_nid(pfn) pfn_to_nid(pfn)
# endif
# ifndef arch_local_page_offset
# define arch_local_page_offset(pfn, nid) \
( ( pfn ) - NODE_DATA ( nid ) - > node_start_pfn )
# endif
# endif /* CONFIG_DISCONTIGMEM */
# ifdef CONFIG_OUT_OF_LINE_PFN_TO_PAGE
struct page ;
/* this is useful when inlined pfn_to_page is too big */
extern struct page * pfn_to_page ( unsigned long pfn ) ;
extern unsigned long page_to_pfn ( struct page * page ) ;
# else
/*
* supports 3 memory models .
*/
# if defined(CONFIG_FLATMEM)
# define pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET))
# define page_to_pfn(page) ((unsigned long)((page) - mem_map) + \
ARCH_PFN_OFFSET )
# elif defined(CONFIG_DISCONTIGMEM)
# define pfn_to_page(pfn) \
( { unsigned long __pfn = ( pfn ) ; \
unsigned long __nid = arch_pfn_to_nid ( pfn ) ; \
NODE_DATA ( __nid ) - > node_mem_map + arch_local_page_offset ( __pfn , __nid ) ; \
} )
2006-03-27 13:15:55 +04:00
# define page_to_pfn(pg) \
( { struct page * __pg = ( pg ) ; \
struct pglist_data * __pgdat = NODE_DATA ( page_to_nid ( __pg ) ) ; \
( unsigned long ) ( __pg - __pgdat - > node_mem_map ) + \
__pgdat - > node_start_pfn ; \
2006-03-27 13:15:25 +04:00
} )
# elif defined(CONFIG_SPARSEMEM)
/*
* Note : section ' s mem_map is encorded to reflect its start_pfn .
* section [ i ] . section_mem_map = = mem_map ' s address - start_pfn ;
*/
# define page_to_pfn(pg) \
( { struct page * __pg = ( pg ) ; \
int __sec = page_to_section ( __pg ) ; \
__pg - __section_mem_map_addr ( __nr_to_section ( __sec ) ) ; \
} )
# define pfn_to_page(pfn) \
( { unsigned long __pfn = ( pfn ) ; \
struct mem_section * __sec = __pfn_to_section ( __pfn ) ; \
__section_mem_map_addr ( __sec ) + __pfn ; \
} )
# endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */
# endif /* CONFIG_OUT_OF_LINE_PFN_TO_PAGE */
# endif /* __ASSEMBLY__ */
# endif /* __KERNEL__ */
# endif