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 <arch/hpet.h>
4 #include <bootblock_common.h>
5 #include <stdint.h>
6 #include <pc80/mc146818rtc.h>
7 #include <console/console.h>
8 #include <bootmode.h>
17 
18 /* Stumpy USB Reset Disable defined in cmos.layout */
19 #if CONFIG(USE_OPTION_TABLE)
20 #include "option_table.h"
21 #define CMOS_USB_RESET_DISABLE (CMOS_VSTART_stumpy_usb_reset_disable >> 3)
22 #else
23 #define CMOS_USB_RESET_DISABLE (400 >> 3)
24 #endif
25 #define USB_RESET_DISABLE_MAGIC (0xdd) /* Disable if set to this */
26 
27 #define SUPERIO_DEV PNP_DEV(0x2e, 0)
28 #define SERIAL_DEV PNP_DEV(0x2e, IT8772F_SP1)
29 #define GPIO_DEV PNP_DEV(0x2e, IT8772F_GPIO)
30 
32 {
33  /*
34  * GFX INTA -> PIRQA (MSI)
35  * D28IP_P1IP WLAN INTA -> PIRQB
36  * D28IP_P4IP ETH0 INTB -> PIRQC
37  * D29IP_E1P EHCI1 INTA -> PIRQD
38  * D26IP_E2P EHCI2 INTA -> PIRQE
39  * D31IP_SIP SATA INTA -> PIRQF (MSI)
40  * D31IP_SMIP SMBUS INTB -> PIRQG
41  * D31IP_TTIP THRT INTC -> PIRQH
42  * D27IP_ZIP HDA INTA -> PIRQG (MSI)
43  */
44 
45  /* Device interrupt pin register (board specific) */
46  RCBA32(D31IP) = (INTC << D31IP_TTIP) | (NOINT << D31IP_SIP2) |
47  (INTB << D31IP_SMIP) | (INTA << D31IP_SIP);
48  RCBA32(D30IP) = (NOINT << D30IP_PIP);
49  RCBA32(D29IP) = (INTA << D29IP_E1P);
50  RCBA32(D28IP) = (INTA << D28IP_P1IP) | (INTC << D28IP_P3IP) |
51  (INTB << D28IP_P4IP);
52  RCBA32(D27IP) = (INTA << D27IP_ZIP);
53  RCBA32(D26IP) = (INTA << D26IP_E2P);
54  RCBA32(D25IP) = (NOINT << D25IP_LIP);
56 
57  /* Device interrupt route registers */
65 }
66 
67 static void setup_sio_gpios(void)
68 {
69  /*
70  * GPIO10 as USBPWRON12#
71  * GPIO12 as USBPWRON13#
72  */
73  it8772f_gpio_setup(SUPERIO_DEV, 1, 0x05, 0x05, 0x00, 0x05, 0x05);
74 
75  /*
76  * GPIO22 as wake SCI#
77  */
78  it8772f_gpio_setup(SUPERIO_DEV, 2, 0x04, 0x04, 0x00, 0x04, 0x04);
79 
80  /*
81  * GPIO32 as EXTSMI#
82  */
83  it8772f_gpio_setup(SUPERIO_DEV, 3, 0x04, 0x04, 0x00, 0x04, 0x04);
84 
85  /*
86  * GPIO45 as LED_POWER#
87  */
88  it8772f_gpio_led(GPIO_DEV, 4 /* set */, (0x1 << 5) /* select */,
89  (0x1 << 5) /* polarity */, (0x1 << 5) /* 1 = pullup */,
90  (0x1 << 5) /* output */, (0x1 << 5) /* 1 = Simple IO function */,
92 
93  /*
94  * GPIO51 as USBPWRON8#
95  * GPIO52 as USBPWRON1#
96  */
97  it8772f_gpio_setup(SUPERIO_DEV, 5, 0x06, 0x06, 0x00, 0x06, 0x06);
98  it8772f_gpio_setup(SUPERIO_DEV, 6, 0x00, 0x00, 0x00, 0x00, 0x00);
99 }
100 
102 {
103  struct pei_data pei_data_template = {
105  .mchbar = CONFIG_FIXED_MCHBAR_MMIO_BASE,
106  .dmibar = CONFIG_FIXED_DMIBAR_MMIO_BASE,
107  .epbar = CONFIG_FIXED_EPBAR_MMIO_BASE,
108  .pciexbar = CONFIG_ECAM_MMCONF_BASE_ADDRESS,
109  .smbusbar = CONFIG_FIXED_SMBUS_IO_BASE,
110  .wdbbar = 0x4000000,
111  .wdbsize = 0x1000,
112  .hpet_address = HPET_BASE_ADDRESS,
113  .rcba = (uintptr_t)DEFAULT_RCBA,
116  .thermalbase = 0xfed08000,
117  .system_type = 0, // 0 Mobile, 1 Desktop/Server
118  .tseg_size = CONFIG_SMM_TSEG_SIZE,
119  .spd_addresses = { 0xa0, 0x00,0xa4,0x00 },
120  .ts_addresses = { 0x00, 0x00, 0x00, 0x00 },
121  .ec_present = 0,
122  .max_ddr3_freq = 1333,
123  .usb_port_config = {
124  { 1, 0, 0x0080 }, /* P0: Front port (OC0) */
125  { 1, 1, 0x0040 }, /* P1: Back port (OC1) */
126  { 1, 0, 0x0040 }, /* P2: MINIPCIE1 (no OC) */
127  { 1, 0, 0x0040 }, /* P3: MMC (no OC) */
128  { 1, 2, 0x0080 }, /* P4: Front port (OC2) */
129  { 0, 0, 0x0000 }, /* P5: Empty */
130  { 0, 0, 0x0000 }, /* P6: Empty */
131  { 0, 0, 0x0000 }, /* P7: Empty */
132  { 1, 4, 0x0040 }, /* P8: Back port (OC4) */
133  { 1, 4, 0x0040 }, /* P9: MINIPCIE3 (no OC) */
134  { 1, 4, 0x0040 }, /* P10: BLUETOOTH (no OC) */
135  { 0, 4, 0x0000 }, /* P11: Empty */
136  { 1, 6, 0x0040 }, /* P12: Back port (OC6) */
137  { 1, 5, 0x0040 }, /* P13: Back port (OC5) */
138  },
139  };
140  *pei_data = pei_data_template;
141 }
142 
143 void mainboard_get_spd(spd_raw_data *spd, bool id_only)
144 {
145  read_spd(&spd[0], 0x50, id_only);
146  read_spd(&spd[2], 0x52, id_only);
147 }
148 
149 const struct southbridge_usb_port mainboard_usb_ports[] = {
150  /* enabled power USB oc pin */
151  { 1, 1, 0 }, /* P0: Front port (OC0) */
152  { 1, 0, 1 }, /* P1: Back port (OC1) */
153  { 1, 0, -1 }, /* P2: MINIPCIE1 (no OC) */
154  { 1, 0, -1 }, /* P3: MMC (no OC) */
155  { 1, 1, 2 }, /* P4: Front port (OC2) */
156  { 0, 0, -1 }, /* P5: Empty */
157  { 0, 0, -1 }, /* P6: Empty */
158  { 0, 0, -1 }, /* P7: Empty */
159  { 1, 0, 4 }, /* P8: Back port (OC4) */
160  { 1, 0, -1 }, /* P9: MINIPCIE3 (no OC) */
161  { 1, 0, -1 }, /* P10: BLUETOOTH (no OC) */
162  { 0, 0, -1 }, /* P11: Empty */
163  { 1, 0, 6 }, /* P12: Back port (OC6) */
164  { 1, 0, 5 }, /* P13: Back port (OC5) */
165 };
166 
167 int mainboard_should_reset_usb(int s3resume)
168 {
169  if (s3resume) {
170  /*
171  * For Stumpy the back USB ports are reset on resume
172  * so default to resetting the controller to make the
173  * kernel happy. There is a CMOS flag to disable the
174  * controller reset in case the kernel can tolerate
175  * the device power loss better in the future.
176  */
178  if (magic == USB_RESET_DISABLE_MAGIC) {
179  printk(BIOS_DEBUG, "USB Controller Reset Disabled\n");
180  return 0;
181  } else {
182  printk(BIOS_DEBUG, "USB Controller Reset Enabled\n");
183  return 1;
184  }
185  } else {
186  /* Ensure USB reset on resume is enabled at boot */
188  return 1;
189  }
190 }
191 
193 {
194  if (CONFIG(DRIVERS_UART_8250IO))
196 
197  setup_sio_gpios();
198 
199  /* Early SuperIO setup */
202  ite_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
203 }
#define HPET_BASE_ADDRESS
Definition: hpet.h:6
#define PIRQH
Definition: irq.h:101
#define PIRQC
Definition: irq.h:96
#define PIRQA
Definition: irq.h:94
#define PIRQD
Definition: irq.h:97
#define PIRQB
Definition: irq.h:95
#define PIRQF
Definition: irq.h:99
#define PIRQE
Definition: irq.h:98
#define PIRQG
Definition: irq.h:100
#define printk(level,...)
Definition: stdlib.h:16
@ CONFIG
Definition: dsi_common.h:201
u8 spd_raw_data[256]
Definition: ddr3.h:156
#define DEFAULT_PMBASE
Definition: iomap.h:14
#define IT8772F_GPIO_BLINK_FREQUENCY_1_HZ
Definition: it8772f.h:97
void ite_enable_serial(pnp_devfn_t dev, u16 iobase)
Definition: early_serial.c:61
void ite_kill_watchdog(pnp_devfn_t dev)
Definition: early_serial.c:129
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
void bootblock_mainboard_early_init(void)
Definition: early_init.c:11
void mainboard_late_rcba_config(void)
Definition: early_init.c:6
void mainboard_get_spd(spd_raw_data *spd, bool id_only)
Definition: early_init.c:25
const struct southbridge_usb_port mainboard_usb_ports[]
Definition: early_init.c:8
void mainboard_fill_pei_data(struct pei_data *pei)
Definition: early_init.c:58
int mainboard_should_reset_usb(int s3resume)
Definition: early_init.c:53
#define SIO_GPIO_BLINK_GPIO45
Definition: smihandler.c:17
#define CMOS_USB_RESET_DISABLE
Definition: early_init.c:23
#define GPIO_DEV
Definition: early_init.c:29
#define USB_RESET_DISABLE_MAGIC
Definition: early_init.c:25
static void setup_sio_gpios(void)
Definition: early_init.c:67
#define SERIAL_DEV
Definition: early_init.c:28
#define SUPERIO_DEV
Definition: early_init.c:27
static void cmos_write(unsigned char val, unsigned char addr)
Definition: mc146818rtc.h:141
static unsigned char cmos_read(unsigned char addr)
Definition: mc146818rtc.h:105
#define PEI_VERSION
Definition: pei_data.h:9
void read_spd(spd_raw_data *spd, u8 addr, bool id_only)
Definition: raminit.c:138
void try_enabling_LPC47N207_uart(void)
Definition: early_serial.c:31
#define D28IP_P3IP
Definition: rcba.h:71
#define D31IP_TTIP
Definition: rcba.h:57
#define D25IP
Definition: rcba.h:78
#define D31IR
Definition: rcba.h:87
#define D22IP
Definition: rcba.h:80
#define D26IR
Definition: rcba.h:92
#define D31IP_SMIP
Definition: rcba.h:59
#define D28IR
Definition: rcba.h:90
#define INTA
Definition: rcba.h:21
#define D26IP_E2P
Definition: rcba.h:77
#define D31IP
Definition: rcba.h:56
#define D31IP_SIP2
Definition: rcba.h:58
#define D30IP_PIP
Definition: rcba.h:62
#define D22IR
Definition: rcba.h:95
#define D29IP
Definition: rcba.h:63
#define D25IR
Definition: rcba.h:93
#define DIR_ROUTE(a, b, c, d)
Definition: rcba.h:116
#define D29IR
Definition: rcba.h:89
#define D25IP_LIP
Definition: rcba.h:79
#define D27IP
Definition: rcba.h:74
#define D27IP_ZIP
Definition: rcba.h:75
#define D27IR
Definition: rcba.h:91
#define NOINT
Definition: rcba.h:20
#define D28IP_P4IP
Definition: rcba.h:70
#define D30IP
Definition: rcba.h:61
#define INTC
Definition: rcba.h:23
#define D26IP
Definition: rcba.h:76
#define D28IP_P1IP
Definition: rcba.h:73
#define D29IP_E1P
Definition: rcba.h:64
#define D28IP
Definition: rcba.h:65
#define D31IP_SIP
Definition: rcba.h:60
#define INTB
Definition: rcba.h:22
#define D22IP_MEI1IP
Definition: rcba.h:84
#define DEFAULT_GPIOBASE
Definition: pch.h:22
#define DEFAULT_RCBA
Definition: rcba.h:6
#define RCBA32(x)
Definition: rcba.h:14
static u16 pmbase
Definition: smi.c:27
unsigned long uintptr_t
Definition: stdint.h:21
uint8_t u8
Definition: stdint.h:45
uint8_t spd_addresses[4]
Definition: pei_data.h:60
uint32_t tseg_size
Definition: pei_data.h:59
uint32_t system_type
Definition: pei_data.h:58
uint32_t gpiobase
Definition: pei_data.h:55
uint32_t pei_version
Definition: pei_data.h:43
uint32_t thermalbase
Definition: pei_data.h:33
void it8772f_gpio_setup(pnp_devfn_t dev, int set, u8 select, u8 polarity, u8 pullup, u8 output, u8 enable)
Definition: early_init.c:36
void it8772f_ac_resume_southbridge(pnp_devfn_t dev)
Definition: early_init.c:27
void it8772f_gpio_led(pnp_devfn_t dev, int set, u8 select, u8 polarity, u8 pullup, u8 output, u8 enable, u8 led_pin_map, u8 led_freq)
Definition: early_init.c:53