]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / SmbiosPlatformDxe / SmbiosPlatformDxe.c
CommitLineData
fb511817 1/** @file\r
2 This driver installs SMBIOS information for OVMF\r
3\r
4 Copyright (c) 2011, Bei Guan <gbtju85@gmail.com>\r
5f239ef7 5 Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
fb511817 6\r
b26f0cf9 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
fb511817 8\r
9**/\r
10\r
7e25086a
LE
11#include <IndustryStandard/SmBios.h> // SMBIOS_TABLE_TYPE0\r
12#include <Library/DebugLib.h> // ASSERT_EFI_ERROR()\r
7e25086a
LE
13#include <Library/UefiBootServicesTableLib.h> // gBS\r
14#include <Protocol/Smbios.h> // EFI_SMBIOS_PROTOCOL\r
15\r
fb511817 16#include "SmbiosPlatformDxe.h"\r
17\r
5f239ef7
JJ
18#define TYPE0_STRINGS \\r
19 "EFI Development Kit II / OVMF\0" /* Vendor */ \\r
20 "0.0.0\0" /* BiosVersion */ \\r
21 "02/06/2015\0" /* BiosReleaseDate */\r
24256744
GS
22//\r
23// Type definition and contents of the default Type 0 SMBIOS table.\r
24//\r
25#pragma pack(1)\r
26typedef struct {\r
ac0a286f
MK
27 SMBIOS_TABLE_TYPE0 Base;\r
28 UINT8 Strings[sizeof (TYPE0_STRINGS)];\r
24256744
GS
29} OVMF_TYPE0;\r
30#pragma pack()\r
31\r
ac0a286f 32STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = {\r
24256744
GS
33 {\r
34 // SMBIOS_STRUCTURE Hdr\r
35 {\r
36 EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type\r
37 sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length\r
38 },\r
ac0a286f
MK
39 1, // SMBIOS_TABLE_STRING Vendor\r
40 2, // SMBIOS_TABLE_STRING BiosVersion\r
41 0xE800, // UINT16 BiosSegment\r
42 3, // SMBIOS_TABLE_STRING BiosReleaseDate\r
43 0, // UINT8 BiosSize\r
24256744 44 { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics\r
ac0a286f
MK
45 0, // Reserved :2\r
46 0, // Unknown :1\r
47 1, // BiosCharacteristicsNotSupported :1\r
48 // Remaining BiosCharacteristics bits left unset :60\r
24256744
GS
49 },\r
50 { // BIOSCharacteristicsExtensionBytes[2]\r
ac0a286f
MK
51 0, // BiosReserved\r
52 0x1C // SystemReserved = VirtualMachineSupported |\r
53 // UefiSpecificationSupported |\r
54 // TargetContentDistributionEnabled\r
24256744
GS
55 },\r
56 0, // UINT8 SystemBiosMajorRelease\r
57 0, // UINT8 SystemBiosMinorRelease\r
58 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease\r
59 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease\r
60 },\r
61 // Text strings (unformatted area)\r
5f239ef7 62 TYPE0_STRINGS\r
24256744
GS
63};\r
64\r
fb511817 65/**\r
66 Get SMBIOS record length.\r
67\r
68 @param SmbiosTable SMBIOS pointer.\r
69\r
70**/\r
71UINTN\r
72SmbiosTableLength (\r
ac0a286f 73 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
fb511817 74 )\r
75{\r
76 CHAR8 *AChar;\r
77 UINTN Length;\r
78\r
79 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
80\r
81 //\r
82 // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)\r
83 //\r
84 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
ac0a286f 85 AChar++;\r
fb511817 86 }\r
ac0a286f 87\r
fb511817 88 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
89\r
90 return Length;\r
91}\r
92\r
fb511817 93/**\r
94 Install all structures from the given SMBIOS structures block\r
95\r
a145e28d 96 @param TableAddress SMBIOS tables starting address\r
fb511817 97\r
98**/\r
99EFI_STATUS\r
100InstallAllStructures (\r
ac0a286f 101 IN UINT8 *TableAddress\r
fb511817 102 )\r
103{\r
4db37456 104 EFI_SMBIOS_PROTOCOL *Smbios;\r
fb511817 105 EFI_STATUS Status;\r
106 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
107 EFI_SMBIOS_HANDLE SmbiosHandle;\r
24256744 108 BOOLEAN NeedSmbiosType0;\r
fb511817 109\r
4db37456
LE
110 //\r
111 // Find the SMBIOS protocol\r
112 //\r
113 Status = gBS->LocateProtocol (\r
114 &gEfiSmbiosProtocolGuid,\r
115 NULL,\r
ac0a286f 116 (VOID **)&Smbios\r
4db37456
LE
117 );\r
118 if (EFI_ERROR (Status)) {\r
119 return Status;\r
120 }\r
121\r
a145e28d 122 SmbiosTable.Raw = TableAddress;\r
fb511817 123 if (SmbiosTable.Raw == NULL) {\r
124 return EFI_INVALID_PARAMETER;\r
125 }\r
126\r
24256744
GS
127 NeedSmbiosType0 = TRUE;\r
128\r
fb511817 129 while (SmbiosTable.Hdr->Type != 127) {\r
130 //\r
131 // Log the SMBIOS data for this structure\r
132 //\r
6b23d767 133 SmbiosHandle = SmbiosTable.Hdr->Handle;\r
ac0a286f
MK
134 Status = Smbios->Add (\r
135 Smbios,\r
136 NULL,\r
137 &SmbiosHandle,\r
138 (EFI_SMBIOS_TABLE_HEADER *)SmbiosTable.Raw\r
139 );\r
fb511817 140 ASSERT_EFI_ERROR (Status);\r
141\r
24256744
GS
142 if (SmbiosTable.Hdr->Type == 0) {\r
143 NeedSmbiosType0 = FALSE;\r
144 }\r
145\r
fb511817 146 //\r
147 // Get the next structure address\r
148 //\r
149 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
150 }\r
151\r
24256744
GS
152 if (NeedSmbiosType0) {\r
153 //\r
154 // Add OVMF default Type 0 (BIOS Information) table\r
155 //\r
156 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
ac0a286f
MK
157 Status = Smbios->Add (\r
158 Smbios,\r
159 NULL,\r
160 &SmbiosHandle,\r
161 (EFI_SMBIOS_TABLE_HEADER *)&mOvmfDefaultType0\r
162 );\r
24256744
GS
163 ASSERT_EFI_ERROR (Status);\r
164 }\r
165\r
fb511817 166 return EFI_SUCCESS;\r
167}\r