coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mainboard.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <acpi/acpi.h>
4 #include <acpi/acpigen.h>
5 #include <amdblocks/acpimmio.h>
7 #include <baseboard/variants.h>
8 #include <console/console.h>
9 #include <device/device.h>
10 #include <gpio.h>
11 #include <soc/acpi.h>
12 #include <variant/ec.h>
13 
14 #define BACKLIGHT_GPIO GPIO_129
15 #define WWAN_AUX_RST_GPIO GPIO_18
16 #define METHOD_BACKLIGHT_ENABLE "\\_SB.BKEN"
17 #define METHOD_BACKLIGHT_DISABLE "\\_SB.BKDS"
18 #define METHOD_MAINBOARD_INI "\\_SB.MINI"
19 #define METHOD_MAINBOARD_WAK "\\_SB.MWAK"
20 #define METHOD_MAINBOARD_PTS "\\_SB.MPTS"
21 #define METHOD_MAINBOARD_S0X "\\_SB.MS0X"
22 
23 /*
24  * These arrays set up the FCH PCI_INTR registers 0xC00/0xC01.
25  * This table is responsible for physically routing the PIC and
26  * IOAPIC IRQs to the different PCI devices on the system. It
27  * is read and written via registers 0xC00/0xC01 as an
28  * Index/Data pair. These values are chipset and mainboard
29  * dependent and should be updated accordingly.
30  */
31 static uint8_t fch_pic_routing[0x80];
33 
35  "PIC and APIC FCH interrupt tables must be the same size");
36 
37 /*
38  * This controls the device -> IRQ routing.
39  *
40  * Hardcoded IRQs:
41  * 0: timer < soc/amd/common/acpi/lpc.asl
42  * 1: i8042 - Keyboard
43  * 2: cascade
44  * 8: rtc0 <- soc/amd/common/acpi/lpc.asl
45  * 9: acpi <- soc/amd/common/acpi/lpc.asl
46  */
47 static const struct fch_irq_routing {
51 } guybrush_fch[] = {
52  { PIRQ_A, 12, PIRQ_NC },
53  { PIRQ_B, 14, PIRQ_NC },
54  { PIRQ_C, 15, PIRQ_NC },
55  { PIRQ_D, 12, PIRQ_NC },
56  { PIRQ_E, 14, PIRQ_NC },
57  { PIRQ_F, 15, PIRQ_NC },
58  { PIRQ_G, 12, PIRQ_NC },
59  { PIRQ_H, 14, PIRQ_NC },
60 
62  { PIRQ_SD, PIRQ_NC, PIRQ_NC },
66  { PIRQ_GPIO, 11, 11 },
67  { PIRQ_I2C0, 10, 10 },
68  { PIRQ_I2C1, 7, 7 },
69  { PIRQ_I2C2, 6, 6 },
70  { PIRQ_I2C3, 5, 5 },
71  { PIRQ_UART0, 4, 4 },
72  { PIRQ_UART1, 3, 3 },
73 
74  /* The MISC registers are not interrupt numbers */
75  { PIRQ_MISC, 0xfa, 0x00 },
76  { PIRQ_MISC0, 0x91, 0x00 },
77  { PIRQ_HPET_L, 0x00, 0x00 },
78  { PIRQ_HPET_H, 0x00, 0x00 },
79 };
80 
81 static void init_tables(void)
82 {
83  const struct fch_irq_routing *entry;
84  int i;
85 
88 
89  for (i = 0; i < ARRAY_SIZE(guybrush_fch); i++) {
90  entry = guybrush_fch + i;
91  fch_pic_routing[entry->intr_index] = entry->pic_irq_num;
92  fch_apic_routing[entry->intr_index] = entry->apic_irq_num;
93  }
94 }
95 
96 static void pirq_setup(void)
97 {
100 }
101 
102 static void mainboard_configure_gpios(void)
103 {
104  size_t base_num_gpios, override_num_gpios;
105  const struct soc_amd_gpio *base_gpios, *override_gpios;
106 
107  base_gpios = variant_base_gpio_table(&base_num_gpios);
108  override_gpios = variant_override_gpio_table(&override_num_gpios);
109 
110  gpio_configure_pads_with_override(base_gpios, base_num_gpios, override_gpios,
111  override_num_gpios);
112 }
113 
115 {
116 }
117 
118 static void mainboard_init(void *chip_info)
119 {
123 }
124 
125 static void mainboard_write_blken(void)
126 {
129  acpigen_pop_len();
130 }
131 
132 static void mainboard_write_blkdis(void)
133 {
136  acpigen_pop_len();
137 }
138 
139 static void mainboard_write_mini(void)
140 {
143  acpigen_pop_len();
144 }
145 
146 static void mainboard_write_mwak(void)
147 {
150  acpigen_pop_len();
151 }
152 
153 static void mainboard_write_mpts(void)
154 {
157  acpigen_pop_len();
158 }
159 
161 {
162  if (variant_has_pcie_wwan())
164 }
165 
167 {
168  if (variant_has_pcie_wwan())
170 }
171 
172 static void mainboard_write_ms0x(void)
173 {
175  /* S0ix Entry */
178  /* S0ix Exit */
181  acpigen_pop_len();
182  acpigen_pop_len();
183 }
184 
185 static void mainboard_fill_ssdt(const struct device *dev)
186 {
193 }
194 
195 static void mainboard_enable(struct device *dev)
196 {
197  printk(BIOS_INFO, "Mainboard " CONFIG_MAINBOARD_PART_NUMBER " Enable.\n");
198 
199  dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt;
200 
201  init_tables();
202  /* Initialize the PIRQ data structures for consumption */
203  pirq_setup();
204 
205  /* TODO: b/184678786 - Move into espi_config */
206  /* Unmask eSPI IRQ 1 (Keyboard) */
208 }
209 
211  .init = mainboard_init,
212  .enable_dev = mainboard_enable,
213 };
struct chip_operations mainboard_ops
Definition: mainboard.c:19
@ PIRQ_A
Definition: acpi_pirq_gen.h:22
@ PIRQ_C
Definition: acpi_pirq_gen.h:24
@ PIRQ_G
Definition: acpi_pirq_gen.h:28
@ PIRQ_H
Definition: acpi_pirq_gen.h:29
@ PIRQ_E
Definition: acpi_pirq_gen.h:26
@ PIRQ_D
Definition: acpi_pirq_gen.h:25
@ PIRQ_F
Definition: acpi_pirq_gen.h:27
@ PIRQ_B
Definition: acpi_pirq_gen.h:23
void acpigen_emit_namestring(const char *namepath)
Definition: acpigen.c:275
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_if_lequal_op_int(uint8_t op, uint64_t val)
Definition: acpigen.c:1472
void acpigen_write_method_serialized(const char *name, int nargs)
Definition: acpigen.c:764
void acpigen_write_method(const char *name, int nargs)
Definition: acpigen.c:758
void acpigen_write_else(void)
Definition: acpigen.c:1510
static void pm_write32(uint8_t reg, uint32_t value)
Definition: acpimmio.h:191
#define PM_ESPI_INTR_CTRL
Definition: acpimmio.h:29
#define PM_ESPI_DEV_INTR_MASK
Definition: acpimmio.h:30
_Static_assert(sizeof(fch_pic_routing)==sizeof(fch_apic_routing), "PIC and APIC FCH interrupt tables must be the same size")
void * memset(void *dstpp, int c, size_t len)
Definition: memset.c:12
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
void mainboard_ec_init(void)
Definition: ec.c:8
#define BIT(nr)
Definition: ec_commands.h:45
void __weak variant_devtree_update(void)
Definition: mainboard.c:86
static void mainboard_write_mpts(void)
Definition: mainboard.c:153
#define BACKLIGHT_GPIO
Definition: mainboard.c:14
#define METHOD_MAINBOARD_PTS
Definition: mainboard.c:20
#define WWAN_AUX_RST_GPIO
Definition: mainboard.c:15
static void mainboard_write_blkdis(void)
Definition: mainboard.c:132
static void mainboard_deassert_wwan_aux_reset(void)
Definition: mainboard.c:166
static void mainboard_fill_ssdt(const struct device *dev)
Definition: mainboard.c:185
#define METHOD_MAINBOARD_INI
Definition: mainboard.c:18
static void mainboard_configure_gpios(void)
Definition: mainboard.c:102
#define METHOD_BACKLIGHT_DISABLE
Definition: mainboard.c:17
static void mainboard_write_mini(void)
Definition: mainboard.c:139
static void mainboard_init(void *chip_info)
Definition: mainboard.c:118
static void mainboard_write_ms0x(void)
Definition: mainboard.c:172
static void mainboard_write_mwak(void)
Definition: mainboard.c:146
#define METHOD_MAINBOARD_S0X
Definition: mainboard.c:21
static void init_tables(void)
Definition: mainboard.c:81
static const struct fch_irq_routing guybrush_fch[]
static void mainboard_write_blken(void)
Definition: mainboard.c:125
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:195
static void mainboard_assert_wwan_aux_reset(void)
Definition: mainboard.c:160
static uint8_t fch_apic_routing[0x80]
Definition: mainboard.c:32
#define METHOD_BACKLIGHT_ENABLE
Definition: mainboard.c:16
static void pirq_setup(void)
Definition: mainboard.c:96
#define METHOD_MAINBOARD_WAK
Definition: mainboard.c:19
static uint8_t fch_pic_routing[0x80]
Definition: mainboard.c:31
__weak const struct soc_amd_gpio * variant_override_gpio_table(size_t *size)
Definition: mainboard.c:224
bool __weak variant_has_pcie_wwan(void)
Definition: helpers.c:7
@ ARG0_OP
Definition: acpigen.h:89
int acpigen_soc_clear_tx_gpio(unsigned int gpio_num)
Definition: gpio.c:61
int acpigen_soc_set_tx_gpio(unsigned int gpio_num)
Definition: gpio.c:56
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
const struct pad_config *__weak variant_base_gpio_table(size_t *num)
Definition: gpio.c:444
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
#define ACPI_SCI_IRQ
Definition: acpi.h:11
#define PIRQ_EMMC
#define PIRQ_SATA
#define PIRQ_SDIO
#define PIRQ_I2C0
#define PIRQ_HPET_L
#define PIRQ_MISC0
#define PIRQ_SCI
#define PIRQ_MISC
#define PIRQ_SD
#define PIRQ_NC
#define PIRQ_UART0
#define PIRQ_HPET_H
#define PIRQ_I2C3
#define PIRQ_I2C2
#define PIRQ_UART1
#define PIRQ_I2C1
#define PIRQ_GPIO
void gpio_configure_pads_with_override(const struct soc_amd_gpio *base_cfg, size_t base_num_pads, const struct soc_amd_gpio *override_cfg, size_t override_num_pads)
Definition: gpio.c:262
const u8 * intr_data_ptr
Definition: amd_pci_util.c:13
const u8 * picr_data_ptr
Definition: amd_pci_util.c:14
unsigned char uint8_t
Definition: stdint.h:8
void(* init)(void *chip_info)
Definition: device.h:25
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
uint8_t pic_irq_num
Definition: mainboard.c:38
uint8_t apic_irq_num
Definition: mainboard.c:39
uint8_t intr_index
Definition: mainboard.c:37