elog: Support logging S0ix sleep/wake info in elog

1. Add support for new GSMI commands to log S0ix entry/exit
information in elog.
2. In case of resume, provide callbacks to allow platform and
mainboard to log any wake source information.

BUG=b:67874513

Change-Id: I593e8a9e31cad720ac1f77aab447a0dbdbe9a28b
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://review.coreboot.org/22079
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Furquan Shaikh 2017-10-14 18:12:25 -07:00 committed by Furquan Shaikh
parent f36ed21c57
commit 2dc5eadccc
2 changed files with 41 additions and 0 deletions

View File

@ -25,6 +25,8 @@
#define GSMI_CMD_SET_EVENT_LOG 0x08 #define GSMI_CMD_SET_EVENT_LOG 0x08
#define GSMI_CMD_CLEAR_EVENT_LOG 0x09 #define GSMI_CMD_CLEAR_EVENT_LOG 0x09
#define GSMI_CMD_LOG_S0IX_SUSPEND 0x0a
#define GSMI_CMD_LOG_S0IX_RESUME 0x0b
#define GSMI_CMD_HANDSHAKE_TYPE 0xc1 #define GSMI_CMD_HANDSHAKE_TYPE 0xc1
#define GSMI_HANDSHAKE_NONE 0x7f #define GSMI_HANDSHAKE_NONE 0x7f
@ -46,6 +48,16 @@ struct gsmi_clear_eventlog_param {
u32 data_type; u32 data_type;
} __packed; } __packed;
void __attribute__((weak)) elog_gsmi_cb_platform_log_wake_source(void)
{
/* Default weak implementation, does nothing. */
}
void __attribute__((weak)) elog_gsmi_cb_mainboard_log_wake_source(void)
{
/* Default weak implementation, does nothing. */
}
/* Param is usually EBX, ret in EAX */ /* Param is usually EBX, ret in EAX */
u32 gsmi_exec(u8 command, u32 *param) u32 gsmi_exec(u8 command, u32 *param)
{ {
@ -105,6 +117,19 @@ u32 gsmi_exec(u8 command, u32 *param)
ret = GSMI_RET_SUCCESS; ret = GSMI_RET_SUCCESS;
break; break;
case GSMI_CMD_LOG_S0IX_SUSPEND:
case GSMI_CMD_LOG_S0IX_RESUME:
ret = GSMI_RET_SUCCESS;
if (command == GSMI_CMD_LOG_S0IX_SUSPEND)
elog_add_event(ELOG_TYPE_S0IX_ENTER);
else {
elog_add_event(ELOG_TYPE_S0IX_EXIT);
elog_gsmi_cb_platform_log_wake_source();
elog_gsmi_cb_mainboard_log_wake_source();
}
break;
default: default:
printk(BIOS_DEBUG, "GSMI Unknown: 0x%02x\n", command); printk(BIOS_DEBUG, "GSMI Unknown: 0x%02x\n", command);
break; break;

View File

@ -215,6 +215,10 @@ struct elog_event_mem_cache_update {
#define ELOG_EC_DEVICE_EVENT_DSP 0x02 #define ELOG_EC_DEVICE_EVENT_DSP 0x02
#define ELOG_EC_DEVICE_EVENT_WIFI 0x03 #define ELOG_EC_DEVICE_EVENT_WIFI 0x03
/* S0ix sleep/wake */
#define ELOG_TYPE_S0IX_ENTER 0xaf
#define ELOG_TYPE_S0IX_EXIT 0xb0
#if IS_ENABLED(CONFIG_ELOG) #if IS_ENABLED(CONFIG_ELOG)
/* Eventlog backing storage must be initialized before calling elog_init(). */ /* Eventlog backing storage must be initialized before calling elog_init(). */
extern int elog_init(void); extern int elog_init(void);
@ -249,4 +253,16 @@ extern u32 gsmi_exec(u8 command, u32 *param);
u32 boot_count_read(void); u32 boot_count_read(void);
u32 boot_count_increment(void); u32 boot_count_increment(void);
/*
* Callback from GSMI handler to allow platform to log any wake source
* information.
*/
void elog_gsmi_cb_platform_log_wake_source(void);
/*
* Callback from GSMI handler to allow mainboard to log any wake source
* information.
*/
void elog_gsmi_cb_mainboard_log_wake_source(void);
#endif /* ELOG_H_ */ #endif /* ELOG_H_ */