summaryrefslogtreecommitdiff
path: root/firmware/lib/vboot_nvstorage.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib/vboot_nvstorage.c')
-rw-r--r--firmware/lib/vboot_nvstorage.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c
index 5476e85b..a0721d7c 100644
--- a/firmware/lib/vboot_nvstorage.c
+++ b/firmware/lib/vboot_nvstorage.c
@@ -51,6 +51,9 @@
#define BOOT2_RESULT_MASK 0x03
#define BOOT2_TRIED 0x04
#define BOOT2_TRY_NEXT 0x08
+#define BOOT2_PREV_RESULT_MASK 0x30
+#define BOOT2_PREV_RESULT_SHIFT 4 /* Number of bits to shift result */
+#define BOOT2_PREV_TRIED 0x40
#define KERNEL_FIELD_OFFSET 11
#define CRC_OFFSET 15
@@ -179,6 +182,15 @@ int VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest)
*dest = raw[BOOT2_OFFSET] & BOOT2_RESULT_MASK;
return 0;
+ case VBNV_FW_PREV_TRIED:
+ *dest = (raw[BOOT2_OFFSET] & BOOT2_PREV_TRIED ? 1 : 0);
+ return 0;
+
+ case VBNV_FW_PREV_RESULT:
+ *dest = (raw[BOOT2_OFFSET] & BOOT2_PREV_RESULT_MASK)
+ >> BOOT2_PREV_RESULT_SHIFT;
+ return 0;
+
default:
return 1;
}
@@ -333,6 +345,22 @@ int VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value)
raw[BOOT2_OFFSET] |= (uint8_t)value;
break;
+ case VBNV_FW_PREV_TRIED:
+ if (value)
+ raw[BOOT2_OFFSET] |= BOOT2_PREV_TRIED;
+ else
+ raw[BOOT2_OFFSET] &= ~BOOT2_PREV_TRIED;
+ break;
+
+ case VBNV_FW_PREV_RESULT:
+ /* Map out of range values to unknown */
+ if (value > BOOT2_RESULT_MASK)
+ value = VBNV_FW_RESULT_UNKNOWN;
+
+ raw[BOOT2_OFFSET] &= ~BOOT2_PREV_RESULT_MASK;
+ raw[BOOT2_OFFSET] |= (uint8_t)value << BOOT2_PREV_RESULT_SHIFT;
+ break;
+
default:
return 1;
}