blob: f6f7ccb81d466b9c767f464f4b4380571ee8321b [file] [log] [blame]
Mathew King2e2fc7a2020-12-08 11:33:58 -07001/* SPDX-License-Identifier: GPL-2.0-or-later */
2
Martin Rothc7204b52021-03-31 19:15:33 -06003#include <acpi/acpi.h>
4#include <acpi/acpigen.h>
Raul E Rangel6fce9cd2021-04-06 15:42:51 -06005#include <amdblocks/acpimmio.h>
Mathew King00b490d2021-03-12 15:48:32 -07006#include <amdblocks/amd_pci_util.h>
Raul E Rangeld1a42b62022-08-10 15:28:15 -06007#include <amdblocks/psp.h>
Mathew King10dd7752021-01-26 16:08:14 -07008#include <baseboard/variants.h>
Kyösti Mälkki89a5f0f2021-06-15 07:22:22 +03009#include <console/console.h>
Mathew King2e2fc7a2020-12-08 11:33:58 -070010#include <device/device.h>
Raul E Rangeld1a42b62022-08-10 15:28:15 -060011#include <drivers/i2c/tpm/chip.h>
Martin Rothc7204b52021-03-31 19:15:33 -060012#include <gpio.h>
Mathew King00b490d2021-03-12 15:48:32 -070013#include <soc/acpi.h>
Mathew Kingad830232021-02-23 13:08:15 -070014#include <variant/ec.h>
Mathew King2e2fc7a2020-12-08 11:33:58 -070015
Martin Rothc7204b52021-03-31 19:15:33 -060016#define BACKLIGHT_GPIO GPIO_129
Karthikeyan Ramasubramaniand086e3d2021-10-08 17:04:10 -060017#define WWAN_AUX_RST_GPIO GPIO_18
Martin Rothc7204b52021-03-31 19:15:33 -060018#define METHOD_BACKLIGHT_ENABLE "\\_SB.BKEN"
19#define METHOD_BACKLIGHT_DISABLE "\\_SB.BKDS"
20#define METHOD_MAINBOARD_INI "\\_SB.MINI"
21#define METHOD_MAINBOARD_WAK "\\_SB.MWAK"
22#define METHOD_MAINBOARD_PTS "\\_SB.MPTS"
Karthikeyan Ramasubramaniand086e3d2021-10-08 17:04:10 -060023#define METHOD_MAINBOARD_S0X "\\_SB.MS0X"
Martin Rothc7204b52021-03-31 19:15:33 -060024
Mathew King00b490d2021-03-12 15:48:32 -070025/*
26 * These arrays set up the FCH PCI_INTR registers 0xC00/0xC01.
27 * This table is responsible for physically routing the PIC and
28 * IOAPIC IRQs to the different PCI devices on the system. It
29 * is read and written via registers 0xC00/0xC01 as an
30 * Index/Data pair. These values are chipset and mainboard
31 * dependent and should be updated accordingly.
32 */
33static uint8_t fch_pic_routing[0x80];
34static uint8_t fch_apic_routing[0x80];
35
36_Static_assert(sizeof(fch_pic_routing) == sizeof(fch_apic_routing),
37 "PIC and APIC FCH interrupt tables must be the same size");
38
39/*
40 * This controls the device -> IRQ routing.
41 *
42 * Hardcoded IRQs:
43 * 0: timer < soc/amd/common/acpi/lpc.asl
44 * 1: i8042 - Keyboard
45 * 2: cascade
46 * 8: rtc0 <- soc/amd/common/acpi/lpc.asl
47 * 9: acpi <- soc/amd/common/acpi/lpc.asl
48 */
49static const struct fch_irq_routing {
50 uint8_t intr_index;
51 uint8_t pic_irq_num;
52 uint8_t apic_irq_num;
53} guybrush_fch[] = {
Raul E Rangel6d9a0ea2021-05-04 14:29:09 -060054 { PIRQ_A, 12, PIRQ_NC },
55 { PIRQ_B, 14, PIRQ_NC },
56 { PIRQ_C, 15, PIRQ_NC },
57 { PIRQ_D, 12, PIRQ_NC },
58 { PIRQ_E, 14, PIRQ_NC },
59 { PIRQ_F, 15, PIRQ_NC },
60 { PIRQ_G, 12, PIRQ_NC },
61 { PIRQ_H, 14, PIRQ_NC },
Mathew King00b490d2021-03-12 15:48:32 -070062
63 { PIRQ_SCI, ACPI_SCI_IRQ, ACPI_SCI_IRQ },
64 { PIRQ_SD, PIRQ_NC, PIRQ_NC },
65 { PIRQ_SDIO, PIRQ_NC, PIRQ_NC },
66 { PIRQ_SATA, PIRQ_NC, PIRQ_NC },
67 { PIRQ_EMMC, PIRQ_NC, PIRQ_NC },
Raul E Rangelcce7d822021-03-30 15:50:43 -060068 { PIRQ_GPIO, 11, 11 },
69 { PIRQ_I2C0, 10, 10 },
70 { PIRQ_I2C1, 7, 7 },
71 { PIRQ_I2C2, 6, 6 },
72 { PIRQ_I2C3, 5, 5 },
Mathew King00b490d2021-03-12 15:48:32 -070073 { PIRQ_UART0, 4, 4 },
74 { PIRQ_UART1, 3, 3 },
75
76 /* The MISC registers are not interrupt numbers */
77 { PIRQ_MISC, 0xfa, 0x00 },
78 { PIRQ_MISC0, 0x91, 0x00 },
79 { PIRQ_HPET_L, 0x00, 0x00 },
80 { PIRQ_HPET_H, 0x00, 0x00 },
81};
82
83static void init_tables(void)
84{
85 const struct fch_irq_routing *entry;
86 int i;
87
88 memset(fch_pic_routing, PIRQ_NC, sizeof(fch_pic_routing));
89 memset(fch_apic_routing, PIRQ_NC, sizeof(fch_apic_routing));
90
91 for (i = 0; i < ARRAY_SIZE(guybrush_fch); i++) {
92 entry = guybrush_fch + i;
93 fch_pic_routing[entry->intr_index] = entry->pic_irq_num;
94 fch_apic_routing[entry->intr_index] = entry->apic_irq_num;
95 }
96}
97
98static void pirq_setup(void)
99{
100 intr_data_ptr = fch_apic_routing;
101 picr_data_ptr = fch_pic_routing;
102}
103
Mathew King10dd7752021-01-26 16:08:14 -0700104static void mainboard_configure_gpios(void)
105{
106 size_t base_num_gpios, override_num_gpios;
107 const struct soc_amd_gpio *base_gpios, *override_gpios;
108
109 base_gpios = variant_base_gpio_table(&base_num_gpios);
110 override_gpios = variant_override_gpio_table(&override_num_gpios);
111
112 gpio_configure_pads_with_override(base_gpios, base_num_gpios, override_gpios,
113 override_num_gpios);
114}
115
Karthikeyan Ramasubramanianb4182982021-10-26 16:55:35 -0600116void __weak variant_devtree_update(void)
117{
118}
119
Raul E Rangeld1a42b62022-08-10 15:28:15 -0600120static void configure_psp_tpm_gpio(void)
121{
122 const struct device *cr50_dev = DEV_PTR(cr50);
123 struct drivers_i2c_tpm_config *cfg = config_of(cr50_dev);
124
125 psp_set_tpm_irq_gpio(cfg->irq_gpio.pins[0]);
126}
127
Mathew King2e2fc7a2020-12-08 11:33:58 -0700128static void mainboard_init(void *chip_info)
129{
Mathew King10dd7752021-01-26 16:08:14 -0700130 mainboard_configure_gpios();
Mathew Kingad830232021-02-23 13:08:15 -0700131 mainboard_ec_init();
Karthikeyan Ramasubramanianb4182982021-10-26 16:55:35 -0600132 variant_devtree_update();
Raul E Rangeld1a42b62022-08-10 15:28:15 -0600133
134 /* Run this after variant_devtree_update so the IRQ is correct. */
135 configure_psp_tpm_gpio();
Mathew King2e2fc7a2020-12-08 11:33:58 -0700136}
137
Martin Rothc7204b52021-03-31 19:15:33 -0600138static void mainboard_write_blken(void)
139{
140 acpigen_write_method(METHOD_BACKLIGHT_ENABLE, 0);
141 acpigen_soc_clear_tx_gpio(BACKLIGHT_GPIO);
142 acpigen_pop_len();
143}
144
145static void mainboard_write_blkdis(void)
146{
147 acpigen_write_method(METHOD_BACKLIGHT_DISABLE, 0);
148 acpigen_soc_set_tx_gpio(BACKLIGHT_GPIO);
149 acpigen_pop_len();
150}
151
152static void mainboard_write_mini(void)
153{
154 acpigen_write_method(METHOD_MAINBOARD_INI, 0);
155 acpigen_emit_namestring(METHOD_BACKLIGHT_ENABLE);
156 acpigen_pop_len();
157}
158
159static void mainboard_write_mwak(void)
160{
161 acpigen_write_method(METHOD_MAINBOARD_WAK, 0);
162 acpigen_emit_namestring(METHOD_BACKLIGHT_ENABLE);
163 acpigen_pop_len();
164}
165
166static void mainboard_write_mpts(void)
167{
168 acpigen_write_method(METHOD_MAINBOARD_PTS, 0);
169 acpigen_emit_namestring(METHOD_BACKLIGHT_DISABLE);
170 acpigen_pop_len();
171}
172
Karthikeyan Ramasubramaniand086e3d2021-10-08 17:04:10 -0600173static void mainboard_assert_wwan_aux_reset(void)
174{
175 if (variant_has_pcie_wwan())
176 acpigen_soc_clear_tx_gpio(WWAN_AUX_RST_GPIO);
177}
178
179static void mainboard_deassert_wwan_aux_reset(void)
180{
181 if (variant_has_pcie_wwan())
182 acpigen_soc_set_tx_gpio(WWAN_AUX_RST_GPIO);
183}
184
185static void mainboard_write_ms0x(void)
186{
187 acpigen_write_method_serialized(METHOD_MAINBOARD_S0X, 1);
188 /* S0ix Entry */
189 acpigen_write_if_lequal_op_int(ARG0_OP, 1);
190 mainboard_assert_wwan_aux_reset();
191 /* S0ix Exit */
192 acpigen_write_else();
193 mainboard_deassert_wwan_aux_reset();
194 acpigen_pop_len();
195 acpigen_pop_len();
196}
197
Martin Rothc7204b52021-03-31 19:15:33 -0600198static void mainboard_fill_ssdt(const struct device *dev)
199{
200 mainboard_write_blken();
201 mainboard_write_blkdis();
202 mainboard_write_mini();
203 mainboard_write_mpts();
204 mainboard_write_mwak();
Karthikeyan Ramasubramaniand086e3d2021-10-08 17:04:10 -0600205 mainboard_write_ms0x();
Martin Rothc7204b52021-03-31 19:15:33 -0600206}
207
Mathew King2e2fc7a2020-12-08 11:33:58 -0700208static void mainboard_enable(struct device *dev)
209{
Mathew King5d478872021-02-16 14:05:15 -0700210 printk(BIOS_INFO, "Mainboard " CONFIG_MAINBOARD_PART_NUMBER " Enable.\n");
211
Martin Rothc7204b52021-03-31 19:15:33 -0600212 dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt;
Mathew King00b490d2021-03-12 15:48:32 -0700213
214 init_tables();
215 /* Initialize the PIRQ data structures for consumption */
216 pirq_setup();
Raul E Rangel6fce9cd2021-04-06 15:42:51 -0600217
218 /* TODO: b/184678786 - Move into espi_config */
219 /* Unmask eSPI IRQ 1 (Keyboard) */
220 pm_write32(PM_ESPI_INTR_CTRL, PM_ESPI_DEV_INTR_MASK & ~(BIT(1)));
Mathew King2e2fc7a2020-12-08 11:33:58 -0700221}
222
223struct chip_operations mainboard_ops = {
224 .init = mainboard_init,
225 .enable_dev = mainboard_enable,
Mathew King2e2fc7a2020-12-08 11:33:58 -0700226};