xref: /aosp_15_r20/external/vboot_reference/host/lib/include/flashrom.h (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
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