From: "Ard Biesheuvel" <ard.biesheuvel@arm.com>
To: Sami Mujawar <sami.mujawar@arm.com>, devel@edk2.groups.io
Cc: leif@nuviainc.com, lersek@redhat.com, Alexandru.Elisei@arm.com,
Andre.Przywara@arm.com, Matteo.Carlini@arm.com,
Laura.Moretta@arm.com, nd@arm.com
Subject: Re: [PATCH v1 08/11] ArmVirtPkg: Add Kvmtool NOR flash lib
Date: Thu, 14 May 2020 11:32:26 +0200 [thread overview]
Message-ID: <b31b96fc-b604-e635-a6e1-8564fb5fc79b@arm.com> (raw)
In-Reply-To: <20200514084019.71368-9-sami.mujawar@arm.com>
On 5/14/20 10:40 AM, Sami Mujawar wrote:
> Kvmtool places the base address of the CFI flash in
> the device tree it passes to UEFI. This library
> parses the kvmtool device tree to read the CFI base
> address and initialise the PCDs use by the NOR flash
> driver and the variable storage.
>
> Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
> ---
> ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtool.c | 265 ++++++++++++++++++++
> ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtoolLib.inf | 50 ++++
> 2 files changed, 315 insertions(+)
>
> diff --git a/ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtool.c b/ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtool.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..2e43c2e21bc9ef7dd1dd198eebbd70c3b0b96d1c
> --- /dev/null
> +++ b/ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtool.c
> @@ -0,0 +1,265 @@
> +/** @file
> + An instance of the NorFlashPlatformLib for Kvmtool platform.
> +
> + Copyright (c) 2020, ARM Ltd. All rights reserved.<BR>
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> + **/
> +
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/NorFlashPlatformLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Protocol/FdtClient.h>
> +
> +/** Macro defining the maximum number of Flash Banks.
> + */
> +#define MAX_FLASH_BANKS 4
> +
> +STATIC NOR_FLASH_DESCRIPTION mNorFlashDevices[MAX_FLASH_BANKS];
> +STATIC UINTN mNorFlashDeviceCount = 0;
> +
> +/** This function performs platform specific actions to initialise
> + the NOR flash, if required.
> +
> + @retval EFI_SUCCESS Success.
> +**/
> +EFI_STATUS
> +NorFlashPlatformInitialization (
> + VOID
> + )
> +{
> + DEBUG ((DEBUG_INFO, "NorFlashPlatformInitialization\n"));
> + // Nothing to do here
> + return EFI_SUCCESS;
> +}
> +
> +/** Initialise Non volatile Flash storage variables.
> +
> + @param [in] FlashDevice Pointer to the NOR Flash device.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_OUT_OF_RESOURCES Insufficient flash storage space.
> +**/
> +EFI_STATUS
> +SetupVariableStore (
> + IN NOR_FLASH_DESCRIPTION * FlashDevice
> + )
> +{
> + UINTN FlashRegion;
> + UINTN FlashNvStorageVariableBase;
> + UINTN FlashNvStorageFtwWorkingBase;
> + UINTN FlashNvStorageFtwSpareBase;
> + UINTN FlashNvStorageVariableSize;
> + UINTN FlashNvStorageFtwWorkingSize;
> + UINTN FlashNvStorageFtwSpareSize;
> +
> + FlashNvStorageVariableSize = PcdGet32 (PcdFlashNvStorageVariableSize);
> + FlashNvStorageFtwWorkingSize = PcdGet32 (PcdFlashNvStorageFtwWorkingSize);
> + FlashNvStorageFtwSpareSize = PcdGet32 (PcdFlashNvStorageFtwSpareSize);
> +
> + if ((FlashNvStorageVariableSize == 0) ||
> + (FlashNvStorageFtwWorkingSize == 0) ||
> + (FlashNvStorageFtwSpareSize == 0)) {
> + DEBUG ((DEBUG_ERROR, "FlashNvStorage size not defined\n"));
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + // Setup the variable store
> + FlashRegion = FlashDevice->DeviceBaseAddress;
> +
> + FlashNvStorageVariableBase = FlashRegion;
> + FlashRegion += PcdGet32 (PcdFlashNvStorageVariableSize);
> +
> + FlashNvStorageFtwWorkingBase = FlashRegion;
> + FlashRegion += PcdGet32 (PcdFlashNvStorageFtwWorkingSize);
> +
> + FlashNvStorageFtwSpareBase = FlashRegion;
> + FlashRegion += PcdGet32 (PcdFlashNvStorageFtwSpareSize);
> +
> + if (FlashRegion > (FlashDevice->DeviceBaseAddress + FlashDevice->Size)) {
> + DEBUG ((DEBUG_ERROR, "Insufficient flash storage size\n"));
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + PcdSet32S (
> + PcdFlashNvStorageVariableBase,
> + FlashNvStorageVariableBase
> + );
> +
> + PcdSet32S (
> + PcdFlashNvStorageFtwWorkingBase,
> + FlashNvStorageFtwWorkingBase
> + );
> +
> + PcdSet32S (
> + PcdFlashNvStorageFtwSpareBase,
> + FlashNvStorageFtwSpareBase
> + );
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "PcdFlashNvStorageVariableBase = 0x%x\n",
> + FlashNvStorageVariableBase
> + ));
> + DEBUG ((
> + DEBUG_INFO,
> + "PcdFlashNvStorageVariableSize = 0x%x\n",
> + FlashNvStorageVariableSize
> + ));
> + DEBUG ((
> + DEBUG_INFO,
> + "PcdFlashNvStorageFtwWorkingBase = 0x%x\n",
> + FlashNvStorageFtwWorkingBase
> + ));
> + DEBUG ((
> + DEBUG_INFO,
> + "PcdFlashNvStorageFtwWorkingSize = 0x%x\n",
> + FlashNvStorageFtwWorkingSize
> + ));
> + DEBUG ((
> + DEBUG_INFO,
> + "PcdFlashNvStorageFtwSpareBase = 0x%x\n",
> + FlashNvStorageFtwSpareBase
> + ));
> + DEBUG ((
> + DEBUG_INFO,
> + "PcdFlashNvStorageFtwSpareSize = 0x%x\n",
> + FlashNvStorageFtwSpareSize
> + ));
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** Return the Flash devices on the platform.
> +
> + @param [out] NorFlashDescriptions Pointer to the Flash device description.
> + @param [out] Count Number of Flash devices.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_NOT_FOUND Flash device not found.
> +**/
> +EFI_STATUS
> +NorFlashPlatformGetDevices (
> + OUT NOR_FLASH_DESCRIPTION **NorFlashDescriptions,
> + OUT UINT32 *Count
> + )
> +{
> + if (mNorFlashDeviceCount > 0) {
> + *NorFlashDescriptions = mNorFlashDevices;
> + *Count = mNorFlashDeviceCount;
> + return EFI_SUCCESS;
> + }
> + return EFI_NOT_FOUND;
> +}
> +
> +/** Entrypoint for NorFlashPlatformLib.
> +
> + @param [in] ImageHandle The handle to the image.
> + @param [in] SystemTable Pointer to the System Table.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND Flash device not found.
> +**/
> +EFI_STATUS
> +EFIAPI
> +NorFlashPlatformLibConstructor (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE * SystemTable
> + )
> +{
> + FDT_CLIENT_PROTOCOL *FdtClient;
> + INT32 Node;
> + EFI_STATUS Status;
> + EFI_STATUS FindNodeStatus;
> + CONST UINT32 *Reg;
> + UINT32 PropSize;
> + UINT64 Base;
> + UINT64 Size;
> +
> + if (mNorFlashDeviceCount != 0) {
> + return EFI_SUCCESS;
> + }
> +
> + Status = gBS->LocateProtocol (
> + &gFdtClientProtocolGuid,
> + NULL,
> + (VOID **)&FdtClient
> + );
> + if (EFI_ERROR (Status)) {
> + ASSERT_EFI_ERROR (Status);
> + return Status;
> + }
> +
An ASSERT is sufficient here - the DEPEX ensures that this is guaranteed
to succeed.
> + for (FindNodeStatus = FdtClient->FindCompatibleNode (
> + FdtClient,
> + "cfi-flash",
> + &Node
> + );
> + !EFI_ERROR (FindNodeStatus) && (mNorFlashDeviceCount < MAX_FLASH_BANKS);
> + FindNodeStatus = FdtClient->FindNextCompatibleNode (
> + FdtClient,
> + "cfi-flash",
> + Node,
> + &Node
> + )) {
> + Status = FdtClient->GetNodeProperty (
> + FdtClient,
> + Node,
> + "reg",
> + (CONST VOID **)&Reg,
> + &PropSize
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "%a: GetNodeProperty () failed (Status == %r)\n",
> + __FUNCTION__, Status));
> + continue;
> + }
> +
> + ASSERT ((PropSize % (4 * sizeof (UINT32))) == 0);
> +
> + while ((PropSize >= (4 * sizeof (UINT32))) &&
> + (mNorFlashDeviceCount < MAX_FLASH_BANKS)) {
> + Base = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[0]));
> + Size = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[2]));
> + Reg += 4;
> +
> + PropSize -= 4 * sizeof (UINT32);
> +
> + //
> + // Disregard any flash devices that overlap with the primary FV.
> + // The firmware is not updatable from inside the guest anyway.
> + //
> + if ((PcdGet64 (PcdFvBaseAddress) + PcdGet32 (PcdFvSize) > Base) &&
> + (Base + Size) > PcdGet64 (PcdFvBaseAddress)) {
> + continue;
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "NOR%d : Base = 0x%lx, Size = 0x%lx\n",
> + mNorFlashDeviceCount,
> + Base,
> + Size
> + ));
> +
> + mNorFlashDevices[mNorFlashDeviceCount].DeviceBaseAddress = (UINTN)Base;
> + mNorFlashDevices[mNorFlashDeviceCount].RegionBaseAddress = (UINTN)Base;
> + mNorFlashDevices[mNorFlashDeviceCount].Size = (UINTN)Size;
> + mNorFlashDevices[mNorFlashDeviceCount].BlockSize = SIZE_256KB;
> + mNorFlashDeviceCount++;
> + }
> + }
> +
> + // Setup the variable store in the last bank
> + if ((mNorFlashDeviceCount > 0) &&
> + (mNorFlashDevices[mNorFlashDeviceCount - 1].DeviceBaseAddress != 0)) {
> + return SetupVariableStore (&mNorFlashDevices[mNorFlashDeviceCount - 1]);
> + }
> +
> + return EFI_NOT_FOUND;
> +}
> +
> diff --git a/ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtoolLib.inf b/ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtoolLib.inf
> new file mode 100644
> index 0000000000000000000000000000000000000000..8bd6f730dcb52e597b418e59766c1566a9519789
> --- /dev/null
> +++ b/ArmVirtPkg/Library/NorFlashKvmtoolLib/NorFlashKvmtoolLib.inf
> @@ -0,0 +1,50 @@
> +#/** @file
> +#
> +# Copyright (c) 2020, ARM Ltd. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +#**/
> +
> +[Defines]
> + INF_VERSION = 0x0001001B
> + BASE_NAME = NorFlashKvmtoolLib
> + FILE_GUID = E75F07A1-B160-4893-BDD4-09E32FF847DC
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = NorFlashPlatformLib
> + CONSTRUCTOR = NorFlashPlatformLibConstructor
> +
> +[Sources.common]
> + NorFlashKvmtool.c
> +
> +[Packages]
> + ArmPkg/ArmPkg.dec
> + ArmPlatformPkg/ArmPlatformPkg.dec
> + ArmVirtPkg/ArmVirtPkg.dec
> + MdePkg/MdePkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + DebugLib
> + PcdLib
> + UefiBootServicesTableLib
> +
> +[Protocols]
> + gFdtClientProtocolGuid ## CONSUMES
> +
> +[Pcd]
> + gArmTokenSpaceGuid.PcdFvBaseAddress
> + gArmTokenSpaceGuid.PcdFvSize
> +
> + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
> + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
> + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase
> + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
> + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase
> + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
> +
> +
> +[Depex]
> + gFdtClientProtocolGuid
> +
>
next prev parent reply other threads:[~2020-05-14 9:32 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-14 8:40 [PATCH v2 00/11] Kvmtool guest firmware support for Arm Sami Mujawar
2020-05-14 8:40 ` [PATCH v2 01/11] PcAtChipsetPkg: Add MMIO Support to RTC driver Sami Mujawar
2020-05-14 9:24 ` Ard Biesheuvel
2020-05-15 10:50 ` André Przywara
2020-05-27 0:37 ` [edk2-devel] " Guomin Jiang
2020-05-14 8:40 ` [PATCH v1 02/11] MdePkg: Add NULL implementation for PCILib Sami Mujawar
2020-05-14 9:23 ` Ard Biesheuvel
2020-05-14 16:21 ` Michael D Kinney
2020-05-14 8:40 ` [PATCH v1 03/11] MdePkg: Base Memory Lib instance using MMIO Sami Mujawar
2020-05-14 9:22 ` Ard Biesheuvel
2020-05-14 17:21 ` Ard Biesheuvel
2020-05-14 16:33 ` [edk2-devel] " Michael D Kinney
2020-05-14 8:40 ` [PATCH v1 04/11] ArmPlatformPkg: Use MMIO to read device memory Sami Mujawar
2020-05-14 8:40 ` [PATCH v1 05/11] ArmPlatformPkg: Dynamic flash variable base Sami Mujawar
2020-05-14 9:24 ` Ard Biesheuvel
2020-05-27 11:48 ` [edk2-devel] " Philippe Mathieu-Daudé
2020-05-14 8:40 ` [PATCH v2 06/11] ArmVirtPkg: Add kvmtool platform driver Sami Mujawar
2020-05-14 9:29 ` Ard Biesheuvel
2020-05-14 12:12 ` [edk2-devel] " Laszlo Ersek
2020-05-14 12:17 ` Ard Biesheuvel
2020-05-14 16:05 ` Laszlo Ersek
2020-05-14 17:25 ` Ard Biesheuvel
2020-05-15 7:28 ` Laszlo Ersek
2020-05-14 12:20 ` Laszlo Ersek
2020-05-14 8:40 ` [PATCH v1 07/11] ArmVirtPkg: kvmtool platform memory map Sami Mujawar
2020-05-14 9:30 ` Ard Biesheuvel
2020-05-14 12:15 ` [edk2-devel] " Laszlo Ersek
2020-05-14 8:40 ` [PATCH v1 08/11] ArmVirtPkg: Add Kvmtool NOR flash lib Sami Mujawar
2020-05-14 9:32 ` Ard Biesheuvel [this message]
2020-05-14 12:17 ` [edk2-devel] " Laszlo Ersek
2020-05-27 11:59 ` Philippe Mathieu-Daudé
2020-06-04 6:30 ` Philippe Mathieu-Daudé
2020-06-04 15:00 ` Sami Mujawar
2020-05-14 8:40 ` [PATCH v2 09/11] ArmVirtPkg: Support for kvmtool emulated platform Sami Mujawar
2020-05-14 9:56 ` Ard Biesheuvel
2020-05-14 12:24 ` [edk2-devel] " Laszlo Ersek
2020-05-14 8:40 ` [PATCH v1 10/11] ArmVirtPkg: Link NorFlashDxe with BaseMemoryLibMmio Sami Mujawar
2020-05-14 12:28 ` [edk2-devel] " Laszlo Ersek
2020-05-14 8:40 ` [PATCH v1 11/11] Maintainer.txt: Add Kvmtool emulated plat maintainer Sami Mujawar
2020-05-14 12:31 ` [edk2-devel] " Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b31b96fc-b604-e635-a6e1-8564fb5fc79b@arm.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox