• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <amdblocks/acpi.h>
4 #include <amdblocks/acpimmio.h>
5 #include <amdblocks/amd_pci_util.h>
6 #include <amdblocks/psp.h>
7 #include <amdblocks/xhci.h>
8 #include <baseboard/variants.h>
9 #include <cpu/x86/smm.h>
10 #include <device/device.h>
11 #include <drivers/i2c/tpm/chip.h>
12 #include <variant/ec.h>
13 
14 /* The IRQ mapping in fch_irq_map ends up getting written to the indirect address space that is
15    accessed via I/O ports 0xc00/0xc01. */
16 
17 /*
18  * This controls the device -> IRQ routing.
19  *
20  * Hardcoded IRQs:
21  *  0: timer < soc/amd/common/acpi/lpc.asl
22  *  1: i8042 - Keyboard
23  *  2: cascade
24  *  8: rtc0 <- soc/amd/common/acpi/lpc.asl
25  *  9: acpi <- soc/amd/common/acpi/lpc.asl
26  */
27 
28 static const struct fch_irq_routing fch_irq_map[] = {
29 	{ PIRQ_A,	12,		PIRQ_NC },
30 	{ PIRQ_B,	14,		PIRQ_NC },
31 	{ PIRQ_C,	15,		PIRQ_NC },
32 	{ PIRQ_D,	12,		PIRQ_NC },
33 	{ PIRQ_E,	14,		PIRQ_NC },
34 	{ PIRQ_F,	15,		PIRQ_NC },
35 	{ PIRQ_G,	12,		PIRQ_NC },
36 	{ PIRQ_H,	14,		PIRQ_NC },
37 
38 	{ PIRQ_SCI,	ACPI_SCI_IRQ,	ACPI_SCI_IRQ },
39 	{ PIRQ_SD,	PIRQ_NC,	PIRQ_NC },
40 	{ PIRQ_SDIO,	PIRQ_NC,	PIRQ_NC },
41 	{ PIRQ_GPIO,	11,		11 },
42 	{ PIRQ_I2C0,	10,		10 },
43 	{ PIRQ_I2C1,	 7,		 7 },
44 	{ PIRQ_I2C2,	 6,		 6 },
45 	{ PIRQ_I2C3,	 5,		 5 },
46 	{ PIRQ_UART0,	 4,		 4 },
47 	{ PIRQ_UART1,	 3,		 3 },
48 
49 	/* The MISC registers are not interrupt numbers */
50 	{ PIRQ_MISC,	0xfa,		0x00 },
51 	{ PIRQ_MISC0,	0x91,		0x00 },
52 	{ PIRQ_HPET_L,	0x00,		0x00 },
53 	{ PIRQ_HPET_H,	0x00,		0x00 },
54 };
55 
mb_get_fch_irq_mapping(size_t * length)56 const struct fch_irq_routing *mb_get_fch_irq_mapping(size_t *length)
57 {
58 	*length = ARRAY_SIZE(fch_irq_map);
59 	return fch_irq_map;
60 }
61 
mainboard_configure_gpios(void)62 static void mainboard_configure_gpios(void)
63 {
64 	size_t base_num_gpios, override_num_gpios;
65 	const struct soc_amd_gpio *base_gpios, *override_gpios;
66 
67 	baseboard_gpio_table(&base_gpios, &base_num_gpios);
68 	variant_override_gpio_table(&override_gpios, &override_num_gpios);
69 
70 	gpio_configure_pads_with_override(base_gpios, base_num_gpios,
71 				override_gpios, override_num_gpios);
72 }
73 
configure_psp_tpm_gpio(void)74 static void configure_psp_tpm_gpio(void)
75 {
76 	const struct device *ti50_dev = DEV_PTR(ti50);
77 	struct drivers_i2c_tpm_config *cfg = config_of(ti50_dev);
78 
79 	psp_set_tpm_irq_gpio(cfg->irq_gpio.pins[0]);
80 }
81 
mainboard_init(void * chip_info)82 static void mainboard_init(void *chip_info)
83 {
84 	mainboard_configure_gpios();
85 	mainboard_ec_init();
86 	configure_psp_tpm_gpio();
87 }
88 
mainboard_enable(struct device * dev)89 static void mainboard_enable(struct device *dev)
90 {
91 	/* TODO: b/184678786 - Move into espi_config */
92 	/* Unmask eSPI IRQ 1 (Keyboard) */
93 	pm_write32(PM_ESPI_INTR_CTRL, PM_ESPI_DEV_INTR_MASK & ~(BIT(1)));
94 }
95 
smm_mainboard_pci_resource_store_init(struct smm_pci_resource_info * slots,size_t size)96 void smm_mainboard_pci_resource_store_init(struct smm_pci_resource_info *slots, size_t size)
97 {
98 	soc_xhci_store_resources(slots, size);
99 }
100 
101 struct chip_operations mainboard_ops = {
102 	.init = mainboard_init,
103 	.enable_dev = mainboard_enable,
104 };
105