public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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;
> > >     }
> > > 
> > 
> 

      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