/** @file Source code for the board PCH configuration Pcd init functions for Pre-Memory Init phase. Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "CometlakeURvpInit.h" #include #include #include // for USB 20 AFE & Root Port Clk Info. #include #include /** Board Root Port Clock Info configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS RootPortClkInfoInit ( IN UINT16 BoardId ) { PCD64_BLOB *Clock; UINT32 Index; Clock = AllocateZeroPool (16 * sizeof (PCD64_BLOB)); ASSERT (Clock != NULL); if (Clock == NULL) { return EFI_OUT_OF_RESOURCES; } // // The default clock assignment will be FREE_RUNNING, which corresponds to PchClockUsageUnspecified // This is safe but power-consuming setting. If Platform code doesn't contain port-clock map for a given board, // the clocks will keep on running anyway, allowing PCIe devices to operate. Downside is that clocks will // continue to draw power. To prevent this, remember to provide port-clock map for every board. // for (Index = 0; Index < 16; Index++) { Clock[Index].PcieClock.ClkReqSupported = TRUE; Clock[Index].PcieClock.ClockUsage = FREE_RUNNING; } /// /// Assign ClkReq signal to root port. (Base 0) /// For LP, Set 0 - 5 /// For H, Set 0 - 15 /// Note that if GbE is enabled, ClkReq assigned to GbE will not be available for Root Port. /// switch (BoardId) { // CLKREQ case BoardIdCometLakeULpddr3Rvp: Clock[0].PcieClock.ClockUsage = PCIE_PCH + 1; Clock[1].PcieClock.ClockUsage = PCIE_PCH + 8; Clock[2].PcieClock.ClockUsage = LAN_CLOCK; Clock[3].PcieClock.ClockUsage = PCIE_PCH + 13; Clock[4].PcieClock.ClockUsage = PCIE_PCH + 4; Clock[5].PcieClock.ClockUsage = PCIE_PCH + 14; break; default: break; } PcdSet64S (PcdPcieClock0, Clock[ 0].Blob); PcdSet64S (PcdPcieClock1, Clock[ 1].Blob); PcdSet64S (PcdPcieClock2, Clock[ 2].Blob); PcdSet64S (PcdPcieClock3, Clock[ 3].Blob); PcdSet64S (PcdPcieClock4, Clock[ 4].Blob); PcdSet64S (PcdPcieClock5, Clock[ 5].Blob); PcdSet64S (PcdPcieClock6, Clock[ 6].Blob); PcdSet64S (PcdPcieClock7, Clock[ 7].Blob); PcdSet64S (PcdPcieClock8, Clock[ 8].Blob); PcdSet64S (PcdPcieClock9, Clock[ 9].Blob); PcdSet64S (PcdPcieClock10, Clock[10].Blob); PcdSet64S (PcdPcieClock11, Clock[11].Blob); PcdSet64S (PcdPcieClock12, Clock[12].Blob); PcdSet64S (PcdPcieClock13, Clock[13].Blob); PcdSet64S (PcdPcieClock14, Clock[14].Blob); PcdSet64S (PcdPcieClock15, Clock[15].Blob); return EFI_SUCCESS; } /** Board USB related configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS UsbConfigInit ( IN UINT16 BoardId ) { PCD32_BLOB *UsbPort20Afe; UsbPort20Afe = AllocateZeroPool (PCH_MAX_USB2_PORTS * sizeof (PCD32_BLOB)); ASSERT (UsbPort20Afe != NULL); if (UsbPort20Afe == NULL) { return EFI_OUT_OF_RESOURCES; } // // USB2 AFE settings. // UsbPort20Afe[0].Info.Petxiset = 7; UsbPort20Afe[0].Info.Txiset = 5; UsbPort20Afe[0].Info.Predeemp = 3; UsbPort20Afe[0].Info.Pehalfbit = 0; UsbPort20Afe[1].Info.Petxiset = 7; UsbPort20Afe[1].Info.Txiset = 5; UsbPort20Afe[1].Info.Predeemp = 3; UsbPort20Afe[1].Info.Pehalfbit = 0; UsbPort20Afe[2].Info.Petxiset = 7; UsbPort20Afe[2].Info.Txiset = 5; UsbPort20Afe[2].Info.Predeemp = 3; UsbPort20Afe[2].Info.Pehalfbit = 0; UsbPort20Afe[3].Info.Petxiset = 7; UsbPort20Afe[3].Info.Txiset = 5; UsbPort20Afe[3].Info.Predeemp = 3; UsbPort20Afe[3].Info.Pehalfbit = 0; UsbPort20Afe[4].Info.Petxiset = 7; UsbPort20Afe[4].Info.Txiset = 5; UsbPort20Afe[4].Info.Predeemp = 3; UsbPort20Afe[4].Info.Pehalfbit = 0; UsbPort20Afe[5].Info.Petxiset = 7; UsbPort20Afe[5].Info.Txiset = 5; UsbPort20Afe[5].Info.Predeemp = 3; UsbPort20Afe[5].Info.Pehalfbit = 0; UsbPort20Afe[6].Info.Petxiset = 7; UsbPort20Afe[6].Info.Txiset = 5; UsbPort20Afe[6].Info.Predeemp = 3; UsbPort20Afe[6].Info.Pehalfbit = 0; UsbPort20Afe[7].Info.Petxiset = 7; UsbPort20Afe[7].Info.Txiset = 5; UsbPort20Afe[7].Info.Predeemp = 3; UsbPort20Afe[7].Info.Pehalfbit = 0; UsbPort20Afe[8].Info.Petxiset = 7; UsbPort20Afe[8].Info.Txiset = 5; UsbPort20Afe[8].Info.Predeemp = 3; UsbPort20Afe[8].Info.Pehalfbit = 0; UsbPort20Afe[9].Info.Petxiset = 7; UsbPort20Afe[9].Info.Txiset = 5; UsbPort20Afe[9].Info.Predeemp = 3; UsbPort20Afe[9].Info.Pehalfbit = 0; // // USB Port Over Current Pin // PcdSet8S (PcdUsb20OverCurrentPinPort0, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort1, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort2, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort3, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort4, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort5, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort6, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort7, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort8, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort9, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort10, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort11, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort12, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort13, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort14, UsbOverCurrentPinMax); PcdSet8S (PcdUsb20OverCurrentPinPort15, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort0, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort1, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort2, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort3, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort4, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort5, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort6, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort7, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort8, UsbOverCurrentPinMax); PcdSet8S (PcdUsb30OverCurrentPinPort9, UsbOverCurrentPinMax); switch (BoardId) { case BoardIdCometLakeULpddr3Rvp: PcdSet8S (PcdUsb20OverCurrentPinPort0, UsbOverCurrentPin2); PcdSet8S (PcdUsb20OverCurrentPinPort1, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort2, UsbOverCurrentPin2); PcdSet8S (PcdUsb20OverCurrentPinPort3, UsbOverCurrentPin2); PcdSet8S (PcdUsb20OverCurrentPinPort4, UsbOverCurrentPin3); PcdSet8S (PcdUsb20OverCurrentPinPort5, UsbOverCurrentPin3); PcdSet8S (PcdUsb20OverCurrentPinPort6, UsbOverCurrentPin3); PcdSet8S (PcdUsb20OverCurrentPinPort7, UsbOverCurrentPin3); PcdSet8S (PcdUsb20OverCurrentPinPort8, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort9, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort10, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort11, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort12, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort13, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort14, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb20OverCurrentPinPort15, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort0, UsbOverCurrentPin2); PcdSet8S (PcdUsb30OverCurrentPinPort1, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort2, UsbOverCurrentPin2); PcdSet8S (PcdUsb30OverCurrentPinPort3, UsbOverCurrentPin2); PcdSet8S (PcdUsb30OverCurrentPinPort4, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort5, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort6, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort7, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort8, UsbOverCurrentPinSkip); PcdSet8S (PcdUsb30OverCurrentPinPort9, UsbOverCurrentPinSkip); // USB2.0 AFE settings UsbPort20Afe[0].Info.Petxiset = 4; UsbPort20Afe[0].Info.Txiset = 0; UsbPort20Afe[0].Info.Predeemp = 3; UsbPort20Afe[0].Info.Pehalfbit = 0; UsbPort20Afe[1].Info.Petxiset = 4; UsbPort20Afe[1].Info.Txiset = 0; UsbPort20Afe[1].Info.Predeemp = 3; UsbPort20Afe[1].Info.Pehalfbit = 0; UsbPort20Afe[2].Info.Petxiset = 4; UsbPort20Afe[2].Info.Txiset = 0; UsbPort20Afe[2].Info.Predeemp = 3; UsbPort20Afe[2].Info.Pehalfbit = 0; UsbPort20Afe[3].Info.Petxiset = 4; UsbPort20Afe[3].Info.Txiset = 0; UsbPort20Afe[3].Info.Predeemp = 3; UsbPort20Afe[3].Info.Pehalfbit = 0; UsbPort20Afe[4].Info.Petxiset = 4; UsbPort20Afe[4].Info.Txiset = 0; UsbPort20Afe[4].Info.Predeemp = 3; UsbPort20Afe[4].Info.Pehalfbit = 0; UsbPort20Afe[5].Info.Petxiset = 4; UsbPort20Afe[5].Info.Txiset = 0; UsbPort20Afe[5].Info.Predeemp = 3; UsbPort20Afe[5].Info.Pehalfbit = 0; UsbPort20Afe[6].Info.Petxiset = 4; UsbPort20Afe[6].Info.Txiset = 0; UsbPort20Afe[6].Info.Predeemp = 3; UsbPort20Afe[6].Info.Pehalfbit = 0; UsbPort20Afe[7].Info.Petxiset = 4; UsbPort20Afe[7].Info.Txiset = 0; UsbPort20Afe[7].Info.Predeemp = 3; UsbPort20Afe[7].Info.Pehalfbit = 0; UsbPort20Afe[8].Info.Petxiset = 4; UsbPort20Afe[8].Info.Txiset = 0; UsbPort20Afe[8].Info.Predeemp = 3; UsbPort20Afe[8].Info.Pehalfbit = 0; UsbPort20Afe[9].Info.Petxiset = 4; UsbPort20Afe[9].Info.Txiset = 0; UsbPort20Afe[9].Info.Predeemp = 3; UsbPort20Afe[9].Info.Pehalfbit = 0; break; } // // Save USB2.0 AFE blobs // PcdSet32S (PcdUsb20Port0Afe, UsbPort20Afe[ 0].Blob); PcdSet32S (PcdUsb20Port1Afe, UsbPort20Afe[ 1].Blob); PcdSet32S (PcdUsb20Port2Afe, UsbPort20Afe[ 2].Blob); PcdSet32S (PcdUsb20Port3Afe, UsbPort20Afe[ 3].Blob); PcdSet32S (PcdUsb20Port4Afe, UsbPort20Afe[ 4].Blob); PcdSet32S (PcdUsb20Port5Afe, UsbPort20Afe[ 5].Blob); PcdSet32S (PcdUsb20Port6Afe, UsbPort20Afe[ 6].Blob); PcdSet32S (PcdUsb20Port7Afe, UsbPort20Afe[ 7].Blob); PcdSet32S (PcdUsb20Port8Afe, UsbPort20Afe[ 8].Blob); PcdSet32S (PcdUsb20Port9Afe, UsbPort20Afe[ 9].Blob); PcdSet32S (PcdUsb20Port10Afe, UsbPort20Afe[10].Blob); PcdSet32S (PcdUsb20Port11Afe, UsbPort20Afe[11].Blob); PcdSet32S (PcdUsb20Port12Afe, UsbPort20Afe[12].Blob); PcdSet32S (PcdUsb20Port13Afe, UsbPort20Afe[13].Blob); PcdSet32S (PcdUsb20Port14Afe, UsbPort20Afe[14].Blob); PcdSet32S (PcdUsb20Port15Afe, UsbPort20Afe[15].Blob); return EFI_SUCCESS; } /** Board GPIO Group Tier configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS GpioGroupTierInit ( IN UINT16 BoardId ) { // // GPIO Group Tier // switch (BoardId) { case BoardIdCometLakeULpddr3Rvp: PcdSet32S (PcdGpioGroupToGpeDw0, GPIO_CNL_LP_GROUP_GPP_G); PcdSet32S (PcdGpioGroupToGpeDw1, GPIO_CNL_LP_GROUP_SPI); PcdSet32S (PcdGpioGroupToGpeDw2, GPIO_CNL_LP_GROUP_GPP_E); break; default: PcdSet32S (PcdGpioGroupToGpeDw0, 0); PcdSet32S (PcdGpioGroupToGpeDw1, 0); PcdSet32S (PcdGpioGroupToGpeDw2, 0); break; } return EFI_SUCCESS; } /** GPIO init function for PEI pre-memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS GpioTablePreMemInit ( IN UINT16 BoardId ) { // // GPIO Table Init. // switch (BoardId) { case BoardIdCometLakeULpddr3Rvp: PcdSet32S (PcdBoardGpioTablePreMem, (UINTN) mGpioTableCmlULpddr3PreMem); PcdSet16S (PcdBoardGpioTablePreMemSize, mGpioTableCmlULpddr3PreMemSize); PcdSet32S(PcdBoardGpioTableWwanOnEarlyPreMem, (UINTN) mGpioTableCmlULpddr3WwanOnEarlyPreMem); PcdSet16S(PcdBoardGpioTableWwanOnEarlyPreMemSize, mGpioTableCmlULpddr3WwanOnEarlyPreMemSize); PcdSet32S(PcdBoardGpioTableWwanOffEarlyPreMem, (UINTN) mGpioTableCmlULpddr3WwanOffEarlyPreMem); PcdSet16S(PcdBoardGpioTableWwanOffEarlyPreMemSize, mGpioTableCmlULpddr3WwanOffEarlyPreMemSize); break; default: break; } return EFI_SUCCESS; } /** PmConfig init function for PEI pre-memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS PchPmConfigInit ( IN UINT16 BoardId ) { // // Update PmCofig policy: output voltage of VCCPRIMCORE RAIL when SLP_S0# is asserted based on board HW design // 1) Discete VR or Non Premium PMIC: 0.75V (PcdSlpS0Vm075VSupport) // 2) Premium PMIC: runtime control for voltage (PcdSlpS0VmRuntimeControl) // Only applys to board with PCH-LP. Board with Discrete PCH doesn't need this setting. // switch (BoardId) { // Discrete VR solution case BoardIdCometLakeULpddr3Rvp: PcdSetBoolS (PcdSlpS0VmRuntimeControl, FALSE); PcdSetBoolS (PcdSlpS0Vm070VSupport, FALSE); PcdSetBoolS (PcdSlpS0Vm075VSupport, TRUE); break; default: PcdSetBoolS (PcdSlpS0VmRuntimeControl, FALSE); PcdSetBoolS (PcdSlpS0Vm070VSupport, FALSE); PcdSetBoolS (PcdSlpS0Vm075VSupport, FALSE); break; } return EFI_SUCCESS; }