mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-05 09:57:21 +02:00
bc91133e26
Type 40 entries (Additional Information) are summarized in section 7.41 as part of the SMBIOS specification. Generally, these entries aren't interesting to save. However on some AMD Zen systems, the AGESA version is stored here. This is useful to save to the kernel message logs for debugging. It can be used to cross-reference issues. Implement an iterator for the Additional Information entries. Use this to find and print the AGESA string. Do so in AMD code, since the use case is AMD-specific. [ bp: Match only "AGESA". ] Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com> Co-developed-by: "Mario Limonciello (AMD)" <superm1@kernel.org> Signed-off-by: "Mario Limonciello (AMD)" <superm1@kernel.org> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Jean Delvare <jdelvare@suse.de> Link: https://patch.msgid.link/20260307141024.819807-6-superm1@kernel.org
178 lines
4.8 KiB
C
178 lines
4.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __DMI_H__
|
|
#define __DMI_H__
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/kobject.h>
|
|
#include <linux/mod_devicetable.h>
|
|
|
|
/* enum dmi_field is in mod_devicetable.h */
|
|
|
|
enum dmi_device_type {
|
|
DMI_DEV_TYPE_ANY = 0,
|
|
DMI_DEV_TYPE_OTHER,
|
|
DMI_DEV_TYPE_UNKNOWN,
|
|
DMI_DEV_TYPE_VIDEO,
|
|
DMI_DEV_TYPE_SCSI,
|
|
DMI_DEV_TYPE_ETHERNET,
|
|
DMI_DEV_TYPE_TOKENRING,
|
|
DMI_DEV_TYPE_SOUND,
|
|
DMI_DEV_TYPE_PATA,
|
|
DMI_DEV_TYPE_SATA,
|
|
DMI_DEV_TYPE_SAS,
|
|
DMI_DEV_TYPE_IPMI = -1,
|
|
DMI_DEV_TYPE_OEM_STRING = -2,
|
|
DMI_DEV_TYPE_DEV_ONBOARD = -3,
|
|
DMI_DEV_TYPE_DEV_SLOT = -4,
|
|
};
|
|
|
|
enum dmi_entry_type {
|
|
DMI_ENTRY_BIOS = 0,
|
|
DMI_ENTRY_SYSTEM,
|
|
DMI_ENTRY_BASEBOARD,
|
|
DMI_ENTRY_CHASSIS,
|
|
DMI_ENTRY_PROCESSOR,
|
|
DMI_ENTRY_MEM_CONTROLLER,
|
|
DMI_ENTRY_MEM_MODULE,
|
|
DMI_ENTRY_CACHE,
|
|
DMI_ENTRY_PORT_CONNECTOR,
|
|
DMI_ENTRY_SYSTEM_SLOT,
|
|
DMI_ENTRY_ONBOARD_DEVICE,
|
|
DMI_ENTRY_OEMSTRINGS,
|
|
DMI_ENTRY_SYSCONF,
|
|
DMI_ENTRY_BIOS_LANG,
|
|
DMI_ENTRY_GROUP_ASSOC,
|
|
DMI_ENTRY_SYSTEM_EVENT_LOG,
|
|
DMI_ENTRY_PHYS_MEM_ARRAY,
|
|
DMI_ENTRY_MEM_DEVICE,
|
|
DMI_ENTRY_32_MEM_ERROR,
|
|
DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR,
|
|
DMI_ENTRY_MEM_DEV_MAPPED_ADDR,
|
|
DMI_ENTRY_BUILTIN_POINTING_DEV,
|
|
DMI_ENTRY_PORTABLE_BATTERY,
|
|
DMI_ENTRY_SYSTEM_RESET,
|
|
DMI_ENTRY_HW_SECURITY,
|
|
DMI_ENTRY_SYSTEM_POWER_CONTROLS,
|
|
DMI_ENTRY_VOLTAGE_PROBE,
|
|
DMI_ENTRY_COOLING_DEV,
|
|
DMI_ENTRY_TEMP_PROBE,
|
|
DMI_ENTRY_ELECTRICAL_CURRENT_PROBE,
|
|
DMI_ENTRY_OOB_REMOTE_ACCESS,
|
|
DMI_ENTRY_BIS_ENTRY,
|
|
DMI_ENTRY_SYSTEM_BOOT,
|
|
DMI_ENTRY_64_MEM_ERROR,
|
|
DMI_ENTRY_MGMT_DEV,
|
|
DMI_ENTRY_MGMT_DEV_COMPONENT,
|
|
DMI_ENTRY_MGMT_DEV_THRES,
|
|
DMI_ENTRY_MEM_CHANNEL,
|
|
DMI_ENTRY_IPMI_DEV,
|
|
DMI_ENTRY_SYS_POWER_SUPPLY,
|
|
DMI_ENTRY_ADDITIONAL,
|
|
DMI_ENTRY_ONBOARD_DEV_EXT,
|
|
DMI_ENTRY_MGMT_CONTROLLER_HOST,
|
|
DMI_ENTRY_TPM_DEVICE,
|
|
DMI_ENTRY_PROCESSOR_ADDITIONAL,
|
|
DMI_ENTRY_FIRMWARE_INVENTORY,
|
|
DMI_ENTRY_STRING_PROPERTY,
|
|
DMI_ENTRY_INACTIVE = 126,
|
|
DMI_ENTRY_END_OF_TABLE = 127,
|
|
};
|
|
|
|
struct dmi_header {
|
|
u8 type;
|
|
u8 length;
|
|
u16 handle;
|
|
} __packed;
|
|
|
|
struct dmi_device {
|
|
struct list_head list;
|
|
int type;
|
|
const char *name;
|
|
void *device_data; /* Type specific data */
|
|
};
|
|
|
|
#define DMI_A_INFO_ENT_MIN_SIZE 0x6
|
|
struct dmi_a_info_entry {
|
|
u8 length;
|
|
u16 handle;
|
|
u8 offset;
|
|
u8 str_num;
|
|
u8 value[];
|
|
} __packed;
|
|
|
|
#define DMI_A_INFO_MIN_SIZE 0xB
|
|
struct dmi_a_info {
|
|
struct dmi_header header;
|
|
u8 count;
|
|
} __packed;
|
|
|
|
#ifdef CONFIG_DMI
|
|
|
|
struct dmi_dev_onboard {
|
|
struct dmi_device dev;
|
|
int instance;
|
|
int segment;
|
|
int bus;
|
|
int devfn;
|
|
};
|
|
|
|
extern struct kobject *dmi_kobj;
|
|
extern int dmi_check_system(const struct dmi_system_id *list);
|
|
const struct dmi_system_id *dmi_first_match(const struct dmi_system_id *list);
|
|
extern const char * dmi_get_system_info(int field);
|
|
extern const struct dmi_device * dmi_find_device(int type, const char *name,
|
|
const struct dmi_device *from);
|
|
extern void dmi_setup(void);
|
|
extern bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp);
|
|
extern int dmi_get_bios_year(void);
|
|
extern int dmi_name_in_vendors(const char *str);
|
|
extern int dmi_name_in_serial(const char *str);
|
|
extern int dmi_available;
|
|
extern int dmi_walk(void (*decode)(const struct dmi_header *, void *),
|
|
void *private_data);
|
|
extern bool dmi_match(enum dmi_field f, const char *str);
|
|
extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
|
|
extern u64 dmi_memdev_size(u16 handle);
|
|
extern u8 dmi_memdev_type(u16 handle);
|
|
extern u16 dmi_memdev_handle(int slot);
|
|
const char *dmi_string_nosave(const struct dmi_header *dm, u8 s);
|
|
|
|
#else
|
|
|
|
static inline int dmi_check_system(const struct dmi_system_id *list) { return 0; }
|
|
static inline const char * dmi_get_system_info(int field) { return NULL; }
|
|
static inline const struct dmi_device * dmi_find_device(int type, const char *name,
|
|
const struct dmi_device *from) { return NULL; }
|
|
static inline void dmi_setup(void) { }
|
|
static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
|
|
{
|
|
if (yearp)
|
|
*yearp = 0;
|
|
if (monthp)
|
|
*monthp = 0;
|
|
if (dayp)
|
|
*dayp = 0;
|
|
return false;
|
|
}
|
|
static inline int dmi_get_bios_year(void) { return -ENXIO; }
|
|
static inline int dmi_name_in_vendors(const char *s) { return 0; }
|
|
static inline int dmi_name_in_serial(const char *s) { return 0; }
|
|
#define dmi_available 0
|
|
static inline int dmi_walk(void (*decode)(const struct dmi_header *, void *),
|
|
void *private_data) { return -ENXIO; }
|
|
static inline bool dmi_match(enum dmi_field f, const char *str)
|
|
{ return false; }
|
|
static inline void dmi_memdev_name(u16 handle, const char **bank,
|
|
const char **device) { }
|
|
static inline u64 dmi_memdev_size(u16 handle) { return ~0ul; }
|
|
static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
|
|
static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
|
|
static inline const struct dmi_system_id *
|
|
dmi_first_match(const struct dmi_system_id *list) { return NULL; }
|
|
static inline const char *
|
|
dmi_string_nosave(const struct dmi_header *dm, u8 s) { return ""; }
|
|
|
|
#endif
|
|
|
|
#endif /* __DMI_H__ */
|