xref: /aosp_15_r20/external/gsc-utils/chip/g/upgrade_fw.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
1*4f2df630SAndroid Build Coastguard Worker /* Copyright 2016 The ChromiumOS Authors
2*4f2df630SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*4f2df630SAndroid Build Coastguard Worker  * found in the LICENSE file.
4*4f2df630SAndroid Build Coastguard Worker  */
5*4f2df630SAndroid Build Coastguard Worker 
6*4f2df630SAndroid Build Coastguard Worker #ifndef __EC_CHIP_G_UPGRADE_FW_H
7*4f2df630SAndroid Build Coastguard Worker #define __EC_CHIP_G_UPGRADE_FW_H
8*4f2df630SAndroid Build Coastguard Worker 
9*4f2df630SAndroid Build Coastguard Worker #include <stddef.h>
10*4f2df630SAndroid Build Coastguard Worker 
11*4f2df630SAndroid Build Coastguard Worker #include "common.h" /* For __packed. */
12*4f2df630SAndroid Build Coastguard Worker 
13*4f2df630SAndroid Build Coastguard Worker /*
14*4f2df630SAndroid Build Coastguard Worker  * This file contains structures used to facilitate cr50 firmware updates,
15*4f2df630SAndroid Build Coastguard Worker  * which can be used on any g chip.
16*4f2df630SAndroid Build Coastguard Worker  *
17*4f2df630SAndroid Build Coastguard Worker  * The firmware update protocol consists of two phases: connection
18*4f2df630SAndroid Build Coastguard Worker  * establishment and actual image transfer.
19*4f2df630SAndroid Build Coastguard Worker  *
20*4f2df630SAndroid Build Coastguard Worker  * Image transfer is done in 1K blocks. The host supplying the image
21*4f2df630SAndroid Build Coastguard Worker  * encapsulates blocks in frames by prepending a header including the flash
22*4f2df630SAndroid Build Coastguard Worker  * offset where the block is destined and its digest.
23*4f2df630SAndroid Build Coastguard Worker  *
24*4f2df630SAndroid Build Coastguard Worker  * The CR50 device responds to each frame with a confirmation which is 1 byte
25*4f2df630SAndroid Build Coastguard Worker  * response. Zero value means success, non zero value is the error code
26*4f2df630SAndroid Build Coastguard Worker  * reported by CR50.
27*4f2df630SAndroid Build Coastguard Worker  *
28*4f2df630SAndroid Build Coastguard Worker  * To establish the connection, the host sends a different frame, which
29*4f2df630SAndroid Build Coastguard Worker  * contains no data and is destined to offset 0. Receiving such a frame
30*4f2df630SAndroid Build Coastguard Worker  * signals the CR50 that the host intends to transfer a new image.
31*4f2df630SAndroid Build Coastguard Worker  *
32*4f2df630SAndroid Build Coastguard Worker  * The connection establishment response is described by the
33*4f2df630SAndroid Build Coastguard Worker  * first_response_pdu structure below.
34*4f2df630SAndroid Build Coastguard Worker  */
35*4f2df630SAndroid Build Coastguard Worker 
36*4f2df630SAndroid Build Coastguard Worker #define UPGRADE_PROTOCOL_VERSION 6
37*4f2df630SAndroid Build Coastguard Worker 
38*4f2df630SAndroid Build Coastguard Worker /* This is the format of the update frame header. */
39*4f2df630SAndroid Build Coastguard Worker struct upgrade_command {
40*4f2df630SAndroid Build Coastguard Worker 	uint32_t block_digest; /* first 4 bytes of sha1 of the rest of the
41*4f2df630SAndroid Build Coastguard Worker 				* frame.
42*4f2df630SAndroid Build Coastguard Worker 				*/
43*4f2df630SAndroid Build Coastguard Worker 	uint32_t block_base; /* Offset of this frame into the flash SPI. */
44*4f2df630SAndroid Build Coastguard Worker 	/* The actual payload goes here. */
45*4f2df630SAndroid Build Coastguard Worker } __packed;
46*4f2df630SAndroid Build Coastguard Worker 
47*4f2df630SAndroid Build Coastguard Worker /*
48*4f2df630SAndroid Build Coastguard Worker  * This is the frame format the host uses when sending update PDUs over USB.
49*4f2df630SAndroid Build Coastguard Worker  *
50*4f2df630SAndroid Build Coastguard Worker  * The PDUs are up to 1K bytes in size, they are fragmented into USB chunks of
51*4f2df630SAndroid Build Coastguard Worker  * 64 bytes each and reassembled on the receive side before being passed to
52*4f2df630SAndroid Build Coastguard Worker  * the flash update function.
53*4f2df630SAndroid Build Coastguard Worker  *
54*4f2df630SAndroid Build Coastguard Worker  * The flash update function receives the unframed PDU body (starting at the
55*4f2df630SAndroid Build Coastguard Worker  * cmd field below), and puts its reply into the same buffer the PDU was in.
56*4f2df630SAndroid Build Coastguard Worker  */
57*4f2df630SAndroid Build Coastguard Worker struct update_frame_header {
58*4f2df630SAndroid Build Coastguard Worker 	uint32_t block_size; /* Total size of the block, including this
59*4f2df630SAndroid Build Coastguard Worker 			      * field.
60*4f2df630SAndroid Build Coastguard Worker 			      */
61*4f2df630SAndroid Build Coastguard Worker 	struct upgrade_command cmd;
62*4f2df630SAndroid Build Coastguard Worker };
63*4f2df630SAndroid Build Coastguard Worker 
64*4f2df630SAndroid Build Coastguard Worker /*
65*4f2df630SAndroid Build Coastguard Worker  * A convenience structure which allows to group together various revision
66*4f2df630SAndroid Build Coastguard Worker  * fields of the header created by the signer.
67*4f2df630SAndroid Build Coastguard Worker  *
68*4f2df630SAndroid Build Coastguard Worker  * These fields are compared when deciding if versions of two images are the
69*4f2df630SAndroid Build Coastguard Worker  * same or when deciding which one of the available images to run.
70*4f2df630SAndroid Build Coastguard Worker  */
71*4f2df630SAndroid Build Coastguard Worker struct signed_header_version {
72*4f2df630SAndroid Build Coastguard Worker 	uint32_t minor;
73*4f2df630SAndroid Build Coastguard Worker 	uint32_t major;
74*4f2df630SAndroid Build Coastguard Worker 	uint32_t epoch;
75*4f2df630SAndroid Build Coastguard Worker };
76*4f2df630SAndroid Build Coastguard Worker 
77*4f2df630SAndroid Build Coastguard Worker /*
78*4f2df630SAndroid Build Coastguard Worker  * Response to the connection establishment request.
79*4f2df630SAndroid Build Coastguard Worker  *
80*4f2df630SAndroid Build Coastguard Worker  * When responding to the very first packet of the upgrade sequence, the
81*4f2df630SAndroid Build Coastguard Worker  * original USB update implementation was responding with a four byte value,
82*4f2df630SAndroid Build Coastguard Worker  * just as to any other block of the transfer sequence.
83*4f2df630SAndroid Build Coastguard Worker  *
84*4f2df630SAndroid Build Coastguard Worker  * It became clear that there is a need to be able to enhance the upgrade
85*4f2df630SAndroid Build Coastguard Worker  * protocol, while staying backwards compatible.
86*4f2df630SAndroid Build Coastguard Worker  *
87*4f2df630SAndroid Build Coastguard Worker  * All newer protocol versions (starting with version 2) respond to the very
88*4f2df630SAndroid Build Coastguard Worker  * first packet with an 8 byte or larger response, where the first 4 bytes are
89*4f2df630SAndroid Build Coastguard Worker  * a version specific data, and the second 4 bytes - the protocol version
90*4f2df630SAndroid Build Coastguard Worker  * number.
91*4f2df630SAndroid Build Coastguard Worker  *
92*4f2df630SAndroid Build Coastguard Worker  * This way the host receiving of a four byte value in response to the first
93*4f2df630SAndroid Build Coastguard Worker  * packet is considered an indication of the target running the 'legacy'
94*4f2df630SAndroid Build Coastguard Worker  * protocol, version 1. Receiving of an 8 byte or longer response would
95*4f2df630SAndroid Build Coastguard Worker  * communicates the protocol version in the second 4 bytes.
96*4f2df630SAndroid Build Coastguard Worker  */
97*4f2df630SAndroid Build Coastguard Worker struct first_response_pdu {
98*4f2df630SAndroid Build Coastguard Worker 	uint32_t return_value;
99*4f2df630SAndroid Build Coastguard Worker 
100*4f2df630SAndroid Build Coastguard Worker 	/* The below fields are present in versions 2 and up. */
101*4f2df630SAndroid Build Coastguard Worker 	uint32_t protocol_version;
102*4f2df630SAndroid Build Coastguard Worker 
103*4f2df630SAndroid Build Coastguard Worker 	/* The below fields are present in versions 3 and up. */
104*4f2df630SAndroid Build Coastguard Worker 	uint32_t backup_ro_offset;
105*4f2df630SAndroid Build Coastguard Worker 	uint32_t backup_rw_offset;
106*4f2df630SAndroid Build Coastguard Worker 
107*4f2df630SAndroid Build Coastguard Worker 	/* The below fields are present in versions 4 and up. */
108*4f2df630SAndroid Build Coastguard Worker 	/* Versions of the currently active RO and RW sections. */
109*4f2df630SAndroid Build Coastguard Worker 	struct signed_header_version shv[2];
110*4f2df630SAndroid Build Coastguard Worker 
111*4f2df630SAndroid Build Coastguard Worker 	/* The below fields are present in versions 5 and up */
112*4f2df630SAndroid Build Coastguard Worker 	/* keyids of the currently active RO and RW sections. */
113*4f2df630SAndroid Build Coastguard Worker 	uint32_t keyid[2];
114*4f2df630SAndroid Build Coastguard Worker };
115*4f2df630SAndroid Build Coastguard Worker 
116*4f2df630SAndroid Build Coastguard Worker #define UPGRADE_DONE 0xB007AB1E
117*4f2df630SAndroid Build Coastguard Worker 
118*4f2df630SAndroid Build Coastguard Worker void fw_upgrade_command_handler(void *body, size_t cmd_size,
119*4f2df630SAndroid Build Coastguard Worker 				size_t *response_size);
120*4f2df630SAndroid Build Coastguard Worker 
121*4f2df630SAndroid Build Coastguard Worker /* Used to tell fw upgrade the update ran successfully and is finished */
122*4f2df630SAndroid Build Coastguard Worker void fw_upgrade_complete(void);
123*4f2df630SAndroid Build Coastguard Worker 
124*4f2df630SAndroid Build Coastguard Worker /* Verify integrity of the PDU received over USB. */
125*4f2df630SAndroid Build Coastguard Worker int usb_pdu_valid(struct upgrade_command *cmd_body, size_t cmd_size);
126*4f2df630SAndroid Build Coastguard Worker 
127*4f2df630SAndroid Build Coastguard Worker /* Various upgrade command return values. */
128*4f2df630SAndroid Build Coastguard Worker enum return_value {
129*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_SUCCESS = 0,
130*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_BAD_ADDR = 1,
131*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_ERASE_FAILURE = 2,
132*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_DATA_ERROR = 3,
133*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_WRITE_FAILURE = 4,
134*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_VERIFY_ERROR = 5,
135*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_GEN_ERROR = 6,
136*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_MALLOC_ERROR = 7,
137*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_ROLLBACK_ERROR = 8,
138*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_RATE_LIMIT_ERROR = 9,
139*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_UNALIGNED_BLOCK_ERROR = 10,
140*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_TRUNCATED_HEADER_ERROR = 11,
141*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_BOARD_ID_ERROR = 12,
142*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_BOARD_FLAGS_ERROR = 13,
143*4f2df630SAndroid Build Coastguard Worker 	UPGRADE_DEV_ID_MISMATCH_ERROR = 14,
144*4f2df630SAndroid Build Coastguard Worker };
145*4f2df630SAndroid Build Coastguard Worker 
146*4f2df630SAndroid Build Coastguard Worker /*
147*4f2df630SAndroid Build Coastguard Worker  * This is the size of the update frame payload, unless this is the last chunk
148*4f2df630SAndroid Build Coastguard Worker  * of the image.
149*4f2df630SAndroid Build Coastguard Worker  */
150*4f2df630SAndroid Build Coastguard Worker #define SIGNED_TRANSFER_SIZE 1024
151*4f2df630SAndroid Build Coastguard Worker 
152*4f2df630SAndroid Build Coastguard Worker #endif /* ! __EC_CHIP_G_UPGRADE_FW_H */
153