1 struct syscall_result {
6 static struct syscall_result syscall_return(long result)
8 struct syscall_result res;
9 if (((unsigned long)result) >= ((unsigned long)-125)) {
19 static struct syscall_result syscall0(unsigned long nr)
26 return syscall_return(res);
29 static struct syscall_result syscall1(unsigned long nr, unsigned long arg1)
35 : "a" (nr), "b" (arg1));
36 return syscall_return(res);
40 static struct syscall_result syscall2(unsigned long nr, unsigned long arg1, unsigned long arg2)
46 : "a" (nr), "b" (arg1), "c" (arg2));
47 return syscall_return(res);
52 static struct syscall_result syscall3(unsigned long nr, unsigned long arg1, unsigned long arg2,
59 : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3));
60 return syscall_return(res);
64 static struct syscall_result syscall4(unsigned long nr, unsigned long arg1, unsigned long arg2,
65 unsigned long arg3, unsigned long arg4)
71 : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3), "S" (arg4));
72 return syscall_return(res);
76 static struct syscall_result syscall5(unsigned long nr, unsigned long arg1, unsigned long arg2,
77 unsigned long arg3, unsigned long arg4, unsigned long arg5)
83 : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3),
84 "S" (arg4), "D" (arg5));
85 return syscall_return(res);
106 #define NR_oldstat 18
116 #define NR_oldfstat 28
137 #define NR_geteuid 49
138 #define NR_getegid 50
140 #define NR_umount2 52
145 #define NR_setpgid 57
147 #define NR_oldolduname 59
152 #define NR_getppid 64
153 #define NR_getpgrp 65
155 #define NR_sigaction 67
156 #define NR_sgetmask 68
157 #define NR_ssetmask 69
158 #define NR_setreuid 70
159 #define NR_setregid 71
160 #define NR_sigsuspend 72
161 #define NR_sigpending 73
162 #define NR_sethostname 74
163 #define NR_setrlimit 75
164 #define NR_getrlimit 76
165 #define NR_getrusage 77
166 #define NR_gettimeofday 78
167 #define NR_settimeofday 79
168 #define NR_getgroups 80
169 #define NR_setgroups 81
171 #define NR_symlink 83
172 #define NR_oldlstat 84
173 #define NR_readlink 85
177 #define NR_readdir 89
180 #define NR_truncate 92
181 #define NR_ftruncate 93
184 #define NR_getpriority 96
185 #define NR_setpriority 97
188 #define NR_fstatfs 100
189 #define NR_ioperm 101
190 #define NR_socketcall 102
191 #define NR_syslog 103
192 #define NR_setitimer 104
193 #define NR_getitimer 105
197 #define NR_olduname 109
199 #define NR_vhangup 111
201 #define NR_vm86old 113
203 #define NR_swapoff 115
204 #define NR_sysinfo 116
207 #define NR_sigreturn 119
209 #define NR_setdomainname 121
211 #define NR_modify_ldt 123
212 #define NR_adjtimex 124
213 #define NR_mprotect 125
214 #define NR_sigprocmask 126
215 #define NR_create_module 127
216 #define NR_init_module 128
217 #define NR_delete_module 129
218 #define NR_get_kernel_syms 130
219 #define NR_quotactl 131
220 #define NR_getpgid 132
221 #define NR_fchdir 133
222 #define NR_bdflush 134
224 #define NR_personality 136
225 #define NR_afs_syscall 137 /* Syscall for Andrew File System */
226 #define NR_setfsuid 138
227 #define NR_setfsgid 139
228 #define NR__llseek 140
229 #define NR_getdents 141
230 #define NR__newselect 142
234 #define NR_writev 146
235 #define NR_getsid 147
236 #define NR_fdatasync 148
237 #define NR__sysctl 149
239 #define NR_munlock 151
240 #define NR_mlockall 152
241 #define NR_munlockall 153
242 #define NR_sched_setparam 154
243 #define NR_sched_getparam 155
244 #define NR_sched_setscheduler 156
245 #define NR_sched_getscheduler 157
246 #define NR_sched_yield 158
247 #define NR_sched_get_priority_max 159
248 #define NR_sched_get_priority_min 160
249 #define NR_sched_rr_get_interval 161
250 #define NR_nanosleep 162
251 #define NR_mremap 163
252 #define NR_setresuid 164
253 #define NR_getresuid 165
255 #define NR_query_module 167
257 #define NR_nfsservctl 169
258 #define NR_setresgid 170
259 #define NR_getresgid 171
261 #define NR_rt_sigreturn 173
262 #define NR_rt_sigaction 174
263 #define NR_rt_sigprocmask 175
264 #define NR_rt_sigpending 176
265 #define NR_rt_sigtimedwait 177
266 #define NR_rt_sigqueueinfo 178
267 #define NR_rt_sigsuspend 179
269 #define NR_pwrite 181
271 #define NR_getcwd 183
272 #define NR_capget 184
273 #define NR_capset 185
274 #define NR_sigaltstack 186
275 #define NR_sendfile 187
276 #define NR_getpmsg 188 /* some people actually want streams */
277 #define NR_putpmsg 189 /* some people actually want streams */
280 typedef long ssize_t;
281 typedef unsigned long size_t;
283 /* Standard file descriptors */
284 #define STDIN_FILENO 0 /* Standard input */
285 #define STDOUT_FILENO 1 /* Standard output */
286 #define STDERR_FILENO 2 /* Standard error output */
288 static ssize_t write(int fd, const void *buf, size_t count)
290 struct syscall_result res;
291 res = syscall3(NR_write, fd, (unsigned long)buf, count);
295 static void _exit(int status)
297 struct syscall_result res;
298 res = syscall1(NR_exit, status);
301 static const char *addr_of_char(unsigned char ch)
303 static const char byte[] = {
304 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
305 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
306 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
307 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
308 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
309 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
310 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
311 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
312 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
313 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
314 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
315 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
316 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
317 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
318 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
319 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
320 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
321 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
322 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
323 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
324 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
325 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
326 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
327 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
328 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
329 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
330 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
331 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
332 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
333 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
334 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
335 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
340 static void console_tx_byte(unsigned char ch)
342 write(STDOUT_FILENO, addr_of_char(ch), 1);
345 static void console_tx_nibble(unsigned nibble)
348 digit = nibble + '0';
352 console_tx_byte(digit);
355 static void console_tx_char(unsigned char byte)
357 console_tx_byte(byte);
360 static void console_tx_hex8(unsigned char value)
362 console_tx_nibble((value >> 4U) & 0x0fU);
363 console_tx_nibble(value & 0x0fU);
366 static void console_tx_hex16(unsigned short value)
368 console_tx_nibble((value >> 12U) & 0x0FU);
369 console_tx_nibble((value >> 8U) & 0x0FU);
370 console_tx_nibble((value >> 4U) & 0x0FU);
371 console_tx_nibble(value & 0x0FU);
374 static void console_tx_hex32(unsigned short value)
376 console_tx_nibble((value >> 28U) & 0x0FU);
377 console_tx_nibble((value >> 24U) & 0x0FU);
378 console_tx_nibble((value >> 20U) & 0x0FU);
379 console_tx_nibble((value >> 16U) & 0x0FU);
380 console_tx_nibble((value >> 12U) & 0x0FU);
381 console_tx_nibble((value >> 8U) & 0x0FU);
382 console_tx_nibble((value >> 4U) & 0x0FU);
383 console_tx_nibble(value & 0x0FU);
386 static void console_tx_string(const char *str)
389 while((ch = *str++) != '\0') {
394 static void print_debug_char(unsigned char byte) { console_tx_char(byte); }
395 static void print_debug_hex8(unsigned char value) { console_tx_hex8(value); }
396 static void print_debug_hex16(unsigned short value){ console_tx_hex16(value); }
397 static void print_debug_hex32(unsigned int value) { console_tx_hex32(value); }
398 static void print_debug(const char *str) { console_tx_string(str); }
401 static void setup_coherent_ht_domain(void)
403 static const unsigned int register_values[] = {
405 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x40) & 0xFF)), 0xfff0f0f0, 0x00010101,
406 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x44) & 0xFF)), 0xfff0f0f0, 0x00010101,
407 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x48) & 0xFF)), 0xfff0f0f0, 0x00010101,
408 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x4c) & 0xFF)), 0xfff0f0f0, 0x00010101,
409 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x50) & 0xFF)), 0xfff0f0f0, 0x00010101,
410 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x54) & 0xFF)), 0xfff0f0f0, 0x00010101,
411 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x58) & 0xFF)), 0xfff0f0f0, 0x00010101,
412 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x5c) & 0xFF)), 0xfff0f0f0, 0x00010101,
413 # 983 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
414 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x68) & 0xFF)), 0x00800000, 0x0f00840f,
415 # 1005 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
416 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x6C) & 0xFF)), 0xffffff8c, 0x00000000 | (1 << 6) |(1 << 5)| (1 << 4),
417 # 1082 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
418 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x84) & 0xFF)), 0x00009c05, 0x11110020,
419 # 1127 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
420 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x88) & 0xFF)), 0xfffff0ff, 0x00000200,
421 # 1148 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
422 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x94) & 0xFF)), 0xff000000, 0x00ff0000,
423 # 1182 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
424 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x44) & 0xFF)), 0x0000f8f8, 0x003f0000,
429 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x4C) & 0xFF)), 0x0000f8f8, 0x00000001,
430 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x54) & 0xFF)), 0x0000f8f8, 0x00000002,
431 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x5C) & 0xFF)), 0x0000f8f8, 0x00000003,
432 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x64) & 0xFF)), 0x0000f8f8, 0x00000004,
433 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x6C) & 0xFF)), 0x0000f8f8, 0x00000005,
434 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x74) & 0xFF)), 0x0000f8f8, 0x00000006,
435 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x7C) & 0xFF)), 0x0000f8f8, 0x00000007,
436 # 1224 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
437 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x40) & 0xFF)), 0x0000f8fc, 0x00000003,
439 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x48) & 0xFF)), 0x0000f8fc, 0x00400000,
440 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x50) & 0xFF)), 0x0000f8fc, 0x00400000,
441 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x58) & 0xFF)), 0x0000f8fc, 0x00400000,
442 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x60) & 0xFF)), 0x0000f8fc, 0x00400000,
443 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x68) & 0xFF)), 0x0000f8fc, 0x00400000,
444 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x70) & 0xFF)), 0x0000f8fc, 0x00400000,
445 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x78) & 0xFF)), 0x0000f8fc, 0x00400000,
446 # 1276 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
447 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x84) & 0xFF)), 0x00000048, 0x00e1ff00,
448 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x8C) & 0xFF)), 0x00000048, 0x00dfff00,
449 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x94) & 0xFF)), 0x00000048, 0x00e3ff00,
450 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x9C) & 0xFF)), 0x00000048, 0x00000000,
451 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA4) & 0xFF)), 0x00000048, 0x00000000,
452 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xAC) & 0xFF)), 0x00000048, 0x00000000,
453 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB4) & 0xFF)), 0x00000048, 0x00000b00,
454 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xBC) & 0xFF)), 0x00000048, 0x00fe0b00,
455 # 1311 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
456 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x80) & 0xFF)), 0x000000f0, 0x00e00003,
457 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x88) & 0xFF)), 0x000000f0, 0x00d80003,
458 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x90) & 0xFF)), 0x000000f0, 0x00e20003,
459 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x98) & 0xFF)), 0x000000f0, 0x00000000,
460 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA0) & 0xFF)), 0x000000f0, 0x00000000,
461 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA8) & 0xFF)), 0x000000f0, 0x00000000,
462 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB0) & 0xFF)), 0x000000f0, 0x00000a03,
464 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB8) & 0xFF)), 0x000000f0, 0x00400003,
465 # 1350 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
466 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC4) & 0xFF)), 0xFE000FC8, 0x0000d000,
467 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xCC) & 0xFF)), 0xFE000FC8, 0x000ff000,
468 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD4) & 0xFF)), 0xFE000FC8, 0x00000000,
469 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xDC) & 0xFF)), 0xFE000FC8, 0x00000000,
470 # 1380 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
471 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC0) & 0xFF)), 0xFE000FCC, 0x0000d003,
472 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC8) & 0xFF)), 0xFE000FCC, 0x00001013,
473 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD0) & 0xFF)), 0xFE000FCC, 0x00000000,
474 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD8) & 0xFF)), 0xFE000FCC, 0x00000000,
475 # 1421 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c"
476 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE0) & 0xFF)), 0x0000FC88, 0xff000003,
477 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE4) & 0xFF)), 0x0000FC88, 0x00000000,
478 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE8) & 0xFF)), 0x0000FC88, 0x00000000,
479 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xEC) & 0xFF)), 0x0000FC88, 0x00000000,
481 #define PCI_ADDR(BUS, DEV, FN, WHERE) ( \
482 (((BUS) & 0xFF) << 16) | \
483 (((DEV) & 0x1f) << 11) | \
484 (((FN) & 0x07) << 8) | \
487 /* Routing Table Node i
496 * [ 0: 3] Request Route
497 * [0] Route to this node
498 * [1] Route to Link 0
499 * [2] Route to Link 1
500 * [3] Route to Link 2
501 * [11: 8] Response Route
502 * [0] Route to this node
503 * [1] Route to Link 0
504 * [2] Route to Link 1
505 * [3] Route to Link 2
506 * [19:16] Broadcast route
507 * [0] Route to this node
508 * [1] Route to Link 0
509 * [2] Route to Link 1
510 * [3] Route to Link 2
512 PCI_ADDR(0, 0x18, 0, 0x40), 0xfff0f0f0, 0x00010101,
513 PCI_ADDR(0, 0x18, 0, 0x44), 0xfff0f0f0, 0x00010101,
514 PCI_ADDR(0, 0x18, 0, 0x48), 0xfff0f0f0, 0x00010101,
515 PCI_ADDR(0, 0x18, 0, 0x4c), 0xfff0f0f0, 0x00010101,
516 PCI_ADDR(0, 0x18, 0, 0x50), 0xfff0f0f0, 0x00010101,
517 PCI_ADDR(0, 0x18, 0, 0x54), 0xfff0f0f0, 0x00010101,
518 PCI_ADDR(0, 0x18, 0, 0x58), 0xfff0f0f0, 0x00010101,
519 PCI_ADDR(0, 0x18, 0, 0x5c), 0xfff0f0f0, 0x00010101,
521 /* Hypetransport Transaction Control Register
523 * [ 0: 0] Disable read byte probe
525 * 1 = Probes not issued
526 * [ 1: 1] Disable Read Doubleword probe
528 * 1 = Probes not issued
529 * [ 2: 2] Disable write byte probes
531 * 1 = Probes not issued
532 * [ 3: 3] Disable Write Doubleword Probes
534 * 1 = Probes not issued.
535 * [ 4: 4] Disable Memroy Controller Target Start
536 * 0 = TgtStart packets are generated
537 * 1 = TgtStart packets are not generated.
538 * [ 5: 5] CPU1 Enable
539 * 0 = Second CPU disabled or not present
540 * 1 = Second CPU enabled.
541 * [ 6: 6] CPU Request PassPW
542 * 0 = CPU requests do not pass posted writes
543 * 1 = CPU requests pass posted writes.
544 * [ 7: 7] CPU read Respons PassPW
545 * 0 = CPU Responses do not pass posted writes
546 * 1 = CPU responses pass posted writes.
547 * [ 8: 8] Disable Probe Memory Cancel
548 * 0 = Probes may generate MemCancels
549 * 1 = Probes may not generate MemCancels
550 * [ 9: 9] Disable Remote Probe Memory Cancel.
551 * 0 = Probes hitting dirty blocks generate memory cancel packets
552 * 1 = Only probed caches on the same node as the memory controller
553 * generate cancel packets.
554 * [10:10] Disable Fill Probe
555 * 0 = Probes issued for cache fills
556 * 1 = Probes not issued for cache fills.
557 * [11:11] Response PassPw
558 * 0 = Downstream response PassPW based on original request
559 * 1 = Downstream response PassPW set to 1
560 * [12:12] Change ISOC to Ordered
561 * 0 = Bit 1 of coherent HT RdSz/WrSz command used for iosynchronous prioritization
562 * 1 = Bit 1 of coherent HT RdSz/WrSz command used for ordering.
563 * [14:13] Buffer Release Priority select
568 * [15:15] Limit Coherent HT Configuration Space Range
569 * 0 = No coherent HT configuration space restrictions
570 * 1 = Limit coherent HT configuration space based on node count
571 * [16:16] Local Interrupt Conversion Enable.
572 * 0 = ExtInt/NMI interrups unaffected.
573 * 1 = ExtInt/NMI broadcat interrupts converted to LINT0/1
574 * [17:17] APIC Extended Broadcast Enable.
575 * 0 = APIC broadcast is 0F
576 * 1 = APIC broadcast is FF
577 * [18:18] APIC Extended ID Enable
578 * 0 = APIC ID is 4 bits.
579 * 1 = APIC ID is 8 bits.
580 * [19:19] APIC Extended Spurious Vector Enable
581 * 0 = Lower 4 bits of spurious vector are read-only 1111
582 * 1 = Lower 4 bits of spurious vecotr are writeable.
583 * [20:20] Sequence ID Source Node Enable
584 * 0 = Normal operation
585 * 1 = Keep SeqID on routed packets for debugging.
586 * [22:21] Downstream non-posted request limit
592 * [25:24] Medium-Priority Bypass Count
593 * - Maximum # of times a medium priority access can pass a low
594 * priority access before Medium-Priority mode is disabled for one access.
595 * [27:26] High-Priority Bypass Count
596 * - Maximum # of times a high prioirty access can pass a medium or low
597 * priority access before High-prioirty mode is disabled for one access.
598 * [28:28] Enable High Priority CPU Reads
599 * 0 = Cpu reads are medium prioirty
600 * 1 = Cpu reads are high prioirty
601 * [29:29] Disable Low Priority Writes
602 * 0 = Non-isochronous writes are low priority
603 * 1 = Non-isochronous writes are medium prioirty
604 * [30:30] Disable High Priority Isochronous writes
605 * 0 = Isochronous writes are high priority
606 * 1 = Isochronous writes are medium priority
607 * [31:31] Disable Medium Priority Isochronous writes
608 * 0 = Isochronous writes are medium are high
609 * 1 = With bit 30 set makes Isochrouns writes low priority.
611 PCI_ADDR(0, 0x18, 0, 0x68), 0x00800000, 0x0f00840f,
612 /* HT Initialization Control Register
614 * [ 0: 0] Routing Table Disable
615 * 0 = Packets are routed according to routing tables
616 * 1 = Packets are routed according to the default link field
617 * [ 1: 1] Request Disable (BSP should clear this)
618 * 0 = Request packets may be generated
619 * 1 = Request packets may not be generated.
620 * [ 3: 2] Default Link (Read-only)
624 * 11 = CPU on same node
626 * - Scratch bit cleared by a cold reset
627 * [ 5: 5] BIOS Reset Detect
628 * - Scratch bit cleared by a cold reset
629 * [ 6: 6] INIT Detect
630 * - Scratch bit cleared by a warm or cold reset not by an INIT
633 PCI_ADDR(0, 0x18, 0, 0x6C), 0xffffff8c, 0x00000000 | (1 << 6) |(1 << 5)| (1 << 4),
634 /* LDTi Capabilities Registers
639 /* LDTi Link Control Registrs
643 * [ 1: 1] CRC Flood Enable
644 * 0 = Do not generate sync packets on CRC error
645 * 1 = Generate sync packets on CRC error
646 * [ 2: 2] CRC Start Test (Read-Only)
647 * [ 3: 3] CRC Force Frame Error
648 * 0 = Do not generate bad CRC
649 * 1 = Generate bad CRC
650 * [ 4: 4] Link Failure
651 * 0 = No link failure detected
652 * 1 = Link failure detected
653 * [ 5: 5] Initialization Complete
654 * 0 = Initialization not complete
655 * 1 = Initialization complete
656 * [ 6: 6] Receiver off
659 * [ 7: 7] Transmitter Off
661 * 1 = Transmitter off
664 * [0] = 1 Error on byte lane 0
665 * [1] = 1 Error on byte lane 1
666 * [12:12] Isochrnous Enable (Read-Only)
667 * [13:13] HT Stop Tristate Enable
668 * 0 = Driven during an LDTSTOP_L
669 * 1 = Tristated during and LDTSTOP_L
670 * [14:14] Extended CTL Time
671 * 0 = CTL is asserted for 16 bit times during link initialization
672 * 1 = CTL is asserted for 50us during link initialization
673 * [18:16] Max Link Width In (Read-Only?)
676 * [19:19] Doubleword Flow Control in (Read-Only)
677 * 0 = This link does not support doubleword flow control
678 * 1 = This link supports doubleword flow control
679 * [22:20] Max Link Width Out (Read-Only?)
682 * [23:23] Doubleworld Flow Control out (Read-Only)
683 * 0 = This link does not support doubleword flow control
684 * 1 = This link supports doubleworkd flow control
685 * [26:24] Link Width In
693 * 111 = Link physically not connected
694 * [27:27] Doubleword Flow Control In Enable
695 * 0 = Doubleword flow control disabled
696 * 1 = Doubleword flow control enabled (Not currently supported)
697 * [30:28] Link Width Out
705 * 111 = Link physically not connected
706 * [31:31] Doubleworld Flow Control Out Enable
707 * 0 = Doubleworld flow control disabled
708 * 1 = Doubleword flow control enabled (Not currently supported)
710 PCI_ADDR(0, 0x18, 0, 0x84), 0x00009c05, 0x11110020,
711 /* LDTi Frequency/Revision Registers
715 * [ 4: 0] Minor Revision
716 * Contains the HT Minor revision
717 * [ 7: 5] Major Revision
718 * Contains the HT Major revision
719 * [11: 8] Link Frequency (Takes effect the next time the link is reconnected)
736 * [15:12] Error (Not currently Implemented)
737 * [31:16] Indicates the frequency capabilities of the link
738 * [16] = 1 encoding 0000 of freq supported
739 * [17] = 1 encoding 0001 of freq supported
740 * [18] = 1 encoding 0010 of freq supported
741 * [19] = 1 encoding 0011 of freq supported
742 * [20] = 1 encoding 0100 of freq supported
743 * [21] = 1 encoding 0101 of freq supported
744 * [22] = 1 encoding 0110 of freq supported
745 * [23] = 1 encoding 0111 of freq supported
746 * [24] = 1 encoding 1000 of freq supported
747 * [25] = 1 encoding 1001 of freq supported
748 * [26] = 1 encoding 1010 of freq supported
749 * [27] = 1 encoding 1011 of freq supported
750 * [28] = 1 encoding 1100 of freq supported
751 * [29] = 1 encoding 1101 of freq supported
752 * [30] = 1 encoding 1110 of freq supported
753 * [31] = 1 encoding 1111 of freq supported
755 PCI_ADDR(0, 0x18, 0, 0x88), 0xfffff0ff, 0x00000200,
756 /* LDTi Feature Capability
761 /* LDTi Buffer Count Registers
766 /* LDTi Bus Number Registers
770 * For NonCoherent HT specifies the bus number downstream (behind the host bridge)
771 * [ 0: 7] Primary Bus Number
772 * [15: 8] Secondary Bus Number
773 * [23:15] Subordiante Bus Number
776 PCI_ADDR(0, 0x18, 0, 0x94), 0xff000000, 0x00ff0000,
777 /* LDTi Type Registers
782 /* Careful set limit registers before base registers which contain the enables */
783 /* DRAM Limit i Registers
792 * [ 2: 0] Destination Node ID
802 * [10: 8] Interleave select
803 * specifies the values of A[14:12] to use with interleave enable.
805 * [31:16] DRAM Limit Address i Bits 39-24
806 * This field defines the upper address bits of a 40 bit address
807 * that define the end of the DRAM region.
810 PCI_ADDR(0, 0x18, 1, 0x44), 0x0000f8f8, 0x003f0000,
813 PCI_ADDR(0, 0x18, 1, 0x44), 0x0000f8f8, 0x001f0000,
815 PCI_ADDR(0, 0x18, 1, 0x4C), 0x0000f8f8, 0x00000001,
816 PCI_ADDR(0, 0x18, 1, 0x54), 0x0000f8f8, 0x00000002,
817 PCI_ADDR(0, 0x18, 1, 0x5C), 0x0000f8f8, 0x00000003,
818 PCI_ADDR(0, 0x18, 1, 0x64), 0x0000f8f8, 0x00000004,
819 PCI_ADDR(0, 0x18, 1, 0x6C), 0x0000f8f8, 0x00000005,
820 PCI_ADDR(0, 0x18, 1, 0x74), 0x0000f8f8, 0x00000006,
821 PCI_ADDR(0, 0x18, 1, 0x7C), 0x0000f8f8, 0x00000007,
822 /* DRAM Base i Registers
831 * [ 0: 0] Read Enable
834 * [ 1: 1] Write Enable
835 * 0 = Writes Disabled
838 * [10: 8] Interleave Enable
839 * 000 = No interleave
840 * 001 = Interleave on A[12] (2 nodes)
842 * 011 = Interleave on A[12] and A[14] (4 nodes)
846 * 111 = Interleve on A[12] and A[13] and A[14] (8 nodes)
848 * [13:16] DRAM Base Address i Bits 39-24
849 * This field defines the upper address bits of a 40-bit address
850 * that define the start of the DRAM region.
852 PCI_ADDR(0, 0x18, 1, 0x40), 0x0000f8fc, 0x00000003,
854 PCI_ADDR(0, 0x18, 1, 0x48), 0x0000f8fc, 0x00400000,
855 PCI_ADDR(0, 0x18, 1, 0x50), 0x0000f8fc, 0x00400000,
856 PCI_ADDR(0, 0x18, 1, 0x58), 0x0000f8fc, 0x00400000,
857 PCI_ADDR(0, 0x18, 1, 0x60), 0x0000f8fc, 0x00400000,
858 PCI_ADDR(0, 0x18, 1, 0x68), 0x0000f8fc, 0x00400000,
859 PCI_ADDR(0, 0x18, 1, 0x70), 0x0000f8fc, 0x00400000,
860 PCI_ADDR(0, 0x18, 1, 0x78), 0x0000f8fc, 0x00400000,
863 PCI_ADDR(0, 0x18, 1, 0x48), 0x0000f8fc, 0x00200000,
864 PCI_ADDR(0, 0x18, 1, 0x50), 0x0000f8fc, 0x00200000,
865 PCI_ADDR(0, 0x18, 1, 0x58), 0x0000f8fc, 0x00200000,
866 PCI_ADDR(0, 0x18, 1, 0x60), 0x0000f8fc, 0x00200000,
867 PCI_ADDR(0, 0x18, 1, 0x68), 0x0000f8fc, 0x00200000,
868 PCI_ADDR(0, 0x18, 1, 0x70), 0x0000f8fc, 0x00200000,
869 PCI_ADDR(0, 0x18, 1, 0x78), 0x0000f8fc, 0x00200000,
872 /* Memory-Mapped I/O Limit i Registers
881 * [ 2: 0] Destination Node ID
891 * [ 5: 4] Destination Link ID
898 * 0 = CPU writes may be posted
899 * 1 = CPU writes must be non-posted
900 * [31: 8] Memory-Mapped I/O Limit Address i (39-16)
901 * This field defines the upp adddress bits of a 40-bit address that
902 * defines the end of a memory-mapped I/O region n
904 PCI_ADDR(0, 0x18, 1, 0x84), 0x00000048, 0x00e1ff00,
905 PCI_ADDR(0, 0x18, 1, 0x8C), 0x00000048, 0x00dfff00,
906 PCI_ADDR(0, 0x18, 1, 0x94), 0x00000048, 0x00e3ff00,
907 PCI_ADDR(0, 0x18, 1, 0x9C), 0x00000048, 0x00000000,
908 PCI_ADDR(0, 0x18, 1, 0xA4), 0x00000048, 0x00000000,
909 PCI_ADDR(0, 0x18, 1, 0xAC), 0x00000048, 0x00000000,
910 PCI_ADDR(0, 0x18, 1, 0xB4), 0x00000048, 0x00000b00,
911 PCI_ADDR(0, 0x18, 1, 0xBC), 0x00000048, 0x00fe0b00,
913 /* Memory-Mapped I/O Base i Registers
922 * [ 0: 0] Read Enable
925 * [ 1: 1] Write Enable
926 * 0 = Writes disabled
928 * [ 2: 2] Cpu Disable
929 * 0 = Cpu can use this I/O range
930 * 1 = Cpu requests do not use this I/O range
932 * 0 = base/limit registers i are read/write
933 * 1 = base/limit registers i are read-only
935 * [31: 8] Memory-Mapped I/O Base Address i (39-16)
936 * This field defines the upper address bits of a 40bit address
937 * that defines the start of memory-mapped I/O region i
939 PCI_ADDR(0, 0x18, 1, 0x80), 0x000000f0, 0x00e00003,
940 PCI_ADDR(0, 0x18, 1, 0x88), 0x000000f0, 0x00d80003,
941 PCI_ADDR(0, 0x18, 1, 0x90), 0x000000f0, 0x00e20003,
942 PCI_ADDR(0, 0x18, 1, 0x98), 0x000000f0, 0x00000000,
943 PCI_ADDR(0, 0x18, 1, 0xA0), 0x000000f0, 0x00000000,
944 PCI_ADDR(0, 0x18, 1, 0xA8), 0x000000f0, 0x00000000,
945 PCI_ADDR(0, 0x18, 1, 0xB0), 0x000000f0, 0x00000a03,
947 PCI_ADDR(0, 0x18, 1, 0xB8), 0x000000f0, 0x00400003,
950 PCI_ADDR(0, 0x18, 1, 0xB8), 0x000000f0, 0x00200003,
953 /* PCI I/O Limit i Registers
958 * [ 2: 0] Destination Node ID
968 * [ 5: 4] Destination Link ID
974 * [24:12] PCI I/O Limit Address i
975 * This field defines the end of PCI I/O region n
978 PCI_ADDR(0, 0x18, 1, 0xC4), 0xFE000FC8, 0x0000d000,
979 PCI_ADDR(0, 0x18, 1, 0xCC), 0xFE000FC8, 0x000ff000,
980 PCI_ADDR(0, 0x18, 1, 0xD4), 0xFE000FC8, 0x00000000,
981 PCI_ADDR(0, 0x18, 1, 0xDC), 0xFE000FC8, 0x00000000,
983 /* PCI I/O Base i Registers
988 * [ 0: 0] Read Enable
991 * [ 1: 1] Write Enable
992 * 0 = Writes Disabled
996 * 0 = VGA matches Disabled
997 * 1 = matches all address < 64K and where A[9:0] is in the
998 * range 3B0-3BB or 3C0-3DF independen of the base & limit registers
1000 * 0 = ISA matches Disabled
1001 * 1 = Blocks address < 64K and in the last 768 bytes of eack 1K block
1002 * from matching agains this base/limit pair
1004 * [24:12] PCI I/O Base i
1005 * This field defines the start of PCI I/O region n
1008 PCI_ADDR(0, 0x18, 1, 0xC0), 0xFE000FCC, 0x0000d003,
1009 PCI_ADDR(0, 0x18, 1, 0xC8), 0xFE000FCC, 0x00001013,
1010 PCI_ADDR(0, 0x18, 1, 0xD0), 0xFE000FCC, 0x00000000,
1011 PCI_ADDR(0, 0x18, 1, 0xD8), 0xFE000FCC, 0x00000000,
1013 /* Config Base and Limit i Registers
1018 * [ 0: 0] Read Enable
1019 * 0 = Reads Disabled
1021 * [ 1: 1] Write Enable
1022 * 0 = Writes Disabled
1023 * 1 = Writes Enabled
1024 * [ 2: 2] Device Number Compare Enable
1025 * 0 = The ranges are based on bus number
1026 * 1 = The ranges are ranges of devices on bus 0
1028 * [ 6: 4] Destination Node
1038 * [ 9: 8] Destination Link
1044 * [23:16] Bus Number Base i
1045 * This field defines the lowest bus number in configuration region i
1046 * [31:24] Bus Number Limit i
1047 * This field defines the highest bus number in configuration regin i
1049 PCI_ADDR(0, 0x18, 1, 0xE0), 0x0000FC88, 0xff000003,
1050 PCI_ADDR(0, 0x18, 1, 0xE4), 0x0000FC88, 0x00000000,
1051 PCI_ADDR(0, 0x18, 1, 0xE8), 0x0000FC88, 0x00000000,
1052 PCI_ADDR(0, 0x18, 1, 0xEC), 0x0000FC88, 0x00000000,
1057 print_debug("setting up coherent ht domain....\r\n");
1058 max = sizeof(register_values)/sizeof(register_values[0]);
1059 for(i = 0; i < max; i += 3) {
1062 print_debug_hex32(register_values[i]);
1064 print_debug_hex32(register_values[i+2]);
1065 print_debug("\r\n");
1068 reg = pci_read_config32(register_values[i]);
1069 reg &= register_values[i+1];
1070 reg |= register_values[i+2] & ~register_values[i+1];
1071 pci_write_config32(register_values[i], reg);
1074 print_debug("done.\r\n");
1077 static void main(void)
1079 static const char msg[] = "hello world\r\n";
1081 write(STDOUT_FILENO, msg, sizeof(msg));
1084 setup_coherent_ht_domain();