/** @file
  This file declares Sec Platform Information2 PPI.

  This service is the primary handoff state into the PEI Foundation.
  This service abstracts platform-specific information for many CPU's.

Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that 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.

  @par Revision Reference:
  This PPI is introduced from PI Version 1.4.

**/

#ifndef __SEC_PLATFORM_INFORMATION2_PPI_H__
#define __SEC_PLATFORM_INFORMATION2_PPI_H__

#include <Ppi/SecPlatformInformation.h>

#define EFI_SEC_PLATFORM_INFORMATION2_GUID \
  { \
    0x9e9f374b, 0x8f16, 0x4230, {0x98, 0x24, 0x58, 0x46, 0xee, 0x76, 0x6a, 0x97 } \
  }

typedef struct _EFI_SEC_PLATFORM_INFORMATION2_PPI EFI_SEC_PLATFORM_INFORMATION2_PPI;

///
/// EFI_SEC_PLATFORM_INFORMATION_CPU.
///
typedef struct {
  UINT32                               CpuLocation;
  EFI_SEC_PLATFORM_INFORMATION_RECORD  InfoRecord;
} EFI_SEC_PLATFORM_INFORMATION_CPU;

///
/// EFI_SEC_PLATFORM_INFORMATION_RECORD2.
///
typedef struct {
  ///
  /// The CPU location would be the local APIC ID
  ///
  UINT32                               NumberOfCpus;
  EFI_SEC_PLATFORM_INFORMATION_CPU     CpuInstance[1];
} EFI_SEC_PLATFORM_INFORMATION_RECORD2;

/**
  This interface conveys state information out of the Security (SEC) phase into PEI.

  This service is published by the SEC phase.

  @param  PeiServices                The pointer to the PEI Services Table.
  @param  StructureSize              The pointer to the variable describing size of the input buffer.
  @param  PlatformInformationRecord2 The pointer to the EFI_SEC_PLATFORM_INFORMATION_RECORD2.

  @retval EFI_SUCCESS                The data was successfully returned.
  @retval EFI_BUFFER_TOO_SMALL       The buffer was too small. The current buffer size needed to
                                     hold the record is returned in StructureSize.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SEC_PLATFORM_INFORMATION2)(
  IN CONST  EFI_PEI_SERVICES                     **PeiServices,
  IN OUT    UINT64                               *StructureSize,
  OUT       EFI_SEC_PLATFORM_INFORMATION_RECORD2 *PlatformInformationRecord2
);

///
/// This service abstracts platform-specific information for many CPU's.
/// It is the multi-processor equivalent of PlatformInformation for
/// implementations that synchronize some, if not all CPU's in the SEC phase.
///
struct _EFI_SEC_PLATFORM_INFORMATION2_PPI {
  EFI_SEC_PLATFORM_INFORMATION2  PlatformInformation2;
};

extern EFI_GUID gEfiSecPlatformInformation2PpiGuid;

#endif
