X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EmbeddedPkg%2FMetronomeDxe%2FMetronome.c;h=13db25168fac76d9f02ad6ab5bde773efd2f50a6;hp=8388c4d1989caa4db8e901a82c7e7aaf6f57b9aa;hb=HEAD;hpb=990976abff3994a59ad9d3aabb72175068d19e06 diff --git a/EmbeddedPkg/MetronomeDxe/Metronome.c b/EmbeddedPkg/MetronomeDxe/Metronome.c index 8388c4d198..63db6d5139 100644 --- a/EmbeddedPkg/MetronomeDxe/Metronome.c +++ b/EmbeddedPkg/MetronomeDxe/Metronome.c @@ -1,15 +1,9 @@ /** @file Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
- Copyright (c) 2012, ARM Ltd. All rights reserved. - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php + Copyright (c) 2013, ARM Ltd. All rights reserved. - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -25,78 +19,79 @@ #include - - -/** - 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 - ) -{ - // - // Fill me in - // - MicroSecondDelay (10 * TickNumber); - return EFI_UNSUPPORTED; -} - - + ); /** 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. + 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 + 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. + The period of platform's known time source in 100 nS units. + This value on any platform 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 = { +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. -EFI_HANDLE gMetronomeHandle = NULL; + @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 @@ -110,24 +105,25 @@ EFI_HANDLE gMetronomeHandle = NULL; **/ EFI_STATUS +EFIAPI MetronomeInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable + 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, + &gEfiMetronomeArchProtocolGuid, + &gMetronome, NULL ); ASSERT_EFI_ERROR (Status); return Status; } -