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