1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <device/mmio.h>
4 #include <device/pci_ops.h>
6 #include <device/pci_def.h>
7 #include <device/smbus_host.h>
8 #include <southbridge/intel/common/gpio.h>
9 #include <southbridge/intel/common/pmbase.h>
10 #include <southbridge/intel/common/rcba.h>
13 #include <northbridge/intel/sandybridge/sandybridge.h>
18 #define SOUTHBRIDGE PCI_DEV(0, 0x1f, 0)
19 #define PCI_DEVICE_ID_INTEL_UM77 0x1e58
21 static void wait_iobp(void)
23 while (RCBA8(IOBPS
) & 1)
24 ; // implement timeout?
27 static u32
read_iobp(u32 address
)
31 RCBA32(IOBPIRI
) = address
;
32 RCBA16(IOBPS
) = (RCBA16(IOBPS
) & 0x1ff) | 0x600;
36 RCBA8(IOBPS
); // call wait_iobp() instead here?
40 static void write_iobp(u32 address
, u32 val
)
42 /* this function was probably pch_iobp_update with the andvalue
43 * being 0. So either the IOBP read can be removed or this function
44 * and the pch_iobp_update function in ramstage could be merged */
46 RCBA16(IOBPS
) = (RCBA16(IOBPS
) & 0x1ff) | 0x600;
51 RCBA16(IOBPS
) = (RCBA16(IOBPS
) & 0x1ff) | 0x600;
53 RCBA8(IOBPS
); // call wait_iobp() instead here?
56 void early_pch_init_native_dmi_pre(void)
58 /* Link Capabilities Register */
59 RCBA32(LCAP
) = (RCBA32(LCAP
) & ~0x3fc00) |
60 (3 << 10) | // L0s and L1 entry supported
61 (2 << 12) | // L0s 128 ns to less than 256 ns
62 (2 << 15); // L1 2 us to less than 4 us
64 RCBA32(0x2340) = (RCBA32(0x2340) & ~0xff0000) | (0x3a << 16);
65 RCBA8(DLCTL2
) = (RCBA8(DLCTL2
) & ~0xf) | 2;
68 void early_pch_init_native_dmi_post(void)
70 RCBA32(CIR0
); // !!! = 0x01200654
71 RCBA32(CIR0
) = 0x01200654;
72 RCBA32(CIR0
); // !!! = 0x01200654
73 RCBA32(CIR0
) = 0x012a0654;
74 RCBA32(CIR0
); // !!! = 0x012a0654
75 RCBA8(UPDCR
); // !!! = 0x00
79 * Virtual Channel resources must match settings in DMIBAR!
81 * Some of the following settings are taken from
82 * "Intel Core i5-600, i3-500 Desktop Processor Series and Intel
83 * Pentium Desktop Processor 6000 Series Vol. 2" datasheet and
87 /* Virtual Channel 0 Resource Control Register.
89 * Set Virtual Channel Identifier.
90 * Map TC0 and TC3 and TC4 to VC0.
93 RCBA32(V0CTL
) = (1 << 31) | (0 << 24) | (0x0c << 1) | 1;
95 /* Virtual Channel 1 Resource Control Register.
97 * Set Virtual Channel Identifier.
98 * Map TC1 and TC5 to VC1.
100 RCBA32(V1CTL
) = (1 << 31) | (1 << 24) | (0x11 << 1);
101 /* Read back register */
104 /* Virtual Channel private Resource Control Register.
106 * Set Virtual Channel Identifier.
107 * Map TC2 and TC6 to VCp.
109 RCBA32(CIR31
) = (1 << 31) | (2 << 24) | (0x22 << 1);
110 /* Read back register */
113 /* Virtual Channel ME Resource Control Register.
115 * Set Virtual Channel Identifier.
118 RCBA32(CIR32
) = (1 << 31) | (7 << 24) | (0x40 << 1);
120 /* Lock Virtual Channel Resource control register. */
121 RCBA32(CIR0
) |= TCLOCKDN
;
122 /* Read back register */
125 /* Wait for virtual channels negotiation pending */
126 while (RCBA16(V0STS
) & VCNEGPND
)
128 while (RCBA16(V1STS
) & VCNEGPND
)
130 while (RCBA16(0x2036) & VCNEGPND
)
132 while (RCBA16(0x2046) & VCNEGPND
)
136 void early_pch_init_native(void)
138 const u16 dev_id
= pci_read_config16(PCH_LPC_DEV
, PCI_DEVICE_ID
);
139 u8 pcie_ports
= (dev_id
== PCI_DEVICE_ID_INTEL_UM77
) ? 4 : 8;
141 pci_write_config8(SOUTHBRIDGE
, 0xa6, pci_read_config8(SOUTHBRIDGE
, 0xa6) | 2);
143 /* Clear this bit early for PCIe device detection */
144 for (uint8_t i
= 0; i
< pcie_ports
; i
++)
145 pci_update_config32(PCH_PCIE_DEV(i
), 0x338, ~(1 << 26), 0);
147 RCBA32(CIR1
) = 0x00109000;
148 RCBA32(REC
); // !!! = 0x00000000
149 RCBA32(REC
) = 0x40000000;
150 RCBA32(0x100c) = 0x01110000;
151 RCBA8(0x2340) = 0x1b;
152 RCBA32(CIR6
); // !!! = 0x0a080000
153 RCBA32(CIR6
) = 0x0a280000;
154 RCBA32(0x2310); // !!! = 0xc809605b
155 RCBA32(0x2310) = 0xa809605b;
156 RCBA32(DMC2
) = 0x00854c74;
157 RCBA8(RPC
); // !!! = 0x00
158 RCBA32(0x2310); // !!! = 0xa809605b
159 RCBA32(0x2310) = 0xa809605b;
160 RCBA32(0x2310); // !!! = 0xa809605b
161 RCBA32(0x2310) = 0xa809605b;
163 write_iobp(0xea007f62, 0x00590133);
164 write_iobp(0xec007f62, 0x00590133);
165 write_iobp(0xec007f64, 0x59555588);
166 write_iobp(0xea0040b9, 0x0001051c);
167 write_iobp(0xeb0040a1, 0x800084ff);
168 write_iobp(0xec0040a1, 0x800084ff);
169 write_iobp(0xea004001, 0x00008400);
170 write_iobp(0xeb004002, 0x40201758);
171 write_iobp(0xec004002, 0x40201758);
172 write_iobp(0xea004002, 0x00601758);
173 write_iobp(0xea0040a1, 0x810084ff);
174 write_iobp(0xeb0040b1, 0x0001c598);
175 write_iobp(0xec0040b1, 0x0001c598);
176 write_iobp(0xeb0040b6, 0x0001c598);
177 write_iobp(0xea0000a9, 0x80ff969f);
178 write_iobp(0xea0001a9, 0x80ff969f);
179 write_iobp(0xeb0040b2, 0x0001c396);
180 write_iobp(0xeb0040b3, 0x0001c396);
181 write_iobp(0xec0040b2, 0x0001c396);
182 write_iobp(0xea0001a9, 0x80ff94ff);
183 write_iobp(SATA_IOBP_SP0G3IR
, 0x0088037f);
184 write_iobp(0xea0000a9, 0x80ff94ff);
185 write_iobp(SATA_IOBP_SP1G3IR
, 0x0088037f);
187 write_iobp(0xea007f05, 0x00010642);
188 write_iobp(0xea0040b7, 0x0001c91c);
189 write_iobp(0xea0040b8, 0x0001c91c);
190 write_iobp(0xeb0040a1, 0x820084ff);
191 write_iobp(0xec0040a1, 0x820084ff);
192 write_iobp(0xea007f0a, 0xc2480000);
194 write_iobp(0xec00404d, 0x1ff177f);
195 write_iobp(0xec000084, 0x5a600000);
196 write_iobp(0xec000184, 0x5a600000);
197 write_iobp(0xec000284, 0x5a600000);
198 write_iobp(0xec000384, 0x5a600000);
199 write_iobp(0xec000094, 0x000f0501);
200 write_iobp(0xec000194, 0x000f0501);
201 write_iobp(0xec000294, 0x000f0501);
202 write_iobp(0xec000394, 0x000f0501);
203 write_iobp(0xec000096, 0x00000001);
204 write_iobp(0xec000196, 0x00000001);
205 write_iobp(0xec000296, 0x00000001);
206 write_iobp(0xec000396, 0x00000001);
207 write_iobp(0xec000001, 0x00008c08);
208 write_iobp(0xec000101, 0x00008c08);
209 write_iobp(0xec000201, 0x00008c08);
210 write_iobp(0xec000301, 0x00008c08);
211 write_iobp(0xec0040b5, 0x0001c518);
212 write_iobp(0xec000087, 0x06077597);
213 write_iobp(0xec000187, 0x06077597);
214 write_iobp(0xec000287, 0x06077597);
215 write_iobp(0xec000387, 0x06077597);
216 write_iobp(0xea000050, 0x00bb0157);
217 write_iobp(0xea000150, 0x00bb0157);
218 write_iobp(0xec007f60, 0x77777d77);
219 write_iobp(0xea00008d, 0x01320000);
220 write_iobp(0xea00018d, 0x01320000);
221 write_iobp(0xec0007b2, 0x04514b5e);
222 write_iobp(0xec00078c, 0x40000200);
223 write_iobp(0xec000780, 0x02000020);
226 static void pch_enable_bars(void)
228 pci_write_config32(PCH_LPC_DEV
, RCBA
, CONFIG_FIXED_RCBA_MMIO_BASE
| 1);
230 pci_write_config32(PCH_LPC_DEV
, PMBASE
, DEFAULT_PMBASE
| 1);
232 pci_write_config8(PCH_LPC_DEV
, ACPI_CNTL
, ACPI_EN
);
234 pci_write_config32(PCH_LPC_DEV
, GPIO_BASE
, DEFAULT_GPIOBASE
| 1);
236 /* Enable GPIO functionality. */
237 pci_write_config8(PCH_LPC_DEV
, GPIO_CNTL
, 0x10);
240 static void pch_generic_setup(void)
242 RCBA32(GCS
) = RCBA32(GCS
) | (1 << 5); /* No reset */
243 write_pmbase16(TCO1_CNT
, 1 << 11); /* halt timer */
246 static void pch_enable_gbe(void)
250 /* Don't do this in the bootblock, it might be RO. So one
251 couldn't change the setting later in an updated romstage. */
255 const struct device
*const gbe
= pcidev_on_root(0x19, 0);
256 if (gbe
&& gbe
->enabled
)
257 wanted_buc
= RCBA8(BUC
) & ~PCH_DISABLE_GBE
;
259 wanted_buc
= RCBA8(BUC
) | PCH_DISABLE_GBE
;
261 if (RCBA8(BUC
) != wanted_buc
) {
262 RCBA8(BUC
) = wanted_buc
;
263 /* Be double sure not to reset for naught. */
264 if (RCBA8(BUC
) != wanted_buc
)
270 static void pch_enable_lpc_decode(void)
273 * Enable some common LPC IO ranges:
274 * - 0x2e/0x2f, 0x4e/0x4f often SuperIO
275 * - 0x60/0x64, 0x62/0x66 often KBC/EC
276 * - 0x3f0-0x3f5/0x3f7 FDD
277 * - 0x378-0x37f and 0x778-0x77f LPT
281 pci_write_config16(PCH_LPC_DEV
, LPC_IO_DEC
, 0x0010);
282 pci_write_config16(PCH_LPC_DEV
, LPC_EN
, CNF2_LPC_EN
| CNF1_LPC_EN
| MC_LPC_EN
283 | KBC_LPC_EN
| FDD_LPC_EN
| LPT_LPC_EN
| COMB_LPC_EN
| COMA_LPC_EN
);
285 const struct device
*dev
= pcidev_on_root(0x1f, 0);
286 const struct southbridge_intel_bd82x6x_config
*config
= NULL
;
288 /* Set up generic decode ranges */
292 config
= dev
->chip_info
;
296 pci_write_config32(PCH_LPC_DEV
, LPC_GEN1_DEC
, config
->gen1_dec
);
297 pci_write_config32(PCH_LPC_DEV
, LPC_GEN2_DEC
, config
->gen2_dec
);
298 pci_write_config32(PCH_LPC_DEV
, LPC_GEN3_DEC
, config
->gen3_dec
);
299 pci_write_config32(PCH_LPC_DEV
, LPC_GEN4_DEC
, config
->gen4_dec
);
302 __weak
void mainboard_pch_lpc_setup(void)
306 void early_pch_init(void)
308 pch_enable_lpc_decode();
310 mainboard_pch_lpc_setup();
318 setup_pch_gpios(&mainboard_gpio_map
);
320 if (ENV_RAMINIT
|| (CONFIG(CONSOLE_I2C_SMBUS
) && ENV_INITIAL_STAGE
))