/** @file
  Metronome Architectural Protocol as defined in PI SPEC VOLUME 2 DXE

  This code abstracts the DXE core to provide delay services.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __ARCH_PROTOCOL_METRONOME_H__
#define __ARCH_PROTOCOL_METRONOME_H__

///
/// Global ID for the Metronome Architectural Protocol
///
#define EFI_METRONOME_ARCH_PROTOCOL_GUID \
  { 0x26baccb2, 0x6f42, 0x11d4, {0xbc, 0xe7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } }

///
/// Declare forward reference for the Metronome Architectural Protocol
///
typedef struct _EFI_METRONOME_ARCH_PROTOCOL EFI_METRONOME_ARCH_PROTOCOL;

/**
  The WaitForTick() function waits for the number of ticks specified by
  TickNumber from a known time source in the platform.  If TickNumber of
  ticks are detected, then EFI_SUCCESS is returned.  The actual time passed
  between entry of this function and the first tick is between 0 and
  TickPeriod 100 nS units.  If you want to guarantee that at least TickPeriod
  time has elapsed, wait for two ticks.  This function waits for a hardware
  event to determine when a tick occurs.  It is possible for interrupt
  processing, or exception processing to interrupt the execution of the
  WaitForTick() function.  Depending on the hardware source for the ticks, it
  is possible for a tick to be missed.  This function cannot guarantee that
  ticks will not be missed.  If a timeout occurs waiting for the specified
  number of ticks, then EFI_TIMEOUT is returned.

  @param  This             The EFI_METRONOME_ARCH_PROTOCOL instance.
  @param  TickNumber       Number of ticks to wait.

  @retval EFI_SUCCESS           The wait for the number of ticks specified by TickNumber
                                succeeded.
  @retval EFI_TIMEOUT           A timeout occurred waiting for the specified number of ticks.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_METRONOME_WAIT_FOR_TICK)(
  IN EFI_METRONOME_ARCH_PROTOCOL   *This,
  IN UINT32                        TickNumber
  );

///
/// This protocol provides access to a known time source in the platform to the
/// core.  The core uses this known time source to produce core services that
/// require calibrated delays.
///
struct _EFI_METRONOME_ARCH_PROTOCOL {
  EFI_METRONOME_WAIT_FOR_TICK    WaitForTick;

  ///
  /// The period of platform's known time source in 100 nS units.
  /// This value on any platform must be at least 10 uS, and must not
  /// exceed 200 uS.  The value in this field is a constant that must
  /// not be modified after the Metronome architectural protocol is
  /// installed.  All consumers must treat this as a read-only field.
  ///
  UINT32    TickPeriod;
};

extern EFI_GUID  gEfiMetronomeArchProtocolGuid;

#endif
