summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2012-09-01 14:00:23 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2012-11-08 19:39:32 +0100
commit5c88c6f2d797b7fbcbf844a79356fcc833eb5338 (patch)
tree04c12ec91fdc7fe383f242dd9e785b7b6f5477e4 /src
parent3beb6db6dda7795639d2bb8ec1a1aa3106a4c301 (diff)
downloadcoreboot-5c88c6f2d797b7fbcbf844a79356fcc833eb5338.tar.xz
elog: add extended management engine event
We are seeing ME disabled and ME error events on some devices and this extended info can help with debug. Also fix a potential issue where if the log does manage to get completely full it will never try to shrink it because the only call to shrink the log happens after a successful event write. Add a check at elog init time to shrink the log size. Change-Id: Ib81dc231f6a004b341900374e6c07962cc292031 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: http://review.coreboot.org/1739 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r--src/drivers/elog/elog.c4
-rw-r--r--src/include/elog.h10
-rw-r--r--src/southbridge/intel/bd82x6x/me.c28
-rw-r--r--src/southbridge/intel/bd82x6x/me_8.x.c41
4 files changed, 59 insertions, 24 deletions
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c
index 7be443a375..748adafcf3 100644
--- a/src/drivers/elog/elog.c
+++ b/src/drivers/elog/elog.c
@@ -803,6 +803,10 @@ int elog_init(void)
elog_add_event_word(ELOG_TYPE_LOG_CLEAR,
elog_get_flash()->total_size);
+ /* Shrink the log if we are getting too full */
+ if (elog_get_mem()->next_event_offset >= CONFIG_ELOG_FULL_THRESHOLD)
+ elog_shrink();
+
#if CONFIG_ELOG_BOOT_COUNT && !defined(__SMM__)
/* Log boot count event except in S3 resume */
if (acpi_slp_type != 3)
diff --git a/src/include/elog.h b/src/include/elog.h
index 52a74edcae..fa9a05ca7c 100644
--- a/src/include/elog.h
+++ b/src/include/elog.h
@@ -108,6 +108,16 @@ struct elog_event_data_wake {
/* Management Engine Events */
#define ELOG_TYPE_MANAGEMENT_ENGINE 0xa2
+#define ELOG_TYPE_MANAGEMENT_ENGINE_EXT 0xa4
+struct elog_event_data_me_extended {
+ u8 current_working_state;
+ u8 operation_state;
+ u8 operation_mode;
+ u8 error_code;
+ u8 progress_code;
+ u8 current_pmevent;
+ u8 current_state;
+} __attribute__ ((packed));
/* Last post code from previous boot */
#define ELOG_TYPE_LAST_POST_CODE 0xa3
diff --git a/src/southbridge/intel/bd82x6x/me.c b/src/southbridge/intel/bd82x6x/me.c
index 3b7f3428bc..b9aff37d5c 100644
--- a/src/southbridge/intel/bd82x6x/me.c
+++ b/src/southbridge/intel/bd82x6x/me.c
@@ -568,10 +568,6 @@ static me_bios_path intel_me_path(device_t dev)
/* Check and dump status */
intel_me_status(&hfs, &gmes);
- /* Check for valid firmware */
- if (hfs.fpt_bad)
- return ME_ERROR_BIOS_PATH;
-
/* Check Current Working State */
switch (hfs.working_state) {
case ME_HFS_CWS_NORMAL:
@@ -598,10 +594,27 @@ static me_bios_path intel_me_path(device_t dev)
break;
}
- /* Check for any error code */
- if (hfs.error_code)
+ /* Check for any error code and valid firmware */
+ if (hfs.error_code || hfs.fpt_bad)
path = ME_ERROR_BIOS_PATH;
+#if CONFIG_ELOG
+ if (path != ME_NORMAL_BIOS_PATH) {
+ struct elog_event_data_me_extended data = {
+ .current_working_state = hfs.working_state,
+ .operation_state = hfs.operation_state,
+ .operation_mode = hfs.operation_mode,
+ .error_code = hfs.error_code,
+ .progress_code = gmes.progress_code,
+ .current_pmevent = gmes.current_pmevent,
+ .current_state = gmes.current_state,
+ };
+ elog_add_event_byte(ELOG_TYPE_MANAGEMENT_ENGINE, path);
+ elog_add_event_raw(ELOG_TYPE_MANAGEMENT_ENGINE_EXT,
+ &data, sizeof(data));
+ }
+#endif
+
return path;
}
@@ -728,9 +741,6 @@ static void intel_me_init(device_t dev)
case ME_RECOVERY_BIOS_PATH:
case ME_DISABLE_BIOS_PATH:
case ME_FIRMWARE_UPDATE_BIOS_PATH:
-#if CONFIG_ELOG
- elog_add_event_byte(ELOG_TYPE_MANAGEMENT_ENGINE, path);
-#endif
break;
}
}
diff --git a/src/southbridge/intel/bd82x6x/me_8.x.c b/src/southbridge/intel/bd82x6x/me_8.x.c
index 9461d61cdf..b71f7ea12f 100644
--- a/src/southbridge/intel/bd82x6x/me_8.x.c
+++ b/src/southbridge/intel/bd82x6x/me_8.x.c
@@ -549,20 +549,10 @@ static me_bios_path intel_me_path(device_t dev)
/* Check and dump status */
intel_me_status(&hfs, &gmes);
- /* Check for valid firmware */
- if (hfs.fpt_bad)
- return ME_ERROR_BIOS_PATH;
-
/* Check Current Working State */
switch (hfs.working_state) {
case ME_HFS_CWS_NORMAL:
path = ME_NORMAL_BIOS_PATH;
- /* check if the MBP is ready */
- if (!gmes.mbp_rdy) {
- printk(BIOS_CRIT, "%s: mbp is not ready!\n",
- __FUNCTION__);
- return ME_ERROR_BIOS_PATH;
- }
break;
case ME_HFS_CWS_REC:
path = ME_RECOVERY_BIOS_PATH;
@@ -585,10 +575,34 @@ static me_bios_path intel_me_path(device_t dev)
break;
}
- /* Check for any error code */
- if (hfs.error_code)
+ /* Check for any error code and valid firmware and MBP */
+ if (hfs.error_code || hfs.fpt_bad)
path = ME_ERROR_BIOS_PATH;
+ /* Check if the MBP is ready */
+ if (!gmes.mbp_rdy) {
+ printk(BIOS_CRIT, "%s: mbp is not ready!\n",
+ __FUNCTION__);
+ path = ME_ERROR_BIOS_PATH;
+ }
+
+#if CONFIG_ELOG
+ if (path != ME_NORMAL_BIOS_PATH) {
+ struct elog_event_data_me_extended data = {
+ .current_working_state = hfs.working_state,
+ .operation_state = hfs.operation_state,
+ .operation_mode = hfs.operation_mode,
+ .error_code = hfs.error_code,
+ .progress_code = gmes.progress_code,
+ .current_pmevent = gmes.current_pmevent,
+ .current_state = gmes.current_state,
+ };
+ elog_add_event_byte(ELOG_TYPE_MANAGEMENT_ENGINE, path);
+ elog_add_event_raw(ELOG_TYPE_MANAGEMENT_ENGINE_EXT,
+ &data, sizeof(data));
+ }
+#endif
+
return path;
}
@@ -731,9 +745,6 @@ static void intel_me_init(device_t dev)
case ME_RECOVERY_BIOS_PATH:
case ME_DISABLE_BIOS_PATH:
case ME_FIRMWARE_UPDATE_BIOS_PATH:
-#if CONFIG_ELOG
- elog_add_event_byte(ELOG_TYPE_MANAGEMENT_ENGINE, path);
-#endif
break;
}
}