mb/lenovo/sklkbl_thinkpad: Add Lenovo Thinkpad T470s as a variant

The hardware is mostly identical to the already supported Thinkpad
T480s. Aside from the CPU (KBL vs SKL), major hardware differences are
GPIO pins routed out to a classical docking station connector, and the
lack of support for dedicated GPUs.

A tricky aspect of this machine is that it fails to enumerate PCIe
devices when using a truncated Intel ME firmware even when retaining
the MFS partition [1]. I suspect that the PCIe clock generators are set
up in some other part of the ME firmware.

The VBT (intelvbttool) as well as GPIO register dumps (inteltool) was
obtained from the latest stock BIOS 1.55/N1WET76W. GPIO, USB and PCIe
port assignments have been cross-checked against the publicly available
schematics (Thorpe-2).

The patches were validated on a laptop with part number 20JT-S16E00 in
conjunction with a non-truncated deguarded Intel ME firmware [2].
A cursory hardware test (video, wifi, audio, network, reboot, etc.) has
everything working as expected (debian 13).

[1] https://puri.sm/posts/deep-dive-into-intel-me-disablement/
[2] deguard commit 497732f8b2e3bdc699c0fbc6713b6afbaef7506a

Change-Id: I113b31484a634b7c1acdba5f74e5eef050d4ede6
Signed-off-by: Johann C. Rode <jcrode@gmx.net>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/89638
Reviewed-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-by: Maximilian Brune <maximilian.brune@9elements.com>
This commit is contained in:
Johann C. Rode 2025-10-18 09:13:13 -07:00 committed by Matt DeVillier
commit 668d643e5c
31 changed files with 461 additions and 1 deletions

View file

@ -20,10 +20,15 @@ config BOARD_LENOVO_SKLKBL_THINKPAD_COMMON
select MAINBOARD_USES_IFD_GBE_REGION
select MEMORY_MAPPED_TPM
select SOC_INTEL_COMMON_BLOCK_HDA_VERB
select SOC_INTEL_KABYLAKE
select SOC_INTEL_KABYLAKE if BOARD_LENOVO_T480 || BOARD_LENOVO_T480S || BOARD_LENOVO_T580
select SOC_INTEL_SKYLAKE if BOARD_LENOVO_T470S
select SPD_READ_BY_WORD
select SYSTEM_TYPE_LAPTOP
config BOARD_LENOVO_T470S
bool
select BOARD_LENOVO_SKLKBL_THINKPAD_COMMON
config BOARD_LENOVO_T480
bool
select BOARD_LENOVO_SKLKBL_THINKPAD_COMMON
@ -48,6 +53,7 @@ config MAINBOARD_DIR
default "lenovo/sklkbl_thinkpad"
config VARIANT_DIR
default "t470s" if BOARD_LENOVO_T470S
default "t480" if BOARD_LENOVO_T480
default "t480s" if BOARD_LENOVO_T480S
default "t580" if BOARD_LENOVO_T580
@ -56,6 +62,7 @@ config OVERRIDE_DEVICETREE
default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb"
config MAINBOARD_PART_NUMBER
default "T470s" if BOARD_LENOVO_T470S
default "T480" if BOARD_LENOVO_T480
default "T480s" if BOARD_LENOVO_T480S
default "T580" if BOARD_LENOVO_T580

View file

@ -1,5 +1,8 @@
# SPDX-License-Identifier: GPL-2.0-only
config BOARD_LENOVO_T470S
bool "ThinkPad T470s"
config BOARD_LENOVO_T480
bool "ThinkPad T480"

View file

@ -13,4 +13,6 @@ ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += variants/$(VARIANT_DIR)/gma-mainb
subdirs-y += variants/$(VARIANT_DIR)
ifeq ($(CONFIG_VARIANT_HAS_DGPU),y)
CPPFLAGS_common += -I$(src)/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/include
endif

View file

@ -0,0 +1,10 @@
## SPDX-License-Identifier: GPL-2.0-only
# Add files spd_0.bin to spd_20.bin to the cbfs image
SPD_BINS := $(shell seq 0 20)
define SPD_template
cbfs-files-y += spd_$(1).bin
spd_$(1).bin-file := spd/spd_$(1).bin
spd_$(1).bin-type := raw
endef
$(foreach n,$(SPD_BINS),$(eval $(call SPD_template,$(n))))

View file

@ -0,0 +1,19 @@
-- SPDX-License-Identifier: GPL-2.0-or-later
with HW.GFX.GMA;
with HW.GFX.GMA.Display_Probing;
use HW.GFX.GMA;
use HW.GFX.GMA.Display_Probing;
private package GMA.Mainboard is
ports : constant Port_List :=
(eDP,
DP1,
DP2,
HDMI1,
HDMI2,
others => Disabled);
end GMA.Mainboard;

View file

@ -0,0 +1,199 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <soc/gpio.h>
#include "../../variant.h"
static const struct pad_config gpio_table[] = {
/* ------- GPIO Community 0 ------- */
/* ------- GPIO Group GPP_A ------- */
PAD_CFG_NF(GPP_A0, NONE, DEEP, NF1), /* -KBRC */
PAD_CFG_NF(GPP_A1, NATIVE, DEEP, NF1), /* LPC_AD0 */
PAD_CFG_NF(GPP_A2, NATIVE, DEEP, NF1), /* LPC_AD1 */
PAD_CFG_NF(GPP_A3, NATIVE, DEEP, NF1), /* LPC_AD2 */
PAD_CFG_NF(GPP_A4, NATIVE, DEEP, NF1), /* LPC_AD3 */
PAD_CFG_NF(GPP_A5, NONE, DEEP, NF1), /* -LPC_FRAME */
PAD_CFG_NF(GPP_A6, NONE, DEEP, NF1), /* IRQSER */
PAD_CFG_NF(GPP_A7, NONE, DEEP, NF1), /* -TPM_IRQ */
PAD_CFG_NF(GPP_A8, NONE, DEEP, NF1), /* -CLKRUN */
PAD_CFG_NF(GPP_A9, DN_20K, DEEP, NF1), /* LPCCLK_EC_24M */
PAD_CFG_NF(GPP_A10, DN_20K, DEEP, NF1), /* LPCCLK_DEBUG_24M */
PAD_CFG_NF(GPP_A11, NONE, DEEP, NF1), /* LPCCLK_DEBUG_24M */
PAD_NC(GPP_A12, NONE),
PAD_CFG_NF(GPP_A13, NATIVE, DEEP, NF1), /* -SUSWARN */
PAD_CFG_NF(GPP_A14, NATIVE, DEEP, NF1), /* -SUS_STAT */
PAD_CFG_NF(GPP_A15, NATIVE, DEEP, NF1), /* -SUSACK*/
PAD_NC(GPP_A16, NONE),
PAD_NC(GPP_A17, NONE),
PAD_NC(GPP_A18, NONE),
PAD_NC(GPP_A19, NONE),
PAD_NC(GPP_A20, NONE),
PAD_NC(GPP_A21, NONE),
PAD_NC(GPP_A22, NONE),
PAD_NC(GPP_A23, NONE),
/* ------- GPIO Group GPP_B ------- */
PAD_CFG_NF(GPP_B0, NONE, DEEP, NF1), /* CORE_VID0 */
PAD_CFG_NF(GPP_B1, NONE, DEEP, NF1), /* CORE_VID1 */
PAD_NC(GPP_B2, NONE),
PAD_NC(GPP_B3, NONE),
PAD_NC(GPP_B4, NONE),
PAD_CFG_NF(GPP_B5, NONE, DEEP, NF1), /* -CLKREQ_PCIE0 (TB) */
PAD_CFG_NF(GPP_B6, NONE, DEEP, NF1), /* -CLKREQ_PCIE1 (WLAN1) */
PAD_CFG_NF(GPP_B7, NONE, DEEP, NF1), /* -CLKREQ_PCIE2 (GBE) */
PAD_CFG_NF(GPP_B8, NONE, DEEP, NF1), /* -CLKREQ_PCIE3 (WLAN2) */
PAD_CFG_NF(GPP_B9, NONE, DEEP, NF1),
PAD_CFG_NF(GPP_B10, NONE, DEEP, NF1), /* -CLKREQ_PCIE5 (SSD) */
PAD_CFG_NF(GPP_B11, NONE, DEEP, NF1), /* -EXT_PWR_GATE */
PAD_CFG_NF(GPP_B12, NONE, DEEP, NF1), /* -PCH_SLP_S0 */
PAD_CFG_NF(GPP_B13, NONE, DEEP, NF1), /* -PLTRST */
PAD_CFG_NF(GPP_B14, NATIVE, DEEP, NF1), /* PCH_SPKR */
PAD_CFG_GPO(GPP_B15, 0, DEEP), /* NFC_DLREQ */
PAD_NC(GPP_B16, NONE),
PAD_NC(GPP_B17, NONE),
PAD_NC(GPP_B18, NONE),
PAD_NC(GPP_B19, NONE),
PAD_NC(GPP_B20, NONE),
PAD_NC(GPP_B21, NONE),
PAD_NC(GPP_B22, NONE),
PAD_NC(GPP_B23, NONE),
/* ------- GPIO Community 1 ------- */
/* ------- GPIO Group GPP_C ------- */
PAD_CFG_NF(GPP_C0, NONE, DEEP, NF1), /* SMB_CLK */
PAD_CFG_NF(GPP_C1, NONE, DEEP, NF1), /* SMB_DATA */
PAD_NC(GPP_C2, NONE),
PAD_CFG_NF(GPP_C3, NONE, DEEP, NF1), /* SML0_CLK */
PAD_CFG_NF(GPP_C4, NONE, DEEP, NF1), /* SML0_DATA */
PAD_NC(GPP_C5, NONE),
PAD_CFG_NF(GPP_C6, NONE, DEEP, NF1), /* EC_SCL2 */
PAD_CFG_NF(GPP_C7, NONE, DEEP, NF1), /* EC_SDA2 */
PAD_NC(GPP_C8, NONE),
PAD_NC(GPP_C9, NONE),
PAD_NC(GPP_C10, NONE),
PAD_NC(GPP_C11, NONE),
PAD_NC(GPP_C12, NONE),
PAD_NC(GPP_C13, NONE),
PAD_NC(GPP_C14, NONE),
PAD_NC(GPP_C15, NONE),
PAD_CFG_NF(GPP_C16, NONE, DEEP, NF1), /* I2C0_DATA */
PAD_CFG_NF(GPP_C17, NONE, DEEP, NF1), /* I2C0_CLK */
PAD_NC(GPP_C18, NONE),
PAD_NC(GPP_C19, NONE),
PAD_CFG_GPI_SCI(GPP_C20, NONE, DEEP, EDGE_SINGLE, INVERT), /* -TBT_PLUG_EVENT */
PAD_CFG_GPO(GPP_C21, 0, DEEP), /* TBT_FORCE_PWR */
PAD_CFG_GPI_SCI(GPP_C22, NONE, DEEP, EDGE_SINGLE, INVERT), /* -EC_SCI */
PAD_CFG_GPI_SCI(GPP_C23, NONE, DEEP, EDGE_SINGLE, INVERT), /* -EC_WAKE */
/* ------- GPIO Group GPP_D ------- */
PAD_CFG_GPI_TRIG_OWN(GPP_D0, UP_20K, DEEP, OFF, ACPI), /* DOCKID0 */
PAD_CFG_GPI_TRIG_OWN(GPP_D1, UP_20K, DEEP, OFF, ACPI), /* DOCKID1 */
PAD_CFG_GPI_TRIG_OWN(GPP_D2, UP_20K, DEEP, OFF, ACPI), /* DOCKID2 */
PAD_CFG_GPI_TRIG_OWN(GPP_D3, UP_20K, DEEP, OFF, ACPI), /* DOCKID3 */
PAD_NC(GPP_D4, NONE),
PAD_NC(GPP_D5, NONE),
PAD_NC(GPP_D6, NONE),
PAD_NC(GPP_D7, NONE),
PAD_NC(GPP_D8, NONE),
PAD_NC(GPP_D9, UP_20K),
PAD_NC(GPP_D10, NONE),
PAD_NC(GPP_D11, UP_20K),
PAD_NC(GPP_D12, UP_20K),
PAD_NC(GPP_D13, NONE),
PAD_NC(GPP_D14, NONE),
PAD_NC(GPP_D15, NONE),
PAD_NC(GPP_D16, NONE),
PAD_NC(GPP_D17, NONE), /* DDI_PRIORITY1 */
PAD_CFG_GPO(GPP_D18, 0, DEEP), /* DDI_PRIORITY2 */
PAD_NC(GPP_D19, NONE),
PAD_NC(GPP_D20, NONE),
PAD_CFG_GPI_TRIG_OWN(GPP_D21, UP_20K, DEEP, OFF, ACPI), /* -DOCK_CAP_ID */
PAD_CFG_GPI_TRIG_OWN(GPP_D22, UP_20K, DEEP, OFF, ACPI), /* -NFC_DTCT */
PAD_NC(GPP_D23, NONE),
/* ------- GPIO Group GPP_E ------- */
PAD_NC(GPP_E0, NONE),
PAD_CFG_GPI_TRIG_OWN(GPP_E1, NONE, DEEP, OFF, ACPI),
PAD_CFG_NF(GPP_E2, NONE, DEEP, NF1), /* -PE_DTCT */
PAD_NC(GPP_E3, NONE),
PAD_CFG_GPO(GPP_E4, 1, DEEP), /* NFC_ON */
PAD_CFG_NF(GPP_E5, NONE, RSMRST, NF1),
PAD_CFG_NF(GPP_E6, NONE, RSMRST, NF1), /* SATA2_DEVSLP */
PAD_NC(GPP_E7, NONE),
PAD_NC(GPP_E8, NONE),
PAD_CFG_NF(GPP_E9, NONE, DEEP, NF1), /* -USB_PORT0_OC0 */
PAD_CFG_NF(GPP_E10, NONE, DEEP, NF1), /* -USB_PORT1_OC1 */
PAD_CFG_NF(GPP_E11, NONE, DEEP, NF1), /* -USB_PORT2_OC2 */
PAD_CFG_GPI_APIC_HIGH(GPP_E12, NONE, DEEP), /* NFC_INT */
PAD_CFG_NF(GPP_E13, NONE, DEEP, NF1), /* DDIP1_HPD */
PAD_CFG_NF(GPP_E14, NONE, DEEP, NF1), /* DDIP2_HPD */
PAD_NC(GPP_E15, NONE),
PAD_NC(GPP_E16, NONE),
PAD_CFG_NF(GPP_E17, NONE, DEEP, NF1), /* EDP_HPD */
PAD_NC(GPP_E18, NONE),
PAD_CFG_NF(GPP_E19, NONE, DEEP, NF1),
PAD_CFG_NF(GPP_E20, NONE, DEEP, NF1), /* DDIP2_CTRLCLK */
PAD_CFG_NF(GPP_E21, NONE, DEEP, NF1), /* DDIP2_CTRLDATA */
PAD_NC(GPP_E22, NONE),
PAD_NC(GPP_E23, NONE),
/* ------- GPIO Community 2 ------- */
/* -------- GPIO Group GPD -------- */
PAD_CFG_NF(GPD0, NONE, PWROK, NF1), /* -BATLOW */
PAD_CFG_NF(GPD1, NATIVE, PWROK, NF1), /* AC_PRESENT */
PAD_CFG_NF(GPD2, NATIVE, PWROK, NF1), /* -LANWAKE */
PAD_CFG_NF(GPD3, UP_20K, PWROK, NF1), /* -PWRSW_EC */
PAD_CFG_NF(GPD4, NONE, PWROK, NF1), /* -PCH_SLP_S3 */
PAD_CFG_NF(GPD5, NONE, PWROK, NF1), /* -PCH_SLP_S4 */
PAD_CFG_NF(GPD6, NONE, PWROK, NF1), /* -PCH_SLP_M */
PAD_NC(GPD7, NONE),
PAD_CFG_NF(GPD8, NONE, PWROK, NF1), /* SUSCLK_32K */
PAD_CFG_NF(GPD9, NONE, PWROK, NF1), /* -PCH_SLP_WLAN */
PAD_CFG_NF(GPD10, NONE, PWROK, NF1), /* -PCH_SLP_S5 */
PAD_CFG_NF(GPD11, NONE, PWROK, NF1), /* LANPHYPC */
/* ------- GPIO Community 3 ------- */
/* ------- GPIO Group GPP_F ------- */
PAD_NC(GPP_F0, NONE), /* NFC_ACTIVE */
PAD_NC(GPP_F1, NONE),
PAD_NC(GPP_F2, NONE),
PAD_NC(GPP_F3, NONE),
PAD_NC(GPP_F4, NONE), /* -WWAN_RESET */
PAD_NC(GPP_F5, UP_20K),
PAD_CFG_GPI_TRIG_OWN(GPP_F6, UP_20K, RSMRST, OFF, ACPI), /* -MIC_HW_EN (R961 to GND) */
PAD_CFG_GPI_TRIG_OWN(GPP_F7, UP_20K, RSMRST, OFF, ACPI), /* -INT_MIC_DTCT */
PAD_CFG_GPI_TRIG_OWN(GPP_F8, UP_20K, RSMRST, OFF, ACPI), /* WWAN_CFG0 */
PAD_CFG_GPI_TRIG_OWN(GPP_F9, UP_20K, RSMRST, OFF, ACPI), /* WWAN_CFG1 */
PAD_CFG_GPI_TRIG_OWN(GPP_F10, UP_20K, RSMRST, OFF, ACPI), /* WWAN_CFG2 */
PAD_CFG_GPI_TRIG_OWN(GPP_F11, UP_20K, RSMRST, OFF, ACPI), /* WWAN_CFG3 */
PAD_CFG_GPI_TRIG_OWN(GPP_F12, UP_20K, RSMRST, OFF, ACPI), /* PLANARID0 */
PAD_CFG_GPI_TRIG_OWN(GPP_F13, UP_20K, RSMRST, OFF, ACPI), /* PLANARID1 */
PAD_CFG_GPI_TRIG_OWN(GPP_F14, UP_20K, RSMRST, OFF, ACPI), /* PLANARID2 */
PAD_CFG_GPI_TRIG_OWN(GPP_F15, UP_20K, RSMRST, OFF, ACPI), /* PLANARID3 */
PAD_CFG_GPI_TRIG_OWN(GPP_F16, UP_20K, RSMRST, OFF, ACPI), /* MEMORYID0 */
PAD_CFG_GPI_TRIG_OWN(GPP_F17, UP_20K, RSMRST, OFF, ACPI), /* MEMORYID1 */
PAD_CFG_GPI_TRIG_OWN(GPP_F18, UP_20K, RSMRST, OFF, ACPI), /* MEMORYID2 */
PAD_CFG_GPI_TRIG_OWN(GPP_F19, UP_20K, RSMRST, OFF, ACPI), /* MEMORYID3 */
PAD_CFG_GPI_TRIG_OWN(GPP_F20, UP_20K, RSMRST, OFF, ACPI), /* MEMORYID4 */
PAD_NC(GPP_F21, UP_20K),
PAD_CFG_GPI_TRIG_OWN(GPP_F22, UP_20K, RSMRST, OFF, ACPI), /* -TAMPER_SW_DTCT */
PAD_CFG_GPI_TRIG_OWN(GPP_F23, UP_20K, RSMRST, OFF, ACPI), /* -SC_DTCT */
/* ------- GPIO Group GPP_G ------- */
PAD_NC(GPP_G0, NONE),
PAD_NC(GPP_G1, NONE),
PAD_NC(GPP_G2, NONE),
PAD_NC(GPP_G3, NONE),
PAD_NC(GPP_G4, NONE),
PAD_NC(GPP_G5, NONE),
PAD_NC(GPP_G6, NONE),
PAD_NC(GPP_G7, NONE),
};
void variant_config_gpios(void)
{
gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table));
}

View file

@ -0,0 +1,90 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <device/azalia_device.h>
const u32 cim_verb_data[] = {
0x10ec0298, // Vendor/Device ID: Realtek ALC298
0x17aa224b, // Subsystem ID
12,
AZALIA_SUBVENDOR(0, 0x17aa224b),
AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC(
AZALIA_INTEGRATED,
AZALIA_INTERNAL,
AZALIA_MIC_IN,
AZALIA_OTHER_DIGITAL,
AZALIA_COLOR_UNKNOWN,
AZALIA_NO_JACK_PRESENCE_DETECT,
4, 0
)),
AZALIA_PIN_CFG(0, 0x13, 0x40000000), // does not describe a jack or internal device
AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC(
AZALIA_INTEGRATED,
AZALIA_INTERNAL,
AZALIA_SPEAKER,
AZALIA_OTHER_ANALOG,
AZALIA_COLOR_UNKNOWN,
AZALIA_NO_JACK_PRESENCE_DETECT,
1, 0
)),
AZALIA_PIN_CFG(0, 0x17, AZALIA_PIN_CFG_NC(0)),
AZALIA_PIN_CFG(0, 0x18, AZALIA_PIN_DESC(
AZALIA_JACK,
AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_LEFT,
AZALIA_MIC_IN,
AZALIA_STEREO_MONO_1_8,
AZALIA_BLACK,
AZALIA_JACK_PRESENCE_DETECT,
3, 0
)),
AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_CFG_NC(0)),
AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_CFG_NC(0)),
AZALIA_PIN_CFG(0, 0x1d, 0x40648605), // does not describe a jack or internal device
AZALIA_PIN_CFG(0, 0x1e, AZALIA_PIN_CFG_NC(0)),
AZALIA_PIN_CFG(0, 0x1f, AZALIA_PIN_CFG_NC(0)),
AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC(
AZALIA_JACK,
AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_LEFT,
AZALIA_HP_OUT,
AZALIA_STEREO_MONO_1_8,
AZALIA_BLACK,
AZALIA_JACK_PRESENCE_DETECT,
2, 0
)),
0x80862809, // Vendor/Device ID: Intel Skylake HDMI
0x80860101, // Subsystem ID
4,
AZALIA_SUBVENDOR(2, 0x80860101),
AZALIA_PIN_CFG(2, 0x05, AZALIA_PIN_DESC(
AZALIA_JACK,
AZALIA_DIGITAL_DISPLAY,
AZALIA_DIGITAL_OTHER_OUT,
AZALIA_OTHER_DIGITAL,
AZALIA_COLOR_UNKNOWN,
AZALIA_JACK_PRESENCE_DETECT,
1, 0
)),
AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_DESC(
AZALIA_JACK,
AZALIA_DIGITAL_DISPLAY,
AZALIA_DIGITAL_OTHER_OUT,
AZALIA_OTHER_DIGITAL,
AZALIA_COLOR_UNKNOWN,
AZALIA_JACK_PRESENCE_DETECT,
1, 0
)),
AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC(
AZALIA_JACK,
AZALIA_DIGITAL_DISPLAY,
AZALIA_DIGITAL_OTHER_OUT,
AZALIA_OTHER_DIGITAL,
AZALIA_COLOR_UNKNOWN,
AZALIA_JACK_PRESENCE_DETECT,
1, 0
)),
};
const u32 pc_beep_verbs[] = {};
AZALIA_ARRAY_SIZES;

View file

@ -0,0 +1,44 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <cbfs.h>
#include <gpio.h>
#include <soc/gpio.h>
#include <soc/romstage.h>
#include <spd_bin.h>
#include <stdio.h>
static const struct pad_config memory_id_gpio_table[] = {
PAD_CFG_GPI_TRIG_OWN(GPP_F16, UP_20K, DEEP, OFF, ACPI), /* MEMORYID0 */
PAD_CFG_GPI_TRIG_OWN(GPP_F17, UP_20K, DEEP, OFF, ACPI), /* MEMORYID1 */
PAD_CFG_GPI_TRIG_OWN(GPP_F18, UP_20K, DEEP, OFF, ACPI), /* MEMORYID2 */
PAD_CFG_GPI_TRIG_OWN(GPP_F19, UP_20K, DEEP, OFF, ACPI), /* MEMORYID3 */
PAD_CFG_GPI_TRIG_OWN(GPP_F20, UP_20K, DEEP, OFF, ACPI), /* MEMORYID4 */
};
void mainboard_memory_init_params(FSPM_UPD *mupd)
{
int spd_idx;
char spd_name[20];
size_t spd_size;
FSP_M_CONFIG *mem_cfg = &mupd->FspmConfig;
mem_cfg->DqPinsInterleaved = true; /* DDR_DQ in interleave mode */
mem_cfg->CaVrefConfig = 2; /* VREF_CA to CH_A and VREF_DQ_B to CH_B */
mem_cfg->MemorySpdDataLen = CONFIG_DIMM_SPD_SIZE;
/* Get SPD for soldered RAM SPD (CH A) */
gpio_configure_pads(memory_id_gpio_table, ARRAY_SIZE(memory_id_gpio_table));
spd_idx = gpio_get(GPP_F16) | gpio_get(GPP_F17) << 1 | gpio_get(GPP_F18) << 2 |
gpio_get(GPP_F19) << 3 | gpio_get(GPP_F20) << 4;
printk(BIOS_DEBUG, "Detected MEMORY_ID = %d\n", spd_idx);
snprintf(spd_name, sizeof(spd_name), "spd_%d.bin", spd_idx);
mem_cfg->MemorySpdPtr00 = (uintptr_t)cbfs_map(spd_name, &spd_size);
/* Get SPD for memory slot (CH B) */
struct spd_block blk = { .addr_map = { [1] = 0x51, } };
get_spd_smbus(&blk);
dump_spd_info(&blk);
mem_cfg->MemorySpdPtr10 = (uintptr_t)blk.spd_array[1];
}

View file

@ -0,0 +1,86 @@
# SPDX-License-Identifier: GPL-2.0-only
chip soc/intel/skylake
device domain 0 on
device ref south_xhci on
register "usb2_ports" = "{
[0] = USB2_PORT_MID(OC0), // JUSB1 (USB-A always on)
[1] = USB2_PORT_MID(OC1), // JUSB2 (USB-A)
[2] = USB2_PORT_MID(OC_SKIP), // N/C
[3] = USB2_PORT_MID(OC_SKIP), // JUSBC (USB docking station)
[4] = USB2_PORT_MID(OC_SKIP), // JFPR (smartcard slot)
[5] = USB2_PORT_MID(OC_SKIP), // JWWAN (M.2 WWAN USB)
[6] = USB2_PORT_MID(OC_SKIP), // JWLAN (M.2 WLAN USB)
[7] = USB2_PORT_MID(OC_SKIP), // JCAM (webcam)
[8] = USB2_PORT_MID(OC_SKIP), // JFPR (fingerprint reader)
[9] = USB2_PORT_MID(OC_SKIP), // JLCD (touch panel)
}"
register "usb3_ports" = "{
[0] = USB3_PORT_DEFAULT(OC0), // JUSB1 (USB-A always on)
[1] = USB3_PORT_DEFAULT(OC1), // JUSB2 (USB-A)
[2] = USB3_PORT_DEFAULT(OC_SKIP), // JSD (SD card reader)
[3] = USB3_PORT_DEFAULT(OC_SKIP), // JUSB3 (USB docking station)
}"
end
# PCIe
# PCIe Controller 1 - 1x2 + 2x1
# PCIE 1-2 - RP1 - TB - CLKOUT0 - CLKREQ0
# PCIE 3 - RP3 - WLAN#1 - CLKOUT1 - CLKREQ1
# PCIE 4 - GBE - GBE - CLKOUT2 - CLKREQ2
# PCIe Controller 2 - 4x1
# PCIE 5 - RP5 - WLAN#2 - CLKOUT3 - CLKREQ3
# PCIE 6-8 - n/c
# PCIe Controller 3 - 1x4 (lane reversal)
# PCIE 9-12 - RP9 - SSD - CLKOUT5 - CLKREQ5
# TB - x2
device ref pcie_rp1 on
register "PcieRpClkReqSupport[0]" = "true"
register "PcieRpClkReqNumber[0]" = "0"
register "PcieRpClkSrcNumber[0]" = "0"
register "PcieRpAdvancedErrorReporting[0]" = "true"
register "PcieRpHotPlug[0]" = "true"
end
# M.2 WLAN#1 - x1
device ref pcie_rp3 on
register "PcieRpClkReqSupport[2]" = "true"
register "PcieRpClkReqNumber[2]" = "1"
register "PcieRpClkSrcNumber[2]" = "1"
register "PcieRpAdvancedErrorReporting[2]" = "true"
register "PcieRpLtrEnable[2]" = "true"
smbios_slot_desc "SlotTypeM2Socket1_DP" "SlotLengthOther" "M.2/A 2230" "SlotDataBusWidth1X"
end
# Ethernet (clobbers RP4)
device ref gbe on
register "LanClkReqSupported" = "true"
register "LanClkReqNumber" = "2"
register "PcieRpClkReqNumber[3]" = "2"
register "PcieRpClkSrcNumber[3]" = "2"
register "EnableLanLtr" = "true"
register "EnableLanK1Off" = "true"
end
# M.2 WLAN#2 - x1
device ref pcie_rp5 on
register "PcieRpClkReqSupport[4]" = "true"
register "PcieRpClkReqNumber[4]" = "3"
register "PcieRpClkSrcNumber[4]" = "3"
register "PcieRpAdvancedErrorReporting[4]" = "true"
register "PcieRpLtrEnable[4]" = "true"
smbios_slot_desc "SlotTypeM2Socket1_DP" "SlotLengthOther" "M.2/A 2230" "SlotDataBusWidth1X"
end
# M.2 2280 SSD - x4 (RP9)
device ref pcie_rp9 on
register "PcieRpClkReqSupport[8]" = "true"
register "PcieRpClkReqNumber[8]" = "5"
register "PcieRpClkSrcNumber[8]" = "5"
register "PcieRpAdvancedErrorReporting[8]" = "true"
register "PcieRpLtrEnable[8]" = "true"
smbios_slot_desc "SlotTypeM2Socket3" "SlotLengthOther" "M.2/M 2280" "SlotDataBusWidth4X"
end
end
end