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 <amdblocks/acpimmio.h>
5 #include <baseboard/variants.h>
6 #include <console/console.h>
7 #include <device/device.h>
8 #include <soc/acpi.h>
9 #include <variant/ec.h>
10 
11 /*
12  * These arrays set up the FCH PCI_INTR registers 0xC00/0xC01.
13  * This table is responsible for physically routing the PIC and
14  * IOAPIC IRQs to the different PCI devices on the system. It
15  * is read and written via registers 0xC00/0xC01 as an
16  * Index/Data pair. These values are chipset and mainboard
17  * dependent and should be updated accordingly.
18  */
19 static uint8_t fch_pic_routing[0x80];
21 
23  "PIC and APIC FCH interrupt tables must be the same size");
24 
25 /*
26  * This controls the device -> IRQ routing.
27  *
28  * Hardcoded IRQs:
29  * 0: timer < soc/amd/common/acpi/lpc.asl
30  * 1: i8042 - Keyboard
31  * 2: cascade
32  * 8: rtc0 <- soc/amd/common/acpi/lpc.asl
33  * 9: acpi <- soc/amd/common/acpi/lpc.asl
34  */
35 
36 static const struct fch_irq_routing {
40 } skyrim_fch[] = {
41  { PIRQ_A, 12, PIRQ_NC },
42  { PIRQ_B, 14, PIRQ_NC },
43  { PIRQ_C, 15, PIRQ_NC },
44  { PIRQ_D, 12, PIRQ_NC },
45  { PIRQ_E, 14, PIRQ_NC },
46  { PIRQ_F, 15, PIRQ_NC },
47  { PIRQ_G, 12, PIRQ_NC },
48  { PIRQ_H, 14, PIRQ_NC },
49 
51  { PIRQ_SD, PIRQ_NC, PIRQ_NC },
54  { PIRQ_GPIO, 11, 11 },
55  { PIRQ_I2C0, 10, 10 },
56  { PIRQ_I2C1, 7, 7 },
57  { PIRQ_I2C2, 6, 6 },
58  { PIRQ_I2C3, 5, 5 },
59  { PIRQ_UART0, 4, 4 },
60  { PIRQ_UART1, 3, 3 },
61 
62  /* The MISC registers are not interrupt numbers */
63  { PIRQ_MISC, 0xfa, 0x00 },
64  { PIRQ_MISC0, 0x91, 0x00 },
65  { PIRQ_HPET_L, 0x00, 0x00 },
66  { PIRQ_HPET_H, 0x00, 0x00 },
67 };
68 
69 static void init_tables(void)
70 {
71  const struct fch_irq_routing *entry;
72  int i;
73 
76 
77  for (i = 0; i < ARRAY_SIZE(skyrim_fch); i++) {
78  entry = skyrim_fch + i;
79  fch_pic_routing[entry->intr_index] = entry->pic_irq_num;
80  fch_apic_routing[entry->intr_index] = entry->apic_irq_num;
81  }
82 }
83 
84 static void pirq_setup(void)
85 {
88 }
89 
90 static void mainboard_configure_gpios(void)
91 {
92  size_t base_num_gpios, override_num_gpios;
93  const struct soc_amd_gpio *base_gpios, *override_gpios;
94 
95  variant_base_gpio_table(&base_gpios, &base_num_gpios);
96  variant_override_gpio_table(&override_gpios, &override_num_gpios);
97 
98  gpio_configure_pads_with_override(base_gpios, base_num_gpios,
99  override_gpios, override_num_gpios);
100 }
101 
102 static void mainboard_init(void *chip_info)
103 {
106 }
107 
108 static void mainboard_enable(struct device *dev)
109 {
110  printk(BIOS_INFO, "Mainboard " CONFIG_MAINBOARD_PART_NUMBER " Enable.\n");
111 
112  init_tables();
113  /* Initialize the PIRQ data structures for consumption */
114  pirq_setup();
115 
116  /* TODO: b/184678786 - Move into espi_config */
117  /* Unmask eSPI IRQ 1 (Keyboard) */
119 }
120 
122  .init = mainboard_init,
123  .enable_dev = mainboard_enable,
124 };
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
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
static const struct fch_irq_routing skyrim_fch[]
static void mainboard_configure_gpios(void)
Definition: mainboard.c:90
static void mainboard_init(void *chip_info)
Definition: mainboard.c:102
static void init_tables(void)
Definition: mainboard.c:69
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:108
static uint8_t fch_apic_routing[0x80]
Definition: mainboard.c:20
static void pirq_setup(void)
Definition: mainboard.c:84
static uint8_t fch_pic_routing[0x80]
Definition: mainboard.c:19
__weak const struct soc_amd_gpio * variant_override_gpio_table(size_t *size)
Definition: mainboard.c:224
#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
#define ACPI_SCI_IRQ
Definition: acpi.h:11
#define PIRQ_EMMC
#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
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