"OvmfPkg/8254TimerDxe" is replaced with a Xen-specific EFI_TIMER_ARCH_PROTOCOL implementation. Also remove 8259InterruptControllerDxe as it is not used anymore. This Timer uses the local APIC timer as time source as it can work on both a Xen PVH guest and an HVM one. Based on the "OvmfPkg/8254TimerDxe" implementation. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1689 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20190813113119.14804-31-anthony.perard@citrix.com>
		
			
				
	
	
		
			178 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Private data structures
 | |
| 
 | |
| Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| Copyright (c) 2019, Citrix Systems, Inc.
 | |
| 
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #ifndef _TIMER_H_
 | |
| #define _TIMER_H_
 | |
| 
 | |
| #include <PiDxe.h>
 | |
| 
 | |
| #include <Protocol/Cpu.h>
 | |
| #include <Protocol/Timer.h>
 | |
| 
 | |
| #include <Register/LocalApic.h>
 | |
| 
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/LocalApicLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| 
 | |
| // The default timer tick duration is set to 10 ms = 100000 100 ns units
 | |
| //
 | |
| #define DEFAULT_TIMER_TICK_DURATION 100000
 | |
| 
 | |
| //
 | |
| // The Timer Vector use for interrupt
 | |
| //
 | |
| #define LOCAL_APIC_TIMER_VECTOR 32
 | |
| 
 | |
| //
 | |
| // Function Prototypes
 | |
| //
 | |
| /**
 | |
|   Initialize the Timer Architectural Protocol driver
 | |
| 
 | |
|   @param ImageHandle     ImageHandle of the loaded driver
 | |
|   @param SystemTable     Pointer to the System Table
 | |
| 
 | |
|   @retval EFI_SUCCESS            Timer Architectural Protocol created
 | |
|   @retval EFI_OUT_OF_RESOURCES   Not enough resources available to initialize driver.
 | |
|   @retval EFI_DEVICE_ERROR       A device error occurred attempting to initialize the driver.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TimerDriverInitialize (
 | |
|   IN EFI_HANDLE        ImageHandle,
 | |
|   IN EFI_SYSTEM_TABLE  *SystemTable
 | |
|   )
 | |
| ;
 | |
| 
 | |
| /**
 | |
| 
 | |
|   This function adjusts the period of timer interrupts to the value specified
 | |
|   by TimerPeriod.  If the timer period is updated, then the selected timer
 | |
|   period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned.  If
 | |
|   the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.
 | |
|   If an error occurs while attempting to update the timer period, then the
 | |
|   timer hardware will be put back in its state prior to this call, and
 | |
|   EFI_DEVICE_ERROR is returned.  If TimerPeriod is 0, then the timer interrupt
 | |
|   is disabled.  This is not the same as disabling the CPU's interrupts.
 | |
|   Instead, it must either turn off the timer hardware, or it must adjust the
 | |
|   interrupt controller so that a CPU interrupt is not generated when the timer
 | |
|   interrupt fires.
 | |
| 
 | |
| 
 | |
|   @param This            The EFI_TIMER_ARCH_PROTOCOL instance.
 | |
|   @param NotifyFunction  The rate to program the timer interrupt in 100 nS units.  If
 | |
|                          the timer hardware is not programmable, then EFI_UNSUPPORTED is
 | |
|                          returned.  If the timer is programmable, then the timer period
 | |
|                          will be rounded up to the nearest timer period that is supported
 | |
|                          by the timer hardware.  If TimerPeriod is set to 0, then the
 | |
|                          timer interrupts will be disabled.
 | |
| 
 | |
|   @retval        EFI_SUCCESS       The timer period was changed.
 | |
|   @retval        EFI_UNSUPPORTED   The platform cannot change the period of the timer interrupt.
 | |
|   @retval        EFI_DEVICE_ERROR  The timer period could not be changed due to a device error.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TimerDriverRegisterHandler (
 | |
|   IN EFI_TIMER_ARCH_PROTOCOL  *This,
 | |
|   IN EFI_TIMER_NOTIFY         NotifyFunction
 | |
|   )
 | |
| ;
 | |
| 
 | |
| /**
 | |
| 
 | |
|   This function adjusts the period of timer interrupts to the value specified
 | |
|   by TimerPeriod.  If the timer period is updated, then the selected timer
 | |
|   period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned.  If
 | |
|   the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.
 | |
|   If an error occurs while attempting to update the timer period, then the
 | |
|   timer hardware will be put back in its state prior to this call, and
 | |
|   EFI_DEVICE_ERROR is returned.  If TimerPeriod is 0, then the timer interrupt
 | |
|   is disabled.  This is not the same as disabling the CPU's interrupts.
 | |
|   Instead, it must either turn off the timer hardware, or it must adjust the
 | |
|   interrupt controller so that a CPU interrupt is not generated when the timer
 | |
|   interrupt fires.
 | |
| 
 | |
| 
 | |
|   @param This            The EFI_TIMER_ARCH_PROTOCOL instance.
 | |
|   @param TimerPeriod     The rate to program the timer interrupt in 100 nS units.  If
 | |
|                          the timer hardware is not programmable, then EFI_UNSUPPORTED is
 | |
|                          returned.  If the timer is programmable, then the timer period
 | |
|                          will be rounded up to the nearest timer period that is supported
 | |
|                          by the timer hardware.  If TimerPeriod is set to 0, then the
 | |
|                          timer interrupts will be disabled.
 | |
| 
 | |
|   @retval        EFI_SUCCESS       The timer period was changed.
 | |
|   @retval        EFI_UNSUPPORTED   The platform cannot change the period of the timer interrupt.
 | |
|   @retval        EFI_DEVICE_ERROR  The timer period could not be changed due to a device error.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TimerDriverSetTimerPeriod (
 | |
|   IN EFI_TIMER_ARCH_PROTOCOL  *This,
 | |
|   IN UINT64                   TimerPeriod
 | |
|   )
 | |
| ;
 | |
| 
 | |
| /**
 | |
| 
 | |
|   This function retrieves the period of timer interrupts in 100 ns units,
 | |
|   returns that value in TimerPeriod, and returns EFI_SUCCESS.  If TimerPeriod
 | |
|   is NULL, then EFI_INVALID_PARAMETER is returned.  If a TimerPeriod of 0 is
 | |
|   returned, then the timer is currently disabled.
 | |
| 
 | |
| 
 | |
|   @param This            The EFI_TIMER_ARCH_PROTOCOL instance.
 | |
|   @param TimerPeriod     A pointer to the timer period to retrieve in 100 ns units.  If
 | |
|                          0 is returned, then the timer is currently disabled.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The timer period was returned in TimerPeriod.
 | |
|   @retval EFI_INVALID_PARAMETER  TimerPeriod is NULL.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TimerDriverGetTimerPeriod (
 | |
|   IN EFI_TIMER_ARCH_PROTOCOL   *This,
 | |
|   OUT UINT64                   *TimerPeriod
 | |
|   )
 | |
| ;
 | |
| 
 | |
| /**
 | |
| 
 | |
|   This function generates a soft timer interrupt. If the platform does not support soft
 | |
|   timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCESS is returned.
 | |
|   If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.RegisterHandler()
 | |
|   service, then a soft timer interrupt will be generated. If the timer interrupt is
 | |
|   enabled when this service is called, then the registered handler will be invoked. The
 | |
|   registered handler should not be able to distinguish a hardware-generated timer
 | |
|   interrupt from a software-generated timer interrupt.
 | |
| 
 | |
| 
 | |
|   @param This              The EFI_TIMER_ARCH_PROTOCOL instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS       The soft timer interrupt was generated.
 | |
|   @retval EFI_UNSUPPORTED   The platform does not support the generation of soft timer interrupts.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| TimerDriverGenerateSoftInterrupt (
 | |
|   IN EFI_TIMER_ARCH_PROTOCOL  *This
 | |
|   )
 | |
| ;
 | |
| 
 | |
| #endif
 |