Hello Rebecca,

On Thu, 16 Dec 2021 at 04:46, Rebecca Cran <rebe...@nuviainc.com> wrote:
>
> Remove the ClusterId and CoreId fields in the ARM_CORE_INFO structure in
> favor of a new Mpidr field. Update code in
> ArmPlatformPkg/PrePeiCore/MainMPCore and ArmPlatformPkg/PrePi/MainMPCore.c
> to use the new field and call new macros GET_MPIDR_AFF0 and GET_MPIDR_AFF1
> instead.
>
> Signed-off-by: Rebecca Cran <rebe...@nuviainc.com>

I am going to merge this patch into EDK2 in isolation, along with the
edk2-platforms changes to keep things working.

For the remainder of the series, there are two issues that I think
should be resolved. Apologies for not mentioning this before.

1) Can we make the MP protocol a separate driver? That would be
cleaner in terms of breakage of other platforms re MpInitLib, and it
would also help with the next point.

2) I don't see any management of coherency between the BSP and the APs
(unless I am missing something). I think it would be best to treat APs
as non-coherent masters (given that they boot with the MMU disabled),
which means that every variable in memory that is used to pass
information between BSP and AP needs to be DMA mapped and unmapped
appropriately, and follow the ownership rules of DMA mappings.

On platforms where none of this is needed, the DmaLib dependency can
be satisfied by CoherentDmaLib, whereas other platforms can use the
non-coherent version instead, which does all the tedious cache
maintenance.

Given that library dependencies can be specified per-driver in .DSC
file, using a separate driver permits us to pick the right DmaLib
without forcing it upon other parts of the code. It should also
prevent circular dependency issues for DmaLib implementations that
DEPEX on the CPU arch protocol produced by CpuDxe.

Thanks,
Ard.

> ---
>  ArmPkg/Include/Guid/ArmMpCoreInfo.h                            | 3 +--
>  ArmPkg/Include/Library/ArmLib.h                                | 4 ++++
>  ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c | 8 ++++----
>  ArmPlatformPkg/PrePeiCore/MainMPCore.c                         | 4 +++-
>  ArmPlatformPkg/PrePi/MainMPCore.c                              | 4 +++-
>  5 files changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/ArmPkg/Include/Guid/ArmMpCoreInfo.h 
> b/ArmPkg/Include/Guid/ArmMpCoreInfo.h
> index 06f9326ca021..43f0848e78b8 100644
> --- a/ArmPkg/Include/Guid/ArmMpCoreInfo.h
> +++ b/ArmPkg/Include/Guid/ArmMpCoreInfo.h
> @@ -14,8 +14,7 @@
>  #define MPIDR_U_BIT_MASK            0x40000000
>
>  typedef struct {
> -  UINT32                  ClusterId;
> -  UINT32                  CoreId;
> +  UINT64                  Mpidr;
>
>    // MP Core Mailbox
>    EFI_PHYSICAL_ADDRESS    MailboxSetAddress;
> diff --git a/ArmPkg/Include/Library/ArmLib.h b/ArmPkg/Include/Library/ArmLib.h
> index e4d0476090c7..6566deebdde2 100644
> --- a/ArmPkg/Include/Library/ArmLib.h
> +++ b/ArmPkg/Include/Library/ArmLib.h
> @@ -111,6 +111,10 @@ typedef enum {
>  #define GET_CORE_ID(MpId)            ((MpId) & ARM_CORE_MASK)
>  #define GET_CLUSTER_ID(MpId)         (((MpId) & ARM_CLUSTER_MASK) >> 8)
>  #define GET_MPID(ClusterId, CoreId)  (((ClusterId) << 8) | (CoreId))
> +#define GET_MPIDR_AFF0(MpId)         ((MpId) & ARM_CORE_AFF0)
> +#define GET_MPIDR_AFF1(MpId)         (((MpId) & ARM_CORE_AFF1) >> 8)
> +#define GET_MPIDR_AFF2(MpId)         (((MpId) & ARM_CORE_AFF2) >> 16)
> +#define GET_MPIDR_AFF3(MpId)         (((MpId) & ARM_CORE_AFF3) >> 32)
>  #define PRIMARY_CORE_ID  (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
>
>  /** Reads the CCSIDR register for the specified cache.
> diff --git a/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c 
> b/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c
> index eeab58805e67..852275f44fc3 100644
> --- a/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c
> +++ b/ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibNull.c
> @@ -14,7 +14,7 @@
>  ARM_CORE_INFO  mArmPlatformNullMpCoreInfoTable[] = {
>    {
>      // Cluster 0, Core 0
> -    0x0, 0x0,
> +    0x0,
>
>      // MP Core MailBox Set/Get/Clear Addresses and Clear Value
>      (EFI_PHYSICAL_ADDRESS)0,
> @@ -24,7 +24,7 @@ ARM_CORE_INFO  mArmPlatformNullMpCoreInfoTable[] = {
>    },
>    {
>      // Cluster 0, Core 1
> -    0x0, 0x1,
> +    0x1,
>
>      // MP Core MailBox Set/Get/Clear Addresses and Clear Value
>      (EFI_PHYSICAL_ADDRESS)0,
> @@ -34,7 +34,7 @@ ARM_CORE_INFO  mArmPlatformNullMpCoreInfoTable[] = {
>    },
>    {
>      // Cluster 0, Core 2
> -    0x0, 0x2,
> +    0x2,
>
>      // MP Core MailBox Set/Get/Clear Addresses and Clear Value
>      (EFI_PHYSICAL_ADDRESS)0,
> @@ -44,7 +44,7 @@ ARM_CORE_INFO  mArmPlatformNullMpCoreInfoTable[] = {
>    },
>    {
>      // Cluster 0, Core 3
> -    0x0, 0x3,
> +    0x3,
>
>      // MP Core MailBox Set/Get/Clear Addresses and Clear Value
>      (EFI_PHYSICAL_ADDRESS)0,
> diff --git a/ArmPlatformPkg/PrePeiCore/MainMPCore.c 
> b/ArmPlatformPkg/PrePeiCore/MainMPCore.c
> index 0b8e5dfb3f30..b5d0d3a6442f 100644
> --- a/ArmPlatformPkg/PrePeiCore/MainMPCore.c
> +++ b/ArmPlatformPkg/PrePeiCore/MainMPCore.c
> @@ -68,7 +68,9 @@ SecondaryMain (
>
>    // Find the core in the ArmCoreTable
>    for (Index = 0; Index < ArmCoreCount; Index++) {
> -    if ((ArmCoreInfoTable[Index].ClusterId == ClusterId) && 
> (ArmCoreInfoTable[Index].CoreId == CoreId)) {
> +    if ((GET_MPIDR_AFF1 (ArmCoreInfoTable[Index].Mpidr) == ClusterId) &&
> +        (GET_MPIDR_AFF0 (ArmCoreInfoTable[Index].Mpidr) == CoreId))
> +    {
>        break;
>      }
>    }
> diff --git a/ArmPlatformPkg/PrePi/MainMPCore.c 
> b/ArmPlatformPkg/PrePi/MainMPCore.c
> index ce53cea6367c..68a7c13298d0 100644
> --- a/ArmPlatformPkg/PrePi/MainMPCore.c
> +++ b/ArmPlatformPkg/PrePi/MainMPCore.c
> @@ -67,7 +67,9 @@ SecondaryMain (
>
>    // Find the core in the ArmCoreTable
>    for (Index = 0; Index < ArmCoreCount; Index++) {
> -    if ((ArmCoreInfoTable[Index].ClusterId == ClusterId) && 
> (ArmCoreInfoTable[Index].CoreId == CoreId)) {
> +    if ((GET_MPIDR_AFF1 (ArmCoreInfoTable[Index].Mpidr) == ClusterId) &&
> +        (GET_MPIDR_AFF0 (ArmCoreInfoTable[Index].Mpidr) == CoreId))
> +    {
>        break;
>      }
>    }
> --
> 2.31.1
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#86226): https://edk2.groups.io/g/devel/message/86226
Mute This Topic: https://groups.io/mt/87760630/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to