]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
OvmfPkg: replace old EFI_D_ debug levels with new DEBUG_ ones
[mirror_edk2.git] / OvmfPkg / Library / SmbiosVersionLib / DetectSmbiosVersionLib.c
CommitLineData
b265ed92
LE
1/** @file\r
2\r
3 A hook-in library for MdeModulePkg/Universal/SmbiosDxe, in order to set\r
4 gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion (and possibly other PCDs)\r
5 just before SmbiosDxe consumes them.\r
6\r
7 Copyright (C) 2013, 2015, Red Hat, Inc.\r
8 Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>\r
9\r
b26f0cf9 10 SPDX-License-Identifier: BSD-2-Clause-Patent\r
b265ed92
LE
11\r
12**/\r
13\r
14#include <IndustryStandard/SmBios.h>\r
15\r
16#include <Base.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/DebugLib.h>\r
19#include <Library/PcdLib.h>\r
20#include <Library/QemuFwCfgLib.h>\r
21\r
22typedef union {\r
23 SMBIOS_TABLE_ENTRY_POINT V2;\r
c3db5a8c 24 SMBIOS_TABLE_3_0_ENTRY_POINT V3;\r
b265ed92
LE
25} QEMU_SMBIOS_ANCHOR;\r
26\r
27RETURN_STATUS\r
28EFIAPI\r
29DetectSmbiosVersion (\r
30 VOID\r
31 )\r
32{\r
33 FIRMWARE_CONFIG_ITEM Anchor, Tables;\r
34 UINTN AnchorSize, TablesSize;\r
35 QEMU_SMBIOS_ANCHOR QemuAnchor;\r
36 UINT16 SmbiosVersion;\r
ae23afb4 37 RETURN_STATUS PcdStatus;\r
b265ed92 38\r
92dc0bb2
LE
39 if (PcdGetBool (PcdQemuSmbiosValidated)) {\r
40 //\r
41 // Some other module, linked against this library, has already performed\r
42 // the task at hand. This should never happen, but it's easy to handle;\r
43 // just exit early.\r
44 //\r
45 return RETURN_SUCCESS;\r
46 }\r
47\r
b265ed92
LE
48 if (RETURN_ERROR (QemuFwCfgFindFile (\r
49 "etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||\r
50 RETURN_ERROR (QemuFwCfgFindFile (\r
51 "etc/smbios/smbios-tables", &Tables, &TablesSize)) ||\r
52 TablesSize == 0) {\r
53 return RETURN_SUCCESS;\r
54 }\r
55\r
56 QemuFwCfgSelectItem (Anchor);\r
57\r
58 switch (AnchorSize) {\r
59 case sizeof QemuAnchor.V2:\r
60 QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);\r
61\r
62 if (QemuAnchor.V2.MajorVersion != 2 ||\r
63 QemuAnchor.V2.TableLength != TablesSize ||\r
64 CompareMem (QemuAnchor.V2.AnchorString, "_SM_", 4) != 0 ||\r
65 CompareMem (QemuAnchor.V2.IntermediateAnchorString, "_DMI_", 5) != 0) {\r
66 return RETURN_SUCCESS;\r
67 }\r
68 SmbiosVersion = (UINT16)(QemuAnchor.V2.MajorVersion << 8 |\r
69 QemuAnchor.V2.MinorVersion);\r
70 break;\r
71\r
c3db5a8c
LE
72 case sizeof QemuAnchor.V3:\r
73 QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);\r
74\r
75 if (QemuAnchor.V3.MajorVersion != 3 ||\r
76 QemuAnchor.V3.TableMaximumSize != TablesSize ||\r
77 CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0) {\r
78 return RETURN_SUCCESS;\r
79 }\r
80 SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |\r
81 QemuAnchor.V3.MinorVersion);\r
82\r
70d5086c 83 DEBUG ((DEBUG_INFO, "%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",\r
c3db5a8c 84 __FUNCTION__, QemuAnchor.V3.DocRev));\r
ae23afb4
LE
85 PcdStatus = PcdSet8S (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);\r
86 ASSERT_RETURN_ERROR (PcdStatus);\r
c3db5a8c
LE
87 break;\r
88\r
b265ed92
LE
89 default:\r
90 return RETURN_SUCCESS;\r
91 }\r
92\r
70d5086c 93 DEBUG ((DEBUG_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__,\r
b265ed92 94 SmbiosVersion));\r
ae23afb4
LE
95 PcdStatus = PcdSet16S (PcdSmbiosVersion, SmbiosVersion);\r
96 ASSERT_RETURN_ERROR (PcdStatus);\r
b265ed92 97\r
92dc0bb2
LE
98 //\r
99 // SMBIOS platform drivers can now fetch and install\r
100 // "etc/smbios/smbios-tables" from QEMU.\r
101 //\r
ae23afb4
LE
102 PcdStatus = PcdSetBoolS (PcdQemuSmbiosValidated, TRUE);\r
103 ASSERT_RETURN_ERROR (PcdStatus);\r
b265ed92
LE
104 return RETURN_SUCCESS;\r
105}\r