Home | History | Annotate | Download | only in Protocol
      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