[edk2-devel] [edk2-staging/RiscV64QemuVirt PATCH V8 07/19] UefiCpuPkg: Add CpuTimerDxeRiscV64 module

Ni, Ray ray.ni at intel.com
Fri Feb 10 12:55:29 UTC 2023


>  UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimer.uni           |  14 +
>  UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerExtra.uni      |  12 +

For the above two file name, better to use the same base name as that of INF file.

> -----Original Message-----
> From: devel at edk2.groups.io <devel at edk2.groups.io> On Behalf Of Ni, Ray
> Sent: Friday, February 10, 2023 8:46 PM
> To: Sunil V L <sunilvl at ventanamicro.com>; devel at edk2.groups.io
> Cc: Dong, Eric <eric.dong at intel.com>; Kumar, Rahul R
> <rahul.r.kumar at intel.com>; Daniel Schaefer <git at danielschaefer.me>; Gerd
> Hoffmann <kraxel at redhat.com>; Abner Chang <abner.chang at amd.com>;
> Warkentin, Andrei <andrei.warkentin at intel.com>
> Subject: Re: [edk2-devel] [edk2-staging/RiscV64QemuVirt PATCH V8 07/19]
> UefiCpuPkg: Add CpuTimerDxeRiscV64 module
> 
> Acked-by: Ray Ni <ray.ni at intel.com>
> 
> > -----Original Message-----
> > From: Sunil V L <sunilvl at ventanamicro.com>
> > Sent: Friday, February 10, 2023 8:30 PM
> > To: devel at edk2.groups.io
> > Cc: Dong, Eric <eric.dong at intel.com>; Ni, Ray <ray.ni at intel.com>; Kumar,
> > Rahul R <rahul.r.kumar at intel.com>; Daniel Schaefer
> <git at danielschaefer.me>;
> > Gerd Hoffmann <kraxel at redhat.com>; Abner Chang
> <abner.chang at amd.com>;
> > Warkentin, Andrei <andrei.warkentin at intel.com>
> > Subject: [edk2-staging/RiscV64QemuVirt PATCH V8 07/19] UefiCpuPkg: Add
> > CpuTimerDxeRiscV64 module
> >
> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4076
> >
> > This DXE module initializes the timer interrupt handler
> > and installs the Arch Timer protocol.
> >
> > Cc: Eric Dong <eric.dong at intel.com>
> > Cc: Ray Ni <ray.ni at intel.com>
> > Cc: Rahul Kumar <rahul1.kumar at intel.com>
> > Cc: Daniel Schaefer <git at danielschaefer.me>
> > Cc: Gerd Hoffmann <kraxel at redhat.com>
> > Signed-off-by: Sunil V L <sunilvl at ventanamicro.com>
> > Acked-by: Abner Chang <abner.chang at amd.com>
> > Reviewed-by: Andrei Warkentin <andrei.warkentin at intel.com>
> > ---
> >  UefiCpuPkg/UefiCpuPkg.dsc                            |   1 +
> >  UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf |  51 ++++
> >  UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h                | 177 ++++++++++++
> >  UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c                | 294
> > ++++++++++++++++++++
> >  UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimer.uni           |  14 +
> >  UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerExtra.uni      |  12 +
> >  6 files changed, 549 insertions(+)
> >
> > diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc
> > index c511403842b8..aba5ae927586 100644
> > --- a/UefiCpuPkg/UefiCpuPkg.dsc
> > +++ b/UefiCpuPkg/UefiCpuPkg.dsc
> > @@ -198,6 +198,7 @@ [Components.X64]
> >  [Components.RISCV64]
> >
> >
> UefiCpuPkg/Library/BaseRiscV64CpuExceptionHandlerLib/BaseRiscV64CpuExce
> > ptionHandlerLib.inf
> >    UefiCpuPkg/Library/BaseRiscV64CpuTimerLib/BaseRiscV64CpuTimerLib.inf
> > +  UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf
> >
> >  [BuildOptions]
> >    *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES
> > diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf
> > b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf
> > new file mode 100644
> > index 000000000000..2c1f9f10e165
> > --- /dev/null
> > +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerDxeRiscV64.inf
> > @@ -0,0 +1,51 @@
> > +## @file
> > +# Timer Arch protocol module
> > +#
> > +# Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights
> > reserved.<BR>
> > +#
> > +# SPDX-License-Identifier: BSD-2-Clause-Patent
> > +#
> > +##
> > +
> > +[Defines]
> > +  INF_VERSION                    = 0x0001001b
> > +  BASE_NAME                      = RiscVTimerDxe
> > +  MODULE_UNI_FILE                = RiscVTimer.uni
> > +  FILE_GUID                      = 055DDAC6-9142-4013-BF20-FC2E5BC325C9
> > +  MODULE_TYPE                    = DXE_DRIVER
> > +  VERSION_STRING                 = 1.0
> > +  ENTRY_POINT                    = TimerDriverInitialize
> > +#
> > +# The following information is for reference only and not required by the
> build
> > +# tools.
> > +#
> > +#  VALID_ARCHITECTURES           = RISCV64
> > +#
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  UefiCpuPkg/UefiCpuPkg.dec
> > +
> > +[LibraryClasses]
> > +  BaseLib
> > +  DebugLib
> > +  IoLib
> > +  CpuLib
> > +  UefiBootServicesTableLib
> > +  UefiDriverEntryPoint
> > +
> > +[LibraryClasses.RISCV64]
> > +  RiscVSbiLib
> > +
> > +[Sources.RISCV64]
> > +  Timer.h
> > +  Timer.c
> > +
> > +[Protocols]
> > +  gEfiCpuArchProtocolGuid       ## CONSUMES
> > +  gEfiTimerArchProtocolGuid     ## PRODUCES
> > +
> > +[Depex]
> > +  gEfiCpuArchProtocolGuid
> > +
> > +[UserExtensions.TianoCore."ExtraFiles"]
> > +  RiscVTimerExtra.uni
> > diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h
> > b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h
> > new file mode 100644
> > index 000000000000..586eb0cfadb4
> > --- /dev/null
> > +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.h
> > @@ -0,0 +1,177 @@
> > +/** @file
> > +  RISC-V Timer Architectural Protocol definitions
> > +
> > +  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. 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/Timer.h>
> > +
> > +#include <Library/UefiBootServicesTableLib.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/IoLib.h>
> > +
> > +//
> > +// RISC-V use 100us timer.
> > +// The default timer tick duration is set to 10 ms = 10 * 1000 * 10 100 ns units
> > +//
> > +#define DEFAULT_TIMER_TICK_DURATION  100000
> > +
> > +extern VOID
> > +RiscvSetTimerPeriod (
> > +  UINT32  TimerPeriod
> > +  );
> > +
> > +//
> > +// 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 occured 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_UNSUPPORTEDT  The platform does not support the generation
> > of soft timer interrupts.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +TimerDriverGenerateSoftInterrupt (
> > +  IN EFI_TIMER_ARCH_PROTOCOL  *This
> > +  )
> > +;
> > +
> > +#endif
> > diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c
> > b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c
> > new file mode 100644
> > index 000000000000..db153f715e60
> > --- /dev/null
> > +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/Timer.c
> > @@ -0,0 +1,294 @@
> > +/** @file
> > +  RISC-V Timer Architectural Protocol
> > +
> > +  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights
> > reserved.<BR>
> > +
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include <Library/BaseLib.h>
> > +#include <Library/BaseRiscVSbiLib.h>
> > +#include "Timer.h"
> > +
> > +//
> > +// The handle onto which the Timer Architectural Protocol will be installed
> > +//
> > +STATIC EFI_HANDLE  mTimerHandle = NULL;
> > +
> > +//
> > +// The Timer Architectural Protocol that this driver produces
> > +//
> > +EFI_TIMER_ARCH_PROTOCOL  mTimer = {
> > +  TimerDriverRegisterHandler,
> > +  TimerDriverSetTimerPeriod,
> > +  TimerDriverGetTimerPeriod,
> > +  TimerDriverGenerateSoftInterrupt
> > +};
> > +
> > +//
> > +// Pointer to the CPU Architectural Protocol instance
> > +//
> > +EFI_CPU_ARCH_PROTOCOL  *mCpu;
> > +
> > +//
> > +// The notification function to call on every timer interrupt.
> > +// A bug in the compiler prevents us from initializing this here.
> > +//
> > +STATIC EFI_TIMER_NOTIFY  mTimerNotifyFunction;
> > +
> > +//
> > +// The current period of the timer interrupt
> > +//
> > +STATIC UINT64  mTimerPeriod = 0;
> > +
> > +/**
> > +  Timer Interrupt Handler.
> > +
> > +  @param InterruptType    The type of interrupt that occured
> > +  @param SystemContext    A pointer to the system context when the
> interrupt
> > occured
> > +**/
> > +VOID
> > +EFIAPI
> > +TimerInterruptHandler (
> > +  IN EFI_EXCEPTION_TYPE  InterruptType,
> > +  IN EFI_SYSTEM_CONTEXT  SystemContext
> > +  )
> > +{
> > +  EFI_TPL  OriginalTPL;
> > +  UINT64   RiscvTimer;
> > +
> > +  OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
> > +  if (mTimerNotifyFunction != NULL) {
> > +    mTimerNotifyFunction (mTimerPeriod);
> > +  }
> > +
> > +  RiscVDisableTimerInterrupt (); // Disable SMode timer int
> > +  RiscVClearPendingTimerInterrupt ();
> > +  if (mTimerPeriod == 0) {
> > +    gBS->RestoreTPL (OriginalTPL);
> > +    RiscVDisableTimerInterrupt (); // Disable SMode timer int
> > +    return;
> > +  }
> > +
> > +  RiscvTimer               = RiscVReadTimer ();
> > +  SbiSetTimer (RiscvTimer += mTimerPeriod);
> > +  gBS->RestoreTPL (OriginalTPL);
> > +  RiscVEnableTimerInterrupt (); // enable SMode timer int
> > +}
> > +
> > +/**
> > +
> > +  This function registers the handler NotifyFunction so it is called every time
> > +  the timer interrupt fires.  It also passes the amount of time since the last
> > +  handler call to the NotifyFunction.  If NotifyFunction is NULL, then the
> > +  handler is unregistered.  If the handler is registered, then EFI_SUCCESS is
> > +  returned.  If the CPU does not support registering a timer interrupt handler,
> > +  then EFI_UNSUPPORTED is returned.  If an attempt is made to register a
> > handler
> > +  when a handler is already registered, then EFI_ALREADY_STARTED is
> returned.
> > +  If an attempt is made to unregister a handler when a handler is not
> registered,
> > +  then EFI_INVALID_PARAMETER is returned.  If an error occurs attempting to
> > +  register the NotifyFunction with the timer interrupt, then
> EFI_DEVICE_ERROR
> > +  is returned.
> > +
> > +  @param This             The EFI_TIMER_ARCH_PROTOCOL instance.
> > +  @param NotifyFunction   The function to call when a timer interrupt fires.
> > This
> > +                          function executes at TPL_HIGH_LEVEL.  The DXE Core will
> > +                          register a handler for the timer interrupt, so it can know
> > +                          how much time has passed.  This information is used to
> > +                          signal timer based events.  NULL will unregister the handler.
> > +
> > +  @retval        EFI_SUCCESS            The timer handler was registered.
> > +  @retval        EFI_UNSUPPORTED        The platform does not support timer
> > interrupts.
> > +  @retval        EFI_ALREADY_STARTED    NotifyFunction is not NULL, and a
> > handler is already
> > +                                        registered.
> > +  @retval        EFI_INVALID_PARAMETER  NotifyFunction is NULL, and a
> handler
> > was not
> > +                                        previously registered.
> > +  @retval        EFI_DEVICE_ERROR       The timer handler could not be
> registered.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +TimerDriverRegisterHandler (
> > +  IN EFI_TIMER_ARCH_PROTOCOL  *This,
> > +  IN EFI_TIMER_NOTIFY         NotifyFunction
> > +  )
> > +{
> > +  DEBUG ((DEBUG_INFO, "TimerDriverRegisterHandler(0x%lx) called\n",
> > NotifyFunction));
> > +  mTimerNotifyFunction = NotifyFunction;
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > +
> > +  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
> > +  )
> > +{
> > +  UINT64  RiscvTimer;
> > +
> > +  DEBUG ((DEBUG_INFO, "TimerDriverSetTimerPeriod(0x%lx)\n",
> TimerPeriod));
> > +
> > +  if (TimerPeriod == 0) {
> > +    mTimerPeriod = 0;
> > +    RiscVDisableTimerInterrupt (); // Disable SMode timer int
> > +    return EFI_SUCCESS;
> > +  }
> > +
> > +  mTimerPeriod = TimerPeriod / 10; // convert unit from 100ns to 1us
> > +  RiscvTimer   = RiscVReadTimer ();
> > +  SbiSetTimer (RiscvTimer + mTimerPeriod);
> > +
> > +  mCpu->EnableInterrupt (mCpu);
> > +  RiscVEnableTimerInterrupt (); // enable SMode timer int
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > +
> > +  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
> > +  )
> > +{
> > +  *TimerPeriod = mTimerPeriod;
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > +
> > +  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_UNSUPPORTEDT  The platform does not support the generation
> > of soft timer interrupts.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +TimerDriverGenerateSoftInterrupt (
> > +  IN EFI_TIMER_ARCH_PROTOCOL  *This
> > +  )
> > +{
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +/**
> > +  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 occured attempting to
> initialize
> > the driver.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +TimerDriverInitialize (
> > +  IN EFI_HANDLE        ImageHandle,
> > +  IN EFI_SYSTEM_TABLE  *SystemTable
> > +  )
> > +{
> > +  EFI_STATUS  Status;
> > +
> > +  //
> > +  // Initialize the pointer to our notify function.
> > +  //
> > +  mTimerNotifyFunction = NULL;
> > +
> > +  //
> > +  // Make sure the Timer Architectural Protocol is not already installed in the
> > system
> > +  //
> > +  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL,
> > &gEfiTimerArchProtocolGuid);
> > +
> > +  //
> > +  // Find the CPU architectural protocol.
> > +  //
> > +  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID
> > **)&mCpu);
> > +  ASSERT_EFI_ERROR (Status);
> > +
> > +  //
> > +  // Force the timer to be disabled
> > +  //
> > +  Status = TimerDriverSetTimerPeriod (&mTimer, 0);
> > +  ASSERT_EFI_ERROR (Status);
> > +
> > +  //
> > +  // Install interrupt handler for RISC-V Timer.
> > +  //
> > +  Status = mCpu->RegisterInterruptHandler (mCpu,
> EXCEPT_RISCV_TIMER_INT,
> > TimerInterruptHandler);
> > +  ASSERT_EFI_ERROR (Status);
> > +
> > +  //
> > +  // Force the timer to be enabled at its default period
> > +  //
> > +  Status = TimerDriverSetTimerPeriod (&mTimer,
> > DEFAULT_TIMER_TICK_DURATION);
> > +  ASSERT_EFI_ERROR (Status);
> > +
> > +  //
> > +  // Install the Timer Architectural Protocol onto a new handle
> > +  //
> > +  Status = gBS->InstallMultipleProtocolInterfaces (
> > +                  &mTimerHandle,
> > +                  &gEfiTimerArchProtocolGuid,
> > +                  &mTimer,
> > +                  NULL
> > +                  );
> > +  ASSERT_EFI_ERROR (Status);
> > +  return Status;
> > +}
> > diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimer.uni
> > b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimer.uni
> > new file mode 100644
> > index 000000000000..76de1f3f352a
> > --- /dev/null
> > +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimer.uni
> > @@ -0,0 +1,14 @@
> > +// /** @file
> > +//
> > +// Timer Arch protocol strings.
> > +//
> > +// Copyright (c) 2016, Hewlett Packard Enterprise Development LP. All rights
> > reserved.<BR>
> > +//
> > +// SPDX-License-Identifier: BSD-2-Clause-Patent
> > +//
> > +// **/
> > +
> > +
> > +#string STR_MODULE_ABSTRACT             #language en-US "Timer driver that
> > provides Timer Arch protocol"
> > +
> > +#string STR_MODULE_DESCRIPTION          #language en-US "Timer driver that
> > provides Timer Arch protocol."
> > diff --git a/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerExtra.uni
> > b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerExtra.uni
> > new file mode 100644
> > index 000000000000..ceb93a7ce82f
> > --- /dev/null
> > +++ b/UefiCpuPkg/CpuTimerDxeRiscV64/CpuTimerExtra.uni
> > @@ -0,0 +1,12 @@
> > +// /** @file
> > +// Timer Localized Strings and Content
> > +//
> > +// Copyright (c) 2016, Hewlett Packard Enterprise Development LP. All rights
> > reserved.<BR>
> > +//
> > +// SPDX-License-Identifier: BSD-2-Clause-Patent
> > +//
> > +// **/
> > +
> > +#string STR_PROPERTIES_MODULE_NAME
> > +#language en-US
> > +"Timer DXE Driver"
> > --
> > 2.34.1
> 
> 
> 
> 
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#100011): https://edk2.groups.io/g/devel/message/100011
Mute This Topic: https://groups.io/mt/96874987/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/3943202/1813853/130120423/xyzzy [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list