xref: /OK3568_Linux_fs/kernel/arch/nds32/include/asm/memory.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun // Copyright (C) 2005-2017 Andes Technology Corporation
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef __ASM_NDS32_MEMORY_H
5*4882a593Smuzhiyun #define __ASM_NDS32_MEMORY_H
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/compiler.h>
8*4882a593Smuzhiyun #include <linux/sizes.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef __ASSEMBLY__
11*4882a593Smuzhiyun #include <asm/page.h>
12*4882a593Smuzhiyun #endif
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifndef PHYS_OFFSET
15*4882a593Smuzhiyun #define PHYS_OFFSET     (0x0)
16*4882a593Smuzhiyun #endif
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun  * TASK_SIZE - the maximum size of a user space task.
20*4882a593Smuzhiyun  * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun #define TASK_SIZE		((CONFIG_PAGE_OFFSET) - (SZ_32M))
23*4882a593Smuzhiyun #define TASK_UNMAPPED_BASE	ALIGN(TASK_SIZE / 3, SZ_32M)
24*4882a593Smuzhiyun #define PAGE_OFFSET		(CONFIG_PAGE_OFFSET)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /*
27*4882a593Smuzhiyun  * Physical vs virtual RAM address space conversion.  These are
28*4882a593Smuzhiyun  * private definitions which should NOT be used outside memory.h
29*4882a593Smuzhiyun  * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun #ifndef __virt_to_phys
32*4882a593Smuzhiyun #define __virt_to_phys(x)	((x) - PAGE_OFFSET + PHYS_OFFSET)
33*4882a593Smuzhiyun #define __phys_to_virt(x)	((x) - PHYS_OFFSET + PAGE_OFFSET)
34*4882a593Smuzhiyun #endif
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * The module space lives between the addresses given by TASK_SIZE
38*4882a593Smuzhiyun  * and PAGE_OFFSET - it must be within 32MB of the kernel text.
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #define MODULES_END	(PAGE_OFFSET)
41*4882a593Smuzhiyun #define MODULES_VADDR	(MODULES_END - SZ_32M)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #if TASK_SIZE > MODULES_VADDR
44*4882a593Smuzhiyun #error Top of user space clashes with start of module space
45*4882a593Smuzhiyun #endif
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #ifndef __ASSEMBLY__
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun  * PFNs are used to describe any physical page; this means
51*4882a593Smuzhiyun  * PFN 0 == physical address 0.
52*4882a593Smuzhiyun  *
53*4882a593Smuzhiyun  * This is the PFN of the first RAM page in the kernel
54*4882a593Smuzhiyun  * direct-mapped view.  We assume this is the first page
55*4882a593Smuzhiyun  * of RAM in the mem_map as well.
56*4882a593Smuzhiyun  */
57*4882a593Smuzhiyun #define PHYS_PFN_OFFSET	(PHYS_OFFSET >> PAGE_SHIFT)
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /*
60*4882a593Smuzhiyun  * Drivers should NOT use these either.
61*4882a593Smuzhiyun  */
62*4882a593Smuzhiyun #define __pa(x)			__virt_to_phys((unsigned long)(x))
63*4882a593Smuzhiyun #define __va(x)			((void *)__phys_to_virt((unsigned long)(x)))
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun  * Conversion between a struct page and a physical address.
67*4882a593Smuzhiyun  *
68*4882a593Smuzhiyun  * Note: when converting an unknown physical address to a
69*4882a593Smuzhiyun  * struct page, the resulting pointer must be validated
70*4882a593Smuzhiyun  * using VALID_PAGE().  It must return an invalid struct page
71*4882a593Smuzhiyun  * for any physical address not corresponding to a system
72*4882a593Smuzhiyun  * RAM address.
73*4882a593Smuzhiyun  *
74*4882a593Smuzhiyun  *  pfn_valid(pfn)	indicates whether a PFN number is valid
75*4882a593Smuzhiyun  *
76*4882a593Smuzhiyun  *  virt_to_page(k)	convert a _valid_ virtual address to struct page *
77*4882a593Smuzhiyun  *  virt_addr_valid(k)	indicates whether a virtual address is valid
78*4882a593Smuzhiyun  */
79*4882a593Smuzhiyun #ifndef CONFIG_DISCONTIGMEM
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define ARCH_PFN_OFFSET		PHYS_PFN_OFFSET
82*4882a593Smuzhiyun #define pfn_valid(pfn)		((pfn) >= PHYS_PFN_OFFSET && (pfn) < (PHYS_PFN_OFFSET + max_mapnr))
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define virt_to_page(kaddr)	(pfn_to_page(__pa(kaddr) >> PAGE_SHIFT))
85*4882a593Smuzhiyun #define virt_addr_valid(kaddr)	((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #else /* CONFIG_DISCONTIGMEM */
88*4882a593Smuzhiyun #error CONFIG_DISCONTIGMEM is not supported yet.
89*4882a593Smuzhiyun #endif /* !CONFIG_DISCONTIGMEM */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT)
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #include <asm-generic/memory_model.h>
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #endif
98