xref: /aosp_15_r20/external/vboot_reference/firmware/2lib/2nvstorage.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
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