diff options
Diffstat (limited to 'include/asm-ia64/sn/addrs.h')
-rw-r--r-- | include/asm-ia64/sn/addrs.h | 112 |
1 files changed, 71 insertions, 41 deletions
diff --git a/include/asm-ia64/sn/addrs.h b/include/asm-ia64/sn/addrs.h index 103d745dc5f2..2c32e4b77b54 100644 --- a/include/asm-ia64/sn/addrs.h +++ b/include/asm-ia64/sn/addrs.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (c) 1992-1999,2001-2004 Silicon Graphics, Inc. All rights reserved. | 6 | * Copyright (c) 1992-1999,2001-2005 Silicon Graphics, Inc. All rights reserved. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef _ASM_IA64_SN_ADDRS_H | 9 | #ifndef _ASM_IA64_SN_ADDRS_H |
@@ -65,7 +65,6 @@ | |||
65 | 65 | ||
66 | #define NASID_MASK ((u64)NASID_BITMASK << NASID_SHIFT) | 66 | #define NASID_MASK ((u64)NASID_BITMASK << NASID_SHIFT) |
67 | #define AS_MASK ((u64)AS_BITMASK << AS_SHIFT) | 67 | #define AS_MASK ((u64)AS_BITMASK << AS_SHIFT) |
68 | #define REGION_BITS 0xe000000000000000UL | ||
69 | 68 | ||
70 | 69 | ||
71 | /* | 70 | /* |
@@ -79,38 +78,30 @@ | |||
79 | #define AS_CAC_SPACE (AS_CAC_VAL << AS_SHIFT) | 78 | #define AS_CAC_SPACE (AS_CAC_VAL << AS_SHIFT) |
80 | 79 | ||
81 | 80 | ||
82 | /* | ||
83 | * Base addresses for various address ranges. | ||
84 | */ | ||
85 | #define CACHED 0xe000000000000000UL | ||
86 | #define UNCACHED 0xc000000000000000UL | ||
87 | #define UNCACHED_PHYS 0x8000000000000000UL | ||
88 | |||
89 | |||
90 | /* | 81 | /* |
91 | * Virtual Mode Local & Global MMR space. | 82 | * Virtual Mode Local & Global MMR space. |
92 | */ | 83 | */ |
93 | #define SH1_LOCAL_MMR_OFFSET 0x8000000000UL | 84 | #define SH1_LOCAL_MMR_OFFSET 0x8000000000UL |
94 | #define SH2_LOCAL_MMR_OFFSET 0x0200000000UL | 85 | #define SH2_LOCAL_MMR_OFFSET 0x0200000000UL |
95 | #define LOCAL_MMR_OFFSET (is_shub2() ? SH2_LOCAL_MMR_OFFSET : SH1_LOCAL_MMR_OFFSET) | 86 | #define LOCAL_MMR_OFFSET (is_shub2() ? SH2_LOCAL_MMR_OFFSET : SH1_LOCAL_MMR_OFFSET) |
96 | #define LOCAL_MMR_SPACE (UNCACHED | LOCAL_MMR_OFFSET) | 87 | #define LOCAL_MMR_SPACE (__IA64_UNCACHED_OFFSET | LOCAL_MMR_OFFSET) |
97 | #define LOCAL_PHYS_MMR_SPACE (UNCACHED_PHYS | LOCAL_MMR_OFFSET) | 88 | #define LOCAL_PHYS_MMR_SPACE (RGN_BASE(RGN_HPAGE) | LOCAL_MMR_OFFSET) |
98 | 89 | ||
99 | #define SH1_GLOBAL_MMR_OFFSET 0x0800000000UL | 90 | #define SH1_GLOBAL_MMR_OFFSET 0x0800000000UL |
100 | #define SH2_GLOBAL_MMR_OFFSET 0x0300000000UL | 91 | #define SH2_GLOBAL_MMR_OFFSET 0x0300000000UL |
101 | #define GLOBAL_MMR_OFFSET (is_shub2() ? SH2_GLOBAL_MMR_OFFSET : SH1_GLOBAL_MMR_OFFSET) | 92 | #define GLOBAL_MMR_OFFSET (is_shub2() ? SH2_GLOBAL_MMR_OFFSET : SH1_GLOBAL_MMR_OFFSET) |
102 | #define GLOBAL_MMR_SPACE (UNCACHED | GLOBAL_MMR_OFFSET) | 93 | #define GLOBAL_MMR_SPACE (__IA64_UNCACHED_OFFSET | GLOBAL_MMR_OFFSET) |
103 | 94 | ||
104 | /* | 95 | /* |
105 | * Physical mode addresses | 96 | * Physical mode addresses |
106 | */ | 97 | */ |
107 | #define GLOBAL_PHYS_MMR_SPACE (UNCACHED_PHYS | GLOBAL_MMR_OFFSET) | 98 | #define GLOBAL_PHYS_MMR_SPACE (RGN_BASE(RGN_HPAGE) | GLOBAL_MMR_OFFSET) |
108 | 99 | ||
109 | 100 | ||
110 | /* | 101 | /* |
111 | * Clear region & AS bits. | 102 | * Clear region & AS bits. |
112 | */ | 103 | */ |
113 | #define TO_PHYS_MASK (~(REGION_BITS | AS_MASK)) | 104 | #define TO_PHYS_MASK (~(RGN_BITS | AS_MASK)) |
114 | 105 | ||
115 | 106 | ||
116 | /* | 107 | /* |
@@ -126,6 +117,7 @@ | |||
126 | #define GLOBAL_MMR_PHYS_ADDR(n,a) (GLOBAL_PHYS_MMR_SPACE | REMOTE_ADDR(n,a)) | 117 | #define GLOBAL_MMR_PHYS_ADDR(n,a) (GLOBAL_PHYS_MMR_SPACE | REMOTE_ADDR(n,a)) |
127 | #define GLOBAL_CAC_ADDR(n,a) (CAC_BASE | REMOTE_ADDR(n,a)) | 118 | #define GLOBAL_CAC_ADDR(n,a) (CAC_BASE | REMOTE_ADDR(n,a)) |
128 | #define CHANGE_NASID(n,x) ((void *)(((u64)(x) & ~NASID_MASK) | NASID_SPACE(n))) | 119 | #define CHANGE_NASID(n,x) ((void *)(((u64)(x) & ~NASID_MASK) | NASID_SPACE(n))) |
120 | #define IS_TIO_NASID(n) ((n) & 1) | ||
129 | 121 | ||
130 | 122 | ||
131 | /* non-II mmr's start at top of big window space (4G) */ | 123 | /* non-II mmr's start at top of big window space (4G) */ |
@@ -134,10 +126,10 @@ | |||
134 | /* | 126 | /* |
135 | * general address defines | 127 | * general address defines |
136 | */ | 128 | */ |
137 | #define CAC_BASE (CACHED | AS_CAC_SPACE) | 129 | #define CAC_BASE (PAGE_OFFSET | AS_CAC_SPACE) |
138 | #define AMO_BASE (UNCACHED | AS_AMO_SPACE) | 130 | #define AMO_BASE (__IA64_UNCACHED_OFFSET | AS_AMO_SPACE) |
139 | #define AMO_PHYS_BASE (UNCACHED_PHYS | AS_AMO_SPACE) | 131 | #define AMO_PHYS_BASE (RGN_BASE(RGN_HPAGE) | AS_AMO_SPACE) |
140 | #define GET_BASE (CACHED | AS_GET_SPACE) | 132 | #define GET_BASE (PAGE_OFFSET | AS_GET_SPACE) |
141 | 133 | ||
142 | /* | 134 | /* |
143 | * Convert Memory addresses between various addressing modes. | 135 | * Convert Memory addresses between various addressing modes. |
@@ -155,17 +147,35 @@ | |||
155 | * the chiplet id is zero. If we implement TIO-TIO dma, we might need | 147 | * the chiplet id is zero. If we implement TIO-TIO dma, we might need |
156 | * to insert a chiplet id into this macro. However, it is our belief | 148 | * to insert a chiplet id into this macro. However, it is our belief |
157 | * right now that this chiplet id will be ICE, which is also zero. | 149 | * right now that this chiplet id will be ICE, which is also zero. |
158 | * Nasid starts on bit 40. | ||
159 | */ | 150 | */ |
160 | #define PHYS_TO_TIODMA(x) ( (((u64)(NASID_GET(x))) << 40) | NODE_OFFSET(x)) | 151 | #define SH1_TIO_PHYS_TO_DMA(x) \ |
161 | #define PHYS_TO_DMA(x) ( (((u64)(x) & NASID_MASK) >> 2) | NODE_OFFSET(x)) | 152 | ((((u64)(NASID_GET(x))) << 40) | NODE_OFFSET(x)) |
153 | |||
154 | #define SH2_NETWORK_BANK_OFFSET(x) \ | ||
155 | ((u64)(x) & ((1UL << (sn_hub_info->nasid_shift - 4)) -1)) | ||
156 | |||
157 | #define SH2_NETWORK_BANK_SELECT(x) \ | ||
158 | ((((u64)(x) & (0x3UL << (sn_hub_info->nasid_shift - 4))) \ | ||
159 | >> (sn_hub_info->nasid_shift - 4)) << 36) | ||
160 | |||
161 | #define SH2_NETWORK_ADDRESS(x) \ | ||
162 | (SH2_NETWORK_BANK_OFFSET(x) | SH2_NETWORK_BANK_SELECT(x)) | ||
163 | |||
164 | #define SH2_TIO_PHYS_TO_DMA(x) \ | ||
165 | (((u64)(NASID_GET(x)) << 40) | SH2_NETWORK_ADDRESS(x)) | ||
166 | |||
167 | #define PHYS_TO_TIODMA(x) \ | ||
168 | (is_shub1() ? SH1_TIO_PHYS_TO_DMA(x) : SH2_TIO_PHYS_TO_DMA(x)) | ||
169 | |||
170 | #define PHYS_TO_DMA(x) \ | ||
171 | ((((u64)(x) & NASID_MASK) >> 2) | NODE_OFFSET(x)) | ||
162 | 172 | ||
163 | 173 | ||
164 | /* | 174 | /* |
165 | * Macros to test for address type. | 175 | * Macros to test for address type. |
166 | */ | 176 | */ |
167 | #define IS_AMO_ADDRESS(x) (((u64)(x) & (REGION_BITS | AS_MASK)) == AMO_BASE) | 177 | #define IS_AMO_ADDRESS(x) (((u64)(x) & (RGN_BITS | AS_MASK)) == AMO_BASE) |
168 | #define IS_AMO_PHYS_ADDRESS(x) (((u64)(x) & (REGION_BITS | AS_MASK)) == AMO_PHYS_BASE) | 178 | #define IS_AMO_PHYS_ADDRESS(x) (((u64)(x) & (RGN_BITS | AS_MASK)) == AMO_PHYS_BASE) |
169 | 179 | ||
170 | 180 | ||
171 | /* | 181 | /* |
@@ -180,18 +190,20 @@ | |||
180 | #define TIO_SWIN_BASE(n, w) (TIO_IO_BASE(n) + \ | 190 | #define TIO_SWIN_BASE(n, w) (TIO_IO_BASE(n) + \ |
181 | ((u64) (w) << TIO_SWIN_SIZE_BITS)) | 191 | ((u64) (w) << TIO_SWIN_SIZE_BITS)) |
182 | #define NODE_IO_BASE(n) (GLOBAL_MMR_SPACE | NASID_SPACE(n)) | 192 | #define NODE_IO_BASE(n) (GLOBAL_MMR_SPACE | NASID_SPACE(n)) |
183 | #define TIO_IO_BASE(n) (UNCACHED | NASID_SPACE(n)) | 193 | #define TIO_IO_BASE(n) (__IA64_UNCACHED_OFFSET | NASID_SPACE(n)) |
184 | #define BWIN_SIZE (1UL << BWIN_SIZE_BITS) | 194 | #define BWIN_SIZE (1UL << BWIN_SIZE_BITS) |
185 | #define NODE_BWIN_BASE0(n) (NODE_IO_BASE(n) + BWIN_SIZE) | 195 | #define NODE_BWIN_BASE0(n) (NODE_IO_BASE(n) + BWIN_SIZE) |
186 | #define NODE_BWIN_BASE(n, w) (NODE_BWIN_BASE0(n) + ((u64) (w) << BWIN_SIZE_BITS)) | 196 | #define NODE_BWIN_BASE(n, w) (NODE_BWIN_BASE0(n) + ((u64) (w) << BWIN_SIZE_BITS)) |
187 | #define RAW_NODE_SWIN_BASE(n, w) (NODE_IO_BASE(n) + ((u64) (w) << SWIN_SIZE_BITS)) | 197 | #define RAW_NODE_SWIN_BASE(n, w) (NODE_IO_BASE(n) + ((u64) (w) << SWIN_SIZE_BITS)) |
188 | #define BWIN_WIDGET_MASK 0x7 | 198 | #define BWIN_WIDGET_MASK 0x7 |
189 | #define BWIN_WINDOWNUM(x) (((x) >> BWIN_SIZE_BITS) & BWIN_WIDGET_MASK) | 199 | #define BWIN_WINDOWNUM(x) (((x) >> BWIN_SIZE_BITS) & BWIN_WIDGET_MASK) |
200 | #define SH1_IS_BIG_WINDOW_ADDR(x) ((x) & BWIN_TOP) | ||
190 | 201 | ||
191 | #define TIO_BWIN_WINDOW_SELECT_MASK 0x7 | 202 | #define TIO_BWIN_WINDOW_SELECT_MASK 0x7 |
192 | #define TIO_BWIN_WINDOWNUM(x) (((x) >> TIO_BWIN_SIZE_BITS) & TIO_BWIN_WINDOW_SELECT_MASK) | 203 | #define TIO_BWIN_WINDOWNUM(x) (((x) >> TIO_BWIN_SIZE_BITS) & TIO_BWIN_WINDOW_SELECT_MASK) |
193 | 204 | ||
194 | 205 | #define TIO_HWIN_SHIFT_BITS 33 | |
206 | #define TIO_HWIN(x) (NODE_OFFSET(x) >> TIO_HWIN_SHIFT_BITS) | ||
195 | 207 | ||
196 | /* | 208 | /* |
197 | * The following definitions pertain to the IO special address | 209 | * The following definitions pertain to the IO special address |
@@ -216,10 +228,6 @@ | |||
216 | #define TIO_SWIN_WIDGETNUM(x) (((x) >> TIO_SWIN_SIZE_BITS) & TIO_SWIN_WIDGET_MASK) | 228 | #define TIO_SWIN_WIDGETNUM(x) (((x) >> TIO_SWIN_SIZE_BITS) & TIO_SWIN_WIDGET_MASK) |
217 | 229 | ||
218 | 230 | ||
219 | #define TIO_IOSPACE_ADDR(n,x) \ | ||
220 | /* Move in the Chiplet ID for TIO Local Block MMR */ \ | ||
221 | (REMOTE_ADDR(n,x) | 1UL << (NASID_SHIFT - 2)) | ||
222 | |||
223 | /* | 231 | /* |
224 | * The following macros produce the correct base virtual address for | 232 | * The following macros produce the correct base virtual address for |
225 | * the hub registers. The REMOTE_HUB_* macro produce | 233 | * the hub registers. The REMOTE_HUB_* macro produce |
@@ -234,18 +242,40 @@ | |||
234 | * Otherwise, the recommended approach is to use *_HUB_L() and *_HUB_S(). | 242 | * Otherwise, the recommended approach is to use *_HUB_L() and *_HUB_S(). |
235 | * They're always safe. | 243 | * They're always safe. |
236 | */ | 244 | */ |
245 | /* Shub1 TIO & MMR addressing macros */ | ||
246 | #define SH1_TIO_IOSPACE_ADDR(n,x) \ | ||
247 | GLOBAL_MMR_ADDR(n,x) | ||
248 | |||
249 | #define SH1_REMOTE_BWIN_MMR(n,x) \ | ||
250 | GLOBAL_MMR_ADDR(n,x) | ||
251 | |||
252 | #define SH1_REMOTE_SWIN_MMR(n,x) \ | ||
253 | (NODE_SWIN_BASE(n,1) + 0x800000UL + (x)) | ||
254 | |||
255 | #define SH1_REMOTE_MMR(n,x) \ | ||
256 | (SH1_IS_BIG_WINDOW_ADDR(x) ? SH1_REMOTE_BWIN_MMR(n,x) : \ | ||
257 | SH1_REMOTE_SWIN_MMR(n,x)) | ||
258 | |||
259 | /* Shub1 TIO & MMR addressing macros */ | ||
260 | #define SH2_TIO_IOSPACE_ADDR(n,x) \ | ||
261 | ((__IA64_UNCACHED_OFFSET | REMOTE_ADDR(n,x) | 1UL << (NASID_SHIFT - 2))) | ||
262 | |||
263 | #define SH2_REMOTE_MMR(n,x) \ | ||
264 | GLOBAL_MMR_ADDR(n,x) | ||
265 | |||
266 | |||
267 | /* TIO & MMR addressing macros that work on both shub1 & shub2 */ | ||
268 | #define TIO_IOSPACE_ADDR(n,x) \ | ||
269 | ((u64 *)(is_shub1() ? SH1_TIO_IOSPACE_ADDR(n,x) : \ | ||
270 | SH2_TIO_IOSPACE_ADDR(n,x))) | ||
271 | |||
272 | #define SH_REMOTE_MMR(n,x) \ | ||
273 | (is_shub1() ? SH1_REMOTE_MMR(n,x) : SH2_REMOTE_MMR(n,x)) | ||
274 | |||
237 | #define REMOTE_HUB_ADDR(n,x) \ | 275 | #define REMOTE_HUB_ADDR(n,x) \ |
238 | ((n & 1) ? \ | 276 | (IS_TIO_NASID(n) ? ((volatile u64*)TIO_IOSPACE_ADDR(n,x)) : \ |
239 | /* TIO: */ \ | 277 | ((volatile u64*)SH_REMOTE_MMR(n,x))) |
240 | (is_shub2() ? \ | 278 | |
241 | /* TIO on Shub2 */ \ | ||
242 | (volatile u64 *)(TIO_IOSPACE_ADDR(n,x)) \ | ||
243 | : /* TIO on shub1 */ \ | ||
244 | (volatile u64 *)(GLOBAL_MMR_ADDR(n,x))) \ | ||
245 | \ | ||
246 | : /* SHUB1 and SHUB2 MMRs: */ \ | ||
247 | (((x) & BWIN_TOP) ? ((volatile u64 *)(GLOBAL_MMR_ADDR(n,x))) \ | ||
248 | : ((volatile u64 *)(NODE_SWIN_BASE(n,1) + 0x800000 + (x))))) | ||
249 | 279 | ||
250 | #define HUB_L(x) (*((volatile typeof(*x) *)x)) | 280 | #define HUB_L(x) (*((volatile typeof(*x) *)x)) |
251 | #define HUB_S(x,d) (*((volatile typeof(*x) *)x) = (d)) | 281 | #define HUB_S(x,d) (*((volatile typeof(*x) *)x) = (d)) |