Add support for changes in recovery mode

1. Add new recovery reasons:
  - 0x5F: Recovery hash space lock error in RO firmware
  - 0xC4: Request to reboot in recovery, train memory and reboot back.
2. Update slot type for MRC cache update in recovery mode.
3. Add new EC event for recovery mode trigger with memory retraining.

BUG=chrome-os-partner:59355
BRANCH=None
TEST=Verified output of mosys on reef:
12 | 2016-11-11 11:47:33 | EC Event | Power Button
13 | 2016-11-11 11:47:39 | Chrome OS Developer Mode
14 | 2016-11-11 11:47:40 | Memory Cache Update | Normal | Success
15 | 2016-11-11 11:51:56 | Kernel Event | Clean Shutdown
16 | 2016-11-11 11:52:05 | System boot | 296
17 | 2016-11-11 11:52:05 | Chrome OS Recovery Mode | User requested
recovery for training memory and rebooting
18 | 2016-11-11 11:52:05 | Chrome OS Developer Mode
19 | 2016-11-11 11:52:06 | Memory Cache Update | Recovery | Success
20 | 2016-11-11 11:52:22 | System boot | 297
21 | 2016-11-11 11:52:22 | Chrome OS Developer Mode
22 | 2016-11-11 11:52:22 | Memory Cache Update | Normal | Success
23 | 2016-11-11 12:01:58 | System boot | 298
24 | 2016-11-11 12:01:58 | Chrome OS Recovery Mode | Recovery Button
Pressed
25 | 2016-11-11 12:01:58 | Chrome OS Developer Mode
26 | 2016-11-11 12:01:58 | Memory Cache Update | Recovery | Success
27 | 2016-11-11 12:02:12 | System boot | 299

Change-Id: Ied22be88b1290a31eaa4a6a22a0a463e2c60e2b2
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/410183
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
diff --git a/include/lib/elog.h b/include/lib/elog.h
index 384c49f..5a1f8ae 100644
--- a/include/lib/elog.h
+++ b/include/lib/elog.h
@@ -111,30 +111,31 @@
 } __attribute__ ((packed));
 
 #define ELOG_TYPE_EC_EVENT                0x91
-#define EC_EVENT_LID_CLOSED                0x01
-#define EC_EVENT_LID_OPEN                  0x02
-#define EC_EVENT_POWER_BUTTON              0x03
-#define EC_EVENT_AC_CONNECTED              0x04
-#define EC_EVENT_AC_DISCONNECTED           0x05
-#define EC_EVENT_BATTERY_LOW               0x06
-#define EC_EVENT_BATTERY_CRITICAL          0x07
-#define EC_EVENT_BATTERY                   0x08
-#define EC_EVENT_THERMAL_THRESHOLD         0x09
-#define EC_EVENT_THERMAL_OVERLOAD          0x0a
-#define EC_EVENT_THERMAL                   0x0b
-#define EC_EVENT_USB_CHARGER               0x0c
-#define EC_EVENT_KEY_PRESSED               0x0d
-#define EC_EVENT_INTERFACE_READY           0x0e
-#define EC_EVENT_KEYBOARD_RECOVERY         0x0f
-#define EC_EVENT_THERMAL_SHUTDOWN          0x10
-#define EC_EVENT_BATTERY_SHUTDOWN          0x11
-#define EC_EVENT_THROTTLE_START            0x12
-#define EC_EVENT_THROTTLE_STOP             0x13
-#define EC_EVENT_HANG_DETECT               0x14
-#define EC_EVENT_HANG_REBOOT               0x15
-#define EC_EVENT_PD_MCU                    0x16
-#define EC_EVENT_BATTERY_STATUS            0x17
-#define EC_EVENT_PANIC                     0x18
+#define EC_EVENT_LID_CLOSED                  0x01
+#define EC_EVENT_LID_OPEN                    0x02
+#define EC_EVENT_POWER_BUTTON                0x03
+#define EC_EVENT_AC_CONNECTED                0x04
+#define EC_EVENT_AC_DISCONNECTED             0x05
+#define EC_EVENT_BATTERY_LOW                 0x06
+#define EC_EVENT_BATTERY_CRITICAL            0x07
+#define EC_EVENT_BATTERY                     0x08
+#define EC_EVENT_THERMAL_THRESHOLD           0x09
+#define EC_EVENT_THERMAL_OVERLOAD            0x0a
+#define EC_EVENT_THERMAL                     0x0b
+#define EC_EVENT_USB_CHARGER                 0x0c
+#define EC_EVENT_KEY_PRESSED                 0x0d
+#define EC_EVENT_INTERFACE_READY             0x0e
+#define EC_EVENT_KEYBOARD_RECOVERY           0x0f
+#define EC_EVENT_THERMAL_SHUTDOWN            0x10
+#define EC_EVENT_BATTERY_SHUTDOWN            0x11
+#define EC_EVENT_THROTTLE_START              0x12
+#define EC_EVENT_THROTTLE_STOP               0x13
+#define EC_EVENT_HANG_DETECT                 0x14
+#define EC_EVENT_HANG_REBOOT                 0x15
+#define EC_EVENT_PD_MCU                      0x16
+#define EC_EVENT_BATTERY_STATUS              0x17
+#define EC_EVENT_PANIC                       0x18
+#define EC_EVENT_KEYBOARD_RECOVERY_HWREINIT  0x19
 struct elog_ec_event {
 	uint8_t event;
 	uint8_t checksum;
@@ -235,6 +236,7 @@
 /* Memory Cache Update */
 #define ELOG_TYPE_MEM_CACHE_UPDATE        0xaa
 #define  ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL    0
+#define  ELOG_MEM_CACHE_UPDATE_SLOT_RECOVERY  1
 #define  ELOG_MEM_CACHE_UPDATE_STATUS_SUCCESS 0
 #define  ELOG_MEM_CACHE_UPDATE_STATUS_FAIL    1
 struct elog_event_mem_cache_update {
@@ -370,6 +372,8 @@
 #define VBNV_RECOVERY_RW_BCB_ERROR    0x5C
 /* Fastboot mode requested in firmware */
 #define VBNV_RECOVERY_FW_FASTBOOT     0x5E
+/* Recovery hash space lock error in RO firmware */
+#define VBNV_RECOVERY_RO_TPM_REC_HASH_L_ERROR    0x5F
 /* Unspecified/unknown error in rewritable firmware */
 #define VBNV_RECOVERY_RW_UNSPECIFIED  0x7F
 /* DM-verity error */
@@ -382,6 +386,8 @@
 #define VBNV_RECOVERY_BCB_USER_MODE   0xC2
 /* Fastboot mode requested by user-mode */
 #define VBNV_RECOVERY_US_FASTBOOT     0xC3
+/* User requested recovery for training memory and rebooting. */
+#define VBNV_RECOVERY_TRAIN_AND_REBOOT 0xC4
 /* Unspecified/unknown error in user-mode */
 #define VBNV_RECOVERY_US_UNSPECIFIED  0xFF
 
diff --git a/lib/eventlog/elog.c b/lib/eventlog/elog.c
index aea32d2..279e0eb 100644
--- a/lib/eventlog/elog.c
+++ b/lib/eventlog/elog.c
@@ -255,6 +255,8 @@
 		{ EC_EVENT_PD_MCU, "PD MCU Request" },
 		{ EC_EVENT_BATTERY_STATUS, "Battery Status Request" },
 		{ EC_EVENT_PANIC, "Panic Reset in previous boot" },
+		{ EC_EVENT_KEYBOARD_RECOVERY_HWREINIT,
+		  "Keyboard Recovery Forced Hardware Reinit" },
 		{ 0, NULL },
 	};
 	/*
@@ -380,6 +382,8 @@
 		  "BCB partition error on disk" },
 		{ VBNV_RECOVERY_FW_FASTBOOT,
 		  "Fastboot-mode requested in firmware" },
+		{ VBNV_RECOVERY_RO_TPM_REC_HASH_L_ERROR,
+		  "Recovery hash space lock error in RO firmware" },
 		{ VBNV_RECOVERY_RW_UNSPECIFIED,
 		  "Unspecified/unknown error in RW firmware" },
 		{ VBNV_RECOVERY_KE_DM_VERITY,
@@ -392,6 +396,8 @@
 		  "User-mode requested recovery via BCB" },
 		{ VBNV_RECOVERY_US_FASTBOOT,
 		  "User-mode requested fastboot mode" },
+		{ VBNV_RECOVERY_TRAIN_AND_REBOOT,
+		  "User requested recovery for training memory and rebooting" },
 		{ VBNV_RECOVERY_RW_UNSPECIFIED,
 		  "Unknown Error in RW Firmware" },
 		{ VBNV_RECOVERY_KE_DM_VERITY, "DM-Verity Error" },
@@ -450,6 +456,7 @@
 	};
 	static struct valstr mem_cache_slots[] = {
 		{ ELOG_MEM_CACHE_UPDATE_SLOT_NORMAL, "Normal" },
+		{ ELOG_MEM_CACHE_UPDATE_SLOT_RECOVERY, "Recovery" },
 		{ 0, NULL },
 	};
 	static struct valstr mem_cache_statuses[] = {