From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: None (no SPF record) identity=mailfrom; client-ip=2a00:1450:4864:20::544; helo=mail-ed1-x544.google.com; envelope-from=pete@akeo.ie; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x544.google.com (mail-ed1-x544.google.com [IPv6:2a00:1450:4864:20::544]) (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 EB0DF21B02822 for ; Thu, 31 Jan 2019 04:31:32 -0800 (PST) Received: by mail-ed1-x544.google.com with SMTP id f23so2448781edb.3 for ; Thu, 31 Jan 2019 04:31:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=VjVKzKsCukco6ZMND7NAs0El9J1E+vDmQiHkBvLfhAA=; b=o7ZfHHJECk0cBzCn6udDS49bJNntcCWRR+piSi+w1cCvgv3GD9oq/Z7hig3rvS55vH KJWSF1cxuhAzjeahdUDoeovWy02rZpMWYPm3LiVYURzuiihmuj9edlki1abFKONdUjZp QxGpsG/Av3oQDP2R0KBy6vqDrmjYBr/iJ3qd3HrmdplOBqtFQ+CZNOaMOJPXVvCkREhi ioTwpPCzn2oJn4g+HlI7jOW6lk6gWX24KNJ46AvE1opSmF33TwrL70ZKqncHB2t/nYEu RwZcJppANdOIcxbjHpAhQaOM7PVF3E+gP8MEokrcQ7hIQlAwFz1REo0xHI8yho6zqYpc ijYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=VjVKzKsCukco6ZMND7NAs0El9J1E+vDmQiHkBvLfhAA=; b=Iimm/os+9lRFLvAQCSnTmKQeZA1jpoKfNVLUQXWnVWbFTFAgbBMGeAmKh9qfgN4BXM PDCdBpiYLHqTnpAkMaXciGrKMwggRf13PhGrEO0l82gMfvA3vKJg56t5CQPAD/2YyE2m UGqD8Kd1gGqoehkp93VneA0nhAhJ2YLnyklY+fWE5MEMmc4qSVUaeVhxVn8Xc9pzPnc+ j9k3QP9h19m32D7df34r3RPbPuVZmbtmaybuH3ZmM0GObFrYl0d+uIRaC45IHDYUmFs5 l8EpUeJKXCU3uSXRC4K7QAlH/xfbya8WBBeE5DUzeNrT30C8WNhCraK68rO3wNiSy+86 0pDg== X-Gm-Message-State: AJcUukc62S9W48R7RzJwpCqF31kZjVfgvHMutu1dbqxpXh4bgPiGhoIz 1h3ckeaIMCsi1U37KF9bDexSoA== X-Google-Smtp-Source: ALg8bN6ZPbPXcWaGIyYM1x41u3S7zRj2tz30b+bAWOMcxUl7OZNeRgiJOGUjRK3foKb298opg3eqwA== X-Received: by 2002:a17:906:e96:: with SMTP id p22mr17968269ejf.109.1548937891424; Thu, 31 Jan 2019 04:31:31 -0800 (PST) Received: from [10.0.0.102] ([84.203.95.186]) by smtp.googlemail.com with ESMTPSA id f20sm1318856edf.19.2019.01.31.04.31.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 31 Jan 2019 04:31:30 -0800 (PST) To: Leif Lindholm Cc: edk2-devel@lists.01.org, ard.biesheuvel@linaro.org References: <20190129162655.3800-1-pete@akeo.ie> <20190129162655.3800-7-pete@akeo.ie> <20190130222236.53jfh65ehhtk52ly@bivouac.eciton.net> From: Pete Batard Message-ID: <3a316ad7-7ae5-e1da-9395-9e989c01e4f2@akeo.ie> Date: Thu, 31 Jan 2019 12:31:29 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.5.0 MIME-Version: 1.0 In-Reply-To: <20190130222236.53jfh65ehhtk52ly@bivouac.eciton.net> Subject: Re: [PATCH v4 edk2-platforms 06/23] Platform/Raspberry/Pi3: Add RTC library 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: Thu, 31 Jan 2019 12:31:33 -0000 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit On 2019.01.30 22:22, Leif Lindholm wrote: > First of all - this is something I would like to see contributed > directly to edk2 EmbeddedPkg. It's something me and Ard have discussed > adding at some point, but never getting around to. > > I would also like to look into whether we could replace > PcdBootEpochSeconds with a -DBUILD_EPOCH=`date +%s` addition to the > CFLAGS in the .inf. Okay, I'll look into both of these items. > > Regards, > > Leif > > On Tue, Jan 29, 2019 at 04:26:38PM +0000, Pete Batard wrote: >> Contributed-under: TianoCore Contribution Agreement 1.1 >> Signed-off-by: Pete Batard >> --- >> Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c | 221 ++++++++++++++++++++ >> Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf | 43 ++++ >> 2 files changed, 264 insertions(+) >> >> diff --git a/Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c b/Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c >> new file mode 100644 >> index 000000000000..dea621ff03ef >> --- /dev/null >> +++ b/Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c >> @@ -0,0 +1,221 @@ >> +/** @file >> + * >> + * Implement dummy EFI RealTimeClock runtime services. >> + * >> + * Copyright (c) 2018, Andrei Warkentin >> + * Copyright (c) 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 >> +#include >> +#include >> +#include >> + >> +/** >> + 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 begining 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 >> + ) >> +{ >> + UINTN DataSize; >> + UINT64 Counter; >> + EFI_STATUS Status; >> + UINTN ElapsedSeconds; >> + UINT32 Remainder; >> + UINT32 Freq = ArmGenericTimerGetTimerFreq (); >> + >> + if (Time == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + // >> + // Depend on ARM generic timer 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 >> + // >> + >> + ASSERT (Freq != 0); >> + if (Freq == 0) { >> + return EFI_DEVICE_ERROR; >> + } >> + >> + if (Capabilities) { >> + Capabilities->Accuracy = 0; >> + Capabilities->Resolution = Freq; >> + Capabilities->SetsToZero = FALSE; >> + } >> + >> + DataSize = sizeof (UINTN); >> + ElapsedSeconds = 0; >> + Status = EfiGetVariable (L"RtcEpochSeconds", >> + &gEfiCallerIdGuid, >> + NULL, >> + &DataSize, >> + &ElapsedSeconds); >> + if (EFI_ERROR (Status)) { >> + ElapsedSeconds = PcdGet64 (PcdBootEpochSeconds); >> + } >> + Counter = GetPerformanceCounter (); >> + ElapsedSeconds += DivU64x32Remainder (Counter, Freq, &Remainder); >> + EpochToEfiTime (ElapsedSeconds, Time); >> + >> + // >> + // Frequency < 0x100000000, so Remainder < 0x100000000, then (Remainder * 1,000,000,000) >> + // will not overflow 64-bit. >> + // >> + Time->Nanosecond = DivU64x32 (MultU64x64 ((UINT64)Remainder, 1000000000U), Freq); >> + >> + return EFI_SUCCESS; >> +} >> + >> + >> +/** >> + Sets the current local time and date information. >> + >> + @param Time A pointer to the current time. >> + >> + @retval EFI_SUCCESS The operation completed successfully. >> + @retval EFI_INVALID_PARAMETER A time field is out of range. >> + @retval EFI_DEVICE_ERROR The time could not be set due due to hardware error. >> + >> +**/ >> +EFI_STATUS >> +EFIAPI >> +LibSetTime ( >> + IN EFI_TIME *Time >> + ) >> +{ >> + UINTN Epoch; >> + >> + if (!IsTimeValid (Time)) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + Epoch = EfiTimeToEpoch (Time); >> + return EfiSetVariable (L"RtcEpochSeconds", &gEfiCallerIdGuid, >> + EFI_VARIABLE_BOOTSERVICE_ACCESS | >> + EFI_VARIABLE_RUNTIME_ACCESS | >> + EFI_VARIABLE_NON_VOLATILE, >> + sizeof (Epoch), >> + &Epoch); >> +} >> + >> + >> +/** >> + 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_SUCCESS The alarm settings were returned. >> + @retval EFI_INVALID_PARAMETER Any parameter is NULL. >> + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due to a hardware error. >> + >> +**/ >> +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_SUCCESS If Enable is TRUE, then the wakeup alarm was enabled. If >> + Enable is FALSE, then the wakeup alarm was disabled. >> + @retval EFI_INVALID_PARAMETER A time field is out of range. >> + @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a hardware error. >> + @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 >> + ) >> +{ >> + 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 >> + ) >> +{ >> + return; >> +} >> diff --git a/Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf b/Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf >> new file mode 100644 >> index 000000000000..5c39e4df4c34 >> --- /dev/null >> +++ b/Platform/Raspberry/Pi3/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf >> @@ -0,0 +1,43 @@ >> +#/** @file >> +# >> +# Implement dummy EFI RealTimeClock runtime services. >> +# >> +# Copyright (c) 2018, Andrei Warkentin >> +# Copyright (c) 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 >> + MdePkg/MdePkg.dec >> + EmbeddedPkg/EmbeddedPkg.dec >> + Platform/Raspberry/Pi3/RPi3.dec >> + >> +[LibraryClasses] >> + IoLib >> + DebugLib >> + TimerLib >> + TimeBaseLib >> + UefiRuntimeLib >> + >> +[Pcd] >> + gRaspberryPiTokenSpaceGuid.PcdBootEpochSeconds >> -- >> 2.17.0.windows.1 >>