18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_MEMORY_MODEL_H
38c2ecf20Sopenharmony_ci#define __ASM_MEMORY_MODEL_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/pfn.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#if defined(CONFIG_FLATMEM)
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#ifndef ARCH_PFN_OFFSET
128c2ecf20Sopenharmony_ci#define ARCH_PFN_OFFSET		(0UL)
138c2ecf20Sopenharmony_ci#endif
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#elif defined(CONFIG_DISCONTIGMEM)
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#ifndef arch_pfn_to_nid
188c2ecf20Sopenharmony_ci#define arch_pfn_to_nid(pfn)	pfn_to_nid(pfn)
198c2ecf20Sopenharmony_ci#endif
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#ifndef arch_local_page_offset
228c2ecf20Sopenharmony_ci#define arch_local_page_offset(pfn, nid)	\
238c2ecf20Sopenharmony_ci	((pfn) - NODE_DATA(nid)->node_start_pfn)
248c2ecf20Sopenharmony_ci#endif
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#endif /* CONFIG_DISCONTIGMEM */
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/*
298c2ecf20Sopenharmony_ci * supports 3 memory models.
308c2ecf20Sopenharmony_ci */
318c2ecf20Sopenharmony_ci#if defined(CONFIG_FLATMEM)
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#define __pfn_to_page(pfn)	(mem_map + ((pfn) - ARCH_PFN_OFFSET))
348c2ecf20Sopenharmony_ci#define __page_to_pfn(page)	((unsigned long)((page) - mem_map) + \
358c2ecf20Sopenharmony_ci				 ARCH_PFN_OFFSET)
368c2ecf20Sopenharmony_ci#elif defined(CONFIG_DISCONTIGMEM)
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci#define __pfn_to_page(pfn)			\
398c2ecf20Sopenharmony_ci({	unsigned long __pfn = (pfn);		\
408c2ecf20Sopenharmony_ci	unsigned long __nid = arch_pfn_to_nid(__pfn);  \
418c2ecf20Sopenharmony_ci	NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\
428c2ecf20Sopenharmony_ci})
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#define __page_to_pfn(pg)						\
458c2ecf20Sopenharmony_ci({	const struct page *__pg = (pg);					\
468c2ecf20Sopenharmony_ci	struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg));	\
478c2ecf20Sopenharmony_ci	(unsigned long)(__pg - __pgdat->node_mem_map) +			\
488c2ecf20Sopenharmony_ci	 __pgdat->node_start_pfn;					\
498c2ecf20Sopenharmony_ci})
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#elif defined(CONFIG_SPARSEMEM_VMEMMAP)
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci/* memmap is virtually contiguous.  */
548c2ecf20Sopenharmony_ci#define __pfn_to_page(pfn)	(vmemmap + (pfn))
558c2ecf20Sopenharmony_ci#define __page_to_pfn(page)	(unsigned long)((page) - vmemmap)
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#elif defined(CONFIG_SPARSEMEM)
588c2ecf20Sopenharmony_ci/*
598c2ecf20Sopenharmony_ci * Note: section's mem_map is encoded to reflect its start_pfn.
608c2ecf20Sopenharmony_ci * section[i].section_mem_map == mem_map's address - start_pfn;
618c2ecf20Sopenharmony_ci */
628c2ecf20Sopenharmony_ci#define __page_to_pfn(pg)					\
638c2ecf20Sopenharmony_ci({	const struct page *__pg = (pg);				\
648c2ecf20Sopenharmony_ci	int __sec = page_to_section(__pg);			\
658c2ecf20Sopenharmony_ci	(unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec)));	\
668c2ecf20Sopenharmony_ci})
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#define __pfn_to_page(pfn)				\
698c2ecf20Sopenharmony_ci({	unsigned long __pfn = (pfn);			\
708c2ecf20Sopenharmony_ci	struct mem_section *__sec = __pfn_to_section(__pfn);	\
718c2ecf20Sopenharmony_ci	__section_mem_map_addr(__sec) + __pfn;		\
728c2ecf20Sopenharmony_ci})
738c2ecf20Sopenharmony_ci#endif /* CONFIG_FLATMEM/DISCONTIGMEM/SPARSEMEM */
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci/*
768c2ecf20Sopenharmony_ci * Convert a physical address to a Page Frame Number and back
778c2ecf20Sopenharmony_ci */
788c2ecf20Sopenharmony_ci#define	__phys_to_pfn(paddr)	PHYS_PFN(paddr)
798c2ecf20Sopenharmony_ci#define	__pfn_to_phys(pfn)	PFN_PHYS(pfn)
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#define page_to_pfn __page_to_pfn
828c2ecf20Sopenharmony_ci#define pfn_to_page __pfn_to_page
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci#endif
87