98e5e1bf72
x86 and ia64 can acquire extra hardware identification information from DMI and print it along with task dumps; however, the usage isn't consistent. * x86 show_regs() collects vendor, product and board strings and print them out with PID, comm and utsname. Some of the information is printed again later in the same dump. * warn_slowpath_common() explicitly accesses the DMI board and prints it out with "Hardware name:" label. This applies to both x86 and ia64 but is irrelevant on all other archs. * ia64 doesn't show DMI information on other non-WARN dumps. This patch introduces arch-specific hardware description used by dump_stack(). It can be set by calling dump_stack_set_arch_desc() during boot and, if exists, printed out in a separate line with "Hardware name:" label. dmi_set_dump_stack_arch_desc() is added which sets arch-specific description from DMI data. It uses dmi_ids_string[] which is set from dmi_present() used for DMI debug message. It is superset of the information x86 show_regs() is using. The function is called from x86 and ia64 boot code right after dmi_scan_machine(). This makes the explicit DMI handling in warn_slowpath_common() unnecessary. Removed. show_regs() isn't yet converted to use generic debug information printing and this patch doesn't remove the duplicate DMI handling in x86 show_regs(). The next patch will unify show_regs() handling and remove the duplication. An example WARN dump follows. WARNING: at kernel/workqueue.c:4841 init_workqueues+0x35/0x505() Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.9.0-rc1-work+ #3 Hardware name: empty empty/S3992, BIOS 080011 10/26/2007 0000000000000009 ffff88007c861e08 ffffffff81c614dc ffff88007c861e48 ffffffff8108f500 ffffffff82228240 0000000000000040 ffffffff8234a08e 0000000000000000 0000000000000000 0000000000000000 ffff88007c861e58 Call Trace: [<ffffffff81c614dc>] dump_stack+0x19/0x1b [<ffffffff8108f500>] warn_slowpath_common+0x70/0xa0 [<ffffffff8108f54a>] warn_slowpath_null+0x1a/0x20 [<ffffffff8234a0c3>] init_workqueues+0x35/0x505 ... v2: Use the same string as the debug message from dmi_present() which also contains BIOS information. Move hardware name into its own line as warn_slowpath_common() did. This change was suggested by Bjorn Helgaas. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: David S. Miller <davem@davemloft.net> Cc: Fengguang Wu <fengguang.wu@intel.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Jesper Nilsson <jesper.nilsson@axis.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Mike Frysinger <vapier@gentoo.org> Cc: Vineet Gupta <vgupta@synopsys.com> Cc: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
141 lines
3.7 KiB
C
141 lines
3.7 KiB
C
#ifndef __DMI_H__
|
|
#define __DMI_H__
|
|
|
|
#include <linux/list.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,
|
|
};
|
|
|
|
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_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_INACTIVE = 126,
|
|
DMI_ENTRY_END_OF_TABLE = 127,
|
|
};
|
|
|
|
struct dmi_header {
|
|
u8 type;
|
|
u8 length;
|
|
u16 handle;
|
|
};
|
|
|
|
struct dmi_device {
|
|
struct list_head list;
|
|
int type;
|
|
const char *name;
|
|
void *device_data; /* Type specific data */
|
|
};
|
|
|
|
#ifdef CONFIG_DMI
|
|
|
|
struct dmi_dev_onboard {
|
|
struct dmi_device dev;
|
|
int instance;
|
|
int segment;
|
|
int bus;
|
|
int devfn;
|
|
};
|
|
|
|
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_scan_machine(void);
|
|
extern void dmi_set_dump_stack_arch_desc(void);
|
|
extern bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp);
|
|
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);
|
|
|
|
#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_scan_machine(void) { return; }
|
|
static inline void dmi_set_dump_stack_arch_desc(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_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 -1; }
|
|
static inline bool dmi_match(enum dmi_field f, const char *str)
|
|
{ return false; }
|
|
static inline const struct dmi_system_id *
|
|
dmi_first_match(const struct dmi_system_id *list) { return NULL; }
|
|
|
|
#endif
|
|
|
|
#endif /* __DMI_H__ */
|