123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /** @file
- Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "SystemBoardPei.h"
- #include <Library/BaseMemoryLib.h>
- #include <Library/MemoryAllocationLib.h>
- #include <IioBifurcationSlotTable.h>
- 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;
- }
|