]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
OvmfPkg: Apply uncrustify changes
[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
ac0a286f
MK
23 SMBIOS_TABLE_ENTRY_POINT V2;\r
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
ac0a286f
MK
33 FIRMWARE_CONFIG_ITEM Anchor, Tables;\r
34 UINTN AnchorSize, TablesSize;\r
35 QEMU_SMBIOS_ANCHOR QemuAnchor;\r
36 UINT16 SmbiosVersion;\r
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
ac0a286f
MK
48 if (RETURN_ERROR (\r
49 QemuFwCfgFindFile (\r
50 "etc/smbios/smbios-anchor",\r
51 &Anchor,\r
52 &AnchorSize\r
53 )\r
54 ) ||\r
55 RETURN_ERROR (\r
56 QemuFwCfgFindFile (\r
57 "etc/smbios/smbios-tables",\r
58 &Tables,\r
59 &TablesSize\r
60 )\r
61 ) ||\r
62 (TablesSize == 0))\r
63 {\r
b265ed92
LE
64 return RETURN_SUCCESS;\r
65 }\r
66\r
67 QemuFwCfgSelectItem (Anchor);\r
68\r
69 switch (AnchorSize) {\r
ac0a286f
MK
70 case sizeof QemuAnchor.V2:\r
71 QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);\r
72\r
73 if ((QemuAnchor.V2.MajorVersion != 2) ||\r
74 (QemuAnchor.V2.TableLength != TablesSize) ||\r
75 (CompareMem (QemuAnchor.V2.AnchorString, "_SM_", 4) != 0) ||\r
76 (CompareMem (QemuAnchor.V2.IntermediateAnchorString, "_DMI_", 5) != 0))\r
77 {\r
78 return RETURN_SUCCESS;\r
79 }\r
80\r
81 SmbiosVersion = (UINT16)(QemuAnchor.V2.MajorVersion << 8 |\r
82 QemuAnchor.V2.MinorVersion);\r
83 break;\r
84\r
85 case sizeof QemuAnchor.V3:\r
86 QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);\r
87\r
88 if ((QemuAnchor.V3.MajorVersion != 3) ||\r
89 (QemuAnchor.V3.TableMaximumSize != TablesSize) ||\r
90 (CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0))\r
91 {\r
92 return RETURN_SUCCESS;\r
93 }\r
94\r
95 SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |\r
96 QemuAnchor.V3.MinorVersion);\r
97\r
98 DEBUG ((\r
99 DEBUG_INFO,\r
100 "%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",\r
101 __FUNCTION__,\r
102 QemuAnchor.V3.DocRev\r
103 ));\r
104 PcdStatus = PcdSet8S (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);\r
105 ASSERT_RETURN_ERROR (PcdStatus);\r
106 break;\r
107\r
108 default:\r
c3db5a8c 109 return RETURN_SUCCESS;\r
b265ed92
LE
110 }\r
111\r
ac0a286f
MK
112 DEBUG ((\r
113 DEBUG_INFO,\r
114 "%a: SMBIOS version from QEMU: 0x%04x\n",\r
115 __FUNCTION__,\r
116 SmbiosVersion\r
117 ));\r
ae23afb4
LE
118 PcdStatus = PcdSet16S (PcdSmbiosVersion, SmbiosVersion);\r
119 ASSERT_RETURN_ERROR (PcdStatus);\r
b265ed92 120\r
92dc0bb2
LE
121 //\r
122 // SMBIOS platform drivers can now fetch and install\r
123 // "etc/smbios/smbios-tables" from QEMU.\r
124 //\r
ae23afb4
LE
125 PcdStatus = PcdSetBoolS (PcdQemuSmbiosValidated, TRUE);\r
126 ASSERT_RETURN_ERROR (PcdStatus);\r
b265ed92
LE
127 return RETURN_SUCCESS;\r
128}\r