/** @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, 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