REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1496 This commit copies the exact 8254TimerDxe driver from PcAtChipsetPkg to OvmfPkg. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Ray Ni <ray.ni@intel.com> Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
		
			
				
	
	
		
			186 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Private data structures
 | |
| 
 | |
| Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #ifndef _TIMER_H_
 | |
| #define _TIMER_H_
 | |
| 
 | |
| #include <PiDxe.h>
 | |
| 
 | |
| #include <Protocol/Cpu.h>
 | |
| #include <Protocol/Legacy8259.h>
 | |
| #include <Protocol/Timer.h>
 | |
| 
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/IoLib.h>
 | |
| 
 | |
| //
 | |
| // The PCAT 8253/8254 has an input clock at 1.193182 MHz and Timer 0 is
 | |
| // initialized as a 16 bit free running counter that generates an interrupt(IRQ0)
 | |
| // each time the counter rolls over.
 | |
| //
 | |
| //   65536 counts
 | |
| // ---------------- * 1,000,000 uS/S = 54925.4 uS = 549254 * 100 ns
 | |
| //   1,193,182 Hz
 | |
| //
 | |
| 
 | |
| //
 | |
| // The maximum tick duration for 8254 timer
 | |
| //
 | |
| #define MAX_TIMER_TICK_DURATION     549254
 | |
| //
 | |
| // The default timer tick duration is set to 10 ms = 100000 100 ns units
 | |
| //
 | |
| #define DEFAULT_TIMER_TICK_DURATION 100000
 | |
| #define TIMER_CONTROL_PORT          0x43
 | |
| #define TIMER0_COUNT_PORT           0x40
 | |
| 
 | |
| //
 | |
| // 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
 |