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 <bootblock_common.h>
4 #include <delay.h>
5 #include <stdint.h>
6 #include <device/pnp_def.h>
7 #include <device/pnp_ops.h>
8 #include <device/pci_ops.h>
12 #include "dock.h"
13 
14 /* Override the default lpc decode ranges */
16 {
17  // decode range
18  pci_write_config16(PCI_DEV(0, 0x1f, 0), LPC_IO_DEC, 0x0210);
19 }
20 
21 static void early_superio_config(void)
22 {
23  int timeout = 100000;
24  const pnp_devfn_t dev = PNP_DEV(0x2e, 3);
25 
26  pnp_write_config(dev, 0x29, 0x06);
27 
28  while (!(pnp_read_config(dev, 0x29) & 0x08) && timeout--)
29  udelay(1000);
30 
31  /* Enable COM1 */
33  pnp_set_iobase(dev, PNP_IDX_IO0, 0x3f8);
34  pnp_set_enable(dev, 1);
35 }
36 
38 {
39  /* Set up GPIO's early since it is needed for dock init */
42 
43  dlpc_init();
44  /* dock_init initializes the DLPC switch on
45  * thinpad side, so this is required even
46  * if we're undocked.
47  */
48  if (dock_present()) {
49  dock_connect();
51  }
52 }
53 
55 {
56  /* Device 1f interrupt pin register */
57  RCBA32(D31IP) = 0x00001230;
58  RCBA32(D29IP) = 0x40004321;
59 
60  /* PCIe Interrupts */
61  RCBA32(D28IP) = 0x00004321;
62  /* HD Audio Interrupt */
63  RCBA32(D27IP) = 0x00000002;
64 
65  /* dev irq route register */
66  RCBA16(D31IR) = 0x1007;
67  RCBA16(D30IR) = 0x0076;
68  RCBA16(D29IR) = 0x3210;
69  RCBA16(D28IR) = 0x7654;
70  RCBA16(D27IR) = 0x0010;
71 
72  /* Disable unused devices */
73  RCBA32(FD) |= FD_INTLAN;
74 
75  /* Set up I/O Trap #0 for 0xfe00 (SMIC) */
76  RCBA64(IOTR0) = 0x000200010000fe01ULL;
77 
78  /* Set up I/O Trap #3 for 0x800-0x80c (Trap) */
79  RCBA64(IOTR3) = 0x000200f0000c0801ULL;
80 }
81 
82 void mainboard_get_spd_map(u8 spd_map[4])
83 {
84  spd_map[0] = 0x50;
85  spd_map[2] = 0x51;
86 }
#define FD_INTLAN
Definition: i82801gx.h:248
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
void bootblock_mainboard_early_init(void)
Definition: early_init.c:11
const struct pch_gpio_map mainboard_gpio_map
Definition: gpio.c:87
void mainboard_late_rcba_config(void)
Definition: early_init.c:6
void mainboard_lpc_decode(void)
Definition: early_init.c:34
void mainboard_get_spd_map(u8 spd_map[4])
Definition: early_init.c:83
static void early_superio_config(void)
Definition: early_init.c:21
#define PCI_DEV(SEGBUS, DEV, FN)
Definition: pci_type.h:14
#define PNP_IDX_IO0
Definition: pnp_def.h:5
void pnp_set_logical_device(struct device *dev)
Definition: pnp_device.c:59
void pnp_set_enable(struct device *dev, int enable)
Definition: pnp_device.c:64
u8 pnp_read_config(struct device *dev, u8 reg)
Definition: pnp_device.c:44
void pnp_set_iobase(struct device *dev, u8 index, u16 iobase)
Definition: pnp_device.c:93
void pnp_write_config(struct device *dev, u8 reg, u8 value)
Definition: pnp_device.c:38
#define PNP_DEV(PORT, FUNC)
Definition: pnp_type.h:10
u32 pnp_devfn_t
Definition: pnp_type.h:8
#define LPC_IO_DEC
Definition: lpc.h:35
#define D31IR
Definition: rcba.h:87
#define D30IR
Definition: rcba.h:88
#define D28IR
Definition: rcba.h:90
#define D31IP
Definition: rcba.h:56
#define D29IP
Definition: rcba.h:63
#define D29IR
Definition: rcba.h:89
#define D27IP
Definition: rcba.h:74
#define FD
Definition: rcba.h:125
#define D27IR
Definition: rcba.h:91
#define D28IP
Definition: rcba.h:65
#define IOTR0
Definition: pch.h:211
#define IOTR3
Definition: pch.h:214
void setup_pch_gpios(const struct pch_gpio_map *gpio)
Definition: gpio.c:33
#define RCBA64(x)
Definition: rcba.h:15
#define RCBA16(x)
Definition: rcba.h:13
#define RCBA32(x)
Definition: rcba.h:14
void i82801gx_setup_bars(void)
Definition: early_init.c:47
uint8_t u8
Definition: stdint.h:45
void dock_connect(void)
Definition: dock.c:215
int dock_present(void)
Definition: dock.c:36
int dlpc_init(void)
Definition: dock.c:72
void udelay(uint32_t us)
Definition: udelay.c:15