1# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2# 1 "<built-in>" 3# 1 "<command line>" 4# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 5 6# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/arch/i386/include/stdint.h" 1 7# 11 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/arch/i386/include/stdint.h" 8typedef unsigned char uint8_t; 9typedef signed char int8_t; 10 11typedef unsigned short uint16_t; 12typedef signed short int16_t; 13 14typedef unsigned int uint32_t; 15typedef signed int int32_t; 16 17 18 19 20 21 22 23typedef unsigned char uint_least8_t; 24typedef signed char int_least8_t; 25 26typedef unsigned short uint_least16_t; 27typedef signed short int_least16_t; 28 29typedef unsigned int uint_least32_t; 30typedef signed int int_least32_t; 31 32 33 34 35 36 37 38typedef unsigned char uint_fast8_t; 39typedef signed char int_fast8_t; 40 41typedef unsigned int uint_fast16_t; 42typedef signed int int_fast16_t; 43 44typedef unsigned int uint_fast32_t; 45typedef signed int int_fast32_t; 46 47 48 49 50 51 52 53typedef int intptr_t; 54typedef unsigned int uintptr_t; 55 56 57 58 59 60 61typedef long int intmax_t; 62typedef unsigned long int uintmax_t; 63# 3 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 64# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/include/device/pci_def.h" 1 65# 4 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 66# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/arch/i386/include/arch/romcc_io.h" 1 67static void outb(unsigned char value, unsigned short port) 68{ 69 __builtin_outb(value, port); 70} 71 72static void outw(unsigned short value, unsigned short port) 73{ 74 __builtin_outw(value, port); 75} 76 77static void outl(unsigned int value, unsigned short port) 78{ 79 __builtin_outl(value, port); 80} 81 82 83static unsigned char inb(unsigned short port) 84{ 85 return __builtin_inb(port); 86} 87 88 89static unsigned char inw(unsigned short port) 90{ 91 return __builtin_inw(port); 92} 93 94static unsigned char inl(unsigned short port) 95{ 96 return __builtin_inl(port); 97} 98 99static void hlt(void) 100{ 101 __builtin_hlt(); 102} 103 104typedef __builtin_msr_t msr_t; 105 106static msr_t rdmsr(unsigned long index) 107{ 108 return __builtin_rdmsr(index); 109} 110 111static void wrmsr(unsigned long index, msr_t msr) 112{ 113 __builtin_wrmsr(index, msr.lo, msr.hi); 114} 115 116 117 118 119 120 121 122static unsigned char pci_read_config8(unsigned addr) 123{ 124 outl(0x80000000 | (addr & ~3), 0xCF8); 125 return inb(0xCFC + (addr & 3)); 126} 127 128static unsigned short pci_read_config16(unsigned addr) 129{ 130 outl(0x80000000 | (addr & ~3), 0xCF8); 131 return inw(0xCFC + (addr & 2)); 132} 133 134static unsigned int pci_read_config32(unsigned addr) 135{ 136 outl(0x80000000 | (addr & ~3), 0xCF8); 137 return inl(0xCFC); 138} 139 140static void pci_write_config8(unsigned addr, unsigned char value) 141{ 142 outl(0x80000000 | (addr & ~3), 0xCF8); 143 outb(value, 0xCFC + (addr & 3)); 144} 145 146static void pci_write_config16(unsigned addr, unsigned short value) 147{ 148 outl(0x80000000 | (addr & ~3), 0xCF8); 149 outw(value, 0xCFC + (addr & 2)); 150} 151 152static void pci_write_config32(unsigned addr, unsigned int value) 153{ 154 outl(0x80000000 | (addr & ~3), 0xCF8); 155 outl(value, 0xCFC); 156} 157# 5 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 158# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/pc80/serial.c" 1 159# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/include/part/fallback_boot.h" 1 160# 2 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/pc80/serial.c" 2 161# 44 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/pc80/serial.c" 162static int uart_can_tx_byte(void) 163{ 164 return inb(0x3f8 + 0x05) & 0x20; 165} 166 167static void uart_wait_to_tx_byte(void) 168{ 169 while(!uart_can_tx_byte()) 170 ; 171} 172 173static void uart_wait_until_sent(void) 174{ 175 while(!(inb(0x3f8 + 0x05) & 0x40)) 176 ; 177} 178 179static void uart_tx_byte(unsigned char data) 180{ 181 uart_wait_to_tx_byte(); 182 outb(data, 0x3f8 + 0x00); 183 184 uart_wait_until_sent(); 185} 186 187static void uart_init(void) 188{ 189 190 outb(0x0, 0x3f8 + 0x01); 191 192 outb(0x01, 0x3f8 + 0x02); 193 194 outb(0x80 | 0x3, 0x3f8 + 0x03); 195# 89 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/pc80/serial.c" 196 outb((115200/9600) & 0xFF, 0x3f8 + 0x00); 197 outb(((115200/9600) >> 8) & 0xFF, 0x3f8 + 0x01); 198 199 outb(0x3, 0x3f8 + 0x03); 200} 201# 6 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 202# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/arch/i386/lib/console.c" 1 203# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/include/console/loglevel.h" 1 204# 2 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/arch/i386/lib/console.c" 2 205 206static void __console_tx_byte(unsigned char byte) 207{ 208 uart_tx_byte(byte); 209} 210 211static void __console_tx_nibble(unsigned nibble) 212{ 213 unsigned char digit; 214 digit = nibble + '0'; 215 if (digit > '9') { 216 digit += 39; 217 } 218 __console_tx_byte(digit); 219} 220 221static void __console_tx_char(int loglevel, unsigned char byte) 222{ 223 if (8 > loglevel) { 224 uart_tx_byte(byte); 225 } 226} 227 228static void __console_tx_hex8(int loglevel, unsigned char value) 229{ 230 if (8 > loglevel) { 231 __console_tx_nibble((value >> 4U) & 0x0fU); 232 __console_tx_nibble(value & 0x0fU); 233 } 234} 235 236static void __console_tx_hex16(int loglevel, unsigned short value) 237{ 238 if (8 > loglevel) { 239 __console_tx_nibble((value >> 12U) & 0x0fU); 240 __console_tx_nibble((value >> 8U) & 0x0fU); 241 __console_tx_nibble((value >> 4U) & 0x0fU); 242 __console_tx_nibble(value & 0x0fU); 243 } 244} 245 246static void __console_tx_hex32(int loglevel, unsigned int value) 247{ 248 if (8 > loglevel) { 249 __console_tx_nibble((value >> 28U) & 0x0fU); 250 __console_tx_nibble((value >> 24U) & 0x0fU); 251 __console_tx_nibble((value >> 20U) & 0x0fU); 252 __console_tx_nibble((value >> 16U) & 0x0fU); 253 __console_tx_nibble((value >> 12U) & 0x0fU); 254 __console_tx_nibble((value >> 8U) & 0x0fU); 255 __console_tx_nibble((value >> 4U) & 0x0fU); 256 __console_tx_nibble(value & 0x0fU); 257 } 258} 259 260static void __console_tx_string(int loglevel, const char *str) 261{ 262 if (8 > loglevel) { 263 unsigned char ch; 264 while((ch = *str++) != '\0') { 265 __console_tx_byte(ch); 266 } 267 } 268} 269 270static void print_emerg_char(unsigned char byte) { __console_tx_char(0, byte); } 271static void print_emerg_hex8(unsigned char value){ __console_tx_hex8(0, value); } 272static void print_emerg_hex16(unsigned short value){ __console_tx_hex16(0, value); } 273static void print_emerg_hex32(unsigned int value) { __console_tx_hex32(0, value); } 274static void print_emerg(const char *str) { __console_tx_string(0, str); } 275 276static void print_alert_char(unsigned char byte) { __console_tx_char(1, byte); } 277static void print_alert_hex8(unsigned char value) { __console_tx_hex8(1, value); } 278static void print_alert_hex16(unsigned short value){ __console_tx_hex16(1, value); } 279static void print_alert_hex32(unsigned int value) { __console_tx_hex32(1, value); } 280static void print_alert(const char *str) { __console_tx_string(1, str); } 281 282static void print_crit_char(unsigned char byte) { __console_tx_char(2, byte); } 283static void print_crit_hex8(unsigned char value) { __console_tx_hex8(2, value); } 284static void print_crit_hex16(unsigned short value){ __console_tx_hex16(2, value); } 285static void print_crit_hex32(unsigned int value) { __console_tx_hex32(2, value); } 286static void print_crit(const char *str) { __console_tx_string(2, str); } 287 288static void print_err_char(unsigned char byte) { __console_tx_char(3, byte); } 289static void print_err_hex8(unsigned char value) { __console_tx_hex8(3, value); } 290static void print_err_hex16(unsigned short value){ __console_tx_hex16(3, value); } 291static void print_err_hex32(unsigned int value) { __console_tx_hex32(3, value); } 292static void print_err(const char *str) { __console_tx_string(3, str); } 293 294static void print_warning_char(unsigned char byte) { __console_tx_char(4, byte); } 295static void print_warning_hex8(unsigned char value) { __console_tx_hex8(4, value); } 296static void print_warning_hex16(unsigned short value){ __console_tx_hex16(4, value); } 297static void print_warning_hex32(unsigned int value) { __console_tx_hex32(4, value); } 298static void print_warning(const char *str) { __console_tx_string(4, str); } 299 300static void print_notice_char(unsigned char byte) { __console_tx_char(5, byte); } 301static void print_notice_hex8(unsigned char value) { __console_tx_hex8(5, value); } 302static void print_notice_hex16(unsigned short value){ __console_tx_hex16(5, value); } 303static void print_notice_hex32(unsigned int value) { __console_tx_hex32(5, value); } 304static void print_notice(const char *str) { __console_tx_string(5, str); } 305 306static void print_info_char(unsigned char byte) { __console_tx_char(6, byte); } 307static void print_info_hex8(unsigned char value) { __console_tx_hex8(6, value); } 308static void print_info_hex16(unsigned short value){ __console_tx_hex16(6, value); } 309static void print_info_hex32(unsigned int value) { __console_tx_hex32(6, value); } 310static void print_info(const char *str) { __console_tx_string(6, str); } 311 312static void print_debug_char(unsigned char byte) { __console_tx_char(7, byte); } 313static void print_debug_hex8(unsigned char value) { __console_tx_hex8(7, value); } 314static void print_debug_hex16(unsigned short value){ __console_tx_hex16(7, value); } 315static void print_debug_hex32(unsigned int value) { __console_tx_hex32(7, value); } 316static void print_debug(const char *str) { __console_tx_string(7, str); } 317 318static void print_spew_char(unsigned char byte) { __console_tx_char(8, byte); } 319static void print_spew_hex8(unsigned char value) { __console_tx_hex8(8, value); } 320static void print_spew_hex16(unsigned short value){ __console_tx_hex16(8, value); } 321static void print_spew_hex32(unsigned int value) { __console_tx_hex32(8, value); } 322static void print_spew(const char *str) { __console_tx_string(8, str); } 323# 128 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/arch/i386/lib/console.c" 324static void console_init(void) 325{ 326 static const char console_test[] = 327 "\r\n\r\nLinuxBIOS-" 328 "1.1.0" 329 ".0Fallback" 330 " " 331 "Mon Jun 9 18:15:20 MDT 2003" 332 " starting...\r\n"; 333 print_info(console_test); 334} 335# 7 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 336# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/ram/ramtest.c" 1 337static void write_phys(unsigned long addr, unsigned long value) 338{ 339 volatile unsigned long *ptr; 340 ptr = (void *)addr; 341 *ptr = value; 342} 343 344static unsigned long read_phys(unsigned long addr) 345{ 346 volatile unsigned long *ptr; 347 ptr = (void *)addr; 348 return *ptr; 349} 350 351void ram_fill(unsigned long start, unsigned long stop) 352{ 353 unsigned long addr; 354 355 356 357 print_debug("DRAM fill: "); 358 print_debug_hex32(start); 359 print_debug("-"); 360 print_debug_hex32(stop); 361 print_debug("\r\n"); 362 for(addr = start; addr < stop ; addr += 4) { 363 364 if ((addr & 0xffff) == 0) { 365 print_debug_hex32(addr); 366 print_debug("\r"); 367 } 368 write_phys(addr, addr); 369 }; 370 371 print_debug_hex32(addr); 372 print_debug("\r\nDRAM filled\r\n"); 373} 374 375void ram_verify(unsigned long start, unsigned long stop) 376{ 377 unsigned long addr; 378 379 380 381 print_debug("DRAM verify: "); 382 print_debug_hex32(start); 383 print_debug_char('-'); 384 print_debug_hex32(stop); 385 print_debug("\r\n"); 386 for(addr = start; addr < stop ; addr += 4) { 387 unsigned long value; 388 389 if ((addr & 0xffff) == 0) { 390 print_debug_hex32(addr); 391 print_debug("\r"); 392 } 393 value = read_phys(addr); 394 if (value != addr) { 395 396 print_err_hex32(addr); 397 print_err_char(':'); 398 print_err_hex32(value); 399 print_err("\r\n"); 400 } 401 } 402 403 print_debug_hex32(addr); 404 print_debug("\r\nDRAM verified\r\n"); 405} 406 407 408void ramcheck(unsigned long start, unsigned long stop) 409{ 410 int result; 411 412 413 414 415 416 print_debug("Testing DRAM : "); 417 print_debug_hex32(start); 418 print_debug("-"); 419 print_debug_hex32(stop); 420 print_debug("\r\n"); 421 ram_fill(start, stop); 422 ram_verify(start, stop); 423 print_debug("Done.\n"); 424} 425# 8 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 426 427static void die(const char *str) 428{ 429 print_emerg(str); 430 do { 431 hlt(); 432 } while(1); 433} 434 435 436 437 438static void sdram_set_registers(void) 439{ 440 static const unsigned int register_values[] = { 441# 51 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 442 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x44) & 0xFF)), 0x0000f8f8, 0x003f0000, 443 444 445 446 447 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x4C) & 0xFF)), 0x0000f8f8, 0x00000001, 448 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x54) & 0xFF)), 0x0000f8f8, 0x00000002, 449 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x5C) & 0xFF)), 0x0000f8f8, 0x00000003, 450 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x64) & 0xFF)), 0x0000f8f8, 0x00000004, 451 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x6C) & 0xFF)), 0x0000f8f8, 0x00000005, 452 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x74) & 0xFF)), 0x0000f8f8, 0x00000006, 453 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x7C) & 0xFF)), 0x0000f8f8, 0x00000007, 454# 93 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 455 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x40) & 0xFF)), 0x0000f8fc, 0x00000003, 456 457 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x48) & 0xFF)), 0x0000f8fc, 0x00400000, 458 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x50) & 0xFF)), 0x0000f8fc, 0x00400000, 459 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x58) & 0xFF)), 0x0000f8fc, 0x00400000, 460 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x60) & 0xFF)), 0x0000f8fc, 0x00400000, 461 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x68) & 0xFF)), 0x0000f8fc, 0x00400000, 462 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x70) & 0xFF)), 0x0000f8fc, 0x00400000, 463 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x78) & 0xFF)), 0x0000f8fc, 0x00400000, 464# 145 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 465 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x84) & 0xFF)), 0x00000048, 0x00e1ff00, 466 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x8C) & 0xFF)), 0x00000048, 0x00dfff00, 467 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x94) & 0xFF)), 0x00000048, 0x00e3ff00, 468 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x9C) & 0xFF)), 0x00000048, 0x00000000, 469 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA4) & 0xFF)), 0x00000048, 0x00000000, 470 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xAC) & 0xFF)), 0x00000048, 0x00000000, 471 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB4) & 0xFF)), 0x00000048, 0x00000b00, 472 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xBC) & 0xFF)), 0x00000048, 0x00fe0b00, 473# 180 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 474 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x80) & 0xFF)), 0x000000f0, 0x00e00003, 475 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x88) & 0xFF)), 0x000000f0, 0x00d80003, 476 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x90) & 0xFF)), 0x000000f0, 0x00e20003, 477 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x98) & 0xFF)), 0x000000f0, 0x00000000, 478 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA0) & 0xFF)), 0x000000f0, 0x00000000, 479 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA8) & 0xFF)), 0x000000f0, 0x00000000, 480 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB0) & 0xFF)), 0x000000f0, 0x00000a03, 481 482 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB8) & 0xFF)), 0x000000f0, 0x00400003, 483# 219 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 484 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC4) & 0xFF)), 0xFE000FC8, 0x0000d000, 485 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xCC) & 0xFF)), 0xFE000FC8, 0x000ff000, 486 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD4) & 0xFF)), 0xFE000FC8, 0x00000000, 487 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xDC) & 0xFF)), 0xFE000FC8, 0x00000000, 488# 249 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 489 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC0) & 0xFF)), 0xFE000FCC, 0x0000d003, 490 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC8) & 0xFF)), 0xFE000FCC, 0x00001013, 491 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD0) & 0xFF)), 0xFE000FCC, 0x00000000, 492 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD8) & 0xFF)), 0xFE000FCC, 0x00000000, 493# 290 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 494 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE0) & 0xFF)), 0x0000FC88, 0xff000003, 495 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE4) & 0xFF)), 0x0000FC88, 0x00000000, 496 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE8) & 0xFF)), 0x0000FC88, 0x00000000, 497 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xEC) & 0xFF)), 0x0000FC88, 0x00000000, 498# 316 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 499 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x40) & 0xFF)), 0x001f01fe, 0x00000001, 500 501 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x44) & 0xFF)), 0x001f01fe, 0x01000001, 502 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x48) & 0xFF)), 0x001f01fe, 0x02000001, 503 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x4C) & 0xFF)), 0x001f01fe, 0x03000001, 504 505 506 507 508 509 510 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x50) & 0xFF)), 0x001f01fe, 0x00000000, 511 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x54) & 0xFF)), 0x001f01fe, 0x00000000, 512 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x58) & 0xFF)), 0x001f01fe, 0x00000000, 513 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x5C) & 0xFF)), 0x001f01fe, 0x00000000, 514# 351 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 515 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x60) & 0xFF)), 0xC01f01ff, 0x00e0fe00, 516 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x64) & 0xFF)), 0xC01f01ff, 0x00e0fe00, 517 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x68) & 0xFF)), 0xC01f01ff, 0x00e0fe00, 518 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x6C) & 0xFF)), 0xC01f01ff, 0x00e0fe00, 519 520 521 522 523 524 525 526 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x70) & 0xFF)), 0xC01f01ff, 0x00000000, 527 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x74) & 0xFF)), 0xC01f01ff, 0x00000000, 528 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x78) & 0xFF)), 0xC01f01ff, 0x00000000, 529 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x7C) & 0xFF)), 0xC01f01ff, 0x00000000, 530# 387 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 531 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x80) & 0xFF)), 0xffff8888, 0x00000033, 532# 456 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 533 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x88) & 0xFF)), 0xe8088008, 0x03623125, 534# 487 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 535 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x8c) & 0xFF)), 0xff8fe08e, 0x00000930, 536# 563 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 537 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF)), 0xf0000000, 538 (4 << 25)|(0 << 24)| 539 (0 << 23)|(0 << 22)|(0 << 21)|(0 << 20)| 540 (1 << 19)|(1 << 18)|(0 << 17)|(0 << 16)| 541 (2 << 14)|(0 << 13)|(0 << 12)| 542 (0 << 11)|(0 << 10)|(0 << 9)|(0 << 8)| 543 (0 << 3) |(0 << 1) |(0 << 0), 544# 635 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 545 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x94) & 0xFF)), 0xc180f0f0, 0x0e2b0a05, 546# 655 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 547 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x98) & 0xFF)), 0xfc00ffff, 0x00000000, 548# 689 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 549 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((3) & 0x07) << 8) | ((0x58) & 0xFF)), 0xffe0e0e0, 0x00000000, 550# 698 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 551 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((3) & 0x07) << 8) | ((0x5C) & 0xFF)), 0x0000003e, 0x00000000, 552 553 554 555 556 557 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((3) & 0x07) << 8) | ((0x60) & 0xFF)), 0xffffff00, 0x00000000, 558 }; 559 int i; 560 int max; 561 print_debug("setting up CPU0 northbridge registers\r\n"); 562 max = sizeof(register_values)/sizeof(register_values[0]); 563 for(i = 0; i < max; i += 3) { 564 unsigned long reg; 565 566 567 568 569 570 571 reg = pci_read_config32(register_values[i]); 572 reg &= register_values[i+1]; 573 reg |= register_values[i+2]; 574 pci_write_config32(register_values[i], reg); 575 } 576 print_debug("done.\r\n"); 577} 578# 743 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 579static void sdram_set_spd_registers(void) 580{ 581 unsigned long dcl; 582 dcl = pci_read_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF))); 583 584 dcl &= ~(1<<17); 585 pci_write_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF)), dcl); 586} 587 588 589static void sdram_enable(void) 590{ 591 unsigned long dcl; 592 593 594 dcl = pci_read_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF))); 595 print_debug("dcl: "); 596 print_debug_hex32(dcl); 597 print_debug("\r\n"); 598 dcl |= (1<<3); 599 pci_write_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF)), dcl); 600 dcl &= ~(1<<3); 601 dcl &= ~(1<<0); 602 dcl &= ~(1<<1); 603 dcl &= ~(1<<2); 604 dcl |= (1<<8); 605 pci_write_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF)), dcl); 606 607 print_debug("Initializing memory: "); 608 int loops = 0; 609 do { 610 dcl = pci_read_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((2) & 0x07) << 8) | ((0x90) & 0xFF))); 611 loops += 1; 612 if ((loops & 1023) == 0) { 613 print_debug("."); 614 } 615 } while(((dcl & (1<<8)) != 0) && (loops < 300000)); 616 if (loops >= 300000) { 617 print_debug(" failed\r\n"); 618 } else { 619 print_debug(" done\r\n"); 620 } 621# 803 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 622} 623 624static void sdram_first_normal_reference(void) {} 625static void sdram_enable_refresh(void) {} 626static void sdram_special_finishup(void) {} 627 628# 1 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/sdram/generic_sdram.c" 1 629void sdram_no_memory(void) 630{ 631 print_err("No memory!!\r\n"); 632 while(1) { 633 hlt(); 634 } 635} 636 637 638void sdram_initialize(void) 639{ 640 print_debug("Ram1\r\n"); 641 642 sdram_set_registers(); 643 644 print_debug("Ram2\r\n"); 645 646 sdram_set_spd_registers(); 647 648 print_debug("Ram3\r\n"); 649 650 651 652 653 sdram_enable(); 654 655 print_debug("Ram4\r\n"); 656 sdram_first_normal_reference(); 657 658 print_debug("Ram5\r\n"); 659 sdram_enable_refresh(); 660 sdram_special_finishup(); 661 662 print_debug("Ram6\r\n"); 663} 664# 810 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 2 665 666static int boot_cpu(void) 667{ 668 volatile unsigned long *local_apic; 669 unsigned long apic_id; 670 int bsp; 671 msr_t msr; 672 msr = rdmsr(0x1b); 673 bsp = !!(msr.lo & (1 << 8)); 674 if (bsp) { 675 print_debug("Bootstrap cpu\r\n"); 676 } 677 678 return bsp; 679} 680 681static int cpu_init_detected(void) 682{ 683 unsigned long dcl; 684 int cpu_init; 685 686 unsigned long htic; 687 688 htic = pci_read_config32(( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x6c) & 0xFF))); 689# 849 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 690 cpu_init = (htic & (1<<6)); 691 if (cpu_init) { 692 print_debug("CPU INIT Detected.\r\n"); 693 } 694 return cpu_init; 695} 696 697static void setup_coherent_ht_domain(void) 698{ 699 static const unsigned int register_values[] = { 700# 884 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 701 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x40) & 0xFF)), 0xfff0f0f0, 0x00010101, 702 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x44) & 0xFF)), 0xfff0f0f0, 0x00010101, 703 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x48) & 0xFF)), 0xfff0f0f0, 0x00010101, 704 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x4c) & 0xFF)), 0xfff0f0f0, 0x00010101, 705 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x50) & 0xFF)), 0xfff0f0f0, 0x00010101, 706 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x54) & 0xFF)), 0xfff0f0f0, 0x00010101, 707 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x58) & 0xFF)), 0xfff0f0f0, 0x00010101, 708 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x5c) & 0xFF)), 0xfff0f0f0, 0x00010101, 709# 983 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 710 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x68) & 0xFF)), 0x00800000, 0x0f00840f, 711# 1005 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 712 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x6C) & 0xFF)), 0xffffff8c, 0x00000000 | (1 << 6) |(1 << 5)| (1 << 4), 713# 1082 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 714 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x84) & 0xFF)), 0x00009c05, 0x11110020, 715# 1127 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 716 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x88) & 0xFF)), 0xfffff0ff, 0x00000200, 717# 1148 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 718 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x94) & 0xFF)), 0xff000000, 0x00ff0000, 719# 1182 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 720 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x44) & 0xFF)), 0x0000f8f8, 0x003f0000, 721 722 723 724 725 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x4C) & 0xFF)), 0x0000f8f8, 0x00000001, 726 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x54) & 0xFF)), 0x0000f8f8, 0x00000002, 727 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x5C) & 0xFF)), 0x0000f8f8, 0x00000003, 728 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x64) & 0xFF)), 0x0000f8f8, 0x00000004, 729 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x6C) & 0xFF)), 0x0000f8f8, 0x00000005, 730 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x74) & 0xFF)), 0x0000f8f8, 0x00000006, 731 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x7C) & 0xFF)), 0x0000f8f8, 0x00000007, 732# 1224 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 733 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x40) & 0xFF)), 0x0000f8fc, 0x00000003, 734 735 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x48) & 0xFF)), 0x0000f8fc, 0x00400000, 736 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x50) & 0xFF)), 0x0000f8fc, 0x00400000, 737 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x58) & 0xFF)), 0x0000f8fc, 0x00400000, 738 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x60) & 0xFF)), 0x0000f8fc, 0x00400000, 739 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x68) & 0xFF)), 0x0000f8fc, 0x00400000, 740 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x70) & 0xFF)), 0x0000f8fc, 0x00400000, 741 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x78) & 0xFF)), 0x0000f8fc, 0x00400000, 742# 1276 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 743 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x84) & 0xFF)), 0x00000048, 0x00e1ff00, 744 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x8C) & 0xFF)), 0x00000048, 0x00dfff00, 745 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x94) & 0xFF)), 0x00000048, 0x00e3ff00, 746 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x9C) & 0xFF)), 0x00000048, 0x00000000, 747 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA4) & 0xFF)), 0x00000048, 0x00000000, 748 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xAC) & 0xFF)), 0x00000048, 0x00000000, 749 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB4) & 0xFF)), 0x00000048, 0x00000b00, 750 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xBC) & 0xFF)), 0x00000048, 0x00fe0b00, 751# 1311 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 752 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x80) & 0xFF)), 0x000000f0, 0x00e00003, 753 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x88) & 0xFF)), 0x000000f0, 0x00d80003, 754 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x90) & 0xFF)), 0x000000f0, 0x00e20003, 755 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0x98) & 0xFF)), 0x000000f0, 0x00000000, 756 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA0) & 0xFF)), 0x000000f0, 0x00000000, 757 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xA8) & 0xFF)), 0x000000f0, 0x00000000, 758 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB0) & 0xFF)), 0x000000f0, 0x00000a03, 759 760 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xB8) & 0xFF)), 0x000000f0, 0x00400003, 761# 1350 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 762 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC4) & 0xFF)), 0xFE000FC8, 0x0000d000, 763 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xCC) & 0xFF)), 0xFE000FC8, 0x000ff000, 764 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD4) & 0xFF)), 0xFE000FC8, 0x00000000, 765 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xDC) & 0xFF)), 0xFE000FC8, 0x00000000, 766# 1380 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 767 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC0) & 0xFF)), 0xFE000FCC, 0x0000d003, 768 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xC8) & 0xFF)), 0xFE000FCC, 0x00001013, 769 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD0) & 0xFF)), 0xFE000FCC, 0x00000000, 770 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xD8) & 0xFF)), 0xFE000FCC, 0x00000000, 771# 1421 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 772 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE0) & 0xFF)), 0x0000FC88, 0xff000003, 773 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE4) & 0xFF)), 0x0000FC88, 0x00000000, 774 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xE8) & 0xFF)), 0x0000FC88, 0x00000000, 775 ( (((0) & 0xFF) << 16) | (((0x18) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0xEC) & 0xFF)), 0x0000FC88, 0x00000000, 776 777 }; 778 int i; 779 int max; 780 print_debug("setting up coherent ht domain....\r\n"); 781 max = sizeof(register_values)/sizeof(register_values[0]); 782 for(i = 0; i < max; i += 3) { 783 unsigned long reg; 784 785 786 787 788 789 790 reg = pci_read_config32(register_values[i]); 791 reg &= register_values[i+1]; 792 reg |= register_values[i+2] & ~register_values[i+1]; 793 pci_write_config32(register_values[i], reg); 794 } 795 print_debug("done.\r\n"); 796} 797 798static void enumerate_ht_chain(void) 799{ 800 unsigned next_unitid, last_unitid;; 801 next_unitid = 1; 802 do { 803 uint32_t id; 804 uint8_t hdr_type, pos; 805 last_unitid = next_unitid; 806 807 id = pci_read_config32(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x00) & 0xFF))); 808 809 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) || 810 (((id >> 16) & 0xffff) == 0xffff) || 811 (((id >> 16) & 0xffff) == 0x0000)) { 812 break; 813 } 814 hdr_type = pci_read_config8(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x0e) & 0xFF))); 815 pos = 0; 816 hdr_type &= 0x7f; 817 818 if ((hdr_type == 0) || 819 (hdr_type == 1)) { 820 pos = pci_read_config8(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0x34) & 0xFF))); 821 } 822 while(pos != 0) { 823 uint8_t cap; 824 cap = pci_read_config8(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((pos + 0) & 0xFF))); 825 if (cap == 0x08) { 826 uint16_t flags; 827 flags = pci_read_config16(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((pos + 2) & 0xFF))); 828 if ((flags >> 13) == 0) { 829 unsigned count; 830 flags &= ~0x1f; 831 flags |= next_unitid & 0x1f; 832 count = (flags >> 5) & 0x1f; 833 pci_write_config16(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((pos + 2) & 0xFF)), flags); 834 next_unitid += count; 835 break; 836 } 837 } 838 pos = pci_read_config8(( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((pos + 1) & 0xFF))); 839 } 840 } while((last_unitid != next_unitid) && (next_unitid <= 0x1f)); 841} 842 843static void print_pci_devices(void) 844{ 845 uint32_t addr; 846 for(addr = ( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0) & 0xFF)); 847 addr <= ( (((0) & 0xFF) << 16) | (((0x1f) & 0x1f) << 11) | (((0x7) & 0x07) << 8) | ((0) & 0xFF)); 848 addr += ( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0) & 0xFF))) { 849 uint32_t id; 850 id = pci_read_config32(addr + 0x00); 851 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) || 852 (((id >> 16) & 0xffff) == 0xffff) || 853 (((id >> 16) & 0xffff) == 0x0000)) { 854 continue; 855 } 856 print_debug("PCI: 00:"); 857 print_debug_hex8(addr >> 11); 858 print_debug_char('.'); 859 print_debug_hex8((addr >> 8) & 7); 860 print_debug("\r\n"); 861 } 862} 863# 1525 "/home/eric/projects/linuxbios/checkin/solo/freebios2/src/mainboard/amd/solo/auto.c" 864static void enable_smbus(void) 865{ 866 uint32_t addr; 867 for(addr = ( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((0) & 0x07) << 8) | ((0) & 0xFF)); 868 addr <= ( (((0) & 0xFF) << 16) | (((0x1f) & 0x1f) << 11) | (((0x7) & 0x07) << 8) | ((0) & 0xFF)); 869 addr += ( (((0) & 0xFF) << 16) | (((0) & 0x1f) << 11) | (((1) & 0x07) << 8) | ((0) & 0xFF))) { 870 uint32_t id; 871 id = pci_read_config32(addr); 872 if (id == ((0x746b << 16) | (0x1022))) { 873 break; 874 } 875 } 876 if (addr > ( (((0) & 0xFF) << 16) | (((0x1f) & 0x1f) << 11) | (((0x7) & 0x07) << 8) | ((0) & 0xFF))) { 877 die("SMBUS controller not found\r\n"); 878 } 879 uint8_t enable; 880 print_debug("SMBus controller enabled\r\n"); 881 pci_write_config32(addr + 0x58, 0x1000 | 1); 882 enable = pci_read_config8(addr + 0x41); 883 pci_write_config8(addr + 0x41, enable | (1 << 7)); 884} 885 886 887static inline void smbus_delay(void) 888{ 889 outb(0x80, 0x80); 890} 891 892static int smbus_wait_until_ready(void) 893{ 894 unsigned long loops; 895 loops = (100*1000*10); 896 do { 897 unsigned short val; 898 smbus_delay(); 899 val = inw(0x1000 + 0xe0); 900 if ((val & 0x800) == 0) { 901 break; 902 } 903 } while(--loops); 904 return loops?0:-1; 905} 906 907static int smbus_wait_until_done(void) 908{ 909 unsigned long loops; 910 loops = (100*1000*10); 911 do { 912 unsigned short val; 913 smbus_delay(); 914 915 val = inw(0x1000 + 0xe0); 916 if (((val & 0x8) == 0) || ((val & 0x437) != 0)) { 917 break; 918 } 919 } while(--loops); 920 return loops?0:-1; 921} 922 923static int smbus_read_byte(unsigned device, unsigned address) 924{ 925 unsigned char global_control_register; 926 unsigned char global_status_register; 927 unsigned char byte; 928 929 if (smbus_wait_until_ready() < 0) { 930 return -1; 931 } 932 933 934 935 outw(inw(0x1000 + 0xe2) & ~((1<<10)|(1<<9)|(1<<8)|(1<<4)), 0x1000 + 0xe2); 936 937 outw(((device & 0x7f) << 1) | 1, 0x1000 + 0xe4); 938 939 outb(address & 0xFF, 0x1000 + 0xe8); 940 941 outw((inw(0x1000 + 0xe2) & ~7) | (0x2), 0x1000 + 0xe2); 942 943 944 945 outw(inw(0x1000 + 0xe0), 0x1000 + 0xe0); 946 947 948 outw(0, 0x1000 + 0xe6); 949 950 951 outw((inw(0x1000 + 0xe2) | (1 << 3)), 0x1000 + 0xe2); 952 953 954 955 if (smbus_wait_until_done() < 0) { 956 return -1; 957 } 958 959 global_status_register = inw(0x1000 + 0xe0); 960 961 962 byte = inw(0x1000 + 0xe6) & 0xff; 963 964 if (global_status_register != (1 << 4)) { 965 return -1; 966 } 967 return byte; 968} 969 970static void dump_spd_registers(void) 971{ 972 unsigned device; 973 device = (0xa << 3); 974 print_debug("\r\n"); 975 while(device <= ((0xa << 3) +1)) { 976 int i; 977 print_debug("dimm: "); 978 print_debug_hex8(device); 979 for(i = 0; i < 256; i++) { 980 int status; 981 unsigned char byte; 982 if ((i & 0xf) == 0) { 983 print_debug("\r\n"); 984 print_debug_hex8(i); 985 print_debug(": "); 986 } 987 status = smbus_read_byte(device, i); 988 if (status < 0) { 989 print_debug("bad device\r\n"); 990 continue; 991 } 992 byte = status & 0xff; 993 print_debug_hex8(byte); 994 print_debug_char(' '); 995 } 996 device += 1; 997 print_debug("\r\n"); 998 } 999} 1000
1001static void dump_spd_registers1(void) 1002{ 1003 int i; 1004 print_debug("dimm: "); 1005 print_debug_hex8((0xa << 3)); 1006 for(i = 0; i < 256; i++) { 1007 int status; 1008 unsigned char byte; 1009 if ((i & 0xf) == 0) { 1010 print_debug("\r\n"); 1011 print_debug_hex8(i); 1012 print_debug(": "); 1013 } 1014 status = smbus_read_byte((0xa << 3), i); 1015 if (status < 0) { 1016 print_debug("bad device\r\n"); 1017 break; 1018 } 1019 byte = status & 0xff; 1020 print_debug_hex8(byte); 1021 print_debug_char(' '); 1022 } 1023 print_debug("\r\n"); 1024} 1025 1026 1027 1028static void dump_spd_registers2(void) 1029{ 1030 unsigned dev; 1031 print_debug("\r\n"); 1032 for(dev = (0xa << 3); dev <= ((0xa << 3) +1); dev += 1) { 1033 print_debug("dimm: "); 1034 print_debug_hex8(dev); 1035 int status; 1036 unsigned char byte; 1037 status = smbus_read_byte(dev, 0); 1038 if (status < 0) { 1039 print_debug("bad device\r\n"); 1040 continue; 1041 } 1042 byte = status & 0xff; 1043 print_debug_hex8(byte); 1044 print_debug("\r\n"); 1045 } 1046} 1047 1048static void main(void) 1049{ 1050 uart_init(); 1051 console_init(); 1052 if (boot_cpu() && !cpu_init_detected()) { 1053 setup_coherent_ht_domain(); 1054 enumerate_ht_chain(); 1055 print_pci_devices(); 1056 enable_smbus(); 1057 sdram_initialize(); 1058 1059 1060 1061 dump_spd_registers1(); 1062 dump_spd_registers2(); 1063 1064 1065 1066 1067 1068 ram_fill( 0x00000000, 0x00001000); 1069 ram_verify(0x00000000, 0x00001000); 1070 1071 1072 1073 1074 1075 } 1076} 1077

