From 88d98451d5ffb3bb20d6c639afc4bb5e927e2559 Mon Sep 17 00:00:00 2001 From: zwei4 Date: Fri, 5 Jan 2018 15:59:56 +0800 Subject: Aurora Glacier Code. Add board specific code for Aurora Glacier. Build command is "BuildBIOS /AG /A /vs13 Broxton Release". Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: zwei4 --- .../AuroraGlacier/BoardInitPreMem/BoardInit.c | 183 +++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 Platform/BroxtonPlatformPkg/Board/AuroraGlacier/BoardInitPreMem/BoardInit.c (limited to 'Platform/BroxtonPlatformPkg/Board/AuroraGlacier/BoardInitPreMem/BoardInit.c') diff --git a/Platform/BroxtonPlatformPkg/Board/AuroraGlacier/BoardInitPreMem/BoardInit.c b/Platform/BroxtonPlatformPkg/Board/AuroraGlacier/BoardInitPreMem/BoardInit.c new file mode 100644 index 0000000000..bda774cb2a --- /dev/null +++ b/Platform/BroxtonPlatformPkg/Board/AuroraGlacier/BoardInitPreMem/BoardInit.c @@ -0,0 +1,183 @@ +/** @file + Board Init driver. + + Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "BoardInit.h" + +EFI_STATUS +EFIAPI +AuroraGlacierPreMemInit ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN PEI_BOARD_PRE_MEM_INIT_PPI *This + ); + +static PEI_BOARD_PRE_MEM_INIT_PPI mAuroraPreMemInitPpiInstance = { + AuroraGlacierPreMemInit +}; + +static EFI_PEI_PPI_DESCRIPTOR mAuroraGlacierPreMemInitPpi = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gBoardPreMemInitPpiGuid, + &mAuroraPreMemInitPpiInstance +}; + +static EFI_PEI_PPI_DESCRIPTOR mAuroraGlacierPreMemInitDonePpi = { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gBoardPreMemInitDoneGuid, + NULL +}; + +EFI_STATUS +EFIAPI +AuroraGlacierPreMemInit ( + IN CONST EFI_PEI_SERVICES **PeiServices, + IN PEI_BOARD_PRE_MEM_INIT_PPI *This + ) +{ + EFI_STATUS Status; + VOID *Instance; + UINT8 BoardId; + UINT8 FabId; + + BoardId = 0; + FabId = 0; + Status = PeiServicesLocatePpi ( + &gBoardPreMemInitDoneGuid, + 0, + NULL, + &Instance + ); + if (!EFI_ERROR (Status)) { + return EFI_SUCCESS; + } + + // + // Pre Mem Board Init + // + Status = AuroraGetBoardId (PeiServices, &BoardId); + + if (BoardId != (UINT8) BOARD_ID_AURORA) { + return EFI_SUCCESS; + } + + DEBUG ((EFI_D_INFO, "This is Aurora Glacier board.\n")); + + // + //Status = AuroraGetFabId (PeiServices, &FabId); + //if (FabId == 1) { + // DEBUG ((EFI_D_INFO, "This is Aurora Glacier FAB B.\n")); + //} else if (FabId == 0) { + // DEBUG ((EFI_D_INFO, "This is Aurora Glacier FAB A.\n")); + //} + // + FabId = 0; + + PcdSet8 (PcdBoardId, BoardId); + PcdSet8 (PcdFabId, FabId); + + // + // Set board specific function as dynamic PCD to be called by common platform code + // + PcdSet64 (PcdUpdateFspmUpdFunc, (UINT64) (UINTN) mAuroraUpdateFspmUpdPtr); + PcdSet64 (PcdDramCreatePolicyDefaultsFunc, (UINT64) (UINTN) mAuroraDramCreatePolicyDefaultsPtr); + + // + // Install a flag signalling a board is detected and pre-mem init is done + // + Status = PeiServicesInstallPpi (&mAuroraGlacierPreMemInitDonePpi); + + return EFI_SUCCESS; +} + + +/** + This function performs Board initialization in Pre-Memory. + + @retval EFI_SUCCESS The PPI is installed and initialized. + @retval EFI ERRORS The PPI is not successfully installed. + @retval EFI_OUT_OF_RESOURCES No enough resoruces (such as out of memory). + +**/ +EFI_STATUS +EFIAPI +AuroraGlacierInitConstructor ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + VOID *Ppi; + EFI_PEI_PPI_DESCRIPTOR *PeiPpiDescriptor; + UINTN Instance; + + DEBUG ((EFI_D_INFO, "AuroraGlacier Pre Mem Init Constructor \n")); + + Status = PeiServicesLocatePpi ( + &gBoardPreMemInitDoneGuid, + 0, + &PeiPpiDescriptor, + &Ppi + ); + if (!EFI_ERROR (Status)) { + // + // Board detection previously done, so this is a re-invocation shadowed in memory. + // Reinstall PPIs to eliminate PPI descriptors in torn down temp RAM. + // + // + // Reinstall PreMemInit Done PPI + // + DEBUG ((EFI_D_INFO, "Reinstall Pre Mem Init Done PPI\n")); + Status = PeiServicesReInstallPpi ( + PeiPpiDescriptor, + &mAuroraGlacierPreMemInitDonePpi + ); + ASSERT_EFI_ERROR (Status); + + // + // Reinstall all instances of Pre Mem Init PPIs. + // These PPIs are no longer used so it doesn't matter which board's instance is finally installed. + // According to PeiServicesReInstallPpi behavior: + // The first run of this loop would replace all descrioptors with a singe in-RAM descriptor; + // Subsequent runs of this loop will only replace the first (already in-RAM) descriptor. + // As long as all descriptors are in ram, we are fine. + // + Instance = 0; + do { + Status = PeiServicesLocatePpi ( + &gBoardPreMemInitPpiGuid, + Instance, + &PeiPpiDescriptor, + &Ppi + ); + if (Status == EFI_NOT_FOUND) { + break; + } + ASSERT_EFI_ERROR (Status); + DEBUG ((EFI_D_INFO, "Reinstall Pre Mem Init PPI\n")); + Status = PeiServicesReInstallPpi ( + PeiPpiDescriptor, + &mAuroraGlacierPreMemInitPpi + ); + ASSERT_EFI_ERROR (Status); + + Instance++; + } while (TRUE); + return Status; + } + + DEBUG ((EFI_D_INFO, "Install Pre Mem Init PPI \n")); + Status = PeiServicesInstallPpi (&mAuroraGlacierPreMemInitPpi); + return Status; +} + -- cgit v1.2.3