blob: bfb0f88dd57ef645df1f6924c4d14c42da85a591 [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 */
Felix Heldbf264852022-10-25 18:18:36 +020033static uint8_t fch_pic_routing[FCH_IRQ_ROUTING_ENTRIES];
34static uint8_t fch_apic_routing[FCH_IRQ_ROUTING_ENTRIES];
Mathew King00b490d2021-03-12 15:48:32 -070035
36/*
37 * This controls the device -> IRQ routing.
38 *
39 * Hardcoded IRQs:
40 * 0: timer < soc/amd/common/acpi/lpc.asl
41 * 1: i8042 - Keyboard
42 * 2: cascade
43 * 8: rtc0 <- soc/amd/common/acpi/lpc.asl
44 * 9: acpi <- soc/amd/common/acpi/lpc.asl
45 */
Felix Held886c1ffc62022-10-25 17:48:30 +020046static const struct fch_irq_routing guybrush_fch[] = {
Raul E Rangel6d9a0ea2021-05-04 14:29:09 -060047 { PIRQ_A, 12, PIRQ_NC },
48 { PIRQ_B, 14, PIRQ_NC },
49 { PIRQ_C, 15, PIRQ_NC },
50 { PIRQ_D, 12, PIRQ_NC },
51 { PIRQ_E, 14, PIRQ_NC },
52 { PIRQ_F, 15, PIRQ_NC },
53 { PIRQ_G, 12, PIRQ_NC },
54 { PIRQ_H, 14, PIRQ_NC },
Mathew King00b490d2021-03-12 15:48:32 -070055
56 { PIRQ_SCI, ACPI_SCI_IRQ, ACPI_SCI_IRQ },
57 { PIRQ_SD, PIRQ_NC, PIRQ_NC },
58 { PIRQ_SDIO, PIRQ_NC, PIRQ_NC },
59 { PIRQ_SATA, PIRQ_NC, PIRQ_NC },
60 { PIRQ_EMMC, PIRQ_NC, PIRQ_NC },
Raul E Rangelcce7d822021-03-30 15:50:43 -060061 { PIRQ_GPIO, 11, 11 },
62 { PIRQ_I2C0, 10, 10 },
63 { PIRQ_I2C1, 7, 7 },
64 { PIRQ_I2C2, 6, 6 },
65 { PIRQ_I2C3, 5, 5 },
Mathew King00b490d2021-03-12 15:48:32 -070066 { PIRQ_UART0, 4, 4 },
67 { PIRQ_UART1, 3, 3 },
68
69 /* The MISC registers are not interrupt numbers */
70 { PIRQ_MISC, 0xfa, 0x00 },
71 { PIRQ_MISC0, 0x91, 0x00 },
72 { PIRQ_HPET_L, 0x00, 0x00 },
73 { PIRQ_HPET_H, 0x00, 0x00 },
74};
75
76static void init_tables(void)
77{
78 const struct fch_irq_routing *entry;
79 int i;
80
81 memset(fch_pic_routing, PIRQ_NC, sizeof(fch_pic_routing));
82 memset(fch_apic_routing, PIRQ_NC, sizeof(fch_apic_routing));
83
84 for (i = 0; i < ARRAY_SIZE(guybrush_fch); i++) {
85 entry = guybrush_fch + i;
86 fch_pic_routing[entry->intr_index] = entry->pic_irq_num;
87 fch_apic_routing[entry->intr_index] = entry->apic_irq_num;
88 }
89}
90
91static void pirq_setup(void)
92{
93 intr_data_ptr = fch_apic_routing;
94 picr_data_ptr = fch_pic_routing;
95}
96
Mathew King10dd7752021-01-26 16:08:14 -070097static void mainboard_configure_gpios(void)
98{
99 size_t base_num_gpios, override_num_gpios;
100 const struct soc_amd_gpio *base_gpios, *override_gpios;
101
Matt DeVillier2f4b31f2022-09-23 13:28:05 -0500102 base_gpios = baseboard_gpio_table(&base_num_gpios);
Mathew King10dd7752021-01-26 16:08:14 -0700103 override_gpios = variant_override_gpio_table(&override_num_gpios);
104
105 gpio_configure_pads_with_override(base_gpios, base_num_gpios, override_gpios,
106 override_num_gpios);
107}
108
Karthikeyan Ramasubramanianb4182982021-10-26 16:55:35 -0600109void __weak variant_devtree_update(void)
110{
111}
112
Raul E Rangeld1a42b62022-08-10 15:28:15 -0600113static void configure_psp_tpm_gpio(void)
114{
115 const struct device *cr50_dev = DEV_PTR(cr50);
116 struct drivers_i2c_tpm_config *cfg = config_of(cr50_dev);
117
118 psp_set_tpm_irq_gpio(cfg->irq_gpio.pins[0]);
119}
120
Mathew King2e2fc7a2020-12-08 11:33:58 -0700121static void mainboard_init(void *chip_info)
122{
Mathew King10dd7752021-01-26 16:08:14 -0700123 mainboard_configure_gpios();
Mathew Kingad830232021-02-23 13:08:15 -0700124 mainboard_ec_init();
Karthikeyan Ramasubramanianb4182982021-10-26 16:55:35 -0600125 variant_devtree_update();
Raul E Rangeld1a42b62022-08-10 15:28:15 -0600126
127 /* Run this after variant_devtree_update so the IRQ is correct. */
128 configure_psp_tpm_gpio();
Mathew King2e2fc7a2020-12-08 11:33:58 -0700129}
130
Martin Rothc7204b52021-03-31 19:15:33 -0600131static void mainboard_write_blken(void)
132{
133 acpigen_write_method(METHOD_BACKLIGHT_ENABLE, 0);
134 acpigen_soc_clear_tx_gpio(BACKLIGHT_GPIO);
135 acpigen_pop_len();
136}
137
138static void mainboard_write_blkdis(void)
139{
140 acpigen_write_method(METHOD_BACKLIGHT_DISABLE, 0);
141 acpigen_soc_set_tx_gpio(BACKLIGHT_GPIO);
142 acpigen_pop_len();
143}
144
145static void mainboard_write_mini(void)
146{
147 acpigen_write_method(METHOD_MAINBOARD_INI, 0);
148 acpigen_emit_namestring(METHOD_BACKLIGHT_ENABLE);
149 acpigen_pop_len();
150}
151
152static void mainboard_write_mwak(void)
153{
154 acpigen_write_method(METHOD_MAINBOARD_WAK, 0);
155 acpigen_emit_namestring(METHOD_BACKLIGHT_ENABLE);
156 acpigen_pop_len();
157}
158
159static void mainboard_write_mpts(void)
160{
161 acpigen_write_method(METHOD_MAINBOARD_PTS, 0);
162 acpigen_emit_namestring(METHOD_BACKLIGHT_DISABLE);
163 acpigen_pop_len();
164}
165
Karthikeyan Ramasubramaniand086e3d2021-10-08 17:04:10 -0600166static void mainboard_assert_wwan_aux_reset(void)
167{
168 if (variant_has_pcie_wwan())
169 acpigen_soc_clear_tx_gpio(WWAN_AUX_RST_GPIO);
170}
171
172static void mainboard_deassert_wwan_aux_reset(void)
173{
174 if (variant_has_pcie_wwan())
175 acpigen_soc_set_tx_gpio(WWAN_AUX_RST_GPIO);
176}
177
178static void mainboard_write_ms0x(void)
179{
180 acpigen_write_method_serialized(METHOD_MAINBOARD_S0X, 1);
181 /* S0ix Entry */
182 acpigen_write_if_lequal_op_int(ARG0_OP, 1);
183 mainboard_assert_wwan_aux_reset();
184 /* S0ix Exit */
185 acpigen_write_else();
186 mainboard_deassert_wwan_aux_reset();
187 acpigen_pop_len();
188 acpigen_pop_len();
189}
190
Martin Rothc7204b52021-03-31 19:15:33 -0600191static void mainboard_fill_ssdt(const struct device *dev)
192{
193 mainboard_write_blken();
194 mainboard_write_blkdis();
195 mainboard_write_mini();
196 mainboard_write_mpts();
197 mainboard_write_mwak();
Karthikeyan Ramasubramaniand086e3d2021-10-08 17:04:10 -0600198 mainboard_write_ms0x();
Martin Rothc7204b52021-03-31 19:15:33 -0600199}
200
Mathew King2e2fc7a2020-12-08 11:33:58 -0700201static void mainboard_enable(struct device *dev)
202{
Mathew King5d478872021-02-16 14:05:15 -0700203 printk(BIOS_INFO, "Mainboard " CONFIG_MAINBOARD_PART_NUMBER " Enable.\n");
204
Martin Rothc7204b52021-03-31 19:15:33 -0600205 dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt;
Mathew King00b490d2021-03-12 15:48:32 -0700206
207 init_tables();
208 /* Initialize the PIRQ data structures for consumption */
209 pirq_setup();
Raul E Rangel6fce9cd2021-04-06 15:42:51 -0600210
211 /* TODO: b/184678786 - Move into espi_config */
212 /* Unmask eSPI IRQ 1 (Keyboard) */
213 pm_write32(PM_ESPI_INTR_CTRL, PM_ESPI_DEV_INTR_MASK & ~(BIT(1)));
Mathew King2e2fc7a2020-12-08 11:33:58 -0700214}
215
216struct chip_operations mainboard_ops = {
217 .init = mainboard_init,
218 .enable_dev = mainboard_enable,
Mathew King2e2fc7a2020-12-08 11:33:58 -0700219};