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 09:20:29 +0800	[thread overview]
Message-ID: <ef01a229-abcf-4a25-ad56-898eff17487c@loongson.cn> (raw)
In-Reply-To: <CAMj1kXFz9=KSLy=AiiG3o6BgjP=FGHgqXYTHYfaO_1TCmYNd9A@mail.gmail.com>

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

Hi Ard,


Thanks,
Chao
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)".

>
>> +    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 (#118307): https://edk2.groups.io/g/devel/message/118307
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: 14340 bytes --]

  reply	other threads:[~2024-04-26  1:20 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 [this message]
     [not found]     ` <17C9AFCE49F3CEE8.6322@groups.io>
2024-04-26  4:22       ` Chao Li
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=ef01a229-abcf-4a25-ad56-898eff17487c@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