From 48be6b276a0d7d0376684eaa5c1d92b763f61cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Thu, 27 Jun 2019 12:19:18 +0200 Subject: [PATCH] mb/protectli/vault_kbl: Add FW6 support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Change-Id: I03e8e8db5d827fe113280f2a6376d364edf42870 Reviewed-on: https://review.coreboot.org/c/coreboot/+/33839 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons Reviewed-by: Frans Hendriks --- Documentation/mainboard/index.md | 1 + Documentation/mainboard/protectli/fw6.jpg | Bin 0 -> 50587 bytes Documentation/mainboard/protectli/fw6.md | 137 ++++++++ src/mainboard/protectli/Kconfig | 1 - src/mainboard/protectli/vault_kbl/Kconfig | 59 ++++ .../protectli/vault_kbl/Kconfig.name | 2 + .../protectli/vault_kbl/Makefile.inc | 8 + src/mainboard/protectli/vault_kbl/acpi/ec.asl | 0 .../protectli/vault_kbl/acpi/superio.asl | 0 .../protectli/vault_kbl/board_info.txt | 6 + src/mainboard/protectli/vault_kbl/bootblock.c | 17 + src/mainboard/protectli/vault_kbl/data.vbt | Bin 0 -> 4608 bytes .../protectli/vault_kbl/devicetree.cb | 309 ++++++++++++++++++ src/mainboard/protectli/vault_kbl/dsdt.asl | 25 ++ .../protectli/vault_kbl/gma-mainboard.ads | 16 + src/mainboard/protectli/vault_kbl/gpio.h | 180 ++++++++++ src/mainboard/protectli/vault_kbl/ramstage.c | 21 ++ src/mainboard/protectli/vault_kbl/romstage.c | 66 ++++ 18 files changed, 847 insertions(+), 1 deletion(-) create mode 100644 Documentation/mainboard/protectli/fw6.jpg create mode 100644 Documentation/mainboard/protectli/fw6.md create mode 100644 src/mainboard/protectli/vault_kbl/Kconfig create mode 100644 src/mainboard/protectli/vault_kbl/Kconfig.name create mode 100644 src/mainboard/protectli/vault_kbl/Makefile.inc create mode 100644 src/mainboard/protectli/vault_kbl/acpi/ec.asl create mode 100644 src/mainboard/protectli/vault_kbl/acpi/superio.asl create mode 100644 src/mainboard/protectli/vault_kbl/board_info.txt create mode 100644 src/mainboard/protectli/vault_kbl/bootblock.c create mode 100644 src/mainboard/protectli/vault_kbl/data.vbt create mode 100644 src/mainboard/protectli/vault_kbl/devicetree.cb create mode 100644 src/mainboard/protectli/vault_kbl/dsdt.asl create mode 100644 src/mainboard/protectli/vault_kbl/gma-mainboard.ads create mode 100644 src/mainboard/protectli/vault_kbl/gpio.h create mode 100644 src/mainboard/protectli/vault_kbl/ramstage.c create mode 100644 src/mainboard/protectli/vault_kbl/romstage.c diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index c509c960f0..11f964f34d 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -120,6 +120,7 @@ The boards in this section are not real mainboards, but emulators. ## Protectli - [FW2B / FW4B](protectli/fw2b_fw4b.md) +- [FW6A / FW6B / FW6C](protectli/fw6.md) ## Roda diff --git a/Documentation/mainboard/protectli/fw6.jpg b/Documentation/mainboard/protectli/fw6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c0b46d5a73b5fa99c242e9cc86812679b350691 GIT binary patch literal 50587 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 +#include +#include + +#define GPIO_DEV PNP_DEV(0x2e, IT8772F_GPIO) +#define UART_DEV PNP_DEV(0x2e, IT8772F_SP1) + +void bootblock_mainboard_early_init(void) +{ + ite_conf_clkin(GPIO_DEV, ITE_UART_CLK_PREDIVIDE_24); + ite_enable_3vsbsw(GPIO_DEV); + ite_kill_watchdog(GPIO_DEV); + ite_enable_serial(UART_DEV, CONFIG_TTYS0_BASE); +} diff --git a/src/mainboard/protectli/vault_kbl/data.vbt b/src/mainboard/protectli/vault_kbl/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..4379ed1a6e87de263d0796ce55c8cfd368dbacb4 GIT binary patch literal 4608 zcmeHKUu+a*5TCuhKYQQqUbkD6W5GHi!nHuVSD-?zve&ypk6!6ruhbGvxWXOMc+k=o zQ~bvnYeHf$_n-z1(I!4<@TH0I$ryQ2Nr;Lj{&|xZ6D69Mi17tjXaBSZG|&qPDu%h6 zZ@zDK?zc1Z{hM1c(9w_C?wzSvcPF}(2OWM;4pKXxI+DHFU5QwKY*$CBH{Ok3!`<+% za``+!p5vBCQC*KF4@?w_k-i3kO<~W-?%`sgIZ+sYa$;l@)A1z6_UtJX3u8kQg*;{l zw#LxHlv&52;bI=QAKJgWFxG|yq?0v9*Eg+Oj~H!kp|2j@KwZ5p+S;~ZlgtvG@!p}VGB(R4xa6YIpfP+gdKnf5H5D)|fyasp? zyb2fyh61R70N@2M01!a2oKV2Cf%A}Vr2zi0rI{sy=k2~>8M}mD_$CL6BAh2Ai|Fk> zyQ6SOeTUG1&-PhX7hNmowe%1<^teWVX!Xb{6r5GfN)DY@)0mtlQpkJPN}M&qE3Iag z|D5D0+>1}s``oZO;4A_NaXRb`*27jl0u#Ikp655ha_?ynf(WaF3OqubAwJ_{@GbF= z#J>>#L41ig;Ac=vyp;F>;%4Ga#Bt&t;zx;xi2aA)qUk9?z>c}Zxw6)gpm^bx1}L3y z^(S0?@OPSQBIZibmA0~q#xw%~xNLqI2GbNCwmdKhfx_kzE>f2(Q?}&!v^(x6Y2|9r z9h+t_M?(*NZe7dH04-#PO!Ic{Np-M|HZU)=Pc5@!*#Tg_E%Pu5tk&IYq*tZcMQIx? zdJFuT6MCTCk@MSs^ND7yfTh2B&ITBq4P4-k*8MkoR@RgSK2ByUOU)VIY42p<>I^LF zg71Q*GM>9f5pv6&XZ1Iyx%Y8elOBN%1_O|~5_CZX!jOO!un2OHw(BOrK4-6TqB<2K z)L0wz1{BdC1ncG*oFoEhcoq1E7!EOYoU!K^zQfcH8T*9cPfY!bF;2u)qPj_BaS?|_ z^%;@9B;xy``mxA97x6byHANPbuvt=L66==mprpPiv11Z`AgP~9>?;ZXl+=LCYGr&- zR+BQz%6M2-UzXWxGJYhhU&!ox8869dO^7WC;pUK<39-jQa--@idCqaA+K^r72xAhR zJ%b*}mKQjMq_1Wb-E#9MrS%A1_ExkS@`Ij*5vFSpqJzsYQd;EXsJ``xbM1j<9p?)p zdQRt0uJOjF+kJiokKtHtl+N4jb3Skm6 znqnwdAaG^7`l}M*z2?bt8EvI8c)a2RSN7XJ82*_meCXP2=(}fH4C7PV;rvrXmcoK|n>=*|VrrnhWYr&=jcO%###()8%e z{e;k1nTxVrr)bl@sVdgPn+?-vGgHg;^c#!k5O}alW6khagP=DWr*l(zJ)CjsL7*sj zIy#7Mc1_v{vV-8mDxx^A!E_oI>yjR?L{X;wNIsMT8}0RAE%NKHYEN4!d~oAhV{mO{ zE_kSMe4u|c3-5~t19By(%PC52#Rob>Egw=_(!0__2MWdQL;DN=gMky^joQ^OfPdR* zs?ks0y4JjgJlD{gyWrRsaxzJk`wqIi^00<`9e(DUW&n=P(QVOPH}9YAjgo)onU#UR E0bL-x9{>OV literal 0 HcmV?d00001 diff --git a/src/mainboard/protectli/vault_kbl/devicetree.cb b/src/mainboard/protectli/vault_kbl/devicetree.cb new file mode 100644 index 0000000000..d53e43eba3 --- /dev/null +++ b/src/mainboard/protectli/vault_kbl/devicetree.cb @@ -0,0 +1,309 @@ +chip soc/intel/skylake + + # Enable deep Sx states + register "deep_s3_enable_ac" = "0" + register "deep_s3_enable_dc" = "0" + register "deep_s5_enable_ac" = "1" + register "deep_s5_enable_dc" = "1" + register "deep_sx_config" = "DSX_EN_WAKE_PIN | DSX_DIS_AC_PRESENT_PD" + register "s0ix_enable" = "1" + + register "gpe0_dw0" = "GPP_B" + register "gpe0_dw1" = "GPP_D" + register "gpe0_dw2" = "GPP_E" + + register "gen1_dec" = "0x00fc0201" + register "gen2_dec" = "0x007c0a01" + register "gen3_dec" = "0x000c03e1" + register "gen4_dec" = "0x001c02e1" + + # Enable "Intel Speed Shift Technology" + register "speed_shift_enable" = "1" + register "eist_enable" = "1" + + # Disable DPTF + register "dptf_enable" = "0" + + # Enable VT-d + register "ignore_vtd" = "0" + + # Enable SERIRQ continuous + register "serirq_mode" = "SERIRQ_CONTINUOUS" + + register "tcc_offset" = "5" # TCC of 95C + + # FSP Configuration + register "ProbelessTrace" = "0" + register "EnableLan" = "0" + register "EnableSata" = "1" + register "SataSalpSupport" = "0" + register "SataMode" = "0" + register "SataPwrOptEnable" = "1" + register "EnableAzalia" = "0" + 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 "SkipExtGfxScan" = "1" + register "Device4Enable" = "0" + register "HeciEnabled" = "1" + register "PmTimerDisabled" = "1" + register "SaGv" = "SaGv_Enabled" + register "SaImguEnable" = "0" + register "IslVrCmd" = "2" + register "PmConfigSlpS3MinAssert" = "2" # 50ms + register "PmConfigSlpS4MinAssert" = "4" # 4s + register "PmConfigSlpSusMinAssert" = "1" # 500ms + register "PmConfigSlpAMinAssert" = "3" # 2s + + 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" + + # VR Settings Configuration for 4 Domains + #+----------------+-------+-------+-------+-------+ + #| Domain/Setting | SA | IA | GTUS | GTS | + #+----------------+-------+-------+-------+-------+ + #| Psi1Threshold | 20A | 20A | 20A | 20A | + #| Psi2Threshold | 4A | 5A | 5A | 5A | + #| Psi3Threshold | 1A | 1A | 1A | 1A | + #| Psi3Enable | 1 | 1 | 1 | 1 | + #| Psi4Enable | 1 | 1 | 1 | 1 | + #| ImonSlope | 0 | 0 | 0 | 0 | + #| ImonOffset | 0 | 0 | 0 | 0 | + #| IccMax | 7A | 34A | 35A | 35A | + #| VrVoltageLimit | 1.52V | 1.52V | 1.52V | 1.52V | + #| AcLoadline(ohm)| 10.3m | 2.4m | 3.1m | 3.1m | + #| DcLoadline(ohm)| 10.3m | 2.4m | 3.1m | 3.1m | + #+----------------+-------+-------+-------+-------+ + #Note: IccMax settings are moved to SoC code + register "domain_vr_config[VR_SYSTEM_AGENT]" = "{ + .vr_config_enable = 1, + .psi1threshold = VR_CFG_AMP(20), + .psi2threshold = VR_CFG_AMP(4), + .psi3threshold = VR_CFG_AMP(1), + .psi3enable = 1, + .psi4enable = 1, + .imon_slope = 0x0, + .imon_offset = 0x0, + .voltage_limit = 1520, + }" + + register "domain_vr_config[VR_IA_CORE]" = "{ + .vr_config_enable = 1, + .psi1threshold = VR_CFG_AMP(20), + .psi2threshold = VR_CFG_AMP(5), + .psi3threshold = VR_CFG_AMP(1), + .psi3enable = 1, + .psi4enable = 1, + .imon_slope = 0x0, + .imon_offset = 0x0, + .voltage_limit = 1520, + }" + + register "domain_vr_config[VR_GT_UNSLICED]" = "{ + .vr_config_enable = 1, + .psi1threshold = VR_CFG_AMP(20), + .psi2threshold = VR_CFG_AMP(5), + .psi3threshold = VR_CFG_AMP(1), + .psi3enable = 1, + .psi4enable = 1, + .imon_slope = 0x0, + .imon_offset = 0x0, + .voltage_limit = 1520, + }" + + register "domain_vr_config[VR_GT_SLICED]" = "{ + .vr_config_enable = 1, + .psi1threshold = VR_CFG_AMP(20), + .psi2threshold = VR_CFG_AMP(5), + .psi3threshold = VR_CFG_AMP(1), + .psi3enable = 1, + .psi4enable = 1, + .imon_slope = 0x0, + .imon_offset = 0x0, + .voltage_limit = 1520, + }" + + # Send an extra VR mailbox command for the PS4 exit issue + register "SendVrMbxCmd" = "2" + + # Enable SATA ports 1,2 + register "SataPortsEnable[0]" = "1" + register "SataPortsEnable[1]" = "1" + register "SataPortsEnable[2]" = "0" + register "SataPortsDevSlp[0]" = "0" + register "SataPortsDevSlp[1]" = "0" + + # Enable Root ports. 1-6 for LAN and Root Port 9 + register "PcieRpEnable[0]" = "1" + register "PcieRpEnable[1]" = "1" + register "PcieRpEnable[2]" = "1" + register "PcieRpEnable[3]" = "1" + register "PcieRpEnable[4]" = "1" + register "PcieRpEnable[5]" = "1" + register "PcieRpEnable[8]" = "1" # mPCIe WiFi + + # Enable Advanced Error Reporting for RP 1-6, 9 + register "PcieRpAdvancedErrorReporting[0]" = "1" + register "PcieRpAdvancedErrorReporting[1]" = "1" + register "PcieRpAdvancedErrorReporting[2]" = "1" + register "PcieRpAdvancedErrorReporting[3]" = "1" + register "PcieRpAdvancedErrorReporting[4]" = "1" + register "PcieRpAdvancedErrorReporting[5]" = "1" + register "PcieRpAdvancedErrorReporting[8]" = "1" + + # Enable Latency Tolerance Reporting Mechanism RP 1-6, 9 + register "PcieRpLtrEnable[0]" = "1" + register "PcieRpLtrEnable[1]" = "1" + register "PcieRpLtrEnable[2]" = "1" + register "PcieRpLtrEnable[3]" = "1" + register "PcieRpLtrEnable[4]" = "1" + register "PcieRpLtrEnable[5]" = "1" + register "PcieRpLtrEnable[8]" = "1" + + # Enable RP 9 CLKREQ# support + register "PcieRpClkReqSupport[8]" = "1" + # RP 9 uses CLKREQ0# + register "PcieRpClkReqNumber[8]" = "0" + + # Clocks 0-5 for RP 1-6 + register "PcieRpClkSrcNumber[0]" = "0" + register "PcieRpClkSrcNumber[1]" = "1" + register "PcieRpClkSrcNumber[2]" = "2" + register "PcieRpClkSrcNumber[3]" = "3" + register "PcieRpClkSrcNumber[4]" = "4" + register "PcieRpClkSrcNumber[5]" = "5" + # RP 9 shares CLKSRC5# with RP 6 + register "PcieRpClkSrcNumber[8]" = "5" + + + # USB 2.0 enable ports 1-8, disable ports 9-12 + register "usb2_ports[0]" = "USB2_PORT_SHORT(OC_SKIP)" # TYPE-A Port + register "usb2_ports[1]" = "USB2_PORT_SHORT(OC_SKIP)" # TYPE-A Port + register "usb2_ports[2]" = "USB2_PORT_SHORT(OC_SKIP)" # TYPE-A Port + register "usb2_ports[3]" = "USB2_PORT_SHORT(OC_SKIP)" # TYPE-A Port + register "usb2_ports[4]" = "USB2_PORT_SHORT(OC_SKIP)" # Type-A Port + register "usb2_ports[5]" = "USB2_PORT_SHORT(OC_SKIP)" # TYPE-A Port + register "usb2_ports[6]" = "USB2_PORT_SHORT(OC_SKIP)" # TYPE-A Port + register "usb2_ports[7]" = "USB2_PORT_SHORT(OC_SKIP)" # mPCIe slot + register "usb2_ports[8]" = "USB2_PORT_EMPTY" # Disabled + register "usb2_ports[9]" = "USB2_PORT_EMPTY" # Disabled + register "usb2_ports[10]" = "USB2_PORT_EMPTY" # Disabled + register "usb2_ports[11]" = "USB2_PORT_EMPTY" # Disabled + + # USB 3.0 enable ports 1-4, disable ports 5-6 + register "usb3_ports[0]" = "USB3_PORT_DEFAULT(OC_SKIP)" # TYPE-A Port + register "usb3_ports[1]" = "USB3_PORT_DEFAULT(OC_SKIP)" # TYPE-A Port + register "usb3_ports[2]" = "USB3_PORT_DEFAULT(OC_SKIP)" # TYPE-A Port + register "usb3_ports[3]" = "USB3_PORT_DEFAULT(OC_SKIP)" # TYPE-A Port + register "usb3_ports[4]" = "USB3_PORT_EMPTY" # Disabled + register "usb3_ports[5]" = "USB3_PORT_EMPTY" # Disabled + + register "SerialIoDevMode" = "{ \ + [PchSerialIoIndexI2C0] = PchSerialIoDisabled, \ + [PchSerialIoIndexI2C1] = PchSerialIoDisabled, \ + [PchSerialIoIndexI2C2] = PchSerialIoDisabled, \ + [PchSerialIoIndexI2C3] = PchSerialIoDisabled, \ + [PchSerialIoIndexI2C4] = PchSerialIoDisabled, \ + [PchSerialIoIndexI2C5] = PchSerialIoDisabled, \ + [PchSerialIoIndexSpi0] = PchSerialIoDisabled, \ + [PchSerialIoIndexSpi1] = PchSerialIoDisabled, \ + [PchSerialIoIndexUart0] = PchSerialIoDisabled, \ + [PchSerialIoIndexUart1] = PchSerialIoDisabled, \ + [PchSerialIoIndexUart2] = PchSerialIoDisabled, \ + }" + + # Lock Down CHIPSET_LOCKDOWN_COREBOOT + 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 08.0 off end # Gaussian Mixture Model + device pci 13.0 off end # Integrated Sensor Hub + device pci 14.0 on end # USB xHCI + device pci 14.1 off end # USB xDCI (OTG) + device pci 14.2 off end # Thermal Subsystem + device pci 14.3 off end # Camera I/O Host Controller + device pci 15.0 off end # I2C #0 + device pci 15.1 off end # I2C #1 + device pci 15.2 off end # I2C #2 + device pci 15.3 off end # I2C #3 + 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 19.0 off end # UART #2 + device pci 19.1 off end # I2C #5 + device pci 19.2 off end # I2C #4 + device pci 1c.0 on end # PCI Express Port 1 + device pci 1c.1 on 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 on end # PCI Express Port 5 + device pci 1c.5 on 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 # PCI Express Port 9 - WiFi + smbios_slot_desc + "SlotTypePciExpressMini52pinWithoutBSKO" + "SlotLengthShort" "WIFI1" "SlotDataBusWidth1X" + end + 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 1e.0 off end # UART #0 + device pci 1e.1 off end # UART #1 + device pci 1e.2 off end # GSPI #0 + device pci 1e.3 off end # GSPI #1 + device pci 1e.4 off end # eMMC + device pci 1e.5 off end # SDIO + device pci 1e.6 off end # SDCard + device pci 1f.0 on + chip superio/ite/it8772f + register "peci_tmpin" = "3" + register "tmpin1_mode" = "THERMAL_RESISTOR" + register "tmpin2_mode" = "THERMAL_RESISTOR" + # FAN2 available on fan header but unused + device pnp 2e.0 off end # FDC + device pnp 2e.1 on # Serial Port 1 + io 0x60 = 0x3f8 + irq 0x70 = 4 + end + device pnp 2e.4 on # Environment Controller + io 0x60 = 0xa40 + io 0x62 = 0xa30 + irq 0x70 = 9 + end + device pnp 2e.5 off end # Keyboard + device pnp 2e.6 off end # Mouse + device pnp 2e.7 off end # GPIO + device pnp 2e.a off end # IR + end + end # LPC Interface + device pci 1f.1 on end # P2SB + device pci 1f.2 on end # Power Management Controller + device pci 1f.3 off 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/protectli/vault_kbl/dsdt.asl b/src/mainboard/protectli/vault_kbl/dsdt.asl new file mode 100644 index 0000000000..624806ca04 --- /dev/null +++ b/src/mainboard/protectli/vault_kbl/dsdt.asl @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include +DefinitionBlock( + "dsdt.aml", + "DSDT", + 0x02, /* DSDT revision: ACPI v2.0 and up */ + OEM_ID, + ACPI_TABLE_CREATOR, + 0x20110725 /* OEM revision */ +) +{ + #include + #include + #include + + Device (\_SB.PCI0) + { + #include + #include + } + + #include +} diff --git a/src/mainboard/protectli/vault_kbl/gma-mainboard.ads b/src/mainboard/protectli/vault_kbl/gma-mainboard.ads new file mode 100644 index 0000000000..b7cae7837a --- /dev/null +++ b/src/mainboard/protectli/vault_kbl/gma-mainboard.ads @@ -0,0 +1,16 @@ +-- SPDX-License-Identifier: GPL-2.0-or-later +-- This file is part of the coreboot project. + +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 := + (HDMI1, + others => Disabled); + +end GMA.Mainboard; diff --git a/src/mainboard/protectli/vault_kbl/gpio.h b/src/mainboard/protectli/vault_kbl/gpio.h new file mode 100644 index 0000000000..3397d79882 --- /dev/null +++ b/src/mainboard/protectli/vault_kbl/gpio.h @@ -0,0 +1,180 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#ifndef _GPIOFW6B_H +#define _GPIOFW6B_H + +#include +#include + +#ifndef __ACPI__ + +/* Pad configuration in ramstage. */ +static const struct pad_config gpio_table[] = { +/* RCIN# */ PAD_CFG_NF(GPP_A0, NONE, DEEP, NF1), +/* LPC_LAD_0 */ PAD_CFG_NF(GPP_A1, 20K_PU, DEEP, NF1), +/* LPC_LAD_1 */ PAD_CFG_NF(GPP_A2, 20K_PU, DEEP, NF1), +/* LPC_LAD_2 */ PAD_CFG_NF(GPP_A3, 20K_PU, DEEP, NF1), +/* LPC_LAD_3 */ PAD_CFG_NF(GPP_A4, 20K_PU, DEEP, NF1), +/* LPC_FRAME */ PAD_CFG_NF(GPP_A5, NONE, DEEP, NF1), +/* LPC_SERIRQ */ PAD_CFG_NF(GPP_A6, NONE, DEEP, NF1), +/* PIRQA_N*/ PAD_CFG_TERM_GPO(GPP_A7, 1, NONE, DEEP), +/* LPC_CLKRUN */ PAD_CFG_NF(GPP_A8, NONE, DEEP, NF1), +/* PCH_LPC_CLK0 */ PAD_CFG_NF(GPP_A9, 20K_PD, DEEP, NF1), +/* PCH_LPC_CLK1 */ PAD_CFG_NF(GPP_A10, 20K_PD, DEEP, NF1), +/* PME# */ PAD_CFG_NF(GPP_A11, 20K_PU, DEEP, NF1), +/* ISH_GP6 */ PAD_NC(GPP_A12, NONE), +/* PCH_SUSPWRACB */ PAD_CFG_NF(GPP_A13, NONE, DEEP, NF1), +/* PCH_SUSSTAT */ PAD_CFG_NF(GPP_A14, NONE, DEEP, NF1), +/* PCH_SUSACK */ PAD_CFG_NF(GPP_A15, 20K_PD, DEEP, NF1), +/* SD_1P8_SEL */ PAD_NC(GPP_A16, NONE), +/* SD_PWR_EN */ PAD_NC(GPP_A17, NONE), +/* ISH_GP0 */ PAD_NC(GPP_A18, NONE), +/* ISH_GP1 */ PAD_NC(GPP_A19, NONE), +/* ISH_GP2 */ PAD_NC(GPP_A20, NONE), +/* ISH_GP3 */ PAD_NC(GPP_A21, NONE), +/* ISH_GP4 */ PAD_NC(GPP_A22, NONE), +/* ISH_GP5 */ PAD_NC(GPP_A23, NONE), +/* CORE_VID0 */ PAD_NC(GPP_B0, NONE), +/* CORE_VID1 */ PAD_NC(GPP_B1, NONE), +/* VRALERT_N */ PAD_CFG_NF(GPP_B2, NONE, DEEP, NF1), +/* CPU_GP2 */ PAD_NC(GPP_B3, NONE), +/* CPU_GP3 */ PAD_NC(GPP_B4, NONE), +/* SRCCLKREQ0_N */ PAD_CFG_NF(GPP_B5, NONE, DEEP, NF1), +/* SRCCLKREQ1_N*/ PAD_NC(GPP_B6, NONE), +/* SRCCLKREQ2_N*/ PAD_NC(GPP_B7, NONE), +/* SRCCLKREQ3_N*/ PAD_NC(GPP_B8, NONE), +/* SRCCLKREQ4_N*/ PAD_NC(GPP_B9, NONE), +/* SRCCLKREQ5_N*/ PAD_NC(GPP_B10, NONE), +/* EXT_PWR_GATE_N */ PAD_CFG_NF(GPP_B11, NONE, DEEP, NF1), +/* SLP_S0# */ PAD_CFG_NF(GPP_B12, NONE, DEEP, NF1), +/* PCH_PLT_RST */ PAD_CFG_NF(GPP_B13, NONE, DEEP, NF1), +/* SPKR */ PAD_CFG_NF(GPP_B14, 20K_PD, PLTRST, NF1), +/* GSPI0_CS_N */ PAD_NC(GPP_B15, NONE), +/* GSPI0_CLK */ PAD_NC(GPP_B16, NONE), +/* GSPI0_MISO */ PAD_NC(GPP_B17, NONE), +/* GSPI0_MOSI */ PAD_NC(GPP_B18, NONE), +/* GSPI1_CS_N */ PAD_NC(GPP_B19, NONE), +/* GSPI1_CLK */ PAD_NC(GPP_B20, NONE), +/* GSPI1_MISO */ PAD_NC(GPP_B21, NONE), +/* GSPI1_MOSI */ PAD_NC(GPP_B22, NONE), +/* SM1ALERT# */ PAD_NC(GPP_B23, NONE), +/* SMB_CLK */ PAD_CFG_NF(GPP_C0, NONE, DEEP, NF1), +/* SMB_DATA */ PAD_CFG_NF(GPP_C1, NONE, DEEP, NF1), +/* SMBALERT# */ PAD_CFG_NF(GPP_C2, NONE, DEEP, NF1), +/* SML0_CLK */ PAD_NC(GPP_C3, NONE), +/* SML0DATA */ PAD_NC(GPP_C4, NONE), +/* SML0ALERT# */ PAD_NC(GPP_C5, NONE), +/* UART0_RXD */ PAD_NC(GPP_C8, NONE), +/* UART0_TXD */ PAD_NC(GPP_C9, NONE), +/* UART0_CTS_N */ PAD_NC(GPP_C10, NONE), +/* UART0_RTS_N */ PAD_NC(GPP_C11, NONE), +/* UART1_RXD */ PAD_NC(GPP_C12, NONE), +/* UART1_TXD */ PAD_NC(GPP_C13, NONE), +/* UART1_CTS_N */ PAD_NC(GPP_C14, NONE), +/* UART1_RTS_N */ PAD_NC(GPP_C15, NONE), +/* I2C0_SDA */ PAD_NC(GPP_C16, NONE), +/* I2C0_SCL */ PAD_NC(GPP_C17, NONE), +/* I2C1_SDA */ PAD_NC(GPP_C18, NONE), +/* I2C1_SCL */ PAD_NC(GPP_C19, NONE), +/* UART2_RXD */ PAD_NC(GPP_C20, NONE), +/* UART2_TXD */ PAD_NC(GPP_C21, NONE), +/* UART2_CTS_N */ PAD_NC(GPP_C22, NONE), +/* UART2_RTS_N */ PAD_NC(GPP_C23, NONE), +/* ITCH_SPI_CS */ PAD_NC(GPP_D0, NONE), +/* ITCH_SPI_CLK */ PAD_NC(GPP_D1, NONE), +/* ITCH_SPI_MISO_1 */ PAD_NC(GPP_D2, NONE), +/* ITCH_SPI_MISO_0 */ PAD_NC(GPP_D3, NONE), +/* FLASHTRIG */ PAD_NC(GPP_D4, NONE), +/* ISH_I2C0_SDA */ PAD_NC(GPP_D5, NONE), +/* ISH_I2C0_SCL */ PAD_NC(GPP_D6, NONE), +/* ISH_I2C1_SDA */ PAD_NC(GPP_D7, NONE), +/* ISH_I2C1_SCL */ PAD_NC(GPP_D8, NONE), +/* GPP_D9 */ PAD_NC(GPP_D9, NONE), +/* GPP_D10 */ PAD_NC(GPP_D10, NONE), +/* GPP_D11 */ PAD_NC(GPP_D11, NONE), +/* GPP_D12 */ PAD_NC(GPP_D12, NONE), +/* ISH_UART0_RXD */ PAD_NC(GPP_D13, NONE), +/* ISH_UART0_TXD */ PAD_NC(GPP_D14, NONE), +/* ISH_UART0_RTS */ PAD_NC(GPP_D15, NONE), +/* ISH_UART0_CTS */ PAD_NC(GPP_D16, NONE), +/* DMIC_CLK_1 */ PAD_NC(GPP_D17, NONE), +/* DMIC_DATA_1 */ PAD_NC(GPP_D18, NONE), +/* DMIC_CLK_0 */ PAD_NC(GPP_D19, NONE), +/* DMIC_DATA_0 */ PAD_NC(GPP_D20, NONE), +/* ITCH_SPI_D2 */ PAD_NC(GPP_D21, NONE), +/* ITCH_SPI_D3 */ PAD_NC(GPP_D22, NONE), +/* I2S_MCLK */ PAD_NC(GPP_D23, NONE), +/* SATAXPCIE0 (TP8) */ PAD_NC(GPP_E0, NONE), +/* SATAXPCIE1 (TP9)*/ PAD_NC(GPP_E1, NONE), +/* SATAXPCIE2 (TP10) */ PAD_NC(GPP_E2, NONE), +/* CPU_GP0 */ PAD_NC(GPP_E3, NONE), +/* SATA_DEVSLP0 */ PAD_NC(GPP_E4, NONE), +/* SATA_DEVSLP1 */ PAD_NC(GPP_E5, NONE), +/* SATA_DEVSLP2 */ PAD_NC(GPP_E6, NONE), +/* CPU_GP1 */ PAD_NC(GPP_E7, NONE), +/* SATA_LED */ PAD_CFG_NF(GPP_E8, NONE, DEEP, NF1), +/* USB2_OC_0 */ PAD_NC(GPP_E9, NONE), +/* USB2_OC_1 */ PAD_NC(GPP_E10, NONE), +/* USB2_OC_2 */ PAD_NC(GPP_E11, NONE), +/* USB2_OC_3 */ PAD_NC(GPP_E12, NONE), +/* DDI1_HPD */ PAD_CFG_NF(GPP_E13, NONE, DEEP, NF1), +/* DDI2_HPD */ PAD_NC(GPP_E14, NONE), +/* DDI3_HPD */ PAD_NC(GPP_E15, NONE), +/* DDI4_HPD */ PAD_NC(GPP_E16, NONE), +/* EDP_HPD */ PAD_NC(GPP_E17, NONE), +/* DDPB_CTRLCLK */ PAD_CFG_NF(GPP_E18, NONE, DEEP, NF1), +/* DDPB_CTRLDATA */ PAD_CFG_NF(GPP_E19, 20K_PD, DEEP, NF1), +/* DDPC_CTRLCLK */ PAD_NC(GPP_E20, NONE), +/* DDPC_CTRLDATA */ PAD_NC(GPP_E21, NONE), +/* DDPD_CTRLCLK */ PAD_NC(GPP_E22, NONE), +/* DDPD_CTRLDATA */ PAD_NC(GPP_E23, NONE), +/* I2S2_SCLK */ PAD_NC(GPP_F0, NONE), +/* I2S2_SFRM */ PAD_NC(GPP_F1, NONE), +/* I2S2_TXD */ PAD_NC(GPP_F2, NONE), +/* I2S2_RXD */ PAD_NC(GPP_F3, NONE), +/* I2C2_SDA */ PAD_NC(GPP_F4, NONE), +/* I2C2_SCL */ PAD_NC(GPP_F5, NONE), +/* I2C3_SDA */ PAD_NC(GPP_F6, NONE), +/* I2C3_SCL */ PAD_NC(GPP_F7, NONE), +/* I2C4_SDA */ PAD_NC(GPP_F8, NONE), +/* I2C4_SDA */ PAD_NC(GPP_F9, NONE), +/* I2C5_SDA */ PAD_NC(GPP_F10, NONE), +/* I2C5_SCL */ PAD_NC(GPP_F11, NONE), +/* EMMC_CMD */ PAD_NC(GPP_F12, NONE), +/* EMMC_DATA0 */ PAD_NC(GPP_F13, NONE), +/* EMMC_DATA1 */ PAD_NC(GPP_F14, NONE), +/* EMMC_DATA2 */ PAD_NC(GPP_F15, NONE), +/* EMMC_DATA3 */ PAD_NC(GPP_F16, NONE), +/* EMMC_DATA4 */ PAD_NC(GPP_F17, NONE), +/* EMMC_DATA5 */ PAD_NC(GPP_F18, NONE), +/* EMMC_DATA6 */ PAD_NC(GPP_F19, NONE), +/* EMMC_DATA7 */ PAD_NC(GPP_F20, NONE), +/* EMMC_RCLK */ PAD_NC(GPP_F21, NONE), +/* EMMC_CLK */ PAD_NC(GPP_F22, NONE), +/* GPP_F23 */ PAD_NC(GPP_F23, NONE), +/* SD_CMD */ PAD_NC(GPP_G0, NONE), +/* SD_DATA0 */ PAD_NC(GPP_G1, NONE), +/* SD_DATA1 */ PAD_NC(GPP_G2, NONE), +/* SD_DATA2 */ PAD_NC(GPP_G3, NONE), +/* SD_DATA3 */ PAD_NC(GPP_G4, NONE), +/* SD_CD# */ PAD_NC(GPP_G5, NONE), +/* SD_CLK */ PAD_NC(GPP_G6, NONE), +/* SD_WP */ PAD_NC(GPP_G7, NONE), +/* PCH_BATLOW */ PAD_NC(GPD0, NONE), +/* ACPRESENT */ PAD_CFG_NF(GPD1, NONE, DEEP, NF1), +/* LAN_WAKE_N */ PAD_NC(GPD2, NONE), +/* PWRBTN */ PAD_CFG_NF(GPD3, 20K_PU, DEEP, NF1), +/* PM_SLP_S3# */ PAD_CFG_NF(GPD4, NONE, DEEP, NF1), +/* PM_SLP_S4# */ PAD_CFG_NF(GPD5, NONE, DEEP, NF1), +/* PM_SLP_SA# (TP7) */ PAD_CFG_NF(GPD6, NONE, DEEP, NF1), +/* GPD7_RSVD */ PAD_CFG_TERM_GPO(GPD7, 1, NONE, DEEP), +/* PM_SUSCLK */ PAD_CFG_NF(GPD8, NONE, DEEP, NF1), +/* SLP_WLAN# (TP6) */ PAD_NC(GPD9, NONE), +/* SLP_S5# (TP3) */ PAD_CFG_NF(GPD10, NONE, DEEP, NF1), +/* LANPHYC */ PAD_NC(GPD11, NONE), +}; + +#endif + +#endif diff --git a/src/mainboard/protectli/vault_kbl/ramstage.c b/src/mainboard/protectli/vault_kbl/ramstage.c new file mode 100644 index 0000000000..e9273ba907 --- /dev/null +++ b/src/mainboard/protectli/vault_kbl/ramstage.c @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include +#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)); + + params->TurboMode = 1; + params->PchThermalDeviceEnable = 0; + params->PchPort61hEnable = 1; + params->CdClock = 3; +} diff --git a/src/mainboard/protectli/vault_kbl/romstage.c b/src/mainboard/protectli/vault_kbl/romstage.c new file mode 100644 index 0000000000..e65151bc0e --- /dev/null +++ b/src/mainboard/protectli/vault_kbl/romstage.c @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* This file is part of the coreboot project. */ + +#include +#include +#include +#include + +static void mainboard_fill_dq_map_data(void *dq_map_ch0, void *dq_map_ch1) +{ + const u8 dq_map[2][12] = { + { 0x0F, 0xF0, 0x00, 0xF0, 0x0F, 0xF0, + 0x0F, 0x00, 0xFF, 0x00, 0xFF, 0x00 }, + { 0x33, 0xCC, 0x00, 0xCC, 0x33, 0xCC, + 0x33, 0x00, 0xFF, 0x00, 0xFF, 0x00 } }; + memcpy(dq_map_ch0, dq_map[0], sizeof(dq_map[0])); + memcpy(dq_map_ch1, dq_map[1], sizeof(dq_map[1])); +} + +static void mainboard_fill_dqs_map_data(void *dqs_map_ch0, void *dqs_map_ch1) +{ + const u8 dqs_map[2][8] = { + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 1, 0, 2, 3, 4, 5, 6, 7 } }; + memcpy(dqs_map_ch0, dqs_map[0], sizeof(dqs_map[0])); + memcpy(dqs_map_ch1, dqs_map[1], sizeof(dqs_map[1])); +} + +static void mainboard_fill_rcomp_res_data(void *rcomp_ptr) +{ + const u16 RcompResistor[3] = { 121, 81, 100 }; + memcpy(rcomp_ptr, RcompResistor, sizeof(RcompResistor)); +} + +static void mainboard_fill_rcomp_strength_data(void *rcomp_strength_ptr) +{ + static 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; + mem_cfg = &mupd->FspmConfig; + + mainboard_fill_dq_map_data(&mem_cfg->DqByteMapCh0, + &mem_cfg->DqByteMapCh1); + mainboard_fill_dqs_map_data(&mem_cfg->DqsMapCpu2DramCh0, + &mem_cfg->DqsMapCpu2DramCh1); + mainboard_fill_rcomp_res_data(&mem_cfg->RcompResistor); + mainboard_fill_rcomp_strength_data(&mem_cfg->RcompTarget); + + struct spd_block blk = { + .addr_map = { 0x50, 0x52, }, + }; + + mem_cfg->DqPinsInterleaved = 1; + mem_cfg->CaVrefConfig = 2; + + get_spd_smbus(&blk); + dump_spd_info(&blk); + + mem_cfg->MemorySpdDataLen = blk.len; + mem_cfg->MemorySpdPtr00 = (uintptr_t)blk.spd_array[0]; + mem_cfg->MemorySpdPtr10 = (uintptr_t)blk.spd_array[1]; +}