From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::343; helo=mail-wm1-x343.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id B5FAC211A2D8F for ; Sat, 15 Dec 2018 05:26:28 -0800 (PST) Received: by mail-wm1-x343.google.com with SMTP id a62so8154115wmh.4 for ; Sat, 15 Dec 2018 05:26:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=p6kZbLJiMcXabVin6l+4r2TEgIjxwviPEYE64Vt+DC4=; b=TOlPaY8JCodL2vemIH/37zsH7hwSZnjtcWyGyFLnQP1PtKGobPBJ/07j0uXUGJl+vu 3rcGYPTN0HGkXH9F5z7HcWaghMXCHO8aWGv6ZofRYuV3DdwlGeesVe5l6uoNRyCI3zzc m4GZLr7IZvKkbptgzqly/HTlz9SEpyNEDj/14= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=p6kZbLJiMcXabVin6l+4r2TEgIjxwviPEYE64Vt+DC4=; b=GEwheiDh/QS748+QaHyWflQUv6LZe1vJeTBl/tGJCsRDgyYBT9bKdSwZGcN3d4ba5N ZQsW1ZBeQ4dOX/CaqjjEW75q3rTdGo+sYBt9gc/JoYqavdBIAMwdLBN9y3d9omcVNmSD /Snulg4ThkbFqXC30nv4a28DqFH11gpq//neNQvNLQsvp0hrs2j4f5k7V2Rvv2SNnxuH tj2u1rop/m+n7ZISWfwviQDlBy1/WlNpcJuSRaSg0LxCLMwixY/aJ+IFVZ0QWOg+I6/5 i20rdpTSQ8CCF6BDR3txU/eJEFUrkrmUW1inbofmYhi6wtkPo4tGRbqAtSY/WDexPUbT SoEA== X-Gm-Message-State: AA+aEWbOdxinPKdeZ5xYw0suHfV7dSwVBVYuZgQBZa/Nvuo1YcK+7jFG f9J/9CLsebfsjNJ4LdxvwkTvAA8Besc= X-Google-Smtp-Source: AFSGD/Xu28zoxA+AJ7N3P1jbHPCBPfp2VTNwpO6za02oB+zHekj+DStdS05JgP1K3NazzUoIITBbTg== X-Received: by 2002:a1c:cbc7:: with SMTP id b190mr6737107wmg.13.1544880386979; Sat, 15 Dec 2018 05:26:26 -0800 (PST) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id j8sm5385858wrt.40.2018.12.15.05.26.24 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 15 Dec 2018 05:26:25 -0800 (PST) Date: Sat, 15 Dec 2018 13:26:23 +0000 From: Leif Lindholm To: Chris Co Cc: "edk2-devel@lists.01.org" , Ard Biesheuvel , Michael D Kinney Message-ID: <20181215132623.k2prd2o2vxnqwqyz@bivouac.eciton.net> References: <20180921082542.35768-1-christopher.co@microsoft.com> <20180921082542.35768-9-christopher.co@microsoft.com> MIME-Version: 1.0 In-Reply-To: <20180921082542.35768-9-christopher.co@microsoft.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH edk2-platforms 08/27] Silicon/NXP: Add Virtual RTC support for i.MX platform X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Dec 2018 13:26:30 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Sep 21, 2018 at 08:25:59AM +0000, Chris Co wrote: > This adds a virtual RTC library that implements EFI RTC runtime services > based on the ARM performance counter. It should only be used for relative > time measurement, such as for Windows Boot Manager. Is this for use only before ExitBootservices, or does use of this mean the performance counters will conflict with use during OS runtime? Please add some detail to commit message. > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Christopher Co > Cc: Ard Biesheuvel > Cc: Leif Lindholm > Cc: Michael D Kinney > --- > Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c | 227 ++++++++++++++++++++ > Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf | 37 ++++ > 2 files changed, 264 insertions(+) > > diff --git a/Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c b/Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c > new file mode 100644 > index 000000000000..771c1d7a8f9c > --- /dev/null > +++ b/Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c > @@ -0,0 +1,227 @@ > +/** @file > +* > +* Implement EFI RealTimeClock runtime services based on ARM Performance Counter. > +* > +* Currently this driver does not support time setting, alarms, or runtime calls. > +* This special library is NOT meant to replace a HW RTC implementation to > +* measure date/time. Use this library ONLY to measure relative time between > +* two EFI_GET_TIME readings. > +* The performance counter will wrap-around eventually after a long time, make > +* sure to consider this limitation if you are depending on this library for > +* relative time measurement. e.g. For the ARM 64-bit counter with 19.2MHz > +* frequency, the counter will wrap-around after approximately 30465 year. > +* > +* Copyright (c) 2018 Microsoft Corporation. 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 > +* > +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +* > +**/ > + > +#include > + > +#include > +#include > +#include > +#include > +#include > + > +#define LOG_FMT_HELPER(FMT, ...) \ > + "VirtualRealTimeClock:" FMT "%a\n", __VA_ARGS__ > + > +#define LOG_TRACE(...) \ > + DEBUG((DEBUG_BLKIO, LOG_FMT_HELPER(__VA_ARGS__, ""))) > + > +/** > + Returns the current time and date information, and the time-keeping capabilities > + of the virtual RTC. > + > + For simplicity, this LibGetTime does not report Years/Months, instead it will > + only report current Day, Hours, Minutes and Seconds starting from the beginning > + of CPU up-time. Otherwise, a more complex logic will be required to account > + for leap years and days/month differences. > + > + @param Time A pointer to storage to receive a snapshot of > + the current time. > + @param Capabilities An optional pointer to a buffer to receive the > + real time clock device's capabilities. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval EFI_INVALID_PARAMETER Time is NULL. > + @retval EFI_DEVICE_ERROR The time could not be retrieved due to hardware error. > + > +**/ > +EFI_STATUS > +EFIAPI > +LibGetTime ( > + OUT EFI_TIME *Time, > + OUT EFI_TIME_CAPABILITIES *Capabilities > + ) > +{ > + UINT64 ElapsedSeconds; > + UINT64 TimerFreq; > + > + if (Time == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // Depend on ARM ARCH Timer (i.e. performance counter) to report date/time > + // relative to the start of CPU timer counting where date and time will always > + // be relative to the date/time 1/1/1900 00H:00M:00S > + if (PcdGet32 (PcdArmArchTimerFreqInHz) > 0) { > + TimerFreq = PcdGet32 (PcdArmArchTimerFreqInHz); > + } else { > + TimerFreq = GetPerformanceCounterProperties (NULL, NULL); > + } OK, here is where I get confused. The comment says we're using Arch timers, but surely iMX6Pkg/Library/TimerLib isn't a reimplementation of ArmPkg/Library/ArmArchTimerLib? Also, using iMX6Pkg/Library/TimerLib, this all folds down to setting TimerFreq to the value of PcdGet32 (PcdArmArchTimerFreqInHz) regardless. > + > + ASSERT (TimerFreq > 0); > + if (TimerFreq == 0) { > + return EFI_DEVICE_ERROR; > + } > + > + if (Capabilities) { > + Capabilities->Accuracy = 0; > + Capabilities->Resolution = TimerFreq; > + Capabilities->SetsToZero = FALSE; > + } > + > + ElapsedSeconds = GetPerformanceCounter () / TimerFreq; > + > + // Don't report Year/Month since Leap Year logic is not implemented. This should > + // be fine since the sole purpose of this special implementation is to be > + // used for relative time measurement. e.g. Windows Boot Manager. > + Time->Year = 0; > + Time->Month = 0; This is ... not exactly spec compliant, is it? / Leif > + > + CONST UINT64 SECONDS_PER_DAY = 24 * 60 * 60; > + Time->Day = (ElapsedSeconds / SECONDS_PER_DAY); > + ElapsedSeconds %= SECONDS_PER_DAY; > + > + CONST UINT64 SECONDS_PER_HOUR = 60 * 60; > + Time->Hour = (ElapsedSeconds / SECONDS_PER_HOUR); > + ElapsedSeconds %= SECONDS_PER_HOUR; > + > + CONST UINT64 SECONDS_PER_MINUTE = 60; > + Time->Minute = (ElapsedSeconds / SECONDS_PER_MINUTE); > + ElapsedSeconds %= SECONDS_PER_MINUTE; > + > + Time->Second = ElapsedSeconds; > + Time->Nanosecond = 0; > + Time->TimeZone = 0; > + Time->Daylight = 0; > + > + LOG_TRACE ( > + "Time Elapsed Since Power-On: Day%d %dh:%dm:%ds", > + (UINT32)Time->Day, > + (UINT32)Time->Hour, > + (UINT32)Time->Minute, > + (UINT32)Time->Second); > + > + return EFI_SUCCESS; > +} > + > +/** > + Sets the current local time and date information. > + > + @param Time A pointer to the current time. > + > + @retval EFI_UNSUPPORTED This operation is not supported. > + > +**/ > +EFI_STATUS > +EFIAPI > +LibSetTime ( > + IN EFI_TIME *Time > + ) > +{ > + // The virtual clock is read-only. > + return EFI_UNSUPPORTED; > +} > + > +/** > + Returns the current wakeup alarm clock setting. > + > + @param Enabled Indicates if the alarm is currently enabled or > + disabled. > + @param Pending Indicates if the alarm signal is pending and > + requires acknowledgement. > + @param Time The current alarm setting. > + > + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform. > + > +**/ > +EFI_STATUS > +EFIAPI > +LibGetWakeupTime ( > + OUT BOOLEAN *Enabled, > + OUT BOOLEAN *Pending, > + OUT EFI_TIME *Time > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + Sets the system wakeup alarm clock time. > + > + @param Enabled Enable or disable the wakeup alarm. > + @param Time If Enable is TRUE, the time to set the wakeup alarm for. > + > + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this platform. > + > +**/ > +EFI_STATUS > +EFIAPI > +LibSetWakeupTime ( > + IN BOOLEAN Enabled, > + OUT EFI_TIME *Time > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** > + This is the declaration of an EFI image entry point. This can be the entry point > + to an application written to this specification, an EFI boot service driver, > + or an EFI runtime driver. > + > + @param ImageHandle Handle that identifies the loaded image. > + @param SystemTable System Table for this image. > + > + @retval EFI_SUCCESS The operation completed successfully. > + > +**/ > +EFI_STATUS > +EFIAPI > +LibRtcInitialize ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + // ARM ARCH Timer is already initialized in the SEC/PEI phase. > + return EFI_SUCCESS; > +} > + > +/** > + Fixup internal data so that EFI can be call in virtual mode. > + Call the passed in Child Notify event and convert any pointers in > + lib to virtual mode. > + > + @param[in] Event The Event that is being processed > + @param[in] Context Event Context > +**/ > +VOID > +EFIAPI > +LibRtcVirtualNotifyEvent ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + // Not supporting OS calling RTC functions in virtual mode. > + return; > +} > diff --git a/Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf b/Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf > new file mode 100644 > index 000000000000..54aacde8c741 > --- /dev/null > +++ b/Silicon/NXP/iMXPlatformPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf > @@ -0,0 +1,37 @@ > +## @file > +# > +# Copyright (c) 2018 Microsoft Corporation. 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 > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +# > +## > + > +[Defines] > + INF_VERSION = 0x0001001A > + BASE_NAME = VirtualRealTimeClockLib > + FILE_GUID = 1E27D461-78F3-4F7D-B1C2-F72384F13A6E > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = RealTimeClockLib > + > +[Sources.common] > + VirtualRealTimeClockLib.c > + > +[Packages] > + ArmPkg/ArmPkg.dec > + EmbeddedPkg/EmbeddedPkg.dec > + MdePkg/MdePkg.dec > + > +[LibraryClasses] > + DebugLib > + IoLib > + TimerLib > + > +[FixedPcd] > + gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz > -- > 2.16.2.gvfs.1.33.gf5370f1 >