Home | History | Annotate | Download | only in gpxe
      1 #ifndef _GPXE_SMBIOS_H
      2 #define _GPXE_SMBIOS_H
      3 
      4 /** @file
      5  *
      6  * System Management BIOS
      7  *
      8  */
      9 
     10 FILE_LICENCE ( GPL2_OR_LATER );
     11 
     12 #include <stdint.h>
     13 #include <gpxe/api.h>
     14 #include <config/general.h>
     15 #include <gpxe/uaccess.h>
     16 
     17 /**
     18  * Provide an SMBIOS API implementation
     19  *
     20  * @v _prefix		Subsystem prefix
     21  * @v _api_func		API function
     22  * @v _func		Implementing function
     23  */
     24 #define PROVIDE_SMBIOS( _subsys, _api_func, _func ) \
     25 	PROVIDE_SINGLE_API ( SMBIOS_PREFIX_ ## _subsys, _api_func, _func )
     26 
     27 /* Include all architecture-independent SMBIOS API headers */
     28 #include <gpxe/efi/efi_smbios.h>
     29 
     30 /* Include all architecture-dependent SMBIOS API headers */
     31 #include <bits/smbios.h>
     32 
     33 /** Signature for SMBIOS entry point */
     34 #define SMBIOS_SIGNATURE \
     35         ( ( '_' << 0 ) + ( 'S' << 8 ) + ( 'M' << 16 ) + ( '_' << 24 ) )
     36 
     37 /**
     38  * SMBIOS entry point
     39  *
     40  * This is the single table which describes the list of SMBIOS
     41  * structures.  It is located by scanning through the BIOS segment.
     42  */
     43 struct smbios_entry {
     44 	/** Signature
     45 	 *
     46 	 * Must be equal to SMBIOS_SIGNATURE
     47 	 */
     48 	uint32_t signature;
     49 	/** Checksum */
     50 	uint8_t checksum;
     51 	/** Length */
     52 	uint8_t len;
     53 	/** Major version */
     54 	uint8_t major;
     55 	/** Minor version */
     56 	uint8_t minor;
     57 	/** Maximum structure size */
     58 	uint16_t max;
     59 	/** Entry point revision */
     60 	uint8_t revision;
     61 	/** Formatted area */
     62 	uint8_t formatted[5];
     63 	/** DMI Signature */
     64 	uint8_t dmi_signature[5];
     65 	/** DMI checksum */
     66 	uint8_t dmi_checksum;
     67 	/** Structure table length */
     68 	uint16_t smbios_len;
     69 	/** Structure table address */
     70 	uint32_t smbios_address;
     71 	/** Number of SMBIOS structures */
     72 	uint16_t smbios_count;
     73 	/** BCD revision */
     74 	uint8_t bcd_revision;
     75 } __attribute__ (( packed ));
     76 
     77 /** An SMBIOS structure header */
     78 struct smbios_header {
     79 	/** Type */
     80 	uint8_t type;
     81 	/** Length */
     82 	uint8_t len;
     83 	/** Handle */
     84 	uint16_t handle;
     85 } __attribute__ (( packed ));
     86 
     87 /** SMBIOS structure descriptor */
     88 struct smbios_structure {
     89 	/** Copy of SMBIOS structure header */
     90 	struct smbios_header header;
     91 	/** Offset of structure within SMBIOS */
     92 	size_t offset;
     93 	/** Length of strings section */
     94 	size_t strings_len;
     95 };
     96 
     97 /** SMBIOS system information structure */
     98 struct smbios_system_information {
     99 	/** SMBIOS structure header */
    100 	struct smbios_header header;
    101 	/** Manufacturer string */
    102 	uint8_t manufacturer;
    103 	/** Product string */
    104 	uint8_t product;
    105 	/** Version string */
    106 	uint8_t version;
    107 	/** Serial number string */
    108 	uint8_t serial;
    109 	/** UUID */
    110 	uint8_t uuid[16];
    111 	/** Wake-up type */
    112 	uint8_t wakeup;
    113 } __attribute__ (( packed ));
    114 
    115 /** SMBIOS system information structure type */
    116 #define SMBIOS_TYPE_SYSTEM_INFORMATION 1
    117 
    118 /** SMBIOS enclosure information structure */
    119 struct smbios_enclosure_information {
    120 	/** SMBIOS structure header */
    121 	struct smbios_header header;
    122 	/** Manufacturer string */
    123 	uint8_t manufacturer;
    124 	/** Type string */
    125 	uint8_t type;
    126 	/** Version string */
    127 	uint8_t version;
    128 	/** Serial number string */
    129 	uint8_t serial;
    130 	/** Asset tag */
    131 	uint8_t asset_tag;
    132 } __attribute__ (( packed ));
    133 
    134 /** SMBIOS enclosure information structure type */
    135 #define SMBIOS_TYPE_ENCLOSURE_INFORMATION 3
    136 
    137 /**
    138  * SMBIOS entry point descriptor
    139  *
    140  * This contains the information from the SMBIOS entry point that we
    141  * care about.
    142  */
    143 struct smbios {
    144 	/** Start of SMBIOS structures */
    145 	userptr_t address;
    146 	/** Length of SMBIOS structures */
    147 	size_t len;
    148 	/** Number of SMBIOS structures */
    149 	unsigned int count;
    150 };
    151 
    152 extern int find_smbios ( struct smbios *smbios );
    153 extern int find_smbios_structure ( unsigned int type,
    154 				   struct smbios_structure *structure );
    155 extern int read_smbios_structure ( struct smbios_structure *structure,
    156 				   void *data, size_t len );
    157 extern int read_smbios_string ( struct smbios_structure *structure,
    158 				unsigned int index,
    159 				void *data, size_t len );
    160 
    161 #endif /* _GPXE_SMBIOS_H */
    162