/** @file
  Native Platform Configuration Database (PCD) PPI

  Different with the EFI_PCD_PPI defined in PI 1.2 specification, the native
  PCD PPI provide interfaces for dynamic and dynamic-ex type PCD.
  The interfaces for dynamic type PCD do not require the token space guid as parameter,
  but interfaces for dynamic-ex type PCD require token space guid as parameter.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __PCD_PPI_H__
#define __PCD_PPI_H__

#define PCD_PPI_GUID \
  { 0x6e81c58, 0x4ad7, 0x44bc, { 0x83, 0x90, 0xf1, 0x2, 0x65, 0xf7, 0x24, 0x80 } }

#define PCD_INVALID_TOKEN_NUMBER  ((UINTN) 0)

/**
  Sets the SKU value for subsequent calls to set or get PCD token values.

  SetSku() sets the SKU Id to be used for subsequent calls to set or get PCD values.
  SetSku() is normally called only once by the system.

  For each item (token), the database can hold a single value that applies to all SKUs,
  or multiple values, where each value is associated with a specific SKU Id. Items with multiple,
  SKU-specific values are called SKU enabled.

  The SKU Id of zero is reserved as a default. The valid SkuId range is 1 to 255.
  For tokens that are not SKU enabled, the system ignores any set SKU Id and works with the
  single value for that token. For SKU-enabled tokens, the system will use the SKU Id set by the
  last call to SetSku(). If no SKU Id is set or the currently set SKU Id isn't valid for the specified token,
  the system uses the default SKU Id. If the system attempts to use the default SKU Id and no value has been
  set for that Id, the results are unpredictable.

  @param[in]  SkuId The SKU value that will be used when the PCD service will retrieve and
              set values associated with a PCD token.

  @retval VOID

**/
typedef
VOID
(EFIAPI *PCD_PPI_SET_SKU)(
  IN  UINTN          SkuId
  );

/**
  Retrieves an 8-bit value for a given PCD token.

  Retrieves the current byte-sized value for a PCD token number.
  If the TokenNumber is invalid, the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The UINT8 value.

**/
typedef
UINT8
(EFIAPI *PCD_PPI_GET8)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves a 16-bit value for a given PCD token.

  Retrieves the current 16-bit value for a PCD token number.
  If the TokenNumber is invalid, the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The UINT16 value.

**/
typedef
UINT16
(EFIAPI *PCD_PPI_GET16)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves a 32-bit value for a given PCD token.

  Retrieves the current 32-bit value for a PCD token number.
  If the TokenNumber is invalid, the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The UINT32 value.

**/
typedef
UINT32
(EFIAPI *PCD_PPI_GET32)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves a 64-bit value for a given PCD token.

  Retrieves the current 64-bit value for a PCD token number.
  If the TokenNumber is invalid, the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The UINT64 value.

**/
typedef
UINT64
(EFIAPI *PCD_PPI_GET64)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves a pointer to a value for a given PCD token.

  Retrieves the current pointer to the buffer for a PCD token number.
  Do not make any assumptions about the alignment of the pointer that
  is returned by this function call.  If the TokenNumber is invalid,
  the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The pointer to the buffer to be retrieved.

**/
typedef
VOID *
(EFIAPI *PCD_PPI_GET_POINTER)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves a Boolean value for a given PCD token.

  Retrieves the current boolean value for a PCD token number.
  Do not make any assumptions about the alignment of the pointer that
  is returned by this function call.  If the TokenNumber is invalid,
  the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The Boolean value.

**/
typedef
BOOLEAN
(EFIAPI *PCD_PPI_GET_BOOLEAN)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves the size of the value for a given PCD token.

  Retrieves the current size of a particular PCD token.
  If the TokenNumber is invalid, the results are unpredictable.

  @param[in]  TokenNumber The PCD token number.

  @return The size of the value for the PCD token.

**/
typedef
UINTN
(EFIAPI *PCD_PPI_GET_SIZE)(
  IN UINTN             TokenNumber
  );

/**
  Retrieves an 8-bit value for a given PCD token and token space.

  Retrieves the 8-bit value of a particular PCD token.
  If the TokenNumber is invalid or the token space
  specified by Guid does not exist, the results are
  unpredictable.

  @param[in]  Guid        The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The size 8-bit value for the PCD token.

**/
typedef
UINT8
(EFIAPI *PCD_PPI_GET_EX_8)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Retrieves a 16-bit value for a given PCD token and token space.

  Retrieves the 16-bit value of a particular PCD token.
  If the TokenNumber is invalid or the token space
  specified by Guid does not exist, the results are
  unpredictable.

  @param[in]  Guid        The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The size 16-bit value for the PCD token.

**/
typedef
UINT16
(EFIAPI *PCD_PPI_GET_EX_16)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Retrieves a 32-bit value for a given PCD token and token space.

  Retrieves the 32-bit value of a particular PCD token.
  If the TokenNumber is invalid or the token space
  specified by Guid does not exist, the results are
  unpredictable.

  @param[in]  Guid        The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The size 32-bit value for the PCD token.

**/
typedef
UINT32
(EFIAPI *PCD_PPI_GET_EX_32)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Retrieves a 64-bit value for a given PCD token and token space.

  Retrieves the 64-bit value of a particular PCD token.
  If the TokenNumber is invalid or the token space
  specified by Guid does not exist, the results are
  unpredictable.

  @param[in]  Guid        The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The size 64-bit value for the PCD token.

**/
typedef
UINT64
(EFIAPI *PCD_PPI_GET_EX_64)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Retrieves a pointer to a value for a given PCD token and token space.

  Retrieves the current pointer to the buffer for a PCD token number.
  Do not make any assumptions about the alignment of the pointer that
  is returned by this function call.  If the TokenNumber is invalid,
  the results are unpredictable.

  @param[in]  Guid        The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The pointer to the buffer to be retrieved.

**/
typedef
VOID *
(EFIAPI *PCD_PPI_GET_EX_POINTER)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Retrieves an Boolean value for a given PCD token and token space.

  Retrieves the Boolean value of a particular PCD token.
  If the TokenNumber is invalid or the token space
  specified by Guid does not exist, the results are
  unpredictable.

  @param[in]  Guid The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The size Boolean value for the PCD token.

**/
typedef
BOOLEAN
(EFIAPI *PCD_PPI_GET_EX_BOOLEAN)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Retrieves the size of the value for a given PCD token and token space.

  Retrieves the current size of a particular PCD token.
  If the TokenNumber is invalid, the results are unpredictable.

  @param[in]  Guid        The token space for the token number.
  @param[in]  TokenNumber The PCD token number.

  @return The size of the value for the PCD token.

**/
typedef
UINTN
(EFIAPI *PCD_PPI_GET_EX_SIZE)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber
  );

/**
  Sets an 8-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET8)(
  IN UINTN             TokenNumber,
  IN UINT8             Value
  );

/**
  Sets a 16-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET16)(
  IN UINTN              TokenNumber,
  IN UINT16             Value
  );

/**
  Sets a 32-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET32)(
  IN UINTN             TokenNumber,
  IN UINT32            Value
  );

/**
  Sets a 64-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET64)(
  IN UINTN             TokenNumber,
  IN UINT64            Value
  );

/**
  Sets a value of a specified size for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]      TokenNumber  The PCD token number.
  @param[in, out] SizeOfValue  A pointer to the length of the value being set for the PCD token.
                               On input, if the SizeOfValue is greater than the maximum size supported
                               for this TokenNumber then the output value of SizeOfValue will reflect
                               the maximum size supported for this TokenNumber.
  @param[in]      Buffer       The buffer to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_POINTER)(
  IN        UINTN             TokenNumber,
  IN OUT    UINTN             *SizeOfValue,
  IN        VOID              *Buffer
  );

/**
  Sets an Boolean value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_BOOLEAN)(
  IN UINTN             TokenNumber,
  IN BOOLEAN           Value
  );

/**
  Sets an 8-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  Guid        The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_EX_8)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber,
  IN       UINT8       Value
  );

/**
  Sets a 16-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  Guid        The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_EX_16)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber,
  IN       UINT16      Value
  );

/**
  Sets a 32-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  Guid        The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_EX_32)(
  IN CONST EFI_GUID    *Guid,
  IN       UINTN       TokenNumber,
  IN       UINT32      Value
  );

/**
  Sets a 64-bit value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  Guid        The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_EX_64)(
  IN CONST EFI_GUID     *Guid,
  IN       UINTN        TokenNumber,
  IN       UINT64       Value
  );

/**
  Sets a value of a specified size for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]      Guid         The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]      TokenNumber  The PCD token number.
  @param[in, out] SizeOfValue  A pointer to the length of the value being set for the PCD token.
                               On input, if the SizeOfValue is greater than the maximum size supported
                               for this TokenNumber then the output value of SizeOfValue will reflect
                               the maximum size supported for this TokenNumber.
  @param[in]      Buffer       The buffer to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_EX_POINTER)(
  IN CONST EFI_GUID          *Guid,
  IN       UINTN             TokenNumber,
  IN OUT   UINTN             *SizeOfValue,
  IN       VOID              *Buffer
  );

/**
  Sets an Boolean value for a given PCD token.

  When the PCD service sets a value, it will check to ensure that the
  size of the value being set is compatible with the Token's existing definition.
  If it is not, an error will be returned.

  @param[in]  Guid        The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  TokenNumber The PCD token number.
  @param[in]  Value       The value to set for the PCD token.

  @retval EFI_SUCCESS           The procedure returned successfully.
  @retval EFI_INVALID_PARAMETER The PCD service determined that the size of the data
                                being set was incompatible with a call to this function.
                                Use GetSize() to retrieve the size of the target data.
  @retval EFI_NOT_FOUND         The PCD service could not find the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_SET_EX_BOOLEAN)(
  IN CONST EFI_GUID          *Guid,
  IN       UINTN             TokenNumber,
  IN       BOOLEAN           Value
  );

/**
  Callback on SET function prototype definition.

  This notification function serves two purposes. Firstly, it notifies the module
  which did the registration that the value of this PCD token has been set. Secondly,
  it provides a mechanism for the module which did the registration to intercept the set
  operation and override the value been set if necessary. After the invocation of the
  callback function, TokenData will be used by PCD service PEIM to modify the internal data
  in PCD database.

  @param[in]      CallBackGuid  The PCD token GUID being set.
  @param[in]      CallBackToken The PCD token number being set.
  @param[in, out] TokenData     A pointer to the token data being set.
  @param[in]      TokenDataSize The size, in bytes, of the data being set.

  @retval VOID

**/
typedef
VOID
(EFIAPI *PCD_PPI_CALLBACK)(
  IN CONST EFI_GUID         *CallBackGuid  OPTIONAL,
  IN       UINTN            CallBackToken,
  IN OUT   VOID             *TokenData,
  IN       UINTN            TokenDataSize
  );

/**
  Specifies a function to be called anytime the value of a designated token is changed.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  CallBackFunction The function prototype called when the value associated with the CallBackToken is set.

  @retval EFI_SUCCESS  The PCD service has successfully established a call event
                        for the CallBackToken requested.
  @retval EFI_NOT_FOUND The PCD service could not find the referenced token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_CALLBACK_ONSET)(
  IN  CONST EFI_GUID               *Guid  OPTIONAL,
  IN        UINTN                  TokenNumber,
  IN        PCD_PPI_CALLBACK       CallBackFunction
  );

/**
  Cancels a previously set callback function for a particular PCD token number.

  @param[in]  TokenNumber The PCD token number.
  @param[in]  Guid The 128-bit unique value that designates the namespace from which to extract the value.
  @param[in]  CallBackFunction The function prototype called when the value associated with the CallBackToken is set.

  @retval EFI_SUCCESS  The PCD service has successfully established a call event
                        for the CallBackToken requested.
  @retval EFI_NOT_FOUND The PCD service could not find the referenced token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_CANCEL_CALLBACK)(
  IN  CONST EFI_GUID                *Guid  OPTIONAL,
  IN        UINTN                   TokenNumber,
  IN        PCD_PPI_CALLBACK        CallBackFunction
  );

/**
  Retrieves the next valid token number in a given namespace.

  This is useful since the PCD infrastructure contains a sparse list of token numbers,
  and one cannot a priori know what token numbers are valid in the database.

  If TokenNumber is 0 and Guid is not NULL, then the first token from the token space specified by Guid is returned.
  If TokenNumber is not 0 and Guid is not NULL, then the next token in the token space specified by Guid is returned.
  If TokenNumber is 0 and Guid is NULL, then the first token in the default token space is returned.
  If TokenNumber is not 0 and Guid is NULL, then the next token in the default token space is returned.
  The token numbers in the default token space may not be related to token numbers in token spaces that are named by Guid.
  If the next token number can be retrieved, then it is returned in TokenNumber, and EFI_SUCCESS is returned.
  If TokenNumber represents the last token number in the token space specified by Guid, then EFI_NOT_FOUND is returned.
  If TokenNumber is not present in the token space specified by Guid, then EFI_NOT_FOUND is returned.


  @param[in]       Guid        The 128-bit unique value that designates the namespace from which to extract the value.
                               This is an optional parameter that may be NULL.  If this parameter is NULL, then a request
                               is being made to retrieve tokens from the default token space.
  @param[in, out]  TokenNumber A pointer to the PCD token number to use to find the subsequent token number.

  @retval EFI_SUCCESS   The PCD service has retrieved the next valid token number.
  @retval EFI_NOT_FOUND The PCD service could not find data from the requested token number.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_GET_NEXT_TOKEN)(
  IN CONST EFI_GUID           *Guid  OPTIONAL,
  IN OUT   UINTN              *TokenNumber
  );

/**
  Retrieves the next valid PCD token namespace for a given namespace.

  Gets the next valid token namespace for a given namespace. This is useful to traverse the valid
  token namespaces on a platform.

  @param[in, out]   Guid    An indirect pointer to EFI_GUID. On input it designates a known token
                            namespace from which the search will start. On output, it designates the next valid
                            token namespace on the platform. If *Guid is NULL, then the GUID of the first token
                            space of the current platform is returned. If the search cannot locate the next valid
                            token namespace, an error is returned and the value of *Guid is undefined.

  @retval  EFI_SUCCESS      The PCD service retrieved the value requested.
  @retval  EFI_NOT_FOUND    The PCD service could not find the next valid token namespace.

**/
typedef
EFI_STATUS
(EFIAPI *PCD_PPI_GET_NEXT_TOKENSPACE)(
  IN OUT CONST EFI_GUID         **Guid
  );

///
/// This service abstracts the ability to set/get Platform Configuration Database (PCD).
///
typedef struct {
  PCD_PPI_SET_SKU                SetSku;

  PCD_PPI_GET8                   Get8;
  PCD_PPI_GET16                  Get16;
  PCD_PPI_GET32                  Get32;
  PCD_PPI_GET64                  Get64;
  PCD_PPI_GET_POINTER            GetPtr;
  PCD_PPI_GET_BOOLEAN            GetBool;
  PCD_PPI_GET_SIZE               GetSize;

  PCD_PPI_GET_EX_8               Get8Ex;
  PCD_PPI_GET_EX_16              Get16Ex;
  PCD_PPI_GET_EX_32              Get32Ex;
  PCD_PPI_GET_EX_64              Get64Ex;
  PCD_PPI_GET_EX_POINTER         GetPtrEx;
  PCD_PPI_GET_EX_BOOLEAN         GetBoolEx;
  PCD_PPI_GET_EX_SIZE            GetSizeEx;

  PCD_PPI_SET8                   Set8;
  PCD_PPI_SET16                  Set16;
  PCD_PPI_SET32                  Set32;
  PCD_PPI_SET64                  Set64;
  PCD_PPI_SET_POINTER            SetPtr;
  PCD_PPI_SET_BOOLEAN            SetBool;

  PCD_PPI_SET_EX_8               Set8Ex;
  PCD_PPI_SET_EX_16              Set16Ex;
  PCD_PPI_SET_EX_32              Set32Ex;
  PCD_PPI_SET_EX_64              Set64Ex;
  PCD_PPI_SET_EX_POINTER         SetPtrEx;
  PCD_PPI_SET_EX_BOOLEAN         SetBoolEx;

  PCD_PPI_CALLBACK_ONSET         CallbackOnSet;
  PCD_PPI_CANCEL_CALLBACK        CancelCallback;
  PCD_PPI_GET_NEXT_TOKEN         GetNextToken;
  PCD_PPI_GET_NEXT_TOKENSPACE    GetNextTokenSpace;
} PCD_PPI;

extern EFI_GUID  gPcdPpiGuid;

#endif
