1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2020 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 * Host utilites to execute flashrom command. 6*8617a60dSAndroid Build Coastguard Worker */ 7*8617a60dSAndroid Build Coastguard Worker 8*8617a60dSAndroid Build Coastguard Worker #include <stdint.h> 9*8617a60dSAndroid Build Coastguard Worker 10*8617a60dSAndroid Build Coastguard Worker #include "2return_codes.h" 11*8617a60dSAndroid Build Coastguard Worker #include "fmap.h" 12*8617a60dSAndroid Build Coastguard Worker 13*8617a60dSAndroid Build Coastguard Worker #define FLASHROM_PROGRAMMER_INTERNAL_AP "internal" 14*8617a60dSAndroid Build Coastguard Worker #define FLASHROM_PROGRAMMER_INTERNAL_EC "ec" 15*8617a60dSAndroid Build Coastguard Worker 16*8617a60dSAndroid Build Coastguard Worker /* Utilities for firmware images and (FMAP) sections */ 17*8617a60dSAndroid Build Coastguard Worker struct firmware_image { 18*8617a60dSAndroid Build Coastguard Worker /** 19*8617a60dSAndroid Build Coastguard Worker * programmer The name of the programmer to use. Use either 20*8617a60dSAndroid Build Coastguard Worker * FLASHROM_PROGRAMMER_INTERNAL_AP or, 21*8617a60dSAndroid Build Coastguard Worker * FLASHROM_PROGRAMMER_INTERNAL_EC 22*8617a60dSAndroid Build Coastguard Worker * for the AP and EC respectively. 23*8617a60dSAndroid Build Coastguard Worker */ 24*8617a60dSAndroid Build Coastguard Worker const char *programmer; 25*8617a60dSAndroid Build Coastguard Worker uint32_t size; /* buffer size. */ 26*8617a60dSAndroid Build Coastguard Worker uint8_t *data; /* data allocated buffer to read/write with. */ 27*8617a60dSAndroid Build Coastguard Worker char *file_name; 28*8617a60dSAndroid Build Coastguard Worker char *ro_version, *rw_version_a, *rw_version_b; 29*8617a60dSAndroid Build Coastguard Worker /* AP RW sections may contain a special ECRW binary for syncing EC 30*8617a60dSAndroid Build Coastguard Worker firmware on boot. These 2 fields are valid only for AP image. */ 31*8617a60dSAndroid Build Coastguard Worker char *ecrw_version_a, *ecrw_version_b; 32*8617a60dSAndroid Build Coastguard Worker FmapHeader *fmap_header; 33*8617a60dSAndroid Build Coastguard Worker }; 34*8617a60dSAndroid Build Coastguard Worker 35*8617a60dSAndroid Build Coastguard Worker /** 36*8617a60dSAndroid Build Coastguard Worker * Read using flashrom into an allocated buffer. 37*8617a60dSAndroid Build Coastguard Worker * 38*8617a60dSAndroid Build Coastguard Worker * flashrom_read subprocesses the flashrom binary and returns a buffer truncated 39*8617a60dSAndroid Build Coastguard Worker * to the region. 40*8617a60dSAndroid Build Coastguard Worker * 41*8617a60dSAndroid Build Coastguard Worker * flashrom_read_image reads the returns a full sized buffer with only the 42*8617a60dSAndroid Build Coastguard Worker * regions filled with data. 43*8617a60dSAndroid Build Coastguard Worker * 44*8617a60dSAndroid Build Coastguard Worker * flashrom_read_region returns the buffer truncated to the region. 45*8617a60dSAndroid Build Coastguard Worker * 46*8617a60dSAndroid Build Coastguard Worker * @param image The parameter that contains the programmer, buffer and 47*8617a60dSAndroid Build Coastguard Worker * size to use in the read operation. 48*8617a60dSAndroid Build Coastguard Worker * @param regions A list of the names of the fmap regions to read. Must 49*8617a60dSAndroid Build Coastguard Worker * be non-null if regions_len is non-zero. Otherwise, must 50*8617a60dSAndroid Build Coastguard Worker * be at least regions_len items long. 51*8617a60dSAndroid Build Coastguard Worker * @param regions_len The size of regions, or 0 to read the entire flash 52*8617a60dSAndroid Build Coastguard Worker * chip. 53*8617a60dSAndroid Build Coastguard Worker * 54*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS on success, or a relevant error. 55*8617a60dSAndroid Build Coastguard Worker */ 56*8617a60dSAndroid Build Coastguard Worker vb2_error_t flashrom_read(struct firmware_image *image, const char *region); 57*8617a60dSAndroid Build Coastguard Worker int flashrom_read_image(struct firmware_image *image, 58*8617a60dSAndroid Build Coastguard Worker const char *const regions[], size_t regions_len, 59*8617a60dSAndroid Build Coastguard Worker int verbosity); 60*8617a60dSAndroid Build Coastguard Worker int flashrom_read_region(struct firmware_image *image, const char *region, 61*8617a60dSAndroid Build Coastguard Worker int verbosity); 62*8617a60dSAndroid Build Coastguard Worker 63*8617a60dSAndroid Build Coastguard Worker /** 64*8617a60dSAndroid Build Coastguard Worker * Write using flashrom from a buffer. 65*8617a60dSAndroid Build Coastguard Worker * 66*8617a60dSAndroid Build Coastguard Worker * @param image The parameter that contains the programmer, buffer and 67*8617a60dSAndroid Build Coastguard Worker * size to use in the write operation. 68*8617a60dSAndroid Build Coastguard Worker * @param regions A list of the names of the fmap regions to write. Must 69*8617a60dSAndroid Build Coastguard Worker * be non-null if regions_len is non-zero. Otherwise, must 70*8617a60dSAndroid Build Coastguard Worker * be at least regions_len items long. 71*8617a60dSAndroid Build Coastguard Worker * @param regions_len The size of regions, or 0 to write the entire flash 72*8617a60dSAndroid Build Coastguard Worker * chip. 73*8617a60dSAndroid Build Coastguard Worker * 74*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS on success, or a relevant error. 75*8617a60dSAndroid Build Coastguard Worker */ 76*8617a60dSAndroid Build Coastguard Worker vb2_error_t flashrom_write(struct firmware_image *image, const char *region); 77*8617a60dSAndroid Build Coastguard Worker int flashrom_write_image(const struct firmware_image *image, 78*8617a60dSAndroid Build Coastguard Worker const char *const regions[], size_t regions_len, 79*8617a60dSAndroid Build Coastguard Worker const struct firmware_image *diff_image, int do_verify, 80*8617a60dSAndroid Build Coastguard Worker int verbosity); 81*8617a60dSAndroid Build Coastguard Worker 82*8617a60dSAndroid Build Coastguard Worker /** 83*8617a60dSAndroid Build Coastguard Worker * Get wp state using flashrom. 84*8617a60dSAndroid Build Coastguard Worker * 85*8617a60dSAndroid Build Coastguard Worker * @param programmer The name of the programmer to use for reading the 86*8617a60dSAndroid Build Coastguard Worker * writeprotect state. 87*8617a60dSAndroid Build Coastguard Worker * @param wp_mode Pointer to a bool to store the WP mode. Will be set to 88*8617a60dSAndroid Build Coastguard Worker * false if WP is disabled, true if WP is enabled. 89*8617a60dSAndroid Build Coastguard Worker * NULL can be passed if not needed. 90*8617a60dSAndroid Build Coastguard Worker * @param wp_start Pointer to a uint32_t to store the WP start addr. 91*8617a60dSAndroid Build Coastguard Worker * NULL can be passed if not needed. 92*8617a60dSAndroid Build Coastguard Worker * @param wp_len Pointer to a uint32_t to store the WP region length. 93*8617a60dSAndroid Build Coastguard Worker * NULL can be passed if not needed. 94*8617a60dSAndroid Build Coastguard Worker * 95*8617a60dSAndroid Build Coastguard Worker * @return 0 on success, or a relevant error. 96*8617a60dSAndroid Build Coastguard Worker */ 97*8617a60dSAndroid Build Coastguard Worker int flashrom_get_wp(const char *programmer, bool *wp_mode, 98*8617a60dSAndroid Build Coastguard Worker uint32_t *wp_start, uint32_t *wp_len, int verbosity); 99*8617a60dSAndroid Build Coastguard Worker 100*8617a60dSAndroid Build Coastguard Worker /** 101*8617a60dSAndroid Build Coastguard Worker * Set wp state using flashrom. 102*8617a60dSAndroid Build Coastguard Worker * 103*8617a60dSAndroid Build Coastguard Worker * @param programmer The name of the programmer to use for writing the 104*8617a60dSAndroid Build Coastguard Worker * writeprotect state. 105*8617a60dSAndroid Build Coastguard Worker * @param wp_mode WP mode to set. true to enable, false disable WP. 106*8617a60dSAndroid Build Coastguard Worker * @param wp_start WP start addr to set 107*8617a60dSAndroid Build Coastguard Worker * @param wp_len WP region length set 108*8617a60dSAndroid Build Coastguard Worker * 109*8617a60dSAndroid Build Coastguard Worker * @return 0 on success, or a relevant error. 110*8617a60dSAndroid Build Coastguard Worker */ 111*8617a60dSAndroid Build Coastguard Worker int flashrom_set_wp(const char *programmer, bool wp_mode, 112*8617a60dSAndroid Build Coastguard Worker uint32_t wp_start, uint32_t wp_len, int verbosity); 113*8617a60dSAndroid Build Coastguard Worker 114*8617a60dSAndroid Build Coastguard Worker /** 115*8617a60dSAndroid Build Coastguard Worker * Get flash info using flashrom. 116*8617a60dSAndroid Build Coastguard Worker * 117*8617a60dSAndroid Build Coastguard Worker * @param programmer The name of the programmer to use. 118*8617a60dSAndroid Build Coastguard Worker * @param vendor The chip vendor name, non-NULLable. 119*8617a60dSAndroid Build Coastguard Worker * @param name The chip product name, non-NULLable. 120*8617a60dSAndroid Build Coastguard Worker * @param vid The chip vendor id, non-NULLable. 121*8617a60dSAndroid Build Coastguard Worker * @param pid The chip product id, non-NULLable. 122*8617a60dSAndroid Build Coastguard Worker * @param flash_len Pointer to a uint32_t to store chip length, non-NULLable. 123*8617a60dSAndroid Build Coastguard Worker * 124*8617a60dSAndroid Build Coastguard Worker * @return 0 on success, or a relevant error. 125*8617a60dSAndroid Build Coastguard Worker */ 126*8617a60dSAndroid Build Coastguard Worker int flashrom_get_info(const char *prog_with_params, 127*8617a60dSAndroid Build Coastguard Worker char **vendor, char **name, 128*8617a60dSAndroid Build Coastguard Worker uint32_t *vid, uint32_t *pid, 129*8617a60dSAndroid Build Coastguard Worker uint32_t *flash_len, int verbosity); 130*8617a60dSAndroid Build Coastguard Worker 131*8617a60dSAndroid Build Coastguard Worker /** 132*8617a60dSAndroid Build Coastguard Worker * Get flash size using flashrom. 133*8617a60dSAndroid Build Coastguard Worker * 134*8617a60dSAndroid Build Coastguard Worker * @param programmer The name of the programmer to use. 135*8617a60dSAndroid Build Coastguard Worker * @param flash_len Pointer to a uint32_t to store chip length. 136*8617a60dSAndroid Build Coastguard Worker * 137*8617a60dSAndroid Build Coastguard Worker * @return 0 on success, or a relevant error. 138*8617a60dSAndroid Build Coastguard Worker */ 139*8617a60dSAndroid Build Coastguard Worker int flashrom_get_size(const char *programmer, uint32_t *flash_len, 140*8617a60dSAndroid Build Coastguard Worker int verbosity); 141