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