/** @file PCH RESET PEIM DRIVER. Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include /** Execute Pch Reset from the host controller. @param[in] This Pointer to the PCH_RESET_PPI instance. @param[in] PchResetType Pch Reset Types which includes PchColdReset, PchWarmReset, PchShutdownReset, PchGlobalReset @retval EFI_SUCCESS Successfully completed. @retval EFI_INVALID_PARAMETER If ResetType is invalid. **/ EFI_STATUS EFIAPI Reset ( IN PCH_RESET_PPI *This, IN PCH_RESET_TYPE PchResetType ) { PCH_RESET_DATA ResetData; switch (PchResetType) { case PchColdReset: ResetCold(); break; case PchWarmReset: ResetWarm(); break; case PchShutdownReset: ResetShutdown(); break; case PchGlobalReset: CopyMem (&ResetData.Guid, &gPchGlobalResetGuid, sizeof (EFI_GUID)); StrCpyS (ResetData.Description, PCH_RESET_DATA_STRING_MAX_LENGTH, PCH_PLATFORM_SPECIFIC_RESET_STRING); ResetPlatformSpecific (sizeof (PCH_RESET_DATA), &ResetData); break; default: return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } /** Initialize PCH Reset APIs @retval EFI_SUCCESS APIs are installed successfully @retval EFI_OUT_OF_RESOURCES Can't allocate pool **/ EFI_STATUS EFIAPI PchInitializeReset ( VOID ) { EFI_STATUS Status; PCH_RESET_PPI *PeiPchResetPpi; EFI_PEI_PPI_DESCRIPTOR *PeiPchResetDescriptor; EFI_PEI_RESET2_PPI *EfiPeiReset2Ppi; EFI_PEI_PPI_DESCRIPTOR *EfiPeiReset2Descriptor; DEBUG ((DEBUG_INFO, "PchInitializeReset() Start\n")); PeiPchResetDescriptor = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); PeiPchResetPpi = (PCH_RESET_PPI *) AllocateZeroPool (sizeof (PCH_RESET_PPI)); if ((PeiPchResetDescriptor == NULL) || (PeiPchResetPpi == NULL)) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } /// /// Initialize the Reset ppi instance /// PeiPchResetPpi->Reset = Reset; PeiPchResetDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; PeiPchResetDescriptor->Guid = &gPchResetPpiGuid; PeiPchResetDescriptor->Ppi = PeiPchResetPpi; /// /// Install the PCH RESET PPI /// Status = PeiServicesInstallPpi (PeiPchResetDescriptor); ASSERT_EFI_ERROR (Status); EfiPeiReset2Descriptor = (EFI_PEI_PPI_DESCRIPTOR *) AllocateZeroPool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); EfiPeiReset2Ppi = (EFI_PEI_RESET2_PPI *) AllocateZeroPool (sizeof (EFI_PEI_RESET2_PPI)); if ((EfiPeiReset2Descriptor == NULL) || (EfiPeiReset2Ppi == NULL)) { ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } /// /// Initialize the EFI Reset2 ppi instance /// EfiPeiReset2Ppi->ResetSystem = ResetSystem; EfiPeiReset2Descriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; EfiPeiReset2Descriptor->Guid = &gEfiPeiReset2PpiGuid; EfiPeiReset2Descriptor->Ppi = EfiPeiReset2Ppi; Status = PeiServicesInstallPpi (EfiPeiReset2Descriptor); ASSERT_EFI_ERROR (Status); DEBUG ((DEBUG_INFO, "PchInitializeReset() End\n")); return Status; }