1*4f2df630SAndroid Build Coastguard Worker /* 2*4f2df630SAndroid Build Coastguard Worker * Copyright 2018 The ChromiumOS Authors 3*4f2df630SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 4*4f2df630SAndroid Build Coastguard Worker * found in the LICENSE file. 5*4f2df630SAndroid Build Coastguard Worker */ 6*4f2df630SAndroid Build Coastguard Worker 7*4f2df630SAndroid Build Coastguard Worker #ifndef __EXTRA_USB_UPDATER_GSCTOOL_H 8*4f2df630SAndroid Build Coastguard Worker #define __EXTRA_USB_UPDATER_GSCTOOL_H 9*4f2df630SAndroid Build Coastguard Worker 10*4f2df630SAndroid Build Coastguard Worker #include <stdbool.h> 11*4f2df630SAndroid Build Coastguard Worker #include <stdint.h> 12*4f2df630SAndroid Build Coastguard Worker #include <sys/types.h> 13*4f2df630SAndroid Build Coastguard Worker 14*4f2df630SAndroid Build Coastguard Worker #include "usb_if.h" 15*4f2df630SAndroid Build Coastguard Worker 16*4f2df630SAndroid Build Coastguard Worker /* 17*4f2df630SAndroid Build Coastguard Worker * gsctool uses this structure to keep information about the communications 18*4f2df630SAndroid Build Coastguard Worker * channel used to talk to the Cr50, and about the state of the Cr50 image. 19*4f2df630SAndroid Build Coastguard Worker */ 20*4f2df630SAndroid Build Coastguard Worker struct transfer_descriptor { 21*4f2df630SAndroid Build Coastguard Worker /* 22*4f2df630SAndroid Build Coastguard Worker * Set to true for use in an upstart script. Do not reboot after 23*4f2df630SAndroid Build Coastguard Worker * transfer, and do not transfer RW if versions are the same. 24*4f2df630SAndroid Build Coastguard Worker * 25*4f2df630SAndroid Build Coastguard Worker * When using in development environment it is beneficial to transfer 26*4f2df630SAndroid Build Coastguard Worker * RW images with the same version, as they get started based on the 27*4f2df630SAndroid Build Coastguard Worker * header timestamp. 28*4f2df630SAndroid Build Coastguard Worker */ 29*4f2df630SAndroid Build Coastguard Worker int upstart_mode; 30*4f2df630SAndroid Build Coastguard Worker /* 31*4f2df630SAndroid Build Coastguard Worker * Override in case updater is used w/ boards that do not follow 32*4f2df630SAndroid Build Coastguard Worker * the cr50 versioning scheme. 33*4f2df630SAndroid Build Coastguard Worker */ 34*4f2df630SAndroid Build Coastguard Worker int background_update_supported; 35*4f2df630SAndroid Build Coastguard Worker /* 36*4f2df630SAndroid Build Coastguard Worker * Unconditionally update the inactive RO, helps to make sure both RO 37*4f2df630SAndroid Build Coastguard Worker * sections are at the same level. 38*4f2df630SAndroid Build Coastguard Worker */ 39*4f2df630SAndroid Build Coastguard Worker int force_ro; 40*4f2df630SAndroid Build Coastguard Worker /* 41*4f2df630SAndroid Build Coastguard Worker * offsets of RO and WR sections available for update (not currently 42*4f2df630SAndroid Build Coastguard Worker * active). 43*4f2df630SAndroid Build Coastguard Worker */ 44*4f2df630SAndroid Build Coastguard Worker uint32_t ro_offset; 45*4f2df630SAndroid Build Coastguard Worker uint32_t rw_offset; 46*4f2df630SAndroid Build Coastguard Worker 47*4f2df630SAndroid Build Coastguard Worker /* Do not reset the H1 immediately after update, wait for TPM reset. */ 48*4f2df630SAndroid Build Coastguard Worker int post_reset; 49*4f2df630SAndroid Build Coastguard Worker 50*4f2df630SAndroid Build Coastguard Worker /* Type of channel used to communicate with Cr50. */ 51*4f2df630SAndroid Build Coastguard Worker enum transfer_type { 52*4f2df630SAndroid Build Coastguard Worker usb_xfer = 0, /* usb interface. */ 53*4f2df630SAndroid Build Coastguard Worker dev_xfer = 1, /* /dev/tpm0 */ 54*4f2df630SAndroid Build Coastguard Worker ts_xfer = 2 /* trunks_send */ 55*4f2df630SAndroid Build Coastguard Worker } ep_type; 56*4f2df630SAndroid Build Coastguard Worker union { 57*4f2df630SAndroid Build Coastguard Worker struct usb_endpoint uep; 58*4f2df630SAndroid Build Coastguard Worker int tpm_fd; 59*4f2df630SAndroid Build Coastguard Worker }; 60*4f2df630SAndroid Build Coastguard Worker }; 61*4f2df630SAndroid Build Coastguard Worker 62*4f2df630SAndroid Build Coastguard Worker /* 63*4f2df630SAndroid Build Coastguard Worker * These are values returned by the gsctool utility, they are interpreted by 64*4f2df630SAndroid Build Coastguard Worker * the startup files to decide how to proceed (try to update to a new Cr50 65*4f2df630SAndroid Build Coastguard Worker * image or not). 66*4f2df630SAndroid Build Coastguard Worker */ 67*4f2df630SAndroid Build Coastguard Worker enum exit_values { 68*4f2df630SAndroid Build Coastguard Worker noop = 0, /* All up to date, no update needed. */ 69*4f2df630SAndroid Build Coastguard Worker all_updated = 1, /* Update completed, reboot required. */ 70*4f2df630SAndroid Build Coastguard Worker rw_updated = 2, /* RO was not updated, reboot required. */ 71*4f2df630SAndroid Build Coastguard Worker update_error = 3 /* Something went wrong. */ 72*4f2df630SAndroid Build Coastguard Worker }; 73*4f2df630SAndroid Build Coastguard Worker 74*4f2df630SAndroid Build Coastguard Worker struct board_id { 75*4f2df630SAndroid Build Coastguard Worker uint32_t type; /* Board type */ 76*4f2df630SAndroid Build Coastguard Worker uint32_t type_inv; /* Board type (inverted) */ 77*4f2df630SAndroid Build Coastguard Worker uint32_t flags; /* Flags */ 78*4f2df630SAndroid Build Coastguard Worker }; 79*4f2df630SAndroid Build Coastguard Worker 80*4f2df630SAndroid Build Coastguard Worker enum board_id_action { bid_none, bid_get, bid_set }; 81*4f2df630SAndroid Build Coastguard Worker 82*4f2df630SAndroid Build Coastguard Worker /* 83*4f2df630SAndroid Build Coastguard Worker * This function allows to retrieve or set (if not initialized) board ID of 84*4f2df630SAndroid Build Coastguard Worker * the H1 chip. If bid_action is bid_get and show_machine_output is set, 85*4f2df630SAndroid Build Coastguard Worker * prints out board ID in a machine-friendly format. 86*4f2df630SAndroid Build Coastguard Worker */ 87*4f2df630SAndroid Build Coastguard Worker void process_bid(struct transfer_descriptor *td, 88*4f2df630SAndroid Build Coastguard Worker enum board_id_action bid_action, struct board_id *bid, 89*4f2df630SAndroid Build Coastguard Worker bool show_machine_output); 90*4f2df630SAndroid Build Coastguard Worker 91*4f2df630SAndroid Build Coastguard Worker /* 92*4f2df630SAndroid Build Coastguard Worker * This function can be used to retrieve the current PP status from Cr50 and 93*4f2df630SAndroid Build Coastguard Worker * prompt the user when a PP press is required. 94*4f2df630SAndroid Build Coastguard Worker * 95*4f2df630SAndroid Build Coastguard Worker * Physical presence can be required by different gsctool options, for which 96*4f2df630SAndroid Build Coastguard Worker * Cr50 behavior also differs. The 'command' and 'poll_type' parameters are 97*4f2df630SAndroid Build Coastguard Worker * used by Cr50 to tell what the host is polling for. 98*4f2df630SAndroid Build Coastguard Worker */ 99*4f2df630SAndroid Build Coastguard Worker void poll_for_pp(struct transfer_descriptor *td, uint16_t command, 100*4f2df630SAndroid Build Coastguard Worker uint8_t poll_type); 101*4f2df630SAndroid Build Coastguard Worker 102*4f2df630SAndroid Build Coastguard Worker /* 103*4f2df630SAndroid Build Coastguard Worker * Function used to send vendor command to the Cr50 and receive a response. 104*4f2df630SAndroid Build Coastguard Worker * Returns the error code from TPM response header, which is set to zero on 105*4f2df630SAndroid Build Coastguard Worker * success. 106*4f2df630SAndroid Build Coastguard Worker */ 107*4f2df630SAndroid Build Coastguard Worker uint32_t send_vendor_command(struct transfer_descriptor *td, 108*4f2df630SAndroid Build Coastguard Worker uint16_t subcommand, const void *command_body, 109*4f2df630SAndroid Build Coastguard Worker size_t command_body_size, void *response, 110*4f2df630SAndroid Build Coastguard Worker size_t *response_size); 111*4f2df630SAndroid Build Coastguard Worker 112*4f2df630SAndroid Build Coastguard Worker #endif // __EXTRA_USB_UPDATER_GSCTOOL_H 113