summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mainboard/google/brya/variants/uldrenite/gpio.c2
-rw-r--r--src/mainboard/google/brya/variants/uldrenite/overridetree.cb24
-rw-r--r--src/mainboard/google/fatcat/variants/kinmen/gpio.c16
-rw-r--r--src/mainboard/google/fatcat/variants/kinmen/memory.c29
-rw-r--r--src/mainboard/google/ocelot/Kconfig4
-rw-r--r--src/mainboard/google/ocelot/mainboard.c37
-rw-r--r--src/mainboard/google/ocelot/romstage.c9
-rw-r--r--src/mainboard/google/ocelot/variants/baseboard/include/baseboard/variants.h3
-rw-r--r--src/mainboard/google/ocelot/variants/baseboard/ocelot/devicetree.cb1
-rw-r--r--src/mainboard/google/ocelot/variants/baseboard/ocelot/include/baseboard/gpio.h1
-rw-r--r--src/mainboard/google/ocelot/variants/baseboard/ocelot/ramstage.c14
-rw-r--r--src/mainboard/google/ocelot/variants/ocelot/Makefile.mk1
-rw-r--r--src/mainboard/google/ocelot/variants/ocelot/fw_config.c83
-rw-r--r--src/mainboard/google/ocelot/variants/ocelot/gpio.c10
-rw-r--r--src/mainboard/google/ocelot/variants/ocelot/overridetree.cb76
-rw-r--r--src/mainboard/google/ocelot/variants/ocelot/variant.c69
-rw-r--r--src/mainboard/intel/ptlrvp/Kconfig5
-rw-r--r--src/mainboard/intel/ptlrvp/mainboard.c27
-rw-r--r--src/mainboard/intel/ptlrvp/romstage.c9
-rw-r--r--src/mainboard/intel/ptlrvp/variants/baseboard/include/baseboard/variants.h2
-rw-r--r--src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/devicetree.cb7
-rw-r--r--src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/include/baseboard/gpio.h1
-rw-r--r--src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/ramstage.c2
-rw-r--r--src/mainboard/intel/ptlrvp/variants/ptlrvp/Makefile.mk2
-rw-r--r--src/mainboard/intel/ptlrvp/variants/ptlrvp/fw_config.c107
-rw-r--r--src/mainboard/intel/ptlrvp/variants/ptlrvp/gpio.c6
-rw-r--r--src/mainboard/intel/ptlrvp/variants/ptlrvp/overridetree.cb76
-rw-r--r--src/mainboard/intel/ptlrvp/variants/ptlrvp/variant.c62
-rw-r--r--src/mainboard/intel/ptlrvp/variants/ptlrvp_chromeec/overridetree.cb76
29 files changed, 649 insertions, 112 deletions
diff --git a/src/mainboard/google/brya/variants/uldrenite/gpio.c b/src/mainboard/google/brya/variants/uldrenite/gpio.c
index d9ace375263a..d453adb1810b 100644
--- a/src/mainboard/google/brya/variants/uldrenite/gpio.c
+++ b/src/mainboard/google/brya/variants/uldrenite/gpio.c
@@ -177,7 +177,7 @@ static const struct pad_config gpio_table[] = {
/* E8 : GPP_E8 ==> WLAN_DISABLE_L */
PAD_CFG_GPO(GPP_E8, 1, DEEP),
/* E9 : GPP_E9 ==> SOC_ACC2_INT# */
- PAD_CFG_NF(GPP_E9, NONE, DEEP, NF1),
+ PAD_CFG_NF(GPP_E9, NONE, DEEP, NF2),
/* E10 : NC */
PAD_NC_LOCK(GPP_E10, NONE, LOCK_CONFIG),
/* E11 : NC */
diff --git a/src/mainboard/google/brya/variants/uldrenite/overridetree.cb b/src/mainboard/google/brya/variants/uldrenite/overridetree.cb
index 55e15175c745..78fec3dab2b2 100644
--- a/src/mainboard/google/brya/variants/uldrenite/overridetree.cb
+++ b/src/mainboard/google/brya/variants/uldrenite/overridetree.cb
@@ -30,7 +30,7 @@ chip soc/intel/alderlake
# DPTF enable
register "dptf_enable" = "true"
- register "tcc_offset" = "5" # TCC of 100
+ register "tcc_offset" = "3"
# Enable CNVi BT
register "cnvi_bt_core" = "true"
@@ -194,17 +194,17 @@ chip soc/intel/alderlake
## Passive Policy
register "policies.passive" = "{
[0] = DPTF_PASSIVE(CPU, CPU, 95, 5000),
- [1] = DPTF_PASSIVE(CPU, TEMP_SENSOR_0, 90, 5000),
- [2] = DPTF_PASSIVE(CPU, TEMP_SENSOR_1, 90, 5000),
- [3] = DPTF_PASSIVE(CPU, TEMP_SENSOR_2, 90, 5000),
+ [1] = DPTF_PASSIVE(CPU, TEMP_SENSOR_0, 85, 5000),
+ [2] = DPTF_PASSIVE(CPU, TEMP_SENSOR_1, 85, 5000),
+ [3] = DPTF_PASSIVE(CPU, TEMP_SENSOR_2, 85, 5000),
}"
## Critical Policy
register "policies.critical" = "{
- [0] = DPTF_CRITICAL(CPU, 105, SHUTDOWN),
- [1] = DPTF_CRITICAL(TEMP_SENSOR_0, 98, SHUTDOWN),
- [2] = DPTF_CRITICAL(TEMP_SENSOR_1, 98, SHUTDOWN),
- [3] = DPTF_CRITICAL(TEMP_SENSOR_2, 98, SHUTDOWN),
+ [0] = DPTF_CRITICAL(CPU, 130, SHUTDOWN),
+ [1] = DPTF_CRITICAL(TEMP_SENSOR_0, 105, SHUTDOWN),
+ [2] = DPTF_CRITICAL(TEMP_SENSOR_1, 105, SHUTDOWN),
+ [3] = DPTF_CRITICAL(TEMP_SENSOR_2, 105, SHUTDOWN),
}"
register "controls.power_limits" = "{
@@ -213,14 +213,14 @@ chip soc/intel/alderlake
.max_power = 10000,
.time_window_min = 28 * MSECS_PER_SEC,
.time_window_max = 28 * MSECS_PER_SEC,
- .granularity = 500
+ .granularity = 125
},
.pl2 = {
.min_power = 25000,
.max_power = 25000,
- .time_window_min = 32 * MSECS_PER_SEC,
- .time_window_max = 32 * MSECS_PER_SEC,
- .granularity = 500
+ .time_window_min = 28 * MSECS_PER_SEC,
+ .time_window_max = 28 * MSECS_PER_SEC,
+ .granularity = 1000
}
}"
diff --git a/src/mainboard/google/fatcat/variants/kinmen/gpio.c b/src/mainboard/google/fatcat/variants/kinmen/gpio.c
index ede819d698b6..6b6779541078 100644
--- a/src/mainboard/google/fatcat/variants/kinmen/gpio.c
+++ b/src/mainboard/google/fatcat/variants/kinmen/gpio.c
@@ -36,6 +36,8 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_GPO(GPP_A11, 1, PLTRST),
/* GPP_A12: WIFI_WAKE_N */
PAD_CFG_GPI_SCI_LOW(GPP_A12, NONE, DEEP, LEVEL),
+ /* GPP_A13: MEM_STRAP_0 */
+ PAD_CFG_GPI(GPP_A13, NONE, DEEP),
/* GPP_A15: GPP_A15_DNX_FORCE_RELOAD */
PAD_CFG_NF(GPP_A15, NONE, DEEP, NF1),
/* GPP_A16: BT_RF_KILL_N */
@@ -95,8 +97,10 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_NF(GPP_B22, NONE, DEEP, NF4),
/* GPP_B23: ISH_GP_6_SNSR_HDR */
PAD_CFG_NF(GPP_B23, NONE, DEEP, NF4),
- /* GPP_B24: ESPI_ALERT0_EC_R_N */
- PAD_NC(GPP_B24, NONE),
+ /* GPP_B24: MEM_STRAP_3 */
+ PAD_CFG_GPI(GPP_B24, NONE, DEEP),
+ /* GPP_B25: MEM_STRAP_2 */
+ PAD_CFG_GPI(GPP_B25, NONE, DEEP),
/* GPP_C00: GPP_C0_SMBCLK */
PAD_CFG_NF(GPP_C00, NONE, DEEP, NF1),
@@ -110,8 +114,8 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_NF(GPP_C04, NONE, DEEP, NF1),
/* GPP_C06: SML1_CLK */
PAD_CFG_NF(GPP_C06, NONE, DEEP, NF1),
- /* GPP_C07: SML1_DATA */
- PAD_CFG_NF(GPP_C07, NONE, DEEP, NF1),
+ /* GPP_C07: MEM_CH_SEL */
+ PAD_CFG_GPI(GPP_C07, NONE, DEEP),
/* GPP_C09: CLKREQ0_X8_GEN5_DT_CEM_SLOT_N */
PAD_CFG_NF(GPP_C09, NONE, DEEP, NF1),
/* GPP_C10: CLKREQ1_X4_GEN5_M2_SSD_N */
@@ -183,8 +187,8 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_NF(GPP_D22, NONE, DEEP, NF1),
/* GPP_D23: BPKI3C_SCL */
PAD_CFG_NF(GPP_D23, NONE, DEEP, NF1),
- /* GPP_D24: PEG_SLOT_WAKE_N */
- PAD_CFG_GPI_SCI_LOW(GPP_D24, NONE, DEEP, LEVEL),
+ /* GPP_D24: MEM_STRAP_1 */
+ PAD_CFG_GPI(GPP_D24, NONE, DEEP),
/* GPP_D25: X4_SLOT_WAKE_N */
PAD_CFG_GPI_SCI_LOW(GPP_D25, NONE, DEEP, LEVEL),
diff --git a/src/mainboard/google/fatcat/variants/kinmen/memory.c b/src/mainboard/google/fatcat/variants/kinmen/memory.c
index e0908adabda2..4637347562fe 100644
--- a/src/mainboard/google/fatcat/variants/kinmen/memory.c
+++ b/src/mainboard/google/fatcat/variants/kinmen/memory.c
@@ -33,8 +33,8 @@ static const struct mb_cfg lp5_mem_config = {
.dq1 = { 10, 9, 11, 8, 13, 14, 12, 15 },
},
.ddr6 = {
- .dq0 = { 9, 10, 11, 8, 14, 12, 13, 15, },
- .dq1 = { 0, 1, 2, 3, 5, 7, 4, 6 },
+ .dq0 = { 9, 8, 11, 10, 14, 12, 13, 15, },
+ .dq1 = { 6, 4, 5, 7, 1, 3, 0, 2 },
},
.ddr7 = {
.dq0 = { 0, 1, 2, 3, 7, 5, 6, 4, },
@@ -69,8 +69,27 @@ const struct mb_cfg *variant_memory_params(void)
return &lp5_mem_config;
}
-void variant_get_spd_info(struct mem_spd *spd_info)
+int variant_memory_sku(void)
{
- spd_info->topo = MEM_TOPO_MEMORY_DOWN;
- spd_info->cbfs_index = 0;
+ /*
+ * Memory configuration board straps
+ * GPIO_MEM_CONFIG_0 GPP_A13
+ * GPIO_MEM_CONFIG_1 GPP_D24
+ * GPIO_MEM_CONFIG_2 GPP_B25
+ * GPIO_MEM_CONFIG_3 GPP_B24
+ */
+ gpio_t spd_gpios[] = {
+ GPP_A13,
+ GPP_D24,
+ GPP_B25,
+ GPP_B24,
+ };
+
+ return gpio_base2_value(spd_gpios, ARRAY_SIZE(spd_gpios));
+}
+
+bool variant_is_half_populated(void)
+{
+ /* GPIO_MEM_CH_SEL GPP_C07 */
+ return gpio_get(GPP_C07);
}
diff --git a/src/mainboard/google/ocelot/Kconfig b/src/mainboard/google/ocelot/Kconfig
index 7060929fc7d9..a4b042235c0a 100644
--- a/src/mainboard/google/ocelot/Kconfig
+++ b/src/mainboard/google/ocelot/Kconfig
@@ -60,8 +60,8 @@ config BOARD_GOOGLE_OCELOT
select BOARD_GOOGLE_BASEBOARD_OCELOT
select DRIVERS_GENERIC_BAYHUB_LV2
select DRIVERS_GENERIC_MAX98357A
- select EC_GOOGLE_CHROMEEC_MEC
- select MAINBOARD_USES_IFD_EC_REGION
+ select DRIVERS_INTEL_TOUCH
+ select FSP_UGOP_EARLY_SIGN_OF_LIFE
if BOARD_GOOGLE_OCELOT_COMMON
diff --git a/src/mainboard/google/ocelot/mainboard.c b/src/mainboard/google/ocelot/mainboard.c
index f514eb96d146..5bd98924804d 100644
--- a/src/mainboard/google/ocelot/mainboard.c
+++ b/src/mainboard/google/ocelot/mainboard.c
@@ -4,6 +4,7 @@
#include <acpi/acpigen.h>
#include <baseboard/gpio.h>
#include <baseboard/variants.h>
+#include <bootstate.h>
#include <device/device.h>
#include <ec/ec.h>
#include <soc/ramstage.h>
@@ -27,6 +28,12 @@ void __weak variant_update_soc_chip_config(struct soc_intel_pantherlake_config *
static void mainboard_init(void *chip_info)
{
+ baseboard_devtree_update();
+}
+
+/* Must happen before MPinit */
+static void mainboard_early(void *unused)
+{
struct pad_config *padbased_table;
const struct pad_config *base_pads;
size_t base_num;
@@ -37,9 +44,10 @@ static void mainboard_init(void *chip_info)
fw_config_gpio_padbased_override(padbased_table);
gpio_configure_pads_with_padbased(padbased_table);
free(padbased_table);
- baseboard_devtree_update();
}
+BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_EXIT, mainboard_early, NULL);
+
void __weak baseboard_devtree_update(void)
{
/* Override dev tree settings per baseboard */
@@ -58,6 +66,32 @@ void __weak variant_generate_s0ix_hook(enum s0ix_entry entry)
*/
}
+static void mainboard_generate_s0ix_hook(void)
+{
+ acpigen_write_if_lequal_op_int(ARG0_OP, 1);
+ {
+ if (CONFIG(HAVE_SLP_S0_GATE))
+ acpigen_soc_clear_tx_gpio(GPIO_SLP_S0_GATE);
+ variant_generate_s0ix_hook(S0IX_ENTRY);
+ }
+ acpigen_write_else();
+ {
+ if (CONFIG(HAVE_SLP_S0_GATE))
+ acpigen_soc_set_tx_gpio(GPIO_SLP_S0_GATE);
+ variant_generate_s0ix_hook(S0IX_EXIT);
+ }
+ acpigen_write_if_end();
+}
+
+static void mainboard_fill_ssdt(const struct device *dev)
+{
+ acpigen_write_scope("\\_SB");
+ acpigen_write_method_serialized("MS0X", 1);
+ mainboard_generate_s0ix_hook();
+ acpigen_write_method_end(); /* Method */
+ acpigen_write_scope_end(); /* Scope */
+}
+
static void mainboard_dev_init(struct device *dev)
{
mainboard_ec_init();
@@ -66,6 +100,7 @@ static void mainboard_dev_init(struct device *dev)
static void mainboard_enable(struct device *dev)
{
dev->ops->init = mainboard_dev_init;
+ dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt;
}
struct chip_operations mainboard_ops = {
diff --git a/src/mainboard/google/ocelot/romstage.c b/src/mainboard/google/ocelot/romstage.c
index 7b56e28e3cca..8f0000c2ce83 100644
--- a/src/mainboard/google/ocelot/romstage.c
+++ b/src/mainboard/google/ocelot/romstage.c
@@ -3,6 +3,7 @@
#include <baseboard/variants.h>
#include <fsp/api.h>
#include <soc/romstage.h>
+#include <soc/soc_chip.h>
#include <string.h>
/*
@@ -16,6 +17,11 @@ __weak void fw_config_configure_pre_mem_gpio(void)
/* Nothing to do */
}
+__weak void variant_update_soc_memory_init_params(FSPM_UPD *memupd)
+{
+ /* Nothing to do */
+}
+
void mainboard_memory_init_params(FSPM_UPD *memupd)
{
const struct pad_config *pads;
@@ -33,4 +39,7 @@ void mainboard_memory_init_params(FSPM_UPD *memupd)
variant_get_spd_info(&spd_info);
memcfg_init(memupd, mem_config, &spd_info, half_populated);
+
+ /* Override FSP-M UPD per board if required. */
+ variant_update_soc_memory_init_params(memupd);
}
diff --git a/src/mainboard/google/ocelot/variants/baseboard/include/baseboard/variants.h b/src/mainboard/google/ocelot/variants/baseboard/include/baseboard/variants.h
index 2a70408e0d87..ad26ab8a6712 100644
--- a/src/mainboard/google/ocelot/variants/baseboard/include/baseboard/variants.h
+++ b/src/mainboard/google/ocelot/variants/baseboard/include/baseboard/variants.h
@@ -4,6 +4,7 @@
#define __BASEBOARD_VARIANTS_H__
#include <chip.h>
+#include <fsp/api.h>
#include <soc/gpio.h>
#include <soc/meminit.h>
#include <stdint.h>
@@ -23,7 +24,9 @@ const struct mb_cfg *variant_memory_params(void);
void variant_get_spd_info(struct mem_spd *spd_info);
int variant_memory_sku(void);
bool variant_is_half_populated(void);
+void variant_update_soc_memory_init_params(FSPM_UPD *memupd);
void variant_update_soc_chip_config(struct soc_intel_pantherlake_config *config);
+bool variant_is_barrel_charger_present(void);
enum s0ix_entry {
S0IX_EXIT,
diff --git a/src/mainboard/google/ocelot/variants/baseboard/ocelot/devicetree.cb b/src/mainboard/google/ocelot/variants/baseboard/ocelot/devicetree.cb
index 8bfe819b7c99..1ac4027eeca6 100644
--- a/src/mainboard/google/ocelot/variants/baseboard/ocelot/devicetree.cb
+++ b/src/mainboard/google/ocelot/variants/baseboard/ocelot/devicetree.cb
@@ -81,7 +81,6 @@ chip soc/intel/pantherlake
register "pch_hda_idisp_link_tmode" = "HDA_TMODE_8T"
register "pch_hda_idisp_link_frequency" = "HDA_LINKFREQ_96MHZ"
register "pch_hda_idisp_codec_enable" = "true"
- register "pch_hda_sdi_enable" = "{ true, false }"
device domain 0 on
device ref dtt on end
diff --git a/src/mainboard/google/ocelot/variants/baseboard/ocelot/include/baseboard/gpio.h b/src/mainboard/google/ocelot/variants/baseboard/ocelot/include/baseboard/gpio.h
index 56c2fb0aca80..2cc9e7407ab9 100644
--- a/src/mainboard/google/ocelot/variants/baseboard/ocelot/include/baseboard/gpio.h
+++ b/src/mainboard/google/ocelot/variants/baseboard/ocelot/include/baseboard/gpio.h
@@ -17,5 +17,6 @@
#define EC_SYNC_IRQ 0 /* Not Connected */
#endif
#define GPIO_PCH_WP GPP_D02
+#define GPIO_SLP_S0_GATE 0 /* Not Connected */
#endif /* __BASEBOARD_GPIO_H__ */
diff --git a/src/mainboard/google/ocelot/variants/baseboard/ocelot/ramstage.c b/src/mainboard/google/ocelot/variants/baseboard/ocelot/ramstage.c
index 030b587579ba..69d0d67cd080 100644
--- a/src/mainboard/google/ocelot/variants/baseboard/ocelot/ramstage.c
+++ b/src/mainboard/google/ocelot/variants/baseboard/ocelot/ramstage.c
@@ -50,10 +50,22 @@ const struct cpu_tdp_power_limits power_optimized_limits[] = {
},
};
+/*
+ * Placeholder to check if variant has support for barrel jack for powering
+ * on the device.
+ *
+ * Most of the chromebook device is powering on with USB-C hence, unless overridden
+ * by some variant, assume barrel jack not present.
+ */
+__weak bool variant_is_barrel_charger_present(void)
+{
+ return false;
+}
+
void baseboard_devtree_update(void)
{
/* Don't optimize the power limit if booting with barrel attached */
- if (google_chromeec_is_barrel_charger_present())
+ if (variant_is_barrel_charger_present())
return;
if (!google_chromeec_is_battery_present())
diff --git a/src/mainboard/google/ocelot/variants/ocelot/Makefile.mk b/src/mainboard/google/ocelot/variants/ocelot/Makefile.mk
index eb361dfe89a5..3fdd4642c078 100644
--- a/src/mainboard/google/ocelot/variants/ocelot/Makefile.mk
+++ b/src/mainboard/google/ocelot/variants/ocelot/Makefile.mk
@@ -5,5 +5,6 @@ romstage-y += gpio.c
romstage-y += memory.c
romstage-$(CONFIG_FW_CONFIG) += fw_config.c
ramstage-y += gpio.c
+romstage-$(CONFIG_FW_CONFIG) += variant.c
ramstage-$(CONFIG_FW_CONFIG) += variant.c
ramstage-$(CONFIG_FW_CONFIG) += fw_config.c
diff --git a/src/mainboard/google/ocelot/variants/ocelot/fw_config.c b/src/mainboard/google/ocelot/variants/ocelot/fw_config.c
index fd29768aa65f..511ec7e42114 100644
--- a/src/mainboard/google/ocelot/variants/ocelot/fw_config.c
+++ b/src/mainboard/google/ocelot/variants/ocelot/fw_config.c
@@ -111,10 +111,6 @@ static const struct pad_config audio_disable_pads[] = {
PAD_NC(GPP_D17, NONE),
};
-static const struct pad_config pre_mem_x1slot_pads[] = {
- /* GPP_A08: X1_PCIE_SLOT_PWR_EN */
- PAD_CFG_GPO(GPP_A08, 0, PLTRST),
-};
static const struct pad_config x1slot_pads[] = {
/* GPP_A08: X1_PCIE_SLOT_PWR_EN */
PAD_CFG_GPO(GPP_A08, 1, PLTRST),
@@ -297,6 +293,8 @@ static const struct pad_config touchscreen_disable_pads[] = {
PAD_NC(GPP_E17, NONE),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
PAD_NC(GPP_E18, NONE),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchscreen_thc_i2c_enable_pads[] = {
@@ -315,7 +313,10 @@ static const struct pad_config touchscreen_thc_i2c_enable_pads[] = {
/* GPP_E17: THC0_SPI1_CS0_N_TCH_PNL1 */
PAD_NC(GPP_E17, NONE),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
- PAD_CFG_GPI_APIC(GPP_E18, NONE, PLTRST, LEVEL, NONE),
+ /* NOTE: this SPI INT NF is also used in THC-I2C mode */
+ PAD_CFG_NF(GPP_E18, NONE, DEEP, NF3),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchscreen_thc_spi_enable_pads[] = {
@@ -336,13 +337,21 @@ static const struct pad_config touchscreen_thc_spi_enable_pads[] = {
PAD_CFG_NF(GPP_E17, NONE, DEEP, NF3),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 NF3: THC HID-SPI */
PAD_CFG_NF(GPP_E18, NONE, DEEP, NF3),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchpad_thc_i2c_enable_pads[] = {
- /* GPP_F12: NF1: thc_i2c1_scl */
+ /* GPP_F12: NF1: THC_I2C1_SCL */
PAD_CFG_NF(GPP_F12, NONE, DEEP, NF1),
- /* GPP_F13: NF1: thc_i2c1_sda */
+ /* GPP_F13: NF1: THC_I2C1_SDA */
PAD_CFG_NF(GPP_F13, NONE, DEEP, NF1),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: this SPI INT NF is also used in THC-I2C mode */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_CFG_NF(GPP_F18, NONE, DEEP, NF3),
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_NC(GPP_VGPIO3_THC1, NONE),
};
static const struct pad_config touchpad_lpss_i2c_enable_pads[] = {
@@ -350,8 +359,11 @@ static const struct pad_config touchpad_lpss_i2c_enable_pads[] = {
PAD_CFG_NF(GPP_F12, NONE, DEEP, NF8),
/* GPP_F13: THC_I2C1_SDA_TCH_PAD */
PAD_CFG_NF(GPP_F13, NONE, DEEP, NF8),
- /* GPP_A13: TCH_PAD_INT_N */
- PAD_CFG_GPI_IRQ_WAKE(GPP_A13, NONE, PWROK, EDGE_SINGLE, INVERT),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_CFG_GPI_APIC(GPP_F18, NONE, PLTRST, LEVEL, INVERT),
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_NC(GPP_VGPIO3_THC1, NONE),
};
static const struct pad_config touchpad_i2c_disable_pads[] = {
@@ -359,8 +371,21 @@ static const struct pad_config touchpad_i2c_disable_pads[] = {
PAD_NC(GPP_F12, NONE),
/* GPP_F13: THC_I2C1_SDA_TCH_PAD */
PAD_NC(GPP_F13, NONE),
- /* GPP_A13: TCH_PAD_INT_N */
- PAD_NC(GPP_A13, NONE),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_NC(GPP_F18, NONE),
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_NC(GPP_VGPIO3_THC1, NONE),
+};
+
+static const struct pad_config thc0_enable_wake[] = {
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_CFG_GPI_APIC_DRIVER(GPP_VGPIO3_THC0, NONE, PLTRST, LEVEL, NONE),
+};
+
+static const struct pad_config thc1_enable_wake[] = {
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_CFG_GPI_APIC_DRIVER(GPP_VGPIO3_THC1, NONE, PLTRST, LEVEL, NONE),
};
static const struct pad_config ish_disable_pads[] = {
@@ -385,6 +410,7 @@ static const struct pad_config fp_disable_pads[] = {
PAD_NC(GPP_C15, NONE),
/* GPP_D01: MOD_TCSS1_TYP_A_VBUS_EN */
PAD_CFG_GPO(GPP_D01, 1, DEEP),
+ PAD_NC(GPP_E17, NONE),
/* FIXME: b/390031369
* use dedicated GPIO PIN for codec enable
* when FPS is enabled.
@@ -395,7 +421,6 @@ static const struct pad_config fp_disable_pads[] = {
PAD_NC(GPP_F14, NONE),
PAD_NC(GPP_F15, NONE),
PAD_NC(GPP_F16, NONE),
- PAD_NC(GPP_F18, NONE),
};
static const struct pad_config fp_enable_pads[] = {
@@ -403,6 +428,8 @@ static const struct pad_config fp_enable_pads[] = {
PAD_CFG_GPO_LOCK(GPP_C15, 1, LOCK_CONFIG),
/* GPP_D01: FPS_SOC_INT_L */
PAD_CFG_GPI_IRQ_WAKE(GPP_D01, NONE, PWROK, LEVEL, INVERT),
+ /* GPP_E17: GSPI0A_CS0 */
+ PAD_CFG_NF(GPP_E17, NONE, DEEP, NF5),
/* GPP_E19: FPMCU_PWREN */
PAD_CFG_GPO(GPP_E19, 1, DEEP),
/* GPP_E20: FPMCU_FW_UPDATE */
@@ -413,8 +440,6 @@ static const struct pad_config fp_enable_pads[] = {
PAD_CFG_NF(GPP_F15, NONE, DEEP, NF8),
/* GPP_F16: GPSI0A_CLK */
PAD_CFG_NF(GPP_F16, NONE, DEEP, NF8),
- /* GPP_F18: GSPI0A_CS0 */
- PAD_CFG_NF(GPP_F18, NONE, DEEP, NF8),
};
static const struct pad_config pre_mem_fp_enable_pads[] = {
@@ -441,9 +466,6 @@ void fw_config_configure_pre_mem_gpio(void)
GPIO_CONFIGURE_PADS(pre_mem_gen5_ssd_pwr_pads);
}
- if (!fw_config_probe(FW_CONFIG(SD, SD_NONE)))
- GPIO_CONFIGURE_PADS(pre_mem_x1slot_pads);
-
/*
* NOTE: We place WWAN sequence 2 here. According to the WWAN FIBOCOM
* FM350-GL datasheet, the minimum time requirement (Tpr: time between 3.3V
@@ -464,6 +486,8 @@ void fw_config_configure_pre_mem_gpio(void)
void fw_config_gpio_padbased_override(struct pad_config *padbased_table)
{
+ const struct soc_intel_pantherlake_config *config = config_of_soc();
+
if (!fw_config_is_provisioned()) {
printk(BIOS_WARNING, "FW_CONFIG is not provisioned, Exiting\n");
return;
@@ -517,19 +541,25 @@ void fw_config_gpio_padbased_override(struct pad_config *padbased_table)
else
GPIO_PADBASED_OVERRIDE(padbased_table, x1slot_pads);
- if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_LPSS_I2C)))
+ if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_LPSS_I2C))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchpad_lpss_i2c_enable_pads);
- else if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_THC_I2C)))
+ } else if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_THC_I2C))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchpad_thc_i2c_enable_pads);
- else
+ if (config->thc_wake_on_touch[1])
+ GPIO_PADBASED_OVERRIDE(padbased_table, thc1_enable_wake);
+ } else {
GPIO_PADBASED_OVERRIDE(padbased_table, touchpad_i2c_disable_pads);
+ }
if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_I2C)))
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_thc_i2c_enable_pads);
- else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI)))
+ else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_thc_spi_enable_pads);
- else
+ if (config->thc_wake_on_touch[0])
+ GPIO_PADBASED_OVERRIDE(padbased_table, thc0_enable_wake);
+ } else {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_disable_pads);
+ }
if (fw_config_probe(FW_CONFIG(ISH, ISH_DISABLE)))
GPIO_PADBASED_OVERRIDE(padbased_table, ish_disable_pads);
@@ -539,8 +569,9 @@ void fw_config_gpio_padbased_override(struct pad_config *padbased_table)
/* NOTE: disable PEG (x8 slot) and x4 slot wake for now */
GPIO_PADBASED_OVERRIDE(padbased_table, peg_x4slot_wake_disable_pads);
- if (fw_config_probe(FW_CONFIG(FP, FP_PRESENT)))
- GPIO_CONFIGURE_PADS(fp_enable_pads);
- else
- GPIO_CONFIGURE_PADS(fp_disable_pads);
+ if (fw_config_probe(FW_CONFIG(FP, FP_PRESENT))) {
+ GPIO_PADBASED_OVERRIDE(padbased_table, fp_enable_pads);
+ } else {
+ GPIO_PADBASED_OVERRIDE(padbased_table, fp_disable_pads);
+ }
}
diff --git a/src/mainboard/google/ocelot/variants/ocelot/gpio.c b/src/mainboard/google/ocelot/variants/ocelot/gpio.c
index 945cda97be30..c22de38f2fb7 100644
--- a/src/mainboard/google/ocelot/variants/ocelot/gpio.c
+++ b/src/mainboard/google/ocelot/variants/ocelot/gpio.c
@@ -198,8 +198,6 @@ static const struct pad_config gpio_table[] = {
PAD_NC(GPP_E15, NONE),
/* GPP_E16: NC */
PAD_NC(GPP_E16, NONE),
- /* GPP_E17: SPI_SOC_CS_FP_R_L */
- PAD_CFG_NF(GPP_E17, NONE, DEEP, NF5),
/* GPP_E18: SOC_TCHPAD_INT_ODL */
PAD_CFG_NF(GPP_E18, NONE, DEEP, NF3),
/* GPP_E19: FP_SOC_INT_L */
@@ -247,8 +245,9 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_NF(GPP_F16, NONE, DEEP, NF3),
/* GPP_F17: SPI_THCSCR_CS_L */
PAD_CFG_NF(GPP_F17, NONE, DEEP, NF3),
- /* GPP_F18: TCHSCR_INT_ODL */
- PAD_CFG_NF(GPP_F18, NONE, DEEP, NF3),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_CFG_GPI_APIC(GPP_F18, NONE, PLTRST, LEVEL, INVERT),
/* GPP_F19: GPP_F19_STRAP */
PAD_NC(GPP_F19, NONE),
/* GPP_F20: EC_SOC_REC_SWITCH_ODL */
@@ -390,6 +389,8 @@ static const struct pad_config early_gpio_table[] = {
/* Pad configuration in romstage */
static const struct pad_config romstage_gpio_table[] = {
+ /* GPP_A08: X1_PCIE_SLOT_PWR_EN */
+ PAD_CFG_GPO(GPP_A08, 0, PLTRST),
};
const struct pad_config *variant_gpio_table(size_t *num)
@@ -416,6 +417,7 @@ static const struct cros_gpio cros_gpios[] = {
CROS_GPIO_REC_AL(CROS_GPIO_VIRTUAL, CROS_GPIO_DEVICE1_NAME),
CROS_GPIO_REC_AL(CROS_GPIO_VIRTUAL, CROS_GPIO_DEVICE2_NAME),
CROS_GPIO_REC_AL(CROS_GPIO_VIRTUAL, CROS_GPIO_DEVICE3_NAME),
+ CROS_GPIO_WP_AH(GPIO_PCH_WP, CROS_GPIO_DEVICE4_NAME),
};
DECLARE_CROS_GPIOS(cros_gpios);
diff --git a/src/mainboard/google/ocelot/variants/ocelot/overridetree.cb b/src/mainboard/google/ocelot/variants/ocelot/overridetree.cb
index 6b99983b7c53..30daba557269 100644
--- a/src/mainboard/google/ocelot/variants/ocelot/overridetree.cb
+++ b/src/mainboard/google/ocelot/variants/ocelot/overridetree.cb
@@ -54,6 +54,10 @@ fw_config
option KB_ABSENT 0
option KB_PRESENT 1
end
+ field PSU 20
+ option PSU_USBC 0
+ option PSU_BJ 1
+ end
end
chip soc/intel/pantherlake
@@ -64,7 +68,7 @@ chip soc/intel/pantherlake
register "usb2_ports[3]" = "USB2_PORT_TYPE_C(OC_SKIP)" # USB2_C3
register "usb2_ports[4]" = "USB2_PORT_MID(OC0)" # Type-A Port A0
register "usb2_ports[5]" = "USB2_PORT_MID(OC0)" # Type-A Port A1 / WWAN with rework
- register "usb2_ports[7]" = "USB2_PORT_MID(OC_SKIP)" # CNVi BT or discrete BT
+ register "usb2_ports[7]" = "USB2_PORT_MID(OC_SKIP)" # Discrete Bluetooth
register "usb3_ports[0]" = "USB3_PORT_DEFAULT(OC0)" # USB3.2 x1 Type-A Con #1
register "usb3_ports[1]" = "USB3_PORT_DEFAULT(OC0)" # USB3.2 x1 Type-A Con #2 / M.2 WWAN with rework
@@ -288,13 +292,66 @@ chip soc/intel/pantherlake
device ref iaa off end
device ref thc0 on
+ register "thc_wake_on_touch[0]" = "true"
probe TOUCHSCREEN TOUCHSCREEN_THC_SPI
probe TOUCHSCREEN TOUCHSCREEN_THC_I2C
# THC0 is function 0; hence it needs to be enabled when THC1 is to be enabled.
probe TOUCHPAD TOUCHPAD_THC_I2C
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC0_NAME"
+ register "mode" = "THC_HID_I2C_MODE"
+ register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F08)"
+ register "enable_delay_ms" = "2"
+ register "enable_off_delay_ms" = "2"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC0)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_ELAN"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_0_i2c_elan on
+ probe TOUCHSCREEN TOUCHSCREEN_THC_I2C
+ end
+ end
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC0_NAME"
+ register "mode" = "THC_HID_SPI_MODE"
+ register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F08)"
+ register "enable_delay_ms" = "2"
+ register "enable_off_delay_ms" = "2"
+ register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
+ register "reset_delay_ms" = "10"
+ register "reset_off_delay_ms" = "2"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC0)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_ELAN"
+ register "soc_hidspi.write_mode" = "HIDSPI_WRITE_MODE_MULTI_SINGLE_SPI"
+ register "soc_hidspi.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_0_spi_elan on
+ probe TOUCHSCREEN TOUCHSCREEN_THC_SPI
+ end
+ end
end
device ref thc1 on
+ register "thc_wake_on_touch[1]" = "true"
probe TOUCHPAD TOUCHPAD_THC_I2C
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC1_NAME"
+ register "mode" = "THC_HID_I2C_MODE"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC1)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_HYNITRON"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_1_i2c_hynitron on end
+ end
end
device ref tbt_pcie_rp0 on end
@@ -415,7 +472,10 @@ chip soc/intel/pantherlake
register "desc" = ""USB2 Bluetooth""
register "type" = "UPC_TYPE_INTERNAL"
register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_A16)"
- device ref usb2_port8 on end
+ device ref usb2_port8 on
+ probe WIFI WIFI_PCIE_6
+ probe WIFI WIFI_PCIE_7
+ end
end
chip drivers/usb/acpi
register "desc" = ""USB3 Type-A Port 1""
@@ -541,9 +601,16 @@ chip soc/intel/pantherlake
register "wake" = "GPE0_PME_B0"
register "add_acpi_dma_property" = "true"
register "enable_cnvi_ddr_rfim" = "true"
+ use cnvi_bluetooth as bluetooth_companion
device generic 0 on end
end
end # CNVi
+
+ device ref cnvi_bluetooth on
+ probe WIFI WIFI_CNVI_6
+ probe WIFI WIFI_CNVI_7
+ end
+
# NOTE: i2c0 is function 0; hence it needs to be enabled when any of i2c1-5 is enabled.
# TPM device is under i2c3. Therefore, i2c0 needs to be enabled anyways.
device ref i2c0 on end
@@ -562,8 +629,9 @@ chip soc/intel/pantherlake
chip drivers/i2c/hid
register "generic.hid" = ""HFW68H""
register "generic.desc" = ""Hynitron TOUCHPAD""
- register "generic.irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_A13_IRQ)"
- register "generic.wake" = "GPE0_DW0_13"
+ register "generic.irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_F18_IRQ)"
+ # NOTE: pmc_gpe0_dw0 will be overridden to GPP_F in variant.c.
+ register "generic.wake" = "GPE0_DW0_18"
register "generic.uid" = "5"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x20"
diff --git a/src/mainboard/google/ocelot/variants/ocelot/variant.c b/src/mainboard/google/ocelot/variants/ocelot/variant.c
index 34974da9183a..2f40fadad17e 100644
--- a/src/mainboard/google/ocelot/variants/ocelot/variant.c
+++ b/src/mainboard/google/ocelot/variants/ocelot/variant.c
@@ -1,9 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-#include <acpi/acpigen.h>
#include <baseboard/variants.h>
+#include <ec/google/chromeec/ec.h>
+#include <fsp/api.h>
#include <fw_config.h>
#include <sar.h>
+#include <soc/gpio_soc_defs.h>
+#include <drivers/intel/touch/chip.h>
const char *get_wifi_sar_cbfs_filename(void)
{
@@ -12,8 +15,6 @@ const char *get_wifi_sar_cbfs_filename(void)
void variant_update_soc_chip_config(struct soc_intel_pantherlake_config *config)
{
- config->cnvi_wifi_core = false;
- config->cnvi_bt_core = false;
/* CNVi */
if (fw_config_probe(FW_CONFIG(WIFI, WIFI_CNVI_6)) ||
fw_config_probe(FW_CONFIG(WIFI, WIFI_CNVI_7))) {
@@ -25,4 +26,66 @@ void variant_update_soc_chip_config(struct soc_intel_pantherlake_config *config)
config->cnvi_bt_audio_offload = true;
}
}
+
+ /* Touchscreen and touchpad WOT support:
+ * +===================+==================+=================+============================+
+ * | touchsreen | touchpad | PMC_GPE0_DW0 | WOT |
+ * +===================+==================+==============================================+
+ * | THC-SPI/THC-I2C | LPSS-I2C | GPP_F | TS, TP |
+ * +-------------------+------------------+----------------------------------------------+
+ * | THC-SPI/THC-I2C | not used or | GPP_A (default) | TS |
+ * | | with WOT disabled| | |
+ * +-------------------+------------------+----------------------------------------------+
+ * | THC-SPI/THC-I2C | THC-I2C | GPP_A (default) | TS, TP |
+ * +-------------------+------------------+----------------------------------------------+
+ * | LPSS-SPI/LPSS-I2C | LPSS-I2C | GPP_F | TS via PMC_GPE0_DW2: GPP_E,|
+ * | | | | TP |
+ * +-------------------+------------------+----------------------------------------------+
+ * | LPSS-SPI/LPSS-I2C | not used or | GPP_A (default) | TS via PMC_GPE0_DW2: GPP_E |
+ * | | with WOT disabled| | |
+ * +-------------------+------------------+----------------------------------------------+
+ * | not used | not used or | GPP_A (default) | NA |
+ * | with WOT disabled | with WOT disabled| | |
+ * +===================+==================+=================+============================+
+ */
+ if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_I2C))) {
+ config->thc_mode[0] = THC_HID_I2C_MODE;
+ } else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI))) {
+ config->thc_mode[0] = THC_HID_SPI_MODE;
+ }
+
+ if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_LPSS_I2C))) {
+ /* touchpad: GPP_F18: GPE0_DW0_18 */
+ if (config->thc_wake_on_touch[1])
+ config->pmc_gpe0_dw0 = GPP_F;
+ } else if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_THC_I2C))) {
+ config->thc_mode[1] = THC_HID_I2C_MODE;
+
+ if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_NONE)))
+ /* When THC0 is only enabled due to THC1 is enabled, we force THC0
+ * to I2C mode so that kernel THC I2C driver will find it and put
+ * THC0 to low power state because no connected device is found.
+ */
+ config->thc_mode[0] = THC_HID_I2C_MODE;
+ }
+}
+
+void variant_update_soc_memory_init_params(FSPM_UPD *memupd)
+{
+ FSP_M_CONFIG *m_cfg = &memupd->FspmConfig;
+
+ /* HDA Audio */
+ if (fw_config_probe(FW_CONFIG(AUDIO, AUDIO_ALC256_HDA))) {
+ printk(BIOS_INFO, "Overriding HDA SDI lanes.\n");
+ m_cfg->PchHdaSdiEnable[0] = true;
+ m_cfg->PchHdaSdiEnable[1] = false;
+ }
+}
+
+bool variant_is_barrel_charger_present(void)
+{
+ if (fw_config_probe(FW_CONFIG(PSU, PSU_BJ)))
+ return google_chromeec_is_barrel_charger_present();
+ else
+ return false;
}
diff --git a/src/mainboard/intel/ptlrvp/Kconfig b/src/mainboard/intel/ptlrvp/Kconfig
index ad6ac41e2247..096821f885ca 100644
--- a/src/mainboard/intel/ptlrvp/Kconfig
+++ b/src/mainboard/intel/ptlrvp/Kconfig
@@ -3,6 +3,7 @@
config BOARD_INTEL_PTLRVP_COMMON
def_bool n
select BOARD_ROMSIZE_KB_32768
+ select CPU_INTEL_SOCKET_OTHER
select DRIVERS_GFX_GENERIC
select DRIVERS_I2C_GENERIC
select DRIVERS_I2C_HID
@@ -39,7 +40,6 @@ config BOARD_INTEL_BASEBOARD_PTLRVP
select DRIVERS_INTEL_ISH
select DRIVER_INTEL_ISH_HAS_MAIN_FW
select DRIVERS_INTEL_USB4_RETIMER
- select HAVE_SLP_S0_GATE
select MAINBOARD_HAS_CHROMEOS
select MEMORY_SOLDERDOWN
select SOC_INTEL_COMMON_BLOCK_HDA_VERB
@@ -52,6 +52,7 @@ config BOARD_INTEL_MODEL_PTLRVP
select BOARD_INTEL_BASEBOARD_PTLRVP
select DRIVERS_GENERIC_BAYHUB_LV2
select DRIVERS_GENERIC_MAX98357A
+ select DRIVERS_INTEL_TOUCH
config BOARD_INTEL_PTLRVP
select BOARD_INTEL_MODEL_PTLRVP
@@ -80,7 +81,7 @@ config BASEBOARD_DIR
config CHROMEOS
select EC_GOOGLE_CHROMEEC_SWITCHES if BOARD_INTEL_PTLRVP_CHROMEEC
- select GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC
+ select GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC if EC_GOOGLE_CHROMEEC_MEC
select GBB_FLAG_FORCE_DEV_BOOT_USB
select GBB_FLAG_FORCE_MANUAL_RECOVERY
select HAS_RECOVERY_MRC_CACHE
diff --git a/src/mainboard/intel/ptlrvp/mainboard.c b/src/mainboard/intel/ptlrvp/mainboard.c
index f514eb96d146..e14c5ace797c 100644
--- a/src/mainboard/intel/ptlrvp/mainboard.c
+++ b/src/mainboard/intel/ptlrvp/mainboard.c
@@ -58,6 +58,32 @@ void __weak variant_generate_s0ix_hook(enum s0ix_entry entry)
*/
}
+static void mainboard_generate_s0ix_hook(void)
+{
+ acpigen_write_if_lequal_op_int(ARG0_OP, 1);
+ {
+ if (CONFIG(HAVE_SLP_S0_GATE))
+ acpigen_soc_clear_tx_gpio(GPIO_SLP_S0_GATE);
+ variant_generate_s0ix_hook(S0IX_ENTRY);
+ }
+ acpigen_write_else();
+ {
+ if (CONFIG(HAVE_SLP_S0_GATE))
+ acpigen_soc_set_tx_gpio(GPIO_SLP_S0_GATE);
+ variant_generate_s0ix_hook(S0IX_EXIT);
+ }
+ acpigen_write_if_end();
+}
+
+static void mainboard_fill_ssdt(const struct device *dev)
+{
+ acpigen_write_scope("\\_SB");
+ acpigen_write_method_serialized("MS0X", 1);
+ mainboard_generate_s0ix_hook();
+ acpigen_write_method_end(); /* Method */
+ acpigen_write_scope_end(); /* Scope */
+}
+
static void mainboard_dev_init(struct device *dev)
{
mainboard_ec_init();
@@ -66,6 +92,7 @@ static void mainboard_dev_init(struct device *dev)
static void mainboard_enable(struct device *dev)
{
dev->ops->init = mainboard_dev_init;
+ dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt;
}
struct chip_operations mainboard_ops = {
diff --git a/src/mainboard/intel/ptlrvp/romstage.c b/src/mainboard/intel/ptlrvp/romstage.c
index b6e3681891b5..1c5297125bfe 100644
--- a/src/mainboard/intel/ptlrvp/romstage.c
+++ b/src/mainboard/intel/ptlrvp/romstage.c
@@ -4,6 +4,7 @@
#include <ec/intel/board_id.h>
#include <fsp/api.h>
#include <soc/romstage.h>
+#include <soc/soc_chip.h>
#include <string.h>
/*
@@ -17,6 +18,11 @@ __weak void fw_config_configure_pre_mem_gpio(void)
/* Nothing to do */
}
+__weak void variant_update_soc_memory_init_params(FSPM_UPD *memupd)
+{
+ /* Nothing to do */
+}
+
void mainboard_memory_init_params(FSPM_UPD *memupd)
{
const struct pad_config *pads;
@@ -45,4 +51,7 @@ void mainboard_memory_init_params(FSPM_UPD *memupd)
die("Unknown board id = 0x%x\n", board_id);
break;
}
+
+ /* Override FSP-M UPD per board if required. */
+ variant_update_soc_memory_init_params(memupd);
}
diff --git a/src/mainboard/intel/ptlrvp/variants/baseboard/include/baseboard/variants.h b/src/mainboard/intel/ptlrvp/variants/baseboard/include/baseboard/variants.h
index 5a59f1ff7c56..d44ef98552ce 100644
--- a/src/mainboard/intel/ptlrvp/variants/baseboard/include/baseboard/variants.h
+++ b/src/mainboard/intel/ptlrvp/variants/baseboard/include/baseboard/variants.h
@@ -4,6 +4,7 @@
#define __BASEBOARD_VARIANTS_H__
#include <chip.h>
+#include <fsp/api.h>
#include <soc/gpio.h>
#include <soc/meminit.h>
#include <stdint.h>
@@ -30,6 +31,7 @@ const struct mb_cfg *variant_memory_params(void);
void variant_get_spd_info(struct mem_spd *spd_info);
int variant_memory_sku(void);
bool variant_is_half_populated(void);
+void variant_update_soc_memory_init_params(FSPM_UPD *memupd);
void variant_update_soc_chip_config(struct soc_intel_pantherlake_config *config);
enum s0ix_entry {
diff --git a/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/devicetree.cb b/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/devicetree.cb
index c45738a09016..c599a001397d 100644
--- a/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/devicetree.cb
+++ b/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/devicetree.cb
@@ -36,13 +36,13 @@ chip soc/intel/pantherlake
register "sagv_freq_mhz[0]" = "2400"
register "sagv_gear[0]" = "GEAR_4"
- register "sagv_freq_mhz[1]" = "3200"
+ register "sagv_freq_mhz[1]" = "4800"
register "sagv_gear[1]" = "GEAR_4"
- register "sagv_freq_mhz[2]" = "6000"
+ register "sagv_freq_mhz[2]" = "6400"
register "sagv_gear[2]" = "GEAR_4"
- register "sagv_freq_mhz[3]" = "6400"
+ register "sagv_freq_mhz[3]" = "6800"
register "sagv_gear[3]" = "GEAR_4"
# Enable s0ix
@@ -81,7 +81,6 @@ chip soc/intel/pantherlake
register "pch_hda_idisp_link_tmode" = "HDA_TMODE_8T"
register "pch_hda_idisp_link_frequency" = "HDA_LINKFREQ_96MHZ"
register "pch_hda_idisp_codec_enable" = "true"
- register "pch_hda_sdi_enable" = "{ true, false }"
device domain 0 on
device ref dtt on end
diff --git a/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/include/baseboard/gpio.h b/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/include/baseboard/gpio.h
index 5a77e4eb2ce6..b169d358dd0f 100644
--- a/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/include/baseboard/gpio.h
+++ b/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/include/baseboard/gpio.h
@@ -13,5 +13,6 @@
#define EC_SYNC_IRQ 0
/* WP signal to PCH */
#define GPIO_PCH_WP 0
+#define GPIO_SLP_S0_GATE 0 /* Not Connected */
#endif /* __BASEBOARD_GPIO_H__ */
diff --git a/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/ramstage.c b/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/ramstage.c
index 030b587579ba..6c7668fa4bec 100644
--- a/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/ramstage.c
+++ b/src/mainboard/intel/ptlrvp/variants/baseboard/ptlrvp/ramstage.c
@@ -53,7 +53,7 @@ const struct cpu_tdp_power_limits power_optimized_limits[] = {
void baseboard_devtree_update(void)
{
/* Don't optimize the power limit if booting with barrel attached */
- if (google_chromeec_is_barrel_charger_present())
+ if (CONFIG(BOARD_INTEL_MODEL_PTLRVP) && google_chromeec_is_barrel_charger_present())
return;
if (!google_chromeec_is_battery_present())
diff --git a/src/mainboard/intel/ptlrvp/variants/ptlrvp/Makefile.mk b/src/mainboard/intel/ptlrvp/variants/ptlrvp/Makefile.mk
index eb361dfe89a5..b9f1fd15dd42 100644
--- a/src/mainboard/intel/ptlrvp/variants/ptlrvp/Makefile.mk
+++ b/src/mainboard/intel/ptlrvp/variants/ptlrvp/Makefile.mk
@@ -5,5 +5,5 @@ romstage-y += gpio.c
romstage-y += memory.c
romstage-$(CONFIG_FW_CONFIG) += fw_config.c
ramstage-y += gpio.c
-ramstage-$(CONFIG_FW_CONFIG) += variant.c
+romstage-$(CONFIG_FW_CONFIG) += variant.c
ramstage-$(CONFIG_FW_CONFIG) += fw_config.c
diff --git a/src/mainboard/intel/ptlrvp/variants/ptlrvp/fw_config.c b/src/mainboard/intel/ptlrvp/variants/ptlrvp/fw_config.c
index 9419caf709e4..afd8a6308466 100644
--- a/src/mainboard/intel/ptlrvp/variants/ptlrvp/fw_config.c
+++ b/src/mainboard/intel/ptlrvp/variants/ptlrvp/fw_config.c
@@ -351,6 +351,8 @@ static const struct pad_config touchscreen_disable_pads[] = {
PAD_NC(GPP_E17, NONE),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
PAD_NC(GPP_E18, NONE),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchscreen_lpss_i2c_enable_pads[] = {
@@ -370,6 +372,8 @@ static const struct pad_config touchscreen_lpss_i2c_enable_pads[] = {
PAD_NC(GPP_E17, NONE),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
PAD_CFG_GPI_APIC(GPP_E18, NONE, PLTRST, LEVEL, NONE),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchscreen_thc_i2c_enable_pads[] = {
@@ -388,7 +392,10 @@ static const struct pad_config touchscreen_thc_i2c_enable_pads[] = {
/* GPP_E17: THC0_SPI1_CS0_N_TCH_PNL1 */
PAD_NC(GPP_E17, NONE),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
- PAD_CFG_GPI_APIC(GPP_E18, NONE, PLTRST, LEVEL, NONE),
+ /* NOTE: this SPI INT NF is also used in THC-I2C mode */
+ PAD_CFG_NF(GPP_E18, NONE, DEEP, NF3),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchscreen_gspi_enable_pads[] = {
@@ -407,7 +414,9 @@ static const struct pad_config touchscreen_gspi_enable_pads[] = {
/* GPP_E17: THC0_SPI1_CS0_N_TCH_PNL1 NF5: GSPI0 */
PAD_CFG_NF(GPP_E17, NONE, DEEP, NF5),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
- PAD_CFG_GPI_APIC(GPP_E18, NONE, PLTRST, EDGE_SINGLE, INVERT)
+ PAD_CFG_GPI_APIC(GPP_E18, NONE, PLTRST, EDGE_SINGLE, INVERT),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchscreen_thc_spi_enable_pads[] = {
@@ -428,13 +437,21 @@ static const struct pad_config touchscreen_thc_spi_enable_pads[] = {
PAD_CFG_NF(GPP_E17, NONE, DEEP, NF3),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 NF3: THC HID-SPI */
PAD_CFG_NF(GPP_E18, NONE, DEEP, NF3),
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_NC(GPP_VGPIO3_THC0, NONE),
};
static const struct pad_config touchpad_thc_i2c_enable_pads[] = {
- /* GPP_F12: NF1: thc_i2c1_scl */
+ /* GPP_F12: NF1: THC_I2C1_SCL */
PAD_CFG_NF(GPP_F12, NONE, DEEP, NF1),
- /* GPP_F13: NF1: thc_i2c1_sda */
+ /* GPP_F13: NF1: THC_I2C1_SDA */
PAD_CFG_NF(GPP_F13, NONE, DEEP, NF1),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: this SPI INT NF is also used in THC-I2C mode */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_CFG_NF(GPP_F18, NONE, DEEP, NF3),
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_NC(GPP_VGPIO3_THC1, NONE),
};
static const struct pad_config touchpad_lpss_i2c_enable_pads[] = {
@@ -442,8 +459,11 @@ static const struct pad_config touchpad_lpss_i2c_enable_pads[] = {
PAD_CFG_NF(GPP_F12, NONE, DEEP, NF8),
/* GPP_F13: THC_I2C1_SDA_TCH_PAD */
PAD_CFG_NF(GPP_F13, NONE, DEEP, NF8),
- /* GPP_A13: TCH_PAD_INT_N */
- PAD_CFG_GPI_IRQ_WAKE(GPP_A13, NONE, PWROK, EDGE_SINGLE, INVERT),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_CFG_GPI_APIC(GPP_F18, NONE, PLTRST, LEVEL, INVERT),
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_NC(GPP_VGPIO3_THC1, NONE),
};
static const struct pad_config touchpad_i2c_disable_pads[] = {
@@ -451,8 +471,21 @@ static const struct pad_config touchpad_i2c_disable_pads[] = {
PAD_NC(GPP_F12, NONE),
/* GPP_F13: THC_I2C1_SDA_TCH_PAD */
PAD_NC(GPP_F13, NONE),
- /* GPP_A13: TCH_PAD_INT_N */
- PAD_NC(GPP_A13, NONE),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_NC(GPP_F18, NONE),
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_NC(GPP_VGPIO3_THC1, NONE),
+};
+
+static const struct pad_config thc0_enable_wake[] = {
+ /* GPP_VGPIO3_THC0: THC0_WOT */
+ PAD_CFG_GPI_APIC_DRIVER(GPP_VGPIO3_THC0, NONE, PLTRST, LEVEL, NONE),
+};
+
+static const struct pad_config thc1_enable_wake[] = {
+ /* GPP_VGPIO3_THC1: THC1_WOT */
+ PAD_CFG_GPI_APIC_DRIVER(GPP_VGPIO3_THC1, NONE, PLTRST, LEVEL, NONE),
};
static const struct pad_config ish_disable_pads[] = {
@@ -477,6 +510,7 @@ static const struct pad_config fp_disable_pads[] = {
PAD_NC(GPP_C15, NONE),
/* GPP_D01: MOD_TCSS1_TYP_A_VBUS_EN */
PAD_CFG_GPO(GPP_D01, 1, DEEP),
+ PAD_NC(GPP_E17, NONE),
/* FIXME: b/390031369
* use dedicated GPIO PIN for codec enable
* when FPS is enabled.
@@ -487,7 +521,6 @@ static const struct pad_config fp_disable_pads[] = {
PAD_NC(GPP_F14, NONE),
PAD_NC(GPP_F15, NONE),
PAD_NC(GPP_F16, NONE),
- PAD_NC(GPP_F18, NONE),
};
static const struct pad_config fp_enable_pads[] = {
@@ -495,6 +528,8 @@ static const struct pad_config fp_enable_pads[] = {
PAD_CFG_GPO_LOCK(GPP_C15, 1, LOCK_CONFIG),
/* GPP_D01: FPS_SOC_INT_L */
PAD_CFG_GPI_IRQ_WAKE(GPP_D01, NONE, PWROK, LEVEL, INVERT),
+ /* GPP_E17: GSPI0A_CS0 */
+ PAD_CFG_NF(GPP_E17, NONE, DEEP, NF5),
/* GPP_E19: FPMCU_PWREN */
PAD_CFG_GPO(GPP_E19, 1, DEEP),
/* GPP_E20: FPMCU_FW_UPDATE */
@@ -505,8 +540,6 @@ static const struct pad_config fp_enable_pads[] = {
PAD_CFG_NF(GPP_F15, NONE, DEEP, NF8),
/* GPP_F16: GPSI0A_CLK */
PAD_CFG_NF(GPP_F16, NONE, DEEP, NF8),
- /* GPP_F18: GSPI0A_CS0 */
- PAD_CFG_NF(GPP_F18, NONE, DEEP, NF8),
};
static const struct pad_config pre_mem_fp_enable_pads[] = {
@@ -556,6 +589,8 @@ void fw_config_configure_pre_mem_gpio(void)
void fw_config_gpio_padbased_override(struct pad_config *padbased_table)
{
+ const struct soc_intel_pantherlake_config *config = config_of_soc();
+
if (!fw_config_is_provisioned()) {
printk(BIOS_WARNING, "FW_CONFIG is not provisioned, Exiting\n");
return;
@@ -618,23 +653,31 @@ void fw_config_gpio_padbased_override(struct pad_config *padbased_table)
else
GPIO_PADBASED_OVERRIDE(padbased_table, x1slot_pads);
- if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_LPSS_I2C)))
+ if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_LPSS_I2C))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchpad_lpss_i2c_enable_pads);
- else if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_THC_I2C)))
+ } else if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_THC_I2C))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchpad_thc_i2c_enable_pads);
- else
+ if (config->thc_wake_on_touch[1])
+ GPIO_PADBASED_OVERRIDE(padbased_table, thc1_enable_wake);
+ } else {
GPIO_PADBASED_OVERRIDE(padbased_table, touchpad_i2c_disable_pads);
+ }
- if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_LPSS_I2C)))
+ if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_LPSS_I2C))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_lpss_i2c_enable_pads);
- else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_I2C)))
+ } else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_I2C))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_thc_i2c_enable_pads);
- else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_GSPI)))
+ if (config->thc_wake_on_touch[0])
+ GPIO_PADBASED_OVERRIDE(padbased_table, thc0_enable_wake);
+ } else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_GSPI))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_gspi_enable_pads);
- else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI)))
+ } else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI))) {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_thc_spi_enable_pads);
- else
+ if (config->thc_wake_on_touch[0])
+ GPIO_PADBASED_OVERRIDE(padbased_table, thc0_enable_wake);
+ } else {
GPIO_PADBASED_OVERRIDE(padbased_table, touchscreen_disable_pads);
+ }
if (fw_config_probe(FW_CONFIG(ISH, ISH_DISABLE)))
GPIO_PADBASED_OVERRIDE(padbased_table, ish_disable_pads);
@@ -644,8 +687,26 @@ void fw_config_gpio_padbased_override(struct pad_config *padbased_table)
/* NOTE: disable PEG (x8 slot) and x4 slot wake for now */
GPIO_PADBASED_OVERRIDE(padbased_table, peg_x4slot_wake_disable_pads);
- if (fw_config_probe(FW_CONFIG(FP, FP_PRESENT)))
- GPIO_CONFIGURE_PADS(fp_enable_pads);
- else
- GPIO_CONFIGURE_PADS(fp_disable_pads);
+ /*
+ * *=========================================================================*
+ * | userage | GPP_E17 |
+ * *=========================================================================*
+ * | touchscreen in THC-SPI (with rework) | NF3: THC HID-SPI CS0 |
+ * *---------------------------------------*---------------------------------*
+ * | touchscreen in gSPI (with rework) | NF5: GSPI0 CS0 |
+ * *---------------------------------------*---------------------------------*
+ * | FPS present (without rework) | NF5: GSPI0 CS0 |
+ * *---------------------------------------*---------------------------------*
+ *
+ * NOTE: 1. CBI selecting TS THC-SPI or GSPI mode implies TS rework is applied for the board.
+ * 2. CBI selecting TS THC-SPI or TS GSPI with FSP present is invalid case.
+ */
+ if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_GSPI)) ||
+ fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI))) {
+ /* board has TS SPI rework and not FPS support */
+ } else if (fw_config_probe(FW_CONFIG(FP, FP_PRESENT))) {
+ GPIO_PADBASED_OVERRIDE(padbased_table, fp_enable_pads);
+ } else {
+ GPIO_PADBASED_OVERRIDE(padbased_table, fp_disable_pads);
+ }
}
diff --git a/src/mainboard/intel/ptlrvp/variants/ptlrvp/gpio.c b/src/mainboard/intel/ptlrvp/variants/ptlrvp/gpio.c
index 1accd4d597c7..9531065689c7 100644
--- a/src/mainboard/intel/ptlrvp/variants/ptlrvp/gpio.c
+++ b/src/mainboard/intel/ptlrvp/variants/ptlrvp/gpio.c
@@ -217,8 +217,6 @@ static const struct pad_config gpio_table[] = {
/* GPP_E16: THC0_SPI1_RST_N_TCH_PNL1 */
/* THC NOTE: use GPO instead of GPO for THC0 Rst */
PAD_CFG_GPO(GPP_E16, 1, DEEP),
- /* GPP_E17: THC0_SPI1_CS0_N_TCH_PNL1 */
- PAD_CFG_NF(GPP_E17, NONE, DEEP, NF3),
/* GPP_E18: THC0_SPI1_INT_N_TCH_PNL1 */
PAD_CFG_NF(GPP_E18, NONE, DEEP, NF3),
/* GPP_E21: I2C_PMC_PD_INT_N */
@@ -262,6 +260,9 @@ static const struct pad_config gpio_table[] = {
PAD_CFG_NF(GPP_F13, NONE, DEEP, NF8),
/* GPP_F17: Not used */
PAD_CFG_GPI_INT(GPP_F17, NONE, PLTRST, EDGE_BOTH),
+ /* GPP_F18: TCH_PAD_INT_N */
+ /* NOTE: require rework to switch from GPP_A13 to GPP_F18 */
+ PAD_CFG_GPI_APIC(GPP_F18, NONE, PLTRST, LEVEL, INVERT),
/* GPP_F19: GPP_PRIVACY_LED_CAM2 */
PAD_CFG_GPO(GPP_F19, 0, PLTRST),
/* GPP_F20: GPP_PRIVACY_LED_CAM1_CVS_HST_WAKE */
@@ -414,6 +415,7 @@ static const struct cros_gpio cros_gpios[] = {
CROS_GPIO_REC_AL(CROS_GPIO_VIRTUAL, CROS_GPIO_DEVICE1_NAME),
CROS_GPIO_REC_AL(CROS_GPIO_VIRTUAL, CROS_GPIO_DEVICE2_NAME),
CROS_GPIO_REC_AL(CROS_GPIO_VIRTUAL, CROS_GPIO_DEVICE3_NAME),
+ CROS_GPIO_WP_AH(GPIO_PCH_WP, CROS_GPIO_DEVICE4_NAME),
};
DECLARE_CROS_GPIOS(cros_gpios);
diff --git a/src/mainboard/intel/ptlrvp/variants/ptlrvp/overridetree.cb b/src/mainboard/intel/ptlrvp/variants/ptlrvp/overridetree.cb
index 4a33387cb20f..68136d26ea0d 100644
--- a/src/mainboard/intel/ptlrvp/variants/ptlrvp/overridetree.cb
+++ b/src/mainboard/intel/ptlrvp/variants/ptlrvp/overridetree.cb
@@ -77,7 +77,7 @@ chip soc/intel/pantherlake
register "usb2_ports[3]" = "USB2_PORT_TYPE_C(OC_SKIP)" # USB2_C3
register "usb2_ports[4]" = "USB2_PORT_MID(OC0)" # Type-A Port A0
register "usb2_ports[5]" = "USB2_PORT_MID(OC0)" # Type-A Port A1 / WWAN with rework
- register "usb2_ports[7]" = "USB2_PORT_MID(OC_SKIP)" # CNVi BT or discrete BT
+ register "usb2_ports[7]" = "USB2_PORT_MID(OC_SKIP)" # Discrete Bluetooth
register "usb3_ports[0]" = "USB3_PORT_DEFAULT(OC0)" # USB3.2 x1 Type-A Con #1
register "usb3_ports[1]" = "USB3_PORT_DEFAULT(OC0)" # USB3.2 x1 Type-A Con #2 / M.2 WWAN with rework
@@ -317,13 +317,66 @@ chip soc/intel/pantherlake
device ref iaa off end
device ref thc0 on
+ register "thc_wake_on_touch[0]" = "true"
probe TOUCHSCREEN TOUCHSCREEN_THC_SPI
probe TOUCHSCREEN TOUCHSCREEN_THC_I2C
# THC0 is function 0; hence it needs to be enabled when THC1 is to be enabled.
probe TOUCHPAD TOUCHPAD_THC_I2C
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC0_NAME"
+ register "mode" = "THC_HID_I2C_MODE"
+ register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F08)"
+ register "enable_delay_ms" = "2"
+ register "enable_off_delay_ms" = "2"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC0)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_ELAN"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_0_i2c_elan on
+ probe TOUCHSCREEN TOUCHSCREEN_THC_I2C
+ end
+ end
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC0_NAME"
+ register "mode" = "THC_HID_SPI_MODE"
+ register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F08)"
+ register "enable_delay_ms" = "2"
+ register "enable_off_delay_ms" = "2"
+ register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
+ register "reset_delay_ms" = "10"
+ register "reset_off_delay_ms" = "2"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC0)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_ELAN"
+ register "soc_hidspi.write_mode" = "HIDSPI_WRITE_MODE_MULTI_SINGLE_SPI"
+ register "soc_hidspi.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_0_spi_elan on
+ probe TOUCHSCREEN TOUCHSCREEN_THC_SPI
+ end
+ end
end
device ref thc1 on
+ register "thc_wake_on_touch[1]" = "true"
probe TOUCHPAD TOUCHPAD_THC_I2C
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC1_NAME"
+ register "mode" = "THC_HID_I2C_MODE"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC1)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_HYNITRON"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_1_i2c_hynitron on end
+ end
end
device ref tbt_pcie_rp0 on end
@@ -444,7 +497,10 @@ chip soc/intel/pantherlake
register "desc" = ""USB2 Bluetooth""
register "type" = "UPC_TYPE_INTERNAL"
register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_A16)"
- device ref usb2_port8 on end
+ device ref usb2_port8 on
+ probe WIFI WIFI_PCIE_6
+ probe WIFI WIFI_PCIE_7
+ end
end
chip drivers/usb/acpi
register "desc" = ""USB3 Type-A Port 1""
@@ -570,9 +626,16 @@ chip soc/intel/pantherlake
register "wake" = "GPE0_PME_B0"
register "add_acpi_dma_property" = "true"
register "enable_cnvi_ddr_rfim" = "true"
+ use cnvi_bluetooth as bluetooth_companion
device generic 0 on end
end
end # CNVi
+
+ device ref cnvi_bluetooth on
+ probe WIFI WIFI_CNVI_6
+ probe WIFI WIFI_CNVI_7
+ end
+
# NOTE: i2c0 is function 0; hence it needs to be enabled when any of i2c1-5 is enabled.
# TPM device is under i2c3. Therefore, i2c0 needs to be enabled anyways.
device ref i2c0 on end
@@ -796,9 +859,11 @@ chip soc/intel/pantherlake
end # I2C3
device ref i2c4 on
chip drivers/i2c/hid
- register "generic.hid" = ""ELAN6918""
+ register "generic.hid" = ""ELAN9048""
register "generic.desc" = ""ELAN Touchscreen""
register "generic.irq" = "ACPI_IRQ_LEVEL_LOW(GPP_E18_IRQ)"
+ # NOTE: pmc_gpe0_dw2 is GPP_E in baseboard devicetree.cb.
+ register "generic.wake" = "GPE0_DW2_18"
register "generic.probed" = "1"
register "generic.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
register "generic.reset_delay_ms" = "20"
@@ -816,8 +881,9 @@ chip soc/intel/pantherlake
chip drivers/i2c/hid
register "generic.hid" = ""HFW68H""
register "generic.desc" = ""Hynitron TOUCHPAD""
- register "generic.irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_A13_IRQ)"
- register "generic.wake" = "GPE0_DW0_13"
+ register "generic.irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_F18_IRQ)"
+ # NOTE: pmc_gpe0_dw0 will be overridden to GPP_F in variant.c.
+ register "generic.wake" = "GPE0_DW0_18"
register "generic.uid" = "5"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x20"
diff --git a/src/mainboard/intel/ptlrvp/variants/ptlrvp/variant.c b/src/mainboard/intel/ptlrvp/variants/ptlrvp/variant.c
index c7aa7aa60583..5ba768364003 100644
--- a/src/mainboard/intel/ptlrvp/variants/ptlrvp/variant.c
+++ b/src/mainboard/intel/ptlrvp/variants/ptlrvp/variant.c
@@ -1,9 +1,11 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-#include <acpi/acpigen.h>
#include <baseboard/variants.h>
+#include <fsp/api.h>
#include <fw_config.h>
#include <sar.h>
+#include <soc/gpio_soc_defs.h>
+#include <drivers/intel/touch/chip.h>
const char *get_wifi_sar_cbfs_filename(void)
{
@@ -12,8 +14,6 @@ const char *get_wifi_sar_cbfs_filename(void)
void variant_update_soc_chip_config(struct soc_intel_pantherlake_config *config)
{
- config->cnvi_wifi_core = false;
- config->cnvi_bt_core = false;
/* CNVi */
if (fw_config_probe(FW_CONFIG(WIFI, WIFI_CNVI_6)) ||
fw_config_probe(FW_CONFIG(WIFI, WIFI_CNVI_7))) {
@@ -27,4 +27,60 @@ void variant_update_soc_chip_config(struct soc_intel_pantherlake_config *config)
config->cnvi_bt_audio_offload = true;
}
}
+
+ /* Touchscreen and touchpad WOT support:
+ * +===================+==================+=================+============================+
+ * | touchsreen | touchpad | PMC_GPE0_DW0 | WOT |
+ * +===================+==================+==============================================+
+ * | THC-SPI/THC-I2C | LPSS-I2C | GPP_F | TS, TP |
+ * +-------------------+------------------+----------------------------------------------+
+ * | THC-SPI/THC-I2C | not used or | GPP_A (default) | TS |
+ * | | with WOT disabled| | |
+ * +-------------------+------------------+----------------------------------------------+
+ * | THC-SPI/THC-I2C | THC-I2C | GPP_A (default) | TS, TP |
+ * +-------------------+------------------+----------------------------------------------+
+ * | LPSS-SPI/LPSS-I2C | LPSS-I2C | GPP_F | TS via PMC_GPE0_DW2: GPP_E,|
+ * | | | | TP |
+ * +-------------------+------------------+----------------------------------------------+
+ * | LPSS-SPI/LPSS-I2C | not used or | GPP_A (default) | TS via PMC_GPE0_DW2: GPP_E |
+ * | | with WOT disabled| | |
+ * +-------------------+------------------+----------------------------------------------+
+ * | not used | not used or | GPP_A (default) | NA |
+ * | with WOT disabled | with WOT disabled| | |
+ * +===================+==================+=================+============================+
+ */
+ if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_I2C))) {
+ config->thc_mode[0] = THC_HID_I2C_MODE;
+ } else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_THC_SPI))) {
+ config->thc_mode[0] = THC_HID_SPI_MODE;
+ } else if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_GSPI))) {
+ config->serial_io_gspi_mode[PchSerialIoIndexGSPI0] = PchSerialIoPci;
+ }
+
+ if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_LPSS_I2C))) {
+ /* touchpad: GPP_F18: GPE0_DW0_18 */
+ if (config->thc_wake_on_touch[1])
+ config->pmc_gpe0_dw0 = GPP_F;
+ } else if (fw_config_probe(FW_CONFIG(TOUCHPAD, TOUCHPAD_THC_I2C))) {
+ config->thc_mode[1] = THC_HID_I2C_MODE;
+
+ if (fw_config_probe(FW_CONFIG(TOUCHSCREEN, TOUCHSCREEN_NONE)))
+ /* When THC0 is only enabled due to THC1 is enabled, we force THC0
+ * to I2C mode so that kernel THC I2C driver will find it and put
+ * THC0 to low power state because no connected device is found.
+ */
+ config->thc_mode[0] = THC_HID_I2C_MODE;
+ }
+}
+
+void variant_update_soc_memory_init_params(FSPM_UPD *memupd)
+{
+ FSP_M_CONFIG *m_cfg = &memupd->FspmConfig;
+
+ /* HDA Audio */
+ if (fw_config_probe(FW_CONFIG(AUDIO, AUDIO_ALC256_HDA))) {
+ printk(BIOS_INFO, "Overriding HDA SDI lanes.\n");
+ m_cfg->PchHdaSdiEnable[0] = true;
+ m_cfg->PchHdaSdiEnable[1] = false;
+ }
}
diff --git a/src/mainboard/intel/ptlrvp/variants/ptlrvp_chromeec/overridetree.cb b/src/mainboard/intel/ptlrvp/variants/ptlrvp_chromeec/overridetree.cb
index d836ab55642b..033a0b475b68 100644
--- a/src/mainboard/intel/ptlrvp/variants/ptlrvp_chromeec/overridetree.cb
+++ b/src/mainboard/intel/ptlrvp/variants/ptlrvp_chromeec/overridetree.cb
@@ -77,7 +77,7 @@ chip soc/intel/pantherlake
register "usb2_ports[3]" = "USB2_PORT_TYPE_C(OC_SKIP)" # USB2_C3
register "usb2_ports[4]" = "USB2_PORT_MID(OC0)" # Type-A Port A0
register "usb2_ports[5]" = "USB2_PORT_MID(OC0)" # Type-A Port A1 / WWAN with rework
- register "usb2_ports[7]" = "USB2_PORT_MID(OC_SKIP)" # CNVi BT or discrete BT
+ register "usb2_ports[7]" = "USB2_PORT_MID(OC_SKIP)" # Discrete Bluetooth
register "usb3_ports[0]" = "USB3_PORT_DEFAULT(OC0)" # USB3.2 x1 Type-A Con #1
register "usb3_ports[1]" = "USB3_PORT_DEFAULT(OC0)" # USB3.2 x1 Type-A Con #2 / M.2 WWAN with rework
@@ -317,13 +317,66 @@ chip soc/intel/pantherlake
device ref iaa off end
device ref thc0 on
+ register "thc_wake_on_touch[0]" = "true"
probe TOUCHSCREEN TOUCHSCREEN_THC_SPI
probe TOUCHSCREEN TOUCHSCREEN_THC_I2C
# THC0 is function 0; hence it needs to be enabled when THC1 is to be enabled.
probe TOUCHPAD TOUCHPAD_THC_I2C
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC0_NAME"
+ register "mode" = "THC_HID_I2C_MODE"
+ register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F08)"
+ register "enable_delay_ms" = "2"
+ register "enable_off_delay_ms" = "2"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC0)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_ELAN"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_0_i2c_elan on
+ probe TOUCHSCREEN TOUCHSCREEN_THC_I2C
+ end
+ end
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC0_NAME"
+ register "mode" = "THC_HID_SPI_MODE"
+ register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F08)"
+ register "enable_delay_ms" = "2"
+ register "enable_off_delay_ms" = "2"
+ register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
+ register "reset_delay_ms" = "10"
+ register "reset_off_delay_ms" = "2"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC0)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_ELAN"
+ register "soc_hidspi.write_mode" = "HIDSPI_WRITE_MODE_MULTI_SINGLE_SPI"
+ register "soc_hidspi.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_0_spi_elan on
+ probe TOUCHSCREEN TOUCHSCREEN_THC_SPI
+ end
+ end
end
device ref thc1 on
+ register "thc_wake_on_touch[1]" = "true"
probe TOUCHPAD TOUCHPAD_THC_I2C
+ chip drivers/intel/touch
+ register "name" = "INTEL_THC1_NAME"
+ register "mode" = "THC_HID_I2C_MODE"
+ register "wake_on_touch" = "true"
+ # NOTE: Use GpioInt() in _CRS and does not use GPE.
+ register "wake_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW_WAKE(GPP_VGPIO3_THC1)"
+ register "active_ltr" = "1"
+ register "idle_ltr" = "0"
+ register "connected_device" = "TH_SENSOR_HYNITRON"
+ register "add_acpi_dma_property" = "true"
+ device generic 0 alias touch_1_i2c_hynitron on end
+ end
end
device ref tbt_pcie_rp0 on end
@@ -444,7 +497,10 @@ chip soc/intel/pantherlake
register "desc" = ""USB2 Bluetooth""
register "type" = "UPC_TYPE_INTERNAL"
register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_A16)"
- device ref usb2_port8 on end
+ device ref usb2_port8 on
+ probe WIFI WIFI_PCIE_6
+ probe WIFI WIFI_PCIE_7
+ end
end
chip drivers/usb/acpi
register "desc" = ""USB3 Type-A Port 1""
@@ -570,9 +626,16 @@ chip soc/intel/pantherlake
register "wake" = "GPE0_PME_B0"
register "add_acpi_dma_property" = "true"
register "enable_cnvi_ddr_rfim" = "true"
+ use cnvi_bluetooth as bluetooth_companion
device generic 0 on end
end
end # CNVi
+
+ device ref cnvi_bluetooth on
+ probe WIFI WIFI_CNVI_6
+ probe WIFI WIFI_CNVI_7
+ end
+
# NOTE: i2c0 is function 0; hence it needs to be enabled when any of i2c1-5 is enabled.
# TPM device is under i2c3. Therefore, i2c0 needs to be enabled anyways.
device ref i2c0 on end
@@ -801,9 +864,11 @@ chip soc/intel/pantherlake
end # I2C3
device ref i2c4 on
chip drivers/i2c/hid
- register "generic.hid" = ""ELAN6918""
+ register "generic.hid" = ""ELAN9048""
register "generic.desc" = ""ELAN Touchscreen""
register "generic.irq" = "ACPI_IRQ_LEVEL_LOW(GPP_E18_IRQ)"
+ # NOTE: pmc_gpe0_dw2 is GPP_E in baseboard devicetree.cb.
+ register "generic.wake" = "GPE0_DW2_18"
register "generic.probed" = "1"
register "generic.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E16)"
register "generic.reset_delay_ms" = "20"
@@ -821,8 +886,9 @@ chip soc/intel/pantherlake
chip drivers/i2c/hid
register "generic.hid" = ""HFW68H""
register "generic.desc" = ""Hynitron TOUCHPAD""
- register "generic.irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_A13_IRQ)"
- register "generic.wake" = "GPE0_DW0_13"
+ register "generic.irq" = "ACPI_IRQ_WAKE_LEVEL_LOW(GPP_F18_IRQ)"
+ # NOTE: pmc_gpe0_dw0 will be overridden to GPP_F in variant.c.
+ register "generic.wake" = "GPE0_DW0_18"
register "generic.uid" = "5"
register "generic.detect" = "1"
register "hid_desc_reg_offset" = "0x20"