- sc520 updates. move PAR setup to mainboard auto.c
[coreboot.git] / src / mainboard / digitallogic / msm586seg / auto.c
1 #define ASSEMBLY 1
2 #define ASM_CONSOLE_LOGLEVEL 8
3 #include <stdint.h>
4 #include <device/pci_def.h>
5 #include <arch/io.h>
6 #include <device/pnp_def.h>
7 #include <arch/romcc_io.h>
8 #include <arch/hlt.h>
9 #include "pc80/mc146818rtc_early.c"
10 #include "pc80/serial.c"
11 #include "arch/i386/lib/console.c"
12 #include "ram/ramtest.c"
13 #include "cpu/x86/bist.h"
14 //#include "lib/delay.c"
15
16 void setup_pars(void)
17 {
18         volatile unsigned long *par;
19         /* as per the book: */
20         /* PAR register setup */
21         /* set up the PAR registers as they are on the MSM586SEG */
22         par = (unsigned long *) 0xfffef088;
23
24         /* NOTE: move this to mainboard.c ASAP */
25         *par++ = 0x607c00a0; /*PAR0: PCI:Base 0xa0000; size 0x1f000:*/
26         *par++ = 0x480400d8; /*PAR1: GP BUS MEM:CS2:Base 0xd8, size 0x4:*/
27         *par++ = 0x340100ea; /*PAR2: GP BUS IO:CS5:Base 0xea, size 0x1:*/
28         *par++ = 0x380701f0; /*PAR3: GP BUS IO:CS6:Base 0x1f0, size 0x7:*/
29         *par++ = 0x3c0003f6; /*PAR4: GP BUS IO:CS7:Base 0x3f6, size 0x0:*/
30         *par++ = 0x35ff0400; /*PAR5: GP BUS IO:CS5:Base 0x400, size 0xff:*/
31         *par++ = 0x35ff0600; /*PAR6: GP BUS IO:CS5:Base 0x600, size 0xff:*/
32         *par++ = 0x35ff0800; /*PAR7: GP BUS IO:CS5:Base 0x800, size 0xff:*/
33         *par++ = 0x35ff0a00; /*PAR8: GP BUS IO:CS5:Base 0xa00, size 0xff:*/
34         *par++ = 0x35ff0e00; /*PAR9: GP BUS IO:CS5:Base 0xe00, size 0xff:*/
35         *par++ = 0x34fb0104; /*PAR10: GP BUS IO:CS5:Base 0x104, size 0xfb:*/
36         *par++ = 0x35af0200; /*PAR11: GP BUS IO:CS5:Base 0x200, size 0xaf:*/
37         *par++ = 0x341f03e0; /*PAR12: GP BUS IO:CS5:Base 0x3e0, size 0x1f:*/
38         *par++ = 0xe41c00c0; /*PAR13: SDRAM:code:cache:nowrite:Base 0xc0000, size 0x7000:*/
39         *par++ = 0x545c00c8; /*PAR14: GP BUS MEM:CS5:Base 0xc8, size 0x5c:*/
40         *par++ = 0x8a020200; /*PAR15: BOOTCS:code:nocache:write:Base 0x2000000, size 0x80000:*/
41 }
42
43 #include "cpu/amd/sc520/raminit.c"
44
45 typedef void (*lj)(void);
46
47
48
49 struct mem_controller {
50         int i;
51 };
52
53 static void hard_reset(void)
54 {
55 }
56
57 static void memreset_setup(void)
58 {
59 }
60
61 static void memreset(int controllers, const struct mem_controller *ctrl)
62 {
63 }
64
65
66
67 static inline void activate_spd_rom(const struct mem_controller *ctrl)
68 {
69         /* nothing to do */
70 }
71  
72 static inline int spd_read_byte(unsigned device, unsigned address)
73 {
74 //      return smbus_read_byte(device, address);
75 }
76
77 //#include "sdram/generic_sdram.c"
78
79 static inline void dumpmem(void){
80   int i, j;
81   unsigned char *l;
82   unsigned char c;
83
84   for(i = 0x4000; i < 0x5000; i += 16) {
85     print_err_hex32(i); print_err(":");
86     for(j = 0; j < 16; j++) {
87       l = (unsigned char *)i + j;
88       c = *l;
89       print_err_hex8(c);
90       print_err(" ");
91     }
92     print_err("\r\n");
93   }
94 }
95
96
97 static inline void irqinit(void){
98         volatile unsigned char *cp;
99 #if 0
100 /* these values taken from the msm board itself.
101  * and they cause the board to not even come out of calibrating_delay_loop
102  * if you can believe it. Our problem right now is no IDE or serial interrupts
103  * So we'll try to put interrupts in, one at a time. IDE first. 
104  */
105         cp = (volatile unsigned char *) 0xfffefd00;
106         *cp =  0x11;
107         cp = (volatile unsigned char *) 0xfffefd02;
108         *cp =  0x02;
109         cp = (volatile unsigned char *) 0xfffefd03;
110         *cp =  0x00;
111         cp = (volatile unsigned char *) 0xfffefd04;
112         *cp =  0xf7;
113         cp = (volatile unsigned char *) 0xfffefd08;
114         *cp =  0xf7;
115         cp = (volatile unsigned char *) 0xfffefd0a;
116         *cp =  0x8b;
117         cp = (volatile unsigned char *) 0xfffefd10;
118         *cp =  0x18;
119         cp = (volatile unsigned char *) 0xfffefd14;
120         *cp =  0x09;
121         cp = (volatile unsigned char *) 0xfffefd18;
122         *cp =  0x88;
123         cp = (volatile unsigned char *) 0xfffefd1a;
124         *cp =  0x00;
125         cp = (volatile unsigned char *) 0xfffefd1b;
126         *cp =  0x00;
127         cp = (volatile unsigned char *) 0xfffefd1c;
128         *cp =  0x00;
129         cp = (volatile unsigned char *) 0xfffefd20;
130         *cp =  0x00;
131         cp = (volatile unsigned char *) 0xfffefd21;
132         *cp =  0x00;
133         cp = (volatile unsigned char *) 0xfffefd22;
134         *cp =  0x00;
135         cp = (volatile unsigned char *) 0xfffefd28;
136         *cp =  0x00;
137         cp = (volatile unsigned char *) 0xfffefd29;
138         *cp =  0x00;
139         cp = (volatile unsigned char *) 0xfffefd30;
140         *cp =  0x00;
141         cp = (volatile unsigned char *) 0xfffefd31;
142         *cp =  0x00;
143         cp = (volatile unsigned char *) 0xfffefd32;
144         *cp =  0x00;
145         cp = (volatile unsigned char *) 0xfffefd33;
146         *cp =  0x00;
147         cp = (volatile unsigned char *) 0xfffefd40;
148         *cp =  0x10;
149         cp = (volatile unsigned char *) 0xfffefd41;
150         *cp =  0x00;
151         cp = (volatile unsigned char *) 0xfffefd42;
152         *cp =  0x00;
153         cp = (volatile unsigned char *) 0xfffefd43;
154         *cp =  0x00;
155         cp = (volatile unsigned char *) 0xfffefd44;
156         *cp =  0x00;
157         cp = (volatile unsigned char *) 0xfffefd45;
158         *cp =  0x00;
159         cp = (volatile unsigned char *) 0xfffefd46;
160         *cp =  0x00;
161         cp = (volatile unsigned char *) 0xfffefd50;
162         *cp =  0x37;
163         cp = (volatile unsigned char *) 0xfffefd51;
164         *cp =  0x00;
165         cp = (volatile unsigned char *) 0xfffefd52;
166         *cp =  0x00;
167         cp = (volatile unsigned char *) 0xfffefd53;
168         *cp =  0x00;
169         cp = (volatile unsigned char *) 0xfffefd54;
170         *cp =  0x37;
171         cp = (volatile unsigned char *) 0xfffefd55;
172         *cp =  0x00;
173         cp = (volatile unsigned char *) 0xfffefd56;
174         *cp =  0x37;
175         cp = (volatile unsigned char *) 0xfffefd57;
176         *cp =  0x00;
177         cp = (volatile unsigned char *) 0xfffefd58;
178         *cp =  0xff;
179         cp = (volatile unsigned char *) 0xfffefd59;
180         *cp =  0xff;
181         cp = (volatile unsigned char *) 0xfffefd5a;
182         *cp =  0xff;
183 #endif
184 #if 0
185         /* this fails too */
186         /* IDE only ... */
187         cp = (volatile unsigned char *) 0xfffefd56;
188         *cp =  0xe;
189 #endif
190 }
191
192
193
194 static void main(unsigned long bist)
195 {
196     volatile int i;
197     for(i = 0; i < 100; i++)
198       ;
199
200
201         setupsc520();
202         irqinit();
203         uart_init();
204         console_init();
205                 for(i = 0; i < 100; i++)
206           print_err("fill usart\r\n");
207                 //              while(1)
208                 print_err("HI THERE!\r\n");
209                 //                      sizemem();
210         staticmem();
211         print_err("c60 is "); print_err_hex16(*(unsigned short *)0xfffefc60); 
212         print_err("\n");
213                         
214         //                      while(1)
215         print_err("STATIC MEM DONE\r\n");
216         outb(0xee, 0x80);
217         print_err("loop forever ...\n");
218
219
220 #if 0
221
222         /* clear memory 1meg */
223         __asm__ volatile(
224                          "1: \n\t"
225                          "movl %0, %%fs:(%1)\n\t"
226                          "addl $4,%1\n\t"
227                          "subl $4,%2\n\t"
228                          "jnz 1b\n\t"
229                          :
230                          : "a" (0), "D" (0), "c" (1024*1024)
231                          ); 
232         
233         
234 #endif
235         
236 #if 0
237         dump_pci_devices();
238 #endif
239 #if 0
240         dump_pci_device(PCI_DEV(0, 0, 0));
241 #endif
242         
243 #if 0
244         print_err("RAM CHECK!\r\n");
245         // Check 16MB of memory @ 0
246         ram_check(0x00000000, 0x01000000);
247 #endif
248 #if 0
249         print_err("RAM CHECK for 32 MB!\r\n");
250         // Check 32MB of memory @ 0
251         ram_check(0x00000000, 0x02000000);
252 #endif
253 #if 1
254         {
255           volatile unsigned char *src = (unsigned char *) 0x2000000 + 0x60000;
256           volatile unsigned char *dst = (unsigned char *) 0x4000; 
257           for(i = 0; i < 0x20000; i++) {
258             /*
259               print_err("Set dst "); print_err_hex32((unsigned long) dst); 
260               print_err(" to "); print_err_hex32(*src); print_err("\r\n");
261             */
262             *dst = *src;
263             //print_err(" dst is now "); print_err_hex32(*dst); print_err("\r\n");
264             dst++, src++;
265             outb((unsigned char)i, 0x80);
266           }
267         }
268         dumpmem();
269         outb(0, 0x80);
270         print_err("loop forever\r\n");
271         outb(0xdd, 0x80);
272         __asm__ volatile(
273                          "movl %0, %%edi\n\t"
274                          "jmp *%%edi\n\t"
275                          :
276                          : "a" (0x4000)
277                          ); 
278         
279         print_err("FUCK\r\n");
280         
281         while(1);
282 #endif
283 }
284