1 #include <acpi/apei.h> 2 #include <acpi/hed.h> 3 4 /* 5 * One struct ghes is created for each generic hardware error source. 6 * It provides the context for APEI hardware error timer/IRQ/SCI/NMI 7 * handler. 8 * 9 * estatus: memory buffer for error status block, allocated during 10 * HEST parsing. 11 */ 12 #define GHES_TO_CLEAR 0x0001 13 #define GHES_EXITING 0x0002 14 15 struct ghes { 16 struct acpi_hest_generic *generic; 17 struct acpi_generic_status *estatus; 18 u64 buffer_paddr; 19 unsigned long flags; 20 union { 21 struct list_head list; 22 struct timer_list timer; 23 unsigned int irq; 24 }; 25 }; 26 27 struct ghes_estatus_node { 28 struct llist_node llnode; 29 struct acpi_hest_generic *generic; 30 struct ghes *ghes; 31 }; 32 33 struct ghes_estatus_cache { 34 u32 estatus_len; 35 atomic_t count; 36 struct acpi_hest_generic *generic; 37 unsigned long long time_in; 38 struct rcu_head rcu; 39 }; 40 41 enum { 42 GHES_SEV_NO = 0x0, 43 GHES_SEV_CORRECTED = 0x1, 44 GHES_SEV_RECOVERABLE = 0x2, 45 GHES_SEV_PANIC = 0x3, 46 }; 47 48 /* From drivers/edac/ghes_edac.c */ 49 50 #ifdef CONFIG_EDAC_GHES 51 void ghes_edac_report_mem_error(struct ghes *ghes, int sev, 52 struct cper_sec_mem_err *mem_err); 53 54 int ghes_edac_register(struct ghes *ghes, struct device *dev); 55 56 void ghes_edac_unregister(struct ghes *ghes); 57 58 #else 59 static inline void ghes_edac_report_mem_error(struct ghes *ghes, int sev, 60 struct cper_sec_mem_err *mem_err) 61 { 62 } 63 64 static inline int ghes_edac_register(struct ghes *ghes, struct device *dev) 65 { 66 return 0; 67 } 68 69 static inline void ghes_edac_unregister(struct ghes *ghes) 70 { 71 } 72 #endif 73