blob: f781098f33178639af98e4f27fe089eea43bdf42 [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Patrick Georgie72a8a32012-11-06 11:05:09 +01002
3#include <arch/io.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02004#include <device/pci_ops.h>
Kyösti Mälkkif555a582020-01-06 19:41:42 +02005#include <device/smbus_host.h>
Angel Ponse1a616c2020-06-21 17:02:43 +02006#include <southbridge/intel/common/pmutil.h>
Patrick Georgie72a8a32012-11-06 11:05:09 +01007#include "i82801ix.h"
Arthur Heymans9ed0df42019-10-12 14:18:18 +02008#include "chip.h"
Patrick Georgie72a8a32012-11-06 11:05:09 +01009
Angel Pons3bff4192020-06-21 13:22:08 +020010void i82801ix_lpc_setup(void)
11{
12 const pci_devfn_t d31f0 = PCI_DEV(0, 0x1f, 0);
13 const struct device *dev = pcidev_on_root(0x1f, 0);
Angel Ponsc5b22c82020-08-10 13:36:25 +020014 const struct southbridge_intel_i82801ix_config *config;
Angel Pons3bff4192020-06-21 13:22:08 +020015
16 /* Configure serial IRQs.*/
17 pci_write_config8(d31f0, D31F0_SERIRQ_CNTL, 0xd0);
18 /*
19 * Enable some common LPC IO ranges:
20 * - 0x2e/0x2f, 0x4e/0x4f often SuperIO
21 * - 0x60/0x64, 0x62/0x66 often KBC/EC
22 * - 0x3f0-0x3f5/0x3f7 FDD
23 * - 0x378-0x37f and 0x778-0x77f LPT
24 * - 0x2f8-0x2ff COMB
25 * - 0x3f8-0x3ff COMA
26 * - 0x208-0x20f GAMEH
27 * - 0x200-0x207 GAMEL
28 */
29 pci_write_config16(d31f0, D31F0_LPC_IODEC, 0x0010);
Angel Pons28d10a22020-08-10 13:39:25 +020030 pci_write_config16(d31f0, D31F0_LPC_EN, CNF2_LPC_EN | CNF1_LPC_EN
31 | MC_LPC_EN | KBC_LPC_EN | GAMEH_LPC_EN
32 | GAMEL_LPC_EN | FDD_LPC_EN | LPT_LPC_EN
33 | COMB_LPC_EN | COMA_LPC_EN);
Angel Pons3bff4192020-06-21 13:22:08 +020034
35 /* Set up generic decode ranges */
36 if (!dev || !dev->chip_info)
37 return;
38 config = dev->chip_info;
39
40 pci_write_config32(d31f0, D31F0_GEN1_DEC, config->gen1_dec);
41 pci_write_config32(d31f0, D31F0_GEN2_DEC, config->gen2_dec);
42 pci_write_config32(d31f0, D31F0_GEN3_DEC, config->gen3_dec);
43 pci_write_config32(d31f0, D31F0_GEN4_DEC, config->gen4_dec);
44}
45
Patrick Georgie72a8a32012-11-06 11:05:09 +010046void i82801ix_early_init(void)
47{
Antonello Dettori196e3d42016-09-01 17:04:14 +020048 const pci_devfn_t d31f0 = PCI_DEV(0, 0x1f, 0);
Patrick Georgie72a8a32012-11-06 11:05:09 +010049
Kyösti Mälkki1cfafe22020-01-07 12:00:31 +020050 if (ENV_ROMSTAGE)
51 enable_smbus();
52
Patrick Georgie72a8a32012-11-06 11:05:09 +010053 /* Set up RCBA. */
Angel Pons6e732d32021-01-28 13:56:18 +010054 pci_write_config32(d31f0, RCBA, CONFIG_FIXED_RCBA_MMIO_BASE | 1);
Patrick Georgie72a8a32012-11-06 11:05:09 +010055
56 /* Set up PMBASE. */
57 pci_write_config32(d31f0, D31F0_PMBASE, DEFAULT_PMBASE | 1);
58 /* Enable PMBASE. */
59 pci_write_config8(d31f0, D31F0_ACPI_CNTL, 0x80);
60
61 /* Set up GPIOBASE. */
62 pci_write_config32(d31f0, D31F0_GPIO_BASE, DEFAULT_GPIOBASE);
63 /* Enable GPIO. */
Angel Pons67406472020-06-08 11:13:42 +020064 pci_or_config8(d31f0, D31F0_GPIO_CNTL, 0x10);
Patrick Georgie72a8a32012-11-06 11:05:09 +010065
66 /* Reset watchdog. */
67 outw(0x0008, DEFAULT_TCOBASE + 0x04); /* R/WC, clear TCO caused SMI. */
68 outw(0x0002, DEFAULT_TCOBASE + 0x06); /* R/WC, clear second timeout. */
69
70 /* Enable upper 128bytes of CMOS. */
71 RCBA32(0x3400) = (1 << 2);
72
Martin Roth2ed0aa22016-01-05 20:58:58 -070073 /* Initialize power management initialization
Patrick Georgie72a8a32012-11-06 11:05:09 +010074 register early as it affects reboot behavior. */
75 /* Bit 20 activates global reset of host and ME on cf9 writes of 0x6
76 and 0xe (required if ME is disabled but present), bit 31 locks it.
77 The other bits are 'must write'. */
78 u8 reg8 = pci_read_config8(d31f0, 0xac);
Angel Pons67406472020-06-08 11:13:42 +020079
80 /* FIXME: It's a 8-bit variable!!! */
Patrick Georgie72a8a32012-11-06 11:05:09 +010081 reg8 |= (1 << 31) | (1 << 30) | (1 << 20) | (3 << 8);
82 pci_write_config8(d31f0, 0xac, reg8);
83
84 /* TODO: If RTC power failed, reset RTC state machine
85 (set, then reset RTC 0x0b bit7) */
86
87 /* TODO: Check power state bits in GEN_PMCON_2 (D31F0 0xa2)
88 before they get cleared. */
89}