public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chao Li" <lichao@loongson.cn>
To: devel@edk2.groups.io, ardb@kernel.org
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Jiewen Yao <jiewen.yao@intel.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Leif Lindholm <quic_llindhol@quicinc.com>,
	Sami Mujawar <sami.mujawar@arm.com>,
	Sunil V L <sunilvl@ventanamicro.com>,
	Andrei Warkentin <andrei.warkentin@intel.com>
Subject: Re: [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio
Date: Fri, 26 Apr 2024 12:22:27 +0800	[thread overview]
Message-ID: <24e5713d-44f6-466e-ace4-e031ffb5ba18@loongson.cn> (raw)
In-Reply-To: <17C9AFCE49F3CEE8.6322@groups.io>

[-- Attachment #1: Type: text/plain, Size: 12922 bytes --]

Hi Ard,


Thanks,
Chao
On 2024/4/26 09:20, Chao Li wrote:
>
> Hi Ard,
>
> On 2024/4/25 21:02, Ard Biesheuvel wrote:
>> On Thu, 25 Apr 2024 at 14:13, Chao Li<lichao@loongson.cn>  wrote:
>>> Added the HOB methods to load and store the QEMU firmware configure
>>> address, data address and DMA address, which are not enabled during the
>>> DXE stage.
>>>
>>> Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc").
>>>
>>> BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=4755
>>>
>>> Cc: Ard Biesheuvel<ardb+tianocore@kernel.org>
>>> Cc: Jiewen Yao<jiewen.yao@intel.com>
>>> Cc: Gerd Hoffmann<kraxel@redhat.com>
>>> Cc: Leif Lindholm<quic_llindhol@quicinc.com>
>>> Cc: Sami Mujawar<sami.mujawar@arm.com>
>>> Cc: Sunil V L<sunilvl@ventanamicro.com>
>>> Cc: Andrei Warkentin<andrei.warkentin@intel.com>
>>> Signed-off-by: Chao Li<lichao@loongson.cn>
>>> ---
>>>   .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c   | 81 +++++++++++++++--
>>>   .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf |  1 +
>>>   .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h   | 74 +++++++++++++++
>>>   .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c   | 91 ++++++++++++++++---
>>>   4 files changed, 226 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c
>>> index dc949c8e26..b5dbc5e4b5 100644
>>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c
>>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c
>>> @@ -8,11 +8,16 @@
>>>     SPDX-License-Identifier: BSD-2-Clause-Patent
>>>   **/
>>>
>>> +#include <Base.h>
>>>   #include <Uefi.h>
>>>
>>> +#include <Pi/PiBootMode.h>
>>> +#include <Pi/PiHob.h>
>>> +
>>>   #include <Library/BaseLib.h>
>>>   #include <Library/BaseMemoryLib.h>
>>>   #include <Library/DebugLib.h>
>>> +#include <Library/HobLib.h>
>>>   #include <Library/IoLib.h>
>>>   #include <Library/QemuFwCfgLib.h>
>>>   #include <Library/UefiBootServicesTableLib.h>
>>> @@ -21,6 +26,62 @@
>>>
>>>   #include "QemuFwCfgLibMmioInternal.h"
>>>
>>> +EFI_GUID  mFwCfgResourceGuid = FW_CONFIG_RESOURCE_HOB_GUID;
>>> +
>>> +/**
>>> +  Build firmware configure resource address HOB.
>>> +
>>> +  @param[in]   FwCfgResource  A pointer to firmware configure resource.
>>> +
>>> +  @retval  NULL
>>> +**/
>>> +VOID
>>> +QemuBuildFwCfgResourceHob (
>>> +  IN QEMU_FW_CFG_RESOURCE  *FwCfgResource
>>> +  )
>>> +{
>>> +  UINT64  Data64;
>>> +
>>> +  Data64 = (UINT64)(UINTN)FwCfgResource;
>>> +
>>> +  BuildGuidDataHob (
>>> +    &mFwCfgResourceGuid,
>>> +    (VOID *)&Data64,
>> This looks wrong: why are you taking the address of the stack variable
>> rather than the address of the resource descriptor?
>
> It only saves the pointer of FwCfgResource, and the memory space has 
> been created in the PEI constructor.  Do you mean saving all contents 
> of FwCfgResource in the HOB?
>
> The following line is indeed wrong. if only save the pointer, the size 
> should be "sizeof (UINT64)".
>
I will save the real HOB data in the next version.
>
>>> +    sizeof (QEMU_FW_CFG_RESOURCE)
>>> +    );
>>> +}
>>> +
>>> +/**
>>> +  Get firmware configure resource in HOB.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  FwCfgResource    The firmware configure resouce in HOB.
>> resource
> All right.
>>> +           NULL             The firmware configure resouce not found.
>>> +**/
>>> +QEMU_FW_CFG_RESOURCE *
>>> +QemuGetFwCfgResourceHob (
>>> +  VOID
>>> +  )
>>> +{
>>> +  EFI_HOB_GUID_TYPE     *GuidHob;
>>> +  VOID                  *DataInHob;
>>> +  QEMU_FW_CFG_RESOURCE  *FwCfgResource;
>>> +
>>> +  GuidHob   = NULL;
>>> +  DataInHob = NULL;
>>> +
>>> +  GuidHob = GetFirstGuidHob (&mFwCfgResourceGuid);
>> Please define this GUID in the package .DEC file and add it to the
>> [Guids] section in the .INF so that you can refer to its name
>> directly.
> OK.
>>> +  if (GuidHob == NULL) {
>>> +    return NULL;
>>> +  }
>>> +
>>> +  DataInHob     = GET_GUID_HOB_DATA (GuidHob);
>>> +  FwCfgResource = (QEMU_FW_CFG_RESOURCE *)(*(UINTN *)DataInHob);
>>> +
>>> +  return FwCfgResource;
>>> +}
>>> +
>>>   /**
>>>     Returns a boolean indicating if the firmware configuration interface
>>>     is available or not.
>>> @@ -37,7 +98,7 @@ QemuFwCfgIsAvailable (
>>>     VOID
>>>     )
>>>   {
>>> -  return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0);
>>> +  return (BOOLEAN)(QemuGetFwCfgSelectorAddress () != 0 && QemuGetFwCfgDataAddress () != 0);
>>>   }
>>>
>>>   /**
>>> @@ -56,7 +117,7 @@ QemuFwCfgSelectItem (
>>>     )
>>>   {
>>>     if (QemuFwCfgIsAvailable ()) {
>>> -    MmioWrite16 (mFwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItem));
>>> +    MmioWrite16 (QemuGetFwCfgSelectorAddress (), SwapBytes16 ((UINT16)QemuFwCfgItem));
>>>     }
>>>   }
>>>
>>> @@ -86,30 +147,30 @@ MmioReadBytes (
>>>
>>>    #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64)
>>>     while (Ptr < End) {
>>> -    *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress);
>>> +    *(UINT64 *)Ptr = MmioRead64 (QemuGetFwCfgDataAddress ());
>>>       Ptr           += 8;
>>>     }
>>>
>>>     if (Left & 4) {
>>> -    *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress);
>>> +    *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ());
>>>       Ptr           += 4;
>>>     }
>>>
>>>    #else
>>>     while (Ptr < End) {
>>> -    *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress);
>>> +    *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ());
>>>       Ptr           += 4;
>>>     }
>>>
>>>    #endif
>>>
>>>     if (Left & 2) {
>>> -    *(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress);
>>> +    *(UINT16 *)Ptr = MmioRead16 (QemuGetFwCfgDataAddress ());
>>>       Ptr           += 2;
>>>     }
>>>
>>>     if (Left & 1) {
>>> -    *Ptr = MmioRead8 (mFwCfgDataAddress);
>>> +    *Ptr = MmioRead8 (QemuGetFwCfgDataAddress ());
>>>     }
>>>   }
>>>
>>> @@ -162,9 +223,9 @@ DmaTransferBytes (
>>>     // This will fire off the transfer.
>>>     //
>>>    #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64)
>>> -  MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access));
>>> +  MmioWrite64 (QemuGetFwCfgDmaAddress (), SwapBytes64 ((UINT64)&Access));
>>>    #else
>>> -  MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access));
>>> +  MmioWrite32 ((UINT32)(QemuGetFwCfgDmaAddress () + 4), SwapBytes32 ((UINT32)&Access));
>>>    #endif
>>>
>>>     //
>>> @@ -233,7 +294,7 @@ MmioWriteBytes (
>>>     UINTN  Idx;
>>>
>>>     for (Idx = 0; Idx < Size; ++Idx) {
>>> -    MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]);
>>> +    MmioWrite8 (QemuGetFwCfgDataAddress (), ((UINT8 *)Buffer)[Idx]);
>>>     }
>>>   }
>>>
>>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf
>>> index f2596f270e..8e191f2d22 100644
>>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf
>>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf
>>> @@ -40,6 +40,7 @@ [LibraryClasses]
>>>     BaseLib
>>>     BaseMemoryLib
>>>     DebugLib
>>> +  HobLib
>>>     IoLib
>>>     UefiBootServicesTableLib
>>>
>>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h
>>> index d7d645f700..6101e15b21 100644
>>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h
>>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h
>>> @@ -16,6 +16,17 @@ extern UINTN  mFwCfgSelectorAddress;
>>>   extern UINTN  mFwCfgDataAddress;
>>>   extern UINTN  mFwCfgDmaAddress;
>>>
>>> +#define FW_CONFIG_RESOURCE_HOB_GUID \
>>> +  { \
>>> +    0x3cc47b04, 0x0d3e, 0xaa64, { 0x06, 0xa6, 0x4b, 0xdc, 0x9a, 0x2c, 0x61, 0x19 } \
>>> +  }
>>> +
>>> +typedef struct {
>>> +  UINTN  FwCfgSelectorAddress;
>>> +  UINTN  FwCfgDataAddress;
>>> +  UINTN  FwCfgDmaAddress;
>>> +} QEMU_FW_CFG_RESOURCE;
>>> +
>>>   /**
>>>     Reads firmware configuration bytes into a buffer
>>>
>>> @@ -96,6 +107,69 @@ EFIAPI
>>>     IN UINTN  Size
>>>     );
>>>
>>> +/**
>>> +  Build firmware configure resource HOB.
>>> +
>>> +  @param[in]   FwCfgResource  A pointer to firmware configure resource.
>>> +
>>> +  @retval  NULL
>>> +**/
>>> +VOID
>>> +QemuBuildFwCfgResourceHob (
>>> +  IN QEMU_FW_CFG_RESOURCE  *FwCfgResource
>>> +  );
>>> +
>>> +/**
>>> +  Get firmware configure resource HOB.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  FwCfgResource    The firmware configure resouce in HOB.
>>> +**/
>>> +QEMU_FW_CFG_RESOURCE *
>>> +QemuGetFwCfgResourceHob (
>>> +  VOID
>>> +  );
>>> +
>>> +/**
>>> +  To get firmware configure selector address.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  firmware configure selector address
>>> +**/
>>> +UINTN
>>> +EFIAPI
>>> +QemuGetFwCfgSelectorAddress (
>>> +  VOID
>>> +  );
>>> +
>>> +/**
>>> +  To get firmware configure Data address.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  firmware configure data address
>>> +**/
>>> +UINTN
>>> +EFIAPI
>>> +QemuGetFwCfgDataAddress (
>>> +  VOID
>>> +  );
>>> +
>>> +/**
>>> +  To get firmware DMA address.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  firmware DMA address
>>> +**/
>>> +UINTN
>>> +EFIAPI
>>> +QemuGetFwCfgDmaAddress (
>>> +  VOID
>>> +  );
>>> +
>>>   /**
>>>     Slow READ_BYTES_FUNCTION.
>>>   **/
>>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c
>>> index 4844a42a36..2d5055a76e 100644
>>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c
>>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c
>>> @@ -32,23 +32,92 @@ READ_BYTES_FUNCTION   *InternalQemuFwCfgReadBytes  = MmioReadBytes;
>>>   WRITE_BYTES_FUNCTION  *InternalQemuFwCfgWriteBytes = MmioWriteBytes;
>>>   SKIP_BYTES_FUNCTION   *InternalQemuFwCfgSkipBytes  = MmioSkipBytes;
>>>
>>> +/**
>>> +  To get firmware configure selector address.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  firmware configure selector address
>>> +**/
>>> +UINTN
>>> +EFIAPI
>>> +QemuGetFwCfgSelectorAddress (
>>> +  VOID
>>> +  )
>>> +{
>>> +  return mFwCfgSelectorAddress;
>>> +}
>>> +
>>> +/**
>>> +  To get firmware configure Data address.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  firmware configure data address
>>> +**/
>>> +UINTN
>>> +EFIAPI
>>> +QemuGetFwCfgDataAddress (
>>> +  VOID
>>> +  )
>>> +{
>>> +  return mFwCfgDataAddress;
>>> +}
>>> +
>>> +/**
>>> +  To get firmware DMA address.
>>> +
>>> +  @param VOID
>>> +
>>> +  @retval  firmware DMA address
>>> +**/
>>> +UINTN
>>> +EFIAPI
>>> +QemuGetFwCfgDmaAddress (
>>> +  VOID
>>> +  )
>>> +{
>>> +  return mFwCfgDmaAddress;
>>> +}
>>> +
>>> +
>>>   RETURN_STATUS
>>>   EFIAPI
>>>   QemuFwCfgInitialize (
>>>     VOID
>>>     )
>>>   {
>>> -  EFI_STATUS           Status;
>>> -  FDT_CLIENT_PROTOCOL  *FdtClient;
>>> -  CONST UINT64         *Reg;
>>> -  UINT32               RegSize;
>>> -  UINTN                AddressCells, SizeCells;
>>> -  UINT64               FwCfgSelectorAddress;
>>> -  UINT64               FwCfgSelectorSize;
>>> -  UINT64               FwCfgDataAddress;
>>> -  UINT64               FwCfgDataSize;
>>> -  UINT64               FwCfgDmaAddress;
>>> -  UINT64               FwCfgDmaSize;
>>> +  EFI_STATUS            Status;
>>> +  FDT_CLIENT_PROTOCOL   *FdtClient;
>>> +  CONST UINT64          *Reg;
>>> +  UINT32                RegSize;
>>> +  UINTN                 AddressCells, SizeCells;
>>> +  UINT64                FwCfgSelectorAddress;
>>> +  UINT64                FwCfgSelectorSize;
>>> +  UINT64                FwCfgDataAddress;
>>> +  UINT64                FwCfgDataSize;
>>> +  UINT64                FwCfgDmaAddress;
>>> +  UINT64                FwCfgDmaSize;
>>> +  QEMU_FW_CFG_RESOURCE  *FwCfgResource;
>>> +
>>> +  //
>>> +  // Check whether the Qemu firmware configure resources HOB has been created,
>>> +  // if so use the resources in the HOB.
>>> +  //
>>> +  FwCfgResource = QemuGetFwCfgResourceHob ();
>>> +  if (FwCfgResource != NULL) {
>>> +    mFwCfgSelectorAddress = FwCfgResource->FwCfgSelectorAddress;
>>> +    mFwCfgDataAddress     = FwCfgResource->FwCfgDataAddress;
>>> +    mFwCfgDmaAddress      = FwCfgResource->FwCfgDmaAddress;
>>> +
>>> +    if (mFwCfgDmaAddress != 0) {
>>> +      InternalQemuFwCfgReadBytes  = DmaReadBytes;
>>> +      InternalQemuFwCfgWriteBytes = DmaWriteBytes;
>>> +      InternalQemuFwCfgSkipBytes  = DmaSkipBytes;
>>> +    }
>>> +
>>> +    return RETURN_SUCCESS;
>>> +  }
>>>
>>>     Status = gBS->LocateProtocol (
>>>                     &gFdtClientProtocolGuid,
>>> --
>>> 2.27.0
>>>
>>>
>>>
>>>
>>>
>>>
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#118309): https://edk2.groups.io/g/devel/message/118309
Mute This Topic: https://groups.io/mt/105728768/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



[-- Attachment #2: Type: text/html, Size: 15032 bytes --]

  parent reply	other threads:[~2024-04-26  4:22 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li
2024-04-25 12:12 ` [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files Chao Li
2024-04-25 12:58   ` Ard Biesheuvel
2024-04-26  1:12     ` Chao Li
2024-04-25 12:13 ` [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio Chao Li
2024-04-25 13:02   ` Ard Biesheuvel
2024-04-26  1:20     ` Chao Li
     [not found]     ` <17C9AFCE49F3CEE8.6322@groups.io>
2024-04-26  4:22       ` Chao Li [this message]
2024-04-25 12:13 ` [edk2-devel] [PATCH v3 3/7] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Chao Li
2024-04-25 12:13 ` [edk2-devel] [PATCH v3 4/7] OvmfPkg: Copy the same new INF as QemuFwCfgLibMmio.inf Chao Li
2024-04-25 12:13 ` [edk2-devel] [PATCH v3 5/7] ArmVirtPkg: Enable QemuFwCfgMmioDxeLib.inf Chao Li
2024-04-25 12:13 ` [edk2-devel] [PATCH v3 6/7] OvmfPkg/RiscVVirt: " Chao Li
2024-04-25 12:13 ` [edk2-devel] [PATCH v3 7/7] OvmfPkg: Remove QemuFwCfgLibMmio.inf Chao Li

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=24e5713d-44f6-466e-ace4-e031ffb5ba18@loongson.cn \
    --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