Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

asm-generic: provide generic page_to_phys and phys_to_page implementations

page_to_phys is duplicated by all architectures, and from some strange
reason placed in <asm/io.h> where it doesn't fit at all.

phys_to_page is only provided by a few architectures despite having a lot
of open coded users.

Provide generic versions in <asm-generic/memory_model.h> to make these
helpers more easily usable.

Note with this patch powerpc loses the CONFIG_DEBUG_VIRTUAL pfn_valid
check. It will be added back in a generic version later.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Christoph Hellwig and committed by
Arnd Bergmann
c5c3238d 6f043e75

+3 -71
-1
arch/alpha/include/asm/io.h
··· 88 88 89 89 #define virt_to_phys virt_to_phys 90 90 #define phys_to_virt phys_to_virt 91 - #define page_to_phys(page) page_to_pa(page) 92 91 93 92 /* Maximum PIO space address supported? */ 94 93 #define IO_SPACE_LIMIT 0xffff
-3
arch/arc/include/asm/io.h
··· 42 42 #define iowrite16be(v,p) ({ __iowmb(); __raw_writew((__force u16)cpu_to_be16(v), p); }) 43 43 #define iowrite32be(v,p) ({ __iowmb(); __raw_writel((__force u32)cpu_to_be32(v), p); }) 44 44 45 - /* Change struct page to physical address */ 46 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 47 - 48 45 #define __raw_readb __raw_readb 49 46 static inline u8 __raw_readb(const volatile void __iomem *addr) 50 47 {
-6
arch/arm/include/asm/memory.h
··· 148 148 #endif 149 149 150 150 /* 151 - * Convert a page to/from a physical address 152 - */ 153 - #define page_to_phys(page) (__pfn_to_phys(page_to_pfn(page))) 154 - #define phys_to_page(phys) (pfn_to_page(__phys_to_pfn(phys))) 155 - 156 - /* 157 151 * PLAT_PHYS_OFFSET is the offset (from zero) of the start of physical 158 152 * memory. This is used for XIP and NoMMU kernels, and on platforms that don't 159 153 * have CONFIG_ARM_PATCH_PHYS_VIRT. Assembly code must always use
-6
arch/arm64/include/asm/memory.h
··· 354 354 #define __phys_to_kimg(x) ((unsigned long)((x) + kimage_voffset)) 355 355 356 356 /* 357 - * Convert a page to/from a physical address 358 - */ 359 - #define page_to_phys(page) (__pfn_to_phys(page_to_pfn(page))) 360 - #define phys_to_page(phys) (pfn_to_page(__phys_to_pfn(phys))) 361 - 362 - /* 363 357 * Note: Drivers should NOT use these. They are the wrong 364 358 * translation for translating DMA addresses. Use the driver 365 359 * DMA support - see dma-mapping.h.
-3
arch/csky/include/asm/page.h
··· 43 43 #define clear_page(page) memset((page), 0, PAGE_SIZE) 44 44 #define copy_page(to, from) memcpy((to), (from), PAGE_SIZE) 45 45 46 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 47 - #define phys_to_page(paddr) (pfn_to_page(PFN_DOWN(paddr))) 48 - 49 46 struct page; 50 47 51 48 #include <abi/page.h>
-6
arch/hexagon/include/asm/page.h
··· 118 118 #define clear_user_page(page, vaddr, pg) clear_page(page) 119 119 #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) 120 120 121 - /* 122 - * page_to_phys - convert page to physical address 123 - * @page - pointer to page entry in mem_map 124 - */ 125 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 126 - 127 121 static inline unsigned long virt_to_pfn(const void *kaddr) 128 122 { 129 123 return __pa(kaddr) >> PAGE_SHIFT;
-3
arch/loongarch/include/asm/page.h
··· 81 81 #define pfn_to_phys(pfn) __pfn_to_phys(pfn) 82 82 #define phys_to_pfn(paddr) __phys_to_pfn(paddr) 83 83 84 - #define page_to_phys(page) pfn_to_phys(page_to_pfn(page)) 85 - #define phys_to_page(paddr) pfn_to_page(phys_to_pfn(paddr)) 86 - 87 84 #ifndef CONFIG_KFENCE 88 85 89 86 #define page_to_virt(page) __va(page_to_phys(page))
-3
arch/m68k/include/asm/virtconvert.h
··· 28 28 return __va(address); 29 29 } 30 30 31 - /* Permanent address of a page. */ 32 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 33 - 34 31 /* 35 32 * IO bus memory addresses are 1:1 with the physical address, 36 33 * deprecated globally but still used on two machines.
-1
arch/microblaze/include/asm/page.h
··· 101 101 102 102 # define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) 103 103 # define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT) 104 - # define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 105 104 106 105 # define ARCH_PFN_OFFSET (memory_start >> PAGE_SHIFT) 107 106 # endif /* __ASSEMBLY__ */
-5
arch/mips/include/asm/io.h
··· 125 125 return virt_to_phys(address); 126 126 } 127 127 128 - /* 129 - * Change "struct page" to physical address. 130 - */ 131 - #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) 132 - 133 128 void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size, 134 129 unsigned long prot_val); 135 130 void iounmap(const volatile void __iomem *addr);
-3
arch/nios2/include/asm/io.h
··· 28 28 void __iomem *ioremap(unsigned long physaddr, unsigned long size); 29 29 void iounmap(void __iomem *addr); 30 30 31 - /* Pages to physical address... */ 32 - #define page_to_phys(page) virt_to_phys(page_to_virt(page)) 33 - 34 31 /* Macros used for converting between virtual and physical mappings. */ 35 32 #define phys_to_virt(vaddr) \ 36 33 ((void *)((unsigned long)(vaddr) | CONFIG_NIOS2_KERNEL_REGION_BASE))
-2
arch/openrisc/include/asm/page.h
··· 80 80 #define virt_to_page(addr) \ 81 81 (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)) 82 82 83 - #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) 84 - 85 83 #define virt_addr_valid(kaddr) (pfn_valid(virt_to_pfn(kaddr))) 86 84 87 85 #endif /* __ASSEMBLY__ */
-1
arch/parisc/include/asm/page.h
··· 168 168 169 169 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) 170 170 171 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 172 171 #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) 173 172 174 173 #include <asm-generic/memory_model.h>
-12
arch/powerpc/include/asm/io.h
··· 970 970 #define phys_to_virt phys_to_virt 971 971 972 972 /* 973 - * Change "struct page" to physical address. 974 - */ 975 - static inline phys_addr_t page_to_phys(struct page *page) 976 - { 977 - unsigned long pfn = page_to_pfn(page); 978 - 979 - WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !pfn_valid(pfn)); 980 - 981 - return PFN_PHYS(pfn); 982 - } 983 - 984 - /* 985 973 * 32 bits still uses virt_to_bus() for its implementation of DMA 986 974 * mappings se we have to keep it defined here. We also have some old 987 975 * drivers (shame shame shame) that use bus_to_virt() and haven't been
-3
arch/riscv/include/asm/page.h
··· 194 194 #define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) 195 195 #define page_to_virt(page) (pfn_to_virt(page_to_pfn(page))) 196 196 197 - #define page_to_phys(page) (pfn_to_phys(page_to_pfn(page))) 198 - #define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) 199 - 200 197 #define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x)) 201 198 202 199 unsigned long kaslr_offset(void);
-2
arch/s390/include/asm/page.h
··· 245 245 #define phys_to_pfn(phys) ((phys) >> PAGE_SHIFT) 246 246 #define pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) 247 247 248 - #define phys_to_page(phys) pfn_to_page(phys_to_pfn(phys)) 249 248 #define phys_to_folio(phys) page_folio(phys_to_page(phys)) 250 - #define page_to_phys(page) pfn_to_phys(page_to_pfn(page)) 251 249 #define folio_to_phys(page) pfn_to_phys(folio_pfn(folio)) 252 250 253 251 static inline void *pfn_to_virt(unsigned long pfn)
-1
arch/sh/include/asm/page.h
··· 147 147 #endif 148 148 149 149 #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) 150 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 151 150 152 151 /* 153 152 * PFN = physical frame number (ie PFN 0 == physical address 0)
-2
arch/sparc/include/asm/page.h
··· 2 2 #ifndef ___ASM_SPARC_PAGE_H 3 3 #define ___ASM_SPARC_PAGE_H 4 4 5 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 6 - 7 5 #if defined(__sparc__) && defined(__arch64__) 8 6 #include <asm/page_64.h> 9 7 #else
-2
arch/um/include/asm/pgtable.h
··· 287 287 * and a page entry and page directory to the page they refer to. 288 288 */ 289 289 290 - #define phys_to_page(phys) pfn_to_page(phys_to_pfn(phys)) 291 290 #define __virt_to_page(virt) phys_to_page(__pa(virt)) 292 - #define page_to_phys(page) pfn_to_phys(page_to_pfn(page)) 293 291 #define virt_to_page(addr) __virt_to_page((const unsigned long) addr) 294 292 295 293 #define mk_pte(page, pgprot) \
-5
arch/x86/include/asm/io.h
··· 152 152 #define phys_to_virt phys_to_virt 153 153 154 154 /* 155 - * Change "struct page" to physical address. 156 - */ 157 - #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) 158 - 159 - /* 160 155 * ISA I/O bus memory addresses are 1:1 with the physical address. 161 156 * However, we truncate the address to unsigned int to avoid undesirable 162 157 * promotions in legacy drivers.
-1
arch/xtensa/include/asm/page.h
··· 195 195 #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) 196 196 #define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT) 197 197 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) 198 - #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 199 198 200 199 #endif /* __ASSEMBLY__ */ 201 200
+3
include/asm-generic/memory_model.h
··· 64 64 #define page_to_pfn __page_to_pfn 65 65 #define pfn_to_page __pfn_to_page 66 66 67 + #define page_to_phys(page) PFN_PHYS(page_to_pfn(page)) 68 + #define phys_to_page(phys) pfn_to_page(PHYS_PFN(phys)) 69 + 67 70 #endif /* __ASSEMBLY__ */ 68 71 69 72 #endif