coreboot/util/romcc/tests/raminit_test3.c
<<
>>
Prefs
   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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.