Hi Maurice,
I'll adapt the function names to match EDK2 naming conventions.

The SmbiosDxe is already part of UefiPayloadPkg, so it's not optional
(right now). I don't see how registering gEfiSmbiosProtocolGuid could
fail.
If you think Depex must be true, there should be
a) a comment stating the reasons why Depex must not be changed
b) I'll have to move the SMBIOS code out of BlSupportDxe into
BlSupportSmbiosDxe and add the Depex section there.
    A failed dispatch of BlSupportSmbiosDxe would then be non critical.

Do you think this would be a better solution?

I don't want to use RegisterProtocolNotify() as it's discouraged, isn't it?

Kind Regards,
Patrick Rudolph

On Thu, Jan 21, 2021 at 2:14 AM Ma, Maurice <[email protected]> wrote:
>
> Hi, Patrick
>
> In this patch I noticed that we changed the BlSupportDxe dependency from True 
> to gEfiSmbiosProtocolGuid.
> Since BlSupportDxe is considered as critical for UEFI payload,  and on the 
> other side SMBIOS driver could be optional in some case,  do you think it is 
> better to handle it through RegisterProtocolNotify() ?   In this way,  if 
> gEfiSmbiosProtocolGuid is not installed for any reason,  BlSupportDxe can 
> still be dispatched and the boot flow can continue.
>
> Some other comments:
> -  Please add function and parameter description for 
> BlDxeInstallSMBIOStables().
> -  To follow the naming convention in EDK2,   maybe  use 
> BlDxeInstallSmbiosTables instead of BlDxeInstallSMBIOStables().
>
> Thanks
> Maurice
> > -----Original Message-----
> > From: Patrick Rudolph <[email protected]>
> > Sent: Wednesday, January 20, 2021 8:02
> > To: [email protected]
> > Cc: Ma, Maurice <[email protected]>; Dong, Guo <[email protected]>;
> > You, Benjamin <[email protected]>
> > Subject: [PATCH] UefiPayloadPkg/BlSupportDxe: Use EfiSmbiosProtocol to
> > install tables
> >
> > The default EfiSmbiosProtocol operates on an empty SMBIOS table.
> > As the SMBIOS tables are provided by the bootloader, install the SMBIOS 
> > tables
> > using the EfiSmbiosProtocol.
> >
> > This fixes the settings menu not showing any hardware information, instead 
> > only
> > "0 MB RAM" was displayed.
> >
> > Tests showed that the OS can still see the SMBIOS tables.
> >
> > Signed-off-by: Patrick Rudolph <[email protected]>
> > ---
> >  UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c   | 111
> > +++++++++++++++++++-
> >  UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h   |   3 +
> >  UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf |   5 +-
> >  3 files changed, 115 insertions(+), 4 deletions(-)
> >
> > diff --git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
> > b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
> > index a746d0581e..db478c1abc 100644
> > --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
> > +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.c
> > @@ -79,6 +79,107 @@ ReserveResourceInGcd (
> >    return Status; } +EFI_STATUS+EFIAPI+BlDxeInstallSMBIOStables(+  IN UINT64
> > SmbiosTableBase,+  IN UINT32    SmbiosTableSize+)+{+  EFI_STATUS
> > Status;+  SMBIOS_TABLE_ENTRY_POINT      *SmbiosTable;+
> > SMBIOS_TABLE_3_0_ENTRY_POINT  *Smbios30Table;+
> > SMBIOS_STRUCTURE_POINTER      Smbios;+  SMBIOS_STRUCTURE_POINTER
> > SmbiosEnd;+  CHAR8                         *String;+  EFI_SMBIOS_HANDLE
> > SmbiosHandle;+  EFI_SMBIOS_PROTOCOL           *SmbiosProto;++  //+  // 
> > Locate
> > Smbios protocol.+  //+  Status = gBS->LocateProtocol 
> > (&gEfiSmbiosProtocolGuid,
> > NULL, (VOID **)&SmbiosProto);+  if (EFI_ERROR (Status)) {+    DEBUG
> > ((DEBUG_ERROR, "%a: Failed to locate gEfiSmbiosProtocolGuid\n",+
> > __FUNCTION__));+    return Status;+  }++  Smbios30Table =
> > (SMBIOS_TABLE_3_0_ENTRY_POINT *)(UINTN)(SmbiosTableBase);+
> > SmbiosTable = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN)(SmbiosTableBase);++
> > if (CompareMem (Smbios30Table->AnchorString, "_SM3_", 5) == 0) {+
> > Smbios.Hdr = (SMBIOS_STRUCTURE *) (UINTN) Smbios30Table-
> > >TableAddress;+    SmbiosEnd.Raw = (UINT8 *) (UINTN) (Smbios30Table-
> > >TableAddress + Smbios30Table->TableMaximumSize);+    if (Smbios30Table-
> > >TableMaximumSize > SmbiosTableSize) {+      DEBUG((DEBUG_INFO, "%a:
> > SMBIOS table size greater than reported by bootloader\n",+
> > __FUNCTION__));+    }+  } else if (CompareMem (SmbiosTable->AnchorString,
> > "_SM_", 4) == 0) {+    Smbios.Hdr    = (SMBIOS_STRUCTURE *) (UINTN)
> > SmbiosTable->TableAddress;+    SmbiosEnd.Raw = (UINT8 *) ((UINTN)
> > SmbiosTable->TableAddress + SmbiosTable->TableLength);++    if (SmbiosTable-
> > >TableLength > SmbiosTableSize) {+      DEBUG((DEBUG_INFO, "%a: SMBIOS
> > table size greater than reported by bootloader\n",+
> > __FUNCTION__));+    }+  } else {+    DEBUG ((DEBUG_ERROR, "%a: No valid
> > SMBIOS table found\n", __FUNCTION__ ));+    return EFI_NOT_FOUND;+  }++
> > do {+    // Check for end marker+    if (Smbios.Hdr->Type == 127) {+
> > break;+    }++    // Install the table+    SmbiosHandle =
> > SMBIOS_HANDLE_PI_RESERVED;+    Status = SmbiosProto->Add (+
> > SmbiosProto,+                          gImageHandle,+                       
> >    &SmbiosHandle,+
> > Smbios.Hdr+                          );+    ASSERT_EFI_ERROR (Status);+    
> > if (EFI_ERROR
> > (Status)) {+      return Status;+    }+    //+    // Go to the next SMBIOS 
> > structure.
> > Each SMBIOS structure may include 2 parts:+    // 1. Formatted section; 2.
> > Unformatted string section. So, 2 steps are needed+    // to skip one SMBIOS
> > structure.+    //++    //+    // Step 1: Skip over formatted section.+    
> > //+    String =
> > (CHAR8 *) (Smbios.Raw + Smbios.Hdr->Length);++    //+    // Step 2: Skip 
> > over
> > unformatted string section.+    //+    do {+      //+      // Each string 
> > is terminated
> > with a NULL(00h) BYTE and the sets of strings+      // is terminated with an
> > additional NULL(00h) BYTE.+      //+      for ( ; *String != 0; String++) 
> > {+      }++      if
> > (*(UINT8*)++String == 0) {+        //+        // Pointer to the next SMBIOS
> > structure.+        //+        Smbios.Raw = (UINT8 *)++String;+        
> > break;+      }+    }
> > while (TRUE);+  } while (Smbios.Raw < SmbiosEnd.Raw);++  return
> > EFI_SUCCESS;+}  /**   Main entry for the bootloader support DXE module.@@ -
> > 133,9 +234,13 @@ BlDxeEntryPoint (
> >    // Install Smbios Table   //   if (SystemTableInfo->SmbiosTableBase != 0 
> > &&
> > SystemTableInfo->SmbiosTableSize != 0) {-    DEBUG ((DEBUG_ERROR, "Install
> > Smbios Table at 0x%lx, length 0x%x\n", SystemTableInfo->SmbiosTableBase,
> > SystemTableInfo->SmbiosTableSize));-    Status = 
> > gBS->InstallConfigurationTable
> > (&gEfiSmbiosTableGuid, (VOID *)(UINTN)SystemTableInfo->SmbiosTableBase);-
> > ASSERT_EFI_ERROR (Status);+    DEBUG ((DEBUG_ERROR, "Install Smbios Table
> > at 0x%lx, length 0x%x\n",+      SystemTableInfo->SmbiosTableBase,
> > SystemTableInfo->SmbiosTableSize));++    if
> > (BlDxeInstallSMBIOStables(SystemTableInfo->SmbiosTableBase,
> > SystemTableInfo->SmbiosTableSize) != EFI_SUCCESS) {+      Status = gBS-
> > >InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID
> > *)(UINTN)SystemTableInfo->SmbiosTableBase);+      ASSERT_EFI_ERROR
> > (Status);+    }   }    //diff --git 
> > a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h
> > b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h
> > index 512105fafd..a5216cd2e9 100644
> > --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h
> > +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.h
> > @@ -10,6 +10,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> >   #include <PiDxe.h> +#include <Protocol/Smbios.h>+ #include
> > <Library/UefiDriverEntryPoint.h> #include 
> > <Library/UefiBootServicesTableLib.h>
> > #include <Library/DxeServicesTableLib.h>@@ -26,5 +28,6 @@ SPDX-License-
> > Identifier: BSD-2-Clause-Patent  #include <Guid/GraphicsInfoHob.h>  #include
> > <IndustryStandard/Acpi.h>+#include <IndustryStandard/SmBios.h>  #endifdiff -
> > -git a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
> > b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
> > index cebc811355..d26a75248b 100644
> > --- a/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
> > +++ b/UefiPayloadPkg/BlSupportDxe/BlSupportDxe.inf
> > @@ -56,5 +56,8 @@
> >    gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress
> > gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseSize +[Protocols]+
> > gEfiSmbiosProtocolGuid+ [Depex]-  TRUE+  gEfiSmbiosProtocolGuid--
> > 2.26.2
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#70611): https://edk2.groups.io/g/devel/message/70611
Mute This Topic: https://groups.io/mt/79981721/21656
Group Owner: [email protected]
Unsubscribe: https://edk2.groups.io/g/devel/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to