^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __ASM_MEMORY_MODEL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __ASM_MEMORY_MODEL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/pfn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #if defined(CONFIG_FLATMEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef ARCH_PFN_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define ARCH_PFN_OFFSET (0UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #elif defined(CONFIG_DISCONTIGMEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #ifndef arch_pfn_to_nid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define arch_pfn_to_nid(pfn) pfn_to_nid(pfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #ifndef arch_local_page_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define arch_local_page_offset(pfn, nid) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ((pfn) - NODE_DATA(nid)->node_start_pfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #endif /* CONFIG_DISCONTIGMEM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * supports 3 memory models.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #if defined(CONFIG_FLATMEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ARCH_PFN_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #elif defined(CONFIG_DISCONTIGMEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define __pfn_to_page(pfn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ({ unsigned long __pfn = (pfn); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) unsigned long __nid = arch_pfn_to_nid(__pfn); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define __page_to_pfn(pg) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ({ const struct page *__pg = (pg); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) (unsigned long)(__pg - __pgdat->node_mem_map) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) __pgdat->node_start_pfn; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* memmap is virtually contiguous. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define __pfn_to_page(pfn) (vmemmap + (pfn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define __page_to_pfn(page) (unsigned long)((page) - vmemmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #elif defined(CONFIG_SPARSEMEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * Note: section's mem_map is encoded to reflect its start_pfn.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * section[i].section_mem_map == mem_map's address - start_pfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define __page_to_pfn(pg) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ({ const struct page *__pg = (pg); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int __sec = page_to_section(__pg); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define __pfn_to_page(pfn) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) ({ unsigned long __pfn = (pfn); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct mem_section *__sec = __pfn_to_section(__pfn); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) __section_mem_map_addr(__sec) + __pfn; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * Convert a physical address to a Page Frame Number and back
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define __phys_to_pfn(paddr) PHYS_PFN(paddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define __pfn_to_phys(pfn) PFN_PHYS(pfn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define page_to_pfn __page_to_pfn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define pfn_to_page __pfn_to_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #endif