1/** @file
2  Library to add SMBIOS data records from HOB to SMBIOS table.
3
4  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5
6  This program and the accompanying materials are licensed and made available under
7  the terms and conditions of the BSD License which accompanies this distribution.
8  The full text of the license may be found at
9  http://opensource.org/licenses/bsd-license.php
10
11  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14  @par Specification Reference:
15  System Management BIOS (SMBIOS) Reference Specification v3.0.0
16  dated 2015-Feb-12 (DSP0134)
17  http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
18
19**/
20#include <IndustryStandard/SmBios.h>
21#include <Library/UefiLib.h>
22#include <Library/BaseLib.h>
23#include <Library/BaseMemoryLib.h>
24#include <Library/MemoryAllocationLib.h>
25#include <Library/DebugLib.h>
26#include <Library/HobLib.h>
27#include <Library/UefiBootServicesTableLib.h>
28#include <Protocol/Smbios.h>
29
30
31/**
32  Adds SMBIOS records to tables
33
34  @param[in] ImageHandle          Image handle of this driver.
35  @param[in] SystemTable          Global system service table.
36
37  @retval EFI_UNSUPPORTED      -  Could not locate SMBIOS protocol
38  @retval EFI_OUT_OF_RESOURCES -  Failed to allocate memory for SMBIOS HOB type.
39  @retval EFI_SUCCESS          -  Successfully added SMBIOS records based on HOB.
40**/
41EFI_STATUS
42EFIAPI
43DxeSmbiosDataHobLibConstructor (
44  IN EFI_HANDLE                ImageHandle,
45  IN EFI_SYSTEM_TABLE          *SystemTable
46  )
47{
48  EFI_PEI_HOB_POINTERS         Hob;
49  EFI_SMBIOS_HANDLE            SmbiosHandle;
50  EFI_SMBIOS_PROTOCOL          *Smbios;
51  EFI_STATUS                   Status;
52  UINT8                        *RecordPtr;
53  UINT16                       RecordCount;
54
55  RecordCount = 0;
56
57  DEBUG ((DEBUG_INFO, "Adding SMBIOS records from HOB..\n"));
58
59  Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios);
60  if (Smbios == NULL) {
61    DEBUG ((DEBUG_WARN, "Can't locate SMBIOS protocol\n"));
62    return EFI_UNSUPPORTED;
63  }
64
65  ///
66  /// Get SMBIOS HOB data (each hob contains one SMBIOS record)
67  ///
68  for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
69    if ((GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_GUID_EXTENSION) && (CompareGuid (&Hob.Guid->Name, &gIntelSmbiosDataHobGuid))) {
70      RecordPtr = GET_GUID_HOB_DATA (Hob.Raw);
71
72      ///
73      /// Add generic SMBIOS HOB to SMBIOS table
74      ///
75      DEBUG ((DEBUG_VERBOSE, "Add SMBIOS record type: %x\n", ((EFI_SMBIOS_TABLE_HEADER *) RecordPtr)->Type));
76      SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
77      Status = Smbios->Add (Smbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) RecordPtr);
78      if (!EFI_ERROR (Status)) {
79        RecordCount++;
80      }
81    }
82  }
83  DEBUG ((DEBUG_INFO, "Found %d Records and added to SMBIOS table.\n", RecordCount));
84
85  return EFI_SUCCESS;
86}
87
88