| What: /sys/firmware/dmi/ | |
| Date: February 2011 | |
| Contact: Mike Waychison <mikew@google.com> | |
| Description: | |
| Many machines' firmware (x86 and ia64) export DMI / | |
| SMBIOS tables to the operating system. Getting at this | |
| information is often valuable to userland, especially in | |
| cases where there are OEM extensions used. | |
| The kernel itself does not rely on the majority of the | |
| information in these tables being correct. It equally | |
| cannot ensure that the data as exported to userland is | |
| without error either. | |
| DMI is structured as a large table of entries, where | |
| each entry has a common header indicating the type and | |
| length of the entry, as well as a firmware-provided | |
| 'handle' that is supposed to be unique amongst all | |
| entries. | |
| Some entries are required by the specification, but many | |
| others are optional. In general though, users should | |
| never expect to find a specific entry type on their | |
| system unless they know for certain what their firmware | |
| is doing. Machine to machine experiences will vary. | |
| Multiple entries of the same type are allowed. In order | |
| to handle these duplicate entry types, each entry is | |
| assigned by the operating system an 'instance', which is | |
| derived from an entry type's ordinal position. That is | |
| to say, if there are 'N' multiple entries with the same type | |
| 'T' in the DMI tables (adjacent or spread apart, it | |
| doesn't matter), they will be represented in sysfs as | |
| entries "T-0" through "T-(N-1)": | |
| Example entry directories: | |
| /sys/firmware/dmi/entries/17-0 | |
| /sys/firmware/dmi/entries/17-1 | |
| /sys/firmware/dmi/entries/17-2 | |
| /sys/firmware/dmi/entries/17-3 | |
| ... | |
| Instance numbers are used in lieu of the firmware | |
| assigned entry handles as the kernel itself makes no | |
| guarantees that handles as exported are unique, and | |
| there are likely firmware images that get this wrong in | |
| the wild. | |
| Each DMI entry in sysfs has the common header values | |
| exported as attributes: | |
| handle : The 16bit 'handle' that is assigned to this | |
| entry by the firmware. This handle may be | |
| referred to by other entries. | |
| length : The length of the entry, as presented in the | |
| entry itself. Note that this is _not the | |
| total count of bytes associated with the | |
| entry_. This value represents the length of | |
| the "formatted" portion of the entry. This | |
| "formatted" region is sometimes followed by | |
| the "unformatted" region composed of nul | |
| terminated strings, with termination signalled | |
| by a two nul characters in series. | |
| raw : The raw bytes of the entry. This includes the | |
| "formatted" portion of the entry, the | |
| "unformatted" strings portion of the entry, | |
| and the two terminating nul characters. | |
| type : The type of the entry. This value is the same | |
| as found in the directory name. It indicates | |
| how the rest of the entry should be interpreted. | |
| instance: The instance ordinal of the entry for the | |
| given type. This value is the same as found | |
| in the parent directory name. | |
| position: The ordinal position (zero-based) of the entry | |
| within the entirety of the DMI entry table. | |
| === Entry Specialization === | |
| Some entry types may have other information available in | |
| sysfs. Not all types are specialized. | |
| --- Type 15 - System Event Log --- | |
| This entry allows the firmware to export a log of | |
| events the system has taken. This information is | |
| typically backed by nvram, but the implementation | |
| details are abstracted by this table. This entry's data | |
| is exported in the directory: | |
| /sys/firmware/dmi/entries/15-0/system_event_log | |
| and has the following attributes (documented in the | |
| SMBIOS / DMI specification under "System Event Log (Type 15)": | |
| area_length | |
| header_start_offset | |
| data_start_offset | |
| access_method | |
| status | |
| change_token | |
| access_method_address | |
| header_format | |
| per_log_type_descriptor_length | |
| type_descriptors_supported_count | |
| As well, the kernel exports the binary attribute: | |
| raw_event_log : The raw binary bits of the event log | |
| as described by the DMI entry. |