summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/drivers/elog/elog.c11
-rw-r--r--src/include/elog.h18
2 files changed, 28 insertions, 1 deletions
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c
index 6fc4053a4f..d3c01c2d58 100644
--- a/src/drivers/elog/elog.c
+++ b/src/drivers/elog/elog.c
@@ -933,6 +933,17 @@ int elog_add_event_wake(u8 source, u32 instance)
return elog_add_event_raw(ELOG_TYPE_WAKE_SOURCE, &wake, sizeof(wake));
}
+int elog_add_extended_event(u8 type, u32 complement)
+{
+ struct elog_event_extended_event event = {
+ .event_type = type,
+ .event_complement = complement
+ };
+ return elog_add_event_raw(ELOG_TYPE_EXTENDED_EVENT,
+ &event,
+ sizeof(event));
+}
+
/* Make sure elog_init() runs at least once to log System Boot event. */
static void elog_bs_init(void *unused) { elog_init(); }
BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_ENTRY, elog_bs_init, NULL);
diff --git a/src/include/elog.h b/src/include/elog.h
index 0776c36b7d..b64953c48b 100644
--- a/src/include/elog.h
+++ b/src/include/elog.h
@@ -115,7 +115,11 @@
/* Sleep/Wake */
#define ELOG_TYPE_ACPI_ENTER 0x9d
-/* Deep Sx wake variant is provided below - 0xad */
+/*
+ * Deep Sx wake variant is provided below - 0xad
+ * Sleep/"wake pending" event log provided below - 0xb1 - 0x01/0x02
+ */
+
#define ELOG_TYPE_ACPI_WAKE 0x9e
#define ELOG_TYPE_WAKE_SOURCE 0x9f
#define ELOG_WAKE_SOURCE_PCIE 0x00
@@ -219,6 +223,16 @@ struct elog_event_mem_cache_update {
#define ELOG_TYPE_S0IX_ENTER 0xaf
#define ELOG_TYPE_S0IX_EXIT 0xb0
+/* Extended events */
+#define ELOG_TYPE_EXTENDED_EVENT 0xb1
+#define ELOG_SLEEP_PENDING_PM1_WAKE 0x01
+#define ELOG_SLEEP_PENDING_GPE0_WAKE 0x02
+
+struct elog_event_extended_event {
+ u8 event_type;
+ u32 event_complement;
+} __packed;
+
#if IS_ENABLED(CONFIG_ELOG)
/* Eventlog backing storage must be initialized before calling elog_init(). */
extern int elog_init(void);
@@ -231,6 +245,7 @@ extern int elog_add_event_word(u8 event_type, u16 data);
extern int elog_add_event_dword(u8 event_type, u32 data);
extern int elog_add_event_wake(u8 source, u32 instance);
extern int elog_smbios_write_type15(unsigned long *current, int handle);
+extern int elog_add_extended_event(u8 type, u32 complement);
#else
/* Stubs to help avoid littering sources with #if CONFIG_ELOG */
static inline int elog_init(void) { return -1; }
@@ -246,6 +261,7 @@ static inline int elog_smbios_write_type15(unsigned long *current,
int handle) {
return 0;
}
+static inline int elog_add_extended_event(u8 type, u32 complement) { return 0; }
#endif
extern u32 gsmi_exec(u8 command, u32 *param);