1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
4  *
5  * Derived from MIPS:
6  * Copyright (C) 1996, 99 Ralf Baechle
7  * Copyright (C) 2000, 2002  Maciej W. Rozycki
8  * Copyright (C) 1990, 1999 by Silicon Graphics, Inc.
9  */
10 #ifndef _ASM_ADDRSPACE_H
11 #define _ASM_ADDRSPACE_H
12 
13 #include <linux/const.h>
14 #include <linux/sizes.h>
15 
16 #include <asm/loongarch.h>
17 
18 /*
19  * This gives the physical RAM offset.
20  */
21 #ifndef __ASSEMBLY__
22 #ifndef PHYS_OFFSET
23 #define PHYS_OFFSET	_UL(0)
24 #endif
25 extern unsigned long vm_map_base;
26 #endif /* __ASSEMBLY__ */
27 
28 #ifndef IO_BASE
29 #define IO_BASE			CSR_DMW0_BASE
30 #endif
31 
32 #ifndef CACHE_BASE
33 #define CACHE_BASE		CSR_DMW1_BASE
34 #endif
35 
36 #ifndef UNCACHE_BASE
37 #define UNCACHE_BASE		CSR_DMW0_BASE
38 #endif
39 
40 #ifndef WRITECOMBINE_BASE
41 #define WRITECOMBINE_BASE	CSR_DMW2_BASE
42 #endif
43 
44 #define DMW_PABITS	48
45 #define TO_PHYS_MASK	((1ULL << DMW_PABITS) - 1)
46 
47 /*
48  * Memory above this physical address will be considered highmem.
49  */
50 #ifndef HIGHMEM_START
51 #define HIGHMEM_START		(_UL(1) << _UL(DMW_PABITS))
52 #endif
53 
54 #define TO_PHYS(x)		(		((x) & TO_PHYS_MASK))
55 #define TO_CACHE(x)		(CACHE_BASE   |	((x) & TO_PHYS_MASK))
56 #define TO_UNCACHE(x)		(UNCACHE_BASE |	((x) & TO_PHYS_MASK))
57 
58 /*
59  * This handles the memory map.
60  */
61 #ifndef PAGE_OFFSET
62 #define PAGE_OFFSET		(CACHE_BASE + PHYS_OFFSET)
63 #endif
64 
65 #ifndef FIXADDR_TOP
66 #define FIXADDR_TOP		((unsigned long)(long)(int)0xfffe0000)
67 #endif
68 
69 #ifdef __ASSEMBLY__
70 #define _ATYPE_
71 #define _ATYPE32_
72 #define _ATYPE64_
73 #else
74 #define _ATYPE_		__PTRDIFF_TYPE__
75 #define _ATYPE32_	int
76 #define _ATYPE64_	__s64
77 #endif
78 
79 #ifdef CONFIG_64BIT
80 #define _CONST64_(x)	_UL(x)
81 #else
82 #define _CONST64_(x)	_ULL(x)
83 #endif
84 
85 /*
86  *  32/64-bit LoongArch address spaces
87  */
88 #ifdef __ASSEMBLY__
89 #define _ACAST32_
90 #define _ACAST64_
91 #else
92 #define _ACAST32_		(_ATYPE_)(_ATYPE32_)	/* widen if necessary */
93 #define _ACAST64_		(_ATYPE64_)		/* do _not_ narrow */
94 #endif
95 
96 #ifdef CONFIG_32BIT
97 
98 #define UVRANGE			0x00000000
99 #define KPRANGE0		0x80000000
100 #define KPRANGE1		0xa0000000
101 #define KVRANGE			0xc0000000
102 
103 #else
104 
105 #define XUVRANGE		_CONST64_(0x0000000000000000)
106 #define XSPRANGE		_CONST64_(0x4000000000000000)
107 #define XKPRANGE		_CONST64_(0x8000000000000000)
108 #define XKVRANGE		_CONST64_(0xc000000000000000)
109 
110 #endif
111 
112 /*
113  * Returns the physical address of a KPRANGEx / XKPRANGE address
114  */
115 #define PHYSADDR(a)		((_ACAST64_(a)) & TO_PHYS_MASK)
116 
117 /*
118  * On LoongArch, I/O ports mappring is following:
119  *
120  *              |         ....          |
121  *              |-----------------------|
122  *              | pci io ports(16K~32M) |
123  *              |-----------------------|
124  *              | isa io ports(0  ~16K) |
125  * PCI_IOBASE ->|-----------------------|
126  *              |         ....          |
127  */
128 #define PCI_IOBASE	((void __iomem *)(vm_map_base + (2 * PAGE_SIZE)))
129 #define PCI_IOSIZE	SZ_32M
130 #define ISA_IOSIZE	SZ_16K
131 #define IO_SPACE_LIMIT	(PCI_IOSIZE - 1)
132 
133 #define PHYS_LINK_KADDR	PHYSADDR(VMLINUX_LOAD_ADDRESS)
134 
135 #endif /* _ASM_ADDRSPACE_H */
136