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 <stdint.h>
5 #include <console/console.h>
11 #include <bootmode.h>
12 #include <ec/quanta/it8518/ec.h>
13 #include "ec.h"
14 #include "onboard.h"
15 
17 {
18  /*
19  * GFX INTA -> PIRQA (MSI)
20  * D20IP_XHCI XHCI INTA -> PIRQD (MSI)
21  * D26IP_E2P EHCI #2 INTA -> PIRQF
22  * D27IP_ZIP HDA INTA -> PIRQA (MSI)
23  * D28IP_P2IP WLAN INTA -> PIRQD
24  * D28IP_P3IP Card Reader INTB -> PIRQE
25  * D28IP_P6IP LAN INTC -> PIRQB
26  * D29IP_E1P EHCI #1 INTA -> PIRQD
27  * D31IP_SIP SATA INTA -> PIRQB (MSI)
28  * D31IP_SMIP SMBUS INTB -> PIRQH
29  */
30 
31  /* Device interrupt pin register (board specific) */
32  RCBA32(D31IP) = (NOINT << D31IP_TTIP) | (NOINT << D31IP_SIP2) |
33  (INTB << D31IP_SMIP) | (INTA << D31IP_SIP);
34  RCBA32(D30IP) = (NOINT << D30IP_PIP);
35  RCBA32(D29IP) = (INTA << D29IP_E1P);
36  RCBA32(D28IP) = (NOINT << D28IP_P1IP) | (INTA << D28IP_P2IP) |
37  (INTB << D28IP_P3IP) | (NOINT << D28IP_P4IP) |
38  (NOINT << D28IP_P5IP) | (INTC << D28IP_P6IP) |
39  (NOINT << D28IP_P7IP) | (NOINT << D28IP_P8IP);
40  RCBA32(D27IP) = (INTA << D27IP_ZIP);
41  RCBA32(D26IP) = (INTA << D26IP_E2P);
42  RCBA32(D25IP) = (NOINT << D25IP_LIP);
44  RCBA32(D20IP) = (INTA << D20IP_XHCIIP);
45 
46  /* Device interrupt route registers */
55 }
56 
57  /*
58  * The Stout EC needs to be reset to RW mode. It is important that
59  * the RTC_PWR_STS is not set until ramstage EC init.
60  */
61 static void early_ec_init(void)
62 {
64  int rec_mode = get_recovery_mode_switch();
65 
66  if (((ec_status & 0x3) == EC_IN_RO_MODE) ||
67  ((ec_status & 0x3) == EC_IN_RECOVERY_MODE)) {
68 
69  printk(BIOS_DEBUG, "EC Cold Boot Detected\n");
70  if (!rec_mode) {
71  /*
72  * Tell EC to exit RO mode
73  */
74  printk(BIOS_DEBUG, "EC will exit RO mode and boot normally\n");
76  die("wait for ec to reset");
77  }
78  } else {
79  printk(BIOS_DEBUG, "EC Warm Boot Detected\n");
81  }
82 }
83 
84 void mainboard_get_spd(spd_raw_data *spd, bool id_only)
85 {
86  read_spd(&spd[0], 0x50, id_only);
87  read_spd(&spd[2], 0x52, id_only);
88 }
89 
91 {
92  struct pei_data pei_data_template = {
94  .mchbar = CONFIG_FIXED_MCHBAR_MMIO_BASE,
95  .dmibar = CONFIG_FIXED_DMIBAR_MMIO_BASE,
96  .epbar = CONFIG_FIXED_EPBAR_MMIO_BASE,
97  .pciexbar = CONFIG_ECAM_MMCONF_BASE_ADDRESS,
98  .smbusbar = CONFIG_FIXED_SMBUS_IO_BASE,
99  .wdbbar = 0x4000000,
100  .wdbsize = 0x1000,
101  .hpet_address = HPET_BASE_ADDRESS,
102  .rcba = (uintptr_t)DEFAULT_RCBA,
105  .thermalbase = 0xfed08000,
106  .system_type = 0, // 0 Mobile, 1 Desktop/Server
107  .tseg_size = CONFIG_SMM_TSEG_SIZE,
108  .spd_addresses = { 0xA0, 0x00,0xA4,0x00 },
109  .ts_addresses = { 0x00, 0x00, 0x00, 0x00 },
110  .ec_present = 1,
111  .max_ddr3_freq = 1600,
112  .usb_port_config = {
113  /* enabled USB oc pin length */
114  { 1, 0, 0x0040 }, /* P0: USB 3.0 1 (OC0) */
115  { 1, 0, 0x0040 }, /* P1: USB 3.0 2 (OC0) */
116  { 0, 1, 0x0000 }, /* P2: Empty */
117  { 1, 1, 0x0040 }, /* P3: Camera (no OC) */
118  { 1, 1, 0x0040 }, /* P4: WLAN (no OC) */
119  { 1, 1, 0x0040 }, /* P5: WWAN (no OC) */
120  { 0, 1, 0x0000 }, /* P6: Empty */
121  { 0, 1, 0x0000 }, /* P7: Empty */
122  { 0, 5, 0x0000 }, /* P8: Empty */
123  { 1, 4, 0x0040 }, /* P9: USB 2.0 (AUO4) (OC4) */
124  { 0, 5, 0x0000 }, /* P10: Empty */
125  { 0, 5, 0x0000 }, /* P11: Empty */
126  { 0, 5, 0x0000 }, /* P12: Empty */
127  { 1, 5, 0x0040 }, /* P13: Bluetooth (no OC) */
128  },
129  .usb3 = {
130  .mode = XHCI_MODE,
131  .hs_port_switch_mask = XHCI_PORTS,
132  .preboot_support = XHCI_PREBOOT,
133  .xhci_streams = XHCI_STREAMS,
134  },
135  };
136  *pei_data = pei_data_template;
137 }
138 
139 void mainboard_early_init(int s3resume)
140 {
141  /* Do ec reset as early as possible, but skip it on S3 resume */
142  if (!s3resume) {
143  early_ec_init();
144  }
145 }
146 
147 int mainboard_should_reset_usb(int s3resume)
148 {
149  return !s3resume;
150 }
151 
152 const struct southbridge_usb_port mainboard_usb_ports[] = {
153  /* enabled USB oc pin length */
154  {1, 0, 0}, /* P0: USB 3.0 1 (OC0) */
155  {1, 0, 0}, /* P1: USB 3.0 2 (OC0) */
156  {0, 0, 0}, /* P2: Empty */
157  {1, 0, -1}, /* P3: Camera (no OC) */
158  {1, 0, -1}, /* P4: WLAN (no OC) */
159  {1, 0, -1}, /* P5: WWAN (no OC) */
160  {0, 0, 0}, /* P6: Empty */
161  {0, 0, 0}, /* P7: Empty */
162  {0, 0, 0}, /* P8: Empty */
163  {1, 0, 4}, /* P9: USB 2.0 (AUO4) (OC4) */
164  {0, 0, 0}, /* P10: Empty */
165  {0, 0, 0}, /* P11: Empty */
166  {0, 0, 0}, /* P12: Empty */
167  {1, 0, -1}, /* P13: Bluetooth (no OC) */
168 };
#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
void __noreturn die(const char *fmt,...)
Definition: die.c:17
u8 ec_read(u8 addr)
Definition: ec.c:107
void ec_write_cmd(u8 cmd)
Definition: ec.c:79
#define EC_CMD_WARM_RESET
Definition: ec.h:47
#define EC_STATUS_REG
Definition: ec.h:57
#define EC_IN_RECOVERY_MODE
Definition: ec.h:65
#define EC_CMD_EXIT_BOOT_BLOCK
Definition: ec.h:44
#define EC_IN_RO_MODE
Definition: ec.h:64
ec_status
Definition: ec_commands.h:620
#define XHCI_PORTS
Definition: onboard.h:10
#define XHCI_PREBOOT
Definition: onboard.h:11
#define XHCI_MODE
Definition: onboard.h:9
#define XHCI_STREAMS
Definition: onboard.h:12
u8 spd_raw_data[256]
Definition: ddr3.h:156
#define DEFAULT_PMBASE
Definition: iomap.h:14
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
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
void mainboard_early_init(void)
Definition: early_init.c:13
static void early_ec_init(void)
Definition: early_init.c:61
#define PEI_VERSION
Definition: pei_data.h:9
void read_spd(spd_raw_data *spd, u8 addr, bool id_only)
Definition: raminit.c:138
#define D28IP_P3IP
Definition: rcba.h:71
#define D31IP_TTIP
Definition: rcba.h:57
#define D25IP
Definition: rcba.h:78
#define D20IR
Definition: rcba.h:96
#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 D28IP_P5IP
Definition: rcba.h:69
#define D31IP_SIP2
Definition: rcba.h:58
#define D30IP_PIP
Definition: rcba.h:62
#define D22IR
Definition: rcba.h:95
#define D28IP_P8IP
Definition: rcba.h:66
#define D29IP
Definition: rcba.h:63
#define D25IR
Definition: rcba.h:93
#define D28IP_P6IP
Definition: rcba.h:68
#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 D20IP
Definition: rcba.h:85
#define D28IP_P2IP
Definition: rcba.h:72
#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 D28IP_P7IP
Definition: rcba.h:67
#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 D20IP_XHCIIP
Definition: pch.h:299
#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
int get_recovery_mode_switch(void)
Definition: switches.c:17