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::531; helo=mail-ed1-x531.google.com; envelope-from=pete@akeo.ie; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) (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 3F65A21197056 for ; Mon, 10 Dec 2018 04:39:11 -0800 (PST) Received: by mail-ed1-x531.google.com with SMTP id o10so9306609edt.13 for ; Mon, 10 Dec 2018 04:39:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=W7mARtVsIPRcYHcq/rvqUiPC0uhAJ6u/QNCYnEUACa4=; b=ZAKNQXKYd/LaPJXkbAM8a+OFQyMej+7IgkcGenT6zpFidj9+Hk1Kiar3RLXH9QaWiq HfQ6TLRttnCCFzPIqP9sQZrsJBZr3qI5U4xy4qytaAlfGNqY75vraboMxmpD5C6C1hsY x5l3fdwsQ4bLiXosnYXVQXRoor5y8Af125RzDLayytqpMaaGpckhXIajYtffyS2z/bKb FWYpzdDb8etYcOYObjuPpgoMHFpS5RiLptMEepq9BktTdWVkQB+5q0CZZ52qSU44ik5j 1zZXqVB3TYXQftUdmfSisC4GMWC1N91QZI/VkwMePCEfpZs+xuBanET2qpTgIDZOhqdD Ezhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=W7mARtVsIPRcYHcq/rvqUiPC0uhAJ6u/QNCYnEUACa4=; b=alsTU19XA0sxdmTfU26wPavt2N1WozNiFGZe8iYCnYiO9myf3MntKV5J9Gy7HRRyNn Avd7jwxFlJB/YPAMvWEKqFhWBX2sk68xAxPiNi75lIc8YwRb0UJK0RLTY5OrmIB+mHVq 5Yh5saKlgR4Obr1L8f7G3hU1BpIh8Bs2QcPFrDLVCPXr3tMyxMf+694BrFeDPl3NOXGT qdqGadpvsjVHuiwqwxKLU0TeM10Amv+Az8LS+eXPaD6UKiKMBkU38o3dL+cZmJ22eI4o koIswsqDt00Ix/DFcir0R3y4Ld5PD9JDAuLZri5gHw4EMIWe3IyutRSc8dUeYE/aIbqN J+yg== X-Gm-Message-State: AA+aEWYUqsElIsC5d5YkWitI/uuNYJ36mdh+rVf8vjTLtMYa0jIYbwqA lMPKveZ88aOPRTSztRFMkpf7/oA3Vrw= X-Google-Smtp-Source: AFSGD/XrIn8L5a3ZJGapunJUPbimrwkHKQfBBnNfMznd09au+Io45w7EQGgA/WY7AmnsAVd129mNLQ== X-Received: by 2002:a50:9770:: with SMTP id d45mr10694587edb.49.1544445549244; Mon, 10 Dec 2018 04:39:09 -0800 (PST) Received: from localhost.localdomain ([84.203.68.105]) by smtp.gmail.com with ESMTPSA id e14sm3296949edb.79.2018.12.10.04.39.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Dec 2018 04:39:08 -0800 (PST) From: Pete Batard To: edk2-devel@lists.01.org Date: Mon, 10 Dec 2018 12:38:36 +0000 Message-Id: <20181210123853.4864-4-pete@akeo.ie> X-Mailer: git-send-email 2.17.0.windows.1 In-Reply-To: <20181210123853.4864-1-pete@akeo.ie> References: <20181210123853.4864-1-pete@akeo.ie> Subject: [PATCH v2 edk2-platforms 03/20] Platform/Broadcom/RPi3: Add GPIO and RTC libraries 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: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 X-List-Received-Date: Mon, 10 Dec 2018 12:39:11 -0000 Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Pete Batard --- Platform/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2837Gpio.h | 50 +++++ Platform/Broadcom/Bcm283x/Include/Library/GpioLib.h | 33 +++ Platform/Broadcom/Bcm283x/Include/Utils.h | 33 +++ Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c | 79 +++++++ Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf | 39 ++++ Platform/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c | 222 ++++++++++++++++++++ Platform/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf | 43 ++++ 7 files changed, 499 insertions(+) diff --git a/Platform/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2837Gpio.h b/Platform/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2837Gpio.h new file mode 100644 index 000000000000..27e6665f1745 --- /dev/null +++ b/Platform/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2837Gpio.h @@ -0,0 +1,50 @@ +/** @file + * + * 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. + * + **/ + +#ifndef __BCM2837GPIO_H__ +#define __BCM2837GPIO_H__ + +#define GPIO_BASE_ADDRESS (BCM2836_SOC_REGISTERS + 0x00200000) + +#define GPIO_GPFSEL0 (GPIO_BASE_ADDRESS + 0x00) +#define GPIO_GPFSEL1 (GPIO_BASE_ADDRESS + 0x04) +#define GPIO_GPFSEL2 (GPIO_BASE_ADDRESS + 0x08) +#define GPIO_GPFSEL3 (GPIO_BASE_ADDRESS + 0x0C) +#define GPIO_GPFSEL4 (GPIO_BASE_ADDRESS + 0x10) +#define GPIO_GPFSEL5 (GPIO_BASE_ADDRESS + 0x14) + +#define GPIO_GPCLR0 (GPIO_BASE_ADDRESS + 0x28) +#define GPIO_GPCLR1 (GPIO_BASE_ADDRESS + 0x2C) + +#define GPIO_GPSET0 (GPIO_BASE_ADDRESS + 0x1C) +#define GPIO_GPSET1 (GPIO_BASE_ADDRESS + 0x20) + +#define GPIO_FSEL_INPUT 0x0 +#define GPIO_FSEL_OUTPUT 0x1 +#define GPIO_FSEL_ALT0 0x4 +#define GPIO_FSEL_ALT1 0x5 +#define GPIO_FSEL_ALT2 0x6 +#define GPIO_FSEL_ALT3 0x7 +#define GPIO_FSEL_ALT4 0x3 +#define GPIO_FSEL_ALT5 0x2 + +#define GPIO_FSEL_PINS_PER_REGISTER 10 +#define GPIO_FSEL_BITS_PER_PIN 3 +#define GPIO_FSEL_MASK ((1 << GPIO_FSEL_BITS_PER_PIN) - 1) + +#define GPIO_PINS 54 + +#endif // __BCM2837GPIO_H__ + diff --git a/Platform/Broadcom/Bcm283x/Include/Library/GpioLib.h b/Platform/Broadcom/Bcm283x/Include/Library/GpioLib.h new file mode 100644 index 000000000000..ca9da4b11a87 --- /dev/null +++ b/Platform/Broadcom/Bcm283x/Include/Library/GpioLib.h @@ -0,0 +1,33 @@ +/** @file + * + * GPIO manipulation. + * + * Copyright (c) 2018, Andrei Warkentin + * + * 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. + * + **/ + +#ifndef __GPIO_LIB__ +#define __GPIO_LIB__ + +#include + +VOID +GpioPinFuncSet( + IN UINTN Pin, + IN UINTN Function + ); + +UINTN +GpioPinFuncGet( + IN UINTN Pin + ); + +#endif /* __GPIO_LIB__ */ diff --git a/Platform/Broadcom/Bcm283x/Include/Utils.h b/Platform/Broadcom/Bcm283x/Include/Utils.h new file mode 100644 index 000000000000..47713275de3f --- /dev/null +++ b/Platform/Broadcom/Bcm283x/Include/Utils.h @@ -0,0 +1,33 @@ +/** @file + * + * Copyright (c) 2018, Andrei Warkentin + * + * 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. + * + **/ + +#ifndef UTILS_H +#define UTILS_H + +#define _IX_BITS(sm, bg) ((bg) - (sm) + 1) +#define _IX_MASK(sm, bg) ((1ul << _IX_BITS((sm), (bg))) - 1) +#define _X(val, sm, bg) ((val) >> (sm)) & _IX_MASK((sm), (bg)) +#define X(val, ix1, ix2) (((ix1) < (ix2)) ? _X((val), (ix1), (ix2)) : \ + _X((val), (ix2), (ix1))) + +#define _I(val, sm, bg) (((val) & _IX_MASK((sm), (bg))) << (sm)) +#define I(val, ix1, ix2) (((ix1) < (ix2)) ? _I((val), (ix1), (ix2)) : \ + _I((val), (ix2), (ix1))) +#define _M(val, sm, bg) ((val) & (_IX_MASK((sm), (bg)) << (sm))) +#define M(val, ix1, ix2) (((ix1) < (ix2)) ? _M((val), (ix1), (ix2)) : \ + _M((val), (ix2), (ix1))) + +#define ELES(x) (sizeof((x)) / sizeof((x)[0])) + +#endif /* UTILS_H */ diff --git a/Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c b/Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c new file mode 100644 index 000000000000..db38acefb7c3 --- /dev/null +++ b/Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c @@ -0,0 +1,79 @@ +/** @file + * + * GPIO manipulation. + * + * Copyright (c) 2018, Andrei Warkentin + * + * 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 + +STATIC VOID +GpioFSELModify( + IN UINTN RegIndex, + IN UINT32 ModifyMask, + IN UINT32 FunctionMask + ) +{ + UINT32 Val; + EFI_PHYSICAL_ADDRESS Reg = RegIndex * sizeof(UINT32) + GPIO_GPFSEL0; + + ASSERT(Reg <= GPIO_GPFSEL5); + ASSERT((~ModifyMask & FunctionMask) == 0); + + Val = MmioRead32(Reg); + Val &= ~ModifyMask; + Val |= FunctionMask; + MmioWrite32(Reg, Val); +} + +VOID +GpioPinFuncSet( + IN UINTN Pin, + IN UINTN Function + ) +{ + UINTN RegIndex = Pin / 10; + UINTN SelIndex = Pin % 10; + UINT32 ModifyMask; + UINT32 FunctionMask; + + ASSERT(Pin < GPIO_PINS); + ASSERT(Function <= GPIO_FSEL_MASK); + + ModifyMask = GPIO_FSEL_MASK << (SelIndex * GPIO_FSEL_BITS_PER_PIN); + FunctionMask = Function << (SelIndex * GPIO_FSEL_BITS_PER_PIN); + GpioFSELModify(RegIndex, ModifyMask, FunctionMask); +} + +UINTN +GpioPinFuncGet( + IN UINTN Pin + ) +{ + UINT32 Val; + UINTN RegIndex = Pin / 10; + UINTN SelIndex = Pin % 10; + EFI_PHYSICAL_ADDRESS Reg = RegIndex * sizeof(UINT32) + GPIO_GPFSEL0; + + ASSERT(Pin < GPIO_PINS); + + Val = MmioRead32(Reg); + Val >>= SelIndex * GPIO_FSEL_BITS_PER_PIN; + Val &= GPIO_FSEL_MASK; + return Val; +} diff --git a/Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf b/Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf new file mode 100644 index 000000000000..82114568b0a6 --- /dev/null +++ b/Platform/Broadcom/Bcm283x/Library/GpioLib/GpioLib.inf @@ -0,0 +1,39 @@ +#/** @file +# +# Manipulate GPIOs. +# +# Copyright (c) 2018, Andrei Warkentin +# +# 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 = 0x00010005 + BASE_NAME = GpioLib + FILE_GUID = B9F59B6B-B105-41C7-8F5A-2C60DD7FD7AB + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = GpioLib + +[Sources] + GpioLib.c + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + Platform/Broadcom/Bcm283x/RaspberryPiPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + IoLib + +[Guids] diff --git a/Platform/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c b/Platform/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c new file mode 100644 index 000000000000..5e1dd768331a --- /dev/null +++ b/Platform/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.c @@ -0,0 +1,222 @@ +/** @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/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf b/Platform/Broadcom/Bcm283x/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf new file mode 100644 index 000000000000..847bcfadd824 --- /dev/null +++ b/Platform/Broadcom/Bcm283x/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 = 0x00010005 + 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/Broadcom/Bcm283x/RaspberryPiPkg.dec + +[LibraryClasses] + IoLib + DebugLib + TimerLib + TimeBaseLib + UefiRuntimeLib + +[Pcd] + gRaspberryPiTokenSpaceGuid.PcdBootEpochSeconds -- 2.17.0.windows.1