/** @file
  EFI Timestamp Protocol as defined in UEFI2.4 Specification.
  Used to provide a platform independent interface for retrieving a high resolution timestamp counter.

  Copyright (c) 2013 - 2018, 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
  which 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 Protocol is introduced in UEFI Specification 2.4

**/

#ifndef __EFI_TIME_STAMP_PROTOCOL_H__
#define __EFI_TIME_STAMP_PROTOCOL_H__


#define EFI_TIMESTAMP_PROTOCOL_GUID \
  { 0xafbfde41, 0x2e6e, 0x4262, {0xba, 0x65, 0x62, 0xb9, 0x23, 0x6e, 0x54, 0x95 } }

///
/// Declare forward reference for the Time Stamp Protocol
///
typedef struct _EFI_TIMESTAMP_PROTOCOL  EFI_TIMESTAMP_PROTOCOL;

///
/// EFI_TIMESTAMP_PROPERTIES
///
typedef struct {
  ///
  /// The frequency of the timestamp counter in Hz.
  ///
  UINT64                               Frequency;
  ///
  /// The value that the timestamp counter ends with immediately before it rolls over.
  /// For example, a 64-bit free running counter would have an EndValue of 0xFFFFFFFFFFFFFFFF.
  /// A 24-bit free running counter would have an EndValue of 0xFFFFFF.
  ///
  UINT64                               EndValue;
} EFI_TIMESTAMP_PROPERTIES;

/**
  Retrieves the current value of a 64-bit free running timestamp counter.

  The counter shall count up in proportion to the amount of time that has passed. The counter value
  will always roll over to zero. The properties of the counter can be retrieved from GetProperties().
  The caller should be prepared for the function to return the same value twice across successive calls.
  The counter value will not go backwards other than when wrapping, as defined by EndValue in GetProperties().
  The frequency of the returned timestamp counter value must remain constant. Power management operations that
  affect clocking must not change the returned counter frequency. The quantization of counter value updates may
  vary as long as the value reflecting time passed remains consistent.

  @param  None.

  @retval The current value of the free running timestamp counter.

**/
typedef
UINT64
(EFIAPI *TIMESTAMP_GET)(
  VOID
  );

/**
  Obtains timestamp counter properties including frequency and value limits.

  @param[out]  Properties              The properties of the timestamp counter.

  @retval      EFI_SUCCESS             The properties were successfully retrieved.
  @retval      EFI_DEVICE_ERROR        An error occurred trying to retrieve the properties of the timestamp
                                       counter subsystem. Properties is not pedated.
  @retval      EFI_INVALID_PARAMETER   Properties is NULL.

**/
typedef
EFI_STATUS
(EFIAPI *TIMESTAMP_GET_PROPERTIES)(
  OUT   EFI_TIMESTAMP_PROPERTIES       *Properties
  );



///
/// EFI_TIMESTAMP_PROTOCOL
/// The protocol provides a platform independent interface for retrieving a high resolution
/// timestamp counter.
///
struct _EFI_TIMESTAMP_PROTOCOL {
  TIMESTAMP_GET                        GetTimestamp;
  TIMESTAMP_GET_PROPERTIES             GetProperties;
};

extern EFI_GUID gEfiTimestampProtocolGuid;

#endif

