From 2f62a352ea3f62e58c166c430d37ec2d2565eeca Mon Sep 17 00:00:00 2001 From: Matthew Garrett Date: Tue, 24 Jul 2018 14:06:39 -0700 Subject: [PATCH] mb/51nb: Add support for the 51nb X210 The 51nb X210 is a replacement motherboard for Thinkpad X200/X201 systems, based on a modern Kabylake CPU. It also ships with no firmware protection, (IFD is fully unlocked, no protected regions are set, no Bootguard), making it an ideal coreboot target. This port is based on the support for the Skylake-based Purism Librem 13v3, with the following significant changes: * EC firmware is contained within the system SPI flash, and so a blob of EC firmware must be injected to a defined location during image build. * GPIO layout is different - this is currently just a raw import of the GPIO configuration from the vendor firmware * The system has two DIMMs, so an additional SPD address has been added * The USB port layout is different * The EC must be enabled at boot time through SuperIO-style logical device configuration * EC register layout is different, necessitating changes in the ACPI tables * The HDA pins are different * The genx_dec config is different All hardware appears to work as expected, although the SD reader is untested. Signed-off-by: Matthew Garrett Signed-off-by: Matt DeVillier Change-Id: If74621e76d703f629b54f1feb1acfc95cc72d183 Reviewed-on: https://review.coreboot.org/c/coreboot/+/32531 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons Reviewed-by: Felix Held --- Documentation/mainboard/51nb/x210.jpg | Bin 0 -> 48701 bytes Documentation/mainboard/51nb/x210.md | 45 +++++ Documentation/mainboard/index.md | 4 + src/mainboard/51nb/Kconfig | 19 +++ src/mainboard/51nb/Kconfig.name | 2 + src/mainboard/51nb/x210/Kconfig | 53 ++++++ src/mainboard/51nb/x210/Kconfig.name | 2 + src/mainboard/51nb/x210/Makefile.inc | 4 + src/mainboard/51nb/x210/acpi/battery.asl | 93 +++++++++++ src/mainboard/51nb/x210/acpi/ec.asl | 115 +++++++++++++ src/mainboard/51nb/x210/acpi/graphics.asl | 60 +++++++ src/mainboard/51nb/x210/acpi/mainboard.asl | 42 +++++ src/mainboard/51nb/x210/acpi/platform.asl | 37 +++++ src/mainboard/51nb/x210/acpi/superio.asl | 4 + src/mainboard/51nb/x210/board.fmd | 15 ++ src/mainboard/51nb/x210/board_info.txt | 8 + src/mainboard/51nb/x210/devicetree.cb | 167 +++++++++++++++++++ src/mainboard/51nb/x210/dsdt.asl | 34 ++++ src/mainboard/51nb/x210/gpio.h | 182 +++++++++++++++++++++ src/mainboard/51nb/x210/hda_verb.c | 40 +++++ src/mainboard/51nb/x210/mainboard.c | 22 +++ src/mainboard/51nb/x210/romstage.c | 45 +++++ 22 files changed, 993 insertions(+) create mode 100644 Documentation/mainboard/51nb/x210.jpg create mode 100644 Documentation/mainboard/51nb/x210.md create mode 100644 src/mainboard/51nb/Kconfig create mode 100644 src/mainboard/51nb/Kconfig.name create mode 100644 src/mainboard/51nb/x210/Kconfig create mode 100644 src/mainboard/51nb/x210/Kconfig.name create mode 100644 src/mainboard/51nb/x210/Makefile.inc create mode 100644 src/mainboard/51nb/x210/acpi/battery.asl create mode 100644 src/mainboard/51nb/x210/acpi/ec.asl create mode 100644 src/mainboard/51nb/x210/acpi/graphics.asl create mode 100644 src/mainboard/51nb/x210/acpi/mainboard.asl create mode 100644 src/mainboard/51nb/x210/acpi/platform.asl create mode 100644 src/mainboard/51nb/x210/acpi/superio.asl create mode 100644 src/mainboard/51nb/x210/board.fmd create mode 100644 src/mainboard/51nb/x210/board_info.txt create mode 100644 src/mainboard/51nb/x210/devicetree.cb create mode 100644 src/mainboard/51nb/x210/dsdt.asl create mode 100644 src/mainboard/51nb/x210/gpio.h create mode 100644 src/mainboard/51nb/x210/hda_verb.c create mode 100644 src/mainboard/51nb/x210/mainboard.c create mode 100644 src/mainboard/51nb/x210/romstage.c diff --git a/Documentation/mainboard/51nb/x210.jpg b/Documentation/mainboard/51nb/x210.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66fb7e3a8eabb1d874f58751a3db0d078e1b74a0 GIT binary patch literal 48701 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⪙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 + +/* + * The _PIC method is called by the OS to choose between interrupt + * routing via the i8259 interrupt controller or the APIC. + * + * _PIC is called with a parameter of 0 for i8259 configuration and + * with a parameter of 1 for Local Apic/IOAPIC configuration. + */ + +Method (_PIC, 1) +{ + /* Remember the OS' IRQ routing choice. */ + Store (Arg0, PICM) +} + +/* + * The _PTS method (Prepare To Sleep) is called before the OS is + * entering a sleep state. The sleep state number is passed in Arg0 + */ + +Method (_PTS, 1) +{ +} + +/* The _WAK method is called on system wakeup */ + +Method (_WAK, 1) +{ + Store(\_SB.PCI0.LPCB.EC.LIDC, \LIDS) + Store(\_SB.PCI0.LPCB.EC.ACIN, \PWRS) + Return (Package (){ 0, 0 }) +} diff --git a/src/mainboard/51nb/x210/acpi/superio.asl b/src/mainboard/51nb/x210/acpi/superio.asl new file mode 100644 index 0000000000..cb77a3c7a8 --- /dev/null +++ b/src/mainboard/51nb/x210/acpi/superio.asl @@ -0,0 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include diff --git a/src/mainboard/51nb/x210/board.fmd b/src/mainboard/51nb/x210/board.fmd new file mode 100644 index 0000000000..1955a05409 --- /dev/null +++ b/src/mainboard/51nb/x210/board.fmd @@ -0,0 +1,15 @@ +# +# Manually defined FMD in order to ensure that space is reserved for the EC +# at the base of the BIOS region. +# + +FLASH 8M { + BIOS@0x200000 0x600000 { + EC@0x0 0x10000 + RW_MRC_CACHE@0x10000 0x10000 + SMMSTORE@0x20000 0x40000 + CONSOLE@0x60000 0x20000 + FMAP@0x80000 0x200 + COREBOOT(CBFS) + } +} diff --git a/src/mainboard/51nb/x210/board_info.txt b/src/mainboard/51nb/x210/board_info.txt new file mode 100644 index 0000000000..65c46089bc --- /dev/null +++ b/src/mainboard/51nb/x210/board_info.txt @@ -0,0 +1,8 @@ +Vendor name: 51NB +Board name: Thinkpad X210 +Category: laptop +ROM package: SOIC8 +ROM protocol: SPI +ROM socketed: n +Flashrom support: y +Release year: 2017 diff --git a/src/mainboard/51nb/x210/devicetree.cb b/src/mainboard/51nb/x210/devicetree.cb new file mode 100644 index 0000000000..7ee3b2c87e --- /dev/null +++ b/src/mainboard/51nb/x210/devicetree.cb @@ -0,0 +1,167 @@ +chip soc/intel/skylake + + # Enable deep Sx states + register "deep_s3_enable_ac" = "1" + register "deep_s3_enable_dc" = "1" + register "deep_s5_enable_ac" = "1" + register "deep_s5_enable_dc" = "1" + register "deep_sx_config" = "DSX_EN_LAN_WAKE_PIN" + + register "eist_enable" = "1" + + # GPE configuration + # Note that GPE events called out in ASL code rely on this + # route. i.e. If this route changes then the affected GPE + # offset bits also need to be changed. + register "gpe0_dw0" = "GPP_C" + register "gpe0_dw1" = "GPP_D" + register "gpe0_dw2" = "GPP_E" + + register "gen1_dec" = "0x000c0081" + register "gen2_dec" = "0x000c0681" + register "gen3_dec" = "0x000c1641" + + # Enable "Intel Speed Shift Technology" + register "speed_shift_enable" = "1" + + # Disable DPTF + register "dptf_enable" = "0" + + # FSP Configuration + register "ProbelessTrace" = "0" + register "EnableLan" = "0" + register "EnableSata" = "1" + register "SataSalpSupport" = "1" + register "SataMode" = "0" + + # The X210 has 3 SATA ports: a full SATA port, mSATA, and SATA over M.2 + register "SataPortsEnable[0]" = "1" + register "SataPortsEnable[1]" = "1" + register "SataPortsEnable[2]" = "1" + register "SataPortsDevSlp[0]" = "1" + register "SataPortsDevSlp[1]" = "1" + register "SataPortsDevSlp[2]" = "1" + register "SataPwrOptEnable" = "1" + register "EnableAzalia" = "1" + register "DspEnable" = "0" + register "IoBufferOwnership" = "0" + register "EnableTraceHub" = "0" + register "SsicPortEnable" = "0" + register "SmbusEnable" = "1" + register "Cio2Enable" = "0" + register "ScsEmmcEnabled" = "0" + register "ScsEmmcHs400Enabled" = "0" + register "ScsSdCardEnabled" = "0" + register "PttSwitch" = "0" + register "SkipExtGfxScan" = "1" + register "Device4Enable" = "1" + register "HeciEnabled" = "1" + register "SaGv" = "SaGv_Enabled" + register "PmConfigSlpS3MinAssert" = "2" # 50ms + register "PmConfigSlpS4MinAssert" = "1" # 1s + register "PmConfigSlpSusMinAssert" = "3" # 500ms + register "PmConfigSlpAMinAssert" = "3" # 2s + register "PmTimerDisabled" = "0" + + register "serirq_mode" = "SERIRQ_CONTINUOUS" + + register "pirqa_routing" = "PCH_IRQ11" + register "pirqb_routing" = "PCH_IRQ10" + register "pirqc_routing" = "PCH_IRQ11" + register "pirqd_routing" = "PCH_IRQ11" + register "pirqe_routing" = "PCH_IRQ11" + register "pirqf_routing" = "PCH_IRQ11" + register "pirqg_routing" = "PCH_IRQ11" + register "pirqh_routing" = "PCH_IRQ11" + + register "PmConfigPciClockRun" = "1" + + # Enable Root Ports 3, 4 and 9 + register "PcieRpEnable[2]" = "1" # Ethernet controller + register "PcieRpClkReqSupport[2]" = "1" + register "PcieRpClkReqNumber[2]" = "0" + register "PcieRpClkSrcNumber[2]" = "0" + register "PcieRpAdvancedErrorReporting[2]" = "1" + register "PcieRpLtrEnable[2]" = "1" + + register "PcieRpEnable[3]" = "1" # Wireless controller + register "PcieRpClkReqSupport[3]" = "1" + register "PcieRpClkReqNumber[3]" = "1" + register "PcieRpClkSrcNumber[3]" = "1" + register "PcieRpAdvancedErrorReporting[3]" = "1" + register "PcieRpLtrEnable[3]" = "1" + + register "PcieRpEnable[8]" = "1" # NVMe controller + register "PcieRpClkReqSupport[8]" = "0" + register "PcieRpClkReqNumber[8]" = "2" + register "PcieRpClkSrcNumber[8]" = "2" + register "PcieRpAdvancedErrorReporting[8]" = "1" + register "PcieRpLtrEnable[8]" = "1" + + register "usb2_ports[0]" = "USB2_PORT_MID(OC1)" # Type-A Port (left) + register "usb2_ports[1]" = "USB2_PORT_MID(OC1)" # Type-A Port (left) + register "usb2_ports[5]" = "USB2_PORT_MID(OC1)" # Type-A Port (right) + register "usb2_ports[6]" = "USB2_PORT_FLEX(OC2)" # Webcam + register "usb2_ports[7]" = "USB2_PORT_FLEX(OC2)" # WiFi PCIe port USB + + register "usb3_ports[0]" = "USB3_PORT_DEFAULT(OC1)" # Type-A Port (left) + register "usb3_ports[1]" = "USB3_PORT_DEFAULT(OC1)" # Type-A Port (left) + register "usb3_ports[5]" = "USB3_PORT_DEFAULT(OC1)" # Type-A Port (right) + + # PL1 override 25W + register "tdp_pl1_override" = "25" + + # PL2 override 44W + register "tdp_pl2_override" = "44" + + # Send an extra VR mailbox command for the PS4 exit issue + register "SendVrMbxCmd" = "2" + + # Lock Down + register "common_soc_config" = "{ + .chipset_lockdown = CHIPSET_LOCKDOWN_COREBOOT, + }" + + device cpu_cluster 0 on + device lapic 0 on end + end + device domain 0 on + device pci 00.0 on end # Host Bridge + device pci 02.0 on end # Integrated Graphics Device + device pci 14.0 on end # USB xHCI + device pci 14.1 off end # USB xDCI (OTG) + device pci 14.2 on end # Thermal Subsystem + device pci 16.0 on end # Management Engine Interface 1 + device pci 16.1 off end # Management Engine Interface 2 + device pci 16.2 off end # Management Engine IDE-R + device pci 16.3 off end # Management Engine KT Redirection + device pci 16.4 off end # Management Engine Interface 3 + device pci 17.0 on end # SATA + device pci 1c.0 off end # PCI Express Port 1 + device pci 1c.1 off end # PCI Express Port 2 + device pci 1c.2 on end # PCI Express Port 3 + device pci 1c.3 on end # PCI Express Port 4 + device pci 1c.4 off end # PCI Express Port 5 + device pci 1c.5 off end # PCI Express Port 6 + device pci 1c.6 off end # PCI Express Port 7 + device pci 1c.7 off end # PCI Express Port 8 + device pci 1d.0 on end # PCI Express Port 9 + device pci 1d.1 off end # PCI Express Port 10 + device pci 1d.2 off end # PCI Express Port 11 + device pci 1d.3 off end # PCI Express Port 12 + device pci 1f.0 on + chip ec/51nb/npce985la0dx + device pnp 0c09.0 on end + device pnp 4e.5 on end + device pnp 4e.6 on end + device pnp 4e.11 on end + end + end # LPC Interface + device pci 1f.1 off end # P2SB + device pci 1f.2 on end # Power Management Controller + device pci 1f.3 on end # Intel HDA + device pci 1f.4 on end # SMBus + device pci 1f.5 off end # PCH SPI + device pci 1f.6 off end # GbE + end +end diff --git a/src/mainboard/51nb/x210/dsdt.asl b/src/mainboard/51nb/x210/dsdt.asl new file mode 100644 index 0000000000..441a80dd4a --- /dev/null +++ b/src/mainboard/51nb/x210/dsdt.asl @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include + +DefinitionBlock( + "dsdt.aml", + "DSDT", + 0x05, // DSDT revision: ACPI v5.0 + OEM_ID, + ACPI_TABLE_CREATOR, + 0x20110725 // OEM revision +) +{ + Name(\DSEN, 1) + + #include "acpi/platform.asl" + + #include + + #include + + Device (\_SB.PCI0) + { + #include + #include + #include "acpi/graphics.asl" + } + + #include + + // Mainboard specific + #include "acpi/mainboard.asl" +} diff --git a/src/mainboard/51nb/x210/gpio.h b/src/mainboard/51nb/x210/gpio.h new file mode 100644 index 0000000000..3e22ddee27 --- /dev/null +++ b/src/mainboard/51nb/x210/gpio.h @@ -0,0 +1,182 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#ifndef MAINBOARD_GPIO_H +#define MAINBOARD_GPIO_H + +#include +#include + +#ifndef __ACPI__ + +/* Pad configuration in ramstage. */ +static const struct pad_config gpio_table[] = { +/* RCIN# */_PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x0), +/* LAD0 */_PAD_CFG_STRUCT(GPP_A1, 0x44000702, 0x3c00), +/* LAD1 */_PAD_CFG_STRUCT(GPP_A2, 0x44000702, 0x3c00), +/* LAD2 */_PAD_CFG_STRUCT(GPP_A3, 0x44000702, 0x3c00), +/* LAD3 */_PAD_CFG_STRUCT(GPP_A4, 0x44000702, 0x3c00), +/* LFRAME# */_PAD_CFG_STRUCT(GPP_A5, 0x44000700, 0x0), +/* SERIRQ */_PAD_CFG_STRUCT(GPP_A6, 0x44000702, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A7, 0x44000201, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A8, 0x44000300, 0x3000), +/* CLKOUT_LPC0 */_PAD_CFG_STRUCT(GPP_A9, 0x44000700, 0x1000), +/* CLKOUT_LPC1 */_PAD_CFG_STRUCT(GPP_A10, 0x44000700, 0x1000), +/* GPIO */_PAD_CFG_STRUCT(GPP_A11, 0x44000200, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A12, 0x4000200, 0x0), +/* SUSWARN#/SUSPWRDNACK */_PAD_CFG_STRUCT(GPP_A13, 0x44000700, 0x0), +/* SUS_STAT# */_PAD_CFG_STRUCT(GPP_A14, 0x44000700, 0x0), +/* SUS_ACK# */_PAD_CFG_STRUCT(GPP_A15, 0x44000702, 0x3000), +/* CLKOUT_48 */_PAD_CFG_STRUCT(GPP_A16, 0x44000500, 0x0), +/* ISH_GP7 */_PAD_CFG_STRUCT(GPP_A17, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A18, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A19, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A20, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A21, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A22, 0x44000201, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_A23, 0x44000100, 0x1000), +/* n/a */_PAD_CFG_STRUCT(GPP_B0, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_B1, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B2, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B3, 0x84000102, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B4, 0x44000201, 0x0), +/* SRCCLKREQ0# */_PAD_CFG_STRUCT(GPP_B5, 0x44000700, 0x0), +/* SRCCLKREQ1# */_PAD_CFG_STRUCT(GPP_B6, 0x44000700, 0x0), +/* SRCCLKREQ2# */_PAD_CFG_STRUCT(GPP_B7, 0x44000702, 0x0), +/* SRCCLKREQ3# */_PAD_CFG_STRUCT(GPP_B8, 0x44000702, 0x0), +/* SRCCLKREQ4# */_PAD_CFG_STRUCT(GPP_B9, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B10, 0x44000102, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_B11, 0x44000700, 0x0), +/* SLP_S0# */_PAD_CFG_STRUCT(GPP_B12, 0x44000700, 0x0), +/* PLTRST# */_PAD_CFG_STRUCT(GPP_B13, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B14, 0x44000201, 0x1000), +/* GPIO */_PAD_CFG_STRUCT(GPP_B15, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B16, 0x84800102, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_B17, 0x84800102, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_B18, 0x84800102, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_B19, 0x44000300, 0x0), +/* GSPI1_CLK */_PAD_CFG_STRUCT(GPP_B20, 0x44000700, 0x1000), +/* GSPI1_MISO */_PAD_CFG_STRUCT(GPP_B21, 0x44000700, 0x1000), +/* GSPIO_MOSI */_PAD_CFG_STRUCT(GPP_B22, 0x44000700, 0x1000), +/* GPIO */_PAD_CFG_STRUCT(GPP_B23, 0x44000201, 0x1000), +/* SMBCLK */_PAD_CFG_STRUCT(GPP_C0, 0x44000702, 0x0), +/* SMBDATA */_PAD_CFG_STRUCT(GPP_C1, 0x44000702, 0x1000), +/* GPIO */_PAD_CFG_STRUCT(GPP_C2, 0x44000201, 0x1000), +/* SML0CLK */_PAD_CFG_STRUCT(GPP_C3, 0x44000702, 0x3000), +/* SML0DATA */_PAD_CFG_STRUCT(GPP_C4, 0x44000702, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_C5, 0x44800100, 0x1000), +/* RESERVED */_PAD_CFG_STRUCT(GPP_C6, 0xffffffff, 0xffffff00), +/* RESERVED */_PAD_CFG_STRUCT(GPP_C7, 0xffffffff, 0xffffff00), +/* UART0_RXD */_PAD_CFG_STRUCT(GPP_C8, 0x44000702, 0x3000), +/* UART0_TXD */_PAD_CFG_STRUCT(GPP_C9, 0x44000700, 0x0), +/* UART0_RTS# */_PAD_CFG_STRUCT(GPP_C10, 0x44000700, 0x0), +/* UART0_CTS# */_PAD_CFG_STRUCT(GPP_C11, 0x44000702, 0x0), +/* UART1_RXD */_PAD_CFG_STRUCT(GPP_C12, 0x44000702, 0x0), +/* UART1_TXD */_PAD_CFG_STRUCT(GPP_C13, 0x44000700, 0x0), +/* UART1_RTS# */_PAD_CFG_STRUCT(GPP_C14, 0x44000700, 0x0), +/* UART1_CTS# */_PAD_CFG_STRUCT(GPP_C15, 0x44000702, 0x0), +/* I2C0_SDA */_PAD_CFG_STRUCT(GPP_C16, 0x44000702, 0x3000), +/* I2C0_SCL */_PAD_CFG_STRUCT(GPP_C17, 0x44000702, 0x3000), +/* I2C1_SDA */_PAD_CFG_STRUCT(GPP_C18, 0x44000702, 0x3000), +/* I2C1_SCL */_PAD_CFG_STRUCT(GPP_C19, 0x44000702, 0x3000), +/* UART2_RXD */_PAD_CFG_STRUCT(GPP_C20, 0x44000702, 0x3000), +/* UART2_TXD */_PAD_CFG_STRUCT(GPP_C21, 0x44000700, 0x0), +/* UART2_RTS# */_PAD_CFG_STRUCT(GPP_C22, 0x44000700, 0x0), +/* UART2_CTS# */_PAD_CFG_STRUCT(GPP_C23, 0x44000702, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_D0, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_D1, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_D2, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_D3, 0x44000700, 0x0), +/* ISH_I2C2_SDA */_PAD_CFG_STRUCT(GPP_D4, 0x44000700, 0x0), +/* I2S_SFRM */_PAD_CFG_STRUCT(GPP_D5, 0x44000702, 0x3000), +/* I2S_TXD */_PAD_CFG_STRUCT(GPP_D6, 0x44000702, 0x3000), +/* I2S_RXD */_PAD_CFG_STRUCT(GPP_D7, 0x44000702, 0x3000), +/* I2S_SCLK */_PAD_CFG_STRUCT(GPP_D8, 0x44000702, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_D9, 0x44000102, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_D10, 0x44000102, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_D11, 0x44000102, 0x3000), +/* GPIO */_PAD_CFG_STRUCT(GPP_D12, 0x44000102, 0x3000), +/* ISH_UART0_RXD */_PAD_CFG_STRUCT(GPP_D13, 0x44000702, 0x3000), +/* ISH_UART0_TXD */_PAD_CFG_STRUCT(GPP_D14, 0x44000700, 0x3000), +/* ISH_UART0_RTS# */_PAD_CFG_STRUCT(GPP_D15, 0x44000700, 0x0), +/* ISH_UART0_CTS# */_PAD_CFG_STRUCT(GPP_D16, 0x44000702, 0x0), +/* DMIC_CLK1 */_PAD_CFG_STRUCT(GPP_D17, 0x44000700, 0x0), +/* DMIC_DATA1 */_PAD_CFG_STRUCT(GPP_D18, 0x44000700, 0x1000), +/* DMIC_CLK0 */_PAD_CFG_STRUCT(GPP_D19, 0x44000700, 0x0), +/* DMIC_DATA0 */_PAD_CFG_STRUCT(GPP_D20, 0x44000700, 0x1000), +/* n/a */_PAD_CFG_STRUCT(GPP_D21, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_D22, 0x44000700, 0x0), +/* ISH_I2C2_SCL */_PAD_CFG_STRUCT(GPP_D23, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E0, 0x44000200, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E1, 0x44800102, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E2, 0x44000300, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E3, 0x44000103, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E4, 0x44000300, 0x0), +/* SATA_DEVSLP1 */_PAD_CFG_STRUCT(GPP_E5, 0x4000700, 0x0), +/* SATA_DEVSLP2 */_PAD_CFG_STRUCT(GPP_E6, 0x4000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E7, 0x44000300, 0x0), +/* SATA_LED# */_PAD_CFG_STRUCT(GPP_E8, 0x44000700, 0x0), +/* USB_OC0# */_PAD_CFG_STRUCT(GPP_E9, 0x44000702, 0x0), +/* USB_OC1# */_PAD_CFG_STRUCT(GPP_E10, 0x44000702, 0x0), +/* USB_OC2# */_PAD_CFG_STRUCT(GPP_E11, 0x44000702, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E12, 0x44000300, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_E13, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_E14, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E15, 0x80880102, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E16, 0x84000102, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_E17, 0x44000702, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_E18, 0x44000700, 0x3000), +/* n/a */_PAD_CFG_STRUCT(GPP_E19, 0x44000700, 0x1000), +/* n/a */_PAD_CFG_STRUCT(GPP_E20, 0x44000702, 0x3000), +/* n/a */_PAD_CFG_STRUCT(GPP_E21, 0x44000702, 0x1000), +/* GPIO */_PAD_CFG_STRUCT(GPP_E22, 0x44000000, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_E23, 0x44000201, 0x1000), +/* BATLOW# */_PAD_CFG_STRUCT(GPD0, 0x4000702, 0x3000), +/* ACPRESENT */_PAD_CFG_STRUCT(GPD1, 0x4000702, 0x0), +/* LAN_WAKE# */_PAD_CFG_STRUCT(GPD2, 0x4000602, 0x3c00), +/* PWRBTN# */_PAD_CFG_STRUCT(GPD3, 0x4000702, 0x3000), +/* SLP_S3# */_PAD_CFG_STRUCT(GPD4, 0x4000700, 0x0), +/* SLP_S4# */_PAD_CFG_STRUCT(GPD5, 0x4000700, 0x0), +/* SLP_A# */_PAD_CFG_STRUCT(GPD6, 0x4000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPD7, 0x4000301, 0x0), +/* SUSCLK */_PAD_CFG_STRUCT(GPD8, 0x4000700, 0x0), +/* SLP_WLAN# */_PAD_CFG_STRUCT(GPD9, 0x4000700, 0x0), +/* SLP_S5# */_PAD_CFG_STRUCT(GPD10, 0x4000700, 0x0), +/* LANPHYPC */_PAD_CFG_STRUCT(GPD11, 0x4000700, 0x0), +/* SATAXPCIE3 */_PAD_CFG_STRUCT(GPP_F0, 0x44000700, 0x0), +/* SATAXPCIE4 */_PAD_CFG_STRUCT(GPP_F1, 0x44000700, 0x0), +/* SATAXPCIE5 */_PAD_CFG_STRUCT(GPP_F2, 0x44000700, 0x0), +/* SATAXPCIE6 */_PAD_CFG_STRUCT(GPP_F3, 0x44000700, 0x0), +/* SATAXPCIE7 */_PAD_CFG_STRUCT(GPP_F4, 0x44000702, 0x2003000), +/* SATA_DEVSLP3 */_PAD_CFG_STRUCT(GPP_F5, 0x44000702, 0x2003000), +/* SATA_DEVSLP4 */_PAD_CFG_STRUCT(GPP_F6, 0x44000702, 0x2003000), +/* SATA_DEVSLP5 */_PAD_CFG_STRUCT(GPP_F7, 0x44000702, 0x2003000), +/* SATA_DEVSLP6 */_PAD_CFG_STRUCT(GPP_F8, 0x44000702, 0x2003000), +/* SATA_DEVSLP7 */_PAD_CFG_STRUCT(GPP_F9, 0x44000702, 0x2003000), +/* n/a */_PAD_CFG_STRUCT(GPP_F10, 0x44000b02, 0x2003000), +/* n/a */_PAD_CFG_STRUCT(GPP_F11, 0x44000b02, 0x2003000), +/* SATA_SDATAOUT1 */_PAD_CFG_STRUCT(GPP_F12, 0x44000700, 0x0), +/* SATA_SDATAOUT2 */_PAD_CFG_STRUCT(GPP_F13, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_F14, 0x44000700, 0x0), +/* USB_OC4# */_PAD_CFG_STRUCT(GPP_F15, 0x44000700, 0x0), +/* USB_OC5# */_PAD_CFG_STRUCT(GPP_F16, 0x44000700, 0x0), +/* USB_OC6# */_PAD_CFG_STRUCT(GPP_F17, 0x44000700, 0x0), +/* USB_OC7# */_PAD_CFG_STRUCT(GPP_F18, 0x44000700, 0x0), +/* eDP_VDDEN */_PAD_CFG_STRUCT(GPP_F19, 0x44000700, 0x0), +/* eDP_BKLTEN */_PAD_CFG_STRUCT(GPP_F20, 0x44000700, 0x0), +/* eDP_BKLTCTL */_PAD_CFG_STRUCT(GPP_F21, 0x44000700, 0x0), +/* n/a */_PAD_CFG_STRUCT(GPP_F22, 0x44000700, 0x0), +/* GPIO */_PAD_CFG_STRUCT(GPP_F23, 0x44000102, 0x0), +/* FAN_TACH_0 */_PAD_CFG_STRUCT(GPP_G0, 0x44000700, 0x0), +/* FAN_TACH_1 */_PAD_CFG_STRUCT(GPP_G1, 0x44000700, 0x0), +/* FAN_TACH_2 */_PAD_CFG_STRUCT(GPP_G2, 0x44000700, 0x0), +/* FAN_TACH_3 */_PAD_CFG_STRUCT(GPP_G3, 0x44000700, 0x0), +/* FAN_TACH_4 */_PAD_CFG_STRUCT(GPP_G4, 0x44000700, 0x0), +/* FAN_TACH_5 */_PAD_CFG_STRUCT(GPP_G5, 0x44000702, 0x0), +/* FAN_TACH_6 */_PAD_CFG_STRUCT(GPP_G6, 0x44000700, 0x0), +/* FAN_TACH_7 */_PAD_CFG_STRUCT(GPP_G7, 0x44000700, 0x1000), +}; + +#endif + +#endif diff --git a/src/mainboard/51nb/x210/hda_verb.c b/src/mainboard/51nb/x210/hda_verb.c new file mode 100644 index 0000000000..973024a376 --- /dev/null +++ b/src/mainboard/51nb/x210/hda_verb.c @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include + +const u32 cim_verb_data[] = { + /* coreboot specific header */ + 0x14f15069, /* Codec Vendor / Device ID: Conexant CX20585 */ + 0x17aa2155, /* Subsystem ID */ + 12, /* Number of jacks (NID entries) */ + + 0x0017ff00, /* Function Reset */ + 0x0017ff00, /* Double Function Reset */ + 0x0017ff00, + 0x0017ff00, + + /* Bits 31:28 - Codec Address */ + /* Bits 27:20 - NID */ + /* Bits 19:8 - Verb ID */ + /* Bits 7:0 - Payload */ + + /* NID 0x01, HDA Codec Subsystem ID */ + AZALIA_SUBVENDOR(0, 0x17aa2155), + + /* Pin Widget Verb Table */ + AZALIA_PIN_CFG(0, 0x19, 0x042140f0), + AZALIA_PIN_CFG(0, 0x1a, 0x61a190f0), + AZALIA_PIN_CFG(0, 0x1b, 0x04a190f0), + AZALIA_PIN_CFG(0, 0x1c, 0x612140f0), + AZALIA_PIN_CFG(0, 0x1d, 0x601700f0), + AZALIA_PIN_CFG(0, 0x1e, 0x40f001f0), + AZALIA_PIN_CFG(0, 0x1f, 0x901701f0), + AZALIA_PIN_CFG(0, 0x1B, 0x40f001f0), + AZALIA_PIN_CFG(0, 0x22, 0x40f001f0), + AZALIA_PIN_CFG(0, 0x23, 0x90a601f0), +}; + +const u32 pc_beep_verbs[] = { +}; +AZALIA_ARRAY_SIZES; diff --git a/src/mainboard/51nb/x210/mainboard.c b/src/mainboard/51nb/x210/mainboard.c new file mode 100644 index 0000000000..4364dd1519 --- /dev/null +++ b/src/mainboard/51nb/x210/mainboard.c @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include +#include "gpio.h" + +void mainboard_silicon_init_params(FSP_SIL_UPD *params) +{ + /* Configure pads prior to SiliconInit() in case there's any + * dependencies during hardware initialization. */ + gpio_configure_pads(gpio_table, ARRAY_SIZE(gpio_table)); +} + +static void mainboard_enable(struct device *dev) +{ + /* Route 0x4e/4f to LPC */ + lpc_enable_fixed_io_ranges(LPC_IOE_EC_4E_4F); +} + +struct chip_operations mainboard_ops = { + .enable_dev = mainboard_enable, +}; diff --git a/src/mainboard/51nb/x210/romstage.c b/src/mainboard/51nb/x210/romstage.c new file mode 100644 index 0000000000..4ef10248c9 --- /dev/null +++ b/src/mainboard/51nb/x210/romstage.c @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include +#include +#include +#include +#include +#include + +static void mainboard_fill_rcomp_res_data(void *rcomp_ptr) +{ + /* Rcomp resistor */ + const u16 RcompResistor[3] = { 121, 81, 100 }; + memcpy(rcomp_ptr, RcompResistor, sizeof(RcompResistor)); +} + +static void mainboard_fill_rcomp_strength_data(void *rcomp_strength_ptr) +{ + /* Rcomp target */ + const u16 RcompTarget[5] = { 100, 40, 20, 20, 26 }; + memcpy(rcomp_strength_ptr, RcompTarget, sizeof(RcompTarget)); +} + +void mainboard_memory_init_params(FSPM_UPD *mupd) +{ + FSP_M_CONFIG *mem_cfg; + struct spd_block blk = { + .addr_map = { 0x50, 0x52 }, + }; + + mem_cfg = &mupd->FspmConfig; + + get_spd_smbus(&blk); + dump_spd_info(&blk); + assert(blk.spd_array[0][0] != 0); + + mainboard_fill_rcomp_res_data(&mem_cfg->RcompResistor); + mainboard_fill_rcomp_strength_data(&mem_cfg->RcompTarget); + + mem_cfg->DqPinsInterleaved = TRUE; + mem_cfg->MemorySpdDataLen = blk.len; + mem_cfg->MemorySpdPtr00 = (uintptr_t) blk.spd_array[0]; + mem_cfg->MemorySpdPtr10 = (uintptr_t) blk.spd_array[1]; +}