diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/2lib/2nvstorage.c | 24 | ||||
-rw-r--r-- | firmware/2lib/include/2nvstorage.h | 9 | ||||
-rw-r--r-- | firmware/2lib/include/2nvstorage_fields.h | 8 | ||||
-rw-r--r-- | firmware/include/vboot_nvstorage.h | 5 | ||||
-rw-r--r-- | firmware/lib/vboot_nvstorage.c | 35 |
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; } |