/** @file
Source code for the board configuration init function in DXE init phase.
Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "BoardInitLib.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
// Null function for nothing GOP VBT update.
//
VOID
GopVbtSpecificUpdateNull(
IN CHILD_STRUCT **ChildStructPtr
);
//
// for CFL U DDR4
//
VOID
CflUDdr4GopVbtSpecificUpdate(
IN CHILD_STRUCT **ChildStructPtr
);
/**
Updates DIMM slots status for Desktop,server and workstation boards
**/
VOID
UpdateDimmPopulationConfig(
VOID
)
{
MEMORY_INFO_DATA_HOB *MemInfo;
UINT8 Slot0;
UINT8 Slot1;
UINT8 Slot2;
UINT8 Slot3;
CONTROLLER_INFO *ControllerInfo;
EFI_HOB_GUID_TYPE *GuidHob;
GuidHob = NULL;
MemInfo = NULL;
GuidHob = GetFirstGuidHob (&gSiMemoryInfoDataGuid);
ASSERT (GuidHob != NULL);
if (GuidHob != NULL) {
MemInfo = (MEMORY_INFO_DATA_HOB *) GET_GUID_HOB_DATA (GuidHob);
}
if (MemInfo != NULL) {
if (PcdGet8 (PcdPlatformFlavor) == FlavorDesktop ||
PcdGet8 (PcdPlatformFlavor) == FlavorUpServer ||
PcdGet8 (PcdPlatformFlavor) == FlavorWorkstation) {
ControllerInfo = &MemInfo->Controller[0];
Slot0 = ControllerInfo->ChannelInfo[0].DimmInfo[0].Status;
Slot1 = ControllerInfo->ChannelInfo[0].DimmInfo[1].Status;
Slot2 = ControllerInfo->ChannelInfo[1].DimmInfo[0].Status;
Slot3 = ControllerInfo->ChannelInfo[1].DimmInfo[1].Status;
//
// Channel 0 Channel 1
// Slot0 Slot1 Slot0 Slot1 - Population AIO board
// 0 0 0 0 - Invalid - Invalid
// 0 0 0 1 - Valid - Invalid
// 0 0 1 0 - Invalid - Valid
// 0 0 1 1 - Valid - Valid
// 0 1 0 0 - Valid - Invalid
// 0 1 0 1 - Valid - Invalid
// 0 1 1 0 - Invalid - Invalid
// 0 1 1 1 - Valid - Invalid
// 1 0 0 0 - Invalid - Valid
// 1 0 0 1 - Invalid - Invalid
// 1 0 1 0 - Invalid - Valid
// 1 0 1 1 - Invalid - Valid
// 1 1 0 0 - Valid - Valid
// 1 1 0 1 - Valid - Invalid
// 1 1 1 0 - Invalid - Valid
// 1 1 1 1 - Valid - Valid
//
if ((Slot0 && (Slot1 == 0)) || (Slot2 && (Slot3 == 0))) {
PcdSetBoolS (PcdDimmPopulationError, TRUE);
}
}
}
}
/**
Init Misc Platform Board Config Block.
@param[in] BoardId An unsigned integer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
BoardMiscInit (
IN UINT16 BoardId
)
{
// PcdSet64S (PcdFuncBoardHookPlatformSetupOverride, (UINT64) (UINTN) BoardHookPlatformSetup);
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS (PcdPssReadSN, TRUE);
PcdSet8S (PcdPssI2cSlaveAddress, 0x6E);
PcdSet8S (PcdPssI2cBusNumber, 0x04);
break;
default:
PcdSetBoolS (PcdPssReadSN, FALSE);
PcdSet8S (PcdPssI2cSlaveAddress, 0x6E);
PcdSet8S (PcdPssI2cBusNumber, 0x04);
break;
}
return EFI_SUCCESS;
}
/**
Init Platform Board Config Block for ACPI platform.
@param[in] BoardId An unsigned integer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
InitAcpiPlatformPcd (
IN UINT16 BoardId
)
{
TBT_INFO_HOB *TbtInfoHob = NULL;
TbtInfoHob = (TBT_INFO_HOB *) GetFirstGuidHob (&gTbtInfoHobGuid);
//
// Update OEM table ID
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
if ((TbtInfoHob != NULL) && (TbtInfoHob->DTbtControllerConfig[0].DTbtControllerEn == 1)) {
PcdSet64S (PcdXhciAcpiTableSignature, SIGNATURE_64 ('x', 'h', '_', 'c', 'm', 'u', 't', '3'));
} else {
PcdSet64S (PcdXhciAcpiTableSignature, SIGNATURE_64 ('x', 'h', '_', 'c', 'm', 'u', 'l', '3'));
}
break;
default:
PcdSet64S (PcdXhciAcpiTableSignature, 0);
break;
}
//
// Modify Preferred_PM_Profile field based on Board SKU's. Default is set to Mobile
//
PcdSet8S (PcdPreferredPmProfile, EFI_ACPI_2_0_PM_PROFILE_MOBILE);
//
// Assign FingerPrint, Gnss, TouchPanel, Audio related GPIO.
//
switch(BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet32S (PcdFingerPrintSleepGpio, GPIO_CNL_LP_GPP_B17);
PcdSet32S (PcdFingerPrintIrqGpio, GPIO_CNL_LP_GPP_B16);
//
// Configure WWAN Reset pin
//
PcdSet32S (PcdGnssResetGpio, GPIO_CNL_LP_GPP_F1);
PcdSet32S (PcdTouchpanelIrqGpio, GPIO_CNL_LP_GPP_D10);
PcdSet32S (PcdTouchpadIrqGpio, GPIO_CNL_LP_GPP_B3);
PcdSet32S (PcdHdaI2sCodecIrqGpio, GPIO_CNL_LP_GPP_C8);
break;
default:
break;
}
//
// Configure GPIOs for discrete USB BT module
//
switch(BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet32S (PcdBtIrqGpio, GPIO_CNL_LP_GPP_C11);
PcdSet32S (PcdBtRfKillGpio, GPIO_CNL_LP_GPP_B4);
break;
default:
break;
}
//
// Board Specific Init
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS(PcdCmlURtd3TableEnable, TRUE);
PcdSet8S (PcdHdaI2sCodecI2cBusNumber, 0); // I2S Audio Codec conntected to I2C0
PcdSet8S (PcdBleUsbPortNumber, 9);
break;
default:
break;
}
return EFI_SUCCESS;
}
/**
Init Common Platform Board Config Block.
@param[in] BoardId An unsigned integer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
InitCommonPlatformPcd (
IN UINT16 BoardId
)
{
PCD64_BLOB Data64;
//
// Enable EC SMI# for SMI
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet32S (PcdEcSmiGpio, GPIO_CNL_LP_GPP_E3);
PcdSet32S (PcdEcLowPowerExitGpio, GPIO_CNL_LP_GPP_B23);
break;
};
//
// HID I2C Interrupt GPIO.
//
switch (BoardId) {
default:
// on all supported boards interrupt input is on same GPIO pad. How convenient.
PcdSet32S (PcdHidI2cIntPad, GPIO_CNL_LP_GPP_D10);
break;
}
//
// PS2 KB Specific Init for Sds Serial platform.
//
if (BoardId == BoardIdCometLakeULpddr3Rvp) {
PcdSetBoolS (PcdDetectPs2KbOnCmdAck, TRUE);
} else {
PcdSetBoolS (PcdDetectPs2KbOnCmdAck, FALSE);
}
switch (BoardId) {
default:
PcdSetBoolS (PcdSpdAddressOverride, FALSE);
break;
}
//
// DDISelection
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet8S (PcdDDISelection, 1);
break;
default:
PcdSet8S (PcdDDISelection, 0);
break;
}
//
// GFX Detect
//
switch (BoardId) {
default:
// Not all the boards support GFX_CRB_DET. This is not an error.
Data64.BoardGpioConfig.Type = BoardGpioTypeNotSupported;
break;
}
PcdSet64S (PcdGfxCrbDetectGpio, Data64.Blob);
//
// USB Type-C
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS(PcdUsbTypeCSupport, TRUE);
// Discete Ports
PcdSet8S(PcdTypeCPortsSupported, 2);
// TBT Port 1 mapping and properties [TBT AIC]
PcdSet8S(PcdUsbTypeCPort1, 1);
PcdSet8S(PcdUsbTypeCPort1Pch, 5);
// TBT Port 2 mapping and properties [TBT AIC]
PcdSet8S(PcdUsbTypeCPort2, 2);
PcdSet8S(PcdUsbTypeCPort2Pch, 7);
break;
default:
PcdSetBoolS (PcdUsbTypeCSupport, FALSE);
break;
}
//
// Battery Present
//
switch (BoardId) {
default:
PcdSet8S (PcdBatteryPresent, BOARD_REAL_BATTERY_SUPPORTED | BOARD_VIRTUAL_BATTERY_SUPPORTED);
break;
}
//
// TS-on-DIMM temperature
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS (PcdTsOnDimmTemperature, TRUE);
break;
default:
PcdSetBoolS (PcdTsOnDimmTemperature, FALSE);
break;
}
//
// Real Battery 1 Control & Real Battery 2 Control
//
PcdSet8S (PcdRealBattery1Control, 1);
PcdSet8S (PcdRealBattery2Control, 2);
//
// Mipi Camera Sensor
//
PcdSetBoolS (PcdMipiCamSensor, FALSE);
//
// Mipi Camera Sensor Link Used
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet8S (PcdMipiCam0LinkUsed, 3);
PcdSet8S (PcdMipiCam1LinkUsed, 6);
PcdSet8S (PcdMipiCam2LinkUsed, 9);
PcdSet8S (PcdMipiCam3LinkUsed, 7);
break;
default:
break;
}
//
// H8S2113 SIO
//
switch(BoardId) {
default:
PcdSetBoolS (PcdH8S2113SIO, FALSE);
break;
}
//
// NCT6776F COM, SIO & HWMON
//
PcdSetBoolS (PcdNCT6776FCOM, FALSE);
PcdSetBoolS (PcdNCT6776FSIO, FALSE);
PcdSetBoolS (PcdNCT6776FHWMON, FALSE);
//
// SMC Runtime Sci Pin
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet32S (PcdSmcRuntimeSciPin, (UINT32) GPIO_CNL_LP_GPP_E16);
break;
default:
PcdSet32S (PcdSmcRuntimeSciPin, 0x00);
break;
}
//
// Convertable Dock Support
//
switch (BoardId) {
default:
PcdSetBoolS (PcdConvertableDockSupport, FALSE);
break;
}
//
// Ec Hotkey F3, F4, F5, F6, F7 and F8 Support
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet8S (PcdEcHotKeyF3Support, 1);
PcdSet8S (PcdEcHotKeyF4Support, 1);
PcdSet8S (PcdEcHotKeyF5Support, 1);
PcdSet8S (PcdEcHotKeyF6Support, 1);
PcdSet8S (PcdEcHotKeyF7Support, 1);
PcdSet8S (PcdEcHotKeyF8Support, 1);
break;
default:
PcdSet8S (PcdEcHotKeyF3Support, 0);
PcdSet8S (PcdEcHotKeyF4Support, 0);
PcdSet8S (PcdEcHotKeyF5Support, 0);
PcdSet8S (PcdEcHotKeyF6Support, 0);
PcdSet8S (PcdEcHotKeyF7Support, 0);
PcdSet8S (PcdEcHotKeyF8Support, 0);
break;
}
//
// Virtual Button Volume Up & Done Support
// Virtual Button Home Button Support
// Virtual Button Rotation Lock Support
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS (PcdVirtualButtonVolumeUpSupport, TRUE);
PcdSetBoolS (PcdVirtualButtonVolumeDownSupport, TRUE);
PcdSetBoolS (PcdVirtualButtonHomeButtonSupport, FALSE);
PcdSetBoolS (PcdVirtualButtonRotationLockSupport, FALSE);
break;
default:
PcdSetBoolS (PcdVirtualButtonVolumeUpSupport, FALSE);
PcdSetBoolS (PcdVirtualButtonVolumeDownSupport, FALSE);
PcdSetBoolS (PcdVirtualButtonHomeButtonSupport, FALSE);
PcdSetBoolS (PcdVirtualButtonRotationLockSupport, FALSE);
break;
}
//
// Slate Mode Switch Support
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS (PcdSlateModeSwitchSupport, TRUE);
break;
default:
PcdSetBoolS (PcdSlateModeSwitchSupport, FALSE);
break;
}
//
// Ac Dc Auto Switch Support
//
switch (BoardId) {
default:
PcdSetBoolS (PcdAcDcAutoSwitchSupport, TRUE);
break;
}
//
// Pm Power Button Gpio Pin
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet32S (PcdPmPowerButtonGpioPin, (UINT32) GPIO_CNL_LP_GPD3);
break;
default:
PcdSet32S (PcdPmPowerButtonGpioPin, 0x00);
break;
}
//
// Acpi Enable All Button Support
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS (PcdAcpiEnableAllButtonSupport, TRUE);
break;
default:
PcdSetBoolS (PcdAcpiEnableAllButtonSupport, FALSE);
break;
}
//
// Acpi Hid Driver Button Support
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS (PcdAcpiHidDriverButtonSupport, TRUE);
break;
default:
PcdSetBoolS (PcdAcpiHidDriverButtonSupport, FALSE);
break;
}
//
// USB Type C EC less
//
switch (BoardId) {
default:
PcdSetBoolS (PcdUsbTypeCEcLess, FALSE);
break;
}
return EFI_SUCCESS;
}
/**
Check if given rootport has device connected and enable wake capability
@param[in] RpNum An unsigned integer represent the root port number.
@retval TRUE if endpoint was connected
@retval FALSE if no endpoint was detected
**/
BOOLEAN
IsPcieEndPointPresent (
IN UINT8 RpNum
)
{
EFI_STATUS Status;
UINTN RpDev;
UINTN RpFun;
UINT64 RpBaseAddress;
Status = GetPchPcieRpDevFun (RpNum, &RpDev, &RpFun);
if (!EFI_ERROR (Status)) {
//
// check if device is present
//
RpBaseAddress = PCI_SEGMENT_LIB_ADDRESS (
DEFAULT_PCI_SEGMENT_NUMBER_PCH,
DEFAULT_PCI_BUS_NUMBER_PCH,
RpDev,
RpFun,
0
);
if ((PciSegmentRead16 (RpBaseAddress) != 0xFFFF) &&
(PciSegmentRead16 (RpBaseAddress + R_PCH_PCIE_CFG_SLSTS) & B_PCIE_SLSTS_PDS)) {
return TRUE;
}
}
return FALSE;
}
/**
Enable Tier2 GPIO Sci wake capability.
@param[in] BoardId An unsigned integrer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
Tier2GpioWakeSupport (
IN UINT16 BoardId
)
{
BOOLEAN Tier2GpioWakeEnable;
Tier2GpioWakeEnable = FALSE;
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
//
// Root port #14: M.2 WLAN
//
if (IsPcieEndPointPresent (13)) {
Tier2GpioWakeEnable = TRUE;
}
break;
default:
break;
}
PcdSetBoolS (PcdGpioTier2WakeEnable, Tier2GpioWakeEnable);
return EFI_SUCCESS;
}
/**
Board configuration init function for DXE phase.
@param Content pointer to the buffer contain init information for board init.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
EFIAPI
BoardConfigInit (
VOID
)
{
EFI_STATUS Status;
UINT16 BoardId;
BoardId = BoardIdCometLakeULpddr3Rvp;
Status = InitAcpiPlatformPcd (BoardId);
ASSERT_EFI_ERROR(Status);
Status = InitCommonPlatformPcd (BoardId);
ASSERT_EFI_ERROR(Status);
Status = BoardMiscInit (BoardId);
ASSERT_EFI_ERROR(Status);
Status = Tier2GpioWakeSupport (BoardId);
ASSERT_EFI_ERROR(Status);
return EFI_SUCCESS;
}