148 lines
3.6 KiB
C
148 lines
3.6 KiB
C
#ifndef _ASM_X86_MCE_H
|
|
#define _ASM_X86_MCE_H
|
|
|
|
#include <uapi/asm/mce.h>
|
|
|
|
|
|
struct mca_config {
|
|
bool dont_log_ce;
|
|
bool cmci_disabled;
|
|
bool ignore_ce;
|
|
bool disabled;
|
|
bool ser;
|
|
bool bios_cmci_threshold;
|
|
u8 banks;
|
|
s8 bootlog;
|
|
int tolerant;
|
|
int monarch_timeout;
|
|
int panic_timeout;
|
|
u32 rip_msr;
|
|
};
|
|
|
|
extern struct mca_config mca_cfg;
|
|
extern void mce_register_decode_chain(struct notifier_block *nb);
|
|
extern void mce_unregister_decode_chain(struct notifier_block *nb);
|
|
|
|
#include <linux/percpu.h>
|
|
#include <linux/init.h>
|
|
#include <linux/atomic.h>
|
|
|
|
extern int mce_p5_enabled;
|
|
|
|
#ifdef CONFIG_X86_MCE
|
|
int mcheck_init(void);
|
|
void mcheck_cpu_init(struct cpuinfo_x86 *c);
|
|
#else
|
|
static inline int mcheck_init(void) { return 0; }
|
|
static inline void mcheck_cpu_init(struct cpuinfo_x86 *c) {}
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_ANCIENT_MCE
|
|
void intel_p5_mcheck_init(struct cpuinfo_x86 *c);
|
|
void winchip_mcheck_init(struct cpuinfo_x86 *c);
|
|
static inline void enable_p5_mce(void) { mce_p5_enabled = 1; }
|
|
#else
|
|
static inline void intel_p5_mcheck_init(struct cpuinfo_x86 *c) {}
|
|
static inline void winchip_mcheck_init(struct cpuinfo_x86 *c) {}
|
|
static inline void enable_p5_mce(void) {}
|
|
#endif
|
|
|
|
void mce_setup(struct mce *m);
|
|
void mce_log(struct mce *m);
|
|
DECLARE_PER_CPU(struct device *, mce_device);
|
|
|
|
/*
|
|
* Maximum banks number.
|
|
* This is the limit of the current register layout on
|
|
* Intel CPUs.
|
|
*/
|
|
#define MAX_NR_BANKS 32
|
|
|
|
#ifdef CONFIG_X86_MCE_INTEL
|
|
void mce_intel_feature_init(struct cpuinfo_x86 *c);
|
|
void cmci_clear(void);
|
|
void cmci_reenable(void);
|
|
void cmci_rediscover(int dying);
|
|
void cmci_recheck(void);
|
|
#else
|
|
static inline void mce_intel_feature_init(struct cpuinfo_x86 *c) { }
|
|
static inline void cmci_clear(void) {}
|
|
static inline void cmci_reenable(void) {}
|
|
static inline void cmci_rediscover(int dying) {}
|
|
static inline void cmci_recheck(void) {}
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_MCE_AMD
|
|
void mce_amd_feature_init(struct cpuinfo_x86 *c);
|
|
#else
|
|
static inline void mce_amd_feature_init(struct cpuinfo_x86 *c) { }
|
|
#endif
|
|
|
|
int mce_available(struct cpuinfo_x86 *c);
|
|
|
|
DECLARE_PER_CPU(unsigned, mce_exception_count);
|
|
DECLARE_PER_CPU(unsigned, mce_poll_count);
|
|
|
|
extern atomic_t mce_entry;
|
|
|
|
typedef DECLARE_BITMAP(mce_banks_t, MAX_NR_BANKS);
|
|
DECLARE_PER_CPU(mce_banks_t, mce_poll_banks);
|
|
|
|
enum mcp_flags {
|
|
MCP_TIMESTAMP = (1 << 0), /* log time stamp */
|
|
MCP_UC = (1 << 1), /* log uncorrected errors */
|
|
MCP_DONTLOG = (1 << 2), /* only clear, don't log */
|
|
};
|
|
void machine_check_poll(enum mcp_flags flags, mce_banks_t *b);
|
|
|
|
int mce_notify_irq(void);
|
|
void mce_notify_process(void);
|
|
|
|
DECLARE_PER_CPU(struct mce, injectm);
|
|
|
|
extern void register_mce_write_callback(ssize_t (*)(struct file *filp,
|
|
const char __user *ubuf,
|
|
size_t usize, loff_t *off));
|
|
|
|
/*
|
|
* Exception handler
|
|
*/
|
|
|
|
/* Call the installed machine check handler for this CPU setup. */
|
|
extern void (*machine_check_vector)(struct pt_regs *, long error_code);
|
|
void do_machine_check(struct pt_regs *, long);
|
|
|
|
/*
|
|
* Threshold handler
|
|
*/
|
|
|
|
extern void (*mce_threshold_vector)(void);
|
|
extern void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu);
|
|
|
|
/*
|
|
* Thermal handler
|
|
*/
|
|
|
|
void intel_init_thermal(struct cpuinfo_x86 *c);
|
|
|
|
void mce_log_therm_throt_event(__u64 status);
|
|
|
|
/* Interrupt Handler for core thermal thresholds */
|
|
extern int (*platform_thermal_notify)(__u64 msr_val);
|
|
|
|
#ifdef CONFIG_X86_THERMAL_VECTOR
|
|
extern void mcheck_intel_therm_init(void);
|
|
#else
|
|
static inline void mcheck_intel_therm_init(void) { }
|
|
#endif
|
|
|
|
/*
|
|
* Used by APEI to report memory error via /dev/mcelog
|
|
*/
|
|
|
|
struct cper_sec_mem_err;
|
|
extern void apei_mce_report_mem_error(int corrected,
|
|
struct cper_sec_mem_err *mem_err);
|
|
|
|
#endif /* _ASM_X86_MCE_H */
|