mce-internal.h 3.1 KB
Newer Older
B
Borislav Petkov 已提交
1 2 3
#ifndef __X86_MCE_INTERNAL_H__
#define __X86_MCE_INTERNAL_H__

4
#include <linux/device.h>
5 6 7 8
#include <asm/mce.h>

enum severity_level {
	MCE_NO_SEVERITY,
9 10
	MCE_DEFERRED_SEVERITY,
	MCE_UCNA_SEVERITY = MCE_DEFERRED_SEVERITY,
A
Andi Kleen 已提交
11
	MCE_KEEP_SEVERITY,
12
	MCE_SOME_SEVERITY,
A
Andi Kleen 已提交
13
	MCE_AO_SEVERITY,
14
	MCE_UC_SEVERITY,
A
Andi Kleen 已提交
15
	MCE_AR_SEVERITY,
16 17 18
	MCE_PANIC_SEVERITY,
};

19
extern struct blocking_notifier_head x86_mce_decoder_chain;
20

21
#define ATTR_LEN		16
22
#define INITIAL_CHECK_INTERVAL	5 * 60 /* 5 minutes */
23 24 25 26 27

/* One object for each MCE bank, shared by all CPUs */
struct mce_bank {
	u64			ctl;			/* subevents to enable */
	unsigned char init;				/* initialise bank? */
28
	struct device_attribute attr;			/* device attribute */
29 30 31
	char			attrname[ATTR_LEN];	/* attribute name */
};

32 33 34 35 36
struct mce_evt_llist {
	struct llist_node llnode;
	struct mce mce;
};

37
void mce_gen_pool_process(struct work_struct *__unused);
38 39 40
bool mce_gen_pool_empty(void);
int mce_gen_pool_add(struct mce *mce);
int mce_gen_pool_init(void);
41
struct llist_node *mce_gen_pool_prepare_records(void);
42

43
extern int (*mce_severity)(struct mce *a, int tolerant, char **msg, bool is_excp);
44
struct dentry *mce_get_debugfs_dir(void);
A
Andi Kleen 已提交
45

46
extern struct mce_bank *mce_banks;
47
extern mce_banks_t mce_banks_ce_disabled;
48

C
Chen Gong 已提交
49
#ifdef CONFIG_X86_MCE_INTEL
50 51
unsigned long cmci_intel_adjust_timer(unsigned long interval);
bool mce_intel_cmci_poll(void);
C
Chen Gong 已提交
52
void mce_intel_hcpu_update(unsigned long cpu);
53
void cmci_disable_bank(int bank);
C
Chen Gong 已提交
54
#else
55 56
# define cmci_intel_adjust_timer mce_adjust_timer_default
static inline bool mce_intel_cmci_poll(void) { return false; }
C
Chen Gong 已提交
57
static inline void mce_intel_hcpu_update(unsigned long cpu) { }
58
static inline void cmci_disable_bank(int bank) { }
C
Chen Gong 已提交
59 60 61 62
#endif

void mce_timer_kick(unsigned long interval);

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
#ifdef CONFIG_ACPI_APEI
int apei_write_mce(struct mce *m);
ssize_t apei_read_mce(struct mce *m, u64 *record_id);
int apei_check_mce(void);
int apei_clear_mce(u64 record_id);
#else
static inline int apei_write_mce(struct mce *m)
{
	return -EINVAL;
}
static inline ssize_t apei_read_mce(struct mce *m, u64 *record_id)
{
	return 0;
}
static inline int apei_check_mce(void)
{
	return 0;
}
static inline int apei_clear_mce(u64 record_id)
{
	return -EINVAL;
}
#endif
86 87

void mce_inject_log(struct mce *m);
88 89 90 91 92 93 94 95 96 97 98 99 100 101

/*
 * We consider records to be equivalent if bank+status+addr+misc all match.
 * This is only used when the system is going down because of a fatal error
 * to avoid cluttering the console log with essentially repeated information.
 * In normal processing all errors seen are logged.
 */
static inline bool mce_cmp(struct mce *m1, struct mce *m2)
{
	return m1->bank != m2->bank ||
		m1->status != m2->status ||
		m1->addr != m2->addr ||
		m1->misc != m2->misc;
}
102 103 104 105

extern struct device_attribute dev_attr_trigger;

#ifdef CONFIG_X86_MCELOG_LEGACY
106 107 108
void mce_work_trigger(void);
void mce_register_injector_chain(struct notifier_block *nb);
void mce_unregister_injector_chain(struct notifier_block *nb);
109 110
#else
static inline void mce_work_trigger(void)	{ }
111 112
static inline void mce_register_injector_chain(struct notifier_block *nb)	{ }
static inline void mce_unregister_injector_chain(struct notifier_block *nb)	{ }
113
#endif
B
Borislav Petkov 已提交
114 115 116 117

extern struct mca_config mca_cfg;

#endif /* __X86_MCE_INTERNAL_H__ */