Re: [PATCH v2] platform/chrome: Update cros_ec_commands.h to latest ec commands

From: Enric Balletbo i Serra
Date: Fri Mar 13 2020 - 04:00:12 EST


Hi Gwendal,

On 13/3/20 1:02, Gwendal Grignou wrote:
> On Thu, Mar 12, 2020 at 2:48 AM Enric Balletbo i Serra
> <enric.balletbo@xxxxxxxxxxxxx> wrote:
>>
>> Hi Gwendal,
>>
>> Many thanks to send this patch upstream.
>>
>> On 12/3/20 8:19, Gwendal Grignou wrote:
>>> Update from EC code base
>>> https://chromium.googlesource.com/chromiumos/platform/ec/+/master/include/ec_commands.h
>>> Formatted to match kernel syntax.
>>>
>>
>> I know that is a bit more of work, but I suspect we will have other patches to
>> sync the ec_command file, and I wouldn't like to end with a bunch of patches
>> only saying `Update cros_ec_commands.h to latest ec commands` in our git log
>> which is meaningless.
>>
>> Could we split that patch per command functionality, so it's clear which exact
>> command we're introducing?
>>
>> (If you are fine with this approach but you don't have time, I am volunteer to
>> split that patch, just let me know ;-) )
> Thanks.
> Before we split this CL, let me fix the kenel-doc issues in the
> original file on the firmware side, as cros_ec_commands.h file is
> autogenerated.

For next changes, would make sense adding me as a reviewer in the firmware CL,
so I can give my feedback earlier?

Cheers,
Enric


>>
>> The comments below are just minor kernel-doc format issues, but there is a lot
>> of them. Just make sure that if you use kernel-doc doesn't report a warning when
>> generate the documentation, or don't use kernel-doc.
>>
>>> Add new commands:
>>> EC_CMD_RAND_NUM : Request random numbers.
>>> EC_CMD_RWSIG_INFO: Key information
>>> EC_CMD_MKBP_WAKE_MASK: Define wake up mask for MKBP events.
>>> EC_CMD_LOCATE_CHIP: For power delivery
>>> EC_CMD_REBOOT_AP_ON_G3: For testing purposes
>>> EC_CMD_GET_PD_PORT_CAPS: Get PD device information
>>> EC_CMD_FP_READ_MATCH_SECRET: Used for Finger print sensor management.
>>>
>>
>> Note that we should also update the cros_ec_trace to match current commands.
>>
>>> Update commands:
>>> EC_CMD_POWER_INFO (v0 was not used in the kernel)
>>> EC_CMD_MOTION_SENSE_CMD (Add calibration mode, online calibration info).
>>>
>>> Add new Mems sensors.
>>>
>>> Signed-off-by: Gwendal Grignou <gwendal@xxxxxxxxxxxx>
>>> ---
>>> Changes since v1: Include limits.h as U16_MAX is used.
>>>
>>> .../linux/platform_data/cros_ec_commands.h | 605 ++++++++++++++++--
>>> 1 file changed, 555 insertions(+), 50 deletions(-)
>>>
>>> diff --git a/include/linux/platform_data/cros_ec_commands.h b/include/linux/platform_data/cros_ec_commands.h
>>> index 69210881ebac8..db23bcc464dc1 100644
>>> --- a/include/linux/platform_data/cros_ec_commands.h
>>> +++ b/include/linux/platform_data/cros_ec_commands.h
>>> @@ -15,9 +15,10 @@
>>>
>>>
>>>
>>> -
>>
>> Please remove that change as is unrelated
>>
>>> #define BUILD_ASSERT(_cond)
>>>
>>> +#include <linux/limits.h>
>>> +
>>> /*
>>> * Current version of this protocol
>>> *
>>> @@ -400,7 +401,7 @@
>>> * parent structure that the alignment will still be true given the packing of
>>> * the parent structure. This is particularly important if the sub-structure
>>> * will be passed as a pointer to another function, since that function will
>>> - * not know about the misaligment caused by the parent structure's packing.
>>> + * not know about the misalignment caused by the parent structure's packing.
>>
>> This is a typo fix.
>>
>>> *
>>> * Also be very careful using __packed - particularly when nesting non-packed
>>> * structures inside packed ones. In fact, DO NOT use __packed directly;
>>> @@ -456,8 +457,7 @@
>>> (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING)
>>>
>>> /*
>>> - * Host command response codes (16-bit). Note that response codes should be
>>> - * stored in a uint16_t rather than directly in a value of this type.
>>> + * Host command response codes (16-bit).
>>> */
>>> enum ec_status {
>>> EC_RES_SUCCESS = 0,
>>> @@ -481,7 +481,10 @@ enum ec_status {
>>> EC_RES_INVALID_HEADER_CRC = 18, /* Header CRC invalid */
>>> EC_RES_INVALID_DATA_CRC = 19, /* Data CRC invalid */
>>> EC_RES_DUP_UNAVAILABLE = 20, /* Can't resend response */
>>> -};
>>> +
>>> + EC_RES_MAX = U16_MAX /**< Force enum to be 16 bits */
>>
>> This is not a kernel-doc comment, so should be just:
>> /* Force enum to be 16 bits */
>>
>>> +} __packed;
>>> +BUILD_ASSERT(sizeof(enum ec_status) == sizeof(uint16_t));
>>>
>>> /*
>>> * Host event codes. Note these are 1-based, not 0-based, because ACPI query
>>> @@ -550,7 +553,12 @@ enum host_event_code {
>>> /* EC desires to change state of host-controlled USB mux */
>>> EC_HOST_EVENT_USB_MUX = 28,
>>>
>>> - /* TABLET/LAPTOP mode or detachable base attach/detach event */
>>> + /*
>>> + * The device has changed "modes". This can be one of the following:
>>> + *
>>> + * - TABLET/LAPTOP mode
>>> + * - detachable base attach/detach event
>>> + */
>>
>> I don't see a lot more value on this new comment than the old one. Is really
>> needed to update that comment?
> To make it clear a given device can only change within 2 sets of modes.
>>
>>> EC_HOST_EVENT_MODE_CHANGE = 29,
>>>
>>> /* Keyboard recovery combo with hardware reinitialization */
>>> @@ -963,10 +971,14 @@ struct ec_response_hello {
>>> /* Get version number */
>>> #define EC_CMD_GET_VERSION 0x0002
>>>
>>> -enum ec_current_image {
>>> +
>>> +enum ec_image {
>>> EC_IMAGE_UNKNOWN = 0,
>>> EC_IMAGE_RO,
>>> - EC_IMAGE_RW
>>> + EC_IMAGE_RW,
>>> + EC_IMAGE_RW_A = EC_IMAGE_RW,
>>
>> That's weird, why define EC_IMAGE_RW_A? Can we just use EC_IMAGE_RW?
> To make it clear some newer EC have 2 images, while preserving
> backward compatibility.
> Coreboot has the same layout: RO, RW_A and RW_B.
>>
>>> + EC_IMAGE_RO_B,
>>> + EC_IMAGE_RW_B
>>
>> Add a colon at the end so if you add a new enum value the diff will be more clear.
>>
>>> };
>>>
>>> /**
>>> @@ -974,7 +986,7 @@ enum ec_current_image {
>>> * @version_string_ro: Null-terminated RO firmware version string.
>>> * @version_string_rw: Null-terminated RW firmware version string.
>>> * @reserved: Unused bytes; was previously RW-B firmware version string.
>>> - * @current_image: One of ec_current_image.
>>> + * @current_image: One of ec_image.
>>> */
>>> struct ec_response_get_version {
>>> char version_string_ro[32];
>>> @@ -1679,6 +1691,82 @@ struct ec_params_flash_select {
>>> } __ec_align4;
>>>
>>>
>>> +/**
>>> + * Request random numbers to be generated and returned.
>>
>> This will trigger a kernel-doc warning. Fix the warning or just don't use
>> kernel-doc format (/*)
>>
>>> + * Can be used to test the random number generator is truly random.
>>> + * See https://csrc.nist.gov/publications/detail/sp/800-22/rev-1a/final and
>>> + * https://webhome.phy.duke.edu/~rgb/General/dieharder.php.
>>> + */
>>> +#define EC_CMD_RAND_NUM 0x001A
>>> +#define EC_VER_RAND_NUM 0
>>> +
>>> +struct ec_params_rand_num {
>>> + uint16_t num_rand_bytes; /**< num random bytes to generate */
>>
>> Not a proper kernel-doc comment, just (/*)?
>>
>>> +} __ec_align4;
>>> +
>>> +struct ec_response_rand_num {
>>> + uint8_t rand[0]; /**< generated random numbers */
>>
>> Not a proper kernel-doc comment, just (/*)?
>>
>>> +} __ec_align4;
>>> +
>>> +BUILD_ASSERT(sizeof(struct ec_response_rand_num) == 0);
>>> +
>>> +/**
>>
>> This will trigger a kernel-doc warning. Fix the warning or just don't use
>> kernel-doc format (/*)
>>
>>> + * Get information about the key used to sign the RW firmware.
>>> + * For more details on the fields, see "struct vb21_packed_key".
>>> + */
>>> +#define EC_CMD_RWSIG_INFO 0x001B
>>> +#define EC_VER_RWSIG_INFO 0
>>> +
>>> +#define VBOOT2_KEY_ID_BYTES 20
>>> +
>>> +
>>
>> Remove the extra line.
>>
>>> +struct ec_response_rwsig_info {
>>> + /**
>>> + * Signature algorithm used by the key
>>> + * (enum vb2_signature_algorithm).
>>> + */
>>> + uint16_t sig_alg;
>>> +
>>> + /**
>>> + * Hash digest algorithm used with the key
>>> + * (enum vb2_hash_algorithm).
>>> + */
>>> + uint16_t hash_alg;
>>> +
>>> + /** Key version. */
>>> + uint32_t key_version;
>>> +
>>> + /** Key ID (struct vb2_id). */
>>> + uint8_t key_id[VBOOT2_KEY_ID_BYTES];
>>> +
>>> + uint8_t key_is_valid;
>>> +
>>> + /** Alignment padding. */
>>> + uint8_t reserved[3];
>>> +} __ec_align4;
>>> +
>>
>> Use proper kernel-doc or remove it.
>>
>>> +BUILD_ASSERT(sizeof(struct ec_response_rwsig_info) == 32);
>>> +
>>> +/**
>>
>> This will trigger a kernel-doc warning. Fix the warning or just don't use
>> kernel-doc format (/*)
>>
>> There are more kernel-doc issues below, but all are the same as above, so I'll
>> stop commenting those from now.
>>
>>
>>> + * Get information about the system, such as reset flags, locked state, etc.
>>> + */
>>> +#define EC_CMD_SYSINFO 0x001C
>>> +#define EC_VER_SYSINFO 0
>>> +
>>> +enum sysinfo_flags {
>>> + SYSTEM_IS_LOCKED = BIT(0),
>>> + SYSTEM_IS_FORCE_LOCKED = BIT(1),
>>> + SYSTEM_JUMP_ENABLED = BIT(2),
>>> + SYSTEM_JUMPED_TO_CURRENT_IMAGE = BIT(3),
>>> + SYSTEM_REBOOT_AT_SHUTDOWN = BIT(4)
>>> +};
>>> +
>>> +struct ec_response_sysinfo {
>>> + uint32_t reset_flags; /**< EC_RESET_FLAG_* flags */
>>> + uint32_t current_image; /**< enum ec_current_image */
>>> + uint32_t flags; /**< enum sysinfo_flags */
>>> +} __ec_align4;
>>> +
>>> /*****************************************************************************/
>>> /* PWM commands */
>>>
>>> @@ -2283,7 +2371,7 @@ enum motionsense_command {
>>>
>>> /*
>>> * Sensor Offset command is a setter/getter command for the offset
>>> - * used for calibration.
>>> + * used for factory calibration.
>>> * The offsets can be calculated by the host, or via
>>> * PERFORM_CALIB command.
>>> */
>>> @@ -2328,6 +2416,11 @@ enum motionsense_command {
>>> */
>>> MOTIONSENSE_CMD_SENSOR_SCALE = 18,
>>>
>>> + /*
>>> + * Read the current online calibration values (if available).
>>> + */
>>> + MOTIONSENSE_CMD_ONLINE_CALIB_READ = 19,
>>> +
>>> /* Number of motionsense sub-commands. */
>>> MOTIONSENSE_NUM_CMDS
>>> };
>>> @@ -2342,6 +2435,7 @@ enum motionsensor_type {
>>> MOTIONSENSE_TYPE_ACTIVITY = 5,
>>> MOTIONSENSE_TYPE_BARO = 6,
>>> MOTIONSENSE_TYPE_SYNC = 7,
>>> + MOTIONSENSE_TYPE_LIGHT_RGB = 8,
>>> MOTIONSENSE_TYPE_MAX,
>>> };
>>>
>>> @@ -2375,6 +2469,9 @@ enum motionsensor_chip {
>>> MOTIONSENSE_CHIP_LSM6DS3 = 17,
>>> MOTIONSENSE_CHIP_LSM6DSO = 18,
>>> MOTIONSENSE_CHIP_LNG2DM = 19,
>>> + MOTIONSENSE_CHIP_TCS3400 = 20,
>>> + MOTIONSENSE_CHIP_LIS2DW12 = 21,
>>> + MOTIONSENSE_CHIP_LIS2DWL = 22,
>>> MOTIONSENSE_CHIP_MAX,
>>> };
>>>
>>> @@ -2407,6 +2504,12 @@ struct ec_response_motion_sensor_data {
>>> };
>>> } __ec_todo_packed;
>>>
>>> +/* Response to AP reporting calibration data for a given sensor. */
>>> +struct ec_response_online_calibration_data {
>>> + /** The calibration values. */
>>> + int16_t data[3];
>>> +};
>>> +
>>> /* Note: used in ec_response_get_next_data */
>>> struct ec_response_motion_sense_fifo_info {
>>> /* Size of the fifo */
>>> @@ -2517,12 +2620,19 @@ struct ec_params_motion_sense {
>>>
>>> /*
>>> * Used for MOTIONSENSE_CMD_INFO, MOTIONSENSE_CMD_DATA
>>> - * and MOTIONSENSE_CMD_PERFORM_CALIB.
>>> */
>>> struct __ec_todo_unpacked {
>>> uint8_t sensor_num;
>>> - } info, info_3, data, fifo_flush, perform_calib,
>>> - list_activities;
>>> + } info, info_3, info_4, data, fifo_flush, list_activities;
>>> +
>>> + /*
>>> + * Used for MOTIONSENSE_CMD_PERFORM_CALIB:
>>> + * Allow entering/exiting the calibration mode.
>>> + */
>>> + struct __ec_todo_unpacked {
>>> + uint8_t sensor_num;
>>> + uint8_t enable;
>>> + } perform_calib;
>>>
>>> /*
>>> * Used for MOTIONSENSE_CMD_EC_RATE, MOTIONSENSE_CMD_SENSOR_ODR
>>> @@ -2656,9 +2766,23 @@ struct ec_params_motion_sense {
>>> */
>>> int16_t hys_degree;
>>> } tablet_mode_threshold;
>>> +
>>> + /*
>>> + * Used for MOTIONSENSE_CMD_ONLINE_CALIB_READ:
>>> + * Allow reading a single sensor's online calibration value.
>>> + */
>>> + struct __ec_todo_unpacked {
>>> + uint8_t sensor_num;
>>> + } online_calib_read;
>>> +
>>> };
>>> } __ec_todo_packed;
>>>
>>> +enum motion_sense_cmd_info_flags {
>>> + /* The sensor supports online calibration */
>>> + MOTION_SENSE_CMD_INFO_FLAG_ONLINE_CALIB = BIT(0),
>>> +};
>>> +
>>> struct ec_response_motion_sense {
>>> union {
>>> /* Used for MOTIONSENSE_CMD_DUMP */
>>> @@ -2709,6 +2833,33 @@ struct ec_response_motion_sense {
>>> uint32_t fifo_max_event_count;
>>> } info_3;
>>>
>>> + /* Used for MOTIONSENSE_CMD_INFO version 4 */
>>> + struct __ec_align4 {
>>> + /* Should be element of enum motionsensor_type. */
>>> + uint8_t type;
>>> +
>>> + /* Should be element of enum motionsensor_location. */
>>> + uint8_t location;
>>> +
>>> + /* Should be element of enum motionsensor_chip. */
>>> + uint8_t chip;
>>> +
>>> + /* Minimum sensor sampling frequency */
>>> + uint32_t min_frequency;
>>> +
>>> + /* Maximum sensor sampling frequency */
>>> + uint32_t max_frequency;
>>> +
>>> + /* Max number of sensor events that could be in fifo */
>>> + uint32_t fifo_max_event_count;
>>> +
>>> + /*
>>> + * Should be elements of
>>> + * enum motion_sense_cmd_info_flags
>>> + */
>>> + uint32_t flags;
>>> + } info_4;
>>> +
>>> /* Used for MOTIONSENSE_CMD_DATA */
>>> struct ec_response_motion_sensor_data data;
>>>
>>> @@ -2744,6 +2895,8 @@ struct ec_response_motion_sense {
>>>
>>> struct ec_response_motion_sense_fifo_data fifo_read;
>>>
>>> + struct ec_response_online_calibration_data online_calib_read;
>>> +
>>> struct __ec_todo_packed {
>>> uint16_t reserved;
>>> uint32_t enabled;
>>> @@ -2806,10 +2959,34 @@ struct ec_params_config_power_button {
>>> /* Set USB port charging mode */
>>> #define EC_CMD_USB_CHARGE_SET_MODE 0x0030
>>>
>>> +enum usb_charge_mode {
>>> + /* Disable USB port. */
>>> + USB_CHARGE_MODE_DISABLED,
>>> + /* Set USB port to Standard Downstream Port, USB 2.0 mode. */
>>> + USB_CHARGE_MODE_SDP2,
>>> + /* Set USB port to Charging Downstream Port, BC 1.2. */
>>> + USB_CHARGE_MODE_CDP,
>>> + /* Set USB port to Dedicated Charging Port, BC 1.2. */
>>> + USB_CHARGE_MODE_DCP_SHORT,
>>> + /* Enable USB port (for dumb ports). */
>>> + USB_CHARGE_MODE_ENABLED,
>>> + /* Set USB port to CONFIG_USB_PORT_POWER_SMART_DEFAULT_MODE. */
>>> + USB_CHARGE_MODE_DEFAULT,
>>> +
>>> + USB_CHARGE_MODE_COUNT
>>> +};
>>> +
>>> +enum usb_suspend_charge {
>>> + /* Enable charging in suspend */
>>> + USB_ALLOW_SUSPEND_CHARGE,
>>> + /* Disable charging in suspend */
>>> + USB_DISALLOW_SUSPEND_CHARGE
>>> +};
>>> +
>>> struct ec_params_usb_charge_set_mode {
>>> uint8_t usb_port_id;
>>> - uint8_t mode:7;
>>> - uint8_t inhibit_charge:1;
>>> + uint8_t mode:7; /* enum usb_charge_mode */
>>> + uint8_t inhibit_charge:1; /* enum usb_suspend_charge */
>>> } __ec_align1;
>>>
>>> /*****************************************************************************/
>>> @@ -3374,6 +3551,12 @@ enum ec_mkbp_event {
>>> /* Send an incoming CEC message to the AP */
>>> EC_MKBP_EVENT_CEC_MESSAGE = 9,
>>>
>>> + /* We have entered DisplayPort Alternate Mode on a Type-C port. */
>>> + EC_MKBP_EVENT_DP_ALT_MODE_ENTERED = 10,
>>> +
>>> + /* New online calibration values are available. */
>>> + EC_MKBP_EVENT_ONLINE_CALIBRATION = 11,
>>> +
>>> /* Number of MKBP events */
>>> EC_MKBP_EVENT_COUNT,
>>> };
>>> @@ -3497,6 +3680,57 @@ struct ec_response_keyboard_factory_test {
>>> #define EC_MKBP_FP_ERR_MATCH_YES_UPDATE_FAILED 5
>>>
>>>
>>> +#define EC_CMD_MKBP_WAKE_MASK 0x0069
>>> +enum ec_mkbp_event_mask_action {
>>> + /* Retrieve the value of a wake mask. */
>>> + GET_WAKE_MASK = 0,
>>> +
>>> + /* Set the value of a wake mask. */
>>> + SET_WAKE_MASK,
>>> +};
>>> +
>>> +enum ec_mkbp_mask_type {
>>> + /*
>>> + * These are host events sent via MKBP.
>>> + *
>>> + * Some examples are:
>>> + * EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_OPEN)
>>> + * EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEY_PRESSED)
>>> + *
>>> + * The only things that should be in this mask are:
>>> + * EC_HOST_EVENT_MASK(EC_HOST_EVENT_*)
>>> + */
>>> + EC_MKBP_HOST_EVENT_WAKE_MASK = 0,
>>> +
>>> + /*
>>> + * These are MKBP events. Some examples are:
>>> + *
>>> + * EC_MKBP_EVENT_KEY_MATRIX
>>> + * EC_MKBP_EVENT_SWITCH
>>> + *
>>> + * The only things that should be in this mask are EC_MKBP_EVENT_*.
>>> + */
>>> + EC_MKBP_EVENT_WAKE_MASK,
>>> +};
>>> +
>>> +struct ec_params_mkbp_event_wake_mask {
>>> + /* One of enum ec_mkbp_event_mask_action */
>>> + uint8_t action;
>>> +
>>> + /*
>>> + * Which MKBP mask are you interested in acting upon? This is one of
>>> + * ec_mkbp_mask_type.
>>> + */
>>> + uint8_t mask_type;
>>> +
>>> + /* If setting a new wake mask, this contains the mask to set. */
>>> + uint32_t new_wake_mask;
>>> +};
>>> +
>>> +struct ec_response_mkbp_event_wake_mask {
>>> + uint32_t wake_mask;
>>> +};
>>> +
>>> /*****************************************************************************/
>>> /* Temperature sensor commands */
>>>
>>> @@ -3879,16 +4113,69 @@ struct ec_response_ldo_get {
>>>
>>> /*
>>> * Get power info.
>>> + *
>>> + * Note: v0 of this command is deprecated
>>> */
>>> #define EC_CMD_POWER_INFO 0x009D
>>>
>>> -struct ec_response_power_info {
>>> - uint32_t usb_dev_type;
>>> - uint16_t voltage_ac;
>>> - uint16_t voltage_system;
>>> - uint16_t current_system;
>>> - uint16_t usb_current_limit;
>>> -} __ec_align4;
>>> +/*
>>> + * v1 of EC_CMD_POWER_INFO
>>> + */
>>> +enum system_power_source {
>>> + /*
>>> + * Haven't established which power source is used yet,
>>> + * or no presence signals are available
>>> + */
>>> + POWER_SOURCE_UNKNOWN = 0,
>>> + /* System is running on battery alone */
>>> + POWER_SOURCE_BATTERY = 1,
>>> + /* System is running on A/C alone */
>>> + POWER_SOURCE_AC = 2,
>>> + /* System is running on A/C and battery */
>>> + POWER_SOURCE_AC_BATTERY = 3,
>>> +};
>>> +
>>> +struct ec_response_power_info_v1 {
>>> + /* enum system_power_source */
>>> + uint8_t system_power_source;
>>> + /* Battery state-of-charge, 0-100, 0 if not present */
>>> + uint8_t battery_soc;
>>> + /* AC Adapter 100% rating, Watts */
>>> + uint8_t ac_adapter_100pct;
>>> + /* AC Adapter 10ms rating, Watts */
>>> + uint8_t ac_adapter_10ms;
>>> + /* Battery 1C rating, derated */
>>> + uint8_t battery_1cd;
>>> + /* Rest of Platform average, Watts */
>>> + uint8_t rop_avg;
>>> + /* Rest of Platform peak, Watts */
>>> + uint8_t rop_peak;
>>> + /* Nominal charger efficiency, % */
>>> + uint8_t nominal_charger_eff;
>>> + /* Rest of Platform VR Average Efficiency, % */
>>> + uint8_t rop_avg_eff;
>>> + /* Rest of Platform VR Peak Efficiency, % */
>>> + uint8_t rop_peak_eff;
>>> + /* SoC VR Efficiency at Average level, % */
>>> + uint8_t soc_avg_eff;
>>> + /* SoC VR Efficiency at Peak level, % */
>>> + uint8_t soc_peak_eff;
>>> + /* Intel-specific items */
>>> + struct {
>>> + /* Battery's level of DBPT support: 0, 2 */
>>> + uint8_t batt_dbpt_support_level;
>>> + /*
>>> + * Maximum peak power from battery (10ms), Watts
>>> + * If DBPT is not supported, this is 0
>>> + */
>>> + uint8_t batt_dbpt_max_peak_power;
>>> + /*
>>> + * Sustained peak power from battery, Watts
>>> + * If DBPT is not supported, this is 0
>>> + */
>>> + uint8_t batt_dbpt_sus_peak_power;
>>> + } intel;
>>> +} __ec_align1;
>>>
>>> /*****************************************************************************/
>>> /* I2C passthru command */
>>> @@ -3908,7 +4195,7 @@ struct ec_response_power_info {
>>> #define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT)
>>>
>>> struct ec_params_i2c_passthru_msg {
>>> - uint16_t addr_flags; /* I2C slave address (7 or 10 bits) and flags */
>>> + uint16_t addr_flags; /* I2C slave address and flags */
>>> uint16_t len; /* Number of bytes to read or write */
>>> } __ec_align2;
>>>
>>> @@ -4360,6 +4647,9 @@ struct ec_response_sb_fw_update {
>>> * Entering Verified Boot Mode Command
>>> * Default mode is VBOOT_MODE_NORMAL if EC did not receive this command.
>>> * Valid Modes are: normal, developer, and recovery.
>>> + *
>>> + * EC no longer needs to know what mode vboot has entered,
>>> + * so this command is deprecated. (See chromium:1014379.)
>>> */
>>> #define EC_CMD_ENTERING_MODE 0x00B6
>>>
>>> @@ -4379,8 +4669,9 @@ struct ec_params_entering_mode {
>>> #define EC_CMD_I2C_PASSTHRU_PROTECT 0x00B7
>>>
>>> enum ec_i2c_passthru_protect_subcmd {
>>> - EC_CMD_I2C_PASSTHRU_PROTECT_STATUS = 0x0,
>>> - EC_CMD_I2C_PASSTHRU_PROTECT_ENABLE = 0x1,
>>> + EC_CMD_I2C_PASSTHRU_PROTECT_STATUS = 0,
>>> + EC_CMD_I2C_PASSTHRU_PROTECT_ENABLE = 1,
>>> + EC_CMD_I2C_PASSTHRU_PROTECT_ENABLE_TCPCS = 2,
>>> };
>>>
>>> struct ec_params_i2c_passthru_protect {
>>> @@ -4893,7 +5184,7 @@ struct ec_params_usb_pd_control {
>>> #define PD_CTRL_RESP_ROLE_DR_POWER BIT(3) /* Partner is dualrole power */
>>> #define PD_CTRL_RESP_ROLE_DR_DATA BIT(4) /* Partner is dualrole data */
>>> #define PD_CTRL_RESP_ROLE_USB_COMM BIT(5) /* Partner USB comm capable */
>>> -#define PD_CTRL_RESP_ROLE_EXT_POWERED BIT(6) /* Partner externally powerd */
>>> +#define PD_CTRL_RESP_ROLE_UNCONSTRAINED BIT(6) /* Partner unconstrained power */
>>>
>>> struct ec_response_usb_pd_control {
>>> uint8_t enabled;
>>> @@ -4909,23 +5200,45 @@ struct ec_response_usb_pd_control_v1 {
>>> char state[32];
>>> } __ec_align1;
>>>
>>> -/* Values representing usbc PD CC state */
>>> -#define USBC_PD_CC_NONE 0 /* No accessory connected */
>>> -#define USBC_PD_CC_NO_UFP 1 /* No UFP accessory connected */
>>> -#define USBC_PD_CC_AUDIO_ACC 2 /* Audio accessory connected */
>>> -#define USBC_PD_CC_DEBUG_ACC 3 /* Debug accessory connected */
>>> -#define USBC_PD_CC_UFP_ATTACHED 4 /* UFP attached to usbc */
>>> -#define USBC_PD_CC_DFP_ATTACHED 5 /* DPF attached to usbc */
>>> +/* Possible port partner connections based on CC line states */
>>> +enum pd_cc_states {
>>> + PD_CC_NONE = 0, /* No port partner attached */
>>> +
>>> + /* From DFP perspective */
>>> + PD_CC_UFP_NONE = 1, /* No UFP accessory connected */
>>> + PD_CC_UFP_AUDIO_ACC = 2, /* UFP Audio accessory connected */
>>> + PD_CC_UFP_DEBUG_ACC = 3, /* UFP Debug accessory connected */
>>> + PD_CC_UFP_ATTACHED = 4, /* Plain UFP attached */
>>>
>>> + /* From UFP perspective */
>>> + PD_CC_DFP_ATTACHED = 5, /* Plain DFP attached */
>>> + PD_CC_DFP_DEBUG_ACC = 6, /* DFP debug accessory connected */
>>> +};
>>> +
>>> +/* Active/Passive Cable */
>>> +#define USB_PD_CTRL_ACTIVE_CABLE BIT(0)
>>> +/* Optical/Non-optical cable */
>>> +#define USB_PD_CTRL_OPTICAL_CABLE BIT(1)
>>> +/* 3rd Gen TBT device (or AMA)/2nd gen tbt Adapter */
>>> +#define USB_PD_CTRL_TBT_LEGACY_ADAPTER BIT(2)
>>> +/* Active Link Uni-Direction */
>>> +#define USB_PD_CTRL_ACTIVE_LINK_UNIDIR BIT(3)
>>> +
>>> +/*
>>> + * Underdevelopement :
>>> + * Please remove this tag if using _v2 outside platform/ec
>>> + */
>>> struct ec_response_usb_pd_control_v2 {
>>> uint8_t enabled;
>>> uint8_t role;
>>> uint8_t polarity;
>>> char state[32];
>>> - uint8_t cc_state; /* USBC_PD_CC_*Encoded cc state */
>>> - uint8_t dp_mode; /* Current DP pin mode (MODE_DP_PIN_[A-E]) */
>>> - /* CL:1500994 Current cable type */
>>> - uint8_t reserved_cable_type;
>>> + uint8_t cc_state; /* enum pd_cc_states representing cc state */
>>> + uint8_t dp_mode; /* Current DP pin mode (MODE_DP_PIN_[A-E]) */
>>> + uint8_t reserved; /* Reserved for future use */
>>> + uint8_t control_flags; /* USB_PD_CTRL_*flags */
>>> + uint8_t cable_speed; /* TBT_SS_* cable speed */
>>> + uint8_t cable_gen; /* TBT_GEN3_* cable rounded support */
>>> } __ec_align1;
>>>
>>> #define EC_CMD_USB_PD_PORTS 0x0102
>>> @@ -5021,7 +5334,7 @@ struct ec_params_usb_pd_rw_hash_entry {
>>> * TODO(rspangler) but it's not aligned!
>>> * Should have been reserved[2].
>>> */
>>> - uint32_t current_image; /* One of ec_current_image */
>>> + uint32_t current_image; /* One of ec_image */
>>> } __ec_align1;
>>>
>>> /* Read USB-PD Accessory info */
>>> @@ -5046,7 +5359,7 @@ struct ec_params_usb_pd_discovery_entry {
>>> enum usb_pd_override_ports {
>>> OVERRIDE_DONT_CHARGE = -2,
>>> OVERRIDE_OFF = -1,
>>> - /* [0, CONFIG_USB_PD_PORT_COUNT): Port# */
>>> + /* [0, CONFIG_USB_PD_PORT_MAX_COUNT): Port# */
>>> };
>>>
>>> struct ec_params_charge_port_override {
>>> @@ -5207,11 +5520,18 @@ struct ec_params_usb_pd_mux_info {
>>> } __ec_align1;
>>>
>>> /* Flags representing mux state */
>>> -#define USB_PD_MUX_USB_ENABLED BIT(0) /* USB connected */
>>> -#define USB_PD_MUX_DP_ENABLED BIT(1) /* DP connected */
>>> -#define USB_PD_MUX_POLARITY_INVERTED BIT(2) /* CC line Polarity inverted */
>>> -#define USB_PD_MUX_HPD_IRQ BIT(3) /* HPD IRQ is asserted */
>>> -#define USB_PD_MUX_HPD_LVL BIT(4) /* HPD level is asserted */
>>> +#define USB_PD_MUX_NONE 0 /* Open switch */
>>> +#define USB_PD_MUX_USB_ENABLED BIT(0) /* USB connected */
>>> +#define USB_PD_MUX_DP_ENABLED BIT(1) /* DP connected */
>>> +#define USB_PD_MUX_POLARITY_INVERTED BIT(2) /* CC line Polarity inverted */
>>> +#define USB_PD_MUX_HPD_IRQ BIT(3) /* HPD IRQ is asserted */
>>> +#define USB_PD_MUX_HPD_LVL BIT(4) /* HPD level is asserted */
>>> +#define USB_PD_MUX_SAFE_MODE BIT(5) /* DP is in safe mode */
>>> +#define USB_PD_MUX_TBT_COMPAT_ENABLED BIT(6) /* TBT compat enabled */
>>> +#define USB_PD_MUX_USB4_ENABLED BIT(7) /* USB4 enabled */
>>> +
>>> +/* USB-C Dock connected */
>>> +#define USB_PD_MUX_DOCK (USB_PD_MUX_USB_ENABLED | USB_PD_MUX_DP_ENABLED)
>>>
>>> struct ec_response_usb_pd_mux_info {
>>> uint8_t flags; /* USB_PD_MUX_*-encoded USB mux state */
>>> @@ -5221,7 +5541,12 @@ struct ec_response_usb_pd_mux_info {
>>>
>>> struct ec_params_pd_chip_info {
>>> uint8_t port; /* USB-C port number */
>>> - uint8_t renew; /* Force renewal */
>>> + /*
>>> + * Fetch the live chip info or hard-coded + cached chip info
>>> + * 0: hardcoded value for VID/PID, cached value for FW version
>>> + * 1: live chip value for VID/PID/FW Version
>>> + */
>>> + uint8_t live;
>>> } __ec_align1;
>>>
>>> struct ec_response_pd_chip_info {
>>> @@ -5293,6 +5618,7 @@ enum cbi_data_tag {
>>> CBI_TAG_DRAM_PART_NUM = 3, /* variable length ascii, nul terminated. */
>>> CBI_TAG_OEM_NAME = 4, /* variable length ascii, nul terminated. */
>>> CBI_TAG_MODEL_ID = 5, /* uint32_t or smaller */
>>> + CBI_TAG_FW_CONFIG = 6, /* uint32_t bit field */
>>> CBI_TAG_COUNT,
>>> };
>>>
>>> @@ -5332,6 +5658,32 @@ struct ec_params_set_cbi {
>>> */
>>> #define EC_CMD_GET_UPTIME_INFO 0x0121
>>>
>>> +/* Reset causes */
>>> +#define EC_RESET_FLAG_OTHER BIT(0) /* Other known reason */
>>> +#define EC_RESET_FLAG_RESET_PIN BIT(1) /* Reset pin asserted */
>>> +#define EC_RESET_FLAG_BROWNOUT BIT(2) /* Brownout */
>>> +#define EC_RESET_FLAG_POWER_ON BIT(3) /* Power-on reset */
>>> +#define EC_RESET_FLAG_WATCHDOG BIT(4) /* Watchdog timer reset */
>>> +#define EC_RESET_FLAG_SOFT BIT(5) /* Soft reset trigger by core */
>>> +#define EC_RESET_FLAG_HIBERNATE BIT(6) /* Wake from hibernate */
>>> +#define EC_RESET_FLAG_RTC_ALARM BIT(7) /* RTC alarm wake */
>>> +#define EC_RESET_FLAG_WAKE_PIN BIT(8) /* Wake pin triggered wake */
>>> +#define EC_RESET_FLAG_LOW_BATTERY BIT(9) /* Low battery triggered wake */
>>> +#define EC_RESET_FLAG_SYSJUMP BIT(10) /* Jumped directly to this image */
>>> +#define EC_RESET_FLAG_HARD BIT(11) /* Hard reset from software */
>>> +#define EC_RESET_FLAG_AP_OFF BIT(12) /* Do not power on AP */
>>> +#define EC_RESET_FLAG_PRESERVED BIT(13) /* Some reset flags preserved from
>>> + * previous boot
>>> + */
>>> +#define EC_RESET_FLAG_USB_RESUME BIT(14) /* USB resume triggered wake */
>>> +#define EC_RESET_FLAG_RDD BIT(15) /* USB Type-C debug cable */
>>> +#define EC_RESET_FLAG_RBOX BIT(16) /* Fixed Reset Functionality */
>>> +#define EC_RESET_FLAG_SECURITY BIT(17) /* Security threat */
>>> +#define EC_RESET_FLAG_AP_WATCHDOG BIT(18) /* AP experienced a watchdog reset */
>>> +#define EC_RESET_FLAG_STAY_IN_RO BIT(19) /* Do not select RW in EFS. This
>>> + * enables PD in RO for Chromebox.
>>> + */
>>> +
>>> struct ec_response_uptime_info {
>>> /*
>>> * Number of milliseconds since the last EC boot. Sysjump resets
>>> @@ -5352,8 +5704,8 @@ struct ec_response_uptime_info {
>>> uint32_t ap_resets_since_ec_boot;
>>>
>>> /*
>>> - * The set of flags which describe the EC's most recent reset. See
>>> - * include/system.h RESET_FLAG_* for details.
>>> + * The set of flags which describe the EC's most recent reset.
>>> + * See EC_RESET_FLAG_* for details.
>>> */
>>> uint32_t ec_reset_flags;
>>>
>>> @@ -5430,6 +5782,133 @@ struct ec_response_rollback_info {
>>> /* Issue AP reset */
>>> #define EC_CMD_AP_RESET 0x0125
>>>
>>> +/*****************************************************************************/
>>> +/* Locate peripheral chips
>>> + *
>>> + * Return values:
>>> + * EC_RES_UNAVAILABLE: The chip type is supported but not found on system.
>>> + * EC_RES_INVALID_PARAM: The chip type was unrecognized.
>>> + * EC_RES_OVERFLOW: The index number exceeded the number of chip instances.
>>> + */
>>> +#define EC_CMD_LOCATE_CHIP 0x0126
>>> +
>>> +enum ec_chip_type {
>>> + EC_CHIP_TYPE_CBI_EEPROM = 0,
>>> + EC_CHIP_TYPE_TCPC = 1,
>>> + EC_CHIP_TYPE_COUNT,
>>> + EC_CHIP_TYPE_MAX = 0xFF,
>>> +};
>>> +
>>> +enum ec_bus_type {
>>> + EC_BUS_TYPE_I2C = 0,
>>> + EC_BUS_TYPE_EMBEDDED = 1,
>>> + EC_BUS_TYPE_COUNT,
>>> + EC_BUS_TYPE_MAX = 0xFF,
>>> +};
>>> +
>>> +struct ec_i2c_info {
>>> + uint16_t port; /* Physical port for device */
>>> + uint16_t addr_flags; /* 7-bit (or 10-bit) address */
>>> +};
>>> +
>>> +struct ec_params_locate_chip {
>>> + uint8_t type; /* enum ec_chip_type */
>>> + uint8_t index; /* Specifies one instance of chip type */
>>> + /* Used for type specific parameters in future */
>>> + union {
>>> + uint16_t reserved;
>>> + };
>>> +} __ec_align2;
>>> +
>>> +
>>> +struct ec_response_locate_chip {
>>> + uint8_t bus_type; /* enum ec_bus_type */
>>> + uint8_t reserved; /* Aligning the following union to 2 bytes */
>>> + union {
>>> + struct ec_i2c_info i2c_info;
>>> + };
>>> +} __ec_align2;
>>> +
>>> +/*
>>> + * Reboot AP on G3
>>> + *
>>> + * This command is used for validation purpose, where the AP needs to be
>>> + * returned back to S0 state from G3 state without using the servo to trigger
>>> + * wake events.For this,there is no request or response struct.
>>> + *
>>> + * Order of command usage:
>>> + * ectool reboot_ap_on_g3 && shutdown -h now
>>> + */
>>> +#define EC_CMD_REBOOT_AP_ON_G3 0x0127
>>> +
>>> +/*****************************************************************************/
>>> +/* Get PD port capabilities
>>> + *
>>> + * Returns the following static *capabilities* of the given port:
>>> + * 1) Power role: source, sink, or dual. It is not anticipated that
>>> + * future CrOS devices would ever be only a source, so the options are
>>> + * sink or dual.
>>> + * 2) Try-power role: source, sink, or none (practically speaking, I don't
>>> + * believe any CrOS device would support Try.SNK, so this would be source
>>> + * or none).
>>> + * 3) Data role: dfp, ufp, or dual. This will probably only be DFP or dual
>>> + * for CrOS devices.
>>> + */
>>> +#define EC_CMD_GET_PD_PORT_CAPS 0x0128
>>> +
>>> +enum ec_pd_power_role_caps {
>>> + EC_PD_POWER_ROLE_SOURCE = 0,
>>> + EC_PD_POWER_ROLE_SINK = 1,
>>> + EC_PD_POWER_ROLE_DUAL = 2,
>>> +};
>>> +
>>> +enum ec_pd_try_power_role_caps {
>>> + EC_PD_TRY_POWER_ROLE_NONE = 0,
>>> + EC_PD_TRY_POWER_ROLE_SINK = 1,
>>> + EC_PD_TRY_POWER_ROLE_SOURCE = 2,
>>> +};
>>> +
>>> +enum ec_pd_data_role_caps {
>>> + EC_PD_DATA_ROLE_DFP = 0,
>>> + EC_PD_DATA_ROLE_UFP = 1,
>>> + EC_PD_DATA_ROLE_DUAL = 2,
>>> +};
>>> +
>>> +/* From: power_manager/power_supply_properties.proto */
>>> +enum ec_pd_port_location {
>>> + /* The location of the port is unknown, or there's only one port. */
>>> + EC_PD_PORT_LOCATION_UNKNOWN = 0,
>>> +
>>> + /*
>>> + * Various positions on the device. The first word describes the side of
>>> + * the device where the port is located while the second clarifies the
>>> + * position. For example, LEFT_BACK means the farthest-back port on the
>>> + * left side, while BACK_LEFT means the leftmost port on the back of the
>>> + * device.
>>> + */
>>> + EC_PD_PORT_LOCATION_LEFT = 1,
>>> + EC_PD_PORT_LOCATION_RIGHT = 2,
>>> + EC_PD_PORT_LOCATION_BACK = 3,
>>> + EC_PD_PORT_LOCATION_FRONT = 4,
>>> + EC_PD_PORT_LOCATION_LEFT_FRONT = 5,
>>> + EC_PD_PORT_LOCATION_LEFT_BACK = 6,
>>> + EC_PD_PORT_LOCATION_RIGHT_FRONT = 7,
>>> + EC_PD_PORT_LOCATION_RIGHT_BACK = 8,
>>> + EC_PD_PORT_LOCATION_BACK_LEFT = 9,
>>> + EC_PD_PORT_LOCATION_BACK_RIGHT = 10,
>>> +};
>>> +
>>> +struct ec_params_get_pd_port_caps {
>>> + uint8_t port; /* Which port to interrogate */
>>> +} __ec_align1;
>>> +
>>> +struct ec_response_get_pd_port_caps {
>>> + uint8_t pd_power_role_cap; /* enum ec_pd_power_role_caps */
>>> + uint8_t pd_try_power_role_cap; /* enum ec_pd_try_power_role_caps */
>>> + uint8_t pd_data_role_cap; /* enum ec_pd_data_role_caps */
>>> + uint8_t pd_port_location; /* enum ec_pd_port_location */
>>> +} __ec_align1;
>>> +
>>> /*****************************************************************************/
>>> /* The command range 0x200-0x2FF is reserved for Rotor. */
>>>
>>> @@ -5585,15 +6064,18 @@ struct ec_response_fp_info {
>>> #define FP_FRAME_OFFSET_MASK 0x0FFFFFFF
>>>
>>> /* Version of the format of the encrypted templates. */
>>> -#define FP_TEMPLATE_FORMAT_VERSION 3
>>> +#define FP_TEMPLATE_FORMAT_VERSION 4
>>>
>>> /* Constants for encryption parameters */
>>> #define FP_CONTEXT_NONCE_BYTES 12
>>> #define FP_CONTEXT_USERID_WORDS (32 / sizeof(uint32_t))
>>> #define FP_CONTEXT_TAG_BYTES 16
>>> -#define FP_CONTEXT_SALT_BYTES 16
>>> +#define FP_CONTEXT_ENCRYPTION_SALT_BYTES 16
>>> #define FP_CONTEXT_TPM_BYTES 32
>>>
>>> +/* Constants for positive match parameters. */
>>> +#define FP_POSITIVE_MATCH_SALT_BYTES 16
>>> +
>>> struct ec_fp_template_encryption_metadata {
>>> /*
>>> * Version of the structure format (N=3).
>>> @@ -5606,7 +6088,7 @@ struct ec_fp_template_encryption_metadata {
>>> * a different one is used for every message.
>>> */
>>> uint8_t nonce[FP_CONTEXT_NONCE_BYTES];
>>> - uint8_t salt[FP_CONTEXT_SALT_BYTES];
>>> + uint8_t encryption_salt[FP_CONTEXT_ENCRYPTION_SALT_BYTES];
>>> uint8_t tag[FP_CONTEXT_TAG_BYTES];
>>> };
>>>
>>> @@ -5639,6 +6121,18 @@ struct ec_params_fp_context {
>>> uint32_t userid[FP_CONTEXT_USERID_WORDS];
>>> } __ec_align4;
>>>
>>> +enum fp_context_action {
>>> + FP_CONTEXT_ASYNC = 0,
>>> + FP_CONTEXT_GET_RESULT = 1,
>>> +};
>>> +
>>> +/* Version 1 of the command is "asynchronous". */
>>> +struct ec_params_fp_context_v1 {
>>> + uint8_t action; /**< enum fp_context_action */
>>> + uint8_t reserved[3]; /**< padding for alignment */
>>> + uint32_t userid[FP_CONTEXT_USERID_WORDS];
>>> +} __ec_align4;
>>> +
>>> #define EC_CMD_FP_STATS 0x0407
>>>
>>> #define FPSTATS_CAPTURE_INV BIT(0)
>>> @@ -5680,6 +6174,17 @@ struct ec_response_fp_encryption_status {
>>> uint32_t status;
>>> } __ec_align4;
>>>
>>> +#define EC_CMD_FP_READ_MATCH_SECRET 0x040A
>>
>> Add an empty line here.
>>
>>> +struct ec_params_fp_read_match_secret {
>>> + uint16_t fgr;
>>> +} __ec_align4;
>>> +
>>> +/* The positive match secret has the length of the SHA256 digest. */
>>> +#define FP_POSITIVE_MATCH_SECRET_BYTES 32
>>
>> Add an empty line here.
>>
>>> +struct ec_response_fp_read_match_secret {
>>> + uint8_t positive_match_secret[FP_POSITIVE_MATCH_SECRET_BYTES];
>>> +} __ec_align4;
>>> +
>>> /*****************************************************************************/
>>> /* Touchpad MCU commands: range 0x0500-0x05FF */
>>>
>>>