blob: 553910ae73aa53d5911e3d731f9117ce4f81781b [file] [log] [blame]
Yinghai Lu304f24c2005-07-08 02:56:47 +00001#define ASSEMBLY 1
Myles Watson1d6d45e2009-11-06 17:02:51 +00002#define __PRE_RAM__
Yinghai Lu304f24c2005-07-08 02:56:47 +00003
4#include <stdint.h>
Patrick Georgi12aba822009-04-30 07:07:22 +00005#include <string.h>
Yinghai Lu304f24c2005-07-08 02:56:47 +00006#include <device/pci_def.h>
7#include <arch/io.h>
8#include <device/pnp_def.h>
9#include <arch/romcc_io.h>
10#include <cpu/x86/lapic.h>
Carl-Daniel Hailfinger2ee67792008-10-01 12:52:52 +000011#include <stdlib.h>
Yinghai Lu304f24c2005-07-08 02:56:47 +000012#include "option_table.h"
13#include "pc80/mc146818rtc_early.c"
14#include "pc80/serial.c"
15#include "arch/i386/lib/console.c"
Stefan Reinauerc13093b2009-09-23 18:51:03 +000016#include "lib/ramtest.c"
Yinghai Lu304f24c2005-07-08 02:56:47 +000017
Stefan Reinauer806e1462005-12-01 10:54:44 +000018
Stefan Reinauer373511b2005-12-02 23:16:01 +000019#include <cpu/amd/model_fxx_rev.h>
Yinghai Lu304f24c2005-07-08 02:56:47 +000020#include "northbridge/amd/amdk8/incoherent_ht.c"
21#include "southbridge/amd/amd8111/amd8111_early_smbus.c"
22#include "northbridge/amd/amdk8/raminit.h"
23#include "cpu/amd/model_fxx/apic_timer.c"
24#include "lib/delay.c"
25
Yinghai Lu304f24c2005-07-08 02:56:47 +000026#include "cpu/x86/lapic/boot_cpu.c"
27#include "northbridge/amd/amdk8/reset_test.c"
28#include "northbridge/amd/amdk8/debug.c"
29#include "superio/winbond/w83627hf/w83627hf_early_serial.c"
30
31#include "cpu/amd/mtrr/amd_earlymtrr.c"
32#include "cpu/x86/bist.h"
33
34#include "northbridge/amd/amdk8/setup_resource_map.c"
35
36#define SERIAL_DEV PNP_DEV(0x2e, W83627HF_SP1)
Yinghai Lu304f24c2005-07-08 02:56:47 +000037
Yinghai Lu9a791df2006-04-03 20:38:34 +000038#include "southbridge/amd/amd8111/amd8111_early_ctrl.c"
Yinghai Lu304f24c2005-07-08 02:56:47 +000039
40static void memreset_setup(void)
41{
42 if (is_cpu_pre_c0()) {
43 outb((0 << 7)|(0 << 6)|(0<<5)|(0<<4)|(1<<2)|(0<<0), SMBUS_IO_BASE + 0xc0 + 16); //REVC_MEMRST_EN=0
44 }
45 else {
46 outb((0 << 7)|(0 << 6)|(0<<5)|(0<<4)|(1<<2)|(1<<0), SMBUS_IO_BASE + 0xc0 + 16); //REVC_MEMRST_EN=1
47 }
48 outb((0 << 7)|(0 << 6)|(0<<5)|(0<<4)|(1<<2)|(0<<0), SMBUS_IO_BASE + 0xc0 + 17);
49}
50
51static void memreset(int controllers, const struct mem_controller *ctrl)
52{
53 if (is_cpu_pre_c0()) {
54 udelay(800);
55 outb((0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0), SMBUS_IO_BASE + 0xc0 + 17); //REVB_MEMRST_L=1
56 udelay(90);
57 }
58}
59
60static inline void activate_spd_rom(const struct mem_controller *ctrl)
61{
62 /* nothing to do */
63}
64
65static inline int spd_read_byte(unsigned device, unsigned address)
66{
67 return smbus_read_byte(device, address);
68}
69
Yinghai Lu7110f922006-10-05 06:59:56 +000070#define QRANK_DIMM_SUPPORT 1
Yinghai Lu304f24c2005-07-08 02:56:47 +000071
72#include "northbridge/amd/amdk8/raminit.c"
73#include "northbridge/amd/amdk8/resourcemap.c"
74#include "northbridge/amd/amdk8/coherent_ht.c"
Stefan Reinauerc13093b2009-09-23 18:51:03 +000075#include "lib/generic_sdram.c"
Yinghai Lu304f24c2005-07-08 02:56:47 +000076
77#if CONFIG_LOGICAL_CPUS==1
78#define SET_NB_CFG_54 1
Yinghai Lu304f24c2005-07-08 02:56:47 +000079#endif
Stefan Reinauer806e1462005-12-01 10:54:44 +000080#include "cpu/amd/dualcore/dualcore.c"
Yinghai Lu304f24c2005-07-08 02:56:47 +000081
82#include "cpu/amd/car/copy_and_run.c"
83
Stefan Reinauer806e1462005-12-01 10:54:44 +000084#include "cpu/amd/car/post_cache_as_ram.c"
85
86#include "cpu/amd/model_fxx/init_cpus.c"
87
Yinghai Lu304f24c2005-07-08 02:56:47 +000088#include "southbridge/amd/amd8111/amd8111_enable_rom.c"
89#include "northbridge/amd/amdk8/early_ht.c"
90
Stefan Reinauer806e1462005-12-01 10:54:44 +000091void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
92{
Yinghai Lu304f24c2005-07-08 02:56:47 +000093 static const struct mem_controller cpu[] = {
Yinghai Lu304f24c2005-07-08 02:56:47 +000094 {
95 .node_id = 0,
96 .f0 = PCI_DEV(0, 0x18, 0),
97 .f1 = PCI_DEV(0, 0x18, 1),
98 .f2 = PCI_DEV(0, 0x18, 2),
99 .f3 = PCI_DEV(0, 0x18, 3),
100 .channel0 = { (0xa<<3)|0, (0xa<<3)|2, 0, 0 },
101 .channel1 = { (0xa<<3)|1, (0xa<<3)|3, 0, 0 },
102 },
Stefan Reinauer806e1462005-12-01 10:54:44 +0000103#if CONFIG_MAX_PHYSICAL_CPUS > 1
Yinghai Lu304f24c2005-07-08 02:56:47 +0000104 {
105 .node_id = 1,
106 .f0 = PCI_DEV(0, 0x19, 0),
107 .f1 = PCI_DEV(0, 0x19, 1),
108 .f2 = PCI_DEV(0, 0x19, 2),
109 .f3 = PCI_DEV(0, 0x19, 3),
110 .channel0 = { (0xa<<3)|4, (0xa<<3)|6, 0, 0 },
111 .channel1 = { (0xa<<3)|5, (0xa<<3)|7, 0, 0 },
112 },
113#endif
114 };
115
116 int needs_reset;
Yinghai Lu304f24c2005-07-08 02:56:47 +0000117
Patrick Georgi776b85b2010-03-18 16:18:58 +0000118 if (!((cpu_init_detectedx) || (!boot_cpu()))) {
119 /* Nothing special needs to be done to find bus 0 */
120 /* Allow the HT devices to be found */
121
122 enumerate_ht_chain();
123
124 amd8111_enable_rom();
125 }
126
Yinghai Lu304f24c2005-07-08 02:56:47 +0000127 if (bist == 0) {
Stefan Reinauer806e1462005-12-01 10:54:44 +0000128 init_cpus(cpu_init_detectedx);
Yinghai Lu304f24c2005-07-08 02:56:47 +0000129 }
130
131
Stefan Reinauer08670622009-06-30 15:17:49 +0000132 w83627hf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
Yinghai Lu304f24c2005-07-08 02:56:47 +0000133 uart_init();
134 console_init();
135
136 /* Halt if there was a built in self test failure */
137 report_bist_failure(bist);
138
139 setup_default_resource_map();
140
141 needs_reset = setup_coherent_ht_domain();
142
143#if CONFIG_LOGICAL_CPUS==1
Stefan Reinauer806e1462005-12-01 10:54:44 +0000144 // It is said that we should start core1 after all core0 launched
Yinghai Lu304f24c2005-07-08 02:56:47 +0000145 start_other_cores();
146#endif
Stefan Reinauer806e1462005-12-01 10:54:44 +0000147 // automatically set that for you, but you might meet tight space
Yinghai Lu304f24c2005-07-08 02:56:47 +0000148 needs_reset |= ht_setup_chains_x();
149
150 if (needs_reset) {
151 print_info("ht reset -\r\n");
152 soft_reset();
153 }
154
155 enable_smbus();
156
157 memreset_setup();
Carl-Daniel Hailfinger2ee67792008-10-01 12:52:52 +0000158 sdram_initialize(ARRAY_SIZE(cpu), cpu);
Yinghai Lu304f24c2005-07-08 02:56:47 +0000159
Yinghai Lu9a791df2006-04-03 20:38:34 +0000160 post_cache_as_ram();
Yinghai Lu304f24c2005-07-08 02:56:47 +0000161}