Revision: linuxbios@linuxbios.org--devel/freebios--devel--2.0--patch-34
[coreboot.git] / src / mainboard / tyan / s2895 / auto.c
1 #define ASSEMBLY 1
2  
3 #include <stdint.h>
4 #include <device/pci_def.h>
5 #include <arch/io.h>
6 #include <device/pnp_def.h>
7 #include <arch/romcc_io.h>
8 #include <cpu/x86/lapic.h>
9 #include <arch/cpu.h>
10 #include "option_table.h"
11 #include "pc80/mc146818rtc_early.c"
12 #include "pc80/serial.c"
13 #include "arch/i386/lib/console.c"
14 #include "ram/ramtest.c"
15
16 #include "northbridge/amd/amdk8/cpu_rev.c"
17 #define K8_HT_FREQ_1G_SUPPORT 1
18 #include "northbridge/amd/amdk8/incoherent_ht.c"
19 #include "southbridge/nvidia/ck804/ck804_early_smbus.c"
20 #include "northbridge/amd/amdk8/raminit.h"
21 #include "cpu/amd/model_fxx/apic_timer.c"
22 #include "lib/delay.c"
23 #include "cpu/x86/lapic/boot_cpu.c"
24 #include "northbridge/amd/amdk8/reset_test.c"
25 #include "northbridge/amd/amdk8/debug.c"
26 #include "cpu/amd/model_fxx/model_fxx_msr.h"
27 #include "superio/smsc/lpc47b397/lpc47b397_early_serial.c"
28
29 #include "cpu/amd/mtrr/amd_earlymtrr.c"
30 #include "cpu/x86/bist.h"
31
32 #include "superio/smsc/lpc47b397/lpc47b397_early_gpio.c"
33
34 #include "northbridge/amd/amdk8/setup_resource_map.c"
35
36 #define SERIAL_DEV PNP_DEV(0x2e, LPC47B397_SP1)
37
38 static void hard_reset(void)
39 {
40         set_bios_reset();
41
42         /* full reset */
43         outb(0x0a, 0x0cf9);
44         outb(0x0e, 0x0cf9);
45 }
46
47 static void soft_reset(void)
48 {
49         set_bios_reset();
50 #if 1
51         /* link reset */
52         outb(0x02, 0x0cf9);
53         outb(0x06, 0x0cf9);
54 #endif
55 }
56
57 static void memreset_setup(void)
58 {
59 }
60
61 static void memreset(int controllers, const struct mem_controller *ctrl)
62 {
63 }
64
65 #define SUPERIO_GPIO_DEV PNP_DEV(0x2e, LPC47B397_RT)
66         
67 #define SUPERIO_GPIO_IO_BASE 0x400
68
69 static void sio_gpio_setup(void){
70
71         unsigned value;
72
73 #if 1
74         /*Enable onboard scsi*/
75         lpc47b397_gpio_offset_out(SUPERIO_GPIO_IO_BASE, 0x2c, (1<<7)|(0<<2)|(0<<1)|(0<<0)); // GP21, offset 0x2c, DISABLE_SCSI_L 
76         value = lpc47b397_gpio_offset_in(SUPERIO_GPIO_IO_BASE, 0x4c);
77         lpc47b397_gpio_offset_out(SUPERIO_GPIO_IO_BASE, 0x4c, (value|(1<<1)));
78 #endif
79         
80 }
81
82 static inline void activate_spd_rom(const struct mem_controller *ctrl)
83 {
84         /* nothing to do */
85 }
86
87 static inline int spd_read_byte(unsigned device, unsigned address)
88 {
89         return smbus_read_byte(device, address);
90 }
91
92 #define K8_4RANK_DIMM_SUPPORT 1
93
94 #include "northbridge/amd/amdk8/raminit.c"
95 #if 0
96         #define ENABLE_APIC_EXT_ID 1
97         #define APIC_ID_OFFSET 0x10
98         #define LIFT_BSP_APIC_ID 0
99 #else
100         #define ENABLE_APIC_EXT_ID 0
101 #endif
102 #include "northbridge/amd/amdk8/coherent_ht.c"
103 #include "sdram/generic_sdram.c"
104
105 /* tyan does not want the default */
106 #include "resourcemap.c"
107
108 #if CONFIG_LOGICAL_CPUS==1
109 #define SET_NB_CFG_54 1
110 #include "cpu/amd/dualcore/dualcore.c"
111 #else
112 #include "cpu/amd/model_fxx/node_id.c"
113 #endif
114
115 #define FIRST_CPU  1
116 #define SECOND_CPU 1
117 #define TOTAL_CPUS (FIRST_CPU + SECOND_CPU)
118
119 #define CK804_NUM 2
120 #define CK804B_BUSN 0xc
121 #define CK804_USE_NIC 1
122 #define CK804_USE_ACI 1
123 #include "southbridge/nvidia/ck804/ck804_early_setup.h"
124 #include "southbridge/nvidia/ck804/ck804_early_setup_ss.h"
125
126 //set GPIO to input mode
127 #define CK804_MB_SETUP \
128                 RES_PORT_IO_8, SYSCTRL_IO_BASE + 0xc0+ 5, ~(0xff),((0<<4)|(0<<2)|(0<<0)),/* M9,GPIO6, PCIXB2_PRSNT1_L*/  \
129                 RES_PORT_IO_8, SYSCTRL_IO_BASE + 0xc0+15, ~(0xff),((0<<4)|(0<<2)|(0<<0)),/* M8,GPIO16, PCIXB2_PRSNT2_L*/ \
130                 RES_PORT_IO_8, SYSCTRL_IO_BASE + 0xc0+44, ~(0xff),((0<<4)|(0<<2)|(0<<0)),/* P5,GPIO45, PCIXA_PRSNT1_L*/  \
131                 RES_PORT_IO_8, SYSCTRL_IO_BASE + 0xc0+ 7, ~(0xff),((0<<4)|(0<<2)|(0<<0)),/* M5,GPIO8, PCIXA_PRSNT2_L*/   \
132                 RES_PORT_IO_8, SYSCTRL_IO_BASE + 0xc0+16, ~(0xff),((0<<4)|(0<<2)|(0<<0)),/* K4,GPIO17, PCIXB_PRSNT1_L*/  \
133                 RES_PORT_IO_8, SYSCTRL_IO_BASE + 0xc0+45, ~(0xff),((0<<4)|(0<<2)|(0<<0)),/* P7,GPIO46, PCIXB_PRSNT2_L*/
134                 
135 #include "southbridge/nvidia/ck804/ck804_early_setup.c"
136
137
138 static void main(unsigned long bist)
139 {
140         static const struct mem_controller cpu[] = {
141 #if FIRST_CPU
142                 {
143                         .node_id = 0,
144                         .f0 = PCI_DEV(0, 0x18, 0),
145                         .f1 = PCI_DEV(0, 0x18, 1),
146                         .f2 = PCI_DEV(0, 0x18, 2),
147                         .f3 = PCI_DEV(0, 0x18, 3),
148                         .channel0 = { (0xa<<3)|0, (0xa<<3)|2, 0, 0 },
149                         .channel1 = { (0xa<<3)|1, (0xa<<3)|3, 0, 0 },
150                 },
151 #endif
152 #if SECOND_CPU
153                 {
154                         .node_id = 1,
155                         .f0 = PCI_DEV(0, 0x19, 0),
156                         .f1 = PCI_DEV(0, 0x19, 1),
157                         .f2 = PCI_DEV(0, 0x19, 2),
158                         .f3 = PCI_DEV(0, 0x19, 3),
159                         .channel0 = { (0xa<<3)|4, (0xa<<3)|6, 0, 0 },
160                         .channel1 = { (0xa<<3)|5, (0xa<<3)|7, 0, 0 },
161                 },
162 #endif
163         };
164
165         int needs_reset;
166 #if CONFIG_LOGICAL_CPUS==1
167         struct node_core_id id;
168 #else
169         unsigned nodeid;
170 #endif
171
172         if (bist == 0) {
173                 /* Skip this if there was a built in self test failure */
174                 amd_early_mtrr_init();
175
176 #if CONFIG_LOGICAL_CPUS==1
177                 set_apicid_cpuid_lo();
178                 
179                 id = get_node_core_id_x(); // that is initid
180         #if ENABLE_APIC_EXT_ID == 1
181                 if(id.coreid == 0) {
182                         enable_apic_ext_id(id.nodeid);
183                 }
184         #endif
185 #else           
186                 nodeid = get_node_id();
187         #if ENABLE_APIC_EXT_ID == 1
188                 enable_apic_ext_id(nodeid);
189         #endif
190 #endif
191
192                 enable_lapic();
193                 init_timer();
194
195
196 #if CONFIG_LOGICAL_CPUS==1
197         #if ENABLE_APIC_EXT_ID == 1
198             #if LIFT_BSP_APIC_ID == 0
199                 if( id.nodeid != 0 ) 
200             #endif
201                         lapic_write(LAPIC_ID, ( lapic_read(LAPIC_ID) | (APIC_ID_OFFSET<<24) ) );
202         #endif
203
204                 if(id.coreid == 0) {
205                         if (cpu_init_detected(id.nodeid)) {
206                                 asm volatile ("jmp __cpu_reset");
207                         }
208                         distinguish_cpu_resets(id.nodeid);
209                 }
210
211 #else
212         #if ENABLE_APIC_EXT_ID == 1
213             #if LIFT_BSP_APIC_ID == 0
214                 if(nodeid != 0)
215             #endif
216                         lapic_write(LAPIC_ID, ( lapic_read(LAPIC_ID) | (APIC_ID_OFFSET<<24) ) ); 
217
218         #endif
219
220                 if (cpu_init_detected(nodeid)) {
221                         asm volatile ("jmp __cpu_reset");
222                 }
223                 distinguish_cpu_resets(nodeid);
224 #endif
225
226
227                 if (!boot_cpu()
228 #if CONFIG_LOGICAL_CPUS==1 
229                         || (id.coreid != 0)
230 #endif
231                 ) {
232                         stop_this_cpu(); 
233                 }
234         }
235
236
237         lpc47b397_enable_serial(SERIAL_DEV, TTYS0_BASE);
238         uart_init();
239         console_init();
240         
241         /* Halt if there was a built in self test failure */
242         report_bist_failure(bist);
243
244         sio_gpio_setup();
245
246         setup_s2895_resource_map();
247
248         needs_reset = setup_coherent_ht_domain();
249 #if CONFIG_LOGICAL_CPUS==1
250         start_other_cores();
251 #endif
252
253         needs_reset |= ht_setup_chains_x();
254
255         needs_reset |= ck804_early_setup_x();   
256
257         if (needs_reset) {
258                 print_info("ht reset -\r\n");
259                 soft_reset();
260         }
261
262
263         enable_smbus();
264
265         memreset_setup();
266         sdram_initialize(sizeof(cpu)/sizeof(cpu[0]), cpu);
267
268
269 }