/** @file This file is SampleCode of the library for Intel PCH PEI Policy initialization. /** @file ;****************************************************************************** ;* Copyright (c) 2020, Insyde Software Corp. All Rights Reserved. ;* ;* You may not reproduce, distribute, publish, display, perform, modify, adapt, ;* transmit, broadcast, present, recite, release, license or otherwise exploit ;* any part of this publication in any form, by any means, without the prior ;* written permission of Insyde Software Corporation. ;* ;****************************************************************************** */ /** @file @copyright INTEL CONFIDENTIAL Copyright 2004 - 2021 Intel Corporation. The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material may contain trade secrets and proprietary and confidential information of Intel Corporation and its suppliers and licensors, and is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel's prior express written permission. No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing. Unless otherwise agreed by Intel in writing, you may not remove or alter this notice or any other notice embedded in Materials by Intel or Intel's suppliers or licensors in any way. This file contains a 'Sample Driver' and is licensed as such under the terms of your license agreement with Intel or your vendor. This file may be modified by the user, subject to the additional terms of the license agreement. @par Specification Reference: **/ #include "PeiPchPolicyUpdate.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if FixedPcdGetBool (PcdDTbtEnable) == 1 #include #endif #include #include #include #include #include #include #include #if FixedPcdGet8(PcdFspModeSelection) == 1 #include #include #endif #if FixedPcdGet8(PcdEmbeddedEnable) == 0x1 #include #endif #include //[-start-191111-IB10189001-add]// #include #include #include #include #include //[-end-191111-IB10189001-add]// //[-start-201112-IB16810138-remove]// //#if FixedPcdGetBool(PcdCapsuleEnable) == 1 //[-end-201112-IB16810138-remove]// #include //[-start-201030-IB16810136-add]// #include #include #include //[-end-201030-IB16810136-add]// /** Return if input ImageGuid belongs to a FMP device which would perform BIOS update @param[in] ImageGuid A pointer to GUID @retval TRUE ImageGuid belongs to a FMP which would perform BIOS update @retval FALSE ImageGuid does not belong to a FMP which would perform BIOS update **/ BOOLEAN IsFmpGuidForBiosUpdate ( IN EFI_GUID *ImageGuid, OUT SYSTEM_FIRMWARE_COMPONENT *UpdatingComponent ) { if (CompareGuid (ImageGuid, &gFmpDevicePlatformMonolithicGuid)) { *UpdatingComponent = UpdatingTypeMax; return TRUE; } else if (CompareGuid (ImageGuid, &gFmpDevicePlatformBiosGuid)) { *UpdatingComponent = UpdatingBios; return TRUE; } else if (CompareGuid (ImageGuid, &gFmpDevicePlatformBtGAcmGuid)) { *UpdatingComponent = UpdatingBtGAcm; return TRUE; } else if (CompareGuid (ImageGuid, &gFmpDevicePlatformuCodeGuid)) { *UpdatingComponent = UpdatinguCode; return TRUE; } return FALSE; } /** Detect if there is a FMP capsule which would perform BIOS update @retval TRUE Such capsule is detected. @retval FALSE No such capsules there. **/ BOOLEAN IsFmpCapsuleForBiosUpdateDetected ( OUT SYSTEM_FIRMWARE_COMPONENT *UpdatingComponent ) { EFI_PEI_HOB_POINTERS HobPointer; EFI_CAPSULE_HEADER *CapsuleHeader; EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader; EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader; UINTN Index; UINT64 *ItemOffsetList; // // Search all capsule images from hob // HobPointer.Raw = GetHobList (); while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE, HobPointer.Raw)) != NULL) { CapsuleHeader = (EFI_CAPSULE_HEADER *) (UINTN) HobPointer.Capsule->BaseAddress; // // Must be a nested FMP capsule or FMP capsule with pre-defined GUIDs // if (IsFmpGuidForBiosUpdate (&CapsuleHeader->CapsuleGuid, UpdatingComponent)) { CapsuleHeader = (EFI_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize); } if (!CompareGuid (&gEfiFmpCapsuleGuid, &CapsuleHeader->CapsuleGuid)) { HobPointer.Raw = GET_NEXT_HOB (HobPointer); continue; } FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize); ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1); for (Index = FmpCapsuleHeader->EmbeddedDriverCount; Index < (UINT32)FmpCapsuleHeader->EmbeddedDriverCount + FmpCapsuleHeader->PayloadItemCount; Index++) { ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[Index]); if (IsFmpGuidForBiosUpdate (&ImageHeader->UpdateImageTypeId, UpdatingComponent)) { DEBUG ((DEBUG_INFO, "A FMP capsule for BIOS update is detected.\n")); return TRUE; } } HobPointer.Raw = GET_NEXT_HOB (HobPointer); } return FALSE; } //[-start-201030-IB16810136-add]// /** Check whether H2O system firmware update is required. @retval TRUE System firmware Update is going to happen during this boot. @retval FALSE No request of system firmware update is detected. **/ STATIC BOOLEAN IsSystemFirmwareUpdatePending ( VOID ) { EFI_STATUS Status; UINT32 Progress; if (!FeaturePcdGet (PcdH2OBiosUpdateFaultToleranceEnabled)) { return FALSE; } if (DetectPendingUpdateImage ()) { return TRUE; } Status = GetFirmwareUpdateProgress (&Progress); if (!EFI_ERROR (Status)) { return (Progress < FlashMax); } return FALSE; } //[-end-201030-IB16810136-add]// /** Check if BIOS Update is going to happen during this boot. This function checks: 1. If BootMode is BOOT_ON_FLASH_UPDATE and there is a Capsule to update BIOS region detected. 2. If BIOS update is in progress in the last boot. If one of above confictions stands, set a GUID HOB as an indication to be consumed in DXE/BDS and return TRUE. Otherwise, return FALSE. @retval TRUE BIOS Update is going to happen during this boot. @retval FALSE No request of BIOS update is detected. **/ STATIC BOOLEAN IsBiosUpdateRequired ( VOID ) { EFI_HOB_GUID_TYPE *GuidHob; SYSTEM_FIRMWARE_COMPONENT UpdatingComponent; //[-start-211208-IB16810176-add]// BOOLEAN TopSwapStatus; //[-end-211208-IB16810176-add]// GuidHob = NULL; UpdatingComponent = 0xFF; GuidHob = GetFirstGuidHob (&gSysFwUpdateProgressGuid); //[-start-201030-IB16810136-modify]// if (((GetBootModeHob () == BOOT_ON_FLASH_UPDATE) && IsFmpCapsuleForBiosUpdateDetected (&UpdatingComponent)) || \ (SpiIsTopSwapEnabled ()) || \ ((GuidHob != NULL) && \ ((((SYSTEM_FIRMWARE_UPDATE_PROGRESS *) GET_GUID_HOB_DATA (GuidHob))->Component == UpdatingBios) || \ (((SYSTEM_FIRMWARE_UPDATE_PROGRESS *) GET_GUID_HOB_DATA (GuidHob))->Component == UpdatingBtGAcm) || \ (((SYSTEM_FIRMWARE_UPDATE_PROGRESS *) GET_GUID_HOB_DATA (GuidHob))->Component == UpdatinguCode) || \ (((SYSTEM_FIRMWARE_UPDATE_PROGRESS *) GET_GUID_HOB_DATA (GuidHob))->Component == UpdatingResiliency))) || \ IsSystemFirmwareUpdatePending ()) { //[-end-201030-IB16810136-modify]// // // Build gSkipBiosLockForSysFwUpdateGuid HOB if it does not exist. // GuidHob = GetFirstGuidHob (&gSkipBiosLockForSysFwUpdateGuid); if (GuidHob == NULL) { DEBUG ((DEBUG_INFO, "Build gSkipBiosLockForSysFwUpdateGuid HOB to reset system before EndOfDxe\n")); BuildGuidHob (&gSkipBiosLockForSysFwUpdateGuid, 0); } //[-start-211208-IB16810176-add]// GuidHob = GetFirstGuidHob (&gChasmfallsTopSwapStatusGuid); if (GuidHob == NULL) { TopSwapStatus = SpiIsTopSwapEnabled (); BuildGuidDataHob (&gChasmfallsTopSwapStatusGuid, &TopSwapStatus, sizeof(BOOLEAN)); DEBUG ((DEBUG_INFO, "Build gChasmfallsTopSwapStatusGuid HOB to record the top swap, status = %d\n", TopSwapStatus)); } //[-end-211208-IB16810176-add]// return TRUE; } return FALSE; } //[-start-201112-IB16810138-remove]// //#else // FixedPcdGetBool(PcdCapsuleEnable) != 1 ///** // Check if BIOS Update is going to happen during this boot. // // @retval TRUE BIOS Update is going to happen during this boot. // @retval FALSE No request of BIOS update is detected. // //**/ //STATIC //BOOLEAN //IsBiosUpdateRequired ( // VOID // ) //{ // return FALSE; //} //#endif //[-end-201112-IB16810138-remove]// /** This is helper function for getting I2C Pads Internal Termination settings from Pcd @param[in] Index I2C Controller Index **/ UINT8 STATIC GetSerialIoI2cPadsTerminationFromPcd ( IN UINT8 Index ) { switch (Index) { case 0: return PcdGet8 (PcdPchSerialIoI2c0PadInternalTerm); case 1: return PcdGet8 (PcdPchSerialIoI2c1PadInternalTerm); case 2: return PcdGet8 (PcdPchSerialIoI2c2PadInternalTerm); case 3: return PcdGet8 (PcdPchSerialIoI2c3PadInternalTerm); case 4: return PcdGet8 (PcdPchSerialIoI2c4PadInternalTerm); case 5: return PcdGet8 (PcdPchSerialIoI2c5PadInternalTerm); case 6: return PcdGet8 (PcdPchSerialIoI2c6PadInternalTerm); case 7: return PcdGet8 (PcdPchSerialIoI2c7PadInternalTerm); default: ASSERT (FALSE); // Invalid I2C Controller Index } return 0; } /** This function performs PCH Serial IO Platform Policy initialization @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd A VOID pointer @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] DebugConfigData Pointer to DEBUG_CONFIG_DATA buffer @param[in] SetupVariables Pointer to SETUP_DATA buffer **/ VOID UpdateSerialIoConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN DEBUG_CONFIG_DATA *DebugConfigData, IN SETUP_DATA *SetupVariables ) { UINT8 Index; UINT8 CsIndex; #if FixedPcdGet8(PcdFspModeSelection) == 0 SERIAL_IO_CONFIG *SerialIoConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gSerialIoConfigGuid, (VOID *) &SerialIoConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif // // SPI // for (Index = 0; Index < GetPchMaxSerialIoSpiControllersNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoSpiMode[Index], SerialIoConfig->SpiDeviceConfig[Index].Mode, (UINT8)(SERIAL_IO_SPI_MODE)PchSetup->PchSerialIoSpi[Index]); } for (Index = 0; Index < GetPchMaxSerialIoSpiControllersNum (); Index++) { for (CsIndex = 0; CsIndex < PCH_MAX_SERIALIO_SPI_CHIP_SELECTS; CsIndex++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoSpiCsPolarity[PCH_MAX_SERIALIO_SPI_CHIP_SELECTS * Index + CsIndex], SerialIoConfig->SpiDeviceConfig[Index].CsPolarity[CsIndex], PchSetup->PchSpiCsPolarity[PCH_MAX_SERIALIO_SPI_CHIP_SELECTS * Index + CsIndex]); } } // // SPI1 chip select polarity must be adjusted to connected peripheral device // switch (SetupVariables->PchSpiFingerPrintType) { case 0: break; case 1: //FPC1011 case 2: //FPC1020 case 6: //FPC1021 default: UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoSpiCsPolarity[2], SerialIoConfig->SpiDeviceConfig[1].CsPolarity[0], SerialIoSpiCsActiveLow); break; } // // I2C // for (Index = 0; Index < GetPchMaxSerialIoI2cControllersNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoI2cMode[Index], SerialIoConfig->I2cDeviceConfig[Index].Mode, (UINT8)(SERIAL_IO_I2C_MODE)PchSetup->PchSerialIoI2c[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchSerialIoI2cPadsTermination[Index], SerialIoConfig->I2cDeviceConfig[Index].PadTermination, GetSerialIoI2cPadsTerminationFromPcd (Index)); } if (IsPchP () || IsPchN ()) { UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.PchSerialIoI2cSdaPinMux[0], SerialIoConfig->I2cDeviceConfig[0].PinMux.Sda, GPIO_VER2_P_MUXING_SERIALIO_I2C0_SDA_GPP_H4); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.PchSerialIoI2cSclPinMux[0], SerialIoConfig->I2cDeviceConfig[0].PinMux.Scl, GPIO_VER2_P_MUXING_SERIALIO_I2C0_SCL_GPP_H5); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.PchSerialIoI2cSdaPinMux[1], SerialIoConfig->I2cDeviceConfig[1].PinMux.Sda, GPIO_VER2_P_MUXING_SERIALIO_I2C1_SDA_GPP_H6); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.PchSerialIoI2cSclPinMux[1], SerialIoConfig->I2cDeviceConfig[1].PinMux.Scl, GPIO_VER2_P_MUXING_SERIALIO_I2C1_SCL_GPP_H7); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.PchSerialIoI2cSdaPinMux[7], SerialIoConfig->I2cDeviceConfig[7].PinMux.Sda, GPIO_VER2_P_MUXING_SERIALIO_I2C7_SDA_GPP_H12); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.PchSerialIoI2cSclPinMux[7], SerialIoConfig->I2cDeviceConfig[7].PinMux.Scl, GPIO_VER2_P_MUXING_SERIALIO_I2C7_SCL_GPP_H13); } // // UART // for (Index = 0; Index < GetPchMaxSerialIoUartControllersNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartMode[Index], SerialIoConfig->UartDeviceConfig[Index].Mode, (UINT8)(SERIAL_IO_UART_MODE)PchSetup->PchSerialIoUart[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartAutoFlow[Index], SerialIoConfig->UartDeviceConfig[Index].Attributes.AutoFlow, PchSetup->PchUartHwFlowCtrl[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartPowerGating[Index], SerialIoConfig->UartDeviceConfig[Index].PowerGating, PchSetup->PchUartPowerGating[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartDmaEnable[Index], SerialIoConfig->UartDeviceConfig[Index].DmaEnable, PchSetup->PchUartDmaEnable[Index]); } // // UART0 still can be enabled even if CNVi is present, for example, there are 2 pin sets {C8 - C11} and {F0 - F3} for UART0 pin out on TGP-LP. // The reason that need to disable UART0 is because {F0-F3} is occupied by CNVi RF signals and {C8 - C11} are for WWAN and TouchPad. // if (CnviIsPresent ()) { if (IsAdlPch () && (IsPchP () || IsPchN ())) { UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartMode[2], SerialIoConfig->UartDeviceConfig[2].Mode, SerialIoUartDisabled); } else { UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartMode[0], SerialIoConfig->UartDeviceConfig[0].Mode, SerialIoUartDisabled); } } else { // Route Uart pin outs to UART0 when CNVi is not present if (IsAdlPch () ) { UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartRxPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Rx, 0); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartTxPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Tx, 0); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartRtsPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Rts, 0); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartCtsPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Cts, 0); } else if (IsPchH()) { UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartRxPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Rx, GPIO_VER2_H_MUXING_SERIALIO_UART0_RXD_GPP_C8); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartTxPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Tx, GPIO_VER2_H_MUXING_SERIALIO_UART0_TXD_GPP_C9); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartRtsPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Rts, GPIO_VER2_H_MUXING_SERIALIO_UART0_RTS_GPP_C10); UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SerialIoUartCtsPinMuxPolicy[0], SerialIoConfig->UartDeviceConfig[0].PinMux.Cts, GPIO_VER2_H_MUXING_SERIALIO_UART0_CTS_GPP_C11); } } if ((PchSetup->OsDebugPort != 0) && (PchSetup->OsDebugPort <= GetPchMaxSerialIoUartControllersNum ())) { // // This UART controller will be used as OS debug port // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartMode[PchSetup->OsDebugPort - 1], SerialIoConfig->UartDeviceConfig[PchSetup->OsDebugPort - 1].Mode, SerialIoUartHidden); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartDbg2[PchSetup->OsDebugPort - 1], SerialIoConfig->UartDeviceConfig[PchSetup->OsDebugPort - 1].DBG2, TRUE); } //[-start-180830-IB15590135-add]// // // Since PCH UART has been initialized, skip re-init in SerialIoUartInit. // Re-init PCH UART makes DDT in BUSY state, because it reset MMIO and PCH UART settings. // if ((FeaturePcdGet (PcdDebugUsePchComPort) == TRUE)) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartMode[PcdGet8 (PcdSerialIoUartNumber)], SerialIoConfig->UartDeviceConfig[PchSetup->OsDebugPort - 1].Mode, SerialIoUartSkipInit); } //[-end-180830-IB15590135-add[]// // // If SerialIO UART is disabled in policy but used for debug, then // override the policy setting // DEBUG_CODE_BEGIN(); //[-start-190710-IB11270240-modify]// // // For build // //if (GetDebugInterface () & STATUS_CODE_USE_SERIALIO) { if (PcdGet8(PcdStatusCodeFlags) & STATUS_CODE_USE_SERIALIO) { //[-end-190710-IB11270240-modify]// UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartBaudRate[DebugConfigData->SerialIoUartDebugControllerNumber], SerialIoConfig->UartDeviceConfig[DebugConfigData->SerialIoUartDebugControllerNumber].Attributes.BaudRate, DebugConfigData->SerialIoUartDebugBaudRate ); UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartDataBits[DebugConfigData->SerialIoUartDebugControllerNumber], SerialIoConfig->UartDeviceConfig[DebugConfigData->SerialIoUartDebugControllerNumber].Attributes.DataBits, DebugConfigData->SerialIoUartDebugDataBits ); UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartStopBits[DebugConfigData->SerialIoUartDebugControllerNumber], SerialIoConfig->UartDeviceConfig[DebugConfigData->SerialIoUartDebugControllerNumber].Attributes.StopBits, DebugConfigData->SerialIoUartDebugStopBits ); UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartParity[DebugConfigData->SerialIoUartDebugControllerNumber], SerialIoConfig->UartDeviceConfig[DebugConfigData->SerialIoUartDebugControllerNumber].Attributes.Parity, DebugConfigData->SerialIoUartDebugParity ); UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartAutoFlow[DebugConfigData->SerialIoUartDebugControllerNumber], SerialIoConfig->UartDeviceConfig[DebugConfigData->SerialIoUartDebugControllerNumber].Attributes.AutoFlow, DebugConfigData->SerialIoUartDebugFlowControl ); } DEBUG_CODE_END(); } /** This function updates USB OverCurrent policy mapping based on board design @param[in] UsbConfig Pointer to USB_CONFIG data buffer @param[in] FspsUpd A VOID pointer **/ VOID UpdateUsbOverCurrentPolicy ( IN USB_CONFIG *UsbConfig, IN VOID *FspsUpd ) { USB_OC_MAP_TABLE *UsbOcMappingTable; UINT8 PortIndex; UINT8 PortCount; // // Updating USB2 OC pin mapping // UsbOcMappingTable = (USB_OC_MAP_TABLE *) PcdGet32 (PcdUsb2OverCurrentPinTable); if (UsbOcMappingTable == NULL) { DEBUG ((DEBUG_ERROR, "UpdateUsbOverCurrentPolicy: No data for USB2 OC pin mapping provided.\n")); return; } // // Warning for size mismatch between data and port count // if (UsbOcMappingTable->Size != GetPchUsb2MaxPhysicalPortNum ()) { DEBUG (( DEBUG_WARN, "UpdateUsbOverCurrentPolicy: Mismatch between USB2 OC mapping table size and port count. Got: %d\n", UsbOcMappingTable->Size )); } // // To avoid overflow get minimum from either table size or max USB2 port count // PortCount = MIN (GetPchUsb2MaxPhysicalPortNum (), UsbOcMappingTable->Size); DEBUG ((DEBUG_INFO, "UpdateUsbOverCurrentPolicy: Updating USB OC mapping for %d USB2 ports.\n", PortCount)); for (PortIndex = 0; PortIndex < PortCount; PortIndex++) { if ((UsbOcMappingTable->Data[PortIndex] < USB_OC_MAX_PINS) || (UsbOcMappingTable->Data[PortIndex] == USB_OC_SKIP)) { UPDATE_POLICY ( ((FSPS_UPD *)FspsUpd)->FspsConfig.Usb2OverCurrentPin[PortIndex], UsbConfig->PortUsb20[PortIndex].OverCurrentPin, UsbOcMappingTable->Data[PortIndex] ); } else { DEBUG ((DEBUG_ERROR, "UpdateUsbOverCurrentPolicy: Invalid OverCurrent pin specified USB2 port %d\n", PortIndex)); } } // // Updating USB3 OC pin mapping // UsbOcMappingTable = (USB_OC_MAP_TABLE *) PcdGet32 (PcdUsb3OverCurrentPinTable); if (UsbOcMappingTable == NULL) { DEBUG ((DEBUG_INFO, "UpdateUsbOverCurrentPolicy: No data for USB3 OC pin mapping provided.\n")); return; } // // Warning for size mismatch between data and port count // if (UsbOcMappingTable->Size != GetPchXhciMaxUsb3PortNum ()) { DEBUG (( DEBUG_WARN, "UpdateUsbOverCurrentPolicy: Mismatch between USB3 OC mapping table size and port count. Got: %d\n", UsbOcMappingTable->Size )); } // // To avoid overflow get minimum from either table size or max USB2 port count // PortCount = MIN (GetPchXhciMaxUsb3PortNum (), UsbOcMappingTable->Size); DEBUG ((DEBUG_INFO, "UpdateUsbOverCurrentPolicy: Updating USB OC mapping for %d USB3 ports.\n", PortCount)); for (PortIndex = 0; PortIndex < PortCount; PortIndex++) { if ((UsbOcMappingTable->Data[PortIndex] < USB_OC_MAX_PINS) || (UsbOcMappingTable->Data[PortIndex] == USB_OC_SKIP)) { UPDATE_POLICY ( ((FSPS_UPD *)FspsUpd)->FspsConfig.Usb3OverCurrentPin[PortIndex], UsbConfig->PortUsb30[PortIndex].OverCurrentPin, UsbOcMappingTable->Data[PortIndex] ); } else { DEBUG ((DEBUG_ERROR, "UpdateUsbOverCurrentPolicy: Invalid OverCurrent pin specified USB3 port %d\n", PortIndex)); } } } /** This function updates USB2 PortResetMessageEnable policy for PCH USB2 Ports those are paired with CPU XHCI Ports based on board design. @param[in] UsbConfig Pointer to USB_CONFIG data buffer @param[in] FspsUpd A VOID pointer **/ VOID UpdateUsb2PortResetMessageEnablePolicy ( IN USB_CONFIG *UsbConfig, IN VOID *FspsUpd ) { UINT8 TypeCUsb2PortIndex; UINT8 TypeCUsbPortType; UINT8 CpuUsb30PortEnableMap; UINT8 TcssCpuUsb30PortIndex; BOOLEAN ValidTcssCpuUsb30Port; // // Get CPU USB30 enable port map. // CpuUsb30PortEnableMap = PcdGet8 (PcdCpuUsb30PortEnable); // // Check CPU TypeC port map to USB 2.0 // if (PcdGetBool (PcdUsbTypeCSupport)) { // // Get TypeC port 1 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort1Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort1Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort1Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 2 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort2Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort2Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort2Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 3 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort3Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort3Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort3Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 4 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort4Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort4Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort4Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 5 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort5Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort5Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort5Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 6 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort6Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort6Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort6Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 7 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort7Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort7Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort7Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 8 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort8Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort8Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort8Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port 9 PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPort9Pch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPort9Properties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPort9Properties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } // // Get TypeC port A PCH USB2 Port Index and Properties // TypeCUsb2PortIndex = PcdGet8 (PcdUsbTypeCPortAPch); TypeCUsbPortType = ((PcdGet8 (PcdUsbCPortAProperties) >> USB_TYPEC_PORT_TYPE_BIT_OFFSET) & USB_TYPEC_PORT_TYPE_MASK); ValidTcssCpuUsb30Port = FALSE; if ((TypeCUsbPortType == USB_TYPEC_CPU) || (TypeCUsbPortType == USB_TYPEA_CPU)) { TcssCpuUsb30PortIndex = ((PcdGet8 (PcdUsbCPortAProperties) >> TCSS_TYPEC_ROOT_PORT_INDEX_BIT_OFFSET) & TCSS_TYPEC_ROOT_PORT_INDEX_MASK); if ((CpuUsb30PortEnableMap & (BIT0 << TcssCpuUsb30PortIndex)) != 0) { ValidTcssCpuUsb30Port = TRUE; } } // // Check TypeC port PCH USB2 Port Index is non-zero and it is paired with CPU XHCI Port // if ((TypeCUsb2PortIndex != 0) && ValidTcssCpuUsb30Port) { UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortResetMessageEnable [TypeCUsb2PortIndex - 1], UsbConfig->PortUsb20[TypeCUsb2PortIndex - 1].PortResetMessageEnable, TRUE ); } } } /** Update Usb config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateUsbConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINTN PortIndex; //[-start-190410-IB16990021-add]// PORT_CONFIG UsbPortConfig; PORT_CONFIG Usb3PortConfig; //[-end-190410-IB16990021-add]// USB_CONFIG *UsbConfig; #if FixedPcdGet8(PcdFspModeSelection) == 0 EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gUsbConfigGuid, (VOID *) &UsbConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #else UsbConfig = NULL; #endif //[-start-190410-IB16990021-add]// UsbPortConfig.Value = PcdGet64 (PcdH2OChipsetUsbPortEnable); Usb3PortConfig.Value = PcdGet64 (PcdH2OChipsetUsb3PortEnable); //[-end-190410-IB16990021-add]// UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.UsbPdoProgramming, UsbConfig->PdoProgramming, PchSetup->PchUsbPdoProgramming ); UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsbOverCurrentEnable, UsbConfig->OverCurrentEnable, !!PchSetup->PchEnableDbcObs ? FALSE : PchSetup->PchUsbOverCurrentEnable ); UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PchXhciUaolEnable, UsbConfig->UaolEnable, !!PchSetup->PchXhciUaol ); UPDATE_POLICY (( (FSPS_UPD *) FspsUpd)->FspsConfig.PchXhciHsiiEnable, UsbConfig->HsiiEnable, !!PchSetup->PchXhciHsiiEnable ); for (PortIndex = 0; PortIndex < GetPchUsb2MaxPhysicalPortNum (); PortIndex++) { //[-start-190410-IB16990021-modify]// UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortUsb20Enable[PortIndex], UsbConfig->PortUsb20[PortIndex].Enable, (UsbPortConfig.Value >> PortIndex) & 0x1 ); //[-end-190410-IB16990021-modify]// } for (PortIndex = 0; PortIndex < GetPchXhciMaxUsb3PortNum (); PortIndex++) { //[-start-190410-IB16990021-modify]// UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PortUsb30Enable[PortIndex], UsbConfig->PortUsb30[PortIndex].Enable, (Usb3PortConfig.Value >> PortIndex) & 0x1 ); //[-end-190410-IB16990021-modify]// } // // xDCI (USB device) related settings from setup variable // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.XdciEnable, UsbConfig->XdciConfig.Enable, !!PchSetup->PchXdciSupport); // // Update both USB2 and USB3 OC pin mapping based on platform design // UpdateUsbOverCurrentPolicy (UsbConfig, FspsUpd); // // Update USB2 Port Reset Message Enable Policy based on platform design // UpdateUsb2PortResetMessageEnablePolicy (UsbConfig, FspsUpd); } /** Update USB2 PHY config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdatePchUsb2PhyConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { USB2_PHY_TABLE *Usb2PhyTuningTable; UINT8 PortIndex; UINT8 PortCount; #if FixedPcdGet8(PcdFspModeSelection) == 0 USB2_PHY_CONFIG *Usb2PhyConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gUsb2PhyConfigGuid, (VOID *) &Usb2PhyConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif // // Get USB2 PHY tuning table address and verify it's available // Usb2PhyTuningTable = (USB2_PHY_TABLE *) PcdGet32 (PcdUsb2PhyTuningTable); if (Usb2PhyTuningTable == NULL) { DEBUG ((DEBUG_INFO, "UpdateUsb2PhyPolicy: No data for USB2 PHY tuning provided.\n")); return; } // // Display warning for size difference // if (Usb2PhyTuningTable->Size != GetPchUsb2MaxPhysicalPortNum ()) { DEBUG ((DEBUG_WARN, "UpdateUsb2PhyPolicy: Invalid USB2 PHY tuning table size. Got: %d\n", Usb2PhyTuningTable->Size)); } // // To avoid overflow get minimum from either table size or max USB2 port count // PortCount = MIN (Usb2PhyTuningTable->Size, GetPchUsb2MaxPhysicalPortNum ()); DEBUG ((DEBUG_INFO, "UpdateUsb2PhyPolicy: USB2 PHY parameters will be updated for %d USB2 ports.\n", PortCount)); for (PortIndex = 0; PortIndex < PortCount; PortIndex++) { UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.Usb2PhyPetxiset[PortIndex], Usb2PhyConfig->Port[PortIndex].Petxiset , Usb2PhyTuningTable->Data[PortIndex].Petxiset); UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.Usb2PhyTxiset[PortIndex], Usb2PhyConfig->Port[PortIndex].Txiset , Usb2PhyTuningTable->Data[PortIndex].Txiset); UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.Usb2PhyPredeemp[PortIndex], Usb2PhyConfig->Port[PortIndex].Predeemp , Usb2PhyTuningTable->Data[PortIndex].Predeemp); UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.Usb2PhyPehalfbit[PortIndex], Usb2PhyConfig->Port[PortIndex].Pehalfbit, Usb2PhyTuningTable->Data[PortIndex].Pehalfbit); } } #if FixedPcdGetBool(PcdAdlLpSupport) == 1 /** Update UFS configuration. @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FSPS_UPD @param[in] PchSetup Pointer to PCH_SETUP **/ STATIC VOID UpdateUfsConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINT8 UfsIndex; #if FixedPcdGet8(PcdFspModeSelection) == 0 SCS_UFS_CONFIG *UfsConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gUfsConfigGuid, (VOID *) &UfsConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif #if FixedPcdGet8(PcdFspModeSelection) == 1 // // FSP has disjoint configuration space allocation so we check for both UFS number supported in code // and UFS supported by FSPS_UPD // for (UfsIndex = 0; (UfsIndex < PchGetMaxUfsNum ()) && UfsIndex < 2; UfsIndex++) { #else for (UfsIndex = 0; UfsIndex < PchGetMaxUfsNum (); UfsIndex++) { #endif COMPARE_AND_UPDATE_POLICY(((FSPS_UPD *) FspsUpd)->FspsConfig.UfsEnable[UfsIndex], UfsConfig->UfsControllerConfig[UfsIndex].Enable, PchSetup->PchScsUfsEnable[UfsIndex], UfsIndex); } } #endif //[-start-210311-IB09480137-add]// VOID MergeInternalAndOemVerbTable ( IN COMMON_CHIPSET_AZALIA_VERB_TABLE *OemVerbTableHeaderDataAddress, IN OUT HDA_VERB_TABLE_DATABASE **HdaVerbTableDatabase ) { COMMON_CHIPSET_AZALIA_VERB_TABLE_HEADER *OemVerbTableHeader; UINT32 *OemVerbTableDataBuffer; UINT16 DataDwords; UINT32 DataIndex; VOID *OemVerbTable; EFI_STATUS Status; UINT8 Index; HDA_VERB_TABLE_DATABASE *HdaVerbTableDatabaseOld; HDA_VERB_TABLE_DATABASE *HdaVerbTableDatabaseNew; UINT8 NewVerbTableDBIndex; UINT8 IGDVerbCount; UINT8 OemVerbTableCount; UINT8 TotalVerbTableCount; if (OemVerbTableHeaderDataAddress == NULL || HdaVerbTableDatabase == NULL || *HdaVerbTableDatabase == NULL) { DEBUG ((DEBUG_INFO, "MergeInternalAndOemVerbTable input parameters not correct\n")); return; } HdaVerbTableDatabaseOld = *HdaVerbTableDatabase; HdaVerbTableDatabaseNew = NULL; IGDVerbCount = 0; OemVerbTableCount = 0; TotalVerbTableCount = 0; NewVerbTableDBIndex = 0; // // Check how many IGD verb data in current verb table // for (Index = 0; Index < HdaVerbTableDatabaseOld->Size; Index++) { if (HdaVerbTableDatabaseOld->HdaVerbTable[Index]->Header.VendorId == 0x8086) { IGDVerbCount++; } } // // Count Oem verb table number // Oem verb table maximum number is depend on DEFINE_VERB_TABLE_LOCAL_HEADER_DATA_4 marco define // for (Index = 0; (Index < 5) && (OemVerbTableHeaderDataAddress[Index].VerbTableHeader != NULL); Index++) { OemVerbTableCount++; } TotalVerbTableCount = IGDVerbCount + OemVerbTableCount; Status = PeiServicesAllocatePool ((sizeof (*HdaVerbTableDatabaseNew) + (sizeof(HDAUDIO_VERB_TABLE*) * TotalVerbTableCount)), (VOID **)&HdaVerbTableDatabaseNew); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "MergeInternalAndOemVerbTable allocate memory fail status = %r\n",Status)); ASSERT_EFI_ERROR (Status); return; } ZeroMem ((VOID*)(UINTN)HdaVerbTableDatabaseNew, (sizeof (*HdaVerbTableDatabaseNew) + (sizeof(HDAUDIO_VERB_TABLE*) * TotalVerbTableCount))); HdaVerbTableDatabaseNew->Size = TotalVerbTableCount; // // Update IGD verb table to new verb table database from old verb table // for (Index = 0; (Index < HdaVerbTableDatabaseOld->Size) && (NewVerbTableDBIndex < IGDVerbCount); Index++) { if (HdaVerbTableDatabaseOld->HdaVerbTable[Index]->Header.VendorId == 0x8086) { HdaVerbTableDatabaseNew->HdaVerbTable[NewVerbTableDBIndex] = HdaVerbTableDatabaseOld->HdaVerbTable[Index]; NewVerbTableDBIndex++; } } // // 1. COMMON_CHIPSET_AZALIA_VERB_TABLE format converted to HDAUDIO_VERB_TABLE format. // 2. Update Oem verb table to new verb table database. // for (Index = 0; (Index < OemVerbTableCount) && (OemVerbTableHeaderDataAddress[Index].VerbTableHeader != NULL); Index++) { OemVerbTable = NULL; OemVerbTableHeader = OemVerbTableHeaderDataAddress[Index].VerbTableHeader; OemVerbTableDataBuffer = OemVerbTableHeaderDataAddress[Index].VerbTableData; DataDwords = (OemVerbTableHeader->NumberOfFrontJacks + OemVerbTableHeader->NumberOfRearJacks) * 4; Status = PeiServicesAllocatePool ((sizeof (HDA_VERB_TABLE_HEADER) + (DataDwords * sizeof(UINT32))), (VOID **)&OemVerbTable); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return; } ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Header.VendorId = OemVerbTableHeader->VendorDeviceId >> 16; ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Header.DeviceId = OemVerbTableHeader->VendorDeviceId & 0xFFFF; ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Header.RevisionId = OemVerbTableHeader->RevisionId; ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Header.SdiNum = 0xFF; ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Header.DataDwords = DataDwords; for (DataIndex = 0; DataIndex < ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Header.DataDwords; DataIndex++) { ((HDAUDIO_VERB_TABLE *)OemVerbTable)->Data[DataIndex] = *((UINT32 *)OemVerbTableDataBuffer + DataIndex); } // // Update Oem verb table to new verb table database // HdaVerbTableDatabaseNew->HdaVerbTable[NewVerbTableDBIndex] = (HDAUDIO_VERB_TABLE *)OemVerbTable; NewVerbTableDBIndex++; if (NewVerbTableDBIndex >= TotalVerbTableCount) { // // NewVerbTableDBIndex cannot more than the TotalVerbTableCount // break; } } if (HdaVerbTableDatabaseNew != NULL) { *HdaVerbTableDatabase = HdaVerbTableDatabaseNew; } } //[-end-210311-IB09480137-add]// /** Update HD Audio configuration. @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] SiPreMemPolicyPpi Pointer to SI_PREMEM_POLICY_PPI @param[in] FspmUpd Pointer to FSPM_UPD @param[in] FspsUpd Pointer to FSPS_UPD @param[in] PchSetup Pointer to PCH_SETUP **/ STATIC VOID UpdateHdAudioConfig ( IN SI_POLICY_PPI *SiPolicy, IN SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi, IN VOID *FspsUpd, IN VOID *FspmUpd, IN PCH_SETUP *PchSetup ) { HDA_VERB_TABLE_DATABASE *HdaVerbTableDatabase; //[-start-210311-IB09480137-add]// COMMON_CHIPSET_AZALIA_VERB_TABLE *OemVerbTableHeaderDataAddress; //[-end-210311-IB09480137-add]// #if FixedPcdGetBool(PcdFspModeSelection) == 0 HDAUDIO_CONFIG *HdAudioConfig; HDAUDIO_PREMEM_CONFIG *HdAudioPreMemConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gHdAudioConfigGuid, (VOID *) &HdAudioConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gHdAudioPreMemConfigGuid, (VOID *) &HdAudioPreMemConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchHdaPme, HdAudioConfig->Pme, PchSetup->PchHdAudioPme, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchHdaLinkFrequency, HdAudioConfig->HdAudioLinkFrequency, PchSetup->PchHdaHdAudioLinkFreq, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchHdaCodecSxWakeCapability, HdAudioConfig->CodecSxWakeCapability, PchSetup->PchHdAudioCodecSxWakeCapability, NullIndex); // // Install HDA Link/iDisplay Codec Verb Table // if (PchSetup->PchHdAudio) { HdaVerbTableDatabase = (HDA_VERB_TABLE_DATABASE *) (UINTN) PcdGet32 (PcdHdaVerbTableDatabase); if (HdaVerbTableDatabase == NULL) { DEBUG ((DEBUG_ERROR, "HdaVerbTableDatabase is NULL!\n")); ASSERT (FALSE); return; } //[-start-210311-IB09480137-modify]// OemVerbTableHeaderDataAddress = NULL; DEBUG_OEM_SVC ((DEBUG_INFO, "OemKernelServices Call: OemSvcGetVerbTable \n")); Status = OemSvcGetVerbTable (&OemVerbTableHeaderDataAddress); DEBUG_OEM_SVC ((DEBUG_INFO, "OemKernelServices OemSvcGetVerbTable Status: %r\n", Status)); if (!EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "OemSvcGetVerbTable status is success, not need to update policy!!\n")); } else { if ((Status == EFI_MEDIA_CHANGED) && (OemVerbTableHeaderDataAddress != NULL)) { MergeInternalAndOemVerbTable (OemVerbTableHeaderDataAddress , &HdaVerbTableDatabase); } UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.PchHdaVerbTableEntryNum, HdAudioConfig->VerbTableEntryNum, HdaVerbTableDatabase->Size); UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.PchHdaVerbTablePtr, HdAudioConfig->VerbTablePtr, (UINT32) HdaVerbTableDatabase->HdaVerbTable); } //[-end-210311-IB09480137-modify]// } } /** Update IO APIC Configuration @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] SetupVariables Pointer to SETUP_DATA buffer **/ VOID UpdateIoApicConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN SETUP_DATA *SetupVariables ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_IOAPIC_CONFIG *IoApicConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gIoApicConfigGuid, (VOID *) &IoApicConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIoApicEntry24_119, IoApicConfig->IoApicEntry24_119, PchSetup->PchIoApic24119Entries, NullIndex); // // To support SLP_S0, it's required to disable 8254 timer. // Note that CSM may require this option to be disabled for correct operation. // Once 8254 timer disabled, some legacy OPROM and legacy OS will fail while using 8254 timer. // For some OS environment that it needs to set 8254CGE in late state it should // set this policy to FALSE and use PmcSet8254ClockGateState (TRUE) in SMM later. // This is also required during S3 resume. // // The Enable8254ClockGatingOnS3 is only applicable when Enable8254ClockGating is disabled. // If Enable8254ClockGating is enabled, RC will do 8254 CGE programming on S3 as well. // else, RC will do the programming on S3 when Enable8254ClockGatingOnS3 is enabled. // This avoids the SMI requirement for the programming. // //[-start-191111-IB10189001-modify]// if ((SetupVariables->LowPowerS0Idle == 0) || (PchSetup->Enable8254ClockGating == 0) || (H2OGetBootType () != EFI_BOOT_TYPE)) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGating, IoApicConfig->Enable8254ClockGating, FALSE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGatingOnS3, IoApicConfig->Enable8254ClockGatingOnS3, FALSE); } else if (PchSetup->Enable8254ClockGating == 1) { #if FixedPcdGet8(PcdFspModeSelection) == 0 if ((IoApicConfig->Enable8254ClockGating != TRUE) && (IsPolicyDefaultCheckRequired())) { POLICY_DEBUG_WARNING (IoApicConfig->Enable8254ClockGating, PchSetup->Enable8254ClockGating, NullIndex); } #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGating, IoApicConfig->Enable8254ClockGating, TRUE); } else if (PchSetup->Enable8254ClockGating == 2) { #if FixedPcdGet8(PcdFspModeSelection) == 0 if ((IoApicConfig->Enable8254ClockGating != FALSE) && (IsPolicyDefaultCheckRequired())) { POLICY_DEBUG_WARNING (IoApicConfig->Enable8254ClockGating, PchSetup->Enable8254ClockGating, NullIndex); } if ((IoApicConfig->Enable8254ClockGatingOnS3 != TRUE) && (IsPolicyDefaultCheckRequired())) { POLICY_DEBUG_WARNING (IoApicConfig->Enable8254ClockGatingOnS3, PchSetup->Enable8254ClockGating, NullIndex); } #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGating, IoApicConfig->Enable8254ClockGating, FALSE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGatingOnS3, IoApicConfig->Enable8254ClockGatingOnS3, TRUE); } else { #if FixedPcdGet8(PcdFspModeSelection) == 0 if ((IoApicConfig->Enable8254ClockGating != FALSE) && (IsPolicyDefaultCheckRequired())) { POLICY_DEBUG_WARNING (IoApicConfig->Enable8254ClockGating, PchSetup->Enable8254ClockGating, NullIndex); } if ((IoApicConfig->Enable8254ClockGatingOnS3 != FALSE) && (IsPolicyDefaultCheckRequired())) { POLICY_DEBUG_WARNING (IoApicConfig->Enable8254ClockGatingOnS3, PchSetup->Enable8254ClockGating, NullIndex); } #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGating, IoApicConfig->Enable8254ClockGating, FALSE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Enable8254ClockGatingOnS3, IoApicConfig->Enable8254ClockGatingOnS3, FALSE); } //[-end-191111-IB10189001-modify]// } /** Update PCIe Root Port Configuration @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] SetupVariables Pointer to SETUP_DATA buffer **/ VOID UpdatePcieRpConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN SETUP_DATA *SetupVariables ) { UINT8 Index; #if FixedPcdGet8(PcdFspModeSelection) == 0 || FixedPcdGetBool (PcdDTbtEnable) == 1 EFI_STATUS Status; #endif PCH_PCIE_CONFIG *PchPcieConfig; #if FixedPcdGetBool (PcdDTbtEnable) == 1 PEI_DTBT_POLICY *PeiDTbtConfig; UINT8 TbtSelector; #endif UINTN MaxPciePorts; UINT8 RpIndex; MaxPciePorts = GetPchMaxPciePortNum (); PchPcieConfig = NULL; #if FixedPcdGetBool (PcdDTbtEnable) == 1 PeiDTbtConfig = NULL; #endif #if FixedPcdGet8(PcdFspModeSelection) == 0 Status = GetConfigBlock ((VOID *) SiPolicy, &gPchPcieConfigGuid, (VOID *) &PchPcieConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif #if FixedPcdGetBool (PcdDTbtEnable) == 1 if (SetupVariables->DiscreteTbtSupport == 1) { // // Obtain TBT Info from PEI TBT Policy. // Status = PeiServicesLocatePpi ( &gPeiDTbtPolicyPpiGuid, 0, NULL, (VOID **) &PeiDTbtConfig ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } if (PeiDTbtConfig != NULL) { for (Index = 0; Index < MAX_DTBT_CONTROLLER_NUMBER; Index++) { TbtSelector = PeiDTbtConfig->DTbtControllerConfig[Index].PcieRpNumber - 1; UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpMaxPayload[TbtSelector], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.MaxPayload, PchPcieMaxPayload128); DEBUG ((DEBUG_INFO, "PCIe RootPort[%x]= %x\n", TbtSelector, PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.MaxPayload)); if (PchSetup->PchPcieLtrEnable[TbtSelector] == 1) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSnoopLatencyOverrideMode[Index], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.PcieRpLtrConfig.SnoopLatencyOverrideMode, 1); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSnoopLatencyOverrideMultiplier[Index], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.PcieRpLtrConfig.SnoopLatencyOverrideMultiplier, 2); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSnoopLatencyOverrideValue[Index], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.PcieRpLtrConfig.SnoopLatencyOverrideValue, 85); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpNonSnoopLatencyOverrideMode[Index], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.PcieRpLtrConfig.NonSnoopLatencyOverrideMode, 1); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpNonSnoopLatencyOverrideMultiplier[Index], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.PcieRpLtrConfig.NonSnoopLatencyOverrideMultiplier, 2); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpNonSnoopLatencyOverrideValue[Index], PchPcieConfig->RootPort[TbtSelector].PcieRpCommonConfig.PcieRpLtrConfig.NonSnoopLatencyOverrideValue, 85); } } } } #endif // // PCI express config // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieComplianceTestMode, PchPcieConfig->PcieCommonConfig.ComplianceTestMode, PchSetup->PcieComplianceTestMode); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpFunctionSwap, PchPcieConfig->PcieCommonConfig.RpFunctionSwap, PchSetup->RpFunctionSwap); for (Index = 0; Index < MaxPciePorts; Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpMaxPayload[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.MaxPayload, PchPcieMaxPayload256); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpPhysicalSlotNumber[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.PhysicalSlotNumber, (UINT8) Index); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpClkReqDetect[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.ClkReqDetect, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpAspm[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.Aspm, PchSetup->PcieRootPortAspm[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpL1Substates[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.L1Substates, PchSetup->PcieRootPortL1SubStates[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpPcieSpeed[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.PcieSpeed, PchSetup->PcieRootPortSpeed[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpAcsEnabled[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.AcsEnabled, PchSetup->PcieRootPortACS[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PciePtm[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.PtmEnabled, PchSetup->PcieRootPortPTM[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieDpc[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.DpcEnabled, PchSetup->PcieRootPortDPC[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEdpc[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.RpDpcExtensionsEnabled, PchSetup->PcieRootPortEDPC[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSlotImplemented[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.SlotImplemented, PchSetup->PcieRootPortSI[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpPmSci[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.PmSci, PchSetup->PcieRootPortPMCE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpHotPlug[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.HotPlug, PchSetup->PcieRootPortHPE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpAdvancedErrorReporting[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.AdvancedErrorReporting, PchSetup->PcieRootPortAER[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpUnsupportedRequestReport[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.UnsupportedRequestReport, PchSetup->PcieRootPortURE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpFatalErrorReport[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.FatalErrorReport, PchSetup->PcieRootPortFEE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpNoFatalErrorReport[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.NoFatalErrorReport, PchSetup->PcieRootPortNFE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpCorrectableErrorReport[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.CorrectableErrorReport, PchSetup->PcieRootPortCEE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSystemErrorOnFatalError[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.SystemErrorOnFatalError, PchSetup->PcieRootPortSFE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSystemErrorOnNonFatalError[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.SystemErrorOnNonFatalError, PchSetup->PcieRootPortSNE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpSystemErrorOnCorrectableError[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.SystemErrorOnCorrectableError, PchSetup->PcieRootPortSCE[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpTransmitterHalfSwing[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.TransmitterHalfSwing, PchSetup->PcieRootPortTHS[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpDetectTimeoutMs[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.DetectTimeoutMs, PchSetup->PcieDetectTimeoutMs[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEnablePeerMemoryWrite[Index], PchPcieConfig->RootPort[Index].PcieRpCommonConfig.EnablePeerMemoryWrite, PchSetup->PcieRootPortPeerMemoryWriteEnable[Index]); } for (RpIndex = 0; RpIndex < GetPchMaxPciePortNum (); RpIndex++) { #if FixedPcdGet8(PcdFspModeSelection) == 1 if (IsPchLp () || IsPchP () || IsPchN ()) { ((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpLtrMaxSnoopLatency[RpIndex] = 0x1003; ((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpLtrMaxNoSnoopLatency[RpIndex] = 0x1003; } else if (IsPchH ()) { ((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpLtrMaxSnoopLatency[RpIndex] = 0x0846; ((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpLtrMaxNoSnoopLatency[RpIndex] = 0x0846; } #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpLtrEnable[RpIndex], PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.LtrEnable, PchSetup->PchPcieLtrEnable[RpIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieRpLtrConfigLock[RpIndex], PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieRpLtrConfig.LtrConfigLock, PchSetup->PchPcieLtrConfigLock[RpIndex]); // // Update EQ settigns // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqMethod, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.PcieLinkEqMethod, PchSetup->PcieEqMethod); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqMode, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.PcieLinkEqMode, PchSetup->PcieEqMode); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqLocalTransmitterOverrideEnable, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.LocalTransmitterOverrideEnable, PchSetup->PcieEqPh2LocalTransmitterOverrideEnable); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh1DownstreamPortTransmitterPreset, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph1DownstreamPortTransmitterPreset, PchSetup->PcieEqPh1DownstreamPortTransmitterPreset); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh1UpstreamPortTransmitterPreset, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph1UpstreamPortTransmitterPreset, PchSetup->PcieEqPh1UpstreamPortTransmitterPreset); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh3NumberOfPresetsOrCoefficients, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph3NumberOfPresetsOrCoefficients, PchSetup->PcieEqPh3NumberOfPresetsOrCoefficients); for (Index = 0; Index < PCIE_LINK_EQ_COEFFICIENTS_MAX; Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh3PreCursorList[Index], PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph3CoefficientsList[Index].PreCursor, PchSetup->PcieEqPh3PreCursorList[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh3PostCursorList[Index], PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph3CoefficientsList[Index].PostCursor, PchSetup->PcieEqPh3PostCursorList[Index]); } for (Index = 0; Index < PCIE_LINK_EQ_PRESETS_MAX; Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh3PresetList[Index], PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph3PresetList[Index], PchSetup->PcieEqPh3PresetList[Index]); } if (PchSetup->PcieEqPh2LocalTransmitterOverrideEnable) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PcieEqPh2LocalTransmitterOverridePreset, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.PcieGen3LinkEqPlatformSettings.Ph2LocalTransmitterOverridePreset, PchSetup->PcieEqPh2LocalTransmitterOverridePreset); } UPDATE_POLICY (((FSPS_UPD *)FspsUpd)->FspsConfig.PcieEqOverrideDefault, PchPcieConfig->RootPort[RpIndex].PcieRpCommonConfig.OverrideEqualizationDefaults, PchSetup->PcieEqOverrideDefault); } } /** Update ISH config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateIshConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINT8 Index; #if FixedPcdGet8(PcdFspModeSelection) == 0 ISH_CONFIG *IshConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gIshConfigGuid, (VOID *) &IshConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif for (Index = 0; Index < GetPchMaxIshSpiControllersNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshSpiEnable[Index], IshConfig->Spi[Index].Enable, PchSetup->PchIshSpiEnable[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshSpiCs0Enable[Index], IshConfig->Spi[Index].CsEnable[0], PchSetup->PchIshSpiCs0Enable[Index]); } for (Index = 0; Index < GetPchMaxIshUartControllersNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshUartEnable[Index], IshConfig->Uart[Index].Enable, PchSetup->PchIshUartEnable[Index]); } for (Index = 0; Index < GetPchMaxIshI2cControllersNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshI2cEnable[Index], IshConfig->I2c[Index].Enable, PchSetup->PchIshI2cEnable[Index]); } for (Index = 0; Index < GetPchMaxIshGpNum (); Index++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshGpEnable[Index], IshConfig->Gp[Index].Enable, PchSetup->PchIshGpEnable[Index]); } if (IsPchP () || IsPchN ()) { if (IsPchM ()) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IshGpGpioPinMuxing[4], IshConfig->Gp[4].PinConfig.PinMux, GPIO_VER2_P_MUXING_ISH_GP_4_E9); } else { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IshGpGpioPinMuxing[4], IshConfig->Gp[4].PinConfig.PinMux, GPIO_VER2_P_MUXING_ISH_GP_4_B3); } UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IshGpGpioPinMuxing[5], IshConfig->Gp[5].PinConfig.PinMux, GPIO_VER2_P_MUXING_ISH_GP_5_B4); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IshGpGpioPinMuxing[6], IshConfig->Gp[6].PinConfig.PinMux, GPIO_VER2_P_MUXING_ISH_GP_6_H12); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IshGpGpioPinMuxing[7], IshConfig->Gp[7].PinConfig.PinMux, GPIO_VER2_P_MUXING_ISH_GP_7_B15); } COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshPdtUnlock, IshConfig->PdtUnlock, PchSetup->PchIshPdtUnlock, NullIndex); } /** Update THC config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateThcConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINT8 ThcIndex; #if FixedPcdGet8(PcdFspModeSelection) == 0 THC_CONFIG *ThcConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gThcConfigGuid, (VOID *) &ThcConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcPort0Assignment, ThcConfig->ThcPort[0].Assignment, PchSetup->ThcPort0Assignment, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcPort0WakeOnTouch, ThcConfig->ThcPort[0].WakeOnTouch, PchSetup->ThcPort0WakeOnTouch, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcPort1Assignment, ThcConfig->ThcPort[1].Assignment, PchSetup->ThcPort1Assignment, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcPort1WakeOnTouch, ThcConfig->ThcPort[1].WakeOnTouch, PchSetup->ThcPort1WakeOnTouch, NullIndex); for (ThcIndex = 0; ThcIndex < PCH_MAX_THC_CONTROLLERS; ThcIndex++) { COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcMode[ThcIndex] , ThcConfig->ThcPort[ThcIndex].Mode, PchSetup->ThcMode[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcActiveLtr[ThcIndex] , ThcConfig->ThcPort[ThcIndex].ActiveLtr, PchSetup->ThcActiveLtr[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcIdleLtr[ThcIndex] , ThcConfig->ThcPort[ThcIndex].IdleLtr, PchSetup->ThcIdleLtr[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcLimitPacketSize[ThcIndex] , ThcConfig->ThcPort[ThcIndex].LimitPacketSize , PchSetup->ThcLimitPacketSize[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcPerformanceLimitation[ThcIndex] , ThcConfig->ThcPort[ThcIndex].PerformanceLimitation, PchSetup->ThcPerformanceLimitation[ThcIndex], ThcIndex); // // Hid Over SPI Reset Pad configuration is always 0x0, which indicates HW THC default. // Platform BIOS code can override it if Board design is not aligned with THC pads. // COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidResetPad[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.ResetPad, 0x0, ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidResetPadTrigger[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.ResetPadTrigger, PchSetup->ThcHidResetPadTrigger[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidConnectionSpeed[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.Frequency, PchSetup->ThcHidConnectionSpeed[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidInputReportHeaderAddress[ThcIndex], ThcConfig->ThcPort[ThcIndex].HidOverSpi.InputReportHeaderAddress, PchSetup->ThcHidInputReportHeaderAddress[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidInputReportBodyAddress[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.InputReportBodyAddress, PchSetup->ThcHidInputReportBodyAddress[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidOutputReportAddress[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.OutputReportAddress, PchSetup->ThcHidOutputReportAddress[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidReadOpcode[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.ReadOpcode, PchSetup->ThcHidReadOpcode[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidWriteOpcode[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.WriteOpcode, PchSetup->ThcHidWriteOpcode[ThcIndex], ThcIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.ThcHidFlags[ThcIndex] , ThcConfig->ThcPort[ThcIndex].HidOverSpi.Flags, PchSetup->ThcHidFlags[ThcIndex], ThcIndex); } } /** Update CNVi config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateCnviConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 EFI_STATUS Status; CNVI_CONFIG *CnviConfig; CnviConfig = NULL; Status = GetConfigBlock ((VOID *) SiPolicy, &gCnviConfigGuid, (VOID *) &CnviConfig); if (EFI_ERROR (Status) || CnviConfig == NULL) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CnviMode, CnviConfig->Mode, PchSetup->CnviMode, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CnviWifiCore, CnviConfig->WifiCore, PchSetup->CnviWifiCore, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CnviBtCore, CnviConfig->BtCore, PchSetup->CnviBtCore, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CnviBtAudioOffload, CnviConfig->BtAudioOffload, PchSetup->CnviBtAudioOffload, NullIndex); // @note: this config needs to be based on board routing. if (IsPchLp ()) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CnviRfResetPinMux, CnviConfig->PinMux.RfReset, GPIO_VER2_LP_MUXING_CNVI_RF_RESET_GPP_F4); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CnviClkreqPinMux, CnviConfig->PinMux.Clkreq, GPIO_VER2_LP_MUXING_CNVI_MODEM_CLKREQ_GPP_F5); } } /** Update Thermal config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] SaSetup Pointer to SA_SETUP **/ STATIC VOID UpdateThermalConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN SA_SETUP *SaSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 THERMAL_CONFIG *ThermalConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gThermalConfigGuid, (VOID *) &ThermalConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryPmsyncEnable[TsGpioC], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioC].PmsyncEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryPmsyncEnable[TsGpioD], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioD].PmsyncEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryC0TransmitEnable[TsGpioC], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioC].C0TransmitEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryC0TransmitEnable[TsGpioD], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioD].C0TransmitEnable, TRUE); if ((SaSetup->MemoryThermalManagement != FALSE) && ((SaSetup->ExttsViaTsOnBoard != FALSE) || (SaSetup->ExttsViaTsOnDimm != FALSE))) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryThrottlingEnable, ThermalConfig->MemoryThrottling.Enable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryPmsyncEnable[TsGpioC], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioC].PmsyncEnable, PcdGetBool (PcdMemoryThermalSensorGpioCPmsyncEnable)); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryPmsyncEnable[TsGpioD], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioD].PmsyncEnable, PcdGetBool (PcdMemoryThermalSensorGpioDPmsyncEnable)); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryC0TransmitEnable[TsGpioC], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioC].C0TransmitEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryC0TransmitEnable[TsGpioD], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioD].C0TransmitEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryPinSelection[TsGpioC], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioC].PinSelection, 1); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryPinSelection[TsGpioD], ThermalConfig->MemoryThrottling.TsGpioPinSetting[TsGpioD].PinSelection, 0); } else { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchMemoryThrottlingEnable, ThermalConfig->MemoryThrottling.Enable, FALSE); } UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchHotEnable, ThermalConfig->PchHotEnable, PcdGetBool (PcdPchThermalHotEnable)); // // Program Thermal Throttling Level // COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.TTSuggestedSetting, ThermalConfig->TTLevels.SuggestedSetting, PchSetup->PchTtLevelSuggestSet, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.TTCrossThrottling, ThermalConfig->TTLevels.PchCrossThrottling, PchSetup->PchCrossThrottling, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTTLock, ThermalConfig->TTLevels.TTLock, PchSetup->PchThrmTtLock, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTTState13Enable, ThermalConfig->TTLevels.TTState13Enable, PchSetup->PchThrmTtState13Enable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTTEnable, ThermalConfig->TTLevels.TTEnable, PchSetup->PchThrmTtEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchT2Level, ThermalConfig->TTLevels.T2Level, PchSetup->PchThrmT2Level, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchT1Level, ThermalConfig->TTLevels.T1Level, PchSetup->PchThrmT1Level, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchT0Level, ThermalConfig->TTLevels.T0Level, PchSetup->PchThrmT0Level, NullIndex); // // Program DMI Thermal Throttling // COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.DmiSuggestedSetting, ThermalConfig->DmiHaAWC.SuggestedSetting, PchSetup->PchDmiTsSuggestSet, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.DmiTS3TW, ThermalConfig->DmiHaAWC.TS3TW, PchSetup->PchTs3Width, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.DmiTS2TW, ThermalConfig->DmiHaAWC.TS2TW, PchSetup->PchTs2Width, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.DmiTS1TW, ThermalConfig->DmiHaAWC.TS1TW, PchSetup->PchTs1Width, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.DmiTS0TW, ThermalConfig->DmiHaAWC.TS0TW, PchSetup->PchTs0Width, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchDmiTsawEn, ThermalConfig->DmiHaAWC.DmiTsawEn, PchSetup->PchDmiTsawEn, NullIndex); } /** Update GBE config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateGbeConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 GBE_CONFIG *GbeConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gGbeConfigGuid, (VOID *) &GbeConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif // // LAN Config // Check Gbe Region to determine if hide LAN controller setup option // if (IsGbePresent ()) { COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLanEnable, GbeConfig->Enable, PchSetup->PchLan, NullIndex); } else { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLanEnable, GbeConfig->Enable, FALSE); } } #if FixedPcdGetBool (PcdEmbeddedEnable) /** Update PCH TSN config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateTsnConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { TSN_CONFIG *TsnConfig; TSN_SUB_REGION *TsnSubRegion; #if FixedPcdGet8(PcdFspModeSelection) == 0 EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gTsnConfigGuid, (VOID *) &TsnConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #else TsnConfig = NULL; #endif // Acquire MAC Addresses from TSN Sub Region InstallTsnFv (); GetTsnSubRegion (&TsnSubRegion); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTsnMacAddressHigh, TsnConfig->TsnMacAddressHigh, TsnSubRegion->Port.MacAddressHigh); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTsnMacAddressLow, TsnConfig->TsnMacAddressLow, TsnSubRegion->Port.MacAddressLow); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTsnEnable, TsnConfig->Enable, PchSetup->PchTsnEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTsnLinkSpeed, TsnConfig->TsnLinkSpeed, PchSetup->PchTsnLinkSpeed, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchTsnMultiVcEnable, TsnConfig->MultiVcEnable, PchSetup->TsnMultiVcEnable, NullIndex); } #endif /** Update DMI config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateDmiConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_DMI_CONFIG *DmiConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gPchDmiConfigGuid, (VOID *) &DmiConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchDmiAspmCtrl, DmiConfig->DmiAspmCtrl, PchSetup->PchDmiAspm, NullIndex); } /** Get Bios Guard variable @param[in] FspmUpd Pointer to FSPM_UPD struct @param[in] CpuSecurityPreMemConfig Pointer to CPU Security PreMem Config **/ STATIC UINT32 GetBiosGuardEnable ( IN VOID *FspmUpd, IN CPU_SECURITY_PREMEM_CONFIG *CpuSecurityPreMemConfig ) { UINT32 BiosGuard; GET_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.BiosGuard, CpuSecurityPreMemConfig->BiosGuard, BiosGuard); return BiosGuard; } /** Update LockDown config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] BiosGuardEnable BIOS Guard enable **/ STATIC VOID UpdateLockDownConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN UINT32 BiosGuardEnable ) { //[-start-201112-IB16810138-remove]// //#if FixedPcdGetBool(PcdCapsuleEnable) == 1 //[-end-201112-IB16810138-remove]// EFI_HOB_GUID_TYPE *GuidHob; GuidHob = NULL; //[-start-201112-IB16810138-remove]// //#endif //[-end-201112-IB16810138-remove]// #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_LOCK_DOWN_CONFIG *LockDownConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gLockDownConfigGuid, (VOID *) &LockDownConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif if (BiosGuardEnable) { DEBUG ((DEBUG_INFO, "Enable InSMM.STS (EISS) and BIOS Lock Enable (BLE) since BIOS Guard is enabled.\n")); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLockDownBiosLock, LockDownConfig->BiosLock, TRUE); } else { COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLockDownBiosLock, LockDownConfig->BiosLock, PchSetup->PchBiosLock, NullIndex); } //[-start-201112-IB16810138-modify]// //#if FixedPcdGetBool(PcdCapsuleEnable) == 1 if (PcdGet8 (PcdChasmFallsSupport) != 0) { //[-end-201112-IB16810138-modify]// GuidHob = GetFirstGuidHob (&gSysFwUpdateProgressGuid); if (IsBiosUpdateRequired () || ((GetBootModeHob () == BOOT_IN_RECOVERY_MODE) && ((((SYSTEM_FIRMWARE_UPDATE_PROGRESS *) GET_GUID_HOB_DATA (GuidHob))->Component == UpdatinguCode)|| (((SYSTEM_FIRMWARE_UPDATE_PROGRESS *) GET_GUID_HOB_DATA (GuidHob))->Component == UpdatingBtGAcm)))) { DEBUG ((DEBUG_INFO, "Disabling BIOS lock for BIOS Update Process\n")); PchSetup->PchBiosLock = 0; COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLockDownBiosLock, LockDownConfig->BiosLock, PchSetup->PchBiosLock, NullIndex); DEBUG ((DEBUG_INFO, "Disabling BIOS interface lockdown for supporting Fault tolerant BIOS Update\n")); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLockDownBiosInterface, LockDownConfig->BiosInterface, FALSE); } //[-start-201112-IB16810138-modify]// } //#endif //[-end-201112-IB16810138-modify]// COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUnlockGpioPads, LockDownConfig->UnlockGpioPads, PchSetup->UnlockGpioPads, NullIndex); } /** Update Pm config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] SetupVariables Pointer to SETUP_DATA buffer **/ STATIC VOID UpdatePmConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN SETUP_DATA *SetupVariables ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_PM_CONFIG *PmConfig; ADR_CONFIG *PmcAdrConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gPmConfigGuid, (VOID *) &PmConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } Status = GetConfigBlock ((VOID*) SiPolicy, &gAdrConfigGuid, (VOID*) &PmcAdrConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmDeepSxPol, PmConfig->PchDeepSxPol, PchSetup->DeepSxMode, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmWolEnableOverride, PmConfig->WakeConfig.WolEnableOverride, PchSetup->PchWakeOnLan, NullIndex); // // M.2 WiFi/BT slot power needs to be kept during Sx for CNVi. Hence overriding PchPmWoWlanEnable to 1 when CNVi is present. // if (CnviIsPresent () == TRUE) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmWoWlanEnable, PmConfig->WakeConfig.WoWlanEnable, 1); } else { COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmWoWlanEnable, PmConfig->WakeConfig.WoWlanEnable, PchSetup->PchWakeOnWlan, NullIndex); } COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmWoWlanDeepSxEnable, PmConfig->WakeConfig.WoWlanDeepSxEnable, PchSetup->PchWakeOnWlanDeepSx, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmLanWakeFromDeepSx , PmConfig->WakeConfig.LanWakeFromDeepSx, PchSetup->LanWakeFromDeepSx, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmSlpLanLowDc, PmConfig->SlpLanLowDc, PchSetup->SlpLanLowDc, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PsOnEnable, PmConfig->PsOnEnable, PchSetup->PsOnEnable, NullIndex); // Power Button Override Period (PBOP): refer to EDS for detail // Encoding: // 000b - 4 seconds // 011b - 10 seconds // power button behavior will depend on this setting and other features // such as power button SMI which will shutdown system immediately when it is enabled in pre-OS. //[-start-210618-BAIN000015-modify]// #ifdef LCFC_SUPPORT UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmPwrBtnOverridePeriod, PmConfig->PwrBtnOverridePeriod, !!SetupVariables->LowPowerS0Idle? 0x0 : 0); #else UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmPwrBtnOverridePeriod, PmConfig->PwrBtnOverridePeriod, !!SetupVariables->LowPowerS0Idle? 0x3 : 0); #endif //[-end-210618-BAIN000015-modify]// COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmDisableDsxAcPresentPulldown, PmConfig->DisableDsxAcPresentPulldown, PchSetup->DisableDsxAcPresentPulldown, NullIndex); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmMeWakeSts, PmConfig->MeWakeSts, TRUE); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmPciePllSsc, PmConfig->PciePllSsc, PchSetup->PciePllSsc, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.EnableTcoTimer, PmConfig->EnableTcoTimer, PchSetup->EnableTcoTimer, NullIndex); #if FixedPcdGet8(PcdEmbeddedEnable) == 0x1 COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.EnableTimedGpio0, PmConfig->EnableTimedGpio0, PchSetup->EnableTimedGpio0, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.EnableTimedGpio1, PmConfig->EnableTimedGpio1, PchSetup->EnableTimedGpio1, NullIndex); #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcDbgMsgEn, PmConfig->PmcDbgMsgEn, PchSetup->PmcDbgMsgEn, NullIndex); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmVrAlert, PmConfig->VrAlert, PcdGetBool (PcdVrAlertEnable)); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcCpuC10GatePinEnable, PmConfig->CpuC10GatePinEnable, 1); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcModPhySusPgEnable, PmConfig->ModPhySusPgEnable, IsPchLp ()); if (IsPchLp ()) { COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcUsb2PhySusPgEnable, PmConfig->Usb2PhySusPgEnable, PchSetup->PchUsb2SusWellPgEnable, NullIndex); } else { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcUsb2PhySusPgEnable, PmConfig->Usb2PhySusPgEnable, 0); } COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcOsIdleEnable, PmConfig->OsIdleEnable, PchSetup->PchPmcOsIdleModeEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchS0ixAutoDemotion, PmConfig->S0ixAutoDemotion, PchSetup->PchS0ixAutoDemotion, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchPmLatchEventsC10Exit, PmConfig->LatchEventsC10Exit, PchSetup->PchLatchEventsC10Exit, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcC10DynamicThresholdAdjustment, PmConfig->C10DynamicThresholdAdjustment, PchSetup->PmcC10DynamicThresholdAdjustment, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcAdrEn, PmcAdrConfig->AdrEn, PchSetup->PmcAdrEn, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcSkipVccInConfig, PmConfig->SkipVccInConfig, PchSetup->PchSkipVccInConfig, NullIndex); // // Below setting will force the RC to always update the timer value to setup values. This is needed as neither HW nor RC // know what the value of the timers should be(depends on the memory module on platform.) // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcAdrTimerEn, PmcAdrConfig->AdrTimerEn, FORCE_ENABLE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcAdrSrcOverride, PmcAdrConfig->AdrSrcOverride, FALSE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcAdrTimer1Val, PmcAdrConfig->AdrTimer1Val, PchSetup->PmcAdrTimer1Val); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcAdrMultiplier1Val, PmcAdrConfig->AdrMultiplier1Val, PchSetup->PmcAdrMultiplier1Val); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PmcAdrHostPartitionReset, PmcAdrConfig->AdrHostPartitionReset, PchSetup->PmcAdrHostPartitionReset); } #if FixedPcdGetBool(PcdAdlLpSupport) == 1 /** Update supported configurations for Vnn Rail. @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID GetExternalVnnSupportedVoltageStates ( IN PCH_SETUP *PchSetup ) { switch (PchSetup->ExternalVnnSupportedVoltageConfigurations) { case VnnRailVoltageConfig0: // 0.7V@Bypass-0.75V@Internal-1.05V@Internal PchSetup->ExternalVnnSupportedVoltageStates[0] = 0; // VNN_RET_ACTIVE_SWITCH_SUPPORT PchSetup->ExternalVnnSupportedVoltageStates[1] = 0; // VNN_NORM_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[2] = 0; // VNN_MIN_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[3] = 1; // VNN_MIN_RET_VOLT_SUPPORTED return; case VnnRailVoltageConfig1: // 0.78V@Bypass-0.78V@Bypass-1.05V@Internal PchSetup->ExternalVnnSupportedVoltageStates[0] = 0; // VNN_RET_ACTIVE_SWITCH_SUPPORT PchSetup->ExternalVnnSupportedVoltageStates[1] = 0; // VNN_NORM_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[2] = 1; // VNN_MIN_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[3] = 0; // VNN_MIN_RET_VOLT_SUPPORTED return; case VnnRailVoltageConfig2: // 0.7V@Bypass-0.75V@Bypass-1.05V@Internal PchSetup->ExternalVnnSupportedVoltageStates[0] = 1; // VNN_RET_ACTIVE_SWITCH_SUPPORT PchSetup->ExternalVnnSupportedVoltageStates[1] = 0; // VNN_NORM_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[2] = 1; // VNN_MIN_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[3] = 1; // VNN_MIN_RET_VOLT_SUPPORTED return; case VnnRailVoltageConfig3: // 1.05V@Bypass-1.05V@Bypass-1.05V@Bypass PchSetup->ExternalVnnSupportedVoltageStates[0] = 0; // VNN_RET_ACTIVE_SWITCH_SUPPORT PchSetup->ExternalVnnSupportedVoltageStates[1] = 1; // VNN_NORM_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[2] = 0; // VNN_MIN_ACTIVE_VOLT_SUPPORTED PchSetup->ExternalVnnSupportedVoltageStates[3] = 0; // VNN_MIN_RET_VOLT_SUPPORTED return; default: return; } } /** Update Fivr config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateFivrConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINT8 Index; #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_FIVR_CONFIG *FivrConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gFivrConfigGuid, (VOID *) &FivrConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtV1p05RailEnabledStates, FivrConfig->ExtV1p05Rail.EnabledStates, 0); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailEnabledStates, FivrConfig->ExtVnnRail.EnabledStates, 0); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailSxEnabledStates, FivrConfig->ExtVnnRailSx.EnabledStates, 0); for (Index = 0; Index < FIVR_RAIL_S0IX_SX_STATES_MAX; Index++) { OR_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtV1p05RailEnabledStates, FivrConfig->ExtV1p05Rail.EnabledStates, (PchSetup->ExternalV1p05StateEnable[Index] << Index)); OR_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailEnabledStates, FivrConfig->ExtVnnRail.EnabledStates, (PchSetup->ExternalVnnStateEnable[Index] << Index)); OR_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailSxEnabledStates, FivrConfig->ExtVnnRailSx.EnabledStates, (PchSetup->ExternalVnnSxStateEnable[Index] << Index)); } // // By default setting the V1P05_NORM_ACTIVE_VOLT_SUPPORTED // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtV1p05RailSupportedVoltageStates, FivrConfig->ExtV1p05Rail.SupportedVoltageStates, 0x2); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailSupportedVoltageStates, FivrConfig->ExtVnnRail.SupportedVoltageStates, 0); if (IsPchP () || IsPchN ()) { GetExternalVnnSupportedVoltageStates (PchSetup); } for (Index = 0; Index < FIVR_RAIL_EXT_VOLTAGE_STATES_MAX; Index++) { OR_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailSupportedVoltageStates, FivrConfig->ExtVnnRail.SupportedVoltageStates, (PchSetup->ExternalVnnSupportedVoltageStates[Index] << Index)); } COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtV1p05RailIccMaximum, FivrConfig->ExtV1p05Rail.IccMaximum, PchSetup->ExternalV1p05IccMaximum, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtV1p05RailVoltage, FivrConfig->ExtV1p05Rail.Voltage, PchSetup->ExternalV1p05Voltage, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailIccMaximum, FivrConfig->ExtVnnRail.IccMaximum, PchSetup->ExternalVnnIccMaximum, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailVoltage, FivrConfig->ExtVnnRail.Voltage, PchSetup->ExternalVnnVoltage, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailSxIccMaximum, FivrConfig->ExtVnnRailSx.IccMaximum, PchSetup->ExternalVnnSxIccMaximum, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrExtVnnRailSxVoltage, FivrConfig->ExtVnnRailSx.Voltage, PchSetup->ExternalVnnSxVoltage, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrVccinAuxLowToHighCurModeVolTranTime, FivrConfig->VccinAux.LowToHighCurModeVolTranTime, PchSetup->PchLowToHighCurModeVolTranTime, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrVccinAuxRetToHighCurModeVolTranTime, FivrConfig->VccinAux.RetToHighCurModeVolTranTime, PchSetup->PchRetToHighCurModeVolTranTime, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrVccinAuxRetToLowCurModeVolTranTime, FivrConfig->VccinAux.RetToLowCurModeVolTranTime , PchSetup->PchRetToLowCurModeVolTranTime, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrVccinAuxOffToHighCurModeVolTranTime, FivrConfig->VccinAux.OffToHighCurModeVolTranTime, PchSetup->PchOffToHighCurModeVolTranTime, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchFivrDynPm, FivrConfig->FivrDynPm, PchSetup->PchFivrDynPm, NullIndex); } #endif /** Update Espi config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateEspiConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_ESPI_CONFIG *EspiConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gEspiConfigGuid, (VOID *) &EspiConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchEspiLgmrEnable, EspiConfig->LgmrEnable, PchSetup->PchEspiLgmrEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchEspiHostC10ReportEnable, EspiConfig->HostC10ReportEnable, PchSetup->PchEspiHostC10ReportEnable, NullIndex); } /** Update Psf config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdatePsfConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdEmbeddedEnable) == 0x1 PSF_CONFIG *PsfConfig; PsfConfig = NULL; #if FixedPcdGetBool(PcdFspModeSelection) == 0 EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gPsfConfigGuid, (VOID *) &PsfConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PsfTccEnable, PsfConfig->TccEnable, PchSetup->PsfTccEnable, NullIndex); #endif } /** Update FlashProtection config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] BiosGuardEnable BIOS Guard enable **/ STATIC VOID UpdateFlashProtectionConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN UINT32 BiosGuardEnable ) { UINT32 BaseAddr; UINT32 RegionSize; BOOLEAN FlashProtectionEnabled; EFI_STATUS Status; PCH_SPI_PPI *SpiPpi; UINT16 ProtectedRangeBase; UINT16 ProtectedRangeLimit; #if FixedPcdGetBool(PcdCapsuleEnable) == 1 SYSTEM_FIRMWARE_COMPONENT UpdatingComponent; #endif #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_FLASH_PROTECTION_CONFIG *FlashProtectionConfig; Status = GetConfigBlock ((VOID *) SiPolicy, &gFlashProtectionConfigGuid, (VOID *) &FlashProtectionConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif FlashProtectionEnabled = PchSetup->FprrEnable; #if FixedPcdGetBool(PcdCapsuleEnable) == 1 UpdatingComponent = 0xFF; #endif #if FixedPcdGetBool(PcdResiliencyEnable) == 1 if (IsBiosUpdateRequired ()) { #else if (IsBiosUpdateRequired () && !BiosGuardEnable) { #endif DEBUG ((DEBUG_INFO, "Disable Flash Protection Range Registers for BIOS Update Process\n")); FlashProtectionEnabled = FALSE; } #if FixedPcdGetBool(PcdCapsuleEnable) == 1 IsFmpCapsuleForBiosUpdateDetected(&UpdatingComponent); if (IsBiosUpdateRequired () && ((UpdatingComponent == (SYSTEM_FIRMWARE_COMPONENT) UpdatingBtGAcm) || \ (UpdatingComponent == (SYSTEM_FIRMWARE_COMPONENT) UpdatinguCode))) { DEBUG ((DEBUG_INFO, "Disable Flash Protection Range Registers for uCode or BtG ACM Update Process\n")); FlashProtectionEnabled = FALSE; } #endif // // Flash Protection Range Register initialization // if (FlashProtectionEnabled) { Status = PeiServicesLocatePpi ( &gPchSpiPpiGuid, 0, NULL, (VOID **)&SpiPpi ); DEBUG ((DEBUG_INFO, "Enabling Flash Protection Range: LocatePpi gPchSpiPpiGuid = %r\n", Status)); if (EFI_ERROR (Status)) { return; } // // Find the base address for BIOS region // Status = SpiPpi->GetRegionAddress (SpiPpi, FlashRegionBios, &BaseAddr, &RegionSize); DEBUG ((DEBUG_INFO, "BIOS Region: %r - Start Address: 0x%x - Size: 0x%x\n", Status, BaseAddr, RegionSize)); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } // // Initialize flash protection // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchWriteProtectionEnable[0], FlashProtectionConfig->ProtectRange[0].WriteProtectionEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchReadProtectionEnable[0], FlashProtectionConfig->ProtectRange[0].ReadProtectionEnable, FALSE); // // Assign FPRR ranges // #if FixedPcdGetBool(PcdExtendedBiosRegionSupport) == 1 UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeBase[0], FlashProtectionConfig->ProtectRange[0].ProtectedRangeBase, (UINT16)((BaseAddr + FixedPcdGet32 (PcdFlashExtendRegionSizeInUse) + FixedPcdGet32 (PcdFlashNvStorageSize)) >> 12)); #else UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeBase[0], FlashProtectionConfig->ProtectRange[0].ProtectedRangeBase, (UINT16)((BaseAddr + FixedPcdGet32 (PcdFlashNvStorageSize)) >> 12)); #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeLimit[0], FlashProtectionConfig->ProtectRange[0].ProtectedRangeLimit, (UINT16)(((BaseAddr + RegionSize) - 1) >> 12)); GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeBase[0], FlashProtectionConfig->ProtectRange[0].ProtectedRangeBase, ProtectedRangeBase); GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeLimit[0], FlashProtectionConfig->ProtectRange[0].ProtectedRangeLimit, ProtectedRangeLimit); DEBUG ((DEBUG_INFO, "FlashProtectionConfig->ProtectRange[0].ProtectedRangeBase %x\n", ProtectedRangeBase)); DEBUG ((DEBUG_INFO, "FlashProtectionConfig->ProtectRange[0].ProtectedRangeLimit %x\n", ProtectedRangeLimit)); #if FixedPcdGetBool(PcdExtendedBiosRegionSupport) == 1 // Initialize flash protection for Extended BIOS Region UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchWriteProtectionEnable[1], FlashProtectionConfig->ProtectRange[1].WriteProtectionEnable, TRUE); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchReadProtectionEnable[1], FlashProtectionConfig->ProtectRange[1].ReadProtectionEnable, FALSE); // Assign FPRR ranges for Extended BIOS Region UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeBase[1], FlashProtectionConfig->ProtectRange[1].ProtectedRangeBase, (UINT16)(BaseAddr >> 12)); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeLimit[1], FlashProtectionConfig->ProtectRange[1].ProtectedRangeLimit, (UINT16)(((BaseAddr + FixedPcdGet32 (PcdFlashExtendRegionSizeInUse)) - 1) >> 12)); GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeBase[1], FlashProtectionConfig->ProtectRange[1].ProtectedRangeBase, ProtectedRangeBase); GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchProtectedRangeLimit[1], FlashProtectionConfig->ProtectRange[1].ProtectedRangeLimit, ProtectedRangeLimit); DEBUG ((DEBUG_INFO, "FlashProtectionConfig->ProtectRange[1].ProtectedRangeBase %x\n", ProtectedRangeBase)); DEBUG ((DEBUG_INFO, "FlashProtectionConfig->ProtectRange[1].ProtectedRangeLimit %x\n", ProtectedRangeLimit)); #endif } } /** Update Rtc config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateRtcConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { BOOLEAN Rtcstatus = TRUE; #if FixedPcdGet8(PcdFspModeSelection) == 0 RTC_CONFIG *RtcConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gRtcConfigGuid, (VOID *) &RtcConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif if (IsBiosUpdateRequired ()) Rtcstatus = FALSE; #if FixedPcdGetBool (PcdResiliencyEnable) == 1 Rtcstatus = FALSE; #endif DEBUG ((DEBUG_INFO, "set Rtc Bios Interface Lock based on the condition: %d\n", Rtcstatus)); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.RtcBiosInterfaceLock, RtcConfig->BiosInterfaceLock, Rtcstatus); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.RtcMemoryLock, RtcConfig->MemoryLock, PchSetup->PchRtcMemoryLock, NullIndex); } // // SATADevSlpPin GPIO pin muxing deafaults // GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mPchPSataDevSlpPinMux[PCH_MAX_SATA_PORTS] = { GPIO_VER2_P_MUXING_SATA_DEVSLP0_GPP_H12, // Port0 GPIO_VER2_P_MUXING_SATA_DEVSLP1_GPP_H13 // Port1 }; /** Update SATA Controller configuration. @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FSPS_UPD @param[in] PchSetup Pointer to PCH_SETUP **/ STATIC VOID UpdateSataConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINTN SataCtrlIndex; UINT8 MaxSataPorts; UINT8 Index; //[-start-190410-IB16990021-add]// PORT_CONFIG SataPortConfig; //[-end-190410-IB16990021-add]// #if FixedPcdGet8(PcdFspModeSelection) == 0 SATA_CONFIG *SataConfig; for (SataCtrlIndex = 0; SataCtrlIndex < MaxSataControllerNum (); SataCtrlIndex++) { SataConfig = GetPchSataConfig (SiPolicy, SataCtrlIndex); #else for (SataCtrlIndex = 0; SataCtrlIndex < MaxSataControllerNum () && SataCtrlIndex < 1; SataCtrlIndex++) { #endif UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataEnable, SataConfig->Enable, PchSetup->PchSata); MaxSataPorts = MaxSataPortNum (SataCtrlIndex); //[-start-190410-IB16990021-add]// SataPortConfig.Value = PcdGet64 (PcdH2OChipsetSataPortEnable); //[-end-190410-IB16990021-add]// UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataMode, SataConfig->SataMode, PchSetup->SataInterfaceMode); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPwrOptEnable, SataConfig->PwrOptEnable, TRUE); for (Index = 0; Index < MaxSataPorts; Index++) { if (!!PchSetup->SataTestMode) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsEnable[Index], SataConfig->PortSettings[Index].Enable, TRUE); } else { //[-start-190410-IB16990021-modify]// //UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsEnable[Index], SataConfig->PortSettings[Index].Enable, PchSetup->SataPort[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsEnable[Index], SataConfig->PortSettings[Index].Enable, (SataPortConfig.Value >> Index) & 0x1); //[-end-190410-IB16990021-modify]// } UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsHotPlug[Index], SataConfig->PortSettings[Index].HotPlug, PchSetup->SataHotPlug[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsSpinUp[Index], SataConfig->PortSettings[Index].SpinUp, PchSetup->SataSpinUp[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsExternal[Index], SataConfig->PortSettings[Index].External, PchSetup->SataExternal[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsDevSlp[Index], SataConfig->PortSettings[Index].DevSlp, PchSetup->PxDevSlp[Index]); // @TODO: Maybe we need to have setup option to setting SATA port GPIO reset configuration. UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsDevSlpResetConfig[Index], SataConfig->PortSettings[Index].DevSlpResetConfig, 1); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsEnableDitoConfig[Index], SataConfig->PortSettings[Index].EnableDitoConfig, PchSetup->EnableDitoConfig[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsDmVal[Index], SataConfig->PortSettings[Index].DmVal, PchSetup->DmVal[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsDitoVal[Index], SataConfig->PortSettings[Index].DitoVal, PchSetup->DitoVal[Index]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsSolidStateDrive[Index], SataConfig->PortSettings[Index].SolidStateDrive, PchSetup->SataType[Index]); // // Sata Port DevSlp GPIO configuration // if (IsPchP () || IsPchN ()) { UPDATE_POLICY(((FSPS_UPD *)FspsUpd)->FspsConfig.SataPortDevSlpPinMux[Index], SataConfig->PortSettings[Index].DevSlpGpioPinMux, mPchPSataDevSlpPinMux[Index]); } } if (PchSeries () == PCH_LP) { // // Only Mobile boards has interlock switches in SATA Port 0, 1 and 2 // #if FixedPcdGet8(PcdFspModeSelection) == 0 for (Index = 0; Index < MaxSataPorts; Index++) { #else for (Index = 0; Index < MaxSataPorts && Index < 8; Index++) { #endif if (PchSetup->SataHotPlug[Index]) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataPortsInterlockSw[Index], SataConfig->PortSettings[Index].InterlockSw, PchSetup->SataMechanicalSw[Index]); } } } UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataLedEnable, SataConfig->LedEnable, PcdGetBool (PcdSataLedEnable)); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataSalpSupport, SataConfig->SalpSupport, PchSetup->SataSalp); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataThermalSuggestedSetting, SataConfig->ThermalThrottling.SuggestedSetting, PchSetup->PchSataTsSuggestSet); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP1TDispFinit, SataConfig->ThermalThrottling.P1TDispFinit, PchSetup->PchP1TDispFinit); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP1Tinact, SataConfig->ThermalThrottling.P1Tinact, PchSetup->PchP1Tinact); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP1TDisp, SataConfig->ThermalThrottling.P1TDisp, PchSetup->PchP1TDisp); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP1T3M, SataConfig->ThermalThrottling.P1T3M, PchSetup->PchP1T3M); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP1T2M, SataConfig->ThermalThrottling.P1T2M, PchSetup->PchP1T2M); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP1T1M, SataConfig->ThermalThrottling.P1T1M, PchSetup->PchP1T1M); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP0TDispFinit, SataConfig->ThermalThrottling.P0TDispFinit, PchSetup->PchP0TDispFinit); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP0Tinact, SataConfig->ThermalThrottling.P0Tinact, PchSetup->PchP0Tinact); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP0TDisp, SataConfig->ThermalThrottling.P0TDisp, PchSetup->PchP0TDisp); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP0T3M, SataConfig->ThermalThrottling.P0T3M, PchSetup->PchP0T3M); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP0T2M, SataConfig->ThermalThrottling.P0T2M, PchSetup->PchP0T2M); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SataP0T1M, SataConfig->ThermalThrottling.P0T1M, PchSetup->PchP0T1M); } } #if FixedPcdGet8(PcdFspModeSelection) == 1 /** Update DevInt config @param[in] FspsUpd Pointer to FspsUpd structure **/ STATIC VOID UpdateDevIntConfig ( IN VOID *FspsUpd ) { ((FSPS_UPD *) FspsUpd)->FspsConfig.DevIntConfigPtr = (UINT32) NULL; } #endif /** Update Ieh config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateIehConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 IEH_CONFIG *IehConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gIehConfigGuid, (VOID *) &IehConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IehMode, IehConfig->Mode, PchSetup->IehMode, NullIndex); } /** Update Interrupt config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateInterruptConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_INTERRUPT_CONFIG *InterruptConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gInterruptConfigGuid, (VOID *) &InterruptConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.GpioIrqRoute, InterruptConfig->GpioIrqRoute, PchSetup->PchGpioIrqRoute, NullIndex); } /** Update PCH General config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdatePchGeneralConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGet8(PcdFspModeSelection) == 0 PCH_GENERAL_CONFIG *PchGeneralConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gPchGeneralConfigGuid, (VOID *) &PchGeneralConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchCrid, PchGeneralConfig->Crid, PchSetup->PchCrid, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchLegacyIoLowLatency, PchGeneralConfig->LegacyIoLowLatency, PchSetup->PchLegacyIoLowLatency, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchAcpiL6dPmeHandling, PchGeneralConfig->AcpiL6dPmeHandling, PchSetup->AcpiL6dPmeHandling, NullIndex); } /** Correct mismatch configuration of ISH and Serial IO @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID CorrectMismatchConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { UINT8 I2c2Mode; UINT8 I2c3Mode; UINT8 I2c5Mode; UINT8 Uart1Mode; #if FixedPcdGet8(PcdFspModeSelection) == 0 ISH_CONFIG *IshConfig; SERIAL_IO_CONFIG *SerialIoConfig; EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gIshConfigGuid, (VOID *) &IshConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } Status = GetConfigBlock ((VOID *) SiPolicy, &gSerialIoConfigGuid, (VOID *) &SerialIoConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoI2cMode[2], SerialIoConfig->I2cDeviceConfig[2].Mode, I2c2Mode); if (IsPchH () && I2c2Mode != SerialIoI2cDisabled) { // // ISH UART0 use the same GPIO pins as SerialIo I2C2 on PCH-H // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshUartEnable[0], IshConfig->Uart[0].Enable, FALSE); } GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoUartMode[1], SerialIoConfig->UartDeviceConfig[1].Mode, Uart1Mode); if (Uart1Mode != SerialIoUartDisabled) { // // ISH UART1 use the same GPIO pins as SerialIo UART1 // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshUartEnable[1], IshConfig->Uart[1].Enable, FALSE); } GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoI2cMode[3], SerialIoConfig->I2cDeviceConfig[3].Mode, I2c3Mode); GET_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SerialIoI2cMode[5], SerialIoConfig->I2cDeviceConfig[5].Mode, I2c5Mode); if ((IsPchLp () && I2c5Mode != SerialIoI2cDisabled) || (IsPchH () && I2c3Mode != SerialIoI2cDisabled)) { // // ISH I2C2 use the same GPIO pins as SerialIo I2C5 on PCH-LP / I2C3 on PCH-H // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchIshI2cEnable[2], IshConfig->I2c[2].Enable, FALSE); } } #if FixedPcdGetBool (PcdEmbeddedEnable) /** Update Fusa config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer @param[in] SaSetup Pointer to SA_SETUP buffer **/ STATIC VOID UpdateFusaConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup, IN SA_SETUP *SaSetup ) { FUSA_CONFIG *FusaConfig; FusaConfig = NULL; #if FixedPcdGet8(PcdFspModeSelection) == 0 EFI_STATUS Status; Status = GetConfigBlock ((VOID *) SiPolicy, &gFusaConfigGuid, (VOID *) &FusaConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.DisplayFusaConfigEnable, FusaConfig->DisplayFusaConfigEnable, SaSetup->DisplayFusaConfigEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.GraphicFusaConfigEnable, FusaConfig->GraphicFusaConfigEnable, SaSetup->GraphicFusaConfigEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.OpioFusaConfigEnable, FusaConfig->OpioFusaConfigEnable, SaSetup->OpioFusaConfigEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PsfFusaConfigEnable, FusaConfig->PsfFusaConfigEnable, PchSetup->PsfFusaConfigEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.IopFusaConfigEnable, FusaConfig->IopFusaConfigEnable, PchSetup->IopFusaConfigEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.FusaConfigEnable, FusaConfig->FusaConfigEnable, SaSetup->FusaConfigEnable, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.FusaRunStartupArrayBist, FusaConfig->FusaRunStartupArrayBist, SaSetup->FusaRunStartupArrayBist, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.FusaRunStartupScanBist, FusaConfig->FusaRunStartupScanBist, SaSetup->FusaRunStartupScanBist, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.FusaRunPeriodicScanBist, FusaConfig->FusaRunPeriodicScanBist, SaSetup->FusaRunPeriodicScanBist, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Module0Lockstep, FusaConfig->Module0Lockstep, SaSetup->Module0Lockstep, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Module1Lockstep, FusaConfig->Module1Lockstep, SaSetup->Module1Lockstep, NullIndex); } #endif /** Update Hybrid Storage Config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateHybridStorageConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGetBool(PcdFspModeSelection) == 0 EFI_STATUS Status; HYBRID_STORAGE_CONFIG *HybridStorageConfig; Status = GetConfigBlock ((VOID *) SiPolicy, &gHybridStorageConfigGuid, (VOID *) &HybridStorageConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.HybridStorageMode, HybridStorageConfig->HybridStorageMode, PchSetup->HybridStorageMode, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.CpuRootportUsedForHybridStorage, HybridStorageConfig->CpuRootportUsedForHybridStorage, PchSetup->CpuRootportUsedForHybridStorage, NullIndex); COMPARE_AND_UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchRootportUsedForCpuAttach, HybridStorageConfig->PchRootportUsedForCpuAttach, PchSetup->PchRootportUsedForCpuAttach, NullIndex); } /** Update SPI Config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure @param[in] PchSetup Pointer to PCH_SETUP buffer **/ STATIC VOID UpdateSpiConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { #if FixedPcdGetBool(PcdFspModeSelection) == 0 EFI_STATUS Status; SPI_CONFIG *SpiConfig; Status = GetConfigBlock ((VOID *) SiPolicy, &gSpiConfigGuid, (VOID *) &SpiConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #endif COMPARE_AND_UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.PchSpiExtendedBiosDecodeRangeEnable, SpiConfig->ExtendedBiosDecodeRangeEnable, PchSetup->ExtendedBiosDecodeRangeEnable, NullIndex ); } /** Get the ChipsetInit Binary pointer. @retval EFI_SUCCESS - ChipsetInit Binary found. @retval EFI_NOT_FOUND - ChipsetInit Binary not found. **/ EFI_STATUS UpdateHsioPolicy ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd, IN PCH_SETUP *PchSetup ) { EFI_STATUS Status; PCH_STEPPING PchStep; EFI_FIRMWARE_VOLUME_HEADER *FvHeader; EFI_FV_FILE_INFO ChipsetInitFileInfo; EFI_PEI_FILE_HANDLE *FfsHeader; EFI_GUID *ChipsetInitBinaryGuidPtr; #if FixedPcdGetBool(PcdFspModeSelection) == 0 PCH_HSIO_CONFIG *HsioConfig; #endif UINT32 ModuleAddr; UINT32 ModuleSize; ModuleAddr = 0; ModuleSize = 0; PchStep = PchStepping (); #if FixedPcdGetBool(PcdFspModeSelection) == 1 FspsUpd = (FSPS_UPD *) PcdGet32 (PcdFspsUpdDataAddress); ASSERT (FspsUpd != NULL); #else Status = GetConfigBlock ((VOID *) SiPolicy, &gHsioConfigGuid, (VOID *) &HsioConfig); ASSERT_EFI_ERROR (Status); #endif ChipsetInitBinaryGuidPtr = NULL; if (IsPchLp ()) { switch (PchStep) { case PCH_A0: ChipsetInitBinaryGuidPtr = &gAdlPchLpChipsetInitTableAxGuid;; DEBUG ((DEBUG_INFO, "Using AdlPchLpChipsetInitTable_Ax table \n")); break; default: return EFI_NOT_FOUND; } } else { return EFI_NOT_FOUND; } if (ChipsetInitBinaryGuidPtr == NULL) { DEBUG ((DEBUG_INFO, "ChipsetInit Binary not found \n")); return EFI_NOT_FOUND; } // // Locate Firmware Volume header // FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FixedPcdGet32 (PcdFlashFvFirmwareBinariesBase); Status = PeiServicesFfsFindFileByName (ChipsetInitBinaryGuidPtr, FvHeader, (VOID **)&FfsHeader); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Error returned by PeiServicesFfsFindFileByName while retrieving ChipsetInit Address\n")); ASSERT_EFI_ERROR (Status); return Status; } ModuleAddr = (UINT32)((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER)); Status = PeiServicesFfsGetFileInfo (FfsHeader, &ChipsetInitFileInfo); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Error returned by PeiServicesFfsGetFileInfo while retrieving BIOS Guard Module Size\n")); } if (ChipsetInitFileInfo.BufferSize == 0) { DEBUG ((DEBUG_INFO, "ChipsetInit Binary invalid size \n")); return EFI_NOT_FOUND; } ModuleSize = (UINTN) ChipsetInitFileInfo.BufferSize; // // Get ChipsetInit Binary Pointer // UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.ChipsetInitBinPtr, HsioConfig->ChipsetInitBinPtr, ModuleAddr ); // // Get File Size // UPDATE_POLICY ( ((FSPS_UPD *) FspsUpd)->FspsConfig.ChipsetInitBinLen, HsioConfig->ChipsetInitBinLen, ModuleSize ); #if FixedPcdGetBool(PcdFspModeSelection) == 1 DEBUG ((DEBUG_INFO, "ChipsetInit Binary Location: %x\n", ((FSPS_UPD *) FspsUpd)->FspsConfig.ChipsetInitBinPtr)); DEBUG ((DEBUG_INFO, "ChipsetInit Binary Size: %x\n", ((FSPS_UPD *) FspsUpd)->FspsConfig.ChipsetInitBinLen)); #else DEBUG ((DEBUG_INFO, "ChipsetInit Binary Location: %x\n", HsioConfig->ChipsetInitBinPtr)); DEBUG ((DEBUG_INFO, "ChipsetInit Binary Size: %x\n", HsioConfig->ChipsetInitBinLen)); #endif return Status; } /** Get the OEM Synps Phy Binary pointer. @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure **/ VOID UpdateOemSnpsPhyPtr ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd ) { EFI_STATUS Status; #if FixedPcdGetBool(PcdFspModeSelection) == 0 PCH_HSIO_CONFIG *HsioConfig; #endif EFI_FIRMWARE_VOLUME_HEADER *FvHeader; EFI_FFS_FILE_HEADER *FfsHeader; UINT32 ModuleAddr; EFI_FV_FILE_INFO OemSnpsFileInfo; ModuleAddr = 0; FvHeader = NULL; #if FixedPcdGetBool(PcdFspModeSelection) == 0 Status = GetConfigBlock ((VOID *) SiPolicy, &gHsioConfigGuid, (VOID *) &HsioConfig); ASSERT_EFI_ERROR (Status); #endif /// /// Find Firmware File System file in Firmware Volume /// Locate Firmware Volume header /// FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FixedPcdGet32 (PcdFlashFvFirmwareBinariesBase); Status = PeiServicesFfsFindFileByName (&gOemSnpsPhyTableGuid, FvHeader, (VOID **)&FfsHeader); if (Status != EFI_SUCCESS) { DEBUG ((DEBUG_INFO, "OEM SnpsPhy Binary not found")); return; } ModuleAddr = (UINT32)((UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER)); Status = PeiServicesFfsGetFileInfo (FfsHeader, &OemSnpsFileInfo); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Error returned by PeiServicesFfsGetFileInfo while retrieving OEM Synps Phy Binary Size\n")); } if (OemSnpsFileInfo.BufferSize == 0) { DEBUG ((DEBUG_INFO, "OEM Synps Phy Binary invalid size \n")); return; } // // Get OEM Synps Phy Binary Pointer // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SynpsPhyBinPtr, HsioConfig->SynpsPhyBinPtr, ModuleAddr); // // Get File Size // UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.SynpsPhyBinLen, HsioConfig->SynpsPhyBinLen, OemSnpsFileInfo.BufferSize); #if FixedPcdGetBool(PcdFspModeSelection) == 1 DEBUG ((DEBUG_INFO, "OEM SynpsPhy Binary Location: %x\n", ((FSPS_UPD *) FspsUpd)->FspsConfig.SynpsPhyBinPtr)); DEBUG ((DEBUG_INFO, "OEM SynpsPhy Binary Size: %x\n", ((FSPS_UPD *) FspsUpd)->FspsConfig.SynpsPhyBinLen)); #else DEBUG ((DEBUG_INFO, "OEM SynpsPhy Binary Location: %x\n", HsioConfig->SynpsPhyBinPtr)); DEBUG ((DEBUG_INFO, "OEM SynpsPhy Binary Size: %x\n", HsioConfig->SynpsPhyBinLen)); #endif } //[-start-211109-IB18410136-add]// /** Update USB3 HSIO config @param[in] SiPolicy Pointer to SI_POLICY_PPI @param[in] FspsUpd Pointer to FspsUpd structure **/ STATIC VOID UpdateUsb3HsioConfig ( IN SI_POLICY_PPI *SiPolicy, IN VOID *FspsUpd ) { UINTN PortIndex; USB3_HSIO_CONFIG *Usb3HsioConfig; EFI_STATUS Status; #if FixedPcdGet8 (PcdFspModeSelection) == 0 Status = GetConfigBlock ((VOID *)SiPolicy, &gUsb3HsioConfigGuid, (VOID *)&Usb3HsioConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } #else Usb3HsioConfig = NULL; #endif for (PortIndex = 0; PortIndex < GetPchXhciMaxUsb3PortNum (); PortIndex++) { UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxDownscaleAmp[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxDownscaleAmp, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxDownscaleAmp))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxDeEmph[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxDeEmph, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxDeEmph))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioCtrlAdaptOffsetCfg[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioCtrlAdaptOffsetCfg, ((UINT8 *)PcdGetPtr (PchUsb3HsioCtrlAdaptOffsetCfg))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioFilterSelN[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioFilterSelN, ((UINT8 *)PcdGetPtr (PchUsb3HsioFilterSelN))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioFilterSelP[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioFilterSelP, ((UINT8 *)PcdGetPtr (PchUsb3HsioFilterSelP))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioOlfpsCfgPullUpDwnRes[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioOlfpsCfgPullUpDwnRes, ((UINT8 *)PcdGetPtr (PchUsb3HsioOlfpsCfgPullUpDwnRes))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxDeEmphEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxDeEmphEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxDeEmphEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxDownscaleAmpEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxDownscaleAmpEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxDownscaleAmpEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioCtrlAdaptOffsetCfgEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioCtrlAdaptOffsetCfgEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioCtrlAdaptOffsetCfgEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioFilterSelNEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioFilterSelNEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioFilterSelNEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioFilterSelPEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioFilterSelPEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioFilterSelPEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.PchUsb3HsioOlfpsCfgPullUpDwnResEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioOlfpsCfgPullUpDwnResEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioOlfpsCfgPullUpDwnResEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate3UniqTran[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate3UniqTran, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate3UniqTran))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate2UniqTran[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate2UniqTran, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate2UniqTran))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate1UniqTran[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate1UniqTran, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate1UniqTran))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate0UniqTran[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate0UniqTran, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate0UniqTran))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate3UniqTranEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate3UniqTranEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate3UniqTranEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate2UniqTranEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate2UniqTranEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate2UniqTranEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate1UniqTranEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate1UniqTranEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate1UniqTranEnable))[PortIndex]); UPDATE_POLICY (((FSPS_UPD *) FspsUpd)->FspsConfig.Usb3HsioTxRate0UniqTranEnable[PortIndex], Usb3HsioConfig->Port[PortIndex].HsioTxRate0UniqTranEnable, ((UINT8 *)PcdGetPtr (PchUsb3HsioTxRate0UniqTranEnable))[PortIndex]); } } //[-end-211109-IB18410136-add]// /** This function performs PCH PEI Policy initialization. @retval EFI_SUCCESS The PPI is installed and initialized. @retval EFI ERRORS The PPI is not successfully installed. @retval EFI_OUT_OF_RESOURCES Do not have enough resources to initialize the driver **/ EFI_STATUS EFIAPI UpdatePeiPchPolicy ( VOID ) { EFI_STATUS Status; EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariableServices; UINTN VariableSize; SA_SETUP SaSetup; CPU_SETUP CpuSetup; PCH_SETUP PchSetup; SETUP_DATA SetupVariables; DEBUG_CONFIG_DATA DebugConfigData; VOID *FspsUpd; SI_POLICY_PPI *SiPolicy; UINT32 BiosGuardEnable; VOID *FspmUpd; SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi; CPU_SECURITY_PREMEM_CONFIG *CpuSecurityPreMemConfig; //[-start-191111-IB10189001-add]// EFI_STATUS CommandStatus; //[-end-191111-IB10189001-add]// DEBUG ((DEBUG_INFO, "Update PeiPchPolicyUpdate Pos-Mem Start\n")); FspsUpd = NULL; FspmUpd = NULL; SiPolicy = NULL; CpuSecurityPreMemConfig = NULL; SiPreMemPolicyPpi = NULL; #if FixedPcdGet8(PcdFspModeSelection) == 1 FspmUpd = (FSPM_UPD *) PcdGet32 (PcdFspmUpdDataAddress); ASSERT (FspmUpd != NULL); FspsUpd = (FSPS_UPD *) PcdGet32 (PcdFspsUpdDataAddress); ASSERT (FspsUpd != NULL); #else Status = PeiServicesLocatePpi (&gSiPolicyPpiGuid, 0, NULL, (VOID **) &SiPolicy); ASSERT_EFI_ERROR (Status); Status = PeiServicesLocatePpi (&gSiPreMemPolicyPpiGuid, 0, NULL, (VOID **) &SiPreMemPolicyPpi); ASSERT_EFI_ERROR (Status); Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gCpuSecurityPreMemConfigGuid, (VOID *) &CpuSecurityPreMemConfig); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } #endif BiosGuardEnable = GetBiosGuardEnable (FspmUpd, CpuSecurityPreMemConfig); // // Retrieve Setup variable // Status = PeiServicesLocatePpi ( &gEfiPeiReadOnlyVariable2PpiGuid, // GUID 0, // INSTANCE NULL, // EFI_PEI_PPI_DESCRIPTOR (VOID **) &VariableServices // PPI ); ASSERT_EFI_ERROR (Status); VariableSize = sizeof (SETUP_DATA); Status = VariableServices->GetVariable ( VariableServices, L"Setup", &gSetupVariableGuid, NULL, &VariableSize, &SetupVariables ); ASSERT_EFI_ERROR (Status); VariableSize = sizeof (SA_SETUP); Status = VariableServices->GetVariable ( VariableServices, L"SaSetup", &gSaSetupVariableGuid, NULL, &VariableSize, &SaSetup ); ASSERT_EFI_ERROR (Status); VariableSize = sizeof (CPU_SETUP); Status = VariableServices->GetVariable ( VariableServices, L"CpuSetup", &gCpuSetupVariableGuid, NULL, &VariableSize, &CpuSetup ); ASSERT_EFI_ERROR (Status); VariableSize = sizeof (PCH_SETUP); Status = VariableServices->GetVariable ( VariableServices, L"PchSetup", &gPchSetupVariableGuid, NULL, &VariableSize, &PchSetup ); ASSERT_EFI_ERROR (Status); VariableSize = sizeof (DEBUG_CONFIG_DATA); Status = VariableServices->GetVariable ( VariableServices, L"DebugConfigData", &gDebugConfigVariableGuid, NULL, &VariableSize, &DebugConfigData ); DEBUG_CODE_BEGIN(); ASSERT_EFI_ERROR (Status); DEBUG_CODE_END(); #if FixedPcdGet8(PcdFspModeSelection) == 1 // // Interrupt Config // UpdateDevIntConfig (FspsUpd); #endif UpdatePchGeneralConfig (SiPolicy, FspsUpd, &PchSetup); UpdateGbeConfig (SiPolicy, FspsUpd, &PchSetup); #if FixedPcdGetBool (PcdEmbeddedEnable) UpdateTsnConfig (SiPolicy, FspsUpd, &PchSetup); #endif UpdateSataConfig (SiPolicy, FspsUpd, &PchSetup); UpdateThcConfig (SiPolicy, FspsUpd, &PchSetup); UpdateDmiConfig (SiPolicy, FspsUpd, &PchSetup); UpdatePcieRpConfig (SiPolicy, FspsUpd, &PchSetup, &SetupVariables); UpdateHdAudioConfig (SiPolicy, SiPreMemPolicyPpi, FspsUpd, FspmUpd, &PchSetup); UpdateLockDownConfig (SiPolicy, FspsUpd, &PchSetup, BiosGuardEnable); UpdateRtcConfig (SiPolicy, FspsUpd, &PchSetup); //[-start-191218-IB16740000-remove]// // UpdateFlashProtectionConfig (SiPolicy, FspsUpd, &PchSetup, BiosGuardEnable); //[-end-191218-IB16740000-remove]// // // FIVR Configuration // #if FixedPcdGetBool(PcdAdlLpSupport) == 1 UpdateFivrConfig (SiPolicy, FspsUpd, &PchSetup); #endif UpdateIehConfig (SiPolicy, FspsUpd, &PchSetup); UpdateIoApicConfig (SiPolicy, FspsUpd, &PchSetup, &SetupVariables); UpdateInterruptConfig (SiPolicy, FspsUpd, &PchSetup); UpdateSerialIoConfig (SiPolicy, FspsUpd, &PchSetup, &DebugConfigData, &SetupVariables); UpdatePmConfig (SiPolicy, FspsUpd, &PchSetup, &SetupVariables); UpdateThermalConfig (SiPolicy, FspsUpd, &PchSetup, &SaSetup); UpdateUsbConfig (SiPolicy, FspsUpd, &PchSetup); UpdatePchUsb2PhyConfig (SiPolicy, FspsUpd, &PchSetup); #if FixedPcdGetBool(PcdAdlLpSupport) == 1 UpdateUfsConfig (SiPolicy, FspsUpd, &PchSetup); #endif UpdateIshConfig (SiPolicy, FspsUpd, &PchSetup); CorrectMismatchConfig (SiPolicy, FspsUpd, &PchSetup); UpdateCnviConfig (SiPolicy, FspsUpd, &PchSetup); UpdateEspiConfig (SiPolicy, FspsUpd, &PchSetup); UpdatePsfConfig (SiPolicy, FspsUpd, &PchSetup); #if FixedPcdGetBool (PcdEmbeddedEnable) UpdateFusaConfig (SiPolicy, FspsUpd, &PchSetup, &SaSetup); #endif UpdateHybridStorageConfig (SiPolicy, FspsUpd, &PchSetup); UpdateSpiConfig (SiPolicy, FspsUpd, &PchSetup); UpdateHsioPolicy (SiPolicy, FspsUpd, &PchSetup); //[-start-211109-IB18410136-add]// UpdateUsb3HsioConfig (SiPolicy, FspsUpd); //[-end-211109-IB18410136-add]// UpdateOemSnpsPhyPtr (SiPolicy, FspsUpd); //[-start-190813-17560011-add]// DEBUG_OEM_SVC ((DEBUG_INFO, "Base OemChipsetServices Call: OemSvcEcSetDswMode \n")); Status = OemSvcEcSetDswMode (&CommandStatus, (UINT8)PchSetup.DeepSxMode); DEBUG_OEM_SVC ((DEBUG_INFO, "Base OemChipsetServices OemSvcEcSetDswMode Status: %r\n", Status)); DEBUG ((DEBUG_INFO | DEBUG_ERROR, "EcSetDswMode ERROR in PeiPchPolicyUpdate! Status is %r.\n", CommandStatus)); //[-end-190813-17560011-add]// return EFI_SUCCESS; }