]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
DynamicTablesPkg: Change complex DEBUG_CODE() to DEBUG_CODE_BEGIN/END()
[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
27 SMBIOS_TABLE_TYPE0 Base;\r
5f239ef7 28 UINT8 Strings[sizeof(TYPE0_STRINGS)];\r
24256744
GS
29} OVMF_TYPE0;\r
30#pragma pack()\r
31\r
32STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = {\r
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
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
44 { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics\r
45 0, // Reserved :2\r
46 0, // Unknown :1\r
47 1, // BiosCharacteristicsNotSupported :1\r
48 // Remaining BiosCharacteristics bits left unset :60\r
49 },\r
50 { // BIOSCharacteristicsExtensionBytes[2]\r
51 0, // BiosReserved\r
52 0x1C // SystemReserved = VirtualMachineSupported |\r
53 // UefiSpecificationSupported |\r
54 // TargetContentDistributionEnabled\r
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
fb511817 66/**\r
67 Get SMBIOS record length.\r
68\r
69 @param SmbiosTable SMBIOS pointer.\r
70\r
71**/\r
72UINTN\r
73SmbiosTableLength (\r
74 IN SMBIOS_STRUCTURE_POINTER SmbiosTable\r
75 )\r
76{\r
77 CHAR8 *AChar;\r
78 UINTN Length;\r
79\r
80 AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);\r
81\r
82 //\r
83 // Each structure shall be terminated by a double-null (SMBIOS spec.7.1)\r
84 //\r
85 while ((*AChar != 0) || (*(AChar + 1) != 0)) {\r
86 AChar ++;\r
87 }\r
88 Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);\r
89\r
90 return Length;\r
91}\r
92\r
93\r
94/**\r
95 Install all structures from the given SMBIOS structures block\r
96\r
a145e28d 97 @param TableAddress SMBIOS tables starting address\r
fb511817 98\r
99**/\r
100EFI_STATUS\r
101InstallAllStructures (\r
a145e28d 102 IN UINT8 *TableAddress\r
fb511817 103 )\r
104{\r
4db37456 105 EFI_SMBIOS_PROTOCOL *Smbios;\r
fb511817 106 EFI_STATUS Status;\r
107 SMBIOS_STRUCTURE_POINTER SmbiosTable;\r
108 EFI_SMBIOS_HANDLE SmbiosHandle;\r
24256744 109 BOOLEAN NeedSmbiosType0;\r
fb511817 110\r
4db37456
LE
111 //\r
112 // Find the SMBIOS protocol\r
113 //\r
114 Status = gBS->LocateProtocol (\r
115 &gEfiSmbiosProtocolGuid,\r
116 NULL,\r
117 (VOID**)&Smbios\r
118 );\r
119 if (EFI_ERROR (Status)) {\r
120 return Status;\r
121 }\r
122\r
a145e28d 123 SmbiosTable.Raw = TableAddress;\r
fb511817 124 if (SmbiosTable.Raw == NULL) {\r
125 return EFI_INVALID_PARAMETER;\r
126 }\r
127\r
24256744
GS
128 NeedSmbiosType0 = TRUE;\r
129\r
fb511817 130 while (SmbiosTable.Hdr->Type != 127) {\r
131 //\r
132 // Log the SMBIOS data for this structure\r
133 //\r
6b23d767 134 SmbiosHandle = SmbiosTable.Hdr->Handle;\r
fb511817 135 Status = Smbios->Add (\r
136 Smbios,\r
137 NULL,\r
138 &SmbiosHandle,\r
139 (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw\r
140 );\r
141 ASSERT_EFI_ERROR (Status);\r
142\r
24256744
GS
143 if (SmbiosTable.Hdr->Type == 0) {\r
144 NeedSmbiosType0 = FALSE;\r
145 }\r
146\r
fb511817 147 //\r
148 // Get the next structure address\r
149 //\r
150 SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));\r
151 }\r
152\r
24256744
GS
153 if (NeedSmbiosType0) {\r
154 //\r
155 // Add OVMF default Type 0 (BIOS Information) table\r
156 //\r
157 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
158 Status = Smbios->Add (\r
159 Smbios,\r
160 NULL,\r
161 &SmbiosHandle,\r
162 (EFI_SMBIOS_TABLE_HEADER*) &mOvmfDefaultType0\r
163 );\r
164 ASSERT_EFI_ERROR (Status);\r
165 }\r
166\r
fb511817 167 return EFI_SUCCESS;\r
168}\r