2010-05-18 10:35:13 +04:00
/*
* apei . h - ACPI Platform Error Interface
*/
# ifndef ACPI_APEI_H
# define ACPI_APEI_H
2010-05-18 10:35:21 +04:00
# include <linux/acpi.h>
# include <linux/cper.h>
# include <asm/ioctls.h>
# define APEI_ERST_INVALID_RECORD_ID 0xffffffffffffffffULL
# define APEI_ERST_CLEAR_RECORD _IOW('E', 1, u64)
# define APEI_ERST_GET_RECORD_COUNT _IOR('E', 2, u32)
# ifdef __KERNEL__
2012-01-13 03:02:20 +04:00
extern bool hest_disable ;
2010-05-18 10:35:21 +04:00
extern int erst_disable ;
2011-07-17 02:14:21 +04:00
# ifdef CONFIG_ACPI_APEI_GHES
2012-01-13 03:02:20 +04:00
extern bool ghes_disable ;
2011-07-17 02:14:21 +04:00
# else
# define ghes_disable 1
# endif
2010-05-18 10:35:13 +04:00
2011-01-07 02:55:09 +03:00
# ifdef CONFIG_ACPI_APEI
void __init acpi_hest_init ( void ) ;
# else
static inline void acpi_hest_init ( void ) { return ; }
# endif
2010-05-18 10:35:13 +04:00
typedef int ( * apei_hest_func_t ) ( struct acpi_hest_header * hest_hdr , void * data ) ;
int apei_hest_parse ( apei_hest_func_t func , void * data ) ;
2010-05-18 10:35:21 +04:00
int erst_write ( const struct cper_record_header * record ) ;
ssize_t erst_get_record_count ( void ) ;
ACPI, APEI, Add ERST record ID cache
APEI ERST firmware interface and implementation has no multiple users
in mind. For example, if there is four records in storage with ID: 1,
2, 3 and 4, if two ERST readers enumerate the records via
GET_NEXT_RECORD_ID as follow,
reader 1 reader 2
1
2
3
4
-1
-1
where -1 signals there is no more record ID.
Reader 1 has no chance to check record 2 and 4, while reader 2 has no
chance to check record 1 and 3. And any other GET_NEXT_RECORD_ID will
return -1, that is, other readers will has no chance to check any
record even they are not cleared by anyone.
This makes raw GET_NEXT_RECORD_ID not suitable for used by multiple
users.
To solve the issue, an in-memory ERST record ID cache is designed and
implemented. When enumerating record ID, the ID returned by
GET_NEXT_RECORD_ID is added into cache in addition to be returned to
caller. So other readers can check the cache to get all record ID
available.
Signed-off-by: Huang Ying <ying.huang@intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
2011-02-21 08:54:41 +03:00
int erst_get_record_id_begin ( int * pos ) ;
int erst_get_record_id_next ( int * pos , u64 * record_id ) ;
void erst_get_record_id_end ( void ) ;
2010-05-18 10:35:21 +04:00
ssize_t erst_read ( u64 record_id , struct cper_record_header * record ,
size_t buflen ) ;
int erst_clear ( u64 record_id ) ;
2014-07-22 13:20:11 +04:00
int arch_apei_enable_cmcff ( struct acpi_hest_header * hest_hdr , void * data ) ;
void arch_apei_report_mem_error ( int sev , struct cper_sec_mem_err * mem_err ) ;
2014-07-22 13:20:13 +04:00
void arch_apei_flush_tlb_one ( unsigned long addr ) ;
2014-07-22 13:20:11 +04:00
2010-05-18 10:35:21 +04:00
# endif
2010-05-18 10:35:13 +04:00
# endif