]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/SmbiosGenDxe/SmbiosGen.c
1. PI SMBIOS Checkin. Major change include:
[mirror_edk2.git] / DuetPkg / SmbiosGenDxe / SmbiosGen.c
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