/** @file
  CPU Features PEIM driver to initialize CPU features.

  Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PiPei.h>

#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/PeiServicesLib.h>
#include <Library/RegisterCpuFeaturesLib.h>
#include <Library/HobLib.h>

#include <Guid/CpuFeaturesInitDone.h>

EFI_PEI_PPI_DESCRIPTOR  mPeiCpuFeaturesInitDonePpiDesc = {
  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  &gEdkiiCpuFeaturesInitDoneGuid,
  NULL
};

/**
  CPU Features driver entry point function.

  It will perform CPU features initialization, except for
  PcdCpuFeaturesInitOnS3Resume is FALSE on S3 resume.

  @param  FileHandle    Handle of the file being invoked.
  @param  PeiServices   Describes the list of possible PEI Services.

  @retval EFI_SUCCESS   CPU Features is initialized successfully.
**/
EFI_STATUS
EFIAPI
CpuFeaturesPeimInitialize (
  IN       EFI_PEI_FILE_HANDLE  FileHandle,
  IN CONST EFI_PEI_SERVICES     **PeiServices
  )
{
  EFI_STATUS     Status;
  EFI_BOOT_MODE  BootMode;

  Status = PeiServicesGetBootMode (&BootMode);
  ASSERT_EFI_ERROR (Status);

  if ((BootMode == BOOT_ON_S3_RESUME) &&
      !PcdGetBool (PcdCpuFeaturesInitOnS3Resume))
  {
    //
    // Does nothing when if PcdCpuFeaturesInitOnS3Resume is FLASE
    // on S3 boot mode
    //
    return EFI_SUCCESS;
  }

  CpuFeaturesDetect ();

  CpuFeaturesInitialize ();

  //
  // Install CPU Features Init Done PPI
  //
  Status = PeiServicesInstallPpi (&mPeiCpuFeaturesInitDonePpiDesc);
  ASSERT_EFI_ERROR (Status);

  //
  // Build HOB to let CpuFeatureDxe driver skip the initialization process.
  //
  BuildGuidHob (&gEdkiiCpuFeaturesInitDoneGuid, 0);

  return EFI_SUCCESS;
}
