2 * This file is part of the coreboot project.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #define RAMINIT_SYSINFO 1
24 #define K8_ALLOCATE_IO_RANGE 1
25 // #define K8_SCAN_PCI_BUS 1
27 #define QRANK_DIMM_SUPPORT 1
29 #if CONFIG_LOGICAL_CPUS==1
30 #define SET_NB_CFG_54 1
33 // used by init_cpus and fidvid
34 #define K8_SET_FIDVID 1
35 //if we want to wait for core1 done before DQS training, set it to 0
36 #define K8_SET_FIDVID_CORE0_ONLY 1
38 #if K8_REV_F_SUPPORT == 1
39 #define K8_REV_F_SUPPORT_F0_F1_WORKAROUND 0
43 #include <device/pci_def.h>
44 #include <device/pci_ids.h>
46 #include <device/pnp_def.h>
47 #include <arch/romcc_io.h>
48 #include <cpu/x86/lapic.h>
49 #include "option_table.h"
50 #include "pc80/mc146818rtc_early.c"
53 #include "southbridge/nvidia/mcp55/mcp55_early_smbus.c"
55 #if USE_FAILOVER_IMAGE==0
56 #include "pc80/serial.c"
57 #include "arch/i386/lib/console.c"
58 #include "ram/ramtest.c"
60 #include <cpu/amd/model_fxx_rev.h>
62 // #include "southbridge/nvidia/mcp55/mcp55_early_smbus.c"
63 #include "northbridge/amd/amdk8/raminit.h"
64 #include "cpu/amd/model_fxx/apic_timer.c"
65 #include "lib/delay.c"
69 #include "cpu/x86/lapic/boot_cpu.c"
70 #include "northbridge/amd/amdk8/reset_test.c"
71 #include "superio/winbond/w83627hf/w83627hf_early_serial.c"
72 #include "superio/winbond/w83627hf/w83627hf_early_init.c"
74 #if USE_FAILOVER_IMAGE==0
76 #include "cpu/x86/bist.h"
78 #if CONFIG_USE_INIT == 0
79 #include "lib/memcpy.c"
82 #include "northbridge/amd/amdk8/debug.c"
84 #include "cpu/amd/mtrr/amd_earlymtrr.c"
86 #include "northbridge/amd/amdk8/setup_resource_map.c"
88 #define SERIAL_DEV PNP_DEV(0x2e, W83627HF_SP1)
90 #include "southbridge/nvidia/mcp55/mcp55_early_ctrl.c"
92 static void memreset_setup(void)
96 static void memreset(int controllers, const struct mem_controller *ctrl)
100 static int smbus_send_byte_one(unsigned device, unsigned char val)
102 return do_smbus_send_byte(SMBUS1_IO_BASE, device, val);
105 static void dump_smbus_registers(void)
110 for (device = 1; device < 0x80; device++) {
112 if (smbus_read_byte(device, 0) < 0)
114 printk_debug("smbus: %02x", device);
115 for (j = 0; j < 256; j++) {
118 status = smbus_read_byte(device, j);
122 if ((j & 0xf) == 0) {
123 printk_debug("\r\n%02x: ", j);
125 byte = status & 0xff;
126 printk_debug("%02x ", byte);
132 static inline void activate_spd_rom(const struct mem_controller *ctrl)
134 /* We don't do any switching yet.
135 #define SMBUS_SWITCH1 0x48
136 #define SMBUS_SWITCH2 0x49
137 unsigned device=(ctrl->channel0[0])>>8;
138 smbus_send_byte(SMBUS_SWITCH1, device);
139 smbus_send_byte(SMBUS_SWITCH2, (device >> 4) & 0x0f);
145 static inline void change_i2c_mux(unsigned device)
147 #define SMBUS_SWITCH1 0x48
148 #define SMBUS_SWITHC2 0x49
149 smbus_send_byte(SMBUS_SWITCH1, device & 0x0f);
150 smbus_send_byte_one(SMBUS_SWITCH2, (device >> 4) & 0x0f);
152 print_debug("change_i2c_mux i="); print_debug_hex8(device); print_debug("\r\n");
153 dump_smbus_registers();
154 ret = smbus_send_byte(SMBUS_SWITCH1, device);
155 print_debug("change_i2c_mux ret="); print_debug_hex32(ret); print_debug("\r\n");
156 dump_smbus_registers();
157 ret = smbus_send_byte_one(SMBUS_SWITCH2, device);
158 print_debug("change_i2c_mux ret="); print_debug_hex32(ret); print_debug("\r\n");
159 dump_smbus_registers();
163 static inline int spd_read_byte(unsigned device, unsigned address)
165 return smbus_read_byte(device, address);
168 #include "northbridge/amd/amdk8/amdk8_f.h"
169 #include "northbridge/amd/amdk8/coherent_ht.c"
171 #include "northbridge/amd/amdk8/incoherent_ht.c"
173 #include "northbridge/amd/amdk8/raminit_f.c"
175 #include "sdram/generic_sdram.c"
177 #include "resourcemap.c"
179 #include "cpu/amd/dualcore/dualcore.c"
182 #define MCP55_USE_NIC 1
183 #define MCP55_USE_AZA 1
185 #define MCP55_PCI_E_X_0 4
187 #include "southbridge/nvidia/mcp55/mcp55_early_setup_ss.h"
188 #include "southbridge/nvidia/mcp55/mcp55_early_setup_car.c"
190 #include "cpu/amd/car/copy_and_run.c"
192 #include "cpu/amd/car/post_cache_as_ram.c"
194 #include "cpu/amd/model_fxx/init_cpus.c"
196 #include "cpu/amd/model_fxx/fidvid.c"
200 #if ((HAVE_FAILOVER_BOOT==1) && (USE_FAILOVER_IMAGE == 1)) || ((HAVE_FAILOVER_BOOT==0) && (USE_FALLBACK_IMAGE == 1))
202 #include "southbridge/nvidia/mcp55/mcp55_enable_rom.c"
203 #include "northbridge/amd/amdk8/early_ht.c"
205 static void sio_setup(void)
213 // smbusx_write_byte(1, (0x58>>1), 0, 0x80); /* select bank0 */
214 smbusx_write_byte(1, (0x58 >> 1), 0xb1, 0xff); /* set FAN ctrl to DC mode */
216 byte = pci_read_config8(PCI_DEV(0, MCP55_DEVN_BASE + 1, 0), 0x7b);
218 pci_write_config8(PCI_DEV(0, MCP55_DEVN_BASE + 1, 0), 0x7b, byte);
220 dword = pci_read_config32(PCI_DEV(0, MCP55_DEVN_BASE + 1, 0), 0xa0);
222 pci_write_config32(PCI_DEV(0, MCP55_DEVN_BASE + 1, 0), 0xa0, dword);
224 dword = pci_read_config32(PCI_DEV(0, MCP55_DEVN_BASE + 1, 0), 0xa4);
226 pci_write_config32(PCI_DEV(0, MCP55_DEVN_BASE + 1, 0), 0xa4, dword);
230 void failover_process(unsigned long bist, unsigned long cpu_init_detectedx)
232 u32 last_boot_normal_x = last_boot_normal();
234 /* Is this a cpu only reset? or Is this a secondary cpu? */
235 if ((cpu_init_detectedx) || (!boot_cpu())) {
236 if (last_boot_normal_x) {
243 /* Nothing special needs to be done to find bus 0 */
244 /* Allow the HT devices to be found */
246 enumerate_ht_chain();
250 /* Setup the mcp55 */
253 /* Is this a deliberate reset by the bios */
254 if (bios_reset_detected() && last_boot_normal_x) {
257 /* This is the primary cpu how should I boot? */
258 else if (do_normal_boot()) {
264 __asm__ volatile ("jmp __normal_image": /* outputs */
265 :"a" (bist), "b"(cpu_init_detectedx) /* inputs */
269 #if HAVE_FAILOVER_BOOT==1
270 __asm__ volatile ("jmp __fallback_image": /* outputs */
271 :"a" (bist), "b"(cpu_init_detectedx) /* inputs */
277 void real_main(unsigned long bist, unsigned long cpu_init_detectedx);
279 void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
281 #if HAVE_FAILOVER_BOOT==1
282 #if USE_FAILOVER_IMAGE==1
283 failover_process(bist, cpu_init_detectedx);
285 real_main(bist, cpu_init_detectedx);
288 #if USE_FALLBACK_IMAGE == 1
289 failover_process(bist, cpu_init_detectedx);
291 real_main(bist, cpu_init_detectedx);
295 /* We have no idea where the SMBUS switch is. This doesn't do anything ATM. */
299 #if USE_FAILOVER_IMAGE==0
301 void real_main(unsigned long bist, unsigned long cpu_init_detectedx)
303 /* The SPD is being read from the CPU1 (marked CPU2 on the board) and we
304 don't know how to switch the SMBus to decode the CPU0 SPDs. So, The
305 memory on each CPU must be an exact match.
307 static const uint16_t spd_addr[] = {
308 RC0 | (0xa << 3) | 0, RC0 | (0xa << 3) | 2,
309 RC0 | (0xa << 3) | 4, RC0 | (0xa << 3) | 6,
310 RC0 | (0xa << 3) | 1, RC0 | (0xa << 3) | 3,
311 RC0 | (0xa << 3) | 5, RC0 | (0xa << 3) | 7,
312 #if CONFIG_MAX_PHYSICAL_CPUS > 1
313 RC1 | (0xa << 3) | 0, RC1 | (0xa << 3) | 2,
314 RC1 | (0xa << 3) | 4, RC1 | (0xa << 3) | 6,
315 RC1 | (0xa << 3) | 1, RC1 | (0xa << 3) | 3,
316 RC1 | (0xa << 3) | 5, RC1 | (0xa << 3) | 7,
320 struct sys_info *sysinfo =
321 (DCACHE_RAM_BASE + DCACHE_RAM_SIZE - DCACHE_RAM_GLOBAL_VAR_SIZE);
324 unsigned bsp_apicid = 0;
327 bsp_apicid = init_cpus(cpu_init_detectedx, sysinfo);
330 pnp_enter_ext_func_mode(SERIAL_DEV);
331 pnp_write_config(SERIAL_DEV, 0x24, 0x84 | (1 << 6));
332 w83627hf_enable_dev(SERIAL_DEV, TTYS0_BASE);
333 pnp_exit_ext_func_mode(SERIAL_DEV);
338 /* Halt if there was a built in self test failure */
339 report_bist_failure(bist);
341 print_debug("*sysinfo range: [");
342 print_debug_hex32(sysinfo);
344 print_debug_hex32((unsigned long)sysinfo + sizeof(struct sys_info));
345 print_debug(")\r\n");
347 setup_mb_resource_map();
349 print_debug("bsp_apicid=");
350 print_debug_hex8(bsp_apicid);
353 #if MEM_TRAIN_SEQ == 1
354 set_sysinfo_in_ram(0); // in BSP so could hold all ap until sysinfo is in ram
356 /* dump_smbus_registers(); */
357 setup_coherent_ht_domain(); // routing table and start other core0
359 wait_all_core0_started();
360 #if CONFIG_LOGICAL_CPUS==1
361 // It is said that we should start core1 after all core0 launched
362 /* becase optimize_link_coherent_ht is moved out from setup_coherent_ht_domain,
363 * So here need to make sure last core0 is started, esp for two way system,
364 * (there may be apic id conflicts in that case)
367 wait_all_other_cores_started(bsp_apicid);
370 /* it will set up chains and store link pair for optimization later */
371 ht_setup_chains_x(sysinfo); // it will init sblnk and sbbusn, nodes, sbdn
373 #if K8_SET_FIDVID == 1
377 msr = rdmsr(0xc0010042);
378 print_debug("begin msr fid, vid ");
379 print_debug_hex32(msr.hi);
380 print_debug_hex32(msr.lo);
387 enable_fid_change_on_sb(sysinfo->sbbusn, sysinfo->sbdn);
389 init_fidvid_bsp(bsp_apicid);
391 // show final fid and vid
394 msr = rdmsr(0xc0010042);
395 print_debug("end msr fid, vid ");
396 print_debug_hex32(msr.hi);
397 print_debug_hex32(msr.lo);
404 needs_reset |= optimize_link_coherent_ht();
405 needs_reset |= optimize_link_incoherent_ht(sysinfo);
406 needs_reset |= mcp55_early_setup_x();
408 // fidvid change will issue one LDTSTOP and the HT change will be effective too
410 print_info("ht reset -\r\n");
414 allow_all_aps_stop(bsp_apicid);
416 //It's the time to set ctrl in sysinfo now;
417 fill_mem_ctrl(sysinfo->nodes, sysinfo->ctrl, spd_addr);
419 enable_smbus(); /* enable in sio_setup */
423 //do we need apci timer, tsc...., only debug need it for better output
424 /* all ap stopped? */
425 // init_timer(); // Need to use TMICT to synconize FID/VID
427 sdram_initialize(sysinfo->nodes, sysinfo->ctrl, sysinfo);
429 post_cache_as_ram(); // bsp swtich stack to ram and copy sysinfo ram now