From: "Leif Lindholm" <leif@nuviainc.com>
To: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
Cc: Graeme Gregory <graeme@nuviainc.com>,
devel@edk2.groups.io, Ard Biesheuvel <ardb+tianocore@kernel.org>,
Radoslaw Biernacki <rad@semihalf.com>,
Tanmay Jagdale <tanmay.jagdale@linaro.org>,
Rebecca Cran <rebecca@nuviainc.com>
Subject: Re: [PATCH edk2-platforms 1/1] Silicon/Qemu: Move SbsaQemu MPIDR-retrieval function to FdtHelperLib
Date: Tue, 2 Mar 2021 15:36:21 +0000 [thread overview]
Message-ID: <20210302153621.GB1664@vanye> (raw)
In-Reply-To: <924c33ae-e7c1-0145-c38d-1e8c7181516f@linaro.org>
On Tue, Mar 02, 2021 at 16:01:56 +0100, Marcin Juszkiewicz wrote:
> W dniu 02.03.2021 o 15:14, Graeme Gregory pisze:
> > On 02/03/2021 13:38, Leif Lindholm wrote:
> > > Commit 822634fc1bf1 ("SbsaQemu: Update SbsaQemuAcpiDxe to use
> > > FdtHelperLib")
> > > replaced the CountCpusFromFdt() function in SbsaQemuAcpiDxe with a
> > > call to
> > > FdtHelperCountCpus() in FdtHelperLib. This ended up leaving static
> > > variables
> > > FdtFirstCpuOffset and FdtCpuNodeSize uninitialised, such that the
> > > GetMpidr()
> > > function kept returning the value for cpu 0.
> > >
> > > Resolve this by moving the GetMpidr() function over to FdtHelperLib,
> > > where
> > > it can again share these variables with FdtHelperCountCpus().
> > >
> > > Fix up coding style issues as part of copy:
> > > - Add m prefix to module-global variables.
> > > - Add doxygen function comment header.
> > >
> > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
> > > Cc: Graeme Gregory <graeme@nuviainc.com>
> > > Cc: Radoslaw Biernacki <rad@semihalf.com>
> > > Cc: Tanmay Jagdale <tanmay.jagdale@linaro.org>
> > > Cc: Rebecca Cran <rebecca@nuviainc.com>
> > > Reported-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
> > > Signed-off-by: Leif Lindholm <leif@nuviainc.com>
> >
> > Tested-By: Graeme Gregory <graeme@nuviainc.com>
>
> Tested-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
>
> sbsa-acs now finish in seconds like before.
Thanks all.
Pushed as a3ce6f8df2b6.
> >
> > > ---
> > > Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> > > | 2 --
> > > Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.inf
> > > | 5 +++
> > > Silicon/Qemu/SbsaQemu/Include/Library/FdtHelperLib.h
> > > | 12 +++++++
> > > Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> > > | 35 +------------------
> > > Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.c
> > > | 36 ++++++++++++++++++++
> > > 5 files changed, 54 insertions(+), 36 deletions(-)
> > >
> > > diff --git
> > > a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> > > b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> > > index a58ebfaf76d5..c6de685bd2c4 100644
> > > --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> > > +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf
> > > @@ -35,7 +35,6 @@ [LibraryClasses]
> > > DebugLib
> > > DxeServicesLib
> > > FdtHelperLib
> > > - FdtLib
> > > PcdLib
> > > PrintLib
> > > UefiDriverEntryPoint
> > > @@ -46,7 +45,6 @@ [Pcd]
> > > gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile
> > > gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdCoreCount
> > > gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdClusterCount
> > > - gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdDeviceTreeBaseAddress
> > > [Depex]
> > > gEfiAcpiTableProtocolGuid ## CONSUMES
> > > diff --git
> > > a/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.inf
> > > b/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.inf
> > > index d84c16f888d1..9c059f3e5851 100644
> > > --- a/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.inf
> > > +++ b/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.inf
> > > @@ -24,5 +24,10 @@ [Packages]
> > > MdePkg/MdePkg.dec
> > > Silicon/Qemu/SbsaQemu/SbsaQemu.dec
> > > +[LibraryClasses]
> > > + DebugLib
> > > + FdtLib
> > > + PcdLib
> > > +
> > > [FixedPcd]
> > > gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdDeviceTreeBaseAddress
> > > diff --git a/Silicon/Qemu/SbsaQemu/Include/Library/FdtHelperLib.h
> > > b/Silicon/Qemu/SbsaQemu/Include/Library/FdtHelperLib.h
> > > index f9045fd5df45..ea9159857215 100644
> > > --- a/Silicon/Qemu/SbsaQemu/Include/Library/FdtHelperLib.h
> > > +++ b/Silicon/Qemu/SbsaQemu/Include/Library/FdtHelperLib.h
> > > @@ -10,6 +10,18 @@
> > > #ifndef FDT_HELPER_LIB_
> > > #define FDT_HELPER_LIB_
> > > +/**
> > > + Get MPIDR for a given cpu from device tree passed by Qemu.
> > > +
> > > + @param [in] CpuId Index of cpu to retrieve MPIDR value for.
> > > +
> > > + @retval MPIDR value of CPU at index <CpuId>
> > > +**/
> > > +UINT64
> > > +FdtHelperGetMpidr (
> > > + IN UINTN CpuId
> > > + );
> > > +
> > > /** Walks through the Device Tree created by Qemu and counts the number
> > > of CPUs present in it.
> > > diff --git
> > > a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> > > b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> > > index 84120f1c1b51..b8901030ecd0 100644
> > > --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> > > +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c
> > > @@ -20,39 +20,6 @@
> > > #include <Library/UefiDriverEntryPoint.h>
> > > #include <Library/UefiLib.h>
> > > #include <Protocol/AcpiTable.h>
> > > -#include <Protocol/FdtClient.h>
> > > -#include <libfdt.h>
> > > -
> > > -STATIC INT32 FdtFirstCpuOffset;
> > > -STATIC INT32 FdtCpuNodeSize;
> > > -
> > > -/*
> > > - * Get MPIDR from device tree passed by Qemu
> > > - */
> > > -STATIC
> > > -UINT64
> > > -GetMpidr (
> > > - IN UINTN CpuId
> > > - )
> > > -{
> > > - VOID *DeviceTreeBase;
> > > - CONST UINT64 *RegVal;
> > > - INT32 Len;
> > > -
> > > - DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeBaseAddress);
> > > - ASSERT (DeviceTreeBase != NULL);
> > > -
> > > - RegVal = fdt_getprop (DeviceTreeBase,
> > > - FdtFirstCpuOffset + (CpuId * FdtCpuNodeSize),
> > > - "reg",
> > > - &Len);
> > > - if (!RegVal) {
> > > - DEBUG ((DEBUG_ERROR, "Couldn't find reg property for CPU:%d\n",
> > > CpuId));
> > > - return 0;
> > > - }
> > > -
> > > - return (fdt64_to_cpu (ReadUnaligned64 (RegVal)));
> > > -}
> > > /*
> > > * A Function to Compute the ACPI Table Checksum
> > > @@ -159,7 +126,7 @@ AddMadtTable (
> > > CopyMem (New, &Gicc, sizeof (EFI_ACPI_6_0_GIC_STRUCTURE));
> > > GiccPtr = (EFI_ACPI_6_0_GIC_STRUCTURE *) New;
> > > GiccPtr->AcpiProcessorUid = CoreIndex;
> > > - GiccPtr->MPIDR = GetMpidr (CoreIndex);
> > > + GiccPtr->MPIDR = FdtHelperGetMpidr (CoreIndex);
> > > New += sizeof (EFI_ACPI_6_0_GIC_STRUCTURE);
> > > }
> > > diff --git
> > > a/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.c
> > > b/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.c
> > > index bbd756f01a21..7fdfb055db76 100644
> > > --- a/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.c
> > > +++ b/Silicon/Qemu/SbsaQemu/Library/FdtHelperLib/FdtHelperLib.c
> > > @@ -14,6 +14,40 @@
> > > #include <Library/PcdLib.h>
> > > #include <libfdt.h>
> > > +STATIC INT32 mFdtFirstCpuOffset;
> > > +STATIC INT32 mFdtCpuNodeSize;
> > > +
> > > +/**
> > > + Get MPIDR for a given cpu from device tree passed by Qemu.
> > > +
> > > + @param [in] CpuId Index of cpu to retrieve MPIDR value for.
> > > +
> > > + @retval MPIDR value of CPU at index <CpuId>
> > > +**/
> > > +UINT64
> > > +FdtHelperGetMpidr (
> > > + IN UINTN CpuId
> > > + )
> > > +{
> > > + VOID *DeviceTreeBase;
> > > + CONST UINT64 *RegVal;
> > > + INT32 Len;
> > > +
> > > + DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeBaseAddress);
> > > + ASSERT (DeviceTreeBase != NULL);
> > > +
> > > + RegVal = fdt_getprop (DeviceTreeBase,
> > > + mFdtFirstCpuOffset + (CpuId * mFdtCpuNodeSize),
> > > + "reg",
> > > + &Len);
> > > + if (!RegVal) {
> > > + DEBUG ((DEBUG_ERROR, "Couldn't find reg property for CPU:%d\n",
> > > CpuId));
> > > + return 0;
> > > + }
> > > +
> > > + return (fdt64_to_cpu (ReadUnaligned64 (RegVal)));
> > > +}
> > > +
> > > /** Walks through the Device Tree created by Qemu and counts the number
> > > of CPUs present in it.
> > > @@ -49,12 +83,14 @@ FdtHelperCountCpus (
> > > // The count of these subnodes corresponds to the number of
> > > // CPUs created by Qemu.
> > > Prev = fdt_first_subnode (DeviceTreeBase, CpuNode);
> > > + mFdtFirstCpuOffset = Prev;
> > > while (1) {
> > > CpuCount++;
> > > Node = fdt_next_subnode (DeviceTreeBase, Prev);
> > > if (Node < 0) {
> > > break;
> > > }
> > > + mFdtCpuNodeSize = Node - Prev;
> > > Prev = Node;
> > > }
> > >
> >
>
prev parent reply other threads:[~2021-03-02 15:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-02 13:38 [PATCH edk2-platforms 1/1] Silicon/Qemu: Move SbsaQemu MPIDR-retrieval function to FdtHelperLib Leif Lindholm
2021-03-02 14:05 ` Ard Biesheuvel
2021-03-02 14:14 ` Graeme Gregory
2021-03-02 15:01 ` Marcin Juszkiewicz
2021-03-02 15:36 ` Leif Lindholm [this message]
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=20210302153621.GB1664@vanye \
--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