Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __ASM_MEMORY_MODEL_H
0003 #define __ASM_MEMORY_MODEL_H
0004 
0005 #include <linux/pfn.h>
0006 
0007 #ifndef __ASSEMBLY__
0008 
0009 /*
0010  * supports 3 memory models.
0011  */
0012 #if defined(CONFIG_FLATMEM)
0013 
0014 #ifndef ARCH_PFN_OFFSET
0015 #define ARCH_PFN_OFFSET     (0UL)
0016 #endif
0017 
0018 #define __pfn_to_page(pfn)  (mem_map + ((pfn) - ARCH_PFN_OFFSET))
0019 #define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \
0020                  ARCH_PFN_OFFSET)
0021 
0022 #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
0023 
0024 /* memmap is virtually contiguous.  */
0025 #define __pfn_to_page(pfn)  (vmemmap + (pfn))
0026 #define __page_to_pfn(page) (unsigned long)((page) - vmemmap)
0027 
0028 #elif defined(CONFIG_SPARSEMEM)
0029 /*
0030  * Note: section's mem_map is encoded to reflect its start_pfn.
0031  * section[i].section_mem_map == mem_map's address - start_pfn;
0032  */
0033 #define __page_to_pfn(pg)                   \
0034 ({  const struct page *__pg = (pg);             \
0035     int __sec = page_to_section(__pg);          \
0036     (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \
0037 })
0038 
0039 #define __pfn_to_page(pfn)              \
0040 ({  unsigned long __pfn = (pfn);            \
0041     struct mem_section *__sec = __pfn_to_section(__pfn);    \
0042     __section_mem_map_addr(__sec) + __pfn;      \
0043 })
0044 #endif /* CONFIG_FLATMEM/SPARSEMEM */
0045 
0046 /*
0047  * Convert a physical address to a Page Frame Number and back
0048  */
0049 #define __phys_to_pfn(paddr)    PHYS_PFN(paddr)
0050 #define __pfn_to_phys(pfn)  PFN_PHYS(pfn)
0051 
0052 #define page_to_pfn __page_to_pfn
0053 #define pfn_to_page __pfn_to_page
0054 
0055 #endif /* __ASSEMBLY__ */
0056 
0057 #endif