1 /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  *
5  * Non-volatile storage routines
6  */
7 
8 #ifndef VBOOT_REFERENCE_VBOOT_2NVSTORAGE_H_
9 #define VBOOT_REFERENCE_VBOOT_2NVSTORAGE_H_
10 
11 enum vb2_nv_param {
12 	/*
13 	 * Parameter values have been reset to defaults (flag for firmware).
14 	 * 0=clear; 1=set.
15 	 */
16 	VB2_NV_FIRMWARE_SETTINGS_RESET = 0,
17 	/*
18 	 * Parameter values have been reset to defaults (flag for kernel).
19 	 * 0=clear; 1=set.
20 	 */
21 	VB2_NV_KERNEL_SETTINGS_RESET,
22 	/* Request debug reset on next S3->S0 transition.  0=clear; 1=set. */
23 	VB2_NV_DEBUG_RESET_MODE,
24 	/* Firmware slot to try next.  0=A, 1=B */
25 	VB2_NV_TRY_NEXT,
26 	/*
27 	 * Number of times to try booting RW firmware slot B before slot A.
28 	 * Valid range: 0-15.
29 	 *
30 	 * For VB2, number of times to try booting the slot indicated by
31 	 * VB2_NV_TRY_NEXT.  On a 1->0 transition of try count, VB2_NV_TRY_NEXT
32 	 * will be set to the other slot.
33 	 */
34 	VB2_NV_TRY_COUNT,
35 	/*
36 	 * Request recovery mode on next boot; see 2recovery_reason.h for
37 	 * currently defined reason codes.  8-bit value.
38 	 */
39 	VB2_NV_RECOVERY_REQUEST,
40 	/*
41 	 * Localization index for screen bitmaps displayed by firmware.
42 	 * 8-bit value.
43 	 */
44 	VB2_NV_LOCALIZATION_INDEX,
45 	/* Field reserved for kernel/user-mode use; 32-bit value. */
46 	VB2_NV_KERNEL_FIELD,
47 	/* Allow booting from USB in developer mode.  0=no, 1=yes. */
48 	VB2_NV_DEV_BOOT_USB,
49 	/* Allow booting of legacy OSes in developer mode.  0=no, 1=yes. */
50 	VB2_NV_DEV_BOOT_LEGACY,
51 	/* Only boot Google-signed images in developer mode.  0=no, 1=yes. */
52 	VB2_NV_DEV_BOOT_SIGNED_ONLY,
53 	/*
54 	 * Set by userspace to request that RO firmware disable dev-mode on the
55 	 * next boot. This is likely only possible if the dev-switch is
56 	 * virtual.
57 	 */
58 	VB2_NV_DISABLE_DEV_REQUEST,
59 	/*
60 	 * Set and cleared by vboot to request that the video Option ROM be
61 	 * loaded at boot time, so that BIOS screens can be displayed. 0=no,
62 	 * 1=yes.
63 	 */
64 	VB2_NV_OPROM_NEEDED,
65 	/* Request that the firmware clear the TPM owner on the next boot. */
66 	VB2_NV_CLEAR_TPM_OWNER_REQUEST,
67 	/* Flag that TPM owner was cleared on request. */
68 	VB2_NV_CLEAR_TPM_OWNER_DONE,
69 	/* More details on recovery reason */
70 	VB2_NV_RECOVERY_SUBCODE,
71 	/* Request that NVRAM be backed up at next boot if possible. */
72 	VB2_NV_BACKUP_NVRAM_REQUEST,
73 	/* Firmware slot tried this boot (0=A, 1=B) */
74 	VB2_NV_FW_TRIED,
75 	/* Result of trying that firmware (see vb2_fw_result) */
76 	VB2_NV_FW_RESULT,
77 	/* Firmware slot tried previous boot (0=A, 1=B) */
78 	VB2_NV_FW_PREV_TRIED,
79 	/* Result of trying that firmware (see vb2_fw_result) */
80 	VB2_NV_FW_PREV_RESULT,
81 };
82 
83 /* Firmware result codes for VB2_NV_FW_RESULT and VB2_NV_FW_PREV_RESULT */
84 enum vb2_fw_result {
85 	/* Unknown */
86 	VB2_FW_RESULT_UNKNOWN = 0,
87 
88 	/* Trying a new slot, but haven't reached success/failure */
89 	VB2_FW_RESULT_TRYING = 1,
90 
91 	/* Successfully booted to the OS */
92 	VB2_FW_RESULT_SUCCESS = 2,
93 
94 	/* Known failure */
95 	VB2_FW_RESULT_FAILURE = 3,
96 };
97 
98 /**
99  * Check the CRC of the non-volatile storage context.
100  *
101  * Use this if reading from non-volatile storage may be flaky, and you want to
102  * retry reading it several times.
103  *
104  * This may be called before vb2_context_init().
105  *
106  * @param ctx		Context pointer
107  * @return VB2_SUCCESS, or non-zero error code if error.
108  */
109 int vb2_nv_check_crc(const struct vb2_context *ctx);
110 
111 /**
112  * Initialize the non-volatile storage context and verify its CRC.
113  *
114  * @param ctx		Context pointer
115  */
116 void vb2_nv_init(struct vb2_context *ctx);
117 
118 /**
119  * Read a non-volatile value.
120  *
121  * @param ctx		Context pointer
122  * @param param		Parameter to read
123  * @return The value of the parameter.  If you somehow force an invalid
124  *         parameter number, returns 0.
125  */
126 uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param);
127 
128 /**
129  * Write a non-volatile value.
130  *
131  * Ignores writes to unknown params.
132  *
133  * @param ctx		Context pointer
134  * @param param		Parameter to write
135  * @param value		New value
136  */
137 void vb2_nv_set(struct vb2_context *ctx,
138 		enum vb2_nv_param param,
139 		uint32_t value);
140 
141 #endif  /* VBOOT_REFERENCE_VBOOT_2NVSTORAGE_H_ */
142