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