/** @file Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SystemBoardPei.h" #include #include #include extern IIO_BIFURCATION_ENTRY mIioBifurcationTable[]; extern UINT8 mIioBifurcationTableEntries; extern IIO_SLOT_CONFIG_ENTRY mIioSlotTable[]; extern UINT8 mIioSlotTableEntries; // // System board PPI structure // static SYSTEM_BOARD_PPI mSystemBoardPpi = { SystemIioPortBifurcationInit, // Set IIO Bifurcation ports configuration GetUplinkPortInformation, }; static EFI_PEI_PPI_DESCRIPTOR mSystemBoardPpiDesc = { EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, &gEfiPeiSystemBoardPpiGuid, &mSystemBoardPpi }; /** GetUplinkPortInformation - Get uplink port information @param IioIndex - socket ID. @retval PortIndex for uplink port **/ UINT8 EFIAPI GetUplinkPortInformation ( IN UINT8 IioIndex ) { UINT8 UplinkPortIndex; UplinkPortIndex = GetUplinkPortInformationCommon(IioIndex); return UplinkPortIndex; } /** SystemIioPortBifurcationInit - Program the UDS data structure with OEM IIO init values for SLOTs and Bifurcation. @param mSB - pointer to this protocol @param IioUds - Pointer to the IIO UDS datastructure. @retval EFI_SUCCESS **/ VOID InternalSystemIioPortBifurcationInitCommon ( IN OUT IIO_GLOBALS *IioGlobalData, IN OUT IIO_BIFURCATION_ENTRY **BifurcationTable, IN OUT UINT8 *BifurcationEntries, IN OUT IIO_SLOT_CONFIG_ENTRY **SlotTable, IN OUT UINT8 *SlotEntries ) { UINT8 PortIndex;//, iio; /// This function outline: //// 1 Based on platform apply the default bifurcation and slot configuration. //// 2 Apply dynamic overrides based on GPIO and other configurations. //// 3 Hide unused ports due bifurcation. for (PortIndex = 0; PortIndex < MAX_SOCKET*NUMBER_PORTS_PER_SOCKET; PortIndex++) { IioGlobalData->SetupData.PEXPHIDE[PortIndex] = 0; IioGlobalData->SetupData.HidePEXPMenu[PortIndex] = 0; } *BifurcationEntries = 0; *SlotEntries = 0; // Purley Intel boards are not Multi-PCH IioGlobalData->IioVar.IioVData.MultiPch = 0; *BifurcationTable = (IIO_BIFURCATION_ENTRY *)(UINTN)PcdGet64 (PcdIioBifurcationTable); *BifurcationEntries = PcdGet8 (PcdIioBifurcationTableEntries); *SlotTable = (IIO_SLOT_CONFIG_ENTRY *)(UINTN)PcdGet64 (PcdIioSlotTable); *SlotEntries = PcdGet8 (PcdIioSlotTableEntries); } /** SystemIioPortBifurcationInit - Program the IIO_GLOBALS data structure with OEM IIO init values for SLOTs and Bifurcation. @param mSB - pointer to this protocol @param IioUds - Pointer to the IIO UDS datastructure. @retval EFI_SUCCESS **/ VOID SystemIioPortBifurcationInit ( IN IIO_GLOBALS *IioGlobalData ) { UINT8 IioIndex; IIO_BIFURCATION_ENTRY *BifurcationTable = NULL; UINT8 BifurcationEntries; IIO_SLOT_CONFIG_ENTRY *SlotTable = NULL; UINT8 SlotEntries; // This function outline: // 1. Based on platform apply the default bifurcation and slot configuration. // 2. Apply dynamic overrides based on GPIO and other configurations. // 3. Hide unused ports due bifurcation. SystemIioPortBifurcationInitCommon(IioGlobalData, &BifurcationTable, &BifurcationEntries, &SlotTable, &SlotEntries); /// Set the default bifurcations for this platform. SetBifurcations(IioGlobalData, BifurcationTable, BifurcationEntries); ConfigSlots(IioGlobalData, SlotTable, SlotEntries); OverrideConfigSlots(IioGlobalData, SlotTable, SlotEntries); // All overrides have been applied now. // Hide root ports whose lanes are assigned preceding ports. for (IioIndex = Iio_Socket0; IioIndex < MaxIIO; IioIndex++) { if (IioGlobalData->IioVar.IioVData.SocketPresent[IioIndex]) { SystemHideIioPortsCommon(IioGlobalData, IioIndex); } } } /** This function dump raw data. @param Data raw data @param Size raw data size **/ VOID InternalDumpData ( IN UINT8 *Data, IN UINTN Size ) { UINTN Index; for (Index = 0; Index < Size; Index++) { DEBUG ((EFI_D_INFO, "%02x", (UINTN)Data[Index])); } } /** This function dump raw data with colume format. @param Data raw data @param Size raw data size **/ VOID InternalDumpHex ( IN UINT8 *Data, IN UINTN Size ) { UINTN Index; UINTN Count; UINTN Left; #define COLUME_SIZE (16 * 2) Count = Size / COLUME_SIZE; Left = Size % COLUME_SIZE; for (Index = 0; Index < Count; Index++) { DEBUG ((EFI_D_INFO, "%04x: ", Index * COLUME_SIZE)); InternalDumpData (Data + Index * COLUME_SIZE, COLUME_SIZE); DEBUG ((EFI_D_INFO, "\n")); } if (Left != 0) { DEBUG ((EFI_D_INFO, "%04x: ", Index * COLUME_SIZE)); InternalDumpData (Data + Index * COLUME_SIZE, Left); DEBUG ((EFI_D_INFO, "\n")); } } VOID DumpConfig ( VOID ) { DEBUG ((DEBUG_INFO, "PcdSetupData - 0x%x\n", PcdGetSize (PcdSetupData))); InternalDumpHex (PcdGetPtr (PcdSetupData), PcdGetSize (PcdSetupData)); DEBUG ((DEBUG_INFO, "PcdPchRcConfigurationData - 0x%x\n", PcdGetSize (PcdPchRcConfigurationData))); InternalDumpHex (PcdGetPtr (PcdPchRcConfigurationData), PcdGetSize (PcdPchRcConfigurationData)); DEBUG ((DEBUG_INFO, "PcdSocketIioConfigData - 0x%x\n", PcdGetSize (PcdSocketIioConfigData))); InternalDumpHex (PcdGetPtr (PcdSocketIioConfigData), PcdGetSize (PcdSocketIioConfigData)); DEBUG ((DEBUG_INFO, "PcdSocketCommonRcConfigData - 0x%x\n", PcdGetSize (PcdSocketCommonRcConfigData))); InternalDumpHex (PcdGetPtr (PcdSocketCommonRcConfigData), PcdGetSize (PcdSocketCommonRcConfigData)); DEBUG ((DEBUG_INFO, "PcdSocketMpLinkConfigData - 0x%x\n", PcdGetSize (PcdSocketMpLinkConfigData))); InternalDumpHex (PcdGetPtr (PcdSocketMpLinkConfigData), PcdGetSize (PcdSocketMpLinkConfigData)); DEBUG ((DEBUG_INFO, "PcdSocketMemoryConfigData - 0x%x\n", PcdGetSize (PcdSocketMemoryConfigData))); InternalDumpHex (PcdGetPtr (PcdSocketMemoryConfigData), PcdGetSize (PcdSocketMemoryConfigData)); DEBUG ((DEBUG_INFO, "PcdSocketPowerManagementConfigData - 0x%x\n", PcdGetSize (PcdSocketPowerManagementConfigData))); InternalDumpHex (PcdGetPtr (PcdSocketPowerManagementConfigData), PcdGetSize (PcdSocketPowerManagementConfigData)); DEBUG ((DEBUG_INFO, "PcdSocketProcessorCoreConfigData - 0x%x\n", PcdGetSize (PcdSocketProcessorCoreConfigData))); InternalDumpHex (PcdGetPtr (PcdSocketProcessorCoreConfigData), PcdGetSize (PcdSocketProcessorCoreConfigData)); } // // PEI entry point - SystemBoardPpi entry point // /** PEI system board PPI intialization main entry point. This will setup up a PPI that will handle providing system board level configuration for the platform. @param FileHandle Pointer to the PEIM FFS file header. @param PeiServices General purpose services available to every PEIM. @retval EFI_SUCCESS Operation completed successfully. @retval Otherwise System board initialization failed. **/ EFI_STATUS EFIAPI SystemBoardPeiEntry ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { EFI_STATUS Status; DEBUG ((EFI_D_ERROR, "--> SystemBoard PEI BoardDetection\n")); //DumpConfig (); // // Initialize system board information PPI // Status = PeiServicesInstallPpi(&mSystemBoardPpiDesc); ASSERT_EFI_ERROR (Status); return Status; }