]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
asm-generic: provide generic page_to_phys and phys_to_page implementations
authorChristoph Hellwig <hch@lst.de>
Wed, 23 Oct 2024 05:36:36 +0000 (07:36 +0200)
committerArnd Bergmann <arnd@arndb.de>
Mon, 28 Oct 2024 21:44:28 +0000 (21:44 +0000)
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>
22 files changed:
arch/alpha/include/asm/io.h
arch/arc/include/asm/io.h
arch/arm/include/asm/memory.h
arch/arm64/include/asm/memory.h
arch/csky/include/asm/page.h
arch/hexagon/include/asm/page.h
arch/loongarch/include/asm/page.h
arch/m68k/include/asm/virtconvert.h
arch/microblaze/include/asm/page.h
arch/mips/include/asm/io.h
arch/nios2/include/asm/io.h
arch/openrisc/include/asm/page.h
arch/parisc/include/asm/page.h
arch/powerpc/include/asm/io.h
arch/riscv/include/asm/page.h
arch/s390/include/asm/page.h
arch/sh/include/asm/page.h
arch/sparc/include/asm/page.h
arch/um/include/asm/pgtable.h
arch/x86/include/asm/io.h
arch/xtensa/include/asm/page.h
include/asm-generic/memory_model.h

index b191d87f89c4012849276b7b7b67c69ed974778a..65fe1e54c6da09488ea763e7e6ec4bf13ea1e2fc 100644 (file)
@@ -88,7 +88,6 @@ static inline void * phys_to_virt(unsigned long address)
 
 #define virt_to_phys           virt_to_phys
 #define phys_to_virt           phys_to_virt
-#define page_to_phys(page)     page_to_pa(page)
 
 /* Maximum PIO space address supported?  */
 #define IO_SPACE_LIMIT 0xffff
index f57cb5a6b624038cc371d18f1f228553844e6981..00171a212b3cb27b6a9a10a187a9af6e3acfa475 100644 (file)
@@ -42,9 +42,6 @@ static inline void ioport_unmap(void __iomem *addr)
 #define iowrite16be(v,p)       ({ __iowmb(); __raw_writew((__force u16)cpu_to_be16(v), p); })
 #define iowrite32be(v,p)       ({ __iowmb(); __raw_writel((__force u32)cpu_to_be32(v), p); })
 
-/* Change struct page to physical address */
-#define page_to_phys(page)             (page_to_pfn(page) << PAGE_SHIFT)
-
 #define __raw_readb __raw_readb
 static inline u8 __raw_readb(const volatile void __iomem *addr)
 {
index ef2aa79ece5ad53472d64961a4c5b28eb4a9f84a..7c2fa7dcec6d4bf4002a07558ae59a5c2985df45 100644 (file)
@@ -147,12 +147,6 @@ extern unsigned long vectors_base;
 #define DTCM_OFFSET    UL(0xfffe8000)
 #endif
 
-/*
- * Convert a page to/from a physical address
- */
-#define page_to_phys(page)     (__pfn_to_phys(page_to_pfn(page)))
-#define phys_to_page(phys)     (pfn_to_page(__phys_to_pfn(phys)))
-
 /*
  * PLAT_PHYS_OFFSET is the offset (from zero) of the start of physical
  * memory.  This is used for XIP and NoMMU kernels, and on platforms that don't
index 0480c61dbb4f30f592cdd27f08a51ff01bd940b2..b9b992908a569c6c6797117c3e21f0d61d4f06b4 100644 (file)
@@ -353,12 +353,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
 #define __phys_to_virt(x)      ((unsigned long)((x) - PHYS_OFFSET) | PAGE_OFFSET)
 #define __phys_to_kimg(x)      ((unsigned long)((x) + kimage_voffset))
 
-/*
- * Convert a page to/from a physical address
- */
-#define page_to_phys(page)     (__pfn_to_phys(page_to_pfn(page)))
-#define phys_to_page(phys)     (pfn_to_page(__phys_to_pfn(phys)))
-
 /*
  * Note: Drivers should NOT use these.  They are the wrong
  * translation for translating DMA addresses.  Use the driver
index 0ca6c408c07f27ee76398a9dc0ae502813e17408..a5afdfe27dc62d1f5880133c4a0e4da6dcfb0572 100644 (file)
@@ -43,9 +43,6 @@ extern void *memcpy(void *to, const void *from, size_t l);
 #define clear_page(page)       memset((page), 0, PAGE_SIZE)
 #define copy_page(to, from)    memcpy((to), (from), PAGE_SIZE)
 
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
-#define phys_to_page(paddr)    (pfn_to_page(PFN_DOWN(paddr)))
-
 struct page;
 
 #include <abi/page.h>
index 8a6af57274c2dbc271da1105afa7bf7b5c00f8e3..aba4d790130518ac6e2f21a72e4c9d8a2dc65217 100644 (file)
@@ -118,12 +118,6 @@ static inline void clear_page(void *page)
 #define clear_user_page(page, vaddr, pg)       clear_page(page)
 #define copy_user_page(to, from, vaddr, pg)    copy_page(to, from)
 
-/*
- * page_to_phys - convert page to physical address
- * @page - pointer to page entry in mem_map
- */
-#define page_to_phys(page)      (page_to_pfn(page) << PAGE_SHIFT)
-
 static inline unsigned long virt_to_pfn(const void *kaddr)
 {
        return __pa(kaddr) >> PAGE_SHIFT;
index e85df33f11c77212c2e8ec8e6b3f1dbb955bc622..8b4e6b280f2b86d2cf6a8d93d7637bb11cdbefe1 100644 (file)
@@ -81,9 +81,6 @@ struct page *tlb_virt_to_page(unsigned long kaddr);
 #define pfn_to_phys(pfn)       __pfn_to_phys(pfn)
 #define phys_to_pfn(paddr)     __phys_to_pfn(paddr)
 
-#define page_to_phys(page)     pfn_to_phys(page_to_pfn(page))
-#define phys_to_page(paddr)    pfn_to_page(phys_to_pfn(paddr))
-
 #ifndef CONFIG_KFENCE
 
 #define page_to_virt(page)     __va(page_to_phys(page))
index 0a27905b0036ff8d3dc42c1e9c6967eb4b532fa8..32e27bddb7d4309771e79c6d5efb55291d7a8767 100644 (file)
@@ -28,9 +28,6 @@ static inline void *phys_to_virt(unsigned long address)
        return __va(address);
 }
 
-/* Permanent address of a page. */
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
-
 /*
  * IO bus memory addresses are 1:1 with the physical address,
  * deprecated globally but still used on two machines.
index 8810f4f1c3b02d347592a320a50c14546a2fb360..ecd4bf2779a0bb98961285426654fe9fa74cc681 100644 (file)
@@ -101,7 +101,6 @@ extern int page_is_ram(unsigned long pfn);
 
 #  define virt_to_page(kaddr)  (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT))
 #  define page_to_virt(page)   __va(page_to_pfn(page) << PAGE_SHIFT)
-#  define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 
 #  define ARCH_PFN_OFFSET      (memory_start >> PAGE_SHIFT)
 # endif /* __ASSEMBLY__ */
index af58d6ae06b85ea1f36ecc1cc676f9352d4a3ed1..0bddb568af7c1cce9761bcb0face5de993cebc57 100644 (file)
@@ -125,11 +125,6 @@ static inline unsigned long isa_virt_to_bus(volatile void *address)
        return virt_to_phys(address);
 }
 
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_phys(page)     ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
-
 void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size,
                unsigned long prot_val);
 void iounmap(const volatile void __iomem *addr);
index 746853ac7d8d382a7e21c182cb8162959dcd6ead..36e3550673b34bc8f36df994af624bf2ac886a6b 100644 (file)
@@ -28,9 +28,6 @@
 void __iomem *ioremap(unsigned long physaddr, unsigned long size);
 void iounmap(void __iomem *addr);
 
-/* Pages to physical address... */
-#define page_to_phys(page)     virt_to_phys(page_to_virt(page))
-
 /* Macros used for converting between virtual and physical mappings. */
 #define phys_to_virt(vaddr)    \
        ((void *)((unsigned long)(vaddr) | CONFIG_NIOS2_KERNEL_REGION_BASE))
index 1d5913f67c312f8691b697e92290b7d5d7f2b0e8..45d6c440729ce335bcbb80394b0ed4e412d07397 100644 (file)
@@ -80,8 +80,6 @@ static inline unsigned long virt_to_pfn(const void *kaddr)
 #define virt_to_page(addr) \
        (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
 
-#define page_to_phys(page)      ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
-
 #define virt_addr_valid(kaddr) (pfn_valid(virt_to_pfn(kaddr)))
 
 #endif /* __ASSEMBLY__ */
index 4bea2e95798f02f4904d42e3cc6b69bfc60f1c0e..6cb5b02aca9a770960af903e7ec9402cd589534a 100644 (file)
@@ -168,7 +168,6 @@ extern int npmem_ranges;
 
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 #define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 
 #include <asm-generic/memory_model.h>
index 52e1b1d15ff63a9d9292dce3995db104dfc6fb48..fd92ac4501693cdfc6aaa3de0caed95c009e82fa 100644 (file)
@@ -969,18 +969,6 @@ static inline void * phys_to_virt(unsigned long address)
 }
 #define phys_to_virt phys_to_virt
 
-/*
- * Change "struct page" to physical address.
- */
-static inline phys_addr_t page_to_phys(struct page *page)
-{
-       unsigned long pfn = page_to_pfn(page);
-
-       WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !pfn_valid(pfn));
-
-       return PFN_PHYS(pfn);
-}
-
 /*
  * 32 bits still uses virt_to_bus() for its implementation of DMA
  * mappings se we have to keep it defined here. We also have some old
index 32d308a3355fd413743bdef7cb74f7d46ce3724b..16f4141f005561aea20050e84c41bc90f1225771 100644 (file)
@@ -194,9 +194,6 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x);
 #define virt_to_page(vaddr)    (pfn_to_page(virt_to_pfn(vaddr)))
 #define page_to_virt(page)     (pfn_to_virt(page_to_pfn(page)))
 
-#define page_to_phys(page)     (pfn_to_phys(page_to_pfn(page)))
-#define phys_to_page(paddr)    (pfn_to_page(phys_to_pfn(paddr)))
-
 #define sym_to_pfn(x)           __phys_to_pfn(__pa_symbol(x))
 
 unsigned long kaslr_offset(void);
index 73e1e03317b433d4a737926706998781a0cc5003..16d62a4eccccef3dd548d5f5d69069445121eac8 100644 (file)
@@ -245,9 +245,7 @@ static inline unsigned long __phys_addr(unsigned long x, bool is_31bit)
 #define phys_to_pfn(phys)      ((phys) >> PAGE_SHIFT)
 #define pfn_to_phys(pfn)       ((pfn) << PAGE_SHIFT)
 
-#define phys_to_page(phys)     pfn_to_page(phys_to_pfn(phys))
 #define phys_to_folio(phys)    page_folio(phys_to_page(phys))
-#define page_to_phys(page)     pfn_to_phys(page_to_pfn(page))
 #define folio_to_phys(page)    pfn_to_phys(folio_pfn(folio))
 
 static inline void *pfn_to_virt(unsigned long pfn)
index f780b467e75d7c38316baf1a1beb8707f1fc6d91..4e82ea84a06fce5f83d762d0c39013f0e713fb35 100644 (file)
@@ -147,7 +147,6 @@ typedef struct page *pgtable_t;
 #endif
 
 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 
 /*
  * PFN = physical frame number (ie PFN 0 == physical address 0)
index 5e44cdf2a8f2bd898281a12b10a758ccfafcde04..1a00cc0a1893ebab237f3d3114c12297fee95a8f 100644 (file)
@@ -2,8 +2,6 @@
 #ifndef ___ASM_SPARC_PAGE_H
 #define ___ASM_SPARC_PAGE_H
 
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
-
 #if defined(__sparc__) && defined(__arch64__)
 #include <asm/page_64.h>
 #else
index 83373c9963e7c9eb69f07ee5953b52eaa6a21a1b..faab5a2a4b061fbf60a2257244d812eec66309b5 100644 (file)
@@ -287,9 +287,7 @@ static inline int pte_same(pte_t pte_a, pte_t pte_b)
  * and a page entry and page directory to the page they refer to.
  */
 
-#define phys_to_page(phys) pfn_to_page(phys_to_pfn(phys))
 #define __virt_to_page(virt) phys_to_page(__pa(virt))
-#define page_to_phys(page) pfn_to_phys(page_to_pfn(page))
 #define virt_to_page(addr) __virt_to_page((const unsigned long) addr)
 
 #define mk_pte(page, pgprot) \
index 1d60427379c9399c26cbd53c28a016167eec0f27..ed580c7f9d0aaf7a3e3df81ddb92f0950b5e8d28 100644 (file)
@@ -151,11 +151,6 @@ static inline void *phys_to_virt(phys_addr_t address)
 }
 #define phys_to_virt phys_to_virt
 
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_phys(page)    ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
-
 /*
  * ISA I/O bus memory addresses are 1:1 with the physical address.
  * However, we truncate the address to unsigned int to avoid undesirable
index 4db56ef052d2235eb35ea712026615d0cf66859b..dc3d5b094ecd980780e979f5e257242904974e33 100644 (file)
@@ -195,7 +195,6 @@ static inline unsigned long ___pa(unsigned long va)
 #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 #define page_to_virt(page)     __va(page_to_pfn(page) << PAGE_SHIFT)
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
 
 #endif /* __ASSEMBLY__ */
 
index 6796abe1900e30c9e169292c50702d57294184de..a73a140cbecdd7462aa7e106e835423589c292b0 100644 (file)
@@ -64,6 +64,9 @@ static inline int pfn_valid(unsigned long pfn)
 #define page_to_pfn __page_to_pfn
 #define pfn_to_page __pfn_to_page
 
+#define page_to_phys(page)     PFN_PHYS(page_to_pfn(page))
+#define phys_to_page(phys)     pfn_to_page(PHYS_PFN(phys))
+
 #endif /* __ASSEMBLY__ */
 
 #endif