1 /** @file 2 SMBIOS Protocol as defined in PI1.2 Specification VOLUME 5 Standard. 3 4 SMBIOS protocol allows consumers to log SMBIOS data records, and enables the producer 5 to create the SMBIOS tables for a platform. 6 7 This protocol provides an interface to add, remove or discover SMBIOS records. The driver which 8 produces this protocol is responsible for creating the SMBIOS data tables and installing the pointer 9 to the tables in the EFI System Configuration Table. 10 The caller is responsible for only adding SMBIOS records that are valid for the SMBIOS 11 MajorVersion and MinorVersion. When an enumerated SMBIOS field's values are 12 controlled by the DMTF, new values can be used as soon as they are defined by the DMTF without 13 requiring an update to MajorVersion and MinorVersion. 14 The SMBIOS protocol can only be called a TPL < TPL_NOTIFY. 15 16 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> 17 This program and the accompanying materials 18 are licensed and made available under the terms and conditions of the BSD License 19 which accompanies this distribution. The full text of the license may be found at 20 http://opensource.org/licenses/bsd-license.php 21 22 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 23 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 24 25 **/ 26 27 #ifndef __SMBIOS_PROTOCOL_H__ 28 #define __SMBIOS_PROTOCOL_H__ 29 30 #define EFI_SMBIOS_PROTOCOL_GUID \ 31 { 0x3583ff6, 0xcb36, 0x4940, { 0x94, 0x7e, 0xb9, 0xb3, 0x9f, 0x4a, 0xfa, 0xf7 }} 32 33 // 34 // SMBIOS type macros which is according to SMBIOS 2.7 specification. 35 // 36 #define EFI_SMBIOS_TYPE_BIOS_INFORMATION 0 37 #define EFI_SMBIOS_TYPE_SYSTEM_INFORMATION 1 38 #define EFI_SMBIOS_TYPE_BASEBOARD_INFORMATION 2 39 #define EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE 3 40 #define EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION 4 41 #define EFI_SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION 5 42 #define EFI_SMBIOS_TYPE_MEMORY_MODULE_INFORMATON 6 43 #define EFI_SMBIOS_TYPE_CACHE_INFORMATION 7 44 #define EFI_SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION 8 45 #define EFI_SMBIOS_TYPE_SYSTEM_SLOTS 9 46 #define EFI_SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION 10 47 #define EFI_SMBIOS_TYPE_OEM_STRINGS 11 48 #define EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS 12 49 #define EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION 13 50 #define EFI_SMBIOS_TYPE_GROUP_ASSOCIATIONS 14 51 #define EFI_SMBIOS_TYPE_SYSTEM_EVENT_LOG 15 52 #define EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY 16 53 #define EFI_SMBIOS_TYPE_MEMORY_DEVICE 17 54 #define EFI_SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION 18 55 #define EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS 19 56 #define EFI_SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS 20 57 #define EFI_SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE 21 58 #define EFI_SMBIOS_TYPE_PORTABLE_BATTERY 22 59 #define EFI_SMBIOS_TYPE_SYSTEM_RESET 23 60 #define EFI_SMBIOS_TYPE_HARDWARE_SECURITY 24 61 #define EFI_SMBIOS_TYPE_SYSTEM_POWER_CONTROLS 25 62 #define EFI_SMBIOS_TYPE_VOLTAGE_PROBE 26 63 #define EFI_SMBIOS_TYPE_COOLING_DEVICE 27 64 #define EFI_SMBIOS_TYPE_TEMPERATURE_PROBE 28 65 #define EFI_SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE 29 66 #define EFI_SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS 30 67 #define EFI_SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE 31 68 #define EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION 32 69 #define EFI_SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION 33 70 #define EFI_SMBIOS_TYPE_MANAGEMENT_DEVICE 34 71 #define EFI_SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT 35 72 #define EFI_SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA 36 73 #define EFI_SMBIOS_TYPE_MEMORY_CHANNEL 37 74 #define EFI_SMBIOS_TYPE_IPMI_DEVICE_INFORMATION 38 75 #define EFI_SMBIOS_TYPE_SYSTEM_POWER_SUPPLY 39 76 #define EFI_SMBIOS_TYPE_ADDITIONAL_INFORMATION 40 77 #define EFI_SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION 41 78 #define EFI_SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE 42 79 #define EFI_SMBIOS_TYPE_INACTIVE 126 80 #define EFI_SMBIOS_TYPE_END_OF_TABLE 127 81 #define EFI_SMBIOS_OEM_BEGIN 128 82 #define EFI_SMBIOS_OEM_END 255 83 84 /// 85 /// Text strings associated with a given SMBIOS structure are returned in the dmiStrucBuffer, appended directly after 86 /// the formatted portion of the structure. This method of returning string information eliminates the need for 87 /// application software to deal with pointers embedded in the SMBIOS structure. Each string is terminated with a null 88 /// (00h) BYTE and the set of strings is terminated with an additional null (00h) BYTE. When the formatted portion of 89 /// a SMBIOS structure references a string, it does so by specifying a non-zero string number within the structure's 90 /// string-set. For example, if a string field contains 02h, it references the second string following the formatted portion 91 /// of the SMBIOS structure. If a string field references no string, a null (0) is placed in that string field. If the 92 /// formatted portion of the structure contains string-reference fields and all the string fields are set to 0 (no string 93 /// references), the formatted section of the structure is followed by two null (00h) BYTES. 94 /// 95 typedef UINT8 EFI_SMBIOS_STRING; 96 97 /// 98 /// Types 0 through 127 (7Fh) are reserved for and defined by this 99 /// specification. Types 128 through 256 (80h to FFh) are available for system- and OEM-specific information. 100 /// 101 typedef UINT8 EFI_SMBIOS_TYPE; 102 103 /// 104 /// Specifies the structure's handle, a unique 16-bit number in the range 0 to 0FFFEh (for version 105 /// 2.0) or 0 to 0FEFFh (for version 2.1 and later). The handle can be used with the Get SMBIOS 106 /// Structure function to retrieve a specific structure; the handle numbers are not required to be 107 /// contiguous. For v2.1 and later, handle values in the range 0FF00h to 0FFFFh are reserved for 108 /// use by this specification. 109 /// If the system configuration changes, a previously assigned handle might no longer exist. 110 /// However once a handle has been assigned by the BIOS, the BIOS cannot re-assign that handle 111 /// number to another structure. 112 /// 113 typedef UINT16 EFI_SMBIOS_HANDLE; 114 115 typedef struct { 116 EFI_SMBIOS_TYPE Type; 117 UINT8 Length; 118 EFI_SMBIOS_HANDLE Handle; 119 } EFI_SMBIOS_TABLE_HEADER; 120 121 typedef struct _EFI_SMBIOS_PROTOCOL EFI_SMBIOS_PROTOCOL; 122 123 /** 124 Add an SMBIOS record. 125 126 This function allows any agent to add SMBIOS records. The caller is responsible for ensuring 127 Record is formatted in a way that matches the version of the SMBIOS specification as defined in 128 the MajorRevision and MinorRevision fields of the EFI_SMBIOS_PROTOCOL. 129 Record must follow the SMBIOS structure evolution and usage guidelines in the SMBIOS 130 specification. Record starts with the formatted area of the SMBIOS structure and the length is 131 defined by EFI_SMBIOS_TABLE_HEADER.Length. Each SMBIOS structure is terminated by a 132 double-null (0x0000), either directly following the formatted area (if no strings are present) or 133 directly following the last string. The number of optional strings is not defined by the formatted area, 134 but is fixed by the call to Add(). A string can be a place holder, but it must not be a NULL string as 135 two NULL strings look like the double-null that terminates the structure. 136 137 @param[in] This The EFI_SMBIOS_PROTOCOL instance. 138 @param[in] ProducerHandle The handle of the controller or driver associated with the SMBIOS information. NULL means no handle. 139 @param[in, out] SmbiosHandle On entry, the handle of the SMBIOS record to add. If FFFEh, then a unique handle 140 will be assigned to the SMBIOS record. If the SMBIOS handle is already in use, 141 EFI_ALREADY_STARTED is returned and the SMBIOS record is not updated. 142 @param[in] Record The data for the fixed portion of the SMBIOS record. The format of the record is 143 determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted 144 area is defined by EFI_SMBIOS_TABLE_HEADER.Length and either followed 145 by a double-null (0x0000) or a set of null terminated strings and a null. 146 147 @retval EFI_SUCCESS Record was added. 148 @retval EFI_OUT_OF_RESOURCES Record was not added. 149 @retval EFI_ALREADY_STARTED The SmbiosHandle passed in was already in use. 150 **/ 151 typedef 152 EFI_STATUS 153 (EFIAPI *EFI_SMBIOS_ADD)( 154 IN CONST EFI_SMBIOS_PROTOCOL *This, 155 IN EFI_HANDLE ProducerHandle OPTIONAL, 156 IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle, 157 IN EFI_SMBIOS_TABLE_HEADER *Record 158 ); 159 160 /** 161 Update the string associated with an existing SMBIOS record. 162 163 This function allows the update of specific SMBIOS strings. The number of valid strings for any 164 SMBIOS record is defined by how many strings were present when Add() was called. 165 166 @param[in] This The EFI_SMBIOS_PROTOCOL instance. 167 @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated. 168 @param[in] StringNumber The non-zero string number of the string to update. 169 @param[in] String Update the StringNumber string with String. 170 171 @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated. 172 @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. 173 @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports. 174 @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record. 175 **/ 176 typedef 177 EFI_STATUS 178 (EFIAPI *EFI_SMBIOS_UPDATE_STRING)( 179 IN CONST EFI_SMBIOS_PROTOCOL *This, 180 IN EFI_SMBIOS_HANDLE *SmbiosHandle, 181 IN UINTN *StringNumber, 182 IN CHAR8 *String 183 ); 184 185 /** 186 Remove an SMBIOS record. 187 188 This function removes an SMBIOS record using the handle specified by SmbiosHandle. 189 190 @param[in] This The EFI_SMBIOS_PROTOCOL instance. 191 @param[in] SmbiosHandle The handle of the SMBIOS record to remove. 192 193 @retval EFI_SUCCESS SMBIOS record was removed. 194 @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record. 195 **/ 196 typedef 197 EFI_STATUS 198 (EFIAPI *EFI_SMBIOS_REMOVE)( 199 IN CONST EFI_SMBIOS_PROTOCOL *This, 200 IN EFI_SMBIOS_HANDLE SmbiosHandle 201 ); 202 203 /** 204 Allow the caller to discover all or some of the SMBIOS records. 205 206 This function allows all of the SMBIOS records to be discovered. It's possible to find 207 only the SMBIOS records that match the optional Type argument. 208 209 @param[in] This The EFI_SMBIOS_PROTOCOL instance. 210 @param[in, out] SmbiosHandle On entry, points to the previous handle of the SMBIOS record. On exit, points to the 211 next SMBIOS record handle. If it is FFFEh on entry, then the first SMBIOS record 212 handle will be returned. If it returns FFFEh on exit, then there are no more SMBIOS records. 213 @param[in] Type On entry, it points to the type of the next SMBIOS record to return. If NULL, it 214 indicates that the next record of any type will be returned. Type is not 215 modified by the this function. 216 @param[out] Record On exit, points to a pointer to the the SMBIOS Record consisting of the formatted area 217 followed by the unformatted area. The unformatted area optionally contains text strings. 218 @param[out] ProducerHandle On exit, points to the ProducerHandle registered by Add(). If no 219 ProducerHandle was passed into Add() NULL is returned. If a NULL pointer is 220 passed in no data will be returned. 221 @retval EFI_SUCCESS SMBIOS record information was successfully returned in Record. 222 SmbiosHandle is the handle of the current SMBIOS record 223 @retval EFI_NOT_FOUND The SMBIOS record with SmbiosHandle was the last available record. 224 **/ 225 typedef 226 EFI_STATUS 227 (EFIAPI *EFI_SMBIOS_GET_NEXT)( 228 IN CONST EFI_SMBIOS_PROTOCOL *This, 229 IN OUT EFI_SMBIOS_HANDLE *SmbiosHandle, 230 IN EFI_SMBIOS_TYPE *Type OPTIONAL, 231 OUT EFI_SMBIOS_TABLE_HEADER **Record, 232 OUT EFI_HANDLE *ProducerHandle OPTIONAL 233 ); 234 235 struct _EFI_SMBIOS_PROTOCOL { 236 EFI_SMBIOS_ADD Add; 237 EFI_SMBIOS_UPDATE_STRING UpdateString; 238 EFI_SMBIOS_REMOVE Remove; 239 EFI_SMBIOS_GET_NEXT GetNext; 240 UINT8 MajorVersion; ///< The major revision of the SMBIOS specification supported. 241 UINT8 MinorVersion; ///< The minor revision of the SMBIOS specification supported. 242 }; 243 244 extern EFI_GUID gEfiSmbiosProtocolGuid; 245 246 #endif // __SMBIOS_PROTOCOL_H__ 247