From f215e02bf85f68d3a6106c2a1f4f7f063f819064 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:17:27 +0200 Subject: Adding upstream version 7.0.14-dfsg. Signed-off-by: Daniel Baumann --- .../Firmware/EmbeddedPkg/MetronomeDxe/Metronome.c | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/VBox/Devices/EFI/Firmware/EmbeddedPkg/MetronomeDxe/Metronome.c (limited to 'src/VBox/Devices/EFI/Firmware/EmbeddedPkg/MetronomeDxe/Metronome.c') diff --git a/src/VBox/Devices/EFI/Firmware/EmbeddedPkg/MetronomeDxe/Metronome.c b/src/VBox/Devices/EFI/Firmware/EmbeddedPkg/MetronomeDxe/Metronome.c new file mode 100644 index 00000000..e70b5d2a --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/EmbeddedPkg/MetronomeDxe/Metronome.c @@ -0,0 +1,134 @@ +/** @file + + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
+ Copyright (c) 2013, ARM Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +EFI_STATUS +EFIAPI +WaitForTick ( + IN EFI_METRONOME_ARCH_PROTOCOL *This, + IN UINT32 TickNumber + ); + +/** + Interface structure for the Metronome Architectural Protocol. + + @par Protocol Description: + 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. + + @param WaitForTick + Waits for a specified number of ticks from a known time source + in the platform. 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. + + @param TickPeriod + 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. + +**/ +EFI_METRONOME_ARCH_PROTOCOL gMetronome = { + WaitForTick, + FixedPcdGet32 (PcdMetronomeTickPeriod) +}; + + +/** + 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. + +**/ +EFI_STATUS +EFIAPI +WaitForTick ( + IN EFI_METRONOME_ARCH_PROTOCOL *This, + IN UINT32 TickNumber + ) +{ + // + // Compute how long to stall the CPU. + // gMetronome.TickPeriod is in 100 ns units so it needs to be divided by 10 + // to get it in microseconds units. + // + MicroSecondDelay (TickNumber * gMetronome.TickPeriod / 10); + return EFI_SUCCESS; +} + + +EFI_HANDLE gMetronomeHandle = NULL; + + + +/** + Initialize the state information for the CPU Architectural Protocol + + @param ImageHandle of the loaded driver + @param SystemTable Pointer to the System Table + + @retval EFI_SUCCESS Protocol registered + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure + @retval EFI_DEVICE_ERROR Hardware problems + +**/ +EFI_STATUS +EFIAPI +MetronomeInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + // + // Do any hardware init required to make WaitForTick () to work here. + // + + Status = gBS->InstallMultipleProtocolInterfaces ( + &gMetronomeHandle, + &gEfiMetronomeArchProtocolGuid, &gMetronome, + NULL + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} + -- cgit v1.2.3