K8_4RANK to QRANK
[coreboot.git] / src / mainboard / tyan / s2850 / auto.c
1 #define ASSEMBLY 1
2 #include <stdint.h>
3 #include <device/pci_def.h>
4 #include <arch/io.h>
5 #include <device/pnp_def.h>
6 #include <arch/romcc_io.h>
7 #include <cpu/x86/lapic.h>
8 #include <arch/cpu.h>
9 #include "option_table.h"
10 #include "pc80/mc146818rtc_early.c"
11 #include "pc80/serial.c"
12 #include "arch/i386/lib/console.c"
13 #include "ram/ramtest.c"
14 #include "northbridge/amd/amdk8/incoherent_ht.c"
15 #include "southbridge/amd/amd8111/amd8111_early_smbus.c"
16 #include "northbridge/amd/amdk8/raminit.h"
17 #include "cpu/amd/model_fxx/apic_timer.c"
18 #include "lib/delay.c"
19 #include "cpu/x86/lapic/boot_cpu.c"
20 #include "northbridge/amd/amdk8/reset_test.c"
21 #include "northbridge/amd/amdk8/debug.c"
22 #include <cpu/amd/model_fxx_rev.h>
23 #include "superio/winbond/w83627hf/w83627hf_early_serial.c"
24 #include "cpu/amd/mtrr/amd_earlymtrr.c"
25 #include "cpu/x86/bist.h"
26
27 #define SERIAL_DEV PNP_DEV(0x2e, W83627HF_SP1)
28 /* Look up a which bus a given node/link combination is on.
29  * return 0 when we can't find the answer.
30  */
31 static unsigned node_link_to_bus(unsigned node, unsigned link)
32 {
33         unsigned reg;
34         
35         for(reg = 0xE0; reg < 0xF0; reg += 0x04) {
36                 unsigned config_map;
37                 config_map = pci_read_config32(PCI_DEV(0, 0x18, 1), reg);
38                 if ((config_map & 3) != 3) {
39                         continue; 
40                 }       
41                 if ((((config_map >> 4) & 7) == node) &&
42                         (((config_map >> 8) & 3) == link))
43                 {       
44                         return (config_map >> 16) & 0xff;
45                 }       
46         }       
47         return 0;
48 }       
49
50 static void hard_reset(void)
51 {
52         device_t dev;
53
54         /* Find the device */
55         dev = PCI_DEV(node_link_to_bus(0, 0), 0x04, 3);
56
57         set_bios_reset();
58
59         /* enable cf9 */
60         pci_write_config8(dev, 0x41, 0xf1);
61         /* reset */
62         outb(0x0e, 0x0cf9);
63 }
64
65 static void soft_reset(void)
66 {
67         device_t dev;
68
69         /* Find the device */
70         dev = PCI_DEV(node_link_to_bus(0, 0), 0x04, 0);
71
72         set_bios_reset();
73         pci_write_config8(dev, 0x47, 1);
74 }
75
76 #define REV_B_RESET 0
77 static void memreset_setup(void)
78 {
79         if (is_cpu_pre_c0()) {
80                 outb((0 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (1 << 2) | (0 << 0), SMBUS_IO_BASE + 0xc0 + 16);       //REVC_MEMRST_EN=0
81         } else {
82                 outb((0 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (1 << 2) | (1 << 0), SMBUS_IO_BASE + 0xc0 + 16);       //REVC_MEMRST_EN=1
83         }
84         outb((0 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (1 << 2) |
85              (0 << 0), SMBUS_IO_BASE + 0xc0 + 17);
86 }
87
88 static void memreset(int controllers, const struct mem_controller *ctrl)
89 {
90         if (is_cpu_pre_c0()) {
91                 udelay(800);
92                 outb((0 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (1 << 2) | (1 << 0), SMBUS_IO_BASE + 0xc0 + 17);       //REVB_MEMRST_L=1
93                 udelay(90);
94         }
95 }
96
97 static inline void activate_spd_rom(const struct mem_controller *ctrl)
98 {
99         /* nothing to do */
100 }
101
102 static inline int spd_read_byte(unsigned device, unsigned address)
103 {
104         return smbus_read_byte(device, address);
105 }
106
107 #include "northbridge/amd/amdk8/setup_resource_map.c"
108 #include "northbridge/amd/amdk8/raminit.c"
109 #include "northbridge/amd/amdk8/coherent_ht.c"
110 #include "sdram/generic_sdram.c"
111 #include "northbridge/amd/amdk8/resourcemap.c"
112
113 #if CONFIG_LOGICAL_CPUS==1
114 #define SET_NB_CFG_54 1
115 #include "cpu/amd/dualcore/dualcore.c"
116 #endif
117
118 static void main(unsigned long bist)
119 {
120         /*
121          * GPIO28 of 8111 will control H0_MEMRESET_L
122          * GPIO29 of 8111 will control H1_MEMRESET_L
123          */
124         static const struct mem_controller cpu[] = {
125                 {
126                  .node_id = 0,
127                  .f0 = PCI_DEV(0, 0x18, 0),
128                  .f1 = PCI_DEV(0, 0x18, 1),
129                  .f2 = PCI_DEV(0, 0x18, 2),
130                  .f3 = PCI_DEV(0, 0x18, 3),
131                  .channel0 = {(0xa << 3) | 0, (0xa << 3) | 2, 0, 0},
132                  .channel1 = {(0xa << 3) | 1, (0xa << 3) | 3, 0, 0},
133                  },
134         };
135
136         int needs_reset;
137
138 #if CONFIG_LOGICAL_CPUS==1
139         struct node_core_id id;
140 #else
141         unsigned nodeid;
142 #endif
143
144         if (bist == 0) {
145                 /* Skip this if there was a built in self test failure */
146                 amd_early_mtrr_init();
147
148 #if CONFIG_LOGICAL_CPUS==1
149                 set_apicid_cpuid_lo();
150 #endif
151
152                 enable_lapic();
153                 init_timer();
154
155 #if CONFIG_LOGICAL_CPUS==1
156                 id = get_node_core_id_x();
157                 if(id.coreid == 0) {
158                         if (cpu_init_detected(id.nodeid)) {
159                                 asm volatile ("jmp __cpu_reset");
160                         }
161                         distinguish_cpu_resets(id.nodeid);
162                 }
163 #else
164                 nodeid = lapicid();
165                 if (cpu_init_detected(nodeid)) {
166                         asm volatile ("jmp __cpu_reset");
167                 }
168                 distinguish_cpu_resets(nodeid);
169 #endif
170
171                 if (!boot_cpu()
172 #if CONFIG_LOGICAL_CPUS==1 
173                         || (id.coreid != 0)
174 #endif
175                 ) {
176                         stop_this_cpu(); 
177                 }
178         }
179                         
180         w83627hf_enable_serial(SERIAL_DEV, TTYS0_BASE);
181         uart_init();    
182         console_init(); 
183                 
184         /* Halt if there was a built in self test failure */
185         report_bist_failure(bist);
186
187         setup_default_resource_map();
188         needs_reset = setup_coherent_ht_domain();
189 #if CONFIG_LOGICAL_CPUS==1
190         start_other_cores();
191 #endif
192         needs_reset |= ht_setup_chain(PCI_DEV(0, 0x18, 0), 0x80);
193         if (needs_reset) {
194                 print_info("ht reset -\r\n");
195                 soft_reset();
196         }
197         enable_smbus();
198
199         memreset_setup();
200         sdram_initialize(sizeof(cpu) / sizeof(cpu[0]), cpu);
201
202 }