b5db71d3eb331fd710536a38711ecf584627a0c9
[coreboot.git] / src / mainboard / technologic / ts5300 / romstage.c
1 /*
2  * TS5300 specific initialization code.
3  *   written by Stefan Reinauer <stepan@coresystems.de>
4  *   (c) 2006 coresystems GmbH
5  */
6
7 #define ASM_CONSOLE_LOGLEVEL 6
8 #include <stdint.h>
9 #include <device/pci_def.h>
10 #include <arch/io.h>
11 #include <device/pnp_def.h>
12 #include <arch/romcc_io.h>
13 #include <arch/hlt.h>
14 #include "pc80/mc146818rtc_early.c"
15 #include "pc80/serial.c"
16 #include "arch/i386/lib/console.c"
17 #include "lib/ramtest.c"
18 #include "cpu/x86/bist.h"
19
20 #define TS5300_LED_OFF outb((inb(0x77)&0xfe), 0x77)
21 #define TS5300_LED_ON  outb((inb(0x77)|1), 0x77)
22
23 #define TS9500_LED_OFF outb((inb(0x19a)&0xfe), 0x19a)
24 #define TS9500_LED_ON  outb((inb(0x19a)|1), 0x19a)
25
26 /* PAR register setup */
27 void setup_pars(void)
28 {
29         volatile unsigned long *par;
30         par = (unsigned long *) 0xfffef088;
31
32         /* NOTE: Ron says, move this to mainboard.c */
33         *par++ = 0x00000000;
34         *par++ = 0x340f0070;
35         *par++ = 0x380701f0;
36         *par++ = 0x3c0103f6;
37         *par++ = 0x2c0f0300;
38         *par++ = 0x447c00a0;
39         *par++ = 0xe600000c;
40         *par++ = 0x300046e8;
41         *par++ = 0x500400d0;
42         *par++ = 0x281f0140;
43         *par++ = 0x00000000;
44         *par++ = 0x00000000;
45         *par++ = 0x00000000;
46         *par++ = 0x8a07c940; /* Flash setup */
47         *par++ = 0x00000000;
48         *par++ = 0xee00400e;
49 }
50
51 #include "cpu/amd/sc520/raminit.c"
52
53 static void identify_ts9500(void)
54 {
55         unsigned i, val;
56         
57         TS9500_LED_ON;
58
59         print_err("TS-9500 add-on found:\r\n");
60         val=inb(0x19b);
61         for (i=0; i<8; i++) {
62                 print_err("  DIP");
63                 print_err_char(i+0x31);
64                 print_err(": ");
65                 if((val&(1<<i))!=0) 
66                         print_err("on\r\n"); 
67                 else
68                         print_err("off\r\n"); 
69         }
70         print_err("\r\n");
71         
72         val=inb(0x19a);
73         
74         for (i=6; i<8; i++) {
75                 print_err("  JP");
76                 print_err_char(i+0x30-5);
77                 print_err(": ");
78                 if((val&(1<<i))!=0) 
79                         print_err("on\r\n"); 
80                 else
81                         print_err("off\r\n"); 
82         }
83         print_err("\r\n");
84
85         TS9500_LED_OFF;
86 }
87
88 static void identify_system(void)
89 {
90         unsigned i,val;
91
92         print_err("Mainboard: ");
93         val=inb(0x74);
94         switch(val) {
95         case 0x50: print_err("TS-5300\r\n"); break;
96         case 0x40: print_err("TS-5400\r\n"); break;
97         case 0x60: print_err("TS-5500\r\n"); break;
98         case 0x20: print_err("TS-5600\r\n"); break;
99         case 0x70: print_err("TS-5700\r\n"); break;
100         default:   print_err("unknown\r\n"); break;
101         }
102
103         val=inb(0x75);
104         print_err("  SRAM option:   ");
105         if((val&1)==0) print_err("not ");
106         print_err("installed\r\n");
107         
108         print_err("  RS-485 option: ");
109         if((val&2)==0) print_err("not ");
110         print_err("installed\r\n");
111
112         val=inb(0x76);
113         print_err("  Temp. range:   ");
114         if((val&2)==0) print_err("commercial\r\n"); 
115         else print_err("industrial\r\n");
116         
117         print_err("\r\n");
118         
119         val=inb(0x77);
120         for (i=1; i<8; i++) {
121                 print_err("  JP");
122                 print_err_char(i+0x30);
123                 print_err(": ");
124                 if((val&(1<<i))!=0) 
125                         print_err("on\r\n"); 
126                 else
127                         print_err("off\r\n"); 
128         }
129         print_err("\r\n");
130
131         /* Detect TS-9500 */
132         val=inb(0x19d);
133         if(val==0x5f) 
134                 identify_ts9500();
135
136 }
137
138 static void hard_reset(void)
139 {
140         print_err("Hard reset called.\n");
141         while (1) ;
142 }
143
144 static void main(unsigned long bist)
145 {
146         volatile int i;
147         unsigned val;
148         
149         TS5300_LED_ON;
150         
151         // Let the hardware settle a bit.
152         for(i = 0; i < 100; i++)
153                 ;
154         
155         setupsc520();
156         uart_init();
157         console_init();
158         
159         
160         print_err("Technologic Systems TS5300 - http://www.embeddedx86.com/\r\n");
161         staticmem();
162         print_err("Memory initialized: 32MB\r\n");
163
164 #if 1
165         identify_system();
166 #endif
167
168 #if 0
169         // Check 32MB of memory @ 0 (very slow!)
170         print_err("Checking memory:\r\n");
171         ram_check(0x00000000, 0x000a0000);
172         ram_check(0x000b0000, 0x02000000);
173 #endif
174         
175         TS5300_LED_OFF;
176 }
177