2013-02-15 12:41:22 +04:00
# include <acpi/apei.h>
# include <acpi/hed.h>
/*
* One struct ghes is created for each generic hardware error source .
* It provides the context for APEI hardware error timer / IRQ / SCI / NMI
* handler .
*
* estatus : memory buffer for error status block , allocated during
* HEST parsing .
*/
# define GHES_TO_CLEAR 0x0001
# define GHES_EXITING 0x0002
struct ghes {
struct acpi_hest_generic * generic ;
struct acpi_hest_generic_status * estatus ;
u64 buffer_paddr ;
unsigned long flags ;
union {
struct list_head list ;
struct timer_list timer ;
unsigned int irq ;
} ;
} ;
struct ghes_estatus_node {
struct llist_node llnode ;
struct acpi_hest_generic * generic ;
2013-02-15 13:10:39 +04:00
struct ghes * ghes ;
2013-02-15 12:41:22 +04:00
} ;
struct ghes_estatus_cache {
u32 estatus_len ;
atomic_t count ;
struct acpi_hest_generic * generic ;
unsigned long long time_in ;
struct rcu_head rcu ;
} ;
enum {
GHES_SEV_NO = 0x0 ,
GHES_SEV_CORRECTED = 0x1 ,
GHES_SEV_RECOVERABLE = 0x2 ,
GHES_SEV_PANIC = 0x3 ,
} ;
2013-02-15 13:10:39 +04:00
/* From drivers/edac/ghes_edac.c */
# ifdef CONFIG_EDAC_GHES
void ghes_edac_report_mem_error ( struct ghes * ghes , int sev ,
struct cper_sec_mem_err * mem_err ) ;
int ghes_edac_register ( struct ghes * ghes , struct device * dev ) ;
void ghes_edac_unregister ( struct ghes * ghes ) ;
# else
static inline void ghes_edac_report_mem_error ( struct ghes * ghes , int sev ,
struct cper_sec_mem_err * mem_err )
{
}
static inline int ghes_edac_register ( struct ghes * ghes , struct device * dev )
{
return 0 ;
}
static inline void ghes_edac_unregister ( struct ghes * ghes )
{
}
# endif