summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/2lib/2nvstorage.c24
-rw-r--r--firmware/2lib/include/2nvstorage.h9
-rw-r--r--firmware/2lib/include/2nvstorage_fields.h8
-rw-r--r--firmware/include/vboot_nvstorage.h5
-rw-r--r--firmware/lib/vboot_nvstorage.c35
5 files changed, 59 insertions, 22 deletions
diff --git a/firmware/2lib/2nvstorage.c b/firmware/2lib/2nvstorage.c
index b40bbe78..08363362 100644
--- a/firmware/2lib/2nvstorage.c
+++ b/firmware/2lib/2nvstorage.c
@@ -121,10 +121,7 @@ uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param)
return p[VB2_NV_OFFS_LOCALIZATION];
case VB2_NV_KERNEL_FIELD:
- return (p[VB2_NV_OFFS_KERNEL]
- | (p[VB2_NV_OFFS_KERNEL + 1] << 8)
- | (p[VB2_NV_OFFS_KERNEL + 2] << 16)
- | (p[VB2_NV_OFFS_KERNEL + 3] << 24));
+ return p[VB2_NV_OFFS_KERNEL1] | (p[VB2_NV_OFFS_KERNEL2] << 8);
case VB2_NV_DEV_BOOT_USB:
return GETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_USB);
@@ -175,6 +172,12 @@ uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param)
case VB2_NV_BATTERY_CUTOFF_REQUEST:
return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BATTERY_CUTOFF);
+
+ case VB2_NV_KERNEL_MAX_ROLLFORWARD:
+ return (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD1]
+ | (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD2] << 8)
+ | (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD3] << 16)
+ | (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD4] << 24));
}
/*
@@ -280,10 +283,8 @@ void vb2_nv_set(struct vb2_context *ctx,
break;
case VB2_NV_KERNEL_FIELD:
- p[VB2_NV_OFFS_KERNEL] = (uint8_t)(value);
- p[VB2_NV_OFFS_KERNEL + 1] = (uint8_t)(value >> 8);
- p[VB2_NV_OFFS_KERNEL + 2] = (uint8_t)(value >> 16);
- p[VB2_NV_OFFS_KERNEL + 3] = (uint8_t)(value >> 24);
+ p[VB2_NV_OFFS_KERNEL1] = (uint8_t)(value);
+ p[VB2_NV_OFFS_KERNEL2] = (uint8_t)(value >> 8);
break;
case VB2_NV_DEV_BOOT_USB:
@@ -356,6 +357,13 @@ void vb2_nv_set(struct vb2_context *ctx,
case VB2_NV_BATTERY_CUTOFF_REQUEST:
SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BATTERY_CUTOFF);
break;
+
+ case VB2_NV_KERNEL_MAX_ROLLFORWARD:
+ p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD1] = (uint8_t)(value);
+ p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD2] = (uint8_t)(value >> 8);
+ p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD3] = (uint8_t)(value >> 16);
+ p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD4] = (uint8_t)(value >> 24);
+ break;
}
/*
diff --git a/firmware/2lib/include/2nvstorage.h b/firmware/2lib/include/2nvstorage.h
index 66a5fdf1..e3226a58 100644
--- a/firmware/2lib/include/2nvstorage.h
+++ b/firmware/2lib/include/2nvstorage.h
@@ -42,7 +42,7 @@ enum vb2_nv_param {
* 8-bit value.
*/
VB2_NV_LOCALIZATION_INDEX,
- /* Field reserved for kernel/user-mode use; 32-bit value. */
+ /* Field reserved for kernel/user-mode use; 16-bit value. */
VB2_NV_KERNEL_FIELD,
/* Allow booting from USB in developer mode. 0=no, 1=yes. */
VB2_NV_DEV_BOOT_USB,
@@ -94,10 +94,15 @@ enum vb2_nv_param {
VB2_NV_FASTBOOT_UNLOCK_IN_FW,
/* Boot system when AC detected (0=no, 1=yes). */
VB2_NV_BOOT_ON_AC_DETECT,
- /* Try to update the EC-RO image after updating the EC-RW image(0=no, 1=yes). */
+ /*
+ * Try to update the EC-RO image after updating the EC-RW image
+ * (0=no, 1=yes).
+ */
VB2_NV_TRY_RO_SYNC,
/* Cut off battery and shutdown on next boot. */
VB2_NV_BATTERY_CUTOFF_REQUEST,
+ /* Maximum kernel version to roll forward to */
+ VB2_NV_KERNEL_MAX_ROLLFORWARD,
};
/* Set default boot in developer mode */
diff --git a/firmware/2lib/include/2nvstorage_fields.h b/firmware/2lib/include/2nvstorage_fields.h
index 018bdeb7..0ed3325a 100644
--- a/firmware/2lib/include/2nvstorage_fields.h
+++ b/firmware/2lib/include/2nvstorage_fields.h
@@ -29,8 +29,12 @@ enum vb2_nv_offset {
VB2_NV_OFFS_RECOVERY_SUBCODE = 6,
VB2_NV_OFFS_BOOT2 = 7,
VB2_NV_OFFS_MISC = 8,
- /* Offsets 9-10 are currently unused */
- VB2_NV_OFFS_KERNEL = 11, /* 11-14; field is 32 bits */
+ VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD1 = 9, /* bits 0-7 of 32 */
+ VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD2 = 10, /* bits 8-15 of 32 */
+ VB2_NV_OFFS_KERNEL1 = 11, /* bits 0-7 of 16 */
+ VB2_NV_OFFS_KERNEL2 = 12, /* bits 8-15 of 16 */
+ VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD3 = 13, /* bits 16-23 of 32 */
+ VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD4 = 14, /* bits 24-31 of 32 */
/* CRC must be last field */
VB2_NV_OFFS_CRC = 15
};
diff --git a/firmware/include/vboot_nvstorage.h b/firmware/include/vboot_nvstorage.h
index 8c7ff9d3..ecb5d007 100644
--- a/firmware/include/vboot_nvstorage.h
+++ b/firmware/include/vboot_nvstorage.h
@@ -122,8 +122,11 @@ typedef enum VbNvParam {
VBNV_TRY_RO_SYNC,
/*
* Finish mode transition (if requested), perform battery cut-off and
- * shutdown in next boot. */
+ * shutdown in next boot.
+ */
VBNV_BATTERY_CUTOFF_REQUEST,
+ /* Maximum kernel version to roll forward to */
+ VBNV_KERNEL_MAX_ROLLFORWARD,
} VbNvParam;
/* Set default boot in developer mode */
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c
index 3d6a65d7..9dc9dc3d 100644
--- a/firmware/lib/vboot_nvstorage.c
+++ b/firmware/lib/vboot_nvstorage.c
@@ -66,7 +66,14 @@
#define MISC_TRY_RO_SYNC 0x04
#define MISC_BATTERY_CUTOFF_REQUEST 0x08
-#define KERNEL_FIELD_OFFSET 11
+#define KERNEL_MAX_ROLLFORWARD1_OFFSET 9 /* Low bits */
+#define KERNEL_MAX_ROLLFORWARD2_OFFSET 10
+#define KERNEL_MAX_ROLLFORWARD3_OFFSET 13
+#define KERNEL_MAX_ROLLFORWARD4_OFFSET 14 /* High bits */
+
+#define KERNEL_FIELD1_OFFSET 11 /* Low bits */
+#define KERNEL_FIELD2_OFFSET 12 /* Low bits */
+
#define CRC_OFFSET 15
int VbNvSetup(VbNvContext *context)
@@ -141,10 +148,8 @@ int VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest)
return 0;
case VBNV_KERNEL_FIELD:
- *dest = (raw[KERNEL_FIELD_OFFSET]
- | (raw[KERNEL_FIELD_OFFSET + 1] << 8)
- | (raw[KERNEL_FIELD_OFFSET + 2] << 16)
- | (raw[KERNEL_FIELD_OFFSET + 3] << 24));
+ *dest = (raw[KERNEL_FIELD1_OFFSET]
+ | (raw[KERNEL_FIELD2_OFFSET] << 8));
return 0;
case VBNV_DEV_BOOT_USB:
@@ -237,6 +242,13 @@ int VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest)
? 1 : 0;
return 0;
+ case VBNV_KERNEL_MAX_ROLLFORWARD:
+ *dest = (raw[KERNEL_MAX_ROLLFORWARD1_OFFSET]
+ | (raw[KERNEL_MAX_ROLLFORWARD2_OFFSET] << 8)
+ | (raw[KERNEL_MAX_ROLLFORWARD3_OFFSET] << 16)
+ | (raw[KERNEL_MAX_ROLLFORWARD4_OFFSET] << 24));
+ return 0;
+
default:
return 1;
}
@@ -306,10 +318,8 @@ int VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value)
break;
case VBNV_KERNEL_FIELD:
- raw[KERNEL_FIELD_OFFSET] = (uint8_t)(value);
- raw[KERNEL_FIELD_OFFSET + 1] = (uint8_t)(value >> 8);
- raw[KERNEL_FIELD_OFFSET + 2] = (uint8_t)(value >> 16);
- raw[KERNEL_FIELD_OFFSET + 3] = (uint8_t)(value >> 24);
+ raw[KERNEL_FIELD1_OFFSET] = (uint8_t)(value);
+ raw[KERNEL_FIELD2_OFFSET] = (uint8_t)(value >> 8);
break;
case VBNV_DEV_BOOT_USB:
@@ -469,6 +479,13 @@ int VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value)
raw[MISC_OFFSET] &= ~MISC_BATTERY_CUTOFF_REQUEST;
break;
+ case VBNV_KERNEL_MAX_ROLLFORWARD:
+ raw[KERNEL_MAX_ROLLFORWARD1_OFFSET] = (uint8_t)(value);
+ raw[KERNEL_MAX_ROLLFORWARD2_OFFSET] = (uint8_t)(value >> 8);
+ raw[KERNEL_MAX_ROLLFORWARD3_OFFSET] = (uint8_t)(value >> 16);
+ raw[KERNEL_MAX_ROLLFORWARD4_OFFSET] = (uint8_t)(value >> 24);
+ break;
+
default:
return 1;
}