X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-alpha%2Fmmzone.h;fp=include%2Fasm-alpha%2Fmmzone.h;h=a011ef4cf3d3f4ee5ee16c320cc3bbed622e3b7f;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=64d0ab98fcd8da6e7bd1765c8572512fb02e9e7d;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/include/asm-alpha/mmzone.h b/include/asm-alpha/mmzone.h index 64d0ab98f..a011ef4cf 100644 --- a/include/asm-alpha/mmzone.h +++ b/include/asm-alpha/mmzone.h @@ -5,6 +5,7 @@ #ifndef _ASM_MMZONE_H_ #define _ASM_MMZONE_H_ +#include #include struct bootmem_data_t; /* stupid forward decl. */ @@ -58,6 +59,9 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) #define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr)) #define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) +#define local_mapnr(kvaddr) \ + ((__pa(kvaddr) >> PAGE_SHIFT) - node_start_pfn(kvaddr_to_nid(kvaddr))) + /* * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory * and returns the kaddr corresponding to first physical page in the @@ -82,7 +86,8 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) pte_t pte; \ unsigned long pfn; \ \ - pfn = page_to_pfn(page) << 32; \ + pfn = ((unsigned long)((page)-page_zone(page)->zone_mem_map)) << 32; \ + pfn += page_zone(page)->zone_start_pfn << 32; \ pte_val(pte) = pfn | pgprot_val(pgprot); \ \ pte; \ @@ -99,8 +104,19 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n) __xx; \ }) +#define pfn_to_page(pfn) \ +({ \ + unsigned long kaddr = (unsigned long)__va((pfn) << PAGE_SHIFT); \ + (NODE_DATA(kvaddr_to_nid(kaddr))->node_mem_map + local_mapnr(kaddr)); \ +}) + +#define page_to_pfn(page) \ + ((page) - page_zone(page)->zone_mem_map + \ + (page_zone(page)->zone_start_pfn)) + #define page_to_pa(page) \ - (page_to_pfn(page) << PAGE_SHIFT) + ((( (page) - page_zone(page)->zone_mem_map ) \ + + page_zone(page)->zone_start_pfn) << PAGE_SHIFT) #define pfn_to_nid(pfn) pa_to_nid(((u64)(pfn) << PAGE_SHIFT)) #define pfn_valid(pfn) \