/** @file
  TpmLib to call Tcg TPM reference code.

  Copyright (c) 2025, Arm Limited. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

/**
  Execute TPM command.

  This function calls ExecuteCommand() in Tcg TPM reference code.
  See the detail ExecuteCommand()'s comment.

  @param [in]       RequestSize     Request Buffer Size
  @param [in]       Request         Request Buffer
  @param [in, out]  ResponseSize    Response Buffer Size
  @param [in, out]  Response        Response Buffer

  @return  EFI_SUCCESS              Success to exectue requested command
                                    But need to check the result of
                                    command execution in Response.
  @return  EFI_INVALID_PARAMETER    Invalid parameters.

**/
EFI_STATUS
EFIAPI
TpmLibExecuteCommand (
  IN      UINT32  RequestSize,
  IN      UINT8   *Request,
  IN OUT  UINT32  *ResponseSize,
  IN OUT  UINT8   **Response
  );

/**
  Initailize TPM.

  This function calls _TPM_Init() in Tcg TPM reference code.

**/
VOID
EFIAPI
TpmLibTpmInit (
  VOID
  );

/**
  This indication from the TPM interface indicates the start of
  an H-CRTM measurement sequence. On receipt of this indication,
  the TPM will initialize an H-CRTM Event Sequence context

  This function calls _TPM_Hash_Start() in Tcg TPM reference code.

**/
VOID
EFIAPI
TpmLibTpmHashStart (
  VOID
  );

/**
  This indication from the TPM interface indicates arrival of
  one or more octets of data that are to be included in the H-CRTM
  Event Sequence sequence context created by the _TPM_Hash_Start indication.
  The context holds data for each hash algorithm for
  each PCR bank implemented on the TPM.
  If no H-CRTM Event Sequence context exists, this indication is discarded
  and no other action is performed.

  This function calls _TPM_Hash_Data() in Tcg TPM reference code.

  @param [in] DataSize Size of data to be extend
  @param [in] Data     Data Buffer

**/
VOID
EFIAPI
TpmLibTpmHashData (
  IN UINT32  DataSize,
  IN UINT8   *Data
  );

/**
  This indication from the TPM interface indicates
  the end of the H-CRTM measurement. This indication is discarded and
  no other action performed if the TPM does not contain
  an H-CRTM Event Sequence context.

  This function calls _TPM_Hash_End() in Tcg TPM reference code.

**/
VOID
EFIAPI
TpmLibTpmHashEnd (
  VOID
  );

/**
  This is called when TPM's NV storage isn't initailized only
  (PlatformTpmLibNVNeedsManufacture() return FALSE) otherwise,
  TPM's NV storage is cleared all.

  Before calling this, PlatformTpmLibNVEnable() must be called.

  This function calls TPM_Manufacture() in Tcg TPM reference code.

  @return   -2          NV System not available
  @return   -1          FAILURE - System is incorrectly compiled.
  @return    0          success

**/
INT32
EFIAPI
TpmLibTpmManufacture (
  VOID
  );

/**
  Get current locality.

  This function calls _plat__LocalityGet() in Tcg TPM reference code.

  @return    Locality   Current locality.

**/
UINT8
EFIAPI
TpmLibGetLocality (
  VOID
  );

/**
  Set current locality.

  See the detail _plat__LocalitySet()'s comment.

  @param [in]   Locality

**/
VOID
EFIAPI
TpmLibSetLocality (
  IN UINT8  Locality
  );
