Home | History | Annotate | Download | only in include
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Copyright (C) 2015, Bin Meng <bmeng.cn (at) gmail.com>
      4  *
      5  * Adapted from coreboot src/include/smbios.h
      6  */
      7 
      8 #ifndef _SMBIOS_H_
      9 #define _SMBIOS_H_
     10 
     11 /* SMBIOS spec version implemented */
     12 #define SMBIOS_MAJOR_VER	3
     13 #define SMBIOS_MINOR_VER	0
     14 
     15 /* SMBIOS structure types */
     16 enum {
     17 	SMBIOS_BIOS_INFORMATION = 0,
     18 	SMBIOS_SYSTEM_INFORMATION = 1,
     19 	SMBIOS_BOARD_INFORMATION = 2,
     20 	SMBIOS_SYSTEM_ENCLOSURE = 3,
     21 	SMBIOS_PROCESSOR_INFORMATION = 4,
     22 	SMBIOS_CACHE_INFORMATION = 7,
     23 	SMBIOS_SYSTEM_SLOTS = 9,
     24 	SMBIOS_PHYS_MEMORY_ARRAY = 16,
     25 	SMBIOS_MEMORY_DEVICE = 17,
     26 	SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS = 19,
     27 	SMBIOS_SYSTEM_BOOT_INFORMATION = 32,
     28 	SMBIOS_END_OF_TABLE = 127
     29 };
     30 
     31 #define SMBIOS_INTERMEDIATE_OFFSET	16
     32 #define SMBIOS_STRUCT_EOS_BYTES		2
     33 
     34 struct __packed smbios_entry {
     35 	u8 anchor[4];
     36 	u8 checksum;
     37 	u8 length;
     38 	u8 major_ver;
     39 	u8 minor_ver;
     40 	u16 max_struct_size;
     41 	u8 entry_point_rev;
     42 	u8 formatted_area[5];
     43 	u8 intermediate_anchor[5];
     44 	u8 intermediate_checksum;
     45 	u16 struct_table_length;
     46 	u32 struct_table_address;
     47 	u16 struct_count;
     48 	u8 bcd_rev;
     49 };
     50 
     51 /* BIOS characteristics */
     52 #define BIOS_CHARACTERISTICS_PCI_SUPPORTED	(1 << 7)
     53 #define BIOS_CHARACTERISTICS_UPGRADEABLE	(1 << 11)
     54 #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT	(1 << 16)
     55 
     56 #define BIOS_CHARACTERISTICS_EXT1_ACPI		(1 << 0)
     57 #define BIOS_CHARACTERISTICS_EXT1_UEFI		(1 << 3)
     58 #define BIOS_CHARACTERISTICS_EXT2_TARGET	(1 << 2)
     59 
     60 struct __packed smbios_type0 {
     61 	u8 type;
     62 	u8 length;
     63 	u16 handle;
     64 	u8 vendor;
     65 	u8 bios_ver;
     66 	u16 bios_start_segment;
     67 	u8 bios_release_date;
     68 	u8 bios_rom_size;
     69 	u64 bios_characteristics;
     70 	u8 bios_characteristics_ext1;
     71 	u8 bios_characteristics_ext2;
     72 	u8 bios_major_release;
     73 	u8 bios_minor_release;
     74 	u8 ec_major_release;
     75 	u8 ec_minor_release;
     76 	char eos[SMBIOS_STRUCT_EOS_BYTES];
     77 };
     78 
     79 struct __packed smbios_type1 {
     80 	u8 type;
     81 	u8 length;
     82 	u16 handle;
     83 	u8 manufacturer;
     84 	u8 product_name;
     85 	u8 version;
     86 	u8 serial_number;
     87 	u8 uuid[16];
     88 	u8 wakeup_type;
     89 	u8 sku_number;
     90 	u8 family;
     91 	char eos[SMBIOS_STRUCT_EOS_BYTES];
     92 };
     93 
     94 #define SMBIOS_BOARD_FEATURE_HOSTING	(1 << 0)
     95 #define SMBIOS_BOARD_MOTHERBOARD	10
     96 
     97 struct __packed smbios_type2 {
     98 	u8 type;
     99 	u8 length;
    100 	u16 handle;
    101 	u8 manufacturer;
    102 	u8 product_name;
    103 	u8 version;
    104 	u8 serial_number;
    105 	u8 asset_tag_number;
    106 	u8 feature_flags;
    107 	u8 chassis_location;
    108 	u16 chassis_handle;
    109 	u8 board_type;
    110 	char eos[SMBIOS_STRUCT_EOS_BYTES];
    111 };
    112 
    113 #define SMBIOS_ENCLOSURE_DESKTOP	3
    114 #define SMBIOS_STATE_SAFE		3
    115 #define SMBIOS_SECURITY_NONE		3
    116 
    117 struct __packed smbios_type3 {
    118 	u8 type;
    119 	u8 length;
    120 	u16 handle;
    121 	u8 manufacturer;
    122 	u8 chassis_type;
    123 	u8 version;
    124 	u8 serial_number;
    125 	u8 asset_tag_number;
    126 	u8 bootup_state;
    127 	u8 power_supply_state;
    128 	u8 thermal_state;
    129 	u8 security_status;
    130 	u32 oem_defined;
    131 	u8 height;
    132 	u8 number_of_power_cords;
    133 	u8 element_count;
    134 	u8 element_record_length;
    135 	char eos[SMBIOS_STRUCT_EOS_BYTES];
    136 };
    137 
    138 #define SMBIOS_PROCESSOR_TYPE_CENTRAL	3
    139 #define SMBIOS_PROCESSOR_STATUS_ENABLED	1
    140 #define SMBIOS_PROCESSOR_UPGRADE_NONE	6
    141 
    142 #define SMBIOS_PROCESSOR_FAMILY_OTHER	1
    143 #define SMBIOS_PROCESSOR_FAMILY_UNKNOWN	2
    144 
    145 struct __packed smbios_type4 {
    146 	u8 type;
    147 	u8 length;
    148 	u16 handle;
    149 	u8 socket_designation;
    150 	u8 processor_type;
    151 	u8 processor_family;
    152 	u8 processor_manufacturer;
    153 	u32 processor_id[2];
    154 	u8 processor_version;
    155 	u8 voltage;
    156 	u16 external_clock;
    157 	u16 max_speed;
    158 	u16 current_speed;
    159 	u8 status;
    160 	u8 processor_upgrade;
    161 	u16 l1_cache_handle;
    162 	u16 l2_cache_handle;
    163 	u16 l3_cache_handle;
    164 	u8 serial_number;
    165 	u8 asset_tag;
    166 	u8 part_number;
    167 	u8 core_count;
    168 	u8 core_enabled;
    169 	u8 thread_count;
    170 	u16 processor_characteristics;
    171 	u16 processor_family2;
    172 	u16 core_count2;
    173 	u16 core_enabled2;
    174 	u16 thread_count2;
    175 	char eos[SMBIOS_STRUCT_EOS_BYTES];
    176 };
    177 
    178 struct __packed smbios_type32 {
    179 	u8 type;
    180 	u8 length;
    181 	u16 handle;
    182 	u8 reserved[6];
    183 	u8 boot_status;
    184 	u8 eos[SMBIOS_STRUCT_EOS_BYTES];
    185 };
    186 
    187 struct __packed smbios_type127 {
    188 	u8 type;
    189 	u8 length;
    190 	u16 handle;
    191 	u8 eos[SMBIOS_STRUCT_EOS_BYTES];
    192 };
    193 
    194 struct __packed smbios_header {
    195 	u8 type;
    196 	u8 length;
    197 	u16 handle;
    198 };
    199 
    200 /**
    201  * fill_smbios_header() - Fill the header of an SMBIOS table
    202  *
    203  * This fills the header of an SMBIOS table structure.
    204  *
    205  * @table:	start address of the structure
    206  * @type:	the type of structure
    207  * @length:	the length of the formatted area of the structure
    208  * @handle:	the structure's handle, a unique 16-bit number
    209  */
    210 static inline void fill_smbios_header(void *table, int type,
    211 				      int length, int handle)
    212 {
    213 	struct smbios_header *header = table;
    214 
    215 	header->type = type;
    216 	header->length = length - SMBIOS_STRUCT_EOS_BYTES;
    217 	header->handle = handle;
    218 }
    219 
    220 /**
    221  * Function prototype to write a specific type of SMBIOS structure
    222  *
    223  * @addr:	start address to write the structure
    224  * @handle:	the structure's handle, a unique 16-bit number
    225  * @return:	size of the structure
    226  */
    227 typedef int (*smbios_write_type)(ulong *addr, int handle);
    228 
    229 /**
    230  * write_smbios_table() - Write SMBIOS table
    231  *
    232  * This writes SMBIOS table at a given address.
    233  *
    234  * @addr:	start address to write SMBIOS table. If this is not
    235  *	16-byte-aligned then it will be aligned before the table is written
    236  * @return:	end address of SMBIOS table (and start address for next entry)
    237  */
    238 ulong write_smbios_table(ulong addr);
    239 
    240 #endif /* _SMBIOS_H_ */
    241