1 |
1275 |
phoenix |
/*
|
2 |
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
3 |
|
|
* License. See the file "COPYING" in the main directory of this archive
|
4 |
|
|
* for more details.
|
5 |
|
|
*
|
6 |
|
|
* Copyright (C) 1996, 1999 by Ralf Baechle
|
7 |
|
|
* Copyright (C) 1990, 1999 by Silicon Graphics, Inc.
|
8 |
|
|
* Copyright (C) 2002 Maciej W. Rozycki
|
9 |
|
|
*/
|
10 |
|
|
#ifndef __ASM_MIPS64_ADDRSPACE_H
|
11 |
|
|
#define __ASM_MIPS64_ADDRSPACE_H
|
12 |
|
|
|
13 |
|
|
#include <linux/config.h>
|
14 |
|
|
|
15 |
|
|
/*
|
16 |
|
|
* Configure language
|
17 |
|
|
*/
|
18 |
|
|
#ifdef __ASSEMBLY__
|
19 |
|
|
#define _ATYPE_
|
20 |
|
|
#define _ATYPE32_
|
21 |
|
|
#define _ATYPE64_
|
22 |
|
|
#else
|
23 |
|
|
#define _ATYPE_ __PTRDIFF_TYPE__
|
24 |
|
|
#define _ATYPE32_ int
|
25 |
|
|
#define _ATYPE64_ long long
|
26 |
|
|
#endif
|
27 |
|
|
|
28 |
|
|
/*
|
29 |
|
|
* 32-bit MIPS address spaces
|
30 |
|
|
*/
|
31 |
|
|
#ifdef __ASSEMBLY__
|
32 |
|
|
#define _ACAST32_
|
33 |
|
|
#define _ACAST64_
|
34 |
|
|
#else
|
35 |
|
|
#define _ACAST32_ (_ATYPE_)(_ATYPE32_) /* widen if necessary */
|
36 |
|
|
#define _ACAST64_ (_ATYPE64_) /* do _not_ narrow */
|
37 |
|
|
#endif
|
38 |
|
|
|
39 |
|
|
/*
|
40 |
|
|
* Memory segments (32bit kernel mode addresses)
|
41 |
|
|
*/
|
42 |
|
|
#define KUSEG 0x0000000000000000
|
43 |
|
|
#define KSEG0 0xffffffff80000000
|
44 |
|
|
#define KSEG1 0xffffffffa0000000
|
45 |
|
|
#define KSEG2 0xffffffffc0000000
|
46 |
|
|
#define KSEG3 0xffffffffe0000000
|
47 |
|
|
|
48 |
|
|
/*
|
49 |
|
|
* Returns the kernel segment base of a given address
|
50 |
|
|
*/
|
51 |
|
|
#define KSEGX(a) ((_ACAST64_ (a)) & 0xffffffffe0000000)
|
52 |
|
|
|
53 |
|
|
/*
|
54 |
|
|
* Returns the physical address of a KSEG0/KSEG1 address
|
55 |
|
|
*/
|
56 |
|
|
#define XPHYSADDR(a) ((_ACAST64_ (a)) & 0x000000ffffffffff)
|
57 |
|
|
#define CPHYSADDR(a) ((_ACAST64_ (a)) & 0x000000001fffffff)
|
58 |
|
|
|
59 |
|
|
#ifndef __ASSEMBLY__
|
60 |
|
|
#define PHYSADDR(a) ({ \
|
61 |
|
|
const _ATYPE64_ _a = _ACAST64_ (a); \
|
62 |
|
|
_a == _ACAST32_ _a ? CPHYSADDR(_a) : XPHYSADDR(_a); })
|
63 |
|
|
#endif
|
64 |
|
|
|
65 |
|
|
/*
|
66 |
|
|
* Map an address to a certain kernel segment
|
67 |
|
|
*/
|
68 |
|
|
#define KSEG0ADDR(a) (CPHYSADDR(a) | KSEG0)
|
69 |
|
|
#define KSEG1ADDR(a) (CPHYSADDR(a) | KSEG1)
|
70 |
|
|
#define KSEG2ADDR(a) (CPHYSADDR(a) | KSEG2)
|
71 |
|
|
#define KSEG3ADDR(a) (CPHYSADDR(a) | KSEG3)
|
72 |
|
|
|
73 |
|
|
/*
|
74 |
|
|
* Memory segments (64bit kernel mode addresses)
|
75 |
|
|
*/
|
76 |
|
|
#define XKUSEG 0x0000000000000000
|
77 |
|
|
#define XKSSEG 0x4000000000000000
|
78 |
|
|
#define XKPHYS 0x8000000000000000
|
79 |
|
|
#define XKSEG 0xc000000000000000
|
80 |
|
|
#define CKSEG0 0xffffffff80000000
|
81 |
|
|
#define CKSEG1 0xffffffffa0000000
|
82 |
|
|
#define CKSSEG 0xffffffffc0000000
|
83 |
|
|
#define CKSEG3 0xffffffffe0000000
|
84 |
|
|
|
85 |
|
|
#if defined (CONFIG_CPU_R4300) \
|
86 |
|
|
|| defined (CONFIG_CPU_R4X00) \
|
87 |
|
|
|| defined (CONFIG_CPU_RM7000) \
|
88 |
|
|
|| defined (CONFIG_CPU_RM9000) \
|
89 |
|
|
|| defined (CONFIG_CPU_R5000) \
|
90 |
|
|
|| defined (CONFIG_CPU_NEVADA) \
|
91 |
|
|
|| defined (CONFIG_CPU_MIPS64)
|
92 |
|
|
#define KUSIZE 0x0000010000000000 /* 2^^40 */
|
93 |
|
|
#define KUSIZE_64 0x0000010000000000 /* 2^^40 */
|
94 |
|
|
#define K0SIZE 0x0000001000000000 /* 2^^36 */
|
95 |
|
|
#define K1SIZE 0x0000001000000000 /* 2^^36 */
|
96 |
|
|
#define K2SIZE 0x000000ff80000000
|
97 |
|
|
#define KSEGSIZE 0x000000ff80000000 /* max syssegsz */
|
98 |
|
|
#define TO_PHYS_MASK 0x0000000fffffffff /* 2^^36 - 1 */
|
99 |
|
|
#endif
|
100 |
|
|
|
101 |
|
|
#if defined (CONFIG_CPU_R8000)
|
102 |
|
|
/* We keep KUSIZE consistent with R4000 for now (2^^40) instead of (2^^48) */
|
103 |
|
|
#define KUSIZE 0x0000010000000000 /* 2^^40 */
|
104 |
|
|
#define KUSIZE_64 0x0000010000000000 /* 2^^40 */
|
105 |
|
|
#define K0SIZE 0x0000010000000000 /* 2^^40 */
|
106 |
|
|
#define K1SIZE 0x0000010000000000 /* 2^^40 */
|
107 |
|
|
#define K2SIZE 0x0001000000000000
|
108 |
|
|
#define KSEGSIZE 0x0000010000000000 /* max syssegsz */
|
109 |
|
|
#define TO_PHYS_MASK 0x000000ffffffffff /* 2^^40 - 1 */
|
110 |
|
|
#endif
|
111 |
|
|
|
112 |
|
|
#if defined (CONFIG_CPU_R10000)
|
113 |
|
|
#define KUSIZE 0x0000010000000000 /* 2^^40 */
|
114 |
|
|
#define KUSIZE_64 0x0000010000000000 /* 2^^40 */
|
115 |
|
|
#define K0SIZE 0x0000010000000000 /* 2^^40 */
|
116 |
|
|
#define K1SIZE 0x0000010000000000 /* 2^^40 */
|
117 |
|
|
#define K2SIZE 0x00000fff80000000
|
118 |
|
|
#define KSEGSIZE 0x00000fff80000000 /* max syssegsz */
|
119 |
|
|
#define TO_PHYS_MASK 0x000000ffffffffff /* 2^^40 - 1 */
|
120 |
|
|
#endif
|
121 |
|
|
|
122 |
|
|
/*
|
123 |
|
|
* Further names for SGI source compatibility. These are stolen from
|
124 |
|
|
* IRIX's <sys/mips_addrspace.h>.
|
125 |
|
|
*/
|
126 |
|
|
#define KUBASE 0
|
127 |
|
|
#define KUSIZE_32 0x0000000080000000 /* KUSIZE
|
128 |
|
|
for a 32 bit proc */
|
129 |
|
|
#ifdef CONFIG_CPU_RM7000
|
130 |
|
|
#define K0BASE 0x9800000000000000UL
|
131 |
|
|
#else
|
132 |
|
|
#define K0BASE 0xa800000000000000
|
133 |
|
|
#endif
|
134 |
|
|
#define K0BASE_EXL_WR K0BASE /* exclusive on write */
|
135 |
|
|
#define K0BASE_NONCOH 0x9800000000000000 /* noncoherent */
|
136 |
|
|
#define K0BASE_EXL 0xa000000000000000 /* exclusive */
|
137 |
|
|
|
138 |
|
|
#ifdef CONFIG_SGI_IP27
|
139 |
|
|
#define K1BASE 0x9600000000000000 /* uncached attr 3,
|
140 |
|
|
uncac */
|
141 |
|
|
#else
|
142 |
|
|
#define K1BASE 0x9000000000000000
|
143 |
|
|
#endif
|
144 |
|
|
#define K2BASE 0xc000000000000000
|
145 |
|
|
|
146 |
|
|
#if !defined (CONFIG_CPU_R8000)
|
147 |
|
|
#define COMPAT_K1BASE32 0xffffffffa0000000
|
148 |
|
|
#define PHYS_TO_COMPATK1(x) ((x) | COMPAT_K1BASE32) /* 32-bit compat k1 */
|
149 |
|
|
#endif
|
150 |
|
|
|
151 |
|
|
#define KDM_TO_PHYS(x) (_ACAST64_ (x) & TO_PHYS_MASK)
|
152 |
|
|
#define PHYS_TO_K0(x) (_ACAST64_ (x) | K0BASE)
|
153 |
|
|
|
154 |
|
|
#endif /* __ASM_MIPS64_ADDRSPACE_H */
|