From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 710EE740035 for ; Tue, 16 Jan 2024 05:50:58 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=MKVj1lqNcwFJzhuTPRbA7Kl0q4xlFqDn8/PwW5Oalbs=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1705384257; v=1; b=DwfI8YRVB3mZTqXkQkjFZLnv5EjPQVXapA3FWPk+QXdrX3iyaXoRO4PJncwLLYVp5i7Q+swK zc5pf4l03xZ0e3ljUWKaFxRr/pB2S4zG/pyFKm3TgqwzowRv23h0dndMh2tumslY0KrKzDbvHIR QVSKp/EQePDDafCzKkyahbnY= X-Received: by 127.0.0.2 with SMTP id Xt8DYY7687511xPiEX9d5KAW; Mon, 15 Jan 2024 21:50:57 -0800 X-Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) by mx.groups.io with SMTP id smtpd.web11.72208.1705305855278622364 for ; Mon, 15 Jan 2024 00:04:17 -0800 X-IronPort-AV: E=McAfee;i="6600,9927,10953"; a="6313679" X-IronPort-AV: E=Sophos;i="6.04,196,1695711600"; d="scan'208";a="6313679" X-Received: from orviesa002.jf.intel.com ([10.64.159.142]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jan 2024 00:04:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.04,196,1695711600"; d="scan'208";a="25402224" X-Received: from ray-dev.ccr.corp.intel.com ([10.239.158.139]) by orviesa002.jf.intel.com with ESMTP; 15 Jan 2024 00:04:15 -0800 From: "Ni, Ray" To: devel@edk2.groups.io Cc: Michael D Kinney , Nate DeSimone , Laszlo Ersek , Rahul Kumar , Gerd Hoffmann Subject: [edk2-devel] [PATCH 1/6] UefiCpuPkg/LocalApicTimerDxe: Duplicate OvmfPkg/LocalApicTimerDxe driver Date: Mon, 15 Jan 2024 16:03:20 +0800 Message-Id: <20240115080325.147-2-ray.ni@intel.com> In-Reply-To: <20240115080325.147-1-ray.ni@intel.com> References: <20240115080325.147-1-ray.ni@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ray.ni@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: TVxh3NCNoV5yr7VauN6KmiD1x7686176AA= Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=DwfI8YRV; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io This commit only duplicates the OvmfPkg/LocalApicTimerDxe. Following commits will enhance the driver. FILE_GUID in INF file is updated with a new GUID. Signed-off-by: Ray Ni Cc: Michael D Kinney Cc: Nate DeSimone Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann --- .../LocalApicTimerDxe/LocalApicTimerDxe.c | 365 ++++++++++++++++++ .../LocalApicTimerDxe/LocalApicTimerDxe.h | 178 +++++++++ .../LocalApicTimerDxe/LocalApicTimerDxe.inf | 44 +++ 3 files changed, 587 insertions(+) create mode 100644 UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.c create mode 100644 UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.h create mode 100644 UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf diff --git a/UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.c b/UefiCpuPkg/= LocalApicTimerDxe/LocalApicTimerDxe.c new file mode 100644 index 0000000000..67f4dcde37 --- /dev/null +++ b/UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.c @@ -0,0 +1,365 @@ +/** @file=0D + Timer Architectural Protocol as defined in the DXE CIS=0D +=0D +Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.
=0D +Copyright (c) 2019, Citrix Systems, Inc.=0D +=0D +SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#include =0D +=0D +#include "LocalApicTimerDxe.h"=0D +=0D +//=0D +// The handle onto which the Timer Architectural Protocol will be installe= d=0D +//=0D +EFI_HANDLE mTimerHandle =3D NULL;=0D +=0D +//=0D +// The Timer Architectural Protocol that this driver produces=0D +//=0D +EFI_TIMER_ARCH_PROTOCOL mTimer =3D {=0D + TimerDriverRegisterHandler,=0D + TimerDriverSetTimerPeriod,=0D + TimerDriverGetTimerPeriod,=0D + TimerDriverGenerateSoftInterrupt=0D +};=0D +=0D +//=0D +// Pointer to the CPU Architectural Protocol instance=0D +//=0D +EFI_CPU_ARCH_PROTOCOL *mCpu;=0D +=0D +//=0D +// The notification function to call on every timer interrupt.=0D +// A bug in the compiler prevents us from initializing this here.=0D +//=0D +EFI_TIMER_NOTIFY mTimerNotifyFunction;=0D +=0D +//=0D +// The current period of the timer interrupt=0D +//=0D +volatile UINT64 mTimerPeriod =3D 0;=0D +=0D +//=0D +// Worker Functions=0D +//=0D +=0D +/**=0D + Interrupt Handler.=0D +=0D + @param InterruptType The type of interrupt that occurred=0D + @param SystemContext A pointer to the system context when the interru= pt occurred=0D +**/=0D +VOID=0D +EFIAPI=0D +TimerInterruptHandler (=0D + IN EFI_EXCEPTION_TYPE InterruptType,=0D + IN EFI_SYSTEM_CONTEXT SystemContext=0D + )=0D +{=0D + STATIC NESTED_INTERRUPT_STATE NestedInterruptState;=0D + EFI_TPL OriginalTPL;=0D +=0D + OriginalTPL =3D NestedInterruptRaiseTPL ();=0D +=0D + SendApicEoi ();=0D +=0D + if (mTimerNotifyFunction !=3D NULL) {=0D + //=0D + // @bug : This does not handle missed timer interrupts=0D + //=0D + mTimerNotifyFunction (mTimerPeriod);=0D + }=0D +=0D + NestedInterruptRestoreTPL (OriginalTPL, SystemContext, &NestedInterruptS= tate);=0D +}=0D +=0D +/**=0D +=0D + This function registers the handler NotifyFunction so it is called every= time=0D + the timer interrupt fires. It also passes the amount of time since the = last=0D + handler call to the NotifyFunction. If NotifyFunction is NULL, then the= =0D + handler is unregistered. If the handler is registered, then EFI_SUCCESS= is=0D + returned. If the CPU does not support registering a timer interrupt han= dler,=0D + then EFI_UNSUPPORTED is returned. If an attempt is made to register a h= andler=0D + when a handler is already registered, then EFI_ALREADY_STARTED is return= ed.=0D + If an attempt is made to unregister a handler when a handler is not regi= stered,=0D + then EFI_INVALID_PARAMETER is returned. If an error occurs attempting t= o=0D + register the NotifyFunction with the timer interrupt, then EFI_DEVICE_ER= ROR=0D + is returned.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D + @param NotifyFunction The function to call when a timer interrupt fire= s. This=0D + function executes at TPL_HIGH_LEVEL. The DXE Co= re will=0D + register a handler for the timer interrupt, so i= t can know=0D + how much time has passed. This information is u= sed to=0D + signal timer based events. NULL will unregister= the handler.=0D +=0D + @retval EFI_SUCCESS The timer handler was registered.= =0D + @retval EFI_UNSUPPORTED The platform does not support time= r interrupts.=0D + @retval EFI_ALREADY_STARTED NotifyFunction is not NULL, and a = handler is already=0D + registered.=0D + @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a hand= ler was not=0D + previously registered.=0D + @retval EFI_DEVICE_ERROR The timer handler could not be reg= istered.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverRegisterHandler (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This,=0D + IN EFI_TIMER_NOTIFY NotifyFunction=0D + )=0D +{=0D + //=0D + // Check for invalid parameters=0D + //=0D + if ((NotifyFunction =3D=3D NULL) && (mTimerNotifyFunction =3D=3D NULL)) = {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + if ((NotifyFunction !=3D NULL) && (mTimerNotifyFunction !=3D NULL)) {=0D + return EFI_ALREADY_STARTED;=0D + }=0D +=0D + mTimerNotifyFunction =3D NotifyFunction;=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D +=0D + This function adjusts the period of timer interrupts to the value specif= ied=0D + by TimerPeriod. If the timer period is updated, then the selected timer= =0D + period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. = If=0D + the timer hardware is not programmable, then EFI_UNSUPPORTED is returned= .=0D + If an error occurs while attempting to update the timer period, then the= =0D + timer hardware will be put back in its state prior to this call, and=0D + EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer inter= rupt=0D + is disabled. This is not the same as disabling the CPU's interrupts.=0D + Instead, it must either turn off the timer hardware, or it must adjust t= he=0D + interrupt controller so that a CPU interrupt is not generated when the t= imer=0D + interrupt fires.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D + @param TimerPeriod The rate to program the timer interrupt in 100 nS= units. If=0D + the timer hardware is not programmable, then EFI_= UNSUPPORTED is=0D + returned. If the timer is programmable, then the= timer period=0D + will be rounded up to the nearest timer period th= at is supported=0D + by the timer hardware. If TimerPeriod is set to = 0, then the=0D + timer interrupts will be disabled.=0D +=0D + @retval EFI_SUCCESS The timer period was changed.=0D + @retval EFI_UNSUPPORTED The platform cannot change the period o= f the timer interrupt.=0D + @retval EFI_DEVICE_ERROR The timer period could not be changed d= ue to a device error.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverSetTimerPeriod (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This,=0D + IN UINT64 TimerPeriod=0D + )=0D +{=0D + UINT64 TimerCount;=0D + UINT32 TimerFrequency;=0D + UINT32 DivideValue =3D 1;=0D +=0D + if (TimerPeriod =3D=3D 0) {=0D + //=0D + // Disable timer interrupt for a TimerPeriod of 0=0D + //=0D + DisableApicTimerInterrupt ();=0D + } else {=0D + TimerFrequency =3D PcdGet32 (PcdFSBClock) / (UINT32)DivideValue;=0D +=0D + //=0D + // Convert TimerPeriod into local APIC counts=0D + //=0D + // TimerPeriod is in 100ns=0D + // TimerPeriod/10000000 will be in seconds.=0D + TimerCount =3D DivU64x32 (=0D + MultU64x32 (TimerPeriod, TimerFrequency),=0D + 10000000=0D + );=0D +=0D + // Check for overflow=0D + if (TimerCount > MAX_UINT32) {=0D + TimerCount =3D MAX_UINT32;=0D + /* TimerPeriod =3D (MAX_UINT32 / TimerFrequency) * 10000000; */=0D + TimerPeriod =3D 429496730;=0D + }=0D +=0D + //=0D + // Program the timer with the new count value=0D + //=0D + InitializeApicTimer (DivideValue, (UINT32)TimerCount, TRUE, LOCAL_APIC= _TIMER_VECTOR);=0D +=0D + //=0D + // Enable timer interrupt=0D + //=0D + EnableApicTimerInterrupt ();=0D + }=0D +=0D + //=0D + // Save the new timer period=0D + //=0D + mTimerPeriod =3D TimerPeriod;=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D +=0D + This function retrieves the period of timer interrupts in 100 ns units,= =0D + returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPer= iod=0D + is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 = is=0D + returned, then the timer is currently disabled.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D + @param TimerPeriod A pointer to the timer period to retrieve in 100 = ns units. If=0D + 0 is returned, then the timer is currently disabl= ed.=0D +=0D + @retval EFI_SUCCESS The timer period was returned in TimerPer= iod.=0D + @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverGetTimerPeriod (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This,=0D + OUT UINT64 *TimerPeriod=0D + )=0D +{=0D + if (TimerPeriod =3D=3D NULL) {=0D + return EFI_INVALID_PARAMETER;=0D + }=0D +=0D + *TimerPeriod =3D mTimerPeriod;=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D +=0D + This function generates a soft timer interrupt. If the platform does not= support soft=0D + timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCE= SS is returned.=0D + If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.Reg= isterHandler()=0D + service, then a soft timer interrupt will be generated. If the timer int= errupt is=0D + enabled when this service is called, then the registered handler will be= invoked. The=0D + registered handler should not be able to distinguish a hardware-generate= d timer=0D + interrupt from a software-generated timer interrupt.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D +=0D + @retval EFI_SUCCESS The soft timer interrupt was generated.=0D + @retval EFI_UNSUPPORTED The platform does not support the generation o= f soft timer interrupts.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverGenerateSoftInterrupt (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This=0D + )=0D +{=0D + EFI_TPL OriginalTPL;=0D +=0D + if (GetApicTimerInterruptState ()) {=0D + //=0D + // Invoke the registered handler=0D + //=0D + OriginalTPL =3D gBS->RaiseTPL (TPL_HIGH_LEVEL);=0D +=0D + if (mTimerNotifyFunction !=3D NULL) {=0D + //=0D + // @bug : This does not handle missed timer interrupts=0D + //=0D + mTimerNotifyFunction (mTimerPeriod);=0D + }=0D +=0D + gBS->RestoreTPL (OriginalTPL);=0D + } else {=0D + return EFI_UNSUPPORTED;=0D + }=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +/**=0D + Initialize the Timer Architectural Protocol driver=0D +=0D + @param ImageHandle ImageHandle of the loaded driver=0D + @param SystemTable Pointer to the System Table=0D +=0D + @retval EFI_SUCCESS Timer Architectural Protocol created=0D + @retval EFI_OUT_OF_RESOURCES Not enough resources available to initial= ize driver.=0D + @retval EFI_DEVICE_ERROR A device error occurred attempting to ini= tialize the driver.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverInitialize (=0D + IN EFI_HANDLE ImageHandle,=0D + IN EFI_SYSTEM_TABLE *SystemTable=0D + )=0D +{=0D + EFI_STATUS Status;=0D +=0D + //=0D + // Initialize the pointer to our notify function.=0D + //=0D + mTimerNotifyFunction =3D NULL;=0D +=0D + //=0D + // Make sure the Timer Architectural Protocol is not already installed i= n the system=0D + //=0D + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiTimerArchProtocolGuid);=0D +=0D + //=0D + // Find the CPU architectural protocol.=0D + //=0D + Status =3D gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **= )&mCpu);=0D + ASSERT_EFI_ERROR (Status);=0D +=0D + //=0D + // Force the timer to be disabled=0D + //=0D + Status =3D TimerDriverSetTimerPeriod (&mTimer, 0);=0D + ASSERT_EFI_ERROR (Status);=0D +=0D + //=0D + // Install interrupt handler for Local APIC Timer=0D + //=0D + Status =3D mCpu->RegisterInterruptHandler (=0D + mCpu,=0D + LOCAL_APIC_TIMER_VECTOR,=0D + TimerInterruptHandler=0D + );=0D + ASSERT_EFI_ERROR (Status);=0D +=0D + //=0D + // Force the timer to be enabled at its default period=0D + //=0D + Status =3D TimerDriverSetTimerPeriod (&mTimer, DEFAULT_TIMER_TICK_DURATI= ON);=0D + ASSERT_EFI_ERROR (Status);=0D +=0D + //=0D + // Install the Timer Architectural Protocol onto a new handle=0D + //=0D + Status =3D gBS->InstallMultipleProtocolInterfaces (=0D + &mTimerHandle,=0D + &gEfiTimerArchProtocolGuid,=0D + &mTimer,=0D + NULL=0D + );=0D + ASSERT_EFI_ERROR (Status);=0D +=0D + return Status;=0D +}=0D diff --git a/UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.h b/UefiCpuPkg/= LocalApicTimerDxe/LocalApicTimerDxe.h new file mode 100644 index 0000000000..93706995f8 --- /dev/null +++ b/UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.h @@ -0,0 +1,178 @@ +/** @file=0D + Private data structures=0D +=0D +Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.
=0D +Copyright (c) 2019, Citrix Systems, Inc.=0D +=0D +SPDX-License-Identifier: BSD-2-Clause-Patent=0D +**/=0D +=0D +#ifndef LOCAL_APIC_TIMER_H_=0D +#define LOCAL_APIC_TIMER_H_=0D +=0D +#include =0D +=0D +#include =0D +#include =0D +=0D +#include =0D +=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +// The default timer tick duration is set to 10 ms =3D 100000 100 ns units= =0D +//=0D +#define DEFAULT_TIMER_TICK_DURATION 100000=0D +=0D +//=0D +// The Timer Vector use for interrupt=0D +//=0D +#define LOCAL_APIC_TIMER_VECTOR 32=0D +=0D +//=0D +// Function Prototypes=0D +//=0D +=0D +/**=0D + Initialize the Timer Architectural Protocol driver=0D +=0D + @param ImageHandle ImageHandle of the loaded driver=0D + @param SystemTable Pointer to the System Table=0D +=0D + @retval EFI_SUCCESS Timer Architectural Protocol created=0D + @retval EFI_OUT_OF_RESOURCES Not enough resources available to initial= ize driver.=0D + @retval EFI_DEVICE_ERROR A device error occurred attempting to ini= tialize the driver.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverInitialize (=0D + IN EFI_HANDLE ImageHandle,=0D + IN EFI_SYSTEM_TABLE *SystemTable=0D + )=0D +;=0D +=0D +/**=0D +=0D + This function adjusts the period of timer interrupts to the value specif= ied=0D + by TimerPeriod. If the timer period is updated, then the selected timer= =0D + period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. = If=0D + the timer hardware is not programmable, then EFI_UNSUPPORTED is returned= .=0D + If an error occurs while attempting to update the timer period, then the= =0D + timer hardware will be put back in its state prior to this call, and=0D + EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer inter= rupt=0D + is disabled. This is not the same as disabling the CPU's interrupts.=0D + Instead, it must either turn off the timer hardware, or it must adjust t= he=0D + interrupt controller so that a CPU interrupt is not generated when the t= imer=0D + interrupt fires.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D + @param NotifyFunction The rate to program the timer interrupt in 100 nS= units. If=0D + the timer hardware is not programmable, then EFI_= UNSUPPORTED is=0D + returned. If the timer is programmable, then the= timer period=0D + will be rounded up to the nearest timer period th= at is supported=0D + by the timer hardware. If TimerPeriod is set to = 0, then the=0D + timer interrupts will be disabled.=0D +=0D + @retval EFI_SUCCESS The timer period was changed.=0D + @retval EFI_UNSUPPORTED The platform cannot change the period o= f the timer interrupt.=0D + @retval EFI_DEVICE_ERROR The timer period could not be changed d= ue to a device error.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverRegisterHandler (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This,=0D + IN EFI_TIMER_NOTIFY NotifyFunction=0D + )=0D +;=0D +=0D +/**=0D +=0D + This function adjusts the period of timer interrupts to the value specif= ied=0D + by TimerPeriod. If the timer period is updated, then the selected timer= =0D + period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. = If=0D + the timer hardware is not programmable, then EFI_UNSUPPORTED is returned= .=0D + If an error occurs while attempting to update the timer period, then the= =0D + timer hardware will be put back in its state prior to this call, and=0D + EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer inter= rupt=0D + is disabled. This is not the same as disabling the CPU's interrupts.=0D + Instead, it must either turn off the timer hardware, or it must adjust t= he=0D + interrupt controller so that a CPU interrupt is not generated when the t= imer=0D + interrupt fires.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D + @param TimerPeriod The rate to program the timer interrupt in 100 nS= units. If=0D + the timer hardware is not programmable, then EFI_= UNSUPPORTED is=0D + returned. If the timer is programmable, then the= timer period=0D + will be rounded up to the nearest timer period th= at is supported=0D + by the timer hardware. If TimerPeriod is set to = 0, then the=0D + timer interrupts will be disabled.=0D +=0D + @retval EFI_SUCCESS The timer period was changed.=0D + @retval EFI_UNSUPPORTED The platform cannot change the period o= f the timer interrupt.=0D + @retval EFI_DEVICE_ERROR The timer period could not be changed d= ue to a device error.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverSetTimerPeriod (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This,=0D + IN UINT64 TimerPeriod=0D + )=0D +;=0D +=0D +/**=0D +=0D + This function retrieves the period of timer interrupts in 100 ns units,= =0D + returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPer= iod=0D + is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 = is=0D + returned, then the timer is currently disabled.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D + @param TimerPeriod A pointer to the timer period to retrieve in 100 = ns units. If=0D + 0 is returned, then the timer is currently disabl= ed.=0D +=0D + @retval EFI_SUCCESS The timer period was returned in TimerPer= iod.=0D + @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverGetTimerPeriod (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This,=0D + OUT UINT64 *TimerPeriod=0D + )=0D +;=0D +=0D +/**=0D +=0D + This function generates a soft timer interrupt. If the platform does not= support soft=0D + timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCE= SS is returned.=0D + If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.Reg= isterHandler()=0D + service, then a soft timer interrupt will be generated. If the timer int= errupt is=0D + enabled when this service is called, then the registered handler will be= invoked. The=0D + registered handler should not be able to distinguish a hardware-generate= d timer=0D + interrupt from a software-generated timer interrupt.=0D +=0D +=0D + @param This The EFI_TIMER_ARCH_PROTOCOL instance.=0D +=0D + @retval EFI_SUCCESS The soft timer interrupt was generated.=0D + @retval EFI_UNSUPPORTED The platform does not support the generation o= f soft timer interrupts.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +TimerDriverGenerateSoftInterrupt (=0D + IN EFI_TIMER_ARCH_PROTOCOL *This=0D + )=0D +;=0D +=0D +#endif=0D diff --git a/UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf b/UefiCpuPk= g/LocalApicTimerDxe/LocalApicTimerDxe.inf new file mode 100644 index 0000000000..6c711bd163 --- /dev/null +++ b/UefiCpuPkg/LocalApicTimerDxe/LocalApicTimerDxe.inf @@ -0,0 +1,44 @@ +## @file=0D +# Local APIC timer driver that provides Timer Arch protocol.=0D +# PcdFSBClock is defined in MdePkg and it should be set by the consumer.=0D +#=0D +# Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.
=0D +# Copyright (c) 2019, Citrix Systems, Inc.=0D +#=0D +# SPDX-License-Identifier: BSD-2-Clause-Patent=0D +#=0D +##=0D +=0D +[Defines]=0D + INF_VERSION =3D 0x00010005=0D + BASE_NAME =3D LocalApicTimerDxe=0D + FILE_GUID =3D e3e805df-94ed-488d-a58a-38203fb24bb2= =0D + MODULE_TYPE =3D DXE_DRIVER=0D + VERSION_STRING =3D 1.0=0D +=0D + ENTRY_POINT =3D TimerDriverInitialize=0D +=0D +[Packages]=0D + MdePkg/MdePkg.dec=0D + UefiCpuPkg/UefiCpuPkg.dec=0D + OvmfPkg/OvmfPkg.dec=0D +=0D +[LibraryClasses]=0D + UefiBootServicesTableLib=0D + BaseLib=0D + DebugLib=0D + NestedInterruptTplLib=0D + UefiDriverEntryPoint=0D + LocalApicLib=0D +=0D +[Sources]=0D + LocalApicTimerDxe.h=0D + LocalApicTimerDxe.c=0D +=0D +[Protocols]=0D + gEfiCpuArchProtocolGuid ## CONSUMES=0D + gEfiTimerArchProtocolGuid ## PRODUCES=0D +[Pcd]=0D + gEfiMdePkgTokenSpaceGuid.PcdFSBClock ## CONSUMES=0D +[Depex]=0D + gEfiCpuArchProtocolGuid=0D --=20 2.39.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#113800): https://edk2.groups.io/g/devel/message/113800 Mute This Topic: https://groups.io/mt/103734961/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/12367111/7686176/1913456212/xyzzy [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-