On Mon, Sep 23, 2019 at 08:31:52AM +0800, Abner Chang wrote:
> RISC-V generic SMBIOS DXE driver for building up SMBIOS type 4, type 7
> and type 44 records.
> 
> Signed-off-by: Abner Chang <abner.ch...@hpe.com>
> ---
>  RiscVPkg/Include/ProcessorSpecificDataHob.h        |  95 ++++++
>  RiscVPkg/Include/SmbiosProcessorSpecificData.h     |  58 ++++
>  RiscVPkg/RiscVPkg.dec                              |   6 +
>  RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.c      | 339 
> +++++++++++++++++++++
>  RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.h      |  32 ++
>  RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.inf    |  58 ++++
>  RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.uni    |  12 +
>  .../Universal/SmbiosDxe/RiscVSmbiosDxeExtra.uni    |  13 +
>  8 files changed, 613 insertions(+)
>  create mode 100644 RiscVPkg/Include/ProcessorSpecificDataHob.h
>  create mode 100644 RiscVPkg/Include/SmbiosProcessorSpecificData.h
>  create mode 100644 RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.c
>  create mode 100644 RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.h
>  create mode 100644 RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.inf
>  create mode 100644 RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.uni
>  create mode 100644 RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxeExtra.uni
> 
> diff --git a/RiscVPkg/Include/ProcessorSpecificDataHob.h 
> b/RiscVPkg/Include/ProcessorSpecificDataHob.h
> new file mode 100644
> index 0000000..6798a9d
> --- /dev/null
> +++ b/RiscVPkg/Include/ProcessorSpecificDataHob.h

None of the things defined in here are HOBs, they are structures to
hold information that will be put into HOBs.
Can we merge all of these definitions into
SmbiosProcessorSpecificData.h and delete this file?

> @@ -0,0 +1,95 @@
> +/** @file
> +  Definition of Processor Specific Data HOB.
> +
> +  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +#ifndef _RISC_V_PROCESSOR_SPECIFIC_DATA_HOB_H_
> +#define _RISC_V_PROCESSOR_SPECIFIC_DATA_HOB_H_

Please drop leading _.

> +
> +#include <IndustryStandard/SmBios.h>

This file also uses Uefi.h, please include it, so we don't depend on
other files pulling it in for us.

> +
> +#define TO_BE_FILLED 0
> +#define TO_BE_FILLED_BY_VENDOR 0
> +#define TO_BE_FILLED_BY_RISC_V_SMBIOS_DXE_DRIVER 0
> +#define TO_BE_FILLED_BY_CODE 0

These defines are never used, please drop,

> +
> +#pragma pack(1)
> +
> +///
> +/// RISC-V processor specific data HOB
> +///
> +typedef struct {
> +  EFI_GUID ParentPrcessorGuid;
> +  UINTN    ParentProcessorUid;
> +  EFI_GUID CoreGuid;
> +  VOID     *Context;        // The additional information of this core which
> +                            // built in PEI phase and carried to DXE phase.
> +                            // The content is pocessor or platform specific.
> +  SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA ProcessorSpecificData;
> +} RISC_V_PROCESSOR_SPECIFIC_DATA_HOB;
> +
> +///
> +/// RISC-V SMBIOS type 4 (Processor) GUID data HOB
> +///
> +typedef struct {
> +  EFI_GUID PrcessorGuid;
> +  UINTN    ProcessorUid;
> +  SMBIOS_TABLE_TYPE4 SmbiosType4Processor;
> +  UINT16             EndingZero;

Please align indentation of struct members.

> +} RISC_V_PROCESSOR_TYPE4_DATA_HOB;
> +
> +#define RISC_V_CACHE_INFO_NOT_PROVIDED 0xFFFF
> +
> +#define RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK 0x7
> +   #define RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_1 0x01
> +   #define RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_2 0x02
> +   #define RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_3 0x03
> +
> +#define RISC_V_CACHE_CONFIGURATION_SOCKET_BIT_POSITION 3
> +#define RISC_V_CACHE_CONFIGURATION_SOCKET_MASK (0x1 << 
> RISC_V_CACHE_CONFIGURATION_SOCKET_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_SOCKET_SOCKETED (0x1 << 
> RISC_V_CACHE_CONFIGURATION_SOCKET_BIT_POSITION)
> +
> +#define RISC_V_CACHE_CONFIGURATION_LOCATION_BIT_POSITION 5
> +#define RISC_V_CACHE_CONFIGURATION_LOCATION_MASK (0x3 << 
> RISC_V_CACHE_CONFIGURATION_LOCATION_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_LOCATION_INTERNAL (0x0 << 
> RISC_V_CACHE_CONFIGURATION_LOCATION_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_LOCATION_EXTERNAL (0x1 << 
> RISC_V_CACHE_CONFIGURATION_LOCATION_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_LOCATION_RESERVED (0x2 << 
> RISC_V_CACHE_CONFIGURATION_LOCATION_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_LOCATION_UNKNOWN  (0x3 << 
> RISC_V_CACHE_CONFIGURATION_LOCATION_BIT_POSITION)
> +
> +#define RISC_V_CACHE_CONFIGURATION_ENABLE_BIT_POSITION 7
> +#define RISC_V_CACHE_CONFIGURATION_ENABLE_MASK       (0x1 << 
> RISC_V_CACHE_CONFIGURATION_ENABLE_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_ENABLED           (0x1 << 
> RISC_V_CACHE_CONFIGURATION_ENABLE_BIT_POSITION)
> +
> +#define RISC_V_CACHE_CONFIGURATION_MODE_BIT_POSITION 8
> +#define RISC_V_CACHE_CONFIGURATION_MODE_MASK       (0x3 << 
> RISC_V_CACHE_CONFIGURATION_MODE_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_MODE_WT       (0x0 << 
> RISC_V_CACHE_CONFIGURATION_MODE_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_MODE_WB       (0x1 << 
> RISC_V_CACHE_CONFIGURATION_MODE_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_MODE_VARIES   (0x2 << 
> RISC_V_CACHE_CONFIGURATION_MODE_BIT_POSITION)
> +  #define RISC_V_CACHE_CONFIGURATION_MODE_UNKNOWN  (0x3 << 
> RISC_V_CACHE_CONFIGURATION_MODE_BIT_POSITION)
> +///
> +/// RISC-V SMBIOS type 7 (Cache) GUID data HOB
> +///
> +typedef struct {
> +  EFI_GUID           PrcessorGuid;
> +  UINTN              ProcessorUid;
> +  SMBIOS_TABLE_TYPE7 SmbiosType7Cache;
> +  UINT16             EndingZero;
> +} RISC_V_PROCESSOR_TYPE7_DATA_HOB;
> +
> +///
> +/// RISC-V SMBIOS type 7 (Cache) GUID data HOB
> +///
> +typedef struct {
> +  RISC_V_PROCESSOR_TYPE4_DATA_HOB *Processor;
> +  RISC_V_PROCESSOR_TYPE7_DATA_HOB *L1InstCache;
> +  RISC_V_PROCESSOR_TYPE7_DATA_HOB *L1DataCache;
> +  RISC_V_PROCESSOR_TYPE7_DATA_HOB *L2Cache;
> +  RISC_V_PROCESSOR_TYPE7_DATA_HOB *L3Cache;
> +} RISC_V_PROCESSOR_SMBIOS_DATA_HOB;

I don't see this structure being used anywhere - can it be deleted?

> +
> +#pragma pack()
> +
> +#endif
> diff --git a/RiscVPkg/Include/SmbiosProcessorSpecificData.h 
> b/RiscVPkg/Include/SmbiosProcessorSpecificData.h
> new file mode 100644
> index 0000000..36aa4ab
> --- /dev/null
> +++ b/RiscVPkg/Include/SmbiosProcessorSpecificData.h
> @@ -0,0 +1,58 @@
> +/** @file
> +  Industry Standard Definitions of RISC-V Processor Specific data defined in
> +  below link for complaiant with SMBIOS Table Specification v3.3.0.
> +  https://github.com/riscv/riscv-smbios
> +
> +  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +#ifndef _SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA_H_
> +#define _SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA_H_

Drop leading _.

> +
> +#include <IndustryStandard/SmBios.h>
> +
> +#include <RiscV.h>
> +
> +#pragma pack(1)
> +
> +typedef enum{
> +  RegisterUnsupported = 0x00,
> +  RegisterLen32       = 0x01,
> +  RegisterLen64       = 0x02,
> +  RegisterLen128      = 0x03
> +} RISC_V_REGISTER_LENGTH;
> +
> +#define SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA_REVISION 0x100
> +
> +#define SMBIOS_RISC_V_PSD_MACHINE_MODE_SUPPORTED    (0x01 << 0)
> +#define SMBIOS_RISC_V_PSD_SUPERVISOR_MODE_SUPPORTED (0x01 << 2)
> +#define SMBIOS_RISC_V_PSD_USER_MODE_SUPPORTED       (0x01 << 3)
> +#define SMBIOS_RISC_V_PSD_DEBUG_MODE_SUPPORTED      (0x01 << 7)
> +
> +///
> +/// RISC-V processor specific data for SMBIOS type 44
> +///
> +typedef struct {
> +  UINT16            Revision;
> +  UINT8             Length;
> +  RISCV_UINT128     HartId;
> +  UINT8             BootHartId;
> +  RISCV_UINT128     MachineVendorId;
> +  RISCV_UINT128     MachineArchId;
> +  RISCV_UINT128     MachineImplId;
> +  UINT32            InstSetSupported;
> +  UINT8             PrivilegeModeSupported;
> +  RISCV_UINT128     MModeExcepDelegation;
> +  RISCV_UINT128     MModeInterruptDelegation;
> +  UINT8             HartXlen;
> +  UINT8             MachineModeXlen;
> +  UINT8             Reserved;
> +  UINT8             SupervisorModeXlen;
> +  UINT8             UserModeXlen;
> +} SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA;
> +
> +#pragma pack()
> +#endif
> +
> diff --git a/RiscVPkg/RiscVPkg.dec b/RiscVPkg/RiscVPkg.dec
> index a91392f..b316223 100644
> --- a/RiscVPkg/RiscVPkg.dec
> +++ b/RiscVPkg/RiscVPkg.dec
> @@ -24,6 +24,12 @@
>    gUefiRiscVPkgTokenSpaceGuid  = { 0x4261e9c8, 0x52c0, 0x4b34, { 0x85, 0x3d, 
> 0x48, 0x46, 0xea, 0xd3, 0xb7, 0x2c}}
>  
>  [PcdsFixedAtBuild]
> +  # Processor Specific Data GUID HOB GUID
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSpecificDataGuidHobGuid|{0x20, 
> 0x72, 0xD5, 0x2F, 0xCF, 0x3C, 0x4C, 0xBC, 0xB1, 0x65, 0x94, 0x90, 0xDC, 0xF2, 
> 0xFA, 0x93}|VOID*|0x00001000
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSmbiosGuidHobGuid|{0x0F, 0x34, 
> 0x00, 0x92, 0x04, 0x12, 0x45, 0x4A, 0x9C, 0x11, 0xB8, 0x8B, 0xDF, 0xC6, 0xFA, 
> 0x6F}|VOID*|0x00001001
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSmbiosType4GuidHobGuid|{0x5B, 
> 0x36, 0xEA, 0x23, 0x79, 0x6D, 0x4F, 0xCF, 0x9C, 0x22, 0x25, 0xC0, 0x89, 0x8C, 
> 0x25, 0xB9}|VOID*|0x00001002
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSmbiosType7GuidHobGuid|{0xBF, 
> 0xB4, 0x6D, 0x1B, 0x7E, 0x10, 0x47, 0x44, 0xB8, 0xBD, 0xFF, 0x1E, 0xDD, 0xDF, 
> 0x71, 0x65}|VOID*|0x00001003
> +
>    #
>    #                                                   1000000000
>    # PcdRiscVMachineTimerTickInNanoSecond = 
> ---------------------------------------
> diff --git a/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.c 
> b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.c
> new file mode 100644
> index 0000000..032f559
> --- /dev/null
> +++ b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.c
> @@ -0,0 +1,339 @@
> +/** @file
> +  RISC-V generic SMBIOS DXE driver to build up SMBIOS type 4, type 7 and 
> type 44 records.
> +
> +  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "RiscVSmbiosDxe.h"
> +
> +#define RISCV_SMBIOS_DEBUG_INFO 1

I would greatly prefer if we could drop this and
If there's still active development of the tables, I can go along with
keeping it while on the -staging branch, but it needs to go before the
port is merged to edk2 master.
You can use DEBUG_VERBOSE instead.

> +
> +EFI_SMBIOS_PROTOCOL   *Smbios;

mSmBios. And STATIC.

> +
> +/**
> +  This function builds SMBIOS type 7 record according to
> +  the given  RISC_V_PROCESSOR_TYPE7_DATA_HOB.
> +
> +  @param Type4DataHob       Pointer to RISC_V_PROCESSOR_TYPE4_DATA_HOB
> +  @param Type7DataHob       Pointer to RISC_V_PROCESSOR_TYPE7_DATA_HOB
> +  @param SmbiosHandle       Pointer to SMBIOS_HANDLE
> +
> +  @retval EFI_STATUS
> +
> +**/
> +static

STATIC

> +EFI_STATUS
> +BuildSmbiosType7 (
> + IN RISC_V_PROCESSOR_TYPE4_DATA_HOB *Type4DataHob,
> + IN RISC_V_PROCESSOR_TYPE7_DATA_HOB *Type7DataHob,
> + OUT SMBIOS_HANDLE *SmbiosHandle
> +)
> +{
> +  EFI_STATUS Status;
> +  SMBIOS_HANDLE Handle;
> +
> +  if (!CompareGuid (&Type4DataHob->PrcessorGuid, 
> &Type7DataHob->PrcessorGuid) ||
> +    Type4DataHob->ProcessorUid != Type7DataHob->ProcessorUid) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  Handle = SMBIOS_HANDLE_PI_RESERVED;
> +  Type7DataHob->SmbiosType7Cache.Hdr.Type = SMBIOS_TYPE_CACHE_INFORMATION;
> +  Type7DataHob->SmbiosType7Cache.Hdr.Length = sizeof(SMBIOS_TABLE_TYPE7);
> +  Type7DataHob->SmbiosType7Cache.Hdr.Handle = 0;
> +  Type7DataHob->EndingZero = 0;
> +  Status = Smbios->Add (Smbios, NULL, &Handle, 
> &Type7DataHob->SmbiosType7Cache.Hdr);
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: Fail to add SMBIOS Type 
> 7\n"));
> +    return Status;
> +  }
> +  DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: SMBIOS Type 7 was added. 
> SMBIOS Handle: 0x%x\n", Handle));
> +#if RISCV_SMBIOS_DEBUG_INFO
> +  DEBUG ((DEBUG_INFO, "                         Cache belone to processor 
> GUID: %g\n", &Type7DataHob->PrcessorGuid));
> +  DEBUG ((DEBUG_INFO, "                         Cache belone processor  UID: 
> %d\n", Type7DataHob->ProcessorUid));
> +  DEBUG ((DEBUG_INFO, "                         
> ==============================\n"));
> +  DEBUG ((DEBUG_INFO, "                         Socket Designation: %d\n", 
> Type7DataHob->SmbiosType7Cache.SocketDesignation));
> +  DEBUG ((DEBUG_INFO, "                         Cache Configuration: 
> 0x%x\n", Type7DataHob->SmbiosType7Cache.CacheConfiguration));
> +  DEBUG ((DEBUG_INFO, "                         Maximum Cache Size: 0x%x\n", 
> Type7DataHob->SmbiosType7Cache.MaximumCacheSize));
> +  DEBUG ((DEBUG_INFO, "                         Installed Size: 0x%x\n", 
> Type7DataHob->SmbiosType7Cache.InstalledSize));
> +  DEBUG ((DEBUG_INFO, "                         Supported SRAM Type: 
> 0x%x\n", Type7DataHob->SmbiosType7Cache.SupportedSRAMType));
> +  DEBUG ((DEBUG_INFO, "                         Current SRAMT ype: 0x%x\n", 
> Type7DataHob->SmbiosType7Cache.CurrentSRAMType));
> +  DEBUG ((DEBUG_INFO, "                         Cache Speed: 0x%x\n", 
> Type7DataHob->SmbiosType7Cache.CacheSpeed));
> +  DEBUG ((DEBUG_INFO, "                         Error Correction Type: 
> 0x%x\n", Type7DataHob->SmbiosType7Cache.ErrorCorrectionType));
> +  DEBUG ((DEBUG_INFO, "                         System Cache Type: 0x%x\n", 
> Type7DataHob->SmbiosType7Cache.SystemCacheType));
> +  DEBUG ((DEBUG_INFO, "                         Associativity: 0x%x\n", 
> Type7DataHob->SmbiosType7Cache.Associativity));
> +#endif
> +
> +  *SmbiosHandle = Handle;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  This function builds SMBIOS type 4 record according to
> +  the given  RISC_V_PROCESSOR_TYPE4_DATA_HOB.
> +
> +  @param Type4DataHob       Pointer to RISC_V_PROCESSOR_TYPE4_DATA_HOB
> +  @param SmbiosHandle       Pointer to SMBIOS_HANDLE
> +
> +  @retval EFI_STATUS
> +
> +**/
> +static
> +EFI_STATUS
> +BuildSmbiosType4 (
> +  IN RISC_V_PROCESSOR_TYPE4_DATA_HOB *Type4DataHob,
> +  OUT SMBIOS_HANDLE *SmbiosHandle
> +  )
> +{
> +  EFI_HOB_GUID_TYPE *GuidHob;

The code would be more readable if this was called something like Type7Hob.

> +  RISC_V_PROCESSOR_TYPE7_DATA_HOB *Type7HobData;
> +  SMBIOS_HANDLE Cache;
> +  SMBIOS_HANDLE Processor;
> +  EFI_STATUS Status;
> +
> +  DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: Building Type 4.\n"));

Again, please avoid the custom [] message tags - add %a __FUNCTION__
where helpul. Throughout.

> +  DEBUG ((DEBUG_INFO, "                         Processor GUID: %g\n", 
> &Type4DataHob->PrcessorGuid));
> +  DEBUG ((DEBUG_INFO, "                         Processor UUID: %d\n", 
> Type4DataHob->ProcessorUid));
> +
> +  Type4DataHob->SmbiosType4Processor.L1CacheHandle = 
> RISC_V_CACHE_INFO_NOT_PROVIDED;
> +  Type4DataHob->SmbiosType4Processor.L2CacheHandle = 
> RISC_V_CACHE_INFO_NOT_PROVIDED;
> +  Type4DataHob->SmbiosType4Processor.L3CacheHandle = 
> RISC_V_CACHE_INFO_NOT_PROVIDED;
> +  GuidHob = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob ((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSmbiosType7GuidHobGuid));
> +  if (GuidHob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: No RISC-V SMBIOS Type7 
> data HOB found.\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +  //
> +  // Go through each RISC_V_PROCESSOR_TYPE4_DATA_HOB for multiple processors.
> +  //
> +  do {
> +    Type7HobData = (RISC_V_PROCESSOR_TYPE7_DATA_HOB *)GET_GUID_HOB_DATA 
> (GuidHob);
> +    Status = BuildSmbiosType7 (Type4DataHob, Type7HobData, &Cache);
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +    if ((Type7HobData->SmbiosType7Cache.SystemCacheType & 
> RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK) ==
> +        RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_1) {
> +      Type4DataHob->SmbiosType4Processor.L1CacheHandle = Cache;
> +    } else if ((Type7HobData->SmbiosType7Cache.SystemCacheType & 
> RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK) ==
> +        RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_2) {
> +      Type4DataHob->SmbiosType4Processor.L2CacheHandle = Cache;
> +    } else if ((Type7HobData->SmbiosType7Cache.SystemCacheType & 
> RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_MASK) ==
> +        RISC_V_CACHE_CONFIGURATION_CACHE_LEVEL_3) {
> +      Type4DataHob->SmbiosType4Processor.L3CacheHandle = Cache;
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: Improper cache level of 
> SMBIOS handle %d\n", Cache));
> +    }
> +    GuidHob = GetNextGuidHob((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSmbiosType7GuidHobGuid), GET_NEXT_HOB(GuidHob));
> +  } while (GuidHob != NULL);
> +
> +  //
> +  // Build SMBIOS Type 4 record
> +  //
> +  Processor = SMBIOS_HANDLE_PI_RESERVED;
> +  Type4DataHob->SmbiosType4Processor.Hdr.Type = 
> SMBIOS_TYPE_PROCESSOR_INFORMATION;
> +  Type4DataHob->SmbiosType4Processor.Hdr.Length = sizeof(SMBIOS_TABLE_TYPE4);
> +  Type4DataHob->SmbiosType4Processor.Hdr.Handle = 0;
> +  Type4DataHob->EndingZero = 0;
> +  Status = Smbios->Add (Smbios, NULL, &Processor, 
> &Type4DataHob->SmbiosType4Processor.Hdr);
> +  if (EFI_ERROR(Status)) {
> +    DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: Fail to add SMBIOS Type 
> 4\n"));
> +    return Status;
> +  }
> +  DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: SMBIOS Type 4 was added. 
> SMBIOS Handle: 0x%x\n", Processor));
> +#if RISCV_SMBIOS_DEBUG_INFO
> +  DEBUG ((DEBUG_INFO, "                         Socket StringID: %d\n", 
> Type4DataHob->SmbiosType4Processor.Socket));
> +  DEBUG ((DEBUG_INFO, "                         Processor Type: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.ProcessorType));
> +  DEBUG ((DEBUG_INFO, "                         Processor Family: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.ProcessorFamily));
> +  DEBUG ((DEBUG_INFO, "                         Processor Manufacture 
> StringID: %d\n", Type4DataHob->SmbiosType4Processor.ProcessorManufacture));
> +  DEBUG ((DEBUG_INFO, "                         Processor Id: 0x%x:0x%x\n", \
> +          Type4DataHob->SmbiosType4Processor.ProcessorId.Signature, 
> Type4DataHob->SmbiosType4Processor.ProcessorId.FeatureFlags));
> +  DEBUG ((DEBUG_INFO, "                         Processor Version StringID: 
> %d\n", Type4DataHob->SmbiosType4Processor.ProcessorVersion));
> +  DEBUG ((DEBUG_INFO, "                         Voltage: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.Voltage));
> +  DEBUG ((DEBUG_INFO, "                         External Clock: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.ExternalClock));
> +  DEBUG ((DEBUG_INFO, "                         Max Speed: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.MaxSpeed));
> +  DEBUG ((DEBUG_INFO, "                         Current Speed: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.CurrentSpeed));
> +  DEBUG ((DEBUG_INFO, "                         Status: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.Status));
> +  DEBUG ((DEBUG_INFO, "                         ProcessorUpgrade: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.ProcessorUpgrade));
> +  DEBUG ((DEBUG_INFO, "                         L1 Cache Handle: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.L1CacheHandle));
> +  DEBUG ((DEBUG_INFO, "                         L2 Cache Handle: 
> 0x%x\n",Type4DataHob->SmbiosType4Processor.L2CacheHandle));
> +  DEBUG ((DEBUG_INFO, "                         L3 Cache Handle: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.L3CacheHandle));
> +  DEBUG ((DEBUG_INFO, "                         Serial Number StringID: 
> %d\n", Type4DataHob->SmbiosType4Processor.SerialNumber));
> +  DEBUG ((DEBUG_INFO, "                         Asset Tag StringID: %d\n", 
> Type4DataHob->SmbiosType4Processor.AssetTag));
> +  DEBUG ((DEBUG_INFO, "                         Part Number StringID: %d\n", 
> Type4DataHob->SmbiosType4Processor.PartNumber));
> +  DEBUG ((DEBUG_INFO, "                         Core Count: %d\n", 
> Type4DataHob->SmbiosType4Processor.CoreCount));
> +  DEBUG ((DEBUG_INFO, "                         Enabled CoreCount: %d\n", 
> Type4DataHob->SmbiosType4Processor.EnabledCoreCount));
> +  DEBUG ((DEBUG_INFO, "                         Thread Count: %d\n", 
> Type4DataHob->SmbiosType4Processor.ThreadCount));
> +  DEBUG ((DEBUG_INFO, "                         Processor Characteristics: 
> 0x%x\n", Type4DataHob->SmbiosType4Processor.ProcessorCharacteristics));
> +  DEBUG ((DEBUG_INFO, "                         Processor Family2: 0x%x\n", 
> Type4DataHob->SmbiosType4Processor.ProcessorFamily2));
> +  DEBUG ((DEBUG_INFO, "                         Core Count 2: %d\n", 
> Type4DataHob->SmbiosType4Processor.CoreCount2));
> +  DEBUG ((DEBUG_INFO, "                         Enabled CoreCount : %d\n", 
> Type4DataHob->SmbiosType4Processor.EnabledCoreCount2));
> +  DEBUG ((DEBUG_INFO, "                         Thread Count 2: %d\n", 
> Type4DataHob->SmbiosType4Processor.ThreadCount2));
> +#endif
> +
> +  *SmbiosHandle = Processor;
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  This function builds SMBIOS type 44 record according..
> +
> +  @param Type4DataHob      Pointer to RISC_V_PROCESSOR_TYPE4_DATA_HOB
> +  @param Type4Handle       SMBIOS handle of type 4
> +
> +  @retval EFI_STATUS
> +
> +**/
> +EFI_STATUS
> +BuildSmbiosType44 (
> +  IN RISC_V_PROCESSOR_TYPE4_DATA_HOB *Type4DataHob,
> +  IN SMBIOS_HANDLE Type4Handle
> +  )
> +{
> +  EFI_HOB_GUID_TYPE *GuidHob;

ProcessorSpecificDataHob? Or Type44Hob?

> +  RISC_V_PROCESSOR_SPECIFIC_DATA_HOB *ProcessorSpecificData;
> +  SMBIOS_HANDLE RiscVType44;
> +  SMBIOS_TABLE_TYPE44 *Type44Ptr;
> +  EFI_STATUS Status;
> +
> +  DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: Building Type 44 for...\n"));
> +#if RISCV_SMBIOS_DEBUG_INFO
> +  DEBUG ((DEBUG_INFO, "                         Processor GUID: %g\n", 
> &Type4DataHob->PrcessorGuid));
> +  DEBUG ((DEBUG_INFO, "                         Processor UUID: %d\n", 
> Type4DataHob->ProcessorUid));
> +#endif
> +
> +  GuidHob = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob ((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSpecificDataGuidHobGuid));
> +  if (GuidHob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: No 
> RISC_V_PROCESSOR_SPECIFIC_DATA_HOB found.\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +  //
> +  // Go through each RISC_V_PROCESSOR_SPECIFIC_DATA_HOB for multiple cores.
> +  //
> +  do {
> +    ProcessorSpecificData = (RISC_V_PROCESSOR_SPECIFIC_DATA_HOB 
> *)GET_GUID_HOB_DATA (GuidHob);
> +    if (!CompareGuid (&ProcessorSpecificData->ParentPrcessorGuid, 
> &Type4DataHob->PrcessorGuid) ||
> +      ProcessorSpecificData->ParentProcessorUid != 
> Type4DataHob->ProcessorUid) {
> +      GuidHob = GetNextGuidHob((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSpecificDataGuidHobGuid), GET_NEXT_HOB(GuidHob));
> +      if (GuidHob == NULL) {
> +        break;
> +      }
> +      continue;
> +    }
> +
> +#if RISCV_SMBIOS_DEBUG_INFO
> +    DEBUG ((DEBUG_INFO, "[                        
> ================================\n"));
> +    DEBUG ((DEBUG_INFO, "[                        Core GUID: %g\n", 
> &ProcessorSpecificData->CoreGuid));
> +#endif
> +
> +    Type44Ptr = AllocateZeroPool(sizeof(SMBIOS_TABLE_TYPE44) + 
> sizeof(SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA) + 2); // Two ending zero.
> +    if (Type44Ptr == NULL) {
> +      return EFI_NOT_FOUND;
> +    }
> +    Type44Ptr->Hdr.Type = SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION;
> +    Type44Ptr->Hdr.Handle = 0;
> +    Type44Ptr->Hdr.Length = sizeof(SMBIOS_TABLE_TYPE44) + 
> sizeof(SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA);
> +    Type44Ptr->RefHandle = Type4Handle;
> +    Type44Ptr->ProcessorSpecificBlock.Length = 
> sizeof(SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA);
> +    Type44Ptr->ProcessorSpecificBlock.ProcessorArchType = 
> Type4DataHob->SmbiosType4Processor.ProcessorFamily2 -
> +                                                          
> ProcessorFamilyRiscvRV32 + \
> +                                                          
> ProcessorSpecificBlockArchTypeRiscVRV32;
> +    CopyMem ((VOID *)(Type44Ptr + 1), (VOID 
> *)&ProcessorSpecificData->ProcessorSpecificData, sizeof 
> (SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA));
> +
> +#if RISCV_SMBIOS_DEBUG_INFO
> +    DEBUG ((DEBUG_INFO, "[                        Core type: %d\n", 
> Type44Ptr->ProcessorSpecificBlock.ProcessorArchType));
> +    DEBUG ((DEBUG_INFO, "                           HartId = 0x%x\n", 
> ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->HartId.Value64_L));
> +    DEBUG ((DEBUG_INFO, "                           Is Boot Hart? = 0x%x\n", 
> ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->BootHartId));
> +    DEBUG ((DEBUG_INFO, "                           PrivilegeModeSupported = 
> 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->PrivilegeModeSupported));
> +    DEBUG ((DEBUG_INFO, "                           MModeExcepDelegation = 
> 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->MModeExcepDelegation.Value64_L));
> +    DEBUG ((DEBUG_INFO, "                           MModeInterruptDelegation 
> = 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->MModeInterruptDelegation.Value64_L));
> +    DEBUG ((DEBUG_INFO, "                           HartXlen = 0x%x\n", 
> ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->HartXlen));
> +    DEBUG ((DEBUG_INFO, "                           MachineModeXlen = 
> 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->MachineModeXlen));
> +    DEBUG ((DEBUG_INFO, "                           SupervisorModeXlen = 
> 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->SupervisorModeXlen));
> +    DEBUG ((DEBUG_INFO, "                           UserModeXlen = 0x%x\n", 
> ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 1))->UserModeXlen));
> +    DEBUG ((DEBUG_INFO, "                           InstSetSupported = 
> 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->InstSetSupported));
> +    DEBUG ((DEBUG_INFO, "                           MachineVendorId = 
> 0x%x\n", ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->MachineVendorId.Value64_L));
> +    DEBUG ((DEBUG_INFO, "                           MachineArchId = 0x%x\n", 
> ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->MachineArchId.Value64_L));
> +    DEBUG ((DEBUG_INFO, "                           MachineImplId = 0x%x\n", 
> ((SMBIOS_RISC_V_PROCESSOR_SPECIFIC_DATA *)(Type44Ptr + 
> 1))->MachineImplId.Value64_L));
> +#endif
> +
> +    //
> +    // Add to SMBIOS table.
> +    //
> +    RiscVType44 = SMBIOS_HANDLE_PI_RESERVED;
> +    Status = Smbios->Add (Smbios, NULL, &RiscVType44, &Type44Ptr->Hdr);
> +    if (EFI_ERROR(Status)) {
> +      DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: Fail to add SMBIOS Type 
> 44\n"));
> +      return Status;
> +    }
> +    DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: SMBIOS Type 44 was added. 
> SMBIOS Handle: 0x%x\n", RiscVType44));
> +
> +    GuidHob = GetNextGuidHob((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSpecificDataGuidHobGuid), GET_NEXT_HOB(GuidHob));
> +  } while (GuidHob != NULL);
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Entry point of RISC-V SMBIOS builder.
> +
> +  @param ImageHandle     Image handle this driver.
> +  @param SystemTable     Pointer to the System Table.
> +
> +  @retval EFI_SUCCESS           Thread can be successfully created
> +  @retval EFI_OUT_OF_RESOURCES  Cannot allocate protocol data structure
> +  @retval EFI_DEVICE_ERROR      Cannot create the thread
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RiscVSmbiosBuilderEntry (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  )
> +{
> +  EFI_STATUS Status;
> +  EFI_HOB_GUID_TYPE *GuidHob;

Type4Hob?

> +  RISC_V_PROCESSOR_TYPE4_DATA_HOB *Type4HobData;
> +  SMBIOS_HANDLE Processor;
> +
> +  DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: %a entry\n", __FUNCTION__));
> +
> +  Status = gBS->LocateProtocol (
> +                  &gEfiSmbiosProtocolGuid,
> +                  NULL,
> +                  (VOID **)&Smbios
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: Locate SMBIOS Protocol 
> fail\n"));
> +    return Status;
> +  }
> +  GuidHob = (EFI_HOB_GUID_TYPE *)GetFirstGuidHob ((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSmbiosType4GuidHobGuid));
> +  if (GuidHob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: No RISC-V SMBIOS 
> information found.\n"));
> +    return EFI_NOT_FOUND;
> +  }
> +  Type4HobData = (RISC_V_PROCESSOR_TYPE4_DATA_HOB *)GET_GUID_HOB_DATA 
> (GuidHob);
> +  Status = EFI_NOT_FOUND;
> +  //
> +  // Go through each RISC_V_PROCESSOR_TYPE4_DATA_HOB for multiple processors.
> +  //
> +  do {
> +    Status = BuildSmbiosType4 (Type4HobData, &Processor);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: No RISC-V SMBIOS type 4 
> created.\n"));
> +      ASSERT (FALSE);
> +    }
> +    Status = BuildSmbiosType44 (Type4HobData, Processor);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "[RISC-V SMBIOS Builder]: No RISC-V SMBIOS type 
> 44 found.\n"));
> +      ASSERT (FALSE);
> +    }
> +
> +    GuidHob = GetNextGuidHob((EFI_GUID 
> *)PcdGetPtr(PcdProcessorSmbiosType4GuidHobGuid), GET_NEXT_HOB(GuidHob));
> +  } while (GuidHob != NULL);
> +  DEBUG ((DEBUG_INFO, "[RISC-V SMBIOS Builder]: %a exit\n", __FUNCTION__));
> +  return Status;
> +}
> +
> diff --git a/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.h 
> b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.h
> new file mode 100644
> index 0000000..dfa1fc6
> --- /dev/null
> +++ b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.h
> @@ -0,0 +1,32 @@
> +/** @file
> +  RISC-V SMBIOS Builder DXE module header file.
> +
> +  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef _RISC_V_SMBIOS_DXE_H_
> +#define _RISC_V_SMBIOS_DXE_H_
> +
> +#include <PiDxe.h>
> +
> +#include <Protocol/Cpu.h>
> +#include <Protocol/Smbios.h>
> +
> +#include <Library/UefiDriverEntryPoint.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/DxeServicesTableLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/HobLib.h>
> +
> +#include <SmbiosProcessorSpecificData.h>
> +#include <ProcessorSpecificDataHob.h>

Please move all of these include statements to the files that actually
use them, then delete this file.

> +
> +#endif
> +
> diff --git a/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.inf 
> b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.inf
> new file mode 100644
> index 0000000..59b814a
> --- /dev/null
> +++ b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.inf
> @@ -0,0 +1,58 @@
> +## @file
> +#  RISC-V SMBIOS DXE module.
> +#
> +#  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +#
> +#  SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001b
> +  BASE_NAME                      = RiscVSmbiosDxe
> +  MODULE_UNI_FILE                = RiscVSmbiosDxe.uni
> +  FILE_GUID                      = 5FC01647-AADD-42E1-AD99-DF4CB89F5A92
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = RiscVSmbiosBuilderEntry
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec

Please sort alphabetically.

/
    Leif

> +  RiscVPkg/RiscVPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  CpuLib
> +  DebugLib
> +  DxeServicesTableLib
> +  HobLib
> +  MemoryAllocationLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  UefiLib
> +
> +[Sources]
> +  RiscVSmbiosDxe.c
> +  RiscVSmbiosDxe.h
> +
> +[Protocols]
> +  gEfiSmbiosProtocolGuid        # Consumed
> +
> +[Guids]
> +
> +
> +[Pcd]
> +
> +[FixedPcd]
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSmbiosGuidHobGuid
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSmbiosType4GuidHobGuid
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSmbiosType7GuidHobGuid
> +  gUefiRiscVPkgTokenSpaceGuid.PcdProcessorSpecificDataGuidHobGuid
> +
> +[Depex]
> +  gEfiSmbiosProtocolGuid
> +
> +[UserExtensions.TianoCore."ExtraFiles"]
> +  RiscVSmbiosDxeExtra.uni
> diff --git a/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.uni 
> b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.uni
> new file mode 100644
> index 0000000..1bffe09
> --- /dev/null
> +++ b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxe.uni
> @@ -0,0 +1,12 @@
> +// /** @file
> +//
> +// Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +//
> +// SPDX-License-Identifier: BSD-2-Clause-Patent
> +//
> +// **/
> +
> +#string STR_MODULE_ABSTRACT             #language en-US "RISC-V Processor 
> SMBIOS Builder"
> +
> +#string STR_MODULE_DESCRIPTION          #language en-US "Build RISC-V 
> Processor SMBIOS Type 4, 7, 44 records."
> +
> diff --git a/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxeExtra.uni 
> b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxeExtra.uni
> new file mode 100644
> index 0000000..4b37ca2
> --- /dev/null
> +++ b/RiscVPkg/Universal/SmbiosDxe/RiscVSmbiosDxeExtra.uni
> @@ -0,0 +1,13 @@
> +// /** @file
> +// RISC-V SMBIOS Builder Localized Strings and Content
> +//
> +// Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights 
> reserved.<BR>
> +//
> +// SPDX-License-Identifier: BSD-2-Clause-Patent
> +//
> +// **/
> +
> +#string STR_PROPERTIES_MODULE_NAME
> +#language en-US
> +"RISC-V SMBIOS Record Builder DXE Driver"
> +
> -- 
> 2.7.4
> 
> 
> 
> 

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#48319): https://edk2.groups.io/g/devel/message/48319
Mute This Topic: https://groups.io/mt/34258224/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to