Thanks for the feedback Chasel and Sai! I have incorporated all your 
suggestions.

> -----Original Message-----
> From: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>
> Sent: Thursday, May 9, 2024 6:15 PM
> To: Desimone, Nathaniel L <nathaniel.l.desim...@intel.com>;
> devel@edk2.groups.io
> Cc: Chiu, Chasel <chasel.c...@intel.com>; Liming Gao
> <gaolim...@byosoft.com.cn>; Dong, Eric <eric.d...@intel.com>; Chuang,
> Rosen <rosen.chu...@intel.com>; Kasbekar, Saloni
> <saloni.kasbe...@intel.com>
> Subject: RE: [edk2-platforms] [PATCH v1 1/2] MinPlatform: Add
> MpInfo2HobPei
> 
> Hi Nate,
> Looks good.
> In addition to optimization suggested by Chasel to save unnecessary call to
> locate PPI, you might also want to consider checking for checking "no error"
> status for locate PPI and perhaps avoid a "goto" label.
> With that, Reviewed-by: Sai Chaganty <rangasai.v.chaga...@intel.com> for
> the whole patch series.
> 
> Thanks,
> Sai
> 
> 
> -----Original Message-----
> From: Desimone, Nathaniel L <nathaniel.l.desim...@intel.com>
> Sent: Wednesday, May 8, 2024 5:09 PM
> To: devel@edk2.groups.io
> Cc: Chiu, Chasel <chasel.c...@intel.com>; Liming Gao
> <gaolim...@byosoft.com.cn>; Dong, Eric <eric.d...@intel.com>; Chaganty,
> Rangasai V <rangasai.v.chaga...@intel.com>; Chuang, Rosen
> <rosen.chu...@intel.com>; Kasbekar, Saloni <saloni.kasbe...@intel.com>
> Subject: [edk2-platforms] [PATCH v1 1/2] MinPlatform: Add MpInfo2HobPei
> 
> MpInfo2HobPei provides backwards compatibility between FSP binaries built
> with older versions of EDK II and the latest EDK II.
> 
> Newer versions of CpuMpPei produce the gMpInformation2HobGuid. This
> HOB is required by newer implementations of the CPU DXE driver, however
> older versions of CpuMpPei do not produce it. This PEIM will check if
> CpuMpPei creates gMpInformation2HobGuid and if it does not it creates it.
> 
> Cc: Chasel Chiu <chasel.c...@intel.com>
> Cc: Liming Gao <gaolim...@byosoft.com.cn>
> Cc: Eric Dong <eric.d...@intel.com>
> Cc: Sai Chaganty <rangasai.v.chaga...@intel.com>
> Cc: Rosen Chuang <rosen.chu...@intel.com>
> Cc: Saloni Kasbekar <saloni.kasbe...@intel.com>
> Signed-off-by: Nate DeSimone <nathaniel.l.desim...@intel.com>
> ---
>  .../FspWrapper/MpInfo2HobPei/MpInfo2HobPei.c  | 236
> ++++++++++++++++++
>  .../MpInfo2HobPei/MpInfo2HobPei.inf           |  47 ++++
>  .../Intel/MinPlatformPkg/MinPlatformPkg.dsc   |   3 +-
>  3 files changed, 285 insertions(+), 1 deletion(-)  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2HobPe
> i.c
>  create mode 100644
> Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2HobPe
> i.inf
> 
> diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2Hob
> Pei.c
> b/Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2Hob
> Pei.c
> new file mode 100644
> index 0000000000..4cbc4cf7e6
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2Hob
> P
> +++ ei.c
> @@ -0,0 +1,236 @@
> +/** @file
> +  Multi-processor Info 2 HOB PEIM.
> +
> +  The purpose of this PEIM is to provide backwards compatibility
> + between FSP  binaries built with older versions of EDK II and the latest 
> EDK II.
> +
> +  Newer versions of CpuMpPei produce the gMpInformation2HobGuid. This
> + HOB is  required by newer implementations of the CPU DXE driver,
> + however older  versions of CpuMpPei do not produce it. This PEIM will
> + check if CpuMpPei  creates gMpInformation2HobGuid and if it does not it
> creates it.
> +
> +Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
> +
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Base.h>
> +#include <Uefi.h>
> +#include <Library/BaseLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h> #include
> +<Library/PeiServicesLib.h>
> +
> +#include <Ppi/MpServices2.h>
> +#include <Guid/MpInformation2.h>
> +#include <Register/Cpuid.h>
> +
> +typedef struct {
> +  EDKII_PEI_MP_SERVICES2_PPI    *CpuMpPpi2;
> +  UINT8                         *CoreTypes;
> +} GET_PROCESSOR_CORE_TYPE_BUFFER;
> +
> +/**
> +  Get CPU core type.
> +
> +  @param[in, out] Buffer  Argument of the procedure.
> +**/
> +VOID
> +EFIAPI
> +GetProcessorCoreType (
> +  IN OUT VOID  *Buffer
> +  )
> +{
> +  EFI_STATUS                               Status;
> +  UINT8                                    *CoreTypes;
> +  CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX
> NativeModelIdAndCoreTypeEax;
> +  UINTN                                    ProcessorIndex;
> +  GET_PROCESSOR_CORE_TYPE_BUFFER           *Params;
> +
> +  Params = (GET_PROCESSOR_CORE_TYPE_BUFFER *)Buffer;  Status =
> + Params->CpuMpPpi2->WhoAmI (Params->CpuMpPpi2, &ProcessorIndex);
> + ASSERT_EFI_ERROR (Status);
> +
> +  CoreTypes = Params->CoreTypes;
> +  AsmCpuidEx (CPUID_HYBRID_INFORMATION,
> +CPUID_HYBRID_INFORMATION_MAIN_LEAF,
> +&NativeModelIdAndCoreTypeEax.Uint32, NULL, NULL, NULL);
> +  CoreTypes[ProcessorIndex] =
> +(UINT8)NativeModelIdAndCoreTypeEax.Bits.CoreType;
> +}
> +
> +/**
> +  Create gMpInformation2HobGuid.
> +**/
> +VOID
> +BuildMpInformationHob (
> +  IN  EDKII_PEI_MP_SERVICES2_PPI  *CpuMpPpi2
> +  )
> +{
> +  GET_PROCESSOR_CORE_TYPE_BUFFER  Buffer;
> +  EFI_STATUS                      Status;
> +  UINTN                           ProcessorIndex;
> +  UINTN                           NumberOfProcessors;
> +  UINTN                           NumberOfEnabledProcessors;
> +  UINTN                           NumberOfProcessorsInHob;
> +  UINTN                           MaxProcessorsPerHob;
> +  MP_INFORMATION2_HOB_DATA        *MpInformation2HobData;
> +  MP_INFORMATION2_ENTRY           *MpInformation2Entry;
> +  UINTN                           Index;
> +  UINT8                           *CoreTypes;
> +  UINT32                          CpuidMaxInput;
> +  UINTN                           CoreTypePages;
> +
> +  ProcessorIndex        = 0;
> +  MpInformation2HobData = NULL;
> +  MpInformation2Entry   = NULL;
> +  CoreTypes             = NULL;
> +  CoreTypePages         = 0;
> +
> +  Status = CpuMpPpi2->GetNumberOfProcessors (
> +                        CpuMpPpi2,
> +                        &NumberOfProcessors,
> +                        &NumberOfEnabledProcessors
> +                        );
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +    goto Done;
> +  }
> +
> +  //
> +  // Get Processors CoreType
> +  //
> +  AsmCpuid (CPUID_SIGNATURE, &CpuidMaxInput, NULL, NULL, NULL);  if
> + (CpuidMaxInput >= CPUID_HYBRID_INFORMATION) {
> +    CoreTypePages = EFI_SIZE_TO_PAGES (sizeof (UINT8) *
> NumberOfProcessors);
> +    CoreTypes     = AllocatePages (CoreTypePages);
> +    ASSERT (CoreTypes != NULL);
> +    if (CoreTypes == NULL) {
> +      goto Done;
> +    }
> +
> +    Buffer.CoreTypes = CoreTypes;
> +    Buffer.CpuMpPpi2 = CpuMpPpi2;
> +    Status           = CpuMpPpi2->StartupAllCPUs (
> +                                    CpuMpPpi2,
> +                                    GetProcessorCoreType,
> +                                    0,
> +                                    (VOID *)&Buffer
> +                                    );
> +    ASSERT_EFI_ERROR (Status);
> +  }
> +
> +  MaxProcessorsPerHob     = ((MAX_UINT16 & ~7) - sizeof
> (EFI_HOB_GUID_TYPE) - sizeof (MP_INFORMATION2_HOB_DATA)) / sizeof
> (MP_INFORMATION2_ENTRY);
> +  NumberOfProcessorsInHob = MaxProcessorsPerHob;
> +
> +  //
> +  // Create MP_INFORMATION2_HOB. when the max HobLength 0xFFF8 is
> not
> + enough, there  // will be a MP_INFORMATION2_HOB series in the HOB list.
> +  // In the HOB list, there is a gMpInformation2HobGuid with 0 value
> + NumberOfProcessors  // fields to indicate it's the last
> MP_INFORMATION2_HOB.
> +  //
> +  while (NumberOfProcessorsInHob != 0) {
> +    NumberOfProcessorsInHob = MIN (NumberOfProcessors -
> ProcessorIndex, MaxProcessorsPerHob);
> +    MpInformation2HobData   = BuildGuidHob (
> +                                &gMpInformation2HobGuid,
> +                                sizeof (MP_INFORMATION2_HOB_DATA) + sizeof
> (MP_INFORMATION2_ENTRY) * NumberOfProcessorsInHob
> +                                );
> +    ASSERT (MpInformation2HobData != NULL);
> +    if (MpInformation2HobData == NULL) {
> +      goto Done;
> +    }
> +
> +    MpInformation2HobData->Version            =
> MP_INFORMATION2_HOB_REVISION;
> +    MpInformation2HobData->ProcessorIndex     = ProcessorIndex;
> +    MpInformation2HobData->NumberOfProcessors =
> (UINT16)NumberOfProcessorsInHob;
> +    MpInformation2HobData->EntrySize          = sizeof
> (MP_INFORMATION2_ENTRY);
> +
> +    DEBUG ((DEBUG_INFO, "Creating MpInformation2 HOB...\n"));
> +
> +    for (Index = 0; Index < NumberOfProcessorsInHob; Index++) {
> +      MpInformation2Entry = &MpInformation2HobData->Entry[Index];
> +      Status              = CpuMpPpi2->GetProcessorInfo (
> +                                         CpuMpPpi2,
> +                                         (Index + ProcessorIndex) |
> CPU_V2_EXTENDED_TOPOLOGY,
> +                                         &MpInformation2Entry->ProcessorInfo
> +                                         );
> +      ASSERT_EFI_ERROR (Status);
> +
> +      MpInformation2Entry->CoreType = (CoreTypes != NULL) ?
> + CoreTypes[Index + ProcessorIndex] : 0;
> +
> +      DEBUG ((
> +        DEBUG_INFO,
> +        "  Processor[%04d]: ProcessorId = 0x%lx, StatusFlag = 0x%x, CoreType 
> =
> 0x%x\n",
> +        Index + ProcessorIndex,
> +        MpInformation2Entry->ProcessorInfo.ProcessorId,
> +        MpInformation2Entry->ProcessorInfo.StatusFlag,
> +        MpInformation2Entry->CoreType
> +        ));
> +      DEBUG ((
> +        DEBUG_INFO,
> +        "    Location = Package:%d Core:%d Thread:%d\n",
> +        MpInformation2Entry->ProcessorInfo.Location.Package,
> +        MpInformation2Entry->ProcessorInfo.Location.Core,
> +        MpInformation2Entry->ProcessorInfo.Location.Thread
> +        ));
> +      DEBUG ((
> +        DEBUG_INFO,
> +        "    Location2 = Package:%d Die:%d Tile:%d Module:%d Core:%d
> Thread:%d\n",
> +        MpInformation2Entry-
> >ProcessorInfo.ExtendedInformation.Location2.Package,
> +        MpInformation2Entry-
> >ProcessorInfo.ExtendedInformation.Location2.Die,
> +        MpInformation2Entry-
> >ProcessorInfo.ExtendedInformation.Location2.Tile,
> +        MpInformation2Entry-
> >ProcessorInfo.ExtendedInformation.Location2.Module,
> +        MpInformation2Entry-
> >ProcessorInfo.ExtendedInformation.Location2.Core,
> +        MpInformation2Entry-
> >ProcessorInfo.ExtendedInformation.Location2.Thread
> +        ));
> +    }
> +
> +    ProcessorIndex += NumberOfProcessorsInHob;  }
> +
> +Done:
> +  if (CoreTypes != NULL) {
> +    FreePages (CoreTypes, CoreTypePages);
> +  }
> +}
> +
> +/**
> +  Check if CpuMpPei creates gMpInformation2HobGuid and if it does not
> +it
> +  creates it.
> +
> +  @param[in] ImageHandle    Handle for the image of this driver
> +  @param[in] SystemTable    Pointer to the EFI System Table
> +
> +  @retval    EFI_UNSUPPORTED
> +**/
> +EFI_STATUS
> +EFIAPI
> +MpInfo2HobPeiEntryPoint (
> +  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> +  IN CONST EFI_PEI_SERVICES     **PeiServices
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  EFI_PEI_PPI_DESCRIPTOR      *TempPpiDescriptor;
> +  EDKII_PEI_MP_SERVICES2_PPI  *CpuMpPpi2;
> +  EFI_HOB_GUID_TYPE           *GuidHob;
> +
> +  Status = PeiServicesLocatePpi (
> +             &gEdkiiPeiMpServices2PpiGuid,
> +             0,
> +             &TempPpiDescriptor,
> +             (VOID **)&CpuMpPpi2
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +  if (EFI_ERROR (Status)) {
> +    goto Done;
> +  }
> +
> +  GuidHob = GetFirstGuidHob (&gMpInformation2HobGuid);  if (GuidHob ==
> + NULL) {
> +    DEBUG ((DEBUG_INFO, "gMpInformation2HobGuid was not created by
> CpuMpPei, creating now\n"));
> +    BuildMpInformationHob (CpuMpPpi2);
> +  }
> +
> +Done:
> +  return Status;
> +}
> diff --git
> a/Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2Hob
> Pei.inf
> b/Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2Hob
> Pei.inf
> new file mode 100644
> index 0000000000..eecfdbf422
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2Hob
> P
> +++ ei.inf
> @@ -0,0 +1,47 @@
> +### @file
> +# Component information file for the Multi-processor Info 2 HOB PEIM.
> +#
> +# The purpose of this PEIM is to provide backwards compatibility
> +between FSP # binaries built with older versions of EDK II and the latest EDK
> II.
> +#
> +# Newer versions of CpuMpPei produce the gMpInformation2HobGuid. This
> +HOB is # required by newer implementations of the CPU DXE driver,
> +however older # versions of CpuMpPei do not produce it. This PEIM will
> +check if CpuMpPei # creates gMpInformation2HobGuid and if it does not it
> creates it.
> +#
> +# Copyright (c) 2024, Intel Corporation. All rights reserved.<BR> # #
> +SPDX-License-Identifier: BSD-2-Clause-Patent # ###
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010017
> +  BASE_NAME                      = MpInfo2HobPei
> +  FILE_GUID                      = 010B5607-D5B3-4302-BCBC-C1A68087E9BE
> +  VERSION_STRING                 = 1.0
> +  MODULE_TYPE                    = PEIM
> +  ENTRY_POINT                    = MpInfo2HobPeiEntryPoint
> +
> +[LibraryClasses]
> +  PeimEntryPoint
> +  DebugLib
> +  MemoryAllocationLib
> +  HobLib
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  UefiCpuPkg/UefiCpuPkg.dec
> +  MinPlatformPkg/MinPlatformPkg.dec
> +
> +[Sources]
> +  MpInfo2HobPei.c
> +
> +[Guids]
> +  gMpInformation2HobGuid                        ## SOMETIMES_PRODUCES   ## 
> HOB
> +
> +[Ppis]
> +  gEdkiiPeiMpServices2PpiGuid                   ## CONSUMES
> +
> +[Depex]
> +  gEdkiiPeiMpServices2PpiGuid
> diff --git a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
> b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
> index ecb4d8f65e..30cdf1fb82 100644
> --- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
> +++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
> @@ -1,7 +1,7 @@
>  ## @file
>  #  Platform description.
>  #
> -# Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2017 - 2024, Intel Corporation. All rights
> +reserved.<BR>
>  # Copyright (c) Microsoft Corporation.<BR>  #  # SPDX-License-Identifier: 
> BSD-
> 2-Clause-Patent @@ -150,6 +150,7 @@
> 
> MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBoot
> ManagerLib.inf
> 
>    MinPlatformPkg/FspWrapper/SaveMemoryConfig/SaveMemoryConfig.inf
> +  MinPlatformPkg/FspWrapper/MpInfo2HobPei/MpInfo2HobPei.inf
> 
> MinPlatformPkg/FspWrapper/Library/PeiFspWrapperHobProcessLib/PeiFspW
> rapperHobProcessLib.inf
> 
> MinPlatformPkg/FspWrapper/Library/SecFspWrapperPlatformSecLib/SecFsp
> WrapperPlatformSecLib.inf
> 
> MinPlatformPkg/FspWrapper/Library/PeiFspWrapperPlatformLib/PeiFspWrap
> perPlatformLib.inf
> --
> 2.44.0.windows.1



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


Reply via email to