coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
early_init.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <device/pci_ops.h>
5 #include <device/smbus_host.h>
9 #include "i82801jx.h"
10 #include "chip.h"
11 
13 {
14  const pci_devfn_t d31f0 = PCI_DEV(0, 0x1f, 0);
15  const struct device *dev = pcidev_on_root(0x1f, 0);
17 
18  /* Configure serial IRQs.*/
20  /*
21  * Enable some common LPC IO ranges:
22  * - 0x2e/0x2f, 0x4e/0x4f often SuperIO
23  * - 0x60/0x64, 0x62/0x66 often KBC/EC
24  * - 0x3f0-0x3f5/0x3f7 FDD
25  * - 0x378-0x37f and 0x778-0x77f LPT
26  * - 0x2f8-0x2ff COMB
27  * - 0x3f8-0x3ff COMA
28  * - 0x208-0x20f GAMEH
29  * - 0x200-0x207 GAMEL
30  */
31  pci_write_config16(d31f0, D31F0_LPC_IODEC, 0x0010);
36 
37  /* Set up generic decode ranges */
38  if (!dev || !dev->chip_info)
39  return;
40  config = dev->chip_info;
41 
42  pci_write_config32(d31f0, D31F0_GEN1_DEC, config->gen1_dec);
43  pci_write_config32(d31f0, D31F0_GEN2_DEC, config->gen2_dec);
44  pci_write_config32(d31f0, D31F0_GEN3_DEC, config->gen3_dec);
45  pci_write_config32(d31f0, D31F0_GEN4_DEC, config->gen4_dec);
46 }
47 
49 {
50  const pci_devfn_t d31f0 = PCI_DEV(0, 0x1f, 0);
51 
52  /* Set up RCBA. */
53  pci_write_config32(d31f0, RCBA, CONFIG_FIXED_RCBA_MMIO_BASE | 1);
54 
55  /* Set up PMBASE. */
57  /* Enable PMBASE. */
58  pci_write_config8(d31f0, D31F0_ACPI_CNTL, 0x80);
59 
60  /* Set up GPIOBASE. */
62  /* Enable GPIO. */
63  pci_or_config8(d31f0, D31F0_GPIO_CNTL, 0x10);
64 }
65 
66 #define TCO_BASE 0x60
67 
69 {
70  const pci_devfn_t d31f0 = PCI_DEV(0, 0x1f, 0);
71 
72  if (ENV_ROMSTAGE)
73  enable_smbus();
74 
75  printk(BIOS_DEBUG, "Setting up static southbridge registers...");
77  printk(BIOS_DEBUG, " done.\n");
78 
80 
81  printk(BIOS_DEBUG, "Disabling Watchdog reboot...");
82  RCBA32(GCS) = RCBA32(GCS) | (1 << 5); /* No reset */
83  write_pmbase16(TCO_BASE + 0x8, (1 << 11)); /* halt timer */
84  write_pmbase16(TCO_BASE + 0x4, (1 << 3)); /* clear timeout */
85  write_pmbase16(TCO_BASE + 0x6, (1 << 1)); /* clear 2nd timeout */
86  printk(BIOS_DEBUG, " done.\n");
87 
88  /* Enable IOAPIC */
89  RCBA8(OIC) = 0x3;
90  RCBA8(OIC);
91 
92  /* Initialize power management initialization
93  register early as it affects reboot behavior. */
94  /* Bit 20 activates global reset of host and ME on cf9 writes of 0x6
95  and 0xe (required if ME is disabled but present), bit 31 locks it.
96  The other bits are 'must write'. */
97  u8 reg8 = pci_read_config8(d31f0, 0xac);
98 
99  /* FIXME: It's a 8-bit variable!!! */
100  reg8 |= (1 << 31) | (1 << 30) | (1 << 20) | (3 << 8);
101  pci_write_config8(d31f0, 0xac, reg8);
102 
103  /* TODO: If RTC power failed, reset RTC state machine
104  (set, then reset RTC 0x0b bit7) */
105 
106  /* TODO: Check power state bits in GEN_PMCON_2 (D31F0 0xa2)
107  before they get cleared. */
108 }
#define printk(level,...)
Definition: stdlib.h:16
DEVTREE_CONST struct device * pcidev_on_root(uint8_t dev, uint8_t fn)
Definition: device_const.c:260
#define D31F0_GPIO_BASE
Definition: i82801ix.h:42
#define D31F0_LPC_IODEC
Definition: i82801ix.h:53
#define D31F0_GEN4_DEC
Definition: i82801ix.h:68
#define D31F0_GPIO_CNTL
Definition: i82801ix.h:43
#define D31F0_LPC_EN
Definition: i82801ix.h:54
#define D31F0_SERIRQ_CNTL
Definition: i82801ix.h:48
#define D31F0_GEN2_DEC
Definition: i82801ix.h:66
#define D31F0_GEN1_DEC
Definition: i82801ix.h:65
#define D31F0_ACPI_CNTL
Definition: i82801ix.h:41
#define D31F0_GEN3_DEC
Definition: i82801ix.h:67
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline void pci_or_config8(const struct device *dev, u16 reg, u8 ormask)
Definition: pci_ops.h:169
static __always_inline u8 pci_read_config8(const struct device *dev, u16 reg)
Definition: pci_ops.h:46
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
static __always_inline void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Definition: pci_ops.h:64
#define DEFAULT_PMBASE
Definition: iomap.h:14
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
const struct pch_gpio_map mainboard_gpio_map
Definition: gpio.c:87
enum board_config config
Definition: memory.c:448
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
u32 pci_devfn_t
Definition: pci_type.h:8
void write_pmbase16(const u8 addr, const u16 val)
Definition: pmbase.c:43
#define D31F0_PMBASE
Definition: pmutil.h:8
#define ENV_ROMSTAGE
Definition: rules.h:149
static void enable_smbus(void)
Definition: smbus_host.h:34
#define RCBA
Definition: lpc.h:17
#define GCS
Definition: lpc.h:36
#define FDD_LPC_EN
Definition: lpc.h:43
#define GAMEL_LPC_EN
Definition: lpc.h:42
#define LPT_LPC_EN
Definition: lpc.h:44
#define GAMEH_LPC_EN
Definition: lpc.h:41
#define COMB_LPC_EN
Definition: lpc.h:45
#define KBC_LPC_EN
Definition: lpc.h:40
#define MC_LPC_EN
Definition: lpc.h:39
#define COMA_LPC_EN
Definition: lpc.h:46
#define CNF2_LPC_EN
Definition: lpc.h:37
#define CNF1_LPC_EN
Definition: lpc.h:38
#define OIC
Definition: rcba.h:100
#define DEFAULT_GPIOBASE
Definition: pch.h:22
void setup_pch_gpios(const struct pch_gpio_map *gpio)
Definition: gpio.c:33
#define RCBA8(x)
Definition: rcba.h:12
#define RCBA32(x)
Definition: rcba.h:14
void i82801jx_setup_bars(void)
Definition: early_init.c:48
#define TCO_BASE
Definition: early_init.c:66
void i82801jx_lpc_setup(void)
Definition: early_init.c:12
void i82801jx_early_init(void)
Definition: early_init.c:68
uint8_t u8
Definition: stdint.h:45
Definition: device.h:107
DEVTREE_CONST void * chip_info
Definition: device.h:164