blob: 9de8056e2ffdd01f61629ae69c546f5c6cfb665f [file] [log] [blame]
/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Non-volatile storage routines
*/
#ifndef VBOOT_REFERENCE_2NVSTORAGE_H_
#define VBOOT_REFERENCE_2NVSTORAGE_H_
struct vb2_context;
enum vb2_nv_param {
/*
* Parameter values have been reset to defaults (flag for firmware).
* 0=clear; 1=set.
*/
VB2_NV_FIRMWARE_SETTINGS_RESET = 0,
/*
* Parameter values have been reset to defaults (flag for kernel).
* 0=clear; 1=set.
*/
VB2_NV_KERNEL_SETTINGS_RESET,
/* Request debug reset on next S3->S0 transition. 0=clear; 1=set. */
VB2_NV_DEBUG_RESET_MODE,
/* Firmware slot to try next. 0=A, 1=B */
VB2_NV_TRY_NEXT,
/*
* Number of times to try booting RW firmware slot B before slot A.
* Valid range: 0-15.
*
* For VB2, number of times to try booting the slot indicated by
* VB2_NV_TRY_NEXT. On a 1->0 transition of try count, VB2_NV_TRY_NEXT
* will be set to the other slot.
*/
VB2_NV_TRY_COUNT,
/*
* Request recovery mode on next boot; see 2recovery_reason.h for
* currently defined reason codes. 8-bit value.
*/
VB2_NV_RECOVERY_REQUEST,
/*
* Localization index for screen bitmaps displayed by firmware.
* 8-bit value.
*/
VB2_NV_LOCALIZATION_INDEX,
/* Field reserved for kernel/user-mode use; 16-bit value. */
VB2_NV_KERNEL_FIELD,
/* Allow booting from external disk in developer mode. 0=no, 1=yes. */
VB2_NV_DEV_BOOT_EXTERNAL,
/* Allow booting of legacy OSes in developer mode. 0=no, 1=yes. */
VB2_NV_DEV_BOOT_LEGACY,
/* Only boot Google-signed images in developer mode. 0=no, 1=yes. */
VB2_NV_DEV_BOOT_SIGNED_ONLY,
/*
* Allow full fastboot capability in firmware in developer mode.
* 0=no, 1=yes. Deprecated; see chromium:995172.
*/
VB2_NV_DEPRECATED_DEV_BOOT_FASTBOOT_FULL_CAP,
/* Set default boot mode (see vb2_dev_default_boot_target) */
VB2_NV_DEV_DEFAULT_BOOT,
/* Enable USB Device Controller */
VB2_NV_DEV_ENABLE_UDC,
/*
* Set by userspace to request that RO firmware disable dev-mode on the
* next boot. This is likely only possible if the dev-switch is
* virtual.
*/
VB2_NV_DISABLE_DEV_REQUEST,
/* Set and cleared by vboot to request that display be initialized
at boot time, so that BIOS screens can be displayed. 0=no, 1=yes. */
VB2_NV_DISPLAY_REQUEST,
/* Request that the firmware clear the TPM owner on the next boot. */
VB2_NV_CLEAR_TPM_OWNER_REQUEST,
/* Flag that TPM owner was cleared on request. */
VB2_NV_CLEAR_TPM_OWNER_DONE,
/* TPM requested a reboot already. */
VB2_NV_TPM_REQUESTED_REBOOT,
/* More details on recovery reason */
VB2_NV_RECOVERY_SUBCODE,
/* Request that NVRAM be backed up at next boot if possible. */
VB2_NV_BACKUP_NVRAM_REQUEST,
/* Firmware slot tried this boot (0=A, 1=B) */
VB2_NV_FW_TRIED,
/* Result of trying that firmware (see vb2_fw_result) */
VB2_NV_FW_RESULT,
/* Firmware slot tried previous boot (0=A, 1=B) */
VB2_NV_FW_PREV_TRIED,
/* Result of trying that firmware (see vb2_fw_result) */
VB2_NV_FW_PREV_RESULT,
/* Request wipeout of the device by the app. */
VB2_NV_REQ_WIPEOUT,
/* Fastboot: Unlock in firmware, 0=disabled, 1=enabled.
Deprecated; see chromium:995172. */
VB2_NV_DEPRECATED_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).
*/
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,
/*** Fields only available in NV storage V2 ***/
/*
* Maximum firmware version to roll forward to. Returns
* VB2_MAX_ROLLFORWARD_MAX_V1_DEFAULT for V1.
*/
VB2_NV_FW_MAX_ROLLFORWARD,
/* Deprecated: Enable AltOS Mode on next boot. */
VB2_NV_DEPRECATED_ENABLE_ALT_OS_REQUEST,
/* Deprecated: Disable AltOS Mode on next boot. */
VB2_NV_DEPRECATED_DISABLE_ALT_OS_REQUEST,
/*
* Add a short delay after EC software sync for any interaction
* with EC-RW (persistent). Formerly used for programmatically
* testing Alt OS booting.
*/
VB2_NV_POST_EC_SYNC_DELAY,
/* Request booting of diagnostic rom. 0=no, 1=yes. */
VB2_NV_DIAG_REQUEST,
};
/* Firmware result codes for VB2_NV_FW_RESULT and VB2_NV_FW_PREV_RESULT */
enum vb2_fw_result {
/* Unknown */
VB2_FW_RESULT_UNKNOWN = 0,
/* Trying a new slot, but haven't reached success/failure */
VB2_FW_RESULT_TRYING = 1,
/* Successfully booted to the OS */
VB2_FW_RESULT_SUCCESS = 2,
/* Known failure */
VB2_FW_RESULT_FAILURE = 3,
};
/*
* Default value for VB2_NV_FIRMWARE_MAX_ROLLFORWARD on V1. This preserves the
* existing behavior that V1 systems will always roll forward the firmware
* version when possible.
*/
#define VB2_FW_MAX_ROLLFORWARD_V1_DEFAULT 0xfffffffe
/**
* Return the size of the non-volatile storage data in the context.
*
* This may be called before vb2_context_init(), but you must set
* VB2_CONTEXT_NVDATA_V2 if you support V2 record size.
*
* @param ctx Context pointer
* @return Size of the non-volatile storage data in bytes.
*/
int vb2_nv_get_size(const struct vb2_context *ctx);
/**
* Check the CRC of the non-volatile storage context.
*
* Use this if reading from non-volatile storage may be flaky, and you want to
* retry reading it several times.
*
* This may be called before vb2_context_init().
*
* @param ctx Context pointer
* @return VB2_SUCCESS, or non-zero error code if error.
*/
vb2_error_t vb2_nv_check_crc(const struct vb2_context *ctx);
/**
* Initialize the non-volatile storage context and verify its CRC.
*
* This may be called before vb2_context_init(), as long as:
*
* 1) The ctx structure has been cleared to 0.
* 2) Existing non-volatile data, if any, has been stored to ctx->nvdata[].
*
* This is to support using the non-volatile storage functions to request
* recovery if there is an error allocating the workbuf for the context. It
* also allows host-side code to use this library without setting up a bunch of
* extra context.
*
* @param ctx Context pointer
*/
void vb2_nv_init(struct vb2_context *ctx);
/**
* Read a non-volatile value.
*
* Valid only after calling vb2_nv_init().
*
* @param ctx Context pointer
* @param param Parameter to read
* @return The value of the parameter. If you somehow force an invalid
* parameter number, returns 0.
*/
uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param);
/**
* Write a non-volatile value.
*
* Ignores writes to unknown params. Valid only after calling vb2_nv_init().
* If this changes ctx->nvdata[], it will set VB2_CONTEXT_NVDATA_CHANGED in
* ctx->flags.
*
* @param ctx Context pointer
* @param param Parameter to write
* @param value New value
*/
void vb2_nv_set(struct vb2_context *ctx,
enum vb2_nv_param param,
uint32_t value);
#endif /* VBOOT_REFERENCE_2NVSTORAGE_H_ */