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