public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Graeme Gregory" <graeme@nuviainc.com>
To: Leif Lindholm <leif@nuviainc.com>, devel@edk2.groups.io
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Radoslaw Biernacki <rad@semihalf.com>,
	Tanmay Jagdale <tanmay.jagdale@linaro.org>,
	Rebecca Cran <rebecca@nuviainc.com>,
	Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
Subject: Re: [PATCH edk2-platforms 1/1] Silicon/Qemu: Move SbsaQemu MPIDR-retrieval function to FdtHelperLib
Date: Tue, 2 Mar 2021 14:14:10 +0000	[thread overview]
Message-ID: <6ba5503b-9686-3218-f79c-b6c8e1e86fde@nuviainc.com> (raw)
In-Reply-To: <20210302133828.19321-1-leif@nuviainc.com>

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>

This fixes the issue from inspection of APIC table with acpiview!

> ---
>   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;
>     }
>   
> 


  parent reply	other threads:[~2021-03-02 14:14 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 [this message]
2021-03-02 15:01   ` Marcin Juszkiewicz
2021-03-02 15:36     ` Leif Lindholm

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=6ba5503b-9686-3218-f79c-b6c8e1e86fde@nuviainc.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