]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. PI SMBIOS Checkin. Major change include:
authordavidhuang <davidhuang@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 20 Nov 2009 04:00:54 +0000 (04:00 +0000)
committerdavidhuang <davidhuang@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 20 Nov 2009 04:00:54 +0000 (04:00 +0000)
1) Produce PI SMBIOS protocol in MdeModulePkg
2) Update all consumers (in CorePkgs and native platform pkgs) to consume SMBIOS protocol instead of DataHub
3) Pass ECC tool; Verify Nt32, Duet, Unix platform

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9454 6f19259b-4bc3-4df7-8a09-765794883524

DuetPkg/DuetPkg.dsc
DuetPkg/DuetPkg.fdf
DuetPkg/SmbiosGenDxe/SmbiosGen.c [new file with mode: 0644]
DuetPkg/SmbiosGenDxe/SmbiosGen.h [new file with mode: 0644]
DuetPkg/SmbiosGenDxe/SmbiosGen.inf [new file with mode: 0644]
DuetPkg/SmbiosGenDxe/SmbiosGenStrings.uni [new file with mode: 0644]

index da142cecfc056016b2df8eac4faa4da17b607382..f801a5ba97603a6746e730f5f4f387e945035401 100644 (file)
   MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
 
 
-  DuetPkg/DataHubGenDxe/DataHubGen.inf
+  DuetPkg/SmbiosGenDxe/SmbiosGen.inf
   #DuetPkg/FvbRuntimeService/DUETFwh.inf
   DuetPkg/EfiLdr/EfiLdr.inf {
     <LibraryClasses>
index f0dd282c18398f9b292a1a70371aeb4e069eef5f..abc0401f5143b4846c18bafd37110b64b975d233 100644 (file)
@@ -77,7 +77,7 @@ INF  MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
 INF  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
 INF  MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
 INF  MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
-INF  DuetPkg/DataHubGenDxe/DataHubGen.inf\r
+INF  DuetPkg/SmbiosGenDxe/SmbiosGen.inf\r
 #INF  DuetPkg/FvbRuntimeService/DUETFwh.inf\r
 INF  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf\r
 INF  UefiCpuPkg/CpuIoDxe/CpuIo.inf\r
diff --git a/DuetPkg/SmbiosGenDxe/SmbiosGen.c b/DuetPkg/SmbiosGenDxe/SmbiosGen.c
new file mode 100644 (file)
index 0000000..b615757
--- /dev/null
@@ -0,0 +1,344 @@
+/** @file\r
+\r
+Copyright (c) 2009, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  SmbiosGen.c\r
+\r
+Abstract:\r
+\r
+**/\r
+\r
+#include "SmbiosGen.h"\r
+EFI_HII_DATABASE_PROTOCOL   *gHiiDatabase;\r
+extern UINT8                SmbiosGenDxeStrings[];\r
+EFI_SMBIOS_PROTOCOL         *gSmbios;\r
+EFI_HII_HANDLE              gStringHandle;\r
+\r
+VOID *\r
+GetSmbiosTablesFromHob (\r
+  VOID\r
+  )\r
+{\r
+  EFI_PHYSICAL_ADDRESS       *Table;\r
+  EFI_PEI_HOB_POINTERS        GuidHob;\r
+  //\r
+  // Get Hob List\r
+  //\r
+  GuidHob.Raw = GetHobList ();\r
+  GuidHob.Raw = GetNextGuidHob (&gEfiSmbiosTableGuid, GuidHob.Raw);\r
+  if (GuidHob.Raw != NULL) {\r
+    Table = GET_GUID_HOB_DATA (GuidHob.Guid);\r
+    if (Table != NULL) {\r
+      return (VOID *)(UINTN)*Table;\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+\r
+VOID\r
+InstallProcessorSmbios (\r
+  IN VOID                  *Smbios\r
+  )\r
+{\r
+  SMBIOS_STRUCTURE_POINTER          SmbiosTable;\r
+  CHAR8                             *AString;\r
+  CHAR16                            *UString;\r
+  STRING_REF                        Token;\r
+\r
+  //\r
+  // Processor info (TYPE 4)\r
+  // \r
+  SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 4, 0);\r
+  if (SmbiosTable.Raw == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 4 (Processor Info) not found!\n"));\r
+    return ;\r
+  }\r
+\r
+  //\r
+  // Log Smbios Record Type4\r
+  //\r
+  LogSmbiosData(gSmbios,(UINT8*)SmbiosTable.Type4);\r
+\r
+  //\r
+  // Set ProcessorVersion string\r
+  //\r
+  AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type4->ProcessorVersion);\r
+  UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16));\r
+  ASSERT (UString != NULL);\r
+  AsciiStrToUnicodeStr (AString, UString);\r
+\r
+  Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
+  if (Token == 0) {\r
+    gBS->FreePool (UString);\r
+    return ;\r
+  }\r
+  gBS->FreePool (UString);\r
+  return ;\r
+}\r
+\r
+VOID\r
+InstallCacheSmbios (\r
+  IN VOID                  *Smbios\r
+  )\r
+{\r
+  return ;\r
+}\r
+\r
+VOID\r
+InstallMemorySmbios (\r
+  IN VOID                  *Smbios\r
+  )\r
+{\r
+  SMBIOS_STRUCTURE_POINTER          SmbiosTable;\r
+\r
+  //\r
+  // Generate Memory Array Mapped Address info (TYPE 19)\r
+  //\r
+  SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 19, 0);\r
+  if (SmbiosTable.Raw == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 19 (Memory Array Mapped Address Info) not found!\n"));\r
+    return ;\r
+  }\r
+\r
+  //\r
+  // Record Smbios Type 19\r
+  //\r
+  LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type19);\r
+  return ;\r
+}\r
+\r
+VOID\r
+InstallMiscSmbios (\r
+  IN VOID                  *Smbios\r
+  )\r
+{\r
+  SMBIOS_STRUCTURE_POINTER          SmbiosTable;\r
+  CHAR8                             *AString;\r
+  CHAR16                            *UString;\r
+  STRING_REF                        Token;\r
+\r
+  //\r
+  // BIOS information (TYPE 0)\r
+  // \r
+  SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 0, 0);\r
+  if (SmbiosTable.Raw == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 0 (BIOS Information) not found!\n"));\r
+    return ;\r
+  }\r
+\r
+  //\r
+  // Record Type 2\r
+  //\r
+  AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);\r
+  UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));\r
+  ASSERT (UString != NULL);\r
+  CopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));\r
+  AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1);\r
+\r
+  Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
+  if (Token == 0) {\r
+    gBS->FreePool (UString);\r
+    return ;\r
+  }\r
+  gBS->FreePool (UString);\r
+\r
+  //\r
+  // Log Smios Type 0\r
+  //\r
+  LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type0);\r
+  \r
+  //\r
+  // System information (TYPE 1)\r
+  // \r
+  SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_ENTRY_POINT *)Smbios, 1, 0);\r
+  if (SmbiosTable.Raw == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));\r
+    return ;\r
+  }\r
+\r
+  //\r
+  // Record Type 3\r
+  //\r
+  AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);\r
+  UString = AllocateZeroPool ((AsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));\r
+  ASSERT (UString != NULL);\r
+  CopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));\r
+  AsciiStrToUnicodeStr (AString, UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1);\r
+\r
+  Token = HiiSetString (gStringHandle, 0, UString, NULL);\r
+  if (Token == 0) {\r
+    gBS->FreePool (UString);\r
+    return ;\r
+  }\r
+  gBS->FreePool (UString);\r
+\r
+  //\r
+  // Log Smbios Type 1\r
+  //\r
+  LogSmbiosData(gSmbios, (UINT8*)SmbiosTable.Type1);\r
+  \r
+  return ;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosGenEntrypoint (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  VOID                    *Smbios;\r
+\r
+  Smbios = GetSmbiosTablesFromHob ();\r
+  if (Smbios == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiSmbiosProtocolGuid,\r
+                  NULL,\r
+                  (VOID**)&gSmbios\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
+                  NULL,\r
+                  (VOID**)&gHiiDatabase\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  \r
+  gStringHandle = HiiAddPackages (\r
+                    &gEfiCallerIdGuid,\r
+                    NULL,\r
+                    SmbiosGenDxeStrings,\r
+                    NULL\r
+                    );\r
+  ASSERT (gStringHandle != NULL);\r
+\r
+  InstallProcessorSmbios (Smbios);\r
+  InstallCacheSmbios     (Smbios);\r
+  InstallMemorySmbios    (Smbios);\r
+  InstallMiscSmbios      (Smbios);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+//\r
+// Internal function\r
+//\r
+\r
+UINTN\r
+SmbiosTableLength (\r
+  IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
+  )\r
+{\r
+  CHAR8  *AChar;\r
+  UINTN  Length;\r
+\r
+  AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
+  while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
+    AChar ++;\r
+  }\r
+  Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
+  \r
+  return Length;\r
+}\r
+\r
+SMBIOS_STRUCTURE_POINTER\r
+GetSmbiosTableFromType (\r
+  IN SMBIOS_TABLE_ENTRY_POINT  *Smbios,\r
+  IN UINT8                     Type,\r
+  IN UINTN                     Index\r
+  )\r
+{\r
+  SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
+  UINTN                    SmbiosTypeIndex;\r
+  \r
+  SmbiosTypeIndex = 0;\r
+  SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;\r
+  if (SmbiosTable.Raw == NULL) {\r
+    return SmbiosTable;\r
+  }\r
+  while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {\r
+    if (SmbiosTable.Hdr->Type == 127) {\r
+      SmbiosTable.Raw = NULL;\r
+      return SmbiosTable;\r
+    }\r
+    if (SmbiosTable.Hdr->Type == Type) {\r
+      SmbiosTypeIndex ++;\r
+    }\r
+    SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
+  }\r
+\r
+  return SmbiosTable;\r
+}\r
+\r
+CHAR8 *\r
+GetSmbiosString (\r
+  IN SMBIOS_STRUCTURE_POINTER  SmbiosTable,\r
+  IN SMBIOS_TABLE_STRING       String\r
+  )\r
+{\r
+  CHAR8      *AString;\r
+  UINT8      Index;\r
+\r
+  Index = 1;\r
+  AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
+  while (Index != String) {\r
+    while (*AString != 0) {\r
+      AString ++;\r
+    }\r
+    AString ++;\r
+    if (*AString == 0) {\r
+      return AString;\r
+    }\r
+    Index ++;\r
+  }\r
+\r
+  return AString;\r
+}\r
+\r
+\r
+/**\r
+  Logs SMBIOS record.\r
+\r
+  @param  Smbios   Pointer to SMBIOS protocol instance.\r
+  @param  Buffer   Pointer to the data buffer.\r
+\r
+**/\r
+VOID\r
+LogSmbiosData (\r
+  IN   EFI_SMBIOS_PROTOCOL        *Smbios,\r
+  IN   UINT8                      *Buffer\r
+  )\r
+{\r
+  EFI_STATUS         Status;\r
+  EFI_SMBIOS_HANDLE  SmbiosHandle;\r
+  \r
+  SmbiosHandle = 0;\r
+  Status = Smbios->Add (\r
+                     Smbios,\r
+                     NULL,\r
+                     &SmbiosHandle,\r
+                     (EFI_SMBIOS_TABLE_HEADER*)Buffer\r
+                     );\r
+  ASSERT_EFI_ERROR (Status);\r
+}\r
diff --git a/DuetPkg/SmbiosGenDxe/SmbiosGen.h b/DuetPkg/SmbiosGenDxe/SmbiosGen.h
new file mode 100644 (file)
index 0000000..45e6b24
--- /dev/null
@@ -0,0 +1,87 @@
+/** @file\r
+\r
+Copyright (c) 2009, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name: \r
+\r
+  DataHubGen.h\r
+\r
+Abstract:\r
+\r
+**/\r
+\r
+#ifndef _SMBIOS_GEN_H_\r
+#define _SMBIOS_GEN_H_\r
+\r
+#include <FrameworkDxe.h>\r
+#include <IndustryStandard/SmBios.h>\r
+\r
+#include <Guid/HobList.h>\r
+#include <Guid/SmBios.h>\r
+#include <Guid/DataHubRecords.h>\r
+\r
+#include <Protocol/Smbios.h>\r
+#include <Protocol/FrameworkHii.h>\r
+#include <Protocol/HiiDatabase.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+\r
+#define   PRODUCT_NAME                  L"DUET"\r
+#define   PRODUCT_VERSION               L"Beta"\r
+\r
+#define   FIRMWARE_PRODUCT_NAME         (PRODUCT_NAME L": ")\r
+#ifdef EFI32\r
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
+#define   FIRMWARE_BIOS_VERSIONE        (PRODUCT_NAME L"(IA32.UEFI)" PRODUCT_VERSION L": ")\r
+#else\r
+#define   FIRMWARE_BIOS_VERSIONE        (PRODUCT_NAME L"(IA32.EFI)"  PRODUCT_VERSION L": ")\r
+#endif\r
+#else  // EFIX64\r
+#if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
+#define   FIRMWARE_BIOS_VERSIONE        (PRODUCT_NAME L"(X64.UEFI)"  PRODUCT_VERSION L": ")\r
+#else\r
+#define   FIRMWARE_BIOS_VERSIONE        (PRODUCT_NAME L"(X64.EFI)"   PRODUCT_VERSION L": ")\r
+#endif\r
+#endif\r
+\r
+SMBIOS_STRUCTURE_POINTER\r
+GetSmbiosTableFromType (\r
+  IN SMBIOS_TABLE_ENTRY_POINT  *Smbios,\r
+  IN UINT8                 Type,\r
+  IN UINTN                 Index\r
+  );\r
+\r
+CHAR8 *\r
+GetSmbiosString (\r
+  IN SMBIOS_STRUCTURE_POINTER  SmbiosTable,\r
+  IN SMBIOS_TABLE_STRING       String\r
+  );\r
+\r
+/**\r
+  Logs SMBIOS record.\r
+\r
+  @param  Smbios   Pointer to SMBIOS protocol instance.\r
+  @param  Buffer   Pointer to the data buffer.\r
+\r
+**/\r
+VOID\r
+LogSmbiosData (\r
+  IN   EFI_SMBIOS_PROTOCOL        *Smbios,\r
+  IN   UINT8                      *Buffer\r
+  );\r
+\r
+#endif\r
diff --git a/DuetPkg/SmbiosGenDxe/SmbiosGen.inf b/DuetPkg/SmbiosGenDxe/SmbiosGen.inf
new file mode 100644 (file)
index 0000000..d762bf6
--- /dev/null
@@ -0,0 +1,63 @@
+#/*++\r
+#\r
+# Copyright (c) 2009, Intel Corporation                                                         \r
+# All rights reserved. This program and the accompanying materials                          \r
+# are licensed and made available under the terms and conditions of the BSD License         \r
+# which accompanies this distribution.  The full text of the license may be found at        \r
+# http://opensource.org/licenses/bsd-license.php                                            \r
+#                                                                                           \r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+# \r
+#  Module Name:\r
+#\r
+#    SmbiosGen.inf\r
+#\r
+#  Abstract:\r
+#\r
+#    Component description file for SmbiosGen module.\r
+#\r
+#--*/\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = SmbiosGenDxe\r
+  FILE_GUID                      = 0021001C-3CE3-41f8-99C6-ECF5DA754731\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  EDK_RELEASE_VERSION            = 0x00020000\r
+  EFI_SPECIFICATION_VERSION      = 0x00020000\r
+  ENTRY_POINT                    = SmbiosGenEntrypoint\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec\r
+\r
+[LibraryClasses]\r
+  UefiLib\r
+  HobLib\r
+  UefiBootServicesTableLib\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
+  UefiDriverEntryPoint\r
+  BaseLib\r
+  HiiLib\r
+  \r
+[Sources.common]\r
+  SmbiosGen.c\r
+  SmbiosGen.h\r
+  SmbiosGenStrings.uni\r
+\r
+[Guids.common]\r
+  gEfiSmbiosTableGuid\r
+\r
+[Protocols]\r
+  gEfiHiiDatabaseProtocolGuid\r
+  gEfiSmbiosProtocolGuid\r
+  gEfiHiiProtocolGuid\r
+  \r
+[Depex]\r
+  gEfiSmbiosProtocolGuid AND gEfiHiiDatabaseProtocolGuid\r
+\r
diff --git a/DuetPkg/SmbiosGenDxe/SmbiosGenStrings.uni b/DuetPkg/SmbiosGenDxe/SmbiosGenStrings.uni
new file mode 100644 (file)
index 0000000..b56ec86
Binary files /dev/null and b/DuetPkg/SmbiosGenDxe/SmbiosGenStrings.uni differ