@ -64,6 +64,7 @@ extern int memblock_find(struct memblock_region *res);
extern void memblock_dump_all ( void ) ;
/* Obsolete accessors */
static inline u64
memblock_size_bytes ( struct memblock_type * type , unsigned long region_nr )
{
@ -86,6 +87,57 @@ memblock_end_pfn(struct memblock_type *type, unsigned long region_nr)
memblock_size_pages ( type , region_nr ) ;
}
/*
* pfn conversion functions
*
* While the memory MEMBLOCKs should always be page aligned , the reserved
* MEMBLOCKs may not be . This accessor attempt to provide a very clear
* idea of what they return for such non aligned MEMBLOCKs .
*/
/**
* memblock_region_base_pfn - Return the lowest pfn intersecting with the region
* @ reg : memblock_region structure
*/
static inline unsigned long memblock_region_base_pfn ( const struct memblock_region * reg )
{
return reg - > base > > PAGE_SHIFT ;
}
/**
* memblock_region_last_pfn - Return the highest pfn intersecting with the region
* @ reg : memblock_region structure
*/
static inline unsigned long memblock_region_last_pfn ( const struct memblock_region * reg )
{
return ( reg - > base + reg - > size - 1 ) > > PAGE_SHIFT ;
}
/**
* memblock_region_end_pfn - Return the pfn of the first page following the region
* but not intersecting it
* @ reg : memblock_region structure
*/
static inline unsigned long memblock_region_end_pfn ( const struct memblock_region * reg )
{
return memblock_region_last_pfn ( reg ) + 1 ;
}
/**
* memblock_region_pages - Return the number of pages covering a region
* @ reg : memblock_region structure
*/
static inline unsigned long memblock_region_pages ( const struct memblock_region * reg )
{
return memblock_region_end_pfn ( reg ) - memblock_region_end_pfn ( reg ) ;
}
# define for_each_memblock(memblock_type, region) \
for ( region = memblock . memblock_type . regions ; \
region < ( memblock . memblock_type . regions + memblock . memblock_type . cnt ) ; \
region + + )
# endif /* __KERNEL__ */
# endif /* _LINUX_MEMBLOCK_H */