Drop excessive whitespace randomly sprinkled in romstage.c files.
[coreboot.git] / src / mainboard / amd / serengeti_cheetah_fam10 / romstage.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18  */
19
20 #define SYSTEM_TYPE 0   /* SERVER */
21 //#define SYSTEM_TYPE 1 /* DESKTOP */
22 //#define SYSTEM_TYPE 2 /* MOBILE */
23
24 //used by incoherent_ht
25 #define FAM10_SCAN_PCI_BUS 0
26 #define FAM10_ALLOCATE_IO_RANGE 0
27
28 #include <stdint.h>
29 #include <string.h>
30 #include <device/pci_def.h>
31 #include <device/pci_ids.h>
32 #include <arch/io.h>
33 #include <device/pnp_def.h>
34 #include <arch/romcc_io.h>
35 #include <cpu/x86/lapic.h>
36 #include <console/console.h>
37 #include <cpu/amd/model_10xxx_rev.h>
38 #include "southbridge/amd/amd8111/amd8111_early_smbus.c"
39 #include "northbridge/amd/amdfam10/raminit.h"
40 #include "northbridge/amd/amdfam10/amdfam10.h"
41 #include <lib.h>
42 #include <spd.h>
43 #include "cpu/x86/lapic/boot_cpu.c"
44 #include "northbridge/amd/amdfam10/reset_test.c"
45 #include <console/loglevel.h>
46 #include "cpu/x86/bist.h"
47 #include "northbridge/amd/amdfam10/debug.c"
48 #include "superio/winbond/w83627hf/w83627hf_early_serial.c"
49 #include "cpu/x86/mtrr/earlymtrr.c"
50 #include "northbridge/amd/amdfam10/setup_resource_map.c"
51 #include "southbridge/amd/amd8111/amd8111_early_ctrl.c"
52
53 #define SERIAL_DEV PNP_DEV(0x2e, W83627HF_SP1)
54
55 static void memreset_setup(void)
56 {
57         //GPIO on amd8111 to enable MEMRST ????
58         outb((0 << 7)|(0 << 6)|(0<<5)|(0<<4)|(1<<2)|(1<<0), SMBUS_IO_BASE + 0xc0 + 16); // REVC_MEMRST_EN=1
59         outb((0 << 7)|(0 << 6)|(0<<5)|(0<<4)|(1<<2)|(0<<0), SMBUS_IO_BASE + 0xc0 + 17);
60 }
61
62 static void activate_spd_rom(const struct mem_controller *ctrl)
63 {
64 #define SMBUS_HUB 0x18
65         int ret,i;
66         u8 device = ctrl->spd_switch_addr;
67
68         printk(BIOS_DEBUG, "switch i2c to : %02x for node %02x \n", device, ctrl->node_id);
69
70         /* the very first write always get COL_STS=1 and ABRT_STS=1, so try another time*/
71         i=2;
72         do {
73                 ret = smbus_write_byte(SMBUS_HUB, 0x01, (1<<(device & 0x7)));
74         } while ((ret!=0) && (i-->0));
75         smbus_write_byte(SMBUS_HUB, 0x03, 0);
76 }
77
78 static int spd_read_byte(u32 device, u32 address)
79 {
80         int result;
81         result = smbus_read_byte(device, address);
82         return result;
83 }
84
85 #include "northbridge/amd/amdfam10/amdfam10.h"
86 #include "northbridge/amd/amdfam10/raminit_sysinfo_in_ram.c"
87 #include "northbridge/amd/amdfam10/amdfam10_pci.c"
88 #include "resourcemap.c"
89 #include "cpu/amd/quadcore/quadcore.c"
90 #include "cpu/amd/car/post_cache_as_ram.c"
91 #include "cpu/amd/microcode/microcode.c"
92 #include "cpu/amd/model_10xxx/update_microcode.c"
93 #include "cpu/amd/model_10xxx/init_cpus.c"
94 #include "southbridge/amd/amd8111/amd8111_enable_rom.c"
95 #include "northbridge/amd/amdfam10/early_ht.c"
96
97 static const u8 spd_addr[] = {
98         //first node
99         RC00, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
100 #if CONFIG_MAX_PHYSICAL_CPUS > 1
101         //second node
102         RC01, DIMM0, DIMM2, DIMM4, DIMM6, DIMM1, DIMM3, DIMM5, DIMM7,
103 #endif
104 #if CONFIG_MAX_PHYSICAL_CPUS > 2
105         // third node
106         RC02, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
107         // forth node
108         RC03, DIMM0, DIMM2, DIMM4, DIMM6, DIMM1, DIMM3, DIMM5, DIMM7,
109 #endif
110 #if CONFIG_MAX_PHYSICAL_CPUS > 4
111         RC04, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
112         RC05, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
113 #endif
114 #if CONFIG_MAX_PHYSICAL_CPUS > 6
115         RC06, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
116         RC07, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
117 #endif
118 #if CONFIG_MAX_PHYSICAL_CPUS > 8
119         RC08, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
120         RC09, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
121         RC10, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
122         RC11, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
123 #endif
124 #if CONFIG_MAX_PHYSICAL_CPUS > 12
125         RC12, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
126         RC13, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
127         RC14, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
128         RC15, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
129 #endif
130 #if CONFIG_MAX_PHYSICAL_CPUS > 16
131         RC16, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
132         RC17, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
133         RC18, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
134         RC19, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
135 #endif
136 #if CONFIG_MAX_PHYSICAL_CPUS > 20
137         RC20, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
138         RC21, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
139         RC22, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
140         RC23, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
141 #endif
142 #if CONFIG_MAX_PHYSICAL_CPUS > 24
143         RC24, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
144         RC25, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
145         RC26, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
146         RC27, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
147         RC28, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
148         RC29, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
149         RC30, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
150         RC31, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
151 #endif
152 #if CONFIG_MAX_PHYSICAL_CPUS > 32
153         RC32, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
154         RC33, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
155         RC34, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
156         RC35, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
157         RC36, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
158         RC37, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
159         RC38, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
160         RC39, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
161         RC40, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
162         RC41, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
163         RC42, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
164         RC43, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
165         RC44, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
166         RC45, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
167         RC46, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
168         RC47, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
169 #endif
170 #if CONFIG_MAX_PHYSICAL_CPUS > 48
171         RC48, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
172         RC49, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
173         RC50, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
174         RC51, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
175         RC52, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
176         RC53, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
177         RC54, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
178         RC55, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
179         RC56, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
180         RC57, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
181         RC58, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
182         RC59, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
183         RC60, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
184         RC61, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
185         RC62, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
186         RC63, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
187 #endif
188 };
189
190 void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
191 {
192         struct sys_info *sysinfo = (struct sys_info *)(CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE - CONFIG_DCACHE_RAM_GLOBAL_VAR_SIZE);
193         u32 bsp_apicid = 0;
194         u32 val;
195         msr_t msr;
196
197         if (!cpu_init_detectedx && boot_cpu()) {
198                 /* Nothing special needs to be done to find bus 0 */
199                 /* Allow the HT devices to be found */
200                 /* mov bsp to bus 0xff when > 8 nodes */
201                 set_bsp_node_CHtExtNodeCfgEn();
202                 enumerate_ht_chain();
203
204                 /* Setup the rom access for 4M */
205                 amd8111_enable_rom();
206         }
207
208         post_code(0x30);
209
210         if (bist == 0) {
211                 bsp_apicid = init_cpus(cpu_init_detectedx, sysinfo); /* mmconf is inited in init_cpus */
212                 /* All cores run this but the BSP(node0,core0) is the only core that returns. */
213         }
214
215         post_code(0x32);
216
217         w83627hf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
218         uart_init();
219         console_init();
220         printk(BIOS_DEBUG, "\n");
221
222 //      dump_mem(CONFIG_DCACHE_RAM_BASE+CONFIG_DCACHE_RAM_SIZE-0x200, CONFIG_DCACHE_RAM_BASE+CONFIG_DCACHE_RAM_SIZE);
223
224         /* Halt if there was a built in self test failure */
225         report_bist_failure(bist);
226
227         // Load MPB
228         val = cpuid_eax(1);
229         printk(BIOS_DEBUG, "BSP Family_Model: %08x \n", val);
230         printk(BIOS_DEBUG, "*sysinfo range: [%p,%p]\n",sysinfo,sysinfo+1);
231         printk(BIOS_DEBUG, "bsp_apicid = %02x \n", bsp_apicid);
232         printk(BIOS_DEBUG, "cpu_init_detectedx = %08lx \n", cpu_init_detectedx);
233
234         /* Setup sysinfo defaults */
235         set_sysinfo_in_ram(0);
236
237         update_microcode(val);
238         post_code(0x33);
239
240         cpuSetAMDMSR();
241         post_code(0x34);
242
243         amd_ht_init(sysinfo);
244         post_code(0x35);
245
246         /* Setup nodes PCI space and start core 0 AP init. */
247         finalize_node_setup(sysinfo);
248
249         /* Setup any mainboard PCI settings etc. */
250         setup_mb_resource_map();
251         post_code(0x36);
252
253         /* wait for all the APs core0 started by finalize_node_setup. */
254         /* FIXME: A bunch of cores are going to start output to serial at once.
255            It would be nice to fixup prink spinlocks for ROM XIP mode.
256            I think it could be done by putting the spinlock flag in the cache
257            of the BSP located right after sysinfo.
258          */
259         wait_all_core0_started();
260
261  #if CONFIG_LOGICAL_CPUS==1
262         /* Core0 on each node is configured. Now setup any additional cores. */
263         printk(BIOS_DEBUG, "start_other_cores()\n");
264         start_other_cores();
265         post_code(0x37);
266         wait_all_other_cores_started(bsp_apicid);
267  #endif
268
269         post_code(0x38);
270
271  #if CONFIG_SET_FIDVID
272         msr = rdmsr(0xc0010071);
273         printk(BIOS_DEBUG, "\nBegin FIDVID MSR 0xc0010071 0x%08x 0x%08x \n", msr.hi, msr.lo);
274
275         /* FIXME: The sb fid change may survive the warm reset and only
276            need to be done once.*/
277         enable_fid_change_on_sb(sysinfo->sbbusn, sysinfo->sbdn);
278
279         post_code(0x39);
280
281         if (!warm_reset_detect(0)) {                    // BSP is node 0
282                 init_fidvid_bsp(bsp_apicid, sysinfo->nodes);
283         } else {
284                 init_fidvid_stage2(bsp_apicid, 0);      // BSP is node 0
285         }
286
287         post_code(0x3A);
288
289         /* show final fid and vid */
290         msr=rdmsr(0xc0010071);
291         printk(BIOS_DEBUG, "End FIDVIDMSR 0xc0010071 0x%08x 0x%08x \n", msr.hi, msr.lo);
292  #endif
293
294         /* Reset for HT, FIDVID, PLL and errata changes to take affect. */
295         if (!warm_reset_detect(0)) {
296                 print_info("...WARM RESET...\n\n\n");
297                 soft_reset_x(sysinfo->sbbusn, sysinfo->sbdn);
298                 die("After soft_reset_x - shouldn't see this message!!!\n");
299         }
300
301         post_code(0x3B);
302
303         /* FIXME:  Move this to chipset init.
304         enable cf9 for hard reset */
305         print_debug("enable_cf9_x()\n");
306         enable_cf9_x(sysinfo->sbbusn, sysinfo->sbdn);
307         post_code(0x3C);
308
309         /* It's the time to set ctrl in sysinfo now; */
310         printk(BIOS_DEBUG, "fill_mem_ctrl()\n");
311         fill_mem_ctrl(sysinfo->nodes, sysinfo->ctrl, spd_addr);
312         post_code(0x3D);
313
314         printk(BIOS_DEBUG, "enable_smbus()\n");
315         enable_smbus();
316         post_code(0x3E);
317
318         memreset_setup();
319         post_code(0x40);
320
321 //      die("Die Before MCT init.");
322
323         printk(BIOS_DEBUG, "raminit_amdmct()\n");
324         raminit_amdmct(sysinfo);
325         post_code(0x41);
326
327 /*
328         dump_pci_device_range(PCI_DEV(0, 0x18, 0), 0, 0x200);
329         dump_pci_device_range(PCI_DEV(0, 0x18, 1), 0, 0x200);
330         dump_pci_device_range(PCI_DEV(0, 0x18, 2), 0, 0x200);
331         dump_pci_device_range(PCI_DEV(0, 0x18, 3), 0, 0x200);
332 */
333
334 //      ram_check(0x00200000, 0x00200000 + (640 * 1024));
335 //      ram_check(0x40200000, 0x40200000 + (640 * 1024));
336
337 //      die("After MCT init before CAR disabled.");
338
339         post_code(0x42);
340         printk(BIOS_DEBUG, "\n*** Yes, the copy/decompress is taking a while, FIXME!\n");
341         post_cache_as_ram();    // BSP switch stack to ram, copy then execute LB.
342         post_code(0x43);        // Should never see this post code.
343 }