From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web10.10817.1589539911334716355 for ; Fri, 15 May 2020 03:51:51 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: andre.przywara@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C0152D6E; Fri, 15 May 2020 03:51:49 -0700 (PDT) Received: from [192.168.2.22] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 78D5B3F305; Fri, 15 May 2020 03:51:48 -0700 (PDT) Subject: Re: [PATCH v2 01/11] PcAtChipsetPkg: Add MMIO Support to RTC driver To: Sami Mujawar , devel@edk2.groups.io Cc: ard.biesheuvel@arm.com, leif@nuviainc.com, ray.ni@intel.com, Alexandru.Elisei@arm.com, Matteo.Carlini@arm.com, Laura.Moretta@arm.com, nd@arm.com References: <20200514084019.71368-1-sami.mujawar@arm.com> <20200514084019.71368-2-sami.mujawar@arm.com> From: =?UTF-8?Q?Andr=c3=a9_Przywara?= Autocrypt: addr=andre.przywara@arm.com; prefer-encrypt=mutual; keydata= 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 i4aIXCH3Wv6K Organization: ARM Ltd. Message-ID: <0bfc0116-7d84-4f70-eb3d-d9fd8a76ded8@arm.com> Date: Fri, 15 May 2020 11:50:56 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20200514084019.71368-2-sami.mujawar@arm.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit On 14/05/2020 09:40, Sami Mujawar wrote: Hi Sami, many thanks for your work on that! > Some virtual machine managers like kvmtool emulate the MC146818 > RTC controller in the MMIO space so that architectures that do > not support I/O Mapped I/O can use the RTC. This patch adds MMIO > support to the RTC controller driver. Is there any chance you could read the MMIO base address from the DT? I sent a kvmtool patch to add the missing DT node[1]. The compatible string would be "motorola,mc146818", with just the usual reg property. Maybe you could fall back to the current 0x70/0x71, if there is no DT node? For a start, this low address (0x70/0x71) causes issues, so we probably need to move this permanently. But also we want to introduce a more flexible memory layout, so devices can move depending on command line parameters. It would be great if EDK-2 could cover that from the beginning, so that we don't end up with compatibility issues. Cheers, Andre [1] https://lists.cs.columbia.edu/pipermail/kvmarm/2020-May/040703.html > > The PCD PcdRtcUseMmio has been added to select I/O or MMIO support. > If PcdRtcUseMmio is: > TRUE - Indicates the RTC port registers are in MMIO space. > FALSE - Indicates the RTC port registers are in I/O space. > Default is I/O space. > > When MMIO support is selected (PcdRtcUseMmio == TRUE) the driver > maps the MMIO region used by the RTC as runtime memory so that the > RTC registers are accessible post ExitBootServices. > > Signed-off-by: Sami Mujawar > --- > > Notes: > v2: > - Code review comments incorporated. [Sami] > > v1: > - Add support to read/write from RTC registers using MMIO access [Sami] > - Use wrapper functions for RtcRead/Write accessors [Leif] > Ref: https://edk2.groups.io/g/devel/topic/30915281#30695 > > PcAtChipsetPkg/PcAtChipsetPkg.dec | 8 ++ > PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c | 117 ++++++++++++++++-- > PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h | 31 +++++ > PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtcEntry.c | 130 +++++++++++++++++++- > PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf | 8 ++ > 5 files changed, 280 insertions(+), 14 deletions(-) > > diff --git a/PcAtChipsetPkg/PcAtChipsetPkg.dec b/PcAtChipsetPkg/PcAtChipsetPkg.dec > index 88de5cceea593176c3a2425a5963b66b789f2b9e..76d0c7eda69bb505914ba904e09c89de170f69ae 100644 > --- a/PcAtChipsetPkg/PcAtChipsetPkg.dec > +++ b/PcAtChipsetPkg/PcAtChipsetPkg.dec > @@ -6,6 +6,7 @@ > # > # Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.
> # Copyright (c) 2017, AMD Inc. All rights reserved.
> +# Copyright (c) 2018, ARM Limited. All rights reserved.
> # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -142,5 +143,12 @@ [PcdsFixedAtBuild, PcdsPatchableInModule] > # @Prompt RTC Update Timeout Value. > gPcAtChipsetPkgTokenSpaceGuid.PcdRealTimeClockUpdateTimeout|100000|UINT32|0x00000020 > > + ## Indicates the RTC port registers are in MMIO space, or in I/O space. > + # Default is I/O space.

> + # TRUE - RTC port registers are in MMIO space.
> + # FALSE - RTC port registers are in I/O space.
> + # @Prompt RTC port registers use MMIO. > + gPcAtChipsetPkgTokenSpaceGuid.PcdRtcUseMmio|FALSE|BOOLEAN|0x00000021 > + > [UserExtensions.TianoCore."ExtraFiles"] > PcAtChipsetPkgExtra.uni > diff --git a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c > index 52af17941786ef81c3911512ee64551724e67209..df8dea83ab27bbba12351096d1bfd9ea31accb60 100644 > --- a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c > +++ b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c > @@ -3,6 +3,7 @@ > > Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> Copyright (c) 2017, AMD Inc. All rights reserved.
> +Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.
> > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -10,6 +11,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > #include "PcRtc.h" > > +extern EFI_PHYSICAL_ADDRESS mRtcRegisterBase; > + > // > // Days of month. > // > @@ -21,6 +24,28 @@ UINTN mDayOfMonth[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; > CHAR16 mTimeZoneVariableName[] = L"RTC"; > > /** > + A function pointer that evaluates to a function that reads the RTC content > + through its registers either using IO or MMIO access. > + > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + > + @return The data of UINT8 type read from RTC. > +**/ > +RTC_READ RtcRead; > + > +/** > + A function pointer that evaluates to a function that reads the RTC content > + through its registers either using IO or MMIO access. > + > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + > + @return The data of UINT8 type read from RTC. > +**/ > +RTC_WRITE RtcWrite; > + > +/** > Compare the Hour, Minute and Second of the From time and the To time. > > Only compare H/M/S in EFI_TIME and ignore other fields here. > @@ -54,41 +79,99 @@ IsWithinOneDay ( > ); > > /** > - Read RTC content through its registers. > + Read RTC content through its registers using IO access. > > - @param Address Address offset of RTC. It is recommended to use macros such as > - RTC_ADDRESS_SECONDS. > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > > @return The data of UINT8 type read from RTC. > **/ > +STATIC > UINT8 > -RtcRead ( > +IoRtcRead ( > IN UINT8 Address > ) > { > - IoWrite8 (PcdGet8 (PcdRtcIndexRegister), (UINT8) (Address | (UINT8) (IoRead8 (PcdGet8 (PcdRtcIndexRegister)) & 0x80))); > + IoWrite8 ( > + PcdGet8 (PcdRtcIndexRegister), > + (UINT8)(Address | (UINT8)(IoRead8 (PcdGet8 (PcdRtcIndexRegister)) & 0x80)) > + ); > return IoRead8 (PcdGet8 (PcdRtcTargetRegister)); > } > > /** > - Write RTC through its registers. > + Write RTC through its registers using IO access. > > - @param Address Address offset of RTC. It is recommended to use macros such as > - RTC_ADDRESS_SECONDS. > - @param Data The content you want to write into RTC. > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + @param Data The content you want to write into RTC. > > **/ > +STATIC > VOID > -RtcWrite ( > +IoRtcWrite ( > IN UINT8 Address, > IN UINT8 Data > ) > { > - IoWrite8 (PcdGet8 (PcdRtcIndexRegister), (UINT8) (Address | (UINT8) (IoRead8 (PcdGet8 (PcdRtcIndexRegister)) & 0x80))); > + IoWrite8 ( > + PcdGet8 (PcdRtcIndexRegister), > + (UINT8)(Address | (UINT8)(IoRead8 (PcdGet8 (PcdRtcIndexRegister)) & 0x80)) > + ); > IoWrite8 (PcdGet8 (PcdRtcTargetRegister), Data); > } > > /** > + Read RTC content through its registers using MMIO access. > + > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + > + @return The data of UINT8 type read from RTC. > +**/ > +STATIC > +UINT8 > +MmioRtcRead ( > + IN UINT8 Address > + ) > +{ > + MmioWrite8 ( > + mRtcRegisterBase, > + (UINT8)(Address | (UINT8)(MmioRead8 (mRtcRegisterBase) & 0x80)) > + ); > + return MmioRead8 ( > + mRtcRegisterBase + (PcdGet8 (PcdRtcTargetRegister) - > + PcdGet8 (PcdRtcIndexRegister)) > + ); > +} > + > +/** > + Write RTC through its registers using MMIO access. > + > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + @param Data The content you want to write into RTC. > + > +**/ > +STATIC > +VOID > +MmioRtcWrite ( > + IN UINT8 Address, > + IN UINT8 Data > + ) > +{ > + MmioWrite8 ( > + mRtcRegisterBase, > + (UINT8)(Address | (UINT8)(MmioRead8 (mRtcRegisterBase) & 0x80)) > + ); > + MmioWrite8 ( > + mRtcRegisterBase + (PcdGet8 (PcdRtcTargetRegister) - > + PcdGet8 (PcdRtcIndexRegister)), > + Data > + ); > +} > + > +/** > Initialize RTC. > > @param Global For global use inside this module. > @@ -113,6 +196,18 @@ PcRtcInit ( > BOOLEAN Pending; > > // > + // Initialize the RtcRead and RtcWrite functions > + // based on the chosen IO/MMIO access. > + // > + if (FixedPcdGetBool (PcdRtcUseMmio)) { > + RtcRead = MmioRtcRead; > + RtcWrite = MmioRtcWrite; > + } else { > + RtcRead = IoRtcRead; > + RtcWrite = IoRtcWrite; > + } > + > + // > // Acquire RTC Lock to make access to RTC atomic > // > if (!EfiAtRuntime ()) { > diff --git a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h > index 47293ce44c5a1f4792892892f7da40d7f0a5a001..e64dbbea48f7f0d2f317c65c2e4b93e7b1888efc 100644 > --- a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h > +++ b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.h > @@ -3,6 +3,7 @@ > > Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> Copyright (c) 2017, AMD Inc. All rights reserved.
> +Copyright (c) 2019 - 2020, ARM Limited. All rights reserved.
> > SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -371,4 +372,34 @@ PcRtcAcpiTableChangeCallback ( > IN EFI_EVENT Event, > IN VOID *Context > ); > + > +/** > + Function pointer to Read RTC content through its registers. > + > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + > + @return The data of UINT8 type read from RTC. > +**/ > +typedef > +UINT8 > +(EFIAPI *RTC_READ) ( > + IN UINT8 Address > + ); > + > +/** > + Function pointer to Write RTC through its registers. > + > + @param Address Address offset of RTC. It is recommended to use > + macros such as RTC_ADDRESS_SECONDS. > + @param Data The content you want to write into RTC. > + > +**/ > +typedef > +VOID > +(EFIAPI *RTC_WRITE) ( > + IN UINT8 Address, > + IN UINT8 Data > + ); > + > #endif > diff --git a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtcEntry.c b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtcEntry.c > index ccda6331373bfe4069b0a59495b5e5cc731c8fc8..5d5dbeaf970ca8eb291c1e094fd764d201f9071e 100644 > --- a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtcEntry.c > +++ b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtcEntry.c > @@ -2,16 +2,32 @@ > Provides Set/Get time operations. > > Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> +Copyright (c) 2018 - 2020, ARM Limited. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > +#include > #include "PcRtc.h" > > PC_RTC_MODULE_GLOBALS mModuleGlobal; > > EFI_HANDLE mHandle = NULL; > > +STATIC EFI_EVENT mVirtualAddrChangeEvent; > + > +EFI_PHYSICAL_ADDRESS mRtcRegisterBase; > + > +// > +// Function pointer for the Rtc Read interface function > +// > +extern RTC_READ RtcRead; > + > +// > +// Function pointer for the Rtc Write interface function > +// > +extern RTC_WRITE RtcWrite; > + > /** > Returns the current time and date information, and the time-keeping capabilities > of the hardware platform. > @@ -106,6 +122,33 @@ PcRtcEfiSetWakeupTime ( > } > > /** > + Fixup internal data so that EFI can be called 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 > + ) > +{ > + // Only needed if you are going to support the OS calling RTC functions in > + // virtual mode. You will need to call EfiConvertPointer (). To convert any > + // stored physical addresses to virtual address. After the OS transitions to > + // calling in virtual mode, all future runtime calls will be made in virtual > + // mode. > + EfiConvertPointer (0x0, (VOID**)&mRtcRegisterBase); > + > + // Convert the RtcRead and RtcWrite pointers for runtime use. > + EfiConvertPointer (0x0, (VOID**)&RtcRead); > + EfiConvertPointer (0x0, (VOID**)&RtcWrite); > +} > + > +/** > The user Entry Point for PcRTC module. > > This is the entry point for PcRTC module. It installs the UEFI runtime service > @@ -125,12 +168,77 @@ InitializePcRtc ( > IN EFI_SYSTEM_TABLE *SystemTable > ) > { > - EFI_STATUS Status; > - EFI_EVENT Event; > + EFI_STATUS Status; > + EFI_EVENT Event; > + EFI_PHYSICAL_ADDRESS RtcPageBase; > > EfiInitializeLock (&mModuleGlobal.RtcLock, TPL_CALLBACK); > mModuleGlobal.CenturyRtcAddress = GetCenturyRtcAddress (); > > + if (FixedPcdGetBool (PcdRtcUseMmio)) { > + mRtcRegisterBase = PcdGet8 (PcdRtcIndexRegister); > + RtcPageBase = mRtcRegisterBase & ~(EFI_PAGE_SIZE - 1); > + > + // Declare the controller as EFI_MEMORY_RUNTIME > + Status = gDS->AddMemorySpace ( > + EfiGcdMemoryTypeMemoryMappedIo, > + RtcPageBase, > + EFI_PAGE_SIZE, > + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, "Failed to add memory space. Status = %r\n", > + Status > + )); > + return Status; > + } > + > + Status = gDS->AllocateMemorySpace ( > + EfiGcdAllocateAddress, > + EfiGcdMemoryTypeMemoryMappedIo, > + 0, > + EFI_PAGE_SIZE, > + &RtcPageBase, > + ImageHandle, > + NULL > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "Failed to allocate memory space. Status = %r\n", > + Status > + )); > + gDS->RemoveMemorySpace ( > + RtcPageBase, > + EFI_PAGE_SIZE > + ); > + return Status; > + } > + > + Status = gDS->SetMemorySpaceAttributes ( > + RtcPageBase, > + EFI_PAGE_SIZE, > + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "Failed to set memory attributes. Status = %r\n", > + Status > + )); > + gDS->FreeMemorySpace ( > + RtcPageBase, > + EFI_PAGE_SIZE > + ); > + gDS->RemoveMemorySpace ( > + RtcPageBase, > + EFI_PAGE_SIZE > + ); > + return Status; > + } > + } > + > Status = PcRtcInit (&mModuleGlobal); > ASSERT_EFI_ERROR (Status); > > @@ -165,7 +273,23 @@ InitializePcRtc ( > NULL, > NULL > ); > - ASSERT_EFI_ERROR (Status); > + if (EFI_ERROR (Status)) { > + ASSERT_EFI_ERROR (Status); > + return Status; > + } > + > + if (FixedPcdGetBool (PcdRtcUseMmio)) { > + // Register for the virtual address change event > + Status = gBS->CreateEventEx ( > + EVT_NOTIFY_SIGNAL, > + TPL_NOTIFY, > + LibRtcVirtualNotifyEvent, > + NULL, > + &gEfiEventVirtualAddressChangeGuid, > + &mVirtualAddrChangeEvent > + ); > + ASSERT_EFI_ERROR (Status); > + } > > return Status; > } > diff --git a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > index c73ee98105e510f9e4e23c1a6c1e5c505325d2c9..3a373d11f8bfc7df0e4d00be8b43e90bfa06b192 100644 > --- a/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > +++ b/PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > @@ -6,6 +6,7 @@ > # > # Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
> # Copyright (c) 2017, AMD Inc. All rights reserved.
> +# Copyright (c) 2018, ARM Limited. All rights reserved.
> # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -48,6 +49,7 @@ [LibraryClasses] > BaseLib > PcdLib > ReportStatusCodeLib > + DxeServicesTableLib > > [Protocols] > gEfiRealTimeClockArchProtocolGuid ## PRODUCES > @@ -61,10 +63,13 @@ [Guids] > ## SOMETIMES_CONSUMES ## SystemTable > gEfiAcpiTableGuid > > + gEfiEventVirtualAddressChangeGuid > + > [FixedPcd] > gPcAtChipsetPkgTokenSpaceGuid.PcdInitialValueRtcRegisterA ## CONSUMES > gPcAtChipsetPkgTokenSpaceGuid.PcdInitialValueRtcRegisterB ## CONSUMES > gPcAtChipsetPkgTokenSpaceGuid.PcdInitialValueRtcRegisterD ## CONSUMES > + gPcAtChipsetPkgTokenSpaceGuid.PcdRtcUseMmio ## CONSUMES > > [Pcd] > gPcAtChipsetPkgTokenSpaceGuid.PcdRealTimeClockUpdateTimeout ## CONSUMES > @@ -76,5 +81,8 @@ [Pcd] > [Depex] > gEfiVariableArchProtocolGuid AND gEfiVariableWriteArchProtocolGuid > > +[Depex.common.DXE_RUNTIME_DRIVER] > + gEfiCpuArchProtocolGuid > + > [UserExtensions.TianoCore."ExtraFiles"] > PcRtcExtra.uni >