blob: 9cb1144b80ced8a31a749311a7b1e1ee60e197a0 [file] [log] [blame]
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +00001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2007-2010 coresystems GmbH
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000014 */
15
16// __PRE_RAM__ means: use "unsigned" for device, not a struct.
17
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000018#include <stdint.h>
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000019#include <arch/io.h>
Elyes HAOUASd07048a2019-04-21 20:17:11 +020020#include <cf9_reset.h>
Kyösti Mälkki3855c012019-03-03 08:45:19 +020021#include <device/pnp_ops.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +020022#include <device/pci_ops.h>
Elyes HAOUASece7d0c2018-07-03 18:34:10 +020023#include <console/console.h>
24#include <cpu/intel/romstage.h>
25#include <cpu/x86/bist.h>
26#include <cpu/x86/lapic.h>
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000027#include <device/pci_def.h>
28#include <device/pnp_def.h>
Edward O'Callaghan2c9e3702014-05-21 06:51:15 +100029#include <northbridge/intel/i945/i945.h>
30#include <northbridge/intel/i945/raminit.h>
31#include <southbridge/intel/i82801gx/i82801gx.h>
Elyes HAOUASece7d0c2018-07-03 18:34:10 +020032#include <superio/winbond/common/winbond.h>
33#include <superio/winbond/w83627ehg/w83627ehg.h>
Patrick Rudolph425e75a2019-03-24 15:06:17 +010034#include <southbridge/intel/common/pmclib.h>
Patrick Georgid0835952010-10-05 09:07:10 +000035
Uwe Hermann57b2ff82010-11-21 17:29:59 +000036#define SERIAL_DEV PNP_DEV(0x4e, W83627EHG_SP1)
Elyes HAOUASf5f1b382018-04-26 09:43:03 +020037#define SUPERIO_DEV PNP_DEV(0x4e, 0)
Uwe Hermann57b2ff82010-11-21 17:29:59 +000038
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000039static void ich7_enable_lpc(void)
40{
41 // Enable Serial IRQ
Arthur Heymansb451df22017-08-15 20:59:09 +020042 pci_write_config8(PCI_DEV(0, 0x1f, 0), SERIRQ_CNTL, 0xd0);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000043 // Set COM1/COM2 decode range
Arthur Heymansb451df22017-08-15 20:59:09 +020044 pci_write_config16(PCI_DEV(0, 0x1f, 0), LPC_IO_DEC, 0x0010);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000045 // Enable COM1/COM2/KBD/SuperIO1+2
Arthur Heymansb451df22017-08-15 20:59:09 +020046 pci_write_config16(PCI_DEV(0, 0x1f, 0), LPC_EN, CNF2_LPC_EN
47 | CNF1_LPC_EN | KBC_LPC_EN | FDD_LPC_EN | COMA_LPC_EN
48 | COMB_LPC_EN);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000049 // Enable HWM at 0x290
Arthur Heymansb451df22017-08-15 20:59:09 +020050 pci_write_config32(PCI_DEV(0, 0x1f, 0), GEN1_DEC, 0x00fc0291);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000051 // io 0x300 decode
Arthur Heymansb451df22017-08-15 20:59:09 +020052 pci_write_config32(PCI_DEV(0, 0x1f, 0), GEN4_DEC, 0x00000301);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000053}
54
55/* This box has one superio
56 * Also set up the GPIOs from the beginning. This is the "no schematic
57 * but safe anyways" method.
58 */
59static void early_superio_config_w83627ehg(void)
60{
Antonello Dettoricca59382016-11-08 18:44:46 +010061 pnp_devfn_t dev;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000062
Elyes HAOUASf5f1b382018-04-26 09:43:03 +020063 dev = SUPERIO_DEV;
Keith Huibb73c982017-08-13 16:31:18 -040064 pnp_enter_conf_state(dev);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000065
Elyes HAOUAS2e977802018-02-16 08:27:50 +010066 pnp_write_config(dev, 0x24, 0xc4); // PNPCVS
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000067
68 pnp_write_config(dev, 0x29, 0x01); // GPIO settings
69 pnp_write_config(dev, 0x2a, 0x40); // GPIO settings should be fc but gets set to 02
70 pnp_write_config(dev, 0x2b, 0xc0); // GPIO settings?
71 pnp_write_config(dev, 0x2c, 0x03); // GPIO settings?
72 pnp_write_config(dev, 0x2d, 0x20); // GPIO settings?
73
Elyes HAOUAS531b87a2016-09-19 09:46:33 -060074 dev = PNP_DEV(0x4e, W83627EHG_SP1);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000075 pnp_set_logical_device(dev);
76 pnp_set_enable(dev, 0);
77 pnp_set_iobase(dev, PNP_IDX_IO0, 0x3f8);
78 pnp_set_irq(dev, PNP_IDX_IRQ0, 4);
79 pnp_set_enable(dev, 1);
80
Elyes HAOUAS531b87a2016-09-19 09:46:33 -060081 dev = PNP_DEV(0x4e, W83627EHG_SP2);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000082 pnp_set_logical_device(dev);
83 pnp_set_enable(dev, 0);
84 pnp_set_iobase(dev, PNP_IDX_IO0, 0x2f8);
85 pnp_set_irq(dev, PNP_IDX_IRQ0, 3);
86 // pnp_write_config(dev, 0xf1, 4); // IRMODE0
87 pnp_set_enable(dev, 1);
88
Elyes HAOUAS531b87a2016-09-19 09:46:33 -060089 dev = PNP_DEV(0x4e, W83627EHG_KBC); // Keyboard
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000090 pnp_set_logical_device(dev);
91 pnp_set_enable(dev, 0);
92 pnp_set_iobase(dev, PNP_IDX_IO0, 0x60);
93 pnp_set_iobase(dev, PNP_IDX_IO1, 0x64);
94 //pnp_write_config(dev, 0xf0, 0x82);
95 pnp_set_enable(dev, 1);
96
Elyes HAOUAS531b87a2016-09-19 09:46:33 -060097 dev = PNP_DEV(0x4e, W83627EHG_GPIO2);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +000098 pnp_set_logical_device(dev);
99 pnp_set_enable(dev, 1); // Just enable it
100
Elyes HAOUAS531b87a2016-09-19 09:46:33 -0600101 dev = PNP_DEV(0x4e, W83627EHG_GPIO3);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000102 pnp_set_logical_device(dev);
103 pnp_set_enable(dev, 0);
104 pnp_write_config(dev, 0xf0, 0xfb); // GPIO bit 2 is output
105 pnp_write_config(dev, 0xf1, 0x00); // GPIO bit 2 is 0
106 pnp_write_config(dev, 0x30, 0x03); // Enable GPIO3+4. pnp_set_enable is not sufficient
107
Elyes HAOUAS531b87a2016-09-19 09:46:33 -0600108 dev = PNP_DEV(0x4e, W83627EHG_FDC);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000109 pnp_set_logical_device(dev);
110 pnp_set_enable(dev, 0);
111
Elyes HAOUAS531b87a2016-09-19 09:46:33 -0600112 dev = PNP_DEV(0x4e, W83627EHG_PP);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000113 pnp_set_logical_device(dev);
114 pnp_set_enable(dev, 0);
115
116 /* Enable HWM */
Elyes HAOUAS531b87a2016-09-19 09:46:33 -0600117 dev = PNP_DEV(0x4e, W83627EHG_HWM);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000118 pnp_set_logical_device(dev);
119 pnp_set_enable(dev, 0);
120 pnp_set_iobase(dev, PNP_IDX_IO0, 0xa00);
121 pnp_set_enable(dev, 1);
122
Keith Huibb73c982017-08-13 16:31:18 -0400123 pnp_exit_conf_state(dev);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000124}
125
126static void rcba_config(void)
127{
128 /* Set up virtual channel 0 */
129 //RCBA32(0x0014) = 0x80000001;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000130
131 /* Device 1f interrupt pin register */
Arthur Heymansb451df22017-08-15 20:59:09 +0200132 RCBA32(D31IP) = 0x00042210;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000133 /* Device 1d interrupt pin register */
Arthur Heymansb451df22017-08-15 20:59:09 +0200134 RCBA32(D28IP) = 0x00214321;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000135
136 /* dev irq route register */
Arthur Heymansb451df22017-08-15 20:59:09 +0200137 RCBA16(D31IR) = 0x0132;
138 RCBA16(D30IR) = 0x0146;
139 RCBA16(D29IR) = 0x0237;
140 RCBA16(D28IR) = 0x3201;
141 RCBA16(D27IR) = 0x0146;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000142
143 /* Enable IOAPIC */
Arthur Heymansb451df22017-08-15 20:59:09 +0200144 RCBA8(OIC) = 0x03;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000145
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000146 /* Enable PCIe Root Port Clock Gate */
147 // RCBA32(0x341c) = 0x00000001;
148}
149
150static void early_ich7_init(void)
151{
152 uint8_t reg8;
153 uint32_t reg32;
154
155 // program secondary mlt XXX byte?
156 pci_write_config8(PCI_DEV(0, 0x1e, 0), 0x1b, 0x20);
157
158 // reset rtc power status
159 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa4);
160 reg8 &= ~(1 << 2);
161 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xa4, reg8);
162
163 // usb transient disconnect
164 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xad);
165 reg8 |= (3 << 0);
166 pci_write_config8(PCI_DEV(0, 0x1f, 0), 0xad, reg8);
167
168 reg32 = pci_read_config32(PCI_DEV(0, 0x1d, 7), 0xfc);
169 reg32 |= (1 << 29) | (1 << 17);
170 pci_write_config32(PCI_DEV(0, 0x1d, 7), 0xfc, reg32);
171
172 reg32 = pci_read_config32(PCI_DEV(0, 0x1d, 7), 0xdc);
173 reg32 |= (1 << 31) | (1 << 27);
174 pci_write_config32(PCI_DEV(0, 0x1d, 7), 0xdc, reg32);
175
176 RCBA32(0x0088) = 0x0011d000;
177 RCBA16(0x01fc) = 0x060f;
178 RCBA32(0x01f4) = 0x86000040;
179 RCBA32(0x0214) = 0x10030549;
180 RCBA32(0x0218) = 0x00020504;
181 RCBA8(0x0220) = 0xc5;
Arthur Heymansb451df22017-08-15 20:59:09 +0200182 reg32 = RCBA32(GCS);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000183 reg32 |= (1 << 6);
Arthur Heymansb451df22017-08-15 20:59:09 +0200184 RCBA32(GCS) = reg32;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000185 reg32 = RCBA32(0x3430);
186 reg32 &= ~(3 << 0);
187 reg32 |= (1 << 0);
188 RCBA32(0x3430) = reg32;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000189 RCBA16(0x0200) = 0x2008;
190 RCBA8(0x2027) = 0x0d;
191 RCBA16(0x3e08) |= (1 << 7);
192 RCBA16(0x3e48) |= (1 << 7);
193 RCBA32(0x3e0e) |= (1 << 7);
194 RCBA32(0x3e4e) |= (1 << 7);
195
196 // next step only on ich7m b0 and later:
197 reg32 = RCBA32(0x2034);
198 reg32 &= ~(0x0f << 16);
199 reg32 |= (5 << 16);
200 RCBA32(0x2034) = reg32;
201}
202
Kyösti Mälkki15fa9922016-06-17 10:00:28 +0300203void mainboard_romstage_entry(unsigned long bist)
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000204{
Vladimir Serbinenko55601882014-10-15 20:17:51 +0200205 int s3resume = 0;
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000206
Uwe Hermann7b997052010-11-21 22:47:22 +0000207 if (bist == 0)
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000208 enable_lapic();
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000209
210 ich7_enable_lpc();
211 early_superio_config_w83627ehg();
212
213 /* Set up the console */
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000214 console_init();
215
216 /* Halt if there was a built in self test failure */
217 report_bist_failure(bist);
218
219 if (MCHBAR16(SSKPD) == 0xCAFE) {
220 printk(BIOS_DEBUG, "soft reset detected, rebooting properly\n");
Elyes HAOUASd07048a2019-04-21 20:17:11 +0200221 system_reset();
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000222 }
223
224 /* Perform some early chipset initialization required
225 * before RAM initialization can work
226 */
227 i945_early_initialization();
228
Vladimir Serbinenko55601882014-10-15 20:17:51 +0200229 s3resume = southbridge_detect_s3_resume();
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000230
231 /* Enable SPD ROMs and DDR-II DRAM */
232 enable_smbus();
233
Kyösti Mälkki346d2012019-03-23 10:07:16 +0200234 if (CONFIG(DEBUG_RAM_SETUP))
235 dump_spd_registers();
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000236
Vladimir Serbinenko55601882014-10-15 20:17:51 +0200237 sdram_initialize(s3resume ? 2 : 0, NULL);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000238
239 /* Perform some initialization that must run before stage2 */
240 early_ich7_init();
241
242 /* This should probably go away. Until now it is required
243 * and mainboard specific
244 */
245 rcba_config();
246
247 /* Chipset Errata! */
248 fixup_i945_errata();
249
250 /* Initialize the internal PCIe links before we go into stage2 */
Vladimir Serbinenko55601882014-10-15 20:17:51 +0200251 i945_late_initialization(s3resume);
Bernhard M. Wiedemann6e554de2010-05-30 12:56:17 +0000252}