uboot/include/smbios.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Copyright (C) 2015, Bin Meng <bmeng.cn@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 */
  16enum {
  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
  34struct __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
  60struct __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
  79struct __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
  97struct __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
 117struct __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
 145struct __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
 178struct __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
 187struct __packed smbios_type127 {
 188        u8 type;
 189        u8 length;
 190        u16 handle;
 191        u8 eos[SMBIOS_STRUCT_EOS_BYTES];
 192};
 193
 194struct __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 */
 210static 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 */
 227typedef 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 */
 238ulong write_smbios_table(ulong addr);
 239
 240#endif /* _SMBIOS_H_ */
 241