1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2014 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker */
5*8617a60dSAndroid Build Coastguard Worker
6*8617a60dSAndroid Build Coastguard Worker /* Non-volatile storage routines */
7*8617a60dSAndroid Build Coastguard Worker
8*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
9*8617a60dSAndroid Build Coastguard Worker #include "2crc8.h"
10*8617a60dSAndroid Build Coastguard Worker #include "2misc.h"
11*8617a60dSAndroid Build Coastguard Worker #include "2nvstorage_fields.h"
12*8617a60dSAndroid Build Coastguard Worker #include "2nvstorage.h"
13*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
14*8617a60dSAndroid Build Coastguard Worker
vb2_nv_regen_crc(struct vb2_context * ctx)15*8617a60dSAndroid Build Coastguard Worker static void vb2_nv_regen_crc(struct vb2_context *ctx)
16*8617a60dSAndroid Build Coastguard Worker {
17*8617a60dSAndroid Build Coastguard Worker const int offs = ctx->flags & VB2_CONTEXT_NVDATA_V2 ?
18*8617a60dSAndroid Build Coastguard Worker VB2_NV_OFFS_CRC_V2 : VB2_NV_OFFS_CRC_V1;
19*8617a60dSAndroid Build Coastguard Worker
20*8617a60dSAndroid Build Coastguard Worker ctx->nvdata[offs] = vb2_crc8(ctx->nvdata, offs);
21*8617a60dSAndroid Build Coastguard Worker ctx->flags |= VB2_CONTEXT_NVDATA_CHANGED;
22*8617a60dSAndroid Build Coastguard Worker }
23*8617a60dSAndroid Build Coastguard Worker
vb2_nv_get_size(const struct vb2_context * ctx)24*8617a60dSAndroid Build Coastguard Worker int vb2_nv_get_size(const struct vb2_context *ctx)
25*8617a60dSAndroid Build Coastguard Worker {
26*8617a60dSAndroid Build Coastguard Worker return ctx->flags & VB2_CONTEXT_NVDATA_V2 ?
27*8617a60dSAndroid Build Coastguard Worker VB2_NVDATA_SIZE_V2 : VB2_NVDATA_SIZE;
28*8617a60dSAndroid Build Coastguard Worker }
29*8617a60dSAndroid Build Coastguard Worker
30*8617a60dSAndroid Build Coastguard Worker /**
31*8617a60dSAndroid Build Coastguard Worker * Check the CRC of the non-volatile storage context.
32*8617a60dSAndroid Build Coastguard Worker *
33*8617a60dSAndroid Build Coastguard Worker * Use this if reading from non-volatile storage may be flaky, and you want to
34*8617a60dSAndroid Build Coastguard Worker * retry reading it several times.
35*8617a60dSAndroid Build Coastguard Worker *
36*8617a60dSAndroid Build Coastguard Worker * This may be called before vb2_context_init().
37*8617a60dSAndroid Build Coastguard Worker *
38*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
39*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code if error.
40*8617a60dSAndroid Build Coastguard Worker */
vb2_nv_check_crc(const struct vb2_context * ctx)41*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_nv_check_crc(const struct vb2_context *ctx)
42*8617a60dSAndroid Build Coastguard Worker {
43*8617a60dSAndroid Build Coastguard Worker const uint8_t *p = ctx->nvdata;
44*8617a60dSAndroid Build Coastguard Worker const int offs = ctx->flags & VB2_CONTEXT_NVDATA_V2 ?
45*8617a60dSAndroid Build Coastguard Worker VB2_NV_OFFS_CRC_V2 : VB2_NV_OFFS_CRC_V1;
46*8617a60dSAndroid Build Coastguard Worker const int sig = ctx->flags & VB2_CONTEXT_NVDATA_V2 ?
47*8617a60dSAndroid Build Coastguard Worker VB2_NV_HEADER_SIGNATURE_V2 : VB2_NV_HEADER_SIGNATURE_V1;
48*8617a60dSAndroid Build Coastguard Worker
49*8617a60dSAndroid Build Coastguard Worker /* Check header */
50*8617a60dSAndroid Build Coastguard Worker if (sig != (p[VB2_NV_OFFS_HEADER] & VB2_NV_HEADER_SIGNATURE_MASK))
51*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_NV_HEADER;
52*8617a60dSAndroid Build Coastguard Worker
53*8617a60dSAndroid Build Coastguard Worker /* Check CRC */
54*8617a60dSAndroid Build Coastguard Worker if (vb2_crc8(p, offs) != p[offs])
55*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_NV_CRC;
56*8617a60dSAndroid Build Coastguard Worker
57*8617a60dSAndroid Build Coastguard Worker return VB2_SUCCESS;
58*8617a60dSAndroid Build Coastguard Worker }
59*8617a60dSAndroid Build Coastguard Worker
vb2_nv_init(struct vb2_context * ctx)60*8617a60dSAndroid Build Coastguard Worker void vb2_nv_init(struct vb2_context *ctx)
61*8617a60dSAndroid Build Coastguard Worker {
62*8617a60dSAndroid Build Coastguard Worker const int sig = ctx->flags & VB2_CONTEXT_NVDATA_V2 ?
63*8617a60dSAndroid Build Coastguard Worker VB2_NV_HEADER_SIGNATURE_V2 : VB2_NV_HEADER_SIGNATURE_V1;
64*8617a60dSAndroid Build Coastguard Worker struct vb2_shared_data *sd = vb2_get_sd(ctx);
65*8617a60dSAndroid Build Coastguard Worker uint8_t *p = ctx->nvdata;
66*8617a60dSAndroid Build Coastguard Worker
67*8617a60dSAndroid Build Coastguard Worker if (sd->status & VB2_SD_STATUS_NV_INIT)
68*8617a60dSAndroid Build Coastguard Worker return;
69*8617a60dSAndroid Build Coastguard Worker
70*8617a60dSAndroid Build Coastguard Worker /* Check data for consistency */
71*8617a60dSAndroid Build Coastguard Worker if (vb2_nv_check_crc(ctx) != VB2_SUCCESS) {
72*8617a60dSAndroid Build Coastguard Worker /* Data is inconsistent (bad CRC or header); reset defaults */
73*8617a60dSAndroid Build Coastguard Worker memset(p, 0, VB2_NVDATA_SIZE_V2);
74*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_HEADER] = (sig |
75*8617a60dSAndroid Build Coastguard Worker VB2_NV_HEADER_FW_SETTINGS_RESET |
76*8617a60dSAndroid Build Coastguard Worker VB2_NV_HEADER_KERNEL_SETTINGS_RESET);
77*8617a60dSAndroid Build Coastguard Worker
78*8617a60dSAndroid Build Coastguard Worker /* Regenerate CRC */
79*8617a60dSAndroid Build Coastguard Worker vb2_nv_regen_crc(ctx);
80*8617a60dSAndroid Build Coastguard Worker
81*8617a60dSAndroid Build Coastguard Worker /* Set status flag. */
82*8617a60dSAndroid Build Coastguard Worker sd->status |= VB2_SD_STATUS_NV_REINIT;
83*8617a60dSAndroid Build Coastguard Worker
84*8617a60dSAndroid Build Coastguard Worker /* TODO: unit test for status flag being set */
85*8617a60dSAndroid Build Coastguard Worker } else {
86*8617a60dSAndroid Build Coastguard Worker #ifndef CHROMEOS_ENVIRONMENT
87*8617a60dSAndroid Build Coastguard Worker /* Always clear this on first reboot that didn't need reinit. */
88*8617a60dSAndroid Build Coastguard Worker vb2_nv_set(ctx, VB2_NV_FIRMWARE_SETTINGS_RESET, 0);
89*8617a60dSAndroid Build Coastguard Worker #endif
90*8617a60dSAndroid Build Coastguard Worker }
91*8617a60dSAndroid Build Coastguard Worker
92*8617a60dSAndroid Build Coastguard Worker sd->status |= VB2_SD_STATUS_NV_INIT;
93*8617a60dSAndroid Build Coastguard Worker }
94*8617a60dSAndroid Build Coastguard Worker
95*8617a60dSAndroid Build Coastguard Worker /* Macro for vb2_nv_get() single-bit settings to reduce duplicate code. */
96*8617a60dSAndroid Build Coastguard Worker #define GETBIT(offs, mask) (p[offs] & mask ? 1 : 0)
97*8617a60dSAndroid Build Coastguard Worker
vb2_nv_get(struct vb2_context * ctx,enum vb2_nv_param param)98*8617a60dSAndroid Build Coastguard Worker uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param)
99*8617a60dSAndroid Build Coastguard Worker {
100*8617a60dSAndroid Build Coastguard Worker const uint8_t *p = ctx->nvdata;
101*8617a60dSAndroid Build Coastguard Worker
102*8617a60dSAndroid Build Coastguard Worker /*
103*8617a60dSAndroid Build Coastguard Worker * TODO: We could reduce the binary size for this code by #ifdef'ing
104*8617a60dSAndroid Build Coastguard Worker * out the params not used by firmware verification.
105*8617a60dSAndroid Build Coastguard Worker */
106*8617a60dSAndroid Build Coastguard Worker switch (param) {
107*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FIRMWARE_SETTINGS_RESET:
108*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_HEADER,
109*8617a60dSAndroid Build Coastguard Worker VB2_NV_HEADER_FW_SETTINGS_RESET);
110*8617a60dSAndroid Build Coastguard Worker
111*8617a60dSAndroid Build Coastguard Worker case VB2_NV_KERNEL_SETTINGS_RESET:
112*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_HEADER,
113*8617a60dSAndroid Build Coastguard Worker VB2_NV_HEADER_KERNEL_SETTINGS_RESET);
114*8617a60dSAndroid Build Coastguard Worker
115*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEBUG_RESET_MODE:
116*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_DEBUG_RESET);
117*8617a60dSAndroid Build Coastguard Worker
118*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TRY_NEXT:
119*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_TRY_NEXT);
120*8617a60dSAndroid Build Coastguard Worker
121*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TRY_COUNT:
122*8617a60dSAndroid Build Coastguard Worker return p[VB2_NV_OFFS_BOOT] & VB2_NV_BOOT_TRY_COUNT_MASK;
123*8617a60dSAndroid Build Coastguard Worker
124*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_TRIED:
125*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_TRIED);
126*8617a60dSAndroid Build Coastguard Worker
127*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_RESULT:
128*8617a60dSAndroid Build Coastguard Worker return p[VB2_NV_OFFS_BOOT2] & VB2_NV_BOOT2_RESULT_MASK;
129*8617a60dSAndroid Build Coastguard Worker
130*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_PREV_TRIED:
131*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_PREV_TRIED);
132*8617a60dSAndroid Build Coastguard Worker
133*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_PREV_RESULT:
134*8617a60dSAndroid Build Coastguard Worker return (p[VB2_NV_OFFS_BOOT2] & VB2_NV_BOOT2_PREV_RESULT_MASK)
135*8617a60dSAndroid Build Coastguard Worker >> VB2_NV_BOOT2_PREV_RESULT_SHIFT;
136*8617a60dSAndroid Build Coastguard Worker
137*8617a60dSAndroid Build Coastguard Worker case VB2_NV_RECOVERY_REQUEST:
138*8617a60dSAndroid Build Coastguard Worker return p[VB2_NV_OFFS_RECOVERY];
139*8617a60dSAndroid Build Coastguard Worker
140*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DIAG_REQUEST:
141*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_REQ_DIAG);
142*8617a60dSAndroid Build Coastguard Worker
143*8617a60dSAndroid Build Coastguard Worker case VB2_NV_RECOVERY_SUBCODE:
144*8617a60dSAndroid Build Coastguard Worker return p[VB2_NV_OFFS_RECOVERY_SUBCODE];
145*8617a60dSAndroid Build Coastguard Worker
146*8617a60dSAndroid Build Coastguard Worker case VB2_NV_LOCALIZATION_INDEX:
147*8617a60dSAndroid Build Coastguard Worker return p[VB2_NV_OFFS_LOCALIZATION];
148*8617a60dSAndroid Build Coastguard Worker
149*8617a60dSAndroid Build Coastguard Worker case VB2_NV_KERNEL_FIELD:
150*8617a60dSAndroid Build Coastguard Worker return p[VB2_NV_OFFS_KERNEL1] | (p[VB2_NV_OFFS_KERNEL2] << 8);
151*8617a60dSAndroid Build Coastguard Worker
152*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_BOOT_EXTERNAL:
153*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_EXTERNAL);
154*8617a60dSAndroid Build Coastguard Worker
155*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_BOOT_ALTFW:
156*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_LEGACY);
157*8617a60dSAndroid Build Coastguard Worker
158*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_BOOT_SIGNED_ONLY:
159*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_SIGNED_ONLY);
160*8617a60dSAndroid Build Coastguard Worker
161*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_DEFAULT_BOOT:
162*8617a60dSAndroid Build Coastguard Worker return (p[VB2_NV_OFFS_DEV] & VB2_NV_DEV_FLAG_DEFAULT_BOOT)
163*8617a60dSAndroid Build Coastguard Worker >> VB2_NV_DEV_DEFAULT_BOOT_SHIFT;
164*8617a60dSAndroid Build Coastguard Worker
165*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_ENABLE_UDC:
166*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_UDC);
167*8617a60dSAndroid Build Coastguard Worker
168*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DISABLE_DEV_REQUEST:
169*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_DISABLE_DEV);
170*8617a60dSAndroid Build Coastguard Worker
171*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DISPLAY_REQUEST:
172*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_DISPLAY_REQUEST);
173*8617a60dSAndroid Build Coastguard Worker
174*8617a60dSAndroid Build Coastguard Worker case VB2_NV_BACKUP_NVRAM_REQUEST:
175*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_BACKUP_NVRAM);
176*8617a60dSAndroid Build Coastguard Worker
177*8617a60dSAndroid Build Coastguard Worker case VB2_NV_CLEAR_TPM_OWNER_REQUEST:
178*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_CLEAR_OWNER_REQUEST);
179*8617a60dSAndroid Build Coastguard Worker
180*8617a60dSAndroid Build Coastguard Worker case VB2_NV_CLEAR_TPM_OWNER_DONE:
181*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_CLEAR_OWNER_DONE);
182*8617a60dSAndroid Build Coastguard Worker
183*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TPM_REQUESTED_REBOOT:
184*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_REBOOTED);
185*8617a60dSAndroid Build Coastguard Worker
186*8617a60dSAndroid Build Coastguard Worker case VB2_NV_REQ_WIPEOUT:
187*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_HEADER , VB2_NV_HEADER_WIPEOUT);
188*8617a60dSAndroid Build Coastguard Worker
189*8617a60dSAndroid Build Coastguard Worker case VB2_NV_BOOT_ON_AC_DETECT:
190*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BOOT_ON_AC_DETECT);
191*8617a60dSAndroid Build Coastguard Worker
192*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TRY_RO_SYNC:
193*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_TRY_RO_SYNC);
194*8617a60dSAndroid Build Coastguard Worker
195*8617a60dSAndroid Build Coastguard Worker case VB2_NV_BATTERY_CUTOFF_REQUEST:
196*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BATTERY_CUTOFF);
197*8617a60dSAndroid Build Coastguard Worker
198*8617a60dSAndroid Build Coastguard Worker case VB2_NV_KERNEL_MAX_ROLLFORWARD:
199*8617a60dSAndroid Build Coastguard Worker return (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD1]
200*8617a60dSAndroid Build Coastguard Worker | (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD2] << 8)
201*8617a60dSAndroid Build Coastguard Worker | (p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD3] << 16)
202*8617a60dSAndroid Build Coastguard Worker | ((uint32_t)p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD4]
203*8617a60dSAndroid Build Coastguard Worker << 24));
204*8617a60dSAndroid Build Coastguard Worker
205*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_MAX_ROLLFORWARD:
206*8617a60dSAndroid Build Coastguard Worker /* Field only present in V2 */
207*8617a60dSAndroid Build Coastguard Worker if (!(ctx->flags & VB2_CONTEXT_NVDATA_V2))
208*8617a60dSAndroid Build Coastguard Worker return VB2_FW_MAX_ROLLFORWARD_V1_DEFAULT;
209*8617a60dSAndroid Build Coastguard Worker
210*8617a60dSAndroid Build Coastguard Worker return (p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD1]
211*8617a60dSAndroid Build Coastguard Worker | (p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD2] << 8)
212*8617a60dSAndroid Build Coastguard Worker | (p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD3] << 16)
213*8617a60dSAndroid Build Coastguard Worker | ((uint32_t)p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD4] << 24));
214*8617a60dSAndroid Build Coastguard Worker
215*8617a60dSAndroid Build Coastguard Worker case VB2_NV_POST_EC_SYNC_DELAY:
216*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_MISC,
217*8617a60dSAndroid Build Coastguard Worker VB2_NV_MISC_POST_EC_SYNC_DELAY);
218*8617a60dSAndroid Build Coastguard Worker
219*8617a60dSAndroid Build Coastguard Worker case VB2_NV_MINIOS_PRIORITY:
220*8617a60dSAndroid Build Coastguard Worker return GETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_MINIOS_PRIORITY);
221*8617a60dSAndroid Build Coastguard Worker
222*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_DEV_BOOT_FASTBOOT_FULL_CAP:
223*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_FASTBOOT_UNLOCK_IN_FW:
224*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_ENABLE_ALT_OS_REQUEST:
225*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_DISABLE_ALT_OS_REQUEST:
226*8617a60dSAndroid Build Coastguard Worker return 0;
227*8617a60dSAndroid Build Coastguard Worker }
228*8617a60dSAndroid Build Coastguard Worker
229*8617a60dSAndroid Build Coastguard Worker /*
230*8617a60dSAndroid Build Coastguard Worker * Put default return outside the switch() instead of in default:, so
231*8617a60dSAndroid Build Coastguard Worker * that adding a new param will cause a compiler warning.
232*8617a60dSAndroid Build Coastguard Worker */
233*8617a60dSAndroid Build Coastguard Worker return 0;
234*8617a60dSAndroid Build Coastguard Worker }
235*8617a60dSAndroid Build Coastguard Worker
236*8617a60dSAndroid Build Coastguard Worker #undef GETBIT
237*8617a60dSAndroid Build Coastguard Worker
238*8617a60dSAndroid Build Coastguard Worker /* Macro for vb2_nv_set() single-bit settings to reduce duplicate code. */
239*8617a60dSAndroid Build Coastguard Worker #define SETBIT(offs, mask) \
240*8617a60dSAndroid Build Coastguard Worker { if (value) p[offs] |= mask; else p[offs] &= ~mask; }
241*8617a60dSAndroid Build Coastguard Worker
242*8617a60dSAndroid Build Coastguard Worker test_mockable
vb2_nv_set(struct vb2_context * ctx,enum vb2_nv_param param,uint32_t value)243*8617a60dSAndroid Build Coastguard Worker void vb2_nv_set(struct vb2_context *ctx,
244*8617a60dSAndroid Build Coastguard Worker enum vb2_nv_param param,
245*8617a60dSAndroid Build Coastguard Worker uint32_t value)
246*8617a60dSAndroid Build Coastguard Worker {
247*8617a60dSAndroid Build Coastguard Worker uint8_t *p = ctx->nvdata;
248*8617a60dSAndroid Build Coastguard Worker
249*8617a60dSAndroid Build Coastguard Worker /* If not changing the value, don't regenerate the CRC. */
250*8617a60dSAndroid Build Coastguard Worker if (vb2_nv_get(ctx, param) == value)
251*8617a60dSAndroid Build Coastguard Worker return;
252*8617a60dSAndroid Build Coastguard Worker
253*8617a60dSAndroid Build Coastguard Worker /*
254*8617a60dSAndroid Build Coastguard Worker * TODO: We could reduce the binary size for this code by #ifdef'ing
255*8617a60dSAndroid Build Coastguard Worker * out the params not used by firmware verification.
256*8617a60dSAndroid Build Coastguard Worker */
257*8617a60dSAndroid Build Coastguard Worker switch (param) {
258*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FIRMWARE_SETTINGS_RESET:
259*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_HEADER, VB2_NV_HEADER_FW_SETTINGS_RESET);
260*8617a60dSAndroid Build Coastguard Worker break;
261*8617a60dSAndroid Build Coastguard Worker
262*8617a60dSAndroid Build Coastguard Worker case VB2_NV_KERNEL_SETTINGS_RESET:
263*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_HEADER, VB2_NV_HEADER_KERNEL_SETTINGS_RESET);
264*8617a60dSAndroid Build Coastguard Worker break;
265*8617a60dSAndroid Build Coastguard Worker
266*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEBUG_RESET_MODE:
267*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_DEBUG_RESET);
268*8617a60dSAndroid Build Coastguard Worker break;
269*8617a60dSAndroid Build Coastguard Worker
270*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TRY_NEXT:
271*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_TRY_NEXT);
272*8617a60dSAndroid Build Coastguard Worker break;
273*8617a60dSAndroid Build Coastguard Worker
274*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TRY_COUNT:
275*8617a60dSAndroid Build Coastguard Worker /* Clip to valid range. */
276*8617a60dSAndroid Build Coastguard Worker if (value > VB2_NV_BOOT_TRY_COUNT_MASK)
277*8617a60dSAndroid Build Coastguard Worker value = VB2_NV_BOOT_TRY_COUNT_MASK;
278*8617a60dSAndroid Build Coastguard Worker
279*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_BOOT] &= ~VB2_NV_BOOT_TRY_COUNT_MASK;
280*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_BOOT] |= (uint8_t)value;
281*8617a60dSAndroid Build Coastguard Worker break;
282*8617a60dSAndroid Build Coastguard Worker
283*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_TRIED:
284*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_TRIED);
285*8617a60dSAndroid Build Coastguard Worker break;
286*8617a60dSAndroid Build Coastguard Worker
287*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_RESULT:
288*8617a60dSAndroid Build Coastguard Worker /* Map out of range values to unknown */
289*8617a60dSAndroid Build Coastguard Worker if (value > VB2_NV_BOOT2_RESULT_MASK)
290*8617a60dSAndroid Build Coastguard Worker value = VB2_FW_RESULT_UNKNOWN;
291*8617a60dSAndroid Build Coastguard Worker
292*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_BOOT2] &= ~VB2_NV_BOOT2_RESULT_MASK;
293*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_BOOT2] |= (uint8_t)value;
294*8617a60dSAndroid Build Coastguard Worker break;
295*8617a60dSAndroid Build Coastguard Worker
296*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_PREV_TRIED:
297*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_PREV_TRIED);
298*8617a60dSAndroid Build Coastguard Worker break;
299*8617a60dSAndroid Build Coastguard Worker
300*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_PREV_RESULT:
301*8617a60dSAndroid Build Coastguard Worker /* Map out of range values to unknown */
302*8617a60dSAndroid Build Coastguard Worker if (value > VB2_NV_BOOT2_RESULT_MASK)
303*8617a60dSAndroid Build Coastguard Worker value = VB2_FW_RESULT_UNKNOWN;
304*8617a60dSAndroid Build Coastguard Worker
305*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_BOOT2] &= ~VB2_NV_BOOT2_PREV_RESULT_MASK;
306*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_BOOT2] |=
307*8617a60dSAndroid Build Coastguard Worker (uint8_t)(value << VB2_NV_BOOT2_PREV_RESULT_SHIFT);
308*8617a60dSAndroid Build Coastguard Worker break;
309*8617a60dSAndroid Build Coastguard Worker
310*8617a60dSAndroid Build Coastguard Worker case VB2_NV_RECOVERY_REQUEST:
311*8617a60dSAndroid Build Coastguard Worker /*
312*8617a60dSAndroid Build Coastguard Worker * Map values outside the valid range to the legacy reason,
313*8617a60dSAndroid Build Coastguard Worker * since we can't determine if we're called from kernel or user
314*8617a60dSAndroid Build Coastguard Worker * mode.
315*8617a60dSAndroid Build Coastguard Worker */
316*8617a60dSAndroid Build Coastguard Worker if (value > 0xff)
317*8617a60dSAndroid Build Coastguard Worker value = VB2_RECOVERY_LEGACY;
318*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_RECOVERY] = (uint8_t)value;
319*8617a60dSAndroid Build Coastguard Worker break;
320*8617a60dSAndroid Build Coastguard Worker
321*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DIAG_REQUEST:
322*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT2, VB2_NV_BOOT2_REQ_DIAG);
323*8617a60dSAndroid Build Coastguard Worker break;
324*8617a60dSAndroid Build Coastguard Worker
325*8617a60dSAndroid Build Coastguard Worker case VB2_NV_RECOVERY_SUBCODE:
326*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_RECOVERY_SUBCODE] = (uint8_t)value;
327*8617a60dSAndroid Build Coastguard Worker break;
328*8617a60dSAndroid Build Coastguard Worker
329*8617a60dSAndroid Build Coastguard Worker case VB2_NV_LOCALIZATION_INDEX:
330*8617a60dSAndroid Build Coastguard Worker /* Map values outside the valid range to the default index. */
331*8617a60dSAndroid Build Coastguard Worker if (value > 0xFF)
332*8617a60dSAndroid Build Coastguard Worker value = 0;
333*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_LOCALIZATION] = (uint8_t)value;
334*8617a60dSAndroid Build Coastguard Worker break;
335*8617a60dSAndroid Build Coastguard Worker
336*8617a60dSAndroid Build Coastguard Worker case VB2_NV_KERNEL_FIELD:
337*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_KERNEL1] = (uint8_t)(value);
338*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_KERNEL2] = (uint8_t)(value >> 8);
339*8617a60dSAndroid Build Coastguard Worker break;
340*8617a60dSAndroid Build Coastguard Worker
341*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_BOOT_EXTERNAL:
342*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_EXTERNAL);
343*8617a60dSAndroid Build Coastguard Worker break;
344*8617a60dSAndroid Build Coastguard Worker
345*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_BOOT_ALTFW:
346*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_LEGACY);
347*8617a60dSAndroid Build Coastguard Worker break;
348*8617a60dSAndroid Build Coastguard Worker
349*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_BOOT_SIGNED_ONLY:
350*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_SIGNED_ONLY);
351*8617a60dSAndroid Build Coastguard Worker break;
352*8617a60dSAndroid Build Coastguard Worker
353*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_DEFAULT_BOOT:
354*8617a60dSAndroid Build Coastguard Worker /* Map out of range values to disk */
355*8617a60dSAndroid Build Coastguard Worker if (value > (VB2_NV_DEV_FLAG_DEFAULT_BOOT >>
356*8617a60dSAndroid Build Coastguard Worker VB2_NV_DEV_DEFAULT_BOOT_SHIFT))
357*8617a60dSAndroid Build Coastguard Worker value = VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL;
358*8617a60dSAndroid Build Coastguard Worker
359*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_DEV] &= ~VB2_NV_DEV_FLAG_DEFAULT_BOOT;
360*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_DEV] |=
361*8617a60dSAndroid Build Coastguard Worker (uint8_t)(value << VB2_NV_DEV_DEFAULT_BOOT_SHIFT);
362*8617a60dSAndroid Build Coastguard Worker break;
363*8617a60dSAndroid Build Coastguard Worker
364*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEV_ENABLE_UDC:
365*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_DEV, VB2_NV_DEV_FLAG_UDC);
366*8617a60dSAndroid Build Coastguard Worker break;
367*8617a60dSAndroid Build Coastguard Worker
368*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DISABLE_DEV_REQUEST:
369*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_DISABLE_DEV);
370*8617a60dSAndroid Build Coastguard Worker break;
371*8617a60dSAndroid Build Coastguard Worker
372*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DISPLAY_REQUEST:
373*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_DISPLAY_REQUEST);
374*8617a60dSAndroid Build Coastguard Worker break;
375*8617a60dSAndroid Build Coastguard Worker
376*8617a60dSAndroid Build Coastguard Worker case VB2_NV_BACKUP_NVRAM_REQUEST:
377*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_BOOT, VB2_NV_BOOT_BACKUP_NVRAM);
378*8617a60dSAndroid Build Coastguard Worker break;
379*8617a60dSAndroid Build Coastguard Worker
380*8617a60dSAndroid Build Coastguard Worker case VB2_NV_CLEAR_TPM_OWNER_REQUEST:
381*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_CLEAR_OWNER_REQUEST);
382*8617a60dSAndroid Build Coastguard Worker break;
383*8617a60dSAndroid Build Coastguard Worker
384*8617a60dSAndroid Build Coastguard Worker case VB2_NV_CLEAR_TPM_OWNER_DONE:
385*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_CLEAR_OWNER_DONE);
386*8617a60dSAndroid Build Coastguard Worker break;
387*8617a60dSAndroid Build Coastguard Worker
388*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TPM_REQUESTED_REBOOT:
389*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_REBOOTED);
390*8617a60dSAndroid Build Coastguard Worker break;
391*8617a60dSAndroid Build Coastguard Worker
392*8617a60dSAndroid Build Coastguard Worker case VB2_NV_REQ_WIPEOUT:
393*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_HEADER , VB2_NV_HEADER_WIPEOUT);
394*8617a60dSAndroid Build Coastguard Worker break;
395*8617a60dSAndroid Build Coastguard Worker
396*8617a60dSAndroid Build Coastguard Worker case VB2_NV_BOOT_ON_AC_DETECT:
397*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BOOT_ON_AC_DETECT);
398*8617a60dSAndroid Build Coastguard Worker break;
399*8617a60dSAndroid Build Coastguard Worker
400*8617a60dSAndroid Build Coastguard Worker case VB2_NV_TRY_RO_SYNC:
401*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_TRY_RO_SYNC);
402*8617a60dSAndroid Build Coastguard Worker break;
403*8617a60dSAndroid Build Coastguard Worker
404*8617a60dSAndroid Build Coastguard Worker case VB2_NV_BATTERY_CUTOFF_REQUEST:
405*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_BATTERY_CUTOFF);
406*8617a60dSAndroid Build Coastguard Worker break;
407*8617a60dSAndroid Build Coastguard Worker
408*8617a60dSAndroid Build Coastguard Worker case VB2_NV_KERNEL_MAX_ROLLFORWARD:
409*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD1] = (uint8_t)(value);
410*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD2] = (uint8_t)(value >> 8);
411*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD3] = (uint8_t)(value >> 16);
412*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_KERNEL_MAX_ROLLFORWARD4] = (uint8_t)(value >> 24);
413*8617a60dSAndroid Build Coastguard Worker break;
414*8617a60dSAndroid Build Coastguard Worker
415*8617a60dSAndroid Build Coastguard Worker case VB2_NV_FW_MAX_ROLLFORWARD:
416*8617a60dSAndroid Build Coastguard Worker /* Field only present in V2 */
417*8617a60dSAndroid Build Coastguard Worker if (!(ctx->flags & VB2_CONTEXT_NVDATA_V2))
418*8617a60dSAndroid Build Coastguard Worker return;
419*8617a60dSAndroid Build Coastguard Worker
420*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD1] = (uint8_t)(value);
421*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD2] = (uint8_t)(value >> 8);
422*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD3] = (uint8_t)(value >> 16);
423*8617a60dSAndroid Build Coastguard Worker p[VB2_NV_OFFS_FW_MAX_ROLLFORWARD4] = (uint8_t)(value >> 24);
424*8617a60dSAndroid Build Coastguard Worker break;
425*8617a60dSAndroid Build Coastguard Worker
426*8617a60dSAndroid Build Coastguard Worker case VB2_NV_POST_EC_SYNC_DELAY:
427*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_POST_EC_SYNC_DELAY);
428*8617a60dSAndroid Build Coastguard Worker break;
429*8617a60dSAndroid Build Coastguard Worker
430*8617a60dSAndroid Build Coastguard Worker case VB2_NV_MINIOS_PRIORITY:
431*8617a60dSAndroid Build Coastguard Worker SETBIT(VB2_NV_OFFS_MISC, VB2_NV_MISC_MINIOS_PRIORITY);
432*8617a60dSAndroid Build Coastguard Worker break;
433*8617a60dSAndroid Build Coastguard Worker
434*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_DEV_BOOT_FASTBOOT_FULL_CAP:
435*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_FASTBOOT_UNLOCK_IN_FW:
436*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_ENABLE_ALT_OS_REQUEST:
437*8617a60dSAndroid Build Coastguard Worker case VB2_NV_DEPRECATED_DISABLE_ALT_OS_REQUEST:
438*8617a60dSAndroid Build Coastguard Worker return;
439*8617a60dSAndroid Build Coastguard Worker }
440*8617a60dSAndroid Build Coastguard Worker
441*8617a60dSAndroid Build Coastguard Worker /*
442*8617a60dSAndroid Build Coastguard Worker * Note there is no default case. This causes a compiler warning if
443*8617a60dSAndroid Build Coastguard Worker * a new param is added to the enum without adding support here.
444*8617a60dSAndroid Build Coastguard Worker */
445*8617a60dSAndroid Build Coastguard Worker
446*8617a60dSAndroid Build Coastguard Worker /* Need to regenerate CRC, since the value changed. */
447*8617a60dSAndroid Build Coastguard Worker vb2_nv_regen_crc(ctx);
448*8617a60dSAndroid Build Coastguard Worker }
449*8617a60dSAndroid Build Coastguard Worker
450*8617a60dSAndroid Build Coastguard Worker #undef SETBIT
451