1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#define SYSTEM_TYPE 0
21
22
23
24
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/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/early_serial.c"
49#include "cpu/x86/mtrr/earlymtrr.c"
50#include "northbridge/amd/amdfam10/setup_resource_map.c"
51#include "southbridge/amd/amd8111/early_ctrl.c"
52
53#define SERIAL_DEV PNP_DEV(0x2e, W83627HF_SP1)
54
55static void memreset_setup(void)
56{
57
58 outb((1<<2)|(1<<0), SMBUS_IO_BASE + 0xc0 + 16);
59 outb((1<<2)|(0<<0), SMBUS_IO_BASE + 0xc0 + 17);
60}
61
62static 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
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
78static int spd_read_byte(u32 device, u32 address)
79{
80 return smbus_read_byte(device, address);
81}
82
83#include "northbridge/amd/amdfam10/amdfam10.h"
84#include "northbridge/amd/amdfam10/raminit_sysinfo_in_ram.c"
85#include "northbridge/amd/amdfam10/pci.c"
86#include "resourcemap.c"
87#include "cpu/amd/quadcore/quadcore.c"
88#include "cpu/amd/car/post_cache_as_ram.c"
89#include "cpu/amd/microcode/microcode.c"
90
91#if CONFIG_UPDATE_CPU_MICROCODE
92#include "cpu/amd/model_10xxx/update_microcode.c"
93#endif
94
95#include "cpu/amd/model_10xxx/init_cpus.c"
96#include "northbridge/amd/amdfam10/early_ht.c"
97
98static const u8 spd_addr[] = {
99
100 RC00, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
101#if CONFIG_MAX_PHYSICAL_CPUS > 1
102
103 RC01, DIMM0, DIMM2, DIMM4, DIMM6, DIMM1, DIMM3, DIMM5, DIMM7,
104#endif
105#if CONFIG_MAX_PHYSICAL_CPUS > 2
106
107 RC02, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
108
109 RC03, DIMM0, DIMM2, DIMM4, DIMM6, DIMM1, DIMM3, DIMM5, DIMM7,
110#endif
111#if CONFIG_MAX_PHYSICAL_CPUS > 4
112 RC04, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
113 RC05, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
114#endif
115#if CONFIG_MAX_PHYSICAL_CPUS > 6
116 RC06, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
117 RC07, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
118#endif
119#if CONFIG_MAX_PHYSICAL_CPUS > 8
120 RC08, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
121 RC09, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
122 RC10, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
123 RC11, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
124#endif
125#if CONFIG_MAX_PHYSICAL_CPUS > 12
126 RC12, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
127 RC13, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
128 RC14, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
129 RC15, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
130#endif
131#if CONFIG_MAX_PHYSICAL_CPUS > 16
132 RC16, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
133 RC17, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
134 RC18, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
135 RC19, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
136#endif
137#if CONFIG_MAX_PHYSICAL_CPUS > 20
138 RC20, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
139 RC21, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
140 RC22, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
141 RC23, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
142#endif
143#if CONFIG_MAX_PHYSICAL_CPUS > 24
144 RC24, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
145 RC25, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
146 RC26, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
147 RC27, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
148 RC28, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
149 RC29, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
150 RC30, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
151 RC31, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
152#endif
153#if CONFIG_MAX_PHYSICAL_CPUS > 32
154 RC32, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
155 RC33, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
156 RC34, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
157 RC35, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
158 RC36, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
159 RC37, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
160 RC38, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
161 RC39, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
162 RC40, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
163 RC41, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
164 RC42, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
165 RC43, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
166 RC44, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
167 RC45, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
168 RC46, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
169 RC47, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
170#endif
171#if CONFIG_MAX_PHYSICAL_CPUS > 48
172 RC48, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
173 RC49, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
174 RC50, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
175 RC51, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
176 RC52, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
177 RC53, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
178 RC54, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
179 RC55, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
180 RC56, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
181 RC57, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
182 RC58, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
183 RC59, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
184 RC60, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
185 RC61, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
186 RC62, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
187 RC63, DIMM0, DIMM2, 0, 0, DIMM1, DIMM3, 0, 0,
188#endif
189};
190
191void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
192{
193 struct sys_info *sysinfo = (struct sys_info *)(CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE - CONFIG_DCACHE_RAM_GLOBAL_VAR_SIZE);
194 u32 bsp_apicid = 0, val;
195 msr_t msr;
196
197 if (!cpu_init_detectedx && boot_cpu()) {
198
199
200
201 set_bsp_node_CHtExtNodeCfgEn();
202 enumerate_ht_chain();
203 }
204
205 post_code(0x30);
206
207 if (bist == 0) {
208 bsp_apicid = init_cpus(cpu_init_detectedx, sysinfo);
209
210 }
211
212 post_code(0x32);
213
214 w83627hf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
215 console_init();
216
217
218
219
220 report_bist_failure(bist);
221
222
223 val = cpuid_eax(1);
224 printk(BIOS_DEBUG, "BSP Family_Model: %08x \n", val);
225 printk(BIOS_DEBUG, "*sysinfo range: [%p,%p]\n",sysinfo,sysinfo+1);
226 printk(BIOS_DEBUG, "bsp_apicid = %02x \n", bsp_apicid);
227 printk(BIOS_DEBUG, "cpu_init_detectedx = %08lx \n", cpu_init_detectedx);
228
229
230 set_sysinfo_in_ram(0);
231
232#if CONFIG_UPDATE_CPU_MICROCODE
233 update_microcode(val);
234#endif
235 post_code(0x33);
236
237 cpuSetAMDMSR();
238 post_code(0x34);
239
240 amd_ht_init(sysinfo);
241 post_code(0x35);
242
243
244 finalize_node_setup(sysinfo);
245
246
247 setup_mb_resource_map();
248 post_code(0x36);
249
250
251
252
253
254
255
256 wait_all_core0_started();
257
258 #if CONFIG_LOGICAL_CPUS==1
259
260 printk(BIOS_DEBUG, "start_other_cores()\n");
261 start_other_cores();
262 post_code(0x37);
263 wait_all_other_cores_started(bsp_apicid);
264 #endif
265
266 post_code(0x38);
267
268 #if CONFIG_SET_FIDVID
269 msr = rdmsr(0xc0010071);
270 printk(BIOS_DEBUG, "\nBegin FIDVID MSR 0xc0010071 0x%08x 0x%08x \n", msr.hi, msr.lo);
271
272
273
274 enable_fid_change_on_sb(sysinfo->sbbusn, sysinfo->sbdn);
275
276 post_code(0x39);
277
278 if (!warm_reset_detect(0)) {
279 init_fidvid_bsp(bsp_apicid, sysinfo->nodes);
280 } else {
281 init_fidvid_stage2(bsp_apicid, 0);
282 }
283
284 post_code(0x3A);
285
286
287 msr=rdmsr(0xc0010071);
288 printk(BIOS_DEBUG, "End FIDVIDMSR 0xc0010071 0x%08x 0x%08x \n", msr.hi, msr.lo);
289 #endif
290
291
292 if (!warm_reset_detect(0)) {
293 print_info("...WARM RESET...\n\n\n");
294 soft_reset_x(sysinfo->sbbusn, sysinfo->sbdn);
295 die("After soft_reset_x - shouldn't see this message!!!\n");
296 }
297
298 post_code(0x3B);
299
300
301
302 print_debug("enable_cf9_x()\n");
303 enable_cf9_x(sysinfo->sbbusn, sysinfo->sbdn);
304 post_code(0x3C);
305
306
307 printk(BIOS_DEBUG, "fill_mem_ctrl()\n");
308 fill_mem_ctrl(sysinfo->nodes, sysinfo->ctrl, spd_addr);
309 post_code(0x3D);
310
311 printk(BIOS_DEBUG, "enable_smbus()\n");
312 enable_smbus();
313 post_code(0x3E);
314
315 memreset_setup();
316 post_code(0x40);
317
318
319
320 printk(BIOS_DEBUG, "raminit_amdmct()\n");
321 raminit_amdmct(sysinfo);
322 post_code(0x41);
323
324
325
326
327
328
329
330
331
332
333 post_code(0x42);
334 printk(BIOS_DEBUG, "\n*** Yes, the copy/decompress is taking a while, FIXME!\n");
335 post_cache_as_ram();
336 post_code(0x43);
337}
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358BOOL AMD_CB_ManualBUIDSwapList (u8 node, u8 link, const u8 **List)
359{
360 static const u8 swaplist[] = { 0xFF, CONFIG_HT_CHAIN_UNITID_BASE, CONFIG_HT_CHAIN_END_UNITID_BASE, 0xFF };
361
362 if ((CONFIG_HT_CHAIN_UNITID_BASE != 0) && (CONFIG_HT_CHAIN_END_UNITID_BASE != 0)) {
363 printk(BIOS_DEBUG, "AMD_CB_ManualBUIDSwapList()\n");
364 if ((node == 0) && (link == 0)) {
365 *List = swaplist;
366 return 1;
367 }
368 }
369
370 return 0;
371}
372