blob: e3acb36cb900666ac30dc97dad158d8b7703a192 [file] [log] [blame] [edit]
/* Copyright 2020 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Host utilites to execute flashrom command.
*/
#include <stdint.h>
#include "2return_codes.h"
#include "fmap.h"
#define FLASHROM_PROGRAMMER_INTERNAL_AP "internal"
#define FLASHROM_PROGRAMMER_INTERNAL_EC "ec"
/* Utilities for firmware images and (FMAP) sections */
struct firmware_image {
/**
* programmer The name of the programmer to use. Use either
* FLASHROM_PROGRAMMER_INTERNAL_AP or,
* FLASHROM_PROGRAMMER_INTERNAL_EC
* for the AP and EC respectively.
*/
const char *programmer;
uint32_t size; /* buffer size. */
uint8_t *data; /* data allocated buffer to read/write with. */
char *file_name;
char *ro_version, *rw_version_a, *rw_version_b;
/* AP RW sections may contain a special ECRW binary for syncing EC
firmware on boot. These 2 fields are valid only for AP image. */
char *ecrw_version_a, *ecrw_version_b;
FmapHeader *fmap_header;
};
/**
* Reads one or more FMAP regions, or the entire flash chip, into a newly allocated buffer.
*
* This function allocates a buffer equal to the size of the ENTIRE flash chip. It then reads
* the specified FMAP region(s) into the corresponding offsets within that buffer. The contents
* of the buffer outside of the specified regions are undefined.
*
* The caller is responsible for freeing image->data and image->file_name.
*
* @param image Firmware image struct. The `programmer` field must be set by the caller.
* The `data`, `size`, and `file_name` fields will be populated by this
* function upon success.
* @param regions An array of FMAP region names to read.
* @param regions_len The number of strings in the `regions` array. If 0, the entire flash
* chip is read.
* @param verbosity Controls the verbosity level of the flashrom command.
*
* @return VB2_SUCCESS on success, or a relevant error code on failure.
*/
vb2_error_t flashrom_read_image(struct firmware_image *image, const char *const regions[],
size_t regions_len, int verbosity);
/**
* Reads a single FMAP region from flash into a newly allocated, fitted buffer.
*
* This function allocates a buffer that is sized to be exactly the size of the requested
* region, and the buffer contains only the data from that region.
*
* The caller is responsible for freeing image->data and image->file_name.
*
* @param image Firmware image struct. The `programmer` field must be set by the caller.
* The `data`, `size`, and `file_name` fields will be populated by this
* function upon success.
* @param region The name of the single FMAP region to read. Must not be NULL.
* @param verbosity Controls the verbosity level of the flashrom command.
*
* @return VB2_SUCCESS on success, or a relevant error code on failure.
*/
vb2_error_t flashrom_read_region(struct firmware_image *image, const char *region,
int verbosity);
/**
* Write one or more FMAP regions, or the entire flash chip, from a buffer.
*
* The `image` buffer is expected to be the size of the entire flash chip, with the data for
* each specified region at the correct offset.
*
* @param image Firmware image struct containing the data to write. The `programmer`,
* `data`, and `size` fields must be set.
* @param regions An array of FMAP region names to write.
* @param regions_len The number of strings in the `regions` array. If 0, the entire flash
* chip is written.
* @param diff_image Optional. If not NULL, flashrom will only write the blocks that are
* different between `image` and `diff_image`, potentially speeding up the
* write operation.
* @param do_verify If true, flashrom will read back the data after writing to verify
* its integrity.
* @param verbosity Controls the verbosity level of the flashrom command.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
vb2_error_t flashrom_write_image(const struct firmware_image *image,
const char *const regions[], size_t regions_len,
const struct firmware_image *diff_image, bool do_verify,
int verbosity);
/**
* Write a single FMAP region to flash from a fitted buffer.
*
* The `image` buffer is expected to contain only the data for the specified region and its size
* should match that region's size in the FMAP.
*
* @param image Firmware image struct containing the data to write. The `programmer`,
* `data`, and `size` fields must be set.
* @param region The name of a single FMAP region to write. Must not be NULL.
* @param do_verify If true, flashrom will read back the data after writing to verify
* its integrity.
* @param verbosity Controls the verbosity level of the flashrom command.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
vb2_error_t flashrom_write_region(const struct firmware_image *image, const char *region,
bool do_verify, int verbosity);
/**
* Get wp state using flashrom.
*
* @param programmer The name of the programmer to use for reading the
* writeprotect state.
* @param wp_mode Pointer to a bool to store the WP mode. Will be set to
* false if WP is disabled, true if WP is enabled.
* NULL can be passed if not needed.
* @param wp_start Pointer to a uint32_t to store the WP start addr.
* NULL can be passed if not needed.
* @param wp_len Pointer to a uint32_t to store the WP region length.
* NULL can be passed if not needed.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
vb2_error_t flashrom_get_wp(const char *programmer, bool *wp_mode,
uint32_t *wp_start, uint32_t *wp_len, int verbosity);
/**
* Set wp state using flashrom.
*
* @param programmer The name of the programmer to use for writing the
* writeprotect state.
* @param wp_mode WP mode to set. true to enable, false disable WP.
* @param wp_start WP start addr to set
* @param wp_len WP region length set
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
vb2_error_t flashrom_set_wp(const char *programmer, bool wp_mode,
uint32_t wp_start, uint32_t wp_len, int verbosity);
/**
* Get flash info using flashrom.
*
* @param programmer The name of the programmer to use.
* @param vendor The chip vendor name, non-NULLable.
* @param name The chip product name, non-NULLable.
* @param vid The chip vendor id, non-NULLable.
* @param pid The chip product id, non-NULLable.
* @param flash_len Pointer to a uint32_t to store chip length, non-NULLable.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
vb2_error_t flashrom_get_info(const char *prog_with_params, char **vendor, char **name,
uint32_t *vid, uint32_t *pid, uint32_t *flash_len, int verbosity);
/**
* Get flash size using flashrom.
*
* @param programmer The name of the programmer to use.
* @param flash_len Pointer to a uint32_t to store chip length.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
vb2_error_t flashrom_get_size(const char *programmer, uint32_t *flash_len, int verbosity);