1*88364387SHung-ying Tyan /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2*88364387SHung-ying Tyan * Use of this source code is governed by a BSD-style license that can be 3*88364387SHung-ying Tyan * found in the LICENSE file. 4*88364387SHung-ying Tyan */ 5*88364387SHung-ying Tyan 6*88364387SHung-ying Tyan /* Host communication command constants for Chrome EC */ 7*88364387SHung-ying Tyan 8*88364387SHung-ying Tyan #ifndef __CROS_EC_COMMANDS_H 9*88364387SHung-ying Tyan #define __CROS_EC_COMMANDS_H 10*88364387SHung-ying Tyan 11*88364387SHung-ying Tyan /* 12*88364387SHung-ying Tyan * Protocol overview 13*88364387SHung-ying Tyan * 14*88364387SHung-ying Tyan * request: CMD [ P0 P1 P2 ... Pn S ] 15*88364387SHung-ying Tyan * response: ERR [ P0 P1 P2 ... Pn S ] 16*88364387SHung-ying Tyan * 17*88364387SHung-ying Tyan * where the bytes are defined as follow : 18*88364387SHung-ying Tyan * - CMD is the command code. (defined by EC_CMD_ constants) 19*88364387SHung-ying Tyan * - ERR is the error code. (defined by EC_RES_ constants) 20*88364387SHung-ying Tyan * - Px is the optional payload. 21*88364387SHung-ying Tyan * it is not sent if the error code is not success. 22*88364387SHung-ying Tyan * (defined by ec_params_ and ec_response_ structures) 23*88364387SHung-ying Tyan * - S is the checksum which is the sum of all payload bytes. 24*88364387SHung-ying Tyan * 25*88364387SHung-ying Tyan * On LPC, CMD and ERR are sent/received at EC_LPC_ADDR_KERNEL|USER_CMD 26*88364387SHung-ying Tyan * and the payloads are sent/received at EC_LPC_ADDR_KERNEL|USER_PARAM. 27*88364387SHung-ying Tyan * On I2C, all bytes are sent serially in the same message. 28*88364387SHung-ying Tyan */ 29*88364387SHung-ying Tyan 30*88364387SHung-ying Tyan /* Current version of this protocol */ 31*88364387SHung-ying Tyan #define EC_PROTO_VERSION 0x00000002 32*88364387SHung-ying Tyan 33*88364387SHung-ying Tyan /* Command version mask */ 34*88364387SHung-ying Tyan #define EC_VER_MASK(version) (1UL << (version)) 35*88364387SHung-ying Tyan 36*88364387SHung-ying Tyan /* I/O addresses for ACPI commands */ 37*88364387SHung-ying Tyan #define EC_LPC_ADDR_ACPI_DATA 0x62 38*88364387SHung-ying Tyan #define EC_LPC_ADDR_ACPI_CMD 0x66 39*88364387SHung-ying Tyan 40*88364387SHung-ying Tyan /* I/O addresses for host command */ 41*88364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_DATA 0x200 42*88364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_CMD 0x204 43*88364387SHung-ying Tyan 44*88364387SHung-ying Tyan /* I/O addresses for host command args and params */ 45*88364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_ARGS 0x800 46*88364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_PARAM 0x804 47*88364387SHung-ying Tyan #define EC_HOST_PARAM_SIZE 0x0fc /* Size of param area in bytes */ 48*88364387SHung-ying Tyan 49*88364387SHung-ying Tyan /* I/O addresses for host command params, old interface */ 50*88364387SHung-ying Tyan #define EC_LPC_ADDR_OLD_PARAM 0x880 51*88364387SHung-ying Tyan #define EC_OLD_PARAM_SIZE 0x080 /* Size of param area in bytes */ 52*88364387SHung-ying Tyan 53*88364387SHung-ying Tyan /* EC command register bit functions */ 54*88364387SHung-ying Tyan #define EC_LPC_CMDR_DATA (1 << 0) /* Data ready for host to read */ 55*88364387SHung-ying Tyan #define EC_LPC_CMDR_PENDING (1 << 1) /* Write pending to EC */ 56*88364387SHung-ying Tyan #define EC_LPC_CMDR_BUSY (1 << 2) /* EC is busy processing a command */ 57*88364387SHung-ying Tyan #define EC_LPC_CMDR_CMD (1 << 3) /* Last host write was a command */ 58*88364387SHung-ying Tyan #define EC_LPC_CMDR_ACPI_BRST (1 << 4) /* Burst mode (not used) */ 59*88364387SHung-ying Tyan #define EC_LPC_CMDR_SCI (1 << 5) /* SCI event is pending */ 60*88364387SHung-ying Tyan #define EC_LPC_CMDR_SMI (1 << 6) /* SMI event is pending */ 61*88364387SHung-ying Tyan 62*88364387SHung-ying Tyan #define EC_LPC_ADDR_MEMMAP 0x900 63*88364387SHung-ying Tyan #define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */ 64*88364387SHung-ying Tyan #define EC_MEMMAP_TEXT_MAX 8 /* Size of a string in the memory map */ 65*88364387SHung-ying Tyan 66*88364387SHung-ying Tyan /* The offset address of each type of data in mapped memory. */ 67*88364387SHung-ying Tyan #define EC_MEMMAP_TEMP_SENSOR 0x00 /* Temp sensors */ 68*88364387SHung-ying Tyan #define EC_MEMMAP_FAN 0x10 /* Fan speeds */ 69*88364387SHung-ying Tyan #define EC_MEMMAP_TEMP_SENSOR_B 0x18 /* Temp sensors (second set) */ 70*88364387SHung-ying Tyan #define EC_MEMMAP_ID 0x20 /* 'E' 'C' */ 71*88364387SHung-ying Tyan #define EC_MEMMAP_ID_VERSION 0x22 /* Version of data in 0x20 - 0x2f */ 72*88364387SHung-ying Tyan #define EC_MEMMAP_THERMAL_VERSION 0x23 /* Version of data in 0x00 - 0x1f */ 73*88364387SHung-ying Tyan #define EC_MEMMAP_BATTERY_VERSION 0x24 /* Version of data in 0x40 - 0x7f */ 74*88364387SHung-ying Tyan #define EC_MEMMAP_SWITCHES_VERSION 0x25 /* Version of data in 0x30 - 0x33 */ 75*88364387SHung-ying Tyan #define EC_MEMMAP_EVENTS_VERSION 0x26 /* Version of data in 0x34 - 0x3f */ 76*88364387SHung-ying Tyan #define EC_MEMMAP_HOST_CMD_FLAGS 0x27 /* Host command interface flags */ 77*88364387SHung-ying Tyan #define EC_MEMMAP_SWITCHES 0x30 78*88364387SHung-ying Tyan #define EC_MEMMAP_HOST_EVENTS 0x34 79*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_VOLT 0x40 /* Battery Present Voltage */ 80*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_RATE 0x44 /* Battery Present Rate */ 81*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_CAP 0x48 /* Battery Remaining Capacity */ 82*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_FLAG 0x4c /* Battery State, defined below */ 83*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_DCAP 0x50 /* Battery Design Capacity */ 84*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_DVLT 0x54 /* Battery Design Voltage */ 85*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_LFCC 0x58 /* Battery Last Full Charge Capacity */ 86*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_CCNT 0x5c /* Battery Cycle Count */ 87*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_MFGR 0x60 /* Battery Manufacturer String */ 88*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_MODEL 0x68 /* Battery Model Number String */ 89*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_SERIAL 0x70 /* Battery Serial Number String */ 90*88364387SHung-ying Tyan #define EC_MEMMAP_BATT_TYPE 0x78 /* Battery Type String */ 91*88364387SHung-ying Tyan 92*88364387SHung-ying Tyan /* Number of temp sensors at EC_MEMMAP_TEMP_SENSOR */ 93*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_ENTRIES 16 94*88364387SHung-ying Tyan /* 95*88364387SHung-ying Tyan * Number of temp sensors at EC_MEMMAP_TEMP_SENSOR_B. 96*88364387SHung-ying Tyan * 97*88364387SHung-ying Tyan * Valid only if EC_MEMMAP_THERMAL_VERSION returns >= 2. 98*88364387SHung-ying Tyan */ 99*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_B_ENTRIES 8 100*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_PRESENT 0xff 101*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_ERROR 0xfe 102*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_POWERED 0xfd 103*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc 104*88364387SHung-ying Tyan /* 105*88364387SHung-ying Tyan * The offset of temperature value stored in mapped memory. This allows 106*88364387SHung-ying Tyan * reporting a temperature range of 200K to 454K = -73C to 181C. 107*88364387SHung-ying Tyan */ 108*88364387SHung-ying Tyan #define EC_TEMP_SENSOR_OFFSET 200 109*88364387SHung-ying Tyan 110*88364387SHung-ying Tyan #define EC_FAN_SPEED_ENTRIES 4 /* Number of fans at EC_MEMMAP_FAN */ 111*88364387SHung-ying Tyan #define EC_FAN_SPEED_NOT_PRESENT 0xffff /* Entry not present */ 112*88364387SHung-ying Tyan #define EC_FAN_SPEED_STALLED 0xfffe /* Fan stalled */ 113*88364387SHung-ying Tyan 114*88364387SHung-ying Tyan /* Battery bit flags at EC_MEMMAP_BATT_FLAG. */ 115*88364387SHung-ying Tyan #define EC_BATT_FLAG_AC_PRESENT 0x01 116*88364387SHung-ying Tyan #define EC_BATT_FLAG_BATT_PRESENT 0x02 117*88364387SHung-ying Tyan #define EC_BATT_FLAG_DISCHARGING 0x04 118*88364387SHung-ying Tyan #define EC_BATT_FLAG_CHARGING 0x08 119*88364387SHung-ying Tyan #define EC_BATT_FLAG_LEVEL_CRITICAL 0x10 120*88364387SHung-ying Tyan 121*88364387SHung-ying Tyan /* Switch flags at EC_MEMMAP_SWITCHES */ 122*88364387SHung-ying Tyan #define EC_SWITCH_LID_OPEN 0x01 123*88364387SHung-ying Tyan #define EC_SWITCH_POWER_BUTTON_PRESSED 0x02 124*88364387SHung-ying Tyan #define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04 125*88364387SHung-ying Tyan /* Recovery requested via keyboard */ 126*88364387SHung-ying Tyan #define EC_SWITCH_KEYBOARD_RECOVERY 0x08 127*88364387SHung-ying Tyan /* Recovery requested via dedicated signal (from servo board) */ 128*88364387SHung-ying Tyan #define EC_SWITCH_DEDICATED_RECOVERY 0x10 129*88364387SHung-ying Tyan /* Was fake developer mode switch; now unused. Remove in next refactor. */ 130*88364387SHung-ying Tyan #define EC_SWITCH_IGNORE0 0x20 131*88364387SHung-ying Tyan 132*88364387SHung-ying Tyan /* Host command interface flags */ 133*88364387SHung-ying Tyan /* Host command interface supports LPC args (LPC interface only) */ 134*88364387SHung-ying Tyan #define EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED 0x01 135*88364387SHung-ying Tyan 136*88364387SHung-ying Tyan /* Wireless switch flags */ 137*88364387SHung-ying Tyan #define EC_WIRELESS_SWITCH_WLAN 0x01 138*88364387SHung-ying Tyan #define EC_WIRELESS_SWITCH_BLUETOOTH 0x02 139*88364387SHung-ying Tyan 140*88364387SHung-ying Tyan /* 141*88364387SHung-ying Tyan * This header file is used in coreboot both in C and ACPI code. The ACPI code 142*88364387SHung-ying Tyan * is pre-processed to handle constants but the ASL compiler is unable to 143*88364387SHung-ying Tyan * handle actual C code so keep it separate. 144*88364387SHung-ying Tyan */ 145*88364387SHung-ying Tyan #ifndef __ACPI__ 146*88364387SHung-ying Tyan 147*88364387SHung-ying Tyan /* 148*88364387SHung-ying Tyan * Define __packed if someone hasn't beat us to it. Linux kernel style 149*88364387SHung-ying Tyan * checking prefers __packed over __attribute__((packed)). 150*88364387SHung-ying Tyan */ 151*88364387SHung-ying Tyan #ifndef __packed 152*88364387SHung-ying Tyan #define __packed __attribute__((packed)) 153*88364387SHung-ying Tyan #endif 154*88364387SHung-ying Tyan 155*88364387SHung-ying Tyan /* LPC command status byte masks */ 156*88364387SHung-ying Tyan /* EC has written a byte in the data register and host hasn't read it yet */ 157*88364387SHung-ying Tyan #define EC_LPC_STATUS_TO_HOST 0x01 158*88364387SHung-ying Tyan /* Host has written a command/data byte and the EC hasn't read it yet */ 159*88364387SHung-ying Tyan #define EC_LPC_STATUS_FROM_HOST 0x02 160*88364387SHung-ying Tyan /* EC is processing a command */ 161*88364387SHung-ying Tyan #define EC_LPC_STATUS_PROCESSING 0x04 162*88364387SHung-ying Tyan /* Last write to EC was a command, not data */ 163*88364387SHung-ying Tyan #define EC_LPC_STATUS_LAST_CMD 0x08 164*88364387SHung-ying Tyan /* EC is in burst mode. Unsupported by Chrome EC, so this bit is never set */ 165*88364387SHung-ying Tyan #define EC_LPC_STATUS_BURST_MODE 0x10 166*88364387SHung-ying Tyan /* SCI event is pending (requesting SCI query) */ 167*88364387SHung-ying Tyan #define EC_LPC_STATUS_SCI_PENDING 0x20 168*88364387SHung-ying Tyan /* SMI event is pending (requesting SMI query) */ 169*88364387SHung-ying Tyan #define EC_LPC_STATUS_SMI_PENDING 0x40 170*88364387SHung-ying Tyan /* (reserved) */ 171*88364387SHung-ying Tyan #define EC_LPC_STATUS_RESERVED 0x80 172*88364387SHung-ying Tyan 173*88364387SHung-ying Tyan /* 174*88364387SHung-ying Tyan * EC is busy. This covers both the EC processing a command, and the host has 175*88364387SHung-ying Tyan * written a new command but the EC hasn't picked it up yet. 176*88364387SHung-ying Tyan */ 177*88364387SHung-ying Tyan #define EC_LPC_STATUS_BUSY_MASK \ 178*88364387SHung-ying Tyan (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING) 179*88364387SHung-ying Tyan 180*88364387SHung-ying Tyan /* Host command response codes */ 181*88364387SHung-ying Tyan enum ec_status { 182*88364387SHung-ying Tyan EC_RES_SUCCESS = 0, 183*88364387SHung-ying Tyan EC_RES_INVALID_COMMAND = 1, 184*88364387SHung-ying Tyan EC_RES_ERROR = 2, 185*88364387SHung-ying Tyan EC_RES_INVALID_PARAM = 3, 186*88364387SHung-ying Tyan EC_RES_ACCESS_DENIED = 4, 187*88364387SHung-ying Tyan EC_RES_INVALID_RESPONSE = 5, 188*88364387SHung-ying Tyan EC_RES_INVALID_VERSION = 6, 189*88364387SHung-ying Tyan EC_RES_INVALID_CHECKSUM = 7, 190*88364387SHung-ying Tyan EC_RES_IN_PROGRESS = 8, /* Accepted, command in progress */ 191*88364387SHung-ying Tyan EC_RES_UNAVAILABLE = 9, /* No response available */ 192*88364387SHung-ying Tyan EC_RES_TIMEOUT = 10, /* We got a timeout */ 193*88364387SHung-ying Tyan EC_RES_OVERFLOW = 11, /* Table / data overflow */ 194*88364387SHung-ying Tyan }; 195*88364387SHung-ying Tyan 196*88364387SHung-ying Tyan /* 197*88364387SHung-ying Tyan * Host event codes. Note these are 1-based, not 0-based, because ACPI query 198*88364387SHung-ying Tyan * EC command uses code 0 to mean "no event pending". We explicitly specify 199*88364387SHung-ying Tyan * each value in the enum listing so they won't change if we delete/insert an 200*88364387SHung-ying Tyan * item or rearrange the list (it needs to be stable across platforms, not 201*88364387SHung-ying Tyan * just within a single compiled instance). 202*88364387SHung-ying Tyan */ 203*88364387SHung-ying Tyan enum host_event_code { 204*88364387SHung-ying Tyan EC_HOST_EVENT_LID_CLOSED = 1, 205*88364387SHung-ying Tyan EC_HOST_EVENT_LID_OPEN = 2, 206*88364387SHung-ying Tyan EC_HOST_EVENT_POWER_BUTTON = 3, 207*88364387SHung-ying Tyan EC_HOST_EVENT_AC_CONNECTED = 4, 208*88364387SHung-ying Tyan EC_HOST_EVENT_AC_DISCONNECTED = 5, 209*88364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_LOW = 6, 210*88364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_CRITICAL = 7, 211*88364387SHung-ying Tyan EC_HOST_EVENT_BATTERY = 8, 212*88364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_THRESHOLD = 9, 213*88364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_OVERLOAD = 10, 214*88364387SHung-ying Tyan EC_HOST_EVENT_THERMAL = 11, 215*88364387SHung-ying Tyan EC_HOST_EVENT_USB_CHARGER = 12, 216*88364387SHung-ying Tyan EC_HOST_EVENT_KEY_PRESSED = 13, 217*88364387SHung-ying Tyan /* 218*88364387SHung-ying Tyan * EC has finished initializing the host interface. The host can check 219*88364387SHung-ying Tyan * for this event following sending a EC_CMD_REBOOT_EC command to 220*88364387SHung-ying Tyan * determine when the EC is ready to accept subsequent commands. 221*88364387SHung-ying Tyan */ 222*88364387SHung-ying Tyan EC_HOST_EVENT_INTERFACE_READY = 14, 223*88364387SHung-ying Tyan /* Keyboard recovery combo has been pressed */ 224*88364387SHung-ying Tyan EC_HOST_EVENT_KEYBOARD_RECOVERY = 15, 225*88364387SHung-ying Tyan 226*88364387SHung-ying Tyan /* Shutdown due to thermal overload */ 227*88364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_SHUTDOWN = 16, 228*88364387SHung-ying Tyan /* Shutdown due to battery level too low */ 229*88364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_SHUTDOWN = 17, 230*88364387SHung-ying Tyan 231*88364387SHung-ying Tyan /* 232*88364387SHung-ying Tyan * The high bit of the event mask is not used as a host event code. If 233*88364387SHung-ying Tyan * it reads back as set, then the entire event mask should be 234*88364387SHung-ying Tyan * considered invalid by the host. This can happen when reading the 235*88364387SHung-ying Tyan * raw event status via EC_MEMMAP_HOST_EVENTS but the LPC interface is 236*88364387SHung-ying Tyan * not initialized on the EC, or improperly configured on the host. 237*88364387SHung-ying Tyan */ 238*88364387SHung-ying Tyan EC_HOST_EVENT_INVALID = 32 239*88364387SHung-ying Tyan }; 240*88364387SHung-ying Tyan /* Host event mask */ 241*88364387SHung-ying Tyan #define EC_HOST_EVENT_MASK(event_code) (1UL << ((event_code) - 1)) 242*88364387SHung-ying Tyan 243*88364387SHung-ying Tyan /* Arguments at EC_LPC_ADDR_HOST_ARGS */ 244*88364387SHung-ying Tyan struct ec_lpc_host_args { 245*88364387SHung-ying Tyan uint8_t flags; 246*88364387SHung-ying Tyan uint8_t command_version; 247*88364387SHung-ying Tyan uint8_t data_size; 248*88364387SHung-ying Tyan /* 249*88364387SHung-ying Tyan * Checksum; sum of command + flags + command_version + data_size + 250*88364387SHung-ying Tyan * all params/response data bytes. 251*88364387SHung-ying Tyan */ 252*88364387SHung-ying Tyan uint8_t checksum; 253*88364387SHung-ying Tyan } __packed; 254*88364387SHung-ying Tyan 255*88364387SHung-ying Tyan /* Flags for ec_lpc_host_args.flags */ 256*88364387SHung-ying Tyan /* 257*88364387SHung-ying Tyan * Args are from host. Data area at EC_LPC_ADDR_HOST_PARAM contains command 258*88364387SHung-ying Tyan * params. 259*88364387SHung-ying Tyan * 260*88364387SHung-ying Tyan * If EC gets a command and this flag is not set, this is an old-style command. 261*88364387SHung-ying Tyan * Command version is 0 and params from host are at EC_LPC_ADDR_OLD_PARAM with 262*88364387SHung-ying Tyan * unknown length. EC must respond with an old-style response (that is, 263*88364387SHung-ying Tyan * withouth setting EC_HOST_ARGS_FLAG_TO_HOST). 264*88364387SHung-ying Tyan */ 265*88364387SHung-ying Tyan #define EC_HOST_ARGS_FLAG_FROM_HOST 0x01 266*88364387SHung-ying Tyan /* 267*88364387SHung-ying Tyan * Args are from EC. Data area at EC_LPC_ADDR_HOST_PARAM contains response. 268*88364387SHung-ying Tyan * 269*88364387SHung-ying Tyan * If EC responds to a command and this flag is not set, this is an old-style 270*88364387SHung-ying Tyan * response. Command version is 0 and response data from EC is at 271*88364387SHung-ying Tyan * EC_LPC_ADDR_OLD_PARAM with unknown length. 272*88364387SHung-ying Tyan */ 273*88364387SHung-ying Tyan #define EC_HOST_ARGS_FLAG_TO_HOST 0x02 274*88364387SHung-ying Tyan 275*88364387SHung-ying Tyan /* 276*88364387SHung-ying Tyan * Notes on commands: 277*88364387SHung-ying Tyan * 278*88364387SHung-ying Tyan * Each command is an 8-byte command value. Commands which take params or 279*88364387SHung-ying Tyan * return response data specify structs for that data. If no struct is 280*88364387SHung-ying Tyan * specified, the command does not input or output data, respectively. 281*88364387SHung-ying Tyan * Parameter/response length is implicit in the structs. Some underlying 282*88364387SHung-ying Tyan * communication protocols (I2C, SPI) may add length or checksum headers, but 283*88364387SHung-ying Tyan * those are implementation-dependent and not defined here. 284*88364387SHung-ying Tyan */ 285*88364387SHung-ying Tyan 286*88364387SHung-ying Tyan /*****************************************************************************/ 287*88364387SHung-ying Tyan /* General / test commands */ 288*88364387SHung-ying Tyan 289*88364387SHung-ying Tyan /* 290*88364387SHung-ying Tyan * Get protocol version, used to deal with non-backward compatible protocol 291*88364387SHung-ying Tyan * changes. 292*88364387SHung-ying Tyan */ 293*88364387SHung-ying Tyan #define EC_CMD_PROTO_VERSION 0x00 294*88364387SHung-ying Tyan 295*88364387SHung-ying Tyan struct ec_response_proto_version { 296*88364387SHung-ying Tyan uint32_t version; 297*88364387SHung-ying Tyan } __packed; 298*88364387SHung-ying Tyan 299*88364387SHung-ying Tyan /* 300*88364387SHung-ying Tyan * Hello. This is a simple command to test the EC is responsive to 301*88364387SHung-ying Tyan * commands. 302*88364387SHung-ying Tyan */ 303*88364387SHung-ying Tyan #define EC_CMD_HELLO 0x01 304*88364387SHung-ying Tyan 305*88364387SHung-ying Tyan struct ec_params_hello { 306*88364387SHung-ying Tyan uint32_t in_data; /* Pass anything here */ 307*88364387SHung-ying Tyan } __packed; 308*88364387SHung-ying Tyan 309*88364387SHung-ying Tyan struct ec_response_hello { 310*88364387SHung-ying Tyan uint32_t out_data; /* Output will be in_data + 0x01020304 */ 311*88364387SHung-ying Tyan } __packed; 312*88364387SHung-ying Tyan 313*88364387SHung-ying Tyan /* Get version number */ 314*88364387SHung-ying Tyan #define EC_CMD_GET_VERSION 0x02 315*88364387SHung-ying Tyan 316*88364387SHung-ying Tyan enum ec_current_image { 317*88364387SHung-ying Tyan EC_IMAGE_UNKNOWN = 0, 318*88364387SHung-ying Tyan EC_IMAGE_RO, 319*88364387SHung-ying Tyan EC_IMAGE_RW 320*88364387SHung-ying Tyan }; 321*88364387SHung-ying Tyan 322*88364387SHung-ying Tyan struct ec_response_get_version { 323*88364387SHung-ying Tyan /* Null-terminated version strings for RO, RW */ 324*88364387SHung-ying Tyan char version_string_ro[32]; 325*88364387SHung-ying Tyan char version_string_rw[32]; 326*88364387SHung-ying Tyan char reserved[32]; /* Was previously RW-B string */ 327*88364387SHung-ying Tyan uint32_t current_image; /* One of ec_current_image */ 328*88364387SHung-ying Tyan } __packed; 329*88364387SHung-ying Tyan 330*88364387SHung-ying Tyan /* Read test */ 331*88364387SHung-ying Tyan #define EC_CMD_READ_TEST 0x03 332*88364387SHung-ying Tyan 333*88364387SHung-ying Tyan struct ec_params_read_test { 334*88364387SHung-ying Tyan uint32_t offset; /* Starting value for read buffer */ 335*88364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 336*88364387SHung-ying Tyan } __packed; 337*88364387SHung-ying Tyan 338*88364387SHung-ying Tyan struct ec_response_read_test { 339*88364387SHung-ying Tyan uint32_t data[32]; 340*88364387SHung-ying Tyan } __packed; 341*88364387SHung-ying Tyan 342*88364387SHung-ying Tyan /* 343*88364387SHung-ying Tyan * Get build information 344*88364387SHung-ying Tyan * 345*88364387SHung-ying Tyan * Response is null-terminated string. 346*88364387SHung-ying Tyan */ 347*88364387SHung-ying Tyan #define EC_CMD_GET_BUILD_INFO 0x04 348*88364387SHung-ying Tyan 349*88364387SHung-ying Tyan /* Get chip info */ 350*88364387SHung-ying Tyan #define EC_CMD_GET_CHIP_INFO 0x05 351*88364387SHung-ying Tyan 352*88364387SHung-ying Tyan struct ec_response_get_chip_info { 353*88364387SHung-ying Tyan /* Null-terminated strings */ 354*88364387SHung-ying Tyan char vendor[32]; 355*88364387SHung-ying Tyan char name[32]; 356*88364387SHung-ying Tyan char revision[32]; /* Mask version */ 357*88364387SHung-ying Tyan } __packed; 358*88364387SHung-ying Tyan 359*88364387SHung-ying Tyan /* Get board HW version */ 360*88364387SHung-ying Tyan #define EC_CMD_GET_BOARD_VERSION 0x06 361*88364387SHung-ying Tyan 362*88364387SHung-ying Tyan struct ec_response_board_version { 363*88364387SHung-ying Tyan uint16_t board_version; /* A monotonously incrementing number. */ 364*88364387SHung-ying Tyan } __packed; 365*88364387SHung-ying Tyan 366*88364387SHung-ying Tyan /* 367*88364387SHung-ying Tyan * Read memory-mapped data. 368*88364387SHung-ying Tyan * 369*88364387SHung-ying Tyan * This is an alternate interface to memory-mapped data for bus protocols 370*88364387SHung-ying Tyan * which don't support direct-mapped memory - I2C, SPI, etc. 371*88364387SHung-ying Tyan * 372*88364387SHung-ying Tyan * Response is params.size bytes of data. 373*88364387SHung-ying Tyan */ 374*88364387SHung-ying Tyan #define EC_CMD_READ_MEMMAP 0x07 375*88364387SHung-ying Tyan 376*88364387SHung-ying Tyan struct ec_params_read_memmap { 377*88364387SHung-ying Tyan uint8_t offset; /* Offset in memmap (EC_MEMMAP_*) */ 378*88364387SHung-ying Tyan uint8_t size; /* Size to read in bytes */ 379*88364387SHung-ying Tyan } __packed; 380*88364387SHung-ying Tyan 381*88364387SHung-ying Tyan /* Read versions supported for a command */ 382*88364387SHung-ying Tyan #define EC_CMD_GET_CMD_VERSIONS 0x08 383*88364387SHung-ying Tyan 384*88364387SHung-ying Tyan struct ec_params_get_cmd_versions { 385*88364387SHung-ying Tyan uint8_t cmd; /* Command to check */ 386*88364387SHung-ying Tyan } __packed; 387*88364387SHung-ying Tyan 388*88364387SHung-ying Tyan struct ec_response_get_cmd_versions { 389*88364387SHung-ying Tyan /* 390*88364387SHung-ying Tyan * Mask of supported versions; use EC_VER_MASK() to compare with a 391*88364387SHung-ying Tyan * desired version. 392*88364387SHung-ying Tyan */ 393*88364387SHung-ying Tyan uint32_t version_mask; 394*88364387SHung-ying Tyan } __packed; 395*88364387SHung-ying Tyan 396*88364387SHung-ying Tyan /* 397*88364387SHung-ying Tyan * Check EC communcations status (busy). This is needed on i2c/spi but not 398*88364387SHung-ying Tyan * on lpc since it has its own out-of-band busy indicator. 399*88364387SHung-ying Tyan * 400*88364387SHung-ying Tyan * lpc must read the status from the command register. Attempting this on 401*88364387SHung-ying Tyan * lpc will overwrite the args/parameter space and corrupt its data. 402*88364387SHung-ying Tyan */ 403*88364387SHung-ying Tyan #define EC_CMD_GET_COMMS_STATUS 0x09 404*88364387SHung-ying Tyan 405*88364387SHung-ying Tyan /* Avoid using ec_status which is for return values */ 406*88364387SHung-ying Tyan enum ec_comms_status { 407*88364387SHung-ying Tyan EC_COMMS_STATUS_PROCESSING = 1 << 0, /* Processing cmd */ 408*88364387SHung-ying Tyan }; 409*88364387SHung-ying Tyan 410*88364387SHung-ying Tyan struct ec_response_get_comms_status { 411*88364387SHung-ying Tyan uint32_t flags; /* Mask of enum ec_comms_status */ 412*88364387SHung-ying Tyan } __packed; 413*88364387SHung-ying Tyan 414*88364387SHung-ying Tyan 415*88364387SHung-ying Tyan /*****************************************************************************/ 416*88364387SHung-ying Tyan /* Flash commands */ 417*88364387SHung-ying Tyan 418*88364387SHung-ying Tyan /* Get flash info */ 419*88364387SHung-ying Tyan #define EC_CMD_FLASH_INFO 0x10 420*88364387SHung-ying Tyan 421*88364387SHung-ying Tyan struct ec_response_flash_info { 422*88364387SHung-ying Tyan /* Usable flash size, in bytes */ 423*88364387SHung-ying Tyan uint32_t flash_size; 424*88364387SHung-ying Tyan /* 425*88364387SHung-ying Tyan * Write block size. Write offset and size must be a multiple 426*88364387SHung-ying Tyan * of this. 427*88364387SHung-ying Tyan */ 428*88364387SHung-ying Tyan uint32_t write_block_size; 429*88364387SHung-ying Tyan /* 430*88364387SHung-ying Tyan * Erase block size. Erase offset and size must be a multiple 431*88364387SHung-ying Tyan * of this. 432*88364387SHung-ying Tyan */ 433*88364387SHung-ying Tyan uint32_t erase_block_size; 434*88364387SHung-ying Tyan /* 435*88364387SHung-ying Tyan * Protection block size. Protection offset and size must be a 436*88364387SHung-ying Tyan * multiple of this. 437*88364387SHung-ying Tyan */ 438*88364387SHung-ying Tyan uint32_t protect_block_size; 439*88364387SHung-ying Tyan } __packed; 440*88364387SHung-ying Tyan 441*88364387SHung-ying Tyan /* 442*88364387SHung-ying Tyan * Read flash 443*88364387SHung-ying Tyan * 444*88364387SHung-ying Tyan * Response is params.size bytes of data. 445*88364387SHung-ying Tyan */ 446*88364387SHung-ying Tyan #define EC_CMD_FLASH_READ 0x11 447*88364387SHung-ying Tyan 448*88364387SHung-ying Tyan struct ec_params_flash_read { 449*88364387SHung-ying Tyan uint32_t offset; /* Byte offset to read */ 450*88364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 451*88364387SHung-ying Tyan } __packed; 452*88364387SHung-ying Tyan 453*88364387SHung-ying Tyan /* Write flash */ 454*88364387SHung-ying Tyan #define EC_CMD_FLASH_WRITE 0x12 455*88364387SHung-ying Tyan 456*88364387SHung-ying Tyan struct ec_params_flash_write { 457*88364387SHung-ying Tyan uint32_t offset; /* Byte offset to write */ 458*88364387SHung-ying Tyan uint32_t size; /* Size to write in bytes */ 459*88364387SHung-ying Tyan /* 460*88364387SHung-ying Tyan * Data to write. Could really use EC_PARAM_SIZE - 8, but tidiest to 461*88364387SHung-ying Tyan * use a power of 2 so writes stay aligned. 462*88364387SHung-ying Tyan */ 463*88364387SHung-ying Tyan uint8_t data[64]; 464*88364387SHung-ying Tyan } __packed; 465*88364387SHung-ying Tyan 466*88364387SHung-ying Tyan /* Erase flash */ 467*88364387SHung-ying Tyan #define EC_CMD_FLASH_ERASE 0x13 468*88364387SHung-ying Tyan 469*88364387SHung-ying Tyan struct ec_params_flash_erase { 470*88364387SHung-ying Tyan uint32_t offset; /* Byte offset to erase */ 471*88364387SHung-ying Tyan uint32_t size; /* Size to erase in bytes */ 472*88364387SHung-ying Tyan } __packed; 473*88364387SHung-ying Tyan 474*88364387SHung-ying Tyan /* 475*88364387SHung-ying Tyan * Get/set flash protection. 476*88364387SHung-ying Tyan * 477*88364387SHung-ying Tyan * If mask!=0, sets/clear the requested bits of flags. Depending on the 478*88364387SHung-ying Tyan * firmware write protect GPIO, not all flags will take effect immediately; 479*88364387SHung-ying Tyan * some flags require a subsequent hard reset to take effect. Check the 480*88364387SHung-ying Tyan * returned flags bits to see what actually happened. 481*88364387SHung-ying Tyan * 482*88364387SHung-ying Tyan * If mask=0, simply returns the current flags state. 483*88364387SHung-ying Tyan */ 484*88364387SHung-ying Tyan #define EC_CMD_FLASH_PROTECT 0x15 485*88364387SHung-ying Tyan #define EC_VER_FLASH_PROTECT 1 /* Command version 1 */ 486*88364387SHung-ying Tyan 487*88364387SHung-ying Tyan /* Flags for flash protection */ 488*88364387SHung-ying Tyan /* RO flash code protected when the EC boots */ 489*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_RO_AT_BOOT (1 << 0) 490*88364387SHung-ying Tyan /* 491*88364387SHung-ying Tyan * RO flash code protected now. If this bit is set, at-boot status cannot 492*88364387SHung-ying Tyan * be changed. 493*88364387SHung-ying Tyan */ 494*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_RO_NOW (1 << 1) 495*88364387SHung-ying Tyan /* Entire flash code protected now, until reboot. */ 496*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_ALL_NOW (1 << 2) 497*88364387SHung-ying Tyan /* Flash write protect GPIO is asserted now */ 498*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3) 499*88364387SHung-ying Tyan /* Error - at least one bank of flash is stuck locked, and cannot be unlocked */ 500*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_ERROR_STUCK (1 << 4) 501*88364387SHung-ying Tyan /* 502*88364387SHung-ying Tyan * Error - flash protection is in inconsistent state. At least one bank of 503*88364387SHung-ying Tyan * flash which should be protected is not protected. Usually fixed by 504*88364387SHung-ying Tyan * re-requesting the desired flags, or by a hard reset if that fails. 505*88364387SHung-ying Tyan */ 506*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5) 507*88364387SHung-ying Tyan /* Entile flash code protected when the EC boots */ 508*88364387SHung-ying Tyan #define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6) 509*88364387SHung-ying Tyan 510*88364387SHung-ying Tyan struct ec_params_flash_protect { 511*88364387SHung-ying Tyan uint32_t mask; /* Bits in flags to apply */ 512*88364387SHung-ying Tyan uint32_t flags; /* New flags to apply */ 513*88364387SHung-ying Tyan } __packed; 514*88364387SHung-ying Tyan 515*88364387SHung-ying Tyan struct ec_response_flash_protect { 516*88364387SHung-ying Tyan /* Current value of flash protect flags */ 517*88364387SHung-ying Tyan uint32_t flags; 518*88364387SHung-ying Tyan /* 519*88364387SHung-ying Tyan * Flags which are valid on this platform. This allows the caller 520*88364387SHung-ying Tyan * to distinguish between flags which aren't set vs. flags which can't 521*88364387SHung-ying Tyan * be set on this platform. 522*88364387SHung-ying Tyan */ 523*88364387SHung-ying Tyan uint32_t valid_flags; 524*88364387SHung-ying Tyan /* Flags which can be changed given the current protection state */ 525*88364387SHung-ying Tyan uint32_t writable_flags; 526*88364387SHung-ying Tyan } __packed; 527*88364387SHung-ying Tyan 528*88364387SHung-ying Tyan /* 529*88364387SHung-ying Tyan * Note: commands 0x14 - 0x19 version 0 were old commands to get/set flash 530*88364387SHung-ying Tyan * write protect. These commands may be reused with version > 0. 531*88364387SHung-ying Tyan */ 532*88364387SHung-ying Tyan 533*88364387SHung-ying Tyan /* Get the region offset/size */ 534*88364387SHung-ying Tyan #define EC_CMD_FLASH_REGION_INFO 0x16 535*88364387SHung-ying Tyan #define EC_VER_FLASH_REGION_INFO 1 536*88364387SHung-ying Tyan 537*88364387SHung-ying Tyan enum ec_flash_region { 538*88364387SHung-ying Tyan /* Region which holds read-only EC image */ 539*88364387SHung-ying Tyan EC_FLASH_REGION_RO, 540*88364387SHung-ying Tyan /* Region which holds rewritable EC image */ 541*88364387SHung-ying Tyan EC_FLASH_REGION_RW, 542*88364387SHung-ying Tyan /* 543*88364387SHung-ying Tyan * Region which should be write-protected in the factory (a superset of 544*88364387SHung-ying Tyan * EC_FLASH_REGION_RO) 545*88364387SHung-ying Tyan */ 546*88364387SHung-ying Tyan EC_FLASH_REGION_WP_RO, 547*88364387SHung-ying Tyan }; 548*88364387SHung-ying Tyan 549*88364387SHung-ying Tyan struct ec_params_flash_region_info { 550*88364387SHung-ying Tyan uint32_t region; /* enum ec_flash_region */ 551*88364387SHung-ying Tyan } __packed; 552*88364387SHung-ying Tyan 553*88364387SHung-ying Tyan struct ec_response_flash_region_info { 554*88364387SHung-ying Tyan uint32_t offset; 555*88364387SHung-ying Tyan uint32_t size; 556*88364387SHung-ying Tyan } __packed; 557*88364387SHung-ying Tyan 558*88364387SHung-ying Tyan /* Read/write VbNvContext */ 559*88364387SHung-ying Tyan #define EC_CMD_VBNV_CONTEXT 0x17 560*88364387SHung-ying Tyan #define EC_VER_VBNV_CONTEXT 1 561*88364387SHung-ying Tyan #define EC_VBNV_BLOCK_SIZE 16 562*88364387SHung-ying Tyan 563*88364387SHung-ying Tyan enum ec_vbnvcontext_op { 564*88364387SHung-ying Tyan EC_VBNV_CONTEXT_OP_READ, 565*88364387SHung-ying Tyan EC_VBNV_CONTEXT_OP_WRITE, 566*88364387SHung-ying Tyan }; 567*88364387SHung-ying Tyan 568*88364387SHung-ying Tyan struct ec_params_vbnvcontext { 569*88364387SHung-ying Tyan uint32_t op; 570*88364387SHung-ying Tyan uint8_t block[EC_VBNV_BLOCK_SIZE]; 571*88364387SHung-ying Tyan } __packed; 572*88364387SHung-ying Tyan 573*88364387SHung-ying Tyan struct ec_response_vbnvcontext { 574*88364387SHung-ying Tyan uint8_t block[EC_VBNV_BLOCK_SIZE]; 575*88364387SHung-ying Tyan } __packed; 576*88364387SHung-ying Tyan 577*88364387SHung-ying Tyan /*****************************************************************************/ 578*88364387SHung-ying Tyan /* PWM commands */ 579*88364387SHung-ying Tyan 580*88364387SHung-ying Tyan /* Get fan target RPM */ 581*88364387SHung-ying Tyan #define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x20 582*88364387SHung-ying Tyan 583*88364387SHung-ying Tyan struct ec_response_pwm_get_fan_rpm { 584*88364387SHung-ying Tyan uint32_t rpm; 585*88364387SHung-ying Tyan } __packed; 586*88364387SHung-ying Tyan 587*88364387SHung-ying Tyan /* Set target fan RPM */ 588*88364387SHung-ying Tyan #define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x21 589*88364387SHung-ying Tyan 590*88364387SHung-ying Tyan struct ec_params_pwm_set_fan_target_rpm { 591*88364387SHung-ying Tyan uint32_t rpm; 592*88364387SHung-ying Tyan } __packed; 593*88364387SHung-ying Tyan 594*88364387SHung-ying Tyan /* Get keyboard backlight */ 595*88364387SHung-ying Tyan #define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x22 596*88364387SHung-ying Tyan 597*88364387SHung-ying Tyan struct ec_response_pwm_get_keyboard_backlight { 598*88364387SHung-ying Tyan uint8_t percent; 599*88364387SHung-ying Tyan uint8_t enabled; 600*88364387SHung-ying Tyan } __packed; 601*88364387SHung-ying Tyan 602*88364387SHung-ying Tyan /* Set keyboard backlight */ 603*88364387SHung-ying Tyan #define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x23 604*88364387SHung-ying Tyan 605*88364387SHung-ying Tyan struct ec_params_pwm_set_keyboard_backlight { 606*88364387SHung-ying Tyan uint8_t percent; 607*88364387SHung-ying Tyan } __packed; 608*88364387SHung-ying Tyan 609*88364387SHung-ying Tyan /* Set target fan PWM duty cycle */ 610*88364387SHung-ying Tyan #define EC_CMD_PWM_SET_FAN_DUTY 0x24 611*88364387SHung-ying Tyan 612*88364387SHung-ying Tyan struct ec_params_pwm_set_fan_duty { 613*88364387SHung-ying Tyan uint32_t percent; 614*88364387SHung-ying Tyan } __packed; 615*88364387SHung-ying Tyan 616*88364387SHung-ying Tyan /*****************************************************************************/ 617*88364387SHung-ying Tyan /* 618*88364387SHung-ying Tyan * Lightbar commands. This looks worse than it is. Since we only use one HOST 619*88364387SHung-ying Tyan * command to say "talk to the lightbar", we put the "and tell it to do X" part 620*88364387SHung-ying Tyan * into a subcommand. We'll make separate structs for subcommands with 621*88364387SHung-ying Tyan * different input args, so that we know how much to expect. 622*88364387SHung-ying Tyan */ 623*88364387SHung-ying Tyan #define EC_CMD_LIGHTBAR_CMD 0x28 624*88364387SHung-ying Tyan 625*88364387SHung-ying Tyan struct rgb_s { 626*88364387SHung-ying Tyan uint8_t r, g, b; 627*88364387SHung-ying Tyan }; 628*88364387SHung-ying Tyan 629*88364387SHung-ying Tyan #define LB_BATTERY_LEVELS 4 630*88364387SHung-ying Tyan /* List of tweakable parameters. NOTE: It's __packed so it can be sent in a 631*88364387SHung-ying Tyan * host command, but the alignment is the same regardless. Keep it that way. 632*88364387SHung-ying Tyan */ 633*88364387SHung-ying Tyan struct lightbar_params { 634*88364387SHung-ying Tyan /* Timing */ 635*88364387SHung-ying Tyan int google_ramp_up; 636*88364387SHung-ying Tyan int google_ramp_down; 637*88364387SHung-ying Tyan int s3s0_ramp_up; 638*88364387SHung-ying Tyan int s0_tick_delay[2]; /* AC=0/1 */ 639*88364387SHung-ying Tyan int s0a_tick_delay[2]; /* AC=0/1 */ 640*88364387SHung-ying Tyan int s0s3_ramp_down; 641*88364387SHung-ying Tyan int s3_sleep_for; 642*88364387SHung-ying Tyan int s3_ramp_up; 643*88364387SHung-ying Tyan int s3_ramp_down; 644*88364387SHung-ying Tyan 645*88364387SHung-ying Tyan /* Oscillation */ 646*88364387SHung-ying Tyan uint8_t new_s0; 647*88364387SHung-ying Tyan uint8_t osc_min[2]; /* AC=0/1 */ 648*88364387SHung-ying Tyan uint8_t osc_max[2]; /* AC=0/1 */ 649*88364387SHung-ying Tyan uint8_t w_ofs[2]; /* AC=0/1 */ 650*88364387SHung-ying Tyan 651*88364387SHung-ying Tyan /* Brightness limits based on the backlight and AC. */ 652*88364387SHung-ying Tyan uint8_t bright_bl_off_fixed[2]; /* AC=0/1 */ 653*88364387SHung-ying Tyan uint8_t bright_bl_on_min[2]; /* AC=0/1 */ 654*88364387SHung-ying Tyan uint8_t bright_bl_on_max[2]; /* AC=0/1 */ 655*88364387SHung-ying Tyan 656*88364387SHung-ying Tyan /* Battery level thresholds */ 657*88364387SHung-ying Tyan uint8_t battery_threshold[LB_BATTERY_LEVELS - 1]; 658*88364387SHung-ying Tyan 659*88364387SHung-ying Tyan /* Map [AC][battery_level] to color index */ 660*88364387SHung-ying Tyan uint8_t s0_idx[2][LB_BATTERY_LEVELS]; /* AP is running */ 661*88364387SHung-ying Tyan uint8_t s3_idx[2][LB_BATTERY_LEVELS]; /* AP is sleeping */ 662*88364387SHung-ying Tyan 663*88364387SHung-ying Tyan /* Color palette */ 664*88364387SHung-ying Tyan struct rgb_s color[8]; /* 0-3 are Google colors */ 665*88364387SHung-ying Tyan } __packed; 666*88364387SHung-ying Tyan 667*88364387SHung-ying Tyan struct ec_params_lightbar { 668*88364387SHung-ying Tyan uint8_t cmd; /* Command (see enum lightbar_command) */ 669*88364387SHung-ying Tyan union { 670*88364387SHung-ying Tyan struct { 671*88364387SHung-ying Tyan /* no args */ 672*88364387SHung-ying Tyan } dump, off, on, init, get_seq, get_params; 673*88364387SHung-ying Tyan 674*88364387SHung-ying Tyan struct num { 675*88364387SHung-ying Tyan uint8_t num; 676*88364387SHung-ying Tyan } brightness, seq, demo; 677*88364387SHung-ying Tyan 678*88364387SHung-ying Tyan struct reg { 679*88364387SHung-ying Tyan uint8_t ctrl, reg, value; 680*88364387SHung-ying Tyan } reg; 681*88364387SHung-ying Tyan 682*88364387SHung-ying Tyan struct rgb { 683*88364387SHung-ying Tyan uint8_t led, red, green, blue; 684*88364387SHung-ying Tyan } rgb; 685*88364387SHung-ying Tyan 686*88364387SHung-ying Tyan struct lightbar_params set_params; 687*88364387SHung-ying Tyan }; 688*88364387SHung-ying Tyan } __packed; 689*88364387SHung-ying Tyan 690*88364387SHung-ying Tyan struct ec_response_lightbar { 691*88364387SHung-ying Tyan union { 692*88364387SHung-ying Tyan struct dump { 693*88364387SHung-ying Tyan struct { 694*88364387SHung-ying Tyan uint8_t reg; 695*88364387SHung-ying Tyan uint8_t ic0; 696*88364387SHung-ying Tyan uint8_t ic1; 697*88364387SHung-ying Tyan } vals[23]; 698*88364387SHung-ying Tyan } dump; 699*88364387SHung-ying Tyan 700*88364387SHung-ying Tyan struct get_seq { 701*88364387SHung-ying Tyan uint8_t num; 702*88364387SHung-ying Tyan } get_seq; 703*88364387SHung-ying Tyan 704*88364387SHung-ying Tyan struct lightbar_params get_params; 705*88364387SHung-ying Tyan 706*88364387SHung-ying Tyan struct { 707*88364387SHung-ying Tyan /* no return params */ 708*88364387SHung-ying Tyan } off, on, init, brightness, seq, reg, rgb, demo, set_params; 709*88364387SHung-ying Tyan }; 710*88364387SHung-ying Tyan } __packed; 711*88364387SHung-ying Tyan 712*88364387SHung-ying Tyan /* Lightbar commands */ 713*88364387SHung-ying Tyan enum lightbar_command { 714*88364387SHung-ying Tyan LIGHTBAR_CMD_DUMP = 0, 715*88364387SHung-ying Tyan LIGHTBAR_CMD_OFF = 1, 716*88364387SHung-ying Tyan LIGHTBAR_CMD_ON = 2, 717*88364387SHung-ying Tyan LIGHTBAR_CMD_INIT = 3, 718*88364387SHung-ying Tyan LIGHTBAR_CMD_BRIGHTNESS = 4, 719*88364387SHung-ying Tyan LIGHTBAR_CMD_SEQ = 5, 720*88364387SHung-ying Tyan LIGHTBAR_CMD_REG = 6, 721*88364387SHung-ying Tyan LIGHTBAR_CMD_RGB = 7, 722*88364387SHung-ying Tyan LIGHTBAR_CMD_GET_SEQ = 8, 723*88364387SHung-ying Tyan LIGHTBAR_CMD_DEMO = 9, 724*88364387SHung-ying Tyan LIGHTBAR_CMD_GET_PARAMS = 10, 725*88364387SHung-ying Tyan LIGHTBAR_CMD_SET_PARAMS = 11, 726*88364387SHung-ying Tyan LIGHTBAR_NUM_CMDS 727*88364387SHung-ying Tyan }; 728*88364387SHung-ying Tyan 729*88364387SHung-ying Tyan /*****************************************************************************/ 730*88364387SHung-ying Tyan /* Verified boot commands */ 731*88364387SHung-ying Tyan 732*88364387SHung-ying Tyan /* 733*88364387SHung-ying Tyan * Note: command code 0x29 version 0 was VBOOT_CMD in Link EVT; it may be 734*88364387SHung-ying Tyan * reused for other purposes with version > 0. 735*88364387SHung-ying Tyan */ 736*88364387SHung-ying Tyan 737*88364387SHung-ying Tyan /* Verified boot hash command */ 738*88364387SHung-ying Tyan #define EC_CMD_VBOOT_HASH 0x2A 739*88364387SHung-ying Tyan 740*88364387SHung-ying Tyan struct ec_params_vboot_hash { 741*88364387SHung-ying Tyan uint8_t cmd; /* enum ec_vboot_hash_cmd */ 742*88364387SHung-ying Tyan uint8_t hash_type; /* enum ec_vboot_hash_type */ 743*88364387SHung-ying Tyan uint8_t nonce_size; /* Nonce size; may be 0 */ 744*88364387SHung-ying Tyan uint8_t reserved0; /* Reserved; set 0 */ 745*88364387SHung-ying Tyan uint32_t offset; /* Offset in flash to hash */ 746*88364387SHung-ying Tyan uint32_t size; /* Number of bytes to hash */ 747*88364387SHung-ying Tyan uint8_t nonce_data[64]; /* Nonce data; ignored if nonce_size=0 */ 748*88364387SHung-ying Tyan } __packed; 749*88364387SHung-ying Tyan 750*88364387SHung-ying Tyan struct ec_response_vboot_hash { 751*88364387SHung-ying Tyan uint8_t status; /* enum ec_vboot_hash_status */ 752*88364387SHung-ying Tyan uint8_t hash_type; /* enum ec_vboot_hash_type */ 753*88364387SHung-ying Tyan uint8_t digest_size; /* Size of hash digest in bytes */ 754*88364387SHung-ying Tyan uint8_t reserved0; /* Ignore; will be 0 */ 755*88364387SHung-ying Tyan uint32_t offset; /* Offset in flash which was hashed */ 756*88364387SHung-ying Tyan uint32_t size; /* Number of bytes hashed */ 757*88364387SHung-ying Tyan uint8_t hash_digest[64]; /* Hash digest data */ 758*88364387SHung-ying Tyan } __packed; 759*88364387SHung-ying Tyan 760*88364387SHung-ying Tyan enum ec_vboot_hash_cmd { 761*88364387SHung-ying Tyan EC_VBOOT_HASH_GET = 0, /* Get current hash status */ 762*88364387SHung-ying Tyan EC_VBOOT_HASH_ABORT = 1, /* Abort calculating current hash */ 763*88364387SHung-ying Tyan EC_VBOOT_HASH_START = 2, /* Start computing a new hash */ 764*88364387SHung-ying Tyan EC_VBOOT_HASH_RECALC = 3, /* Synchronously compute a new hash */ 765*88364387SHung-ying Tyan }; 766*88364387SHung-ying Tyan 767*88364387SHung-ying Tyan enum ec_vboot_hash_type { 768*88364387SHung-ying Tyan EC_VBOOT_HASH_TYPE_SHA256 = 0, /* SHA-256 */ 769*88364387SHung-ying Tyan }; 770*88364387SHung-ying Tyan 771*88364387SHung-ying Tyan enum ec_vboot_hash_status { 772*88364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_NONE = 0, /* No hash (not started, or aborted) */ 773*88364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_DONE = 1, /* Finished computing a hash */ 774*88364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_BUSY = 2, /* Busy computing a hash */ 775*88364387SHung-ying Tyan }; 776*88364387SHung-ying Tyan 777*88364387SHung-ying Tyan /* 778*88364387SHung-ying Tyan * Special values for offset for EC_VBOOT_HASH_START and EC_VBOOT_HASH_RECALC. 779*88364387SHung-ying Tyan * If one of these is specified, the EC will automatically update offset and 780*88364387SHung-ying Tyan * size to the correct values for the specified image (RO or RW). 781*88364387SHung-ying Tyan */ 782*88364387SHung-ying Tyan #define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe 783*88364387SHung-ying Tyan #define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd 784*88364387SHung-ying Tyan 785*88364387SHung-ying Tyan /*****************************************************************************/ 786*88364387SHung-ying Tyan /* USB charging control commands */ 787*88364387SHung-ying Tyan 788*88364387SHung-ying Tyan /* Set USB port charging mode */ 789*88364387SHung-ying Tyan #define EC_CMD_USB_CHARGE_SET_MODE 0x30 790*88364387SHung-ying Tyan 791*88364387SHung-ying Tyan struct ec_params_usb_charge_set_mode { 792*88364387SHung-ying Tyan uint8_t usb_port_id; 793*88364387SHung-ying Tyan uint8_t mode; 794*88364387SHung-ying Tyan } __packed; 795*88364387SHung-ying Tyan 796*88364387SHung-ying Tyan /*****************************************************************************/ 797*88364387SHung-ying Tyan /* Persistent storage for host */ 798*88364387SHung-ying Tyan 799*88364387SHung-ying Tyan /* Maximum bytes that can be read/written in a single command */ 800*88364387SHung-ying Tyan #define EC_PSTORE_SIZE_MAX 64 801*88364387SHung-ying Tyan 802*88364387SHung-ying Tyan /* Get persistent storage info */ 803*88364387SHung-ying Tyan #define EC_CMD_PSTORE_INFO 0x40 804*88364387SHung-ying Tyan 805*88364387SHung-ying Tyan struct ec_response_pstore_info { 806*88364387SHung-ying Tyan /* Persistent storage size, in bytes */ 807*88364387SHung-ying Tyan uint32_t pstore_size; 808*88364387SHung-ying Tyan /* Access size; read/write offset and size must be a multiple of this */ 809*88364387SHung-ying Tyan uint32_t access_size; 810*88364387SHung-ying Tyan } __packed; 811*88364387SHung-ying Tyan 812*88364387SHung-ying Tyan /* 813*88364387SHung-ying Tyan * Read persistent storage 814*88364387SHung-ying Tyan * 815*88364387SHung-ying Tyan * Response is params.size bytes of data. 816*88364387SHung-ying Tyan */ 817*88364387SHung-ying Tyan #define EC_CMD_PSTORE_READ 0x41 818*88364387SHung-ying Tyan 819*88364387SHung-ying Tyan struct ec_params_pstore_read { 820*88364387SHung-ying Tyan uint32_t offset; /* Byte offset to read */ 821*88364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 822*88364387SHung-ying Tyan } __packed; 823*88364387SHung-ying Tyan 824*88364387SHung-ying Tyan /* Write persistent storage */ 825*88364387SHung-ying Tyan #define EC_CMD_PSTORE_WRITE 0x42 826*88364387SHung-ying Tyan 827*88364387SHung-ying Tyan struct ec_params_pstore_write { 828*88364387SHung-ying Tyan uint32_t offset; /* Byte offset to write */ 829*88364387SHung-ying Tyan uint32_t size; /* Size to write in bytes */ 830*88364387SHung-ying Tyan uint8_t data[EC_PSTORE_SIZE_MAX]; 831*88364387SHung-ying Tyan } __packed; 832*88364387SHung-ying Tyan 833*88364387SHung-ying Tyan /*****************************************************************************/ 834*88364387SHung-ying Tyan /* Real-time clock */ 835*88364387SHung-ying Tyan 836*88364387SHung-ying Tyan /* RTC params and response structures */ 837*88364387SHung-ying Tyan struct ec_params_rtc { 838*88364387SHung-ying Tyan uint32_t time; 839*88364387SHung-ying Tyan } __packed; 840*88364387SHung-ying Tyan 841*88364387SHung-ying Tyan struct ec_response_rtc { 842*88364387SHung-ying Tyan uint32_t time; 843*88364387SHung-ying Tyan } __packed; 844*88364387SHung-ying Tyan 845*88364387SHung-ying Tyan /* These use ec_response_rtc */ 846*88364387SHung-ying Tyan #define EC_CMD_RTC_GET_VALUE 0x44 847*88364387SHung-ying Tyan #define EC_CMD_RTC_GET_ALARM 0x45 848*88364387SHung-ying Tyan 849*88364387SHung-ying Tyan /* These all use ec_params_rtc */ 850*88364387SHung-ying Tyan #define EC_CMD_RTC_SET_VALUE 0x46 851*88364387SHung-ying Tyan #define EC_CMD_RTC_SET_ALARM 0x47 852*88364387SHung-ying Tyan 853*88364387SHung-ying Tyan /*****************************************************************************/ 854*88364387SHung-ying Tyan /* Port80 log access */ 855*88364387SHung-ying Tyan 856*88364387SHung-ying Tyan /* Get last port80 code from previous boot */ 857*88364387SHung-ying Tyan #define EC_CMD_PORT80_LAST_BOOT 0x48 858*88364387SHung-ying Tyan 859*88364387SHung-ying Tyan struct ec_response_port80_last_boot { 860*88364387SHung-ying Tyan uint16_t code; 861*88364387SHung-ying Tyan } __packed; 862*88364387SHung-ying Tyan 863*88364387SHung-ying Tyan /*****************************************************************************/ 864*88364387SHung-ying Tyan /* Thermal engine commands */ 865*88364387SHung-ying Tyan 866*88364387SHung-ying Tyan /* Set thershold value */ 867*88364387SHung-ying Tyan #define EC_CMD_THERMAL_SET_THRESHOLD 0x50 868*88364387SHung-ying Tyan 869*88364387SHung-ying Tyan struct ec_params_thermal_set_threshold { 870*88364387SHung-ying Tyan uint8_t sensor_type; 871*88364387SHung-ying Tyan uint8_t threshold_id; 872*88364387SHung-ying Tyan uint16_t value; 873*88364387SHung-ying Tyan } __packed; 874*88364387SHung-ying Tyan 875*88364387SHung-ying Tyan /* Get threshold value */ 876*88364387SHung-ying Tyan #define EC_CMD_THERMAL_GET_THRESHOLD 0x51 877*88364387SHung-ying Tyan 878*88364387SHung-ying Tyan struct ec_params_thermal_get_threshold { 879*88364387SHung-ying Tyan uint8_t sensor_type; 880*88364387SHung-ying Tyan uint8_t threshold_id; 881*88364387SHung-ying Tyan } __packed; 882*88364387SHung-ying Tyan 883*88364387SHung-ying Tyan struct ec_response_thermal_get_threshold { 884*88364387SHung-ying Tyan uint16_t value; 885*88364387SHung-ying Tyan } __packed; 886*88364387SHung-ying Tyan 887*88364387SHung-ying Tyan /* Toggle automatic fan control */ 888*88364387SHung-ying Tyan #define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52 889*88364387SHung-ying Tyan 890*88364387SHung-ying Tyan /* Get TMP006 calibration data */ 891*88364387SHung-ying Tyan #define EC_CMD_TMP006_GET_CALIBRATION 0x53 892*88364387SHung-ying Tyan 893*88364387SHung-ying Tyan struct ec_params_tmp006_get_calibration { 894*88364387SHung-ying Tyan uint8_t index; 895*88364387SHung-ying Tyan } __packed; 896*88364387SHung-ying Tyan 897*88364387SHung-ying Tyan struct ec_response_tmp006_get_calibration { 898*88364387SHung-ying Tyan float s0; 899*88364387SHung-ying Tyan float b0; 900*88364387SHung-ying Tyan float b1; 901*88364387SHung-ying Tyan float b2; 902*88364387SHung-ying Tyan } __packed; 903*88364387SHung-ying Tyan 904*88364387SHung-ying Tyan /* Set TMP006 calibration data */ 905*88364387SHung-ying Tyan #define EC_CMD_TMP006_SET_CALIBRATION 0x54 906*88364387SHung-ying Tyan 907*88364387SHung-ying Tyan struct ec_params_tmp006_set_calibration { 908*88364387SHung-ying Tyan uint8_t index; 909*88364387SHung-ying Tyan uint8_t reserved[3]; /* Reserved; set 0 */ 910*88364387SHung-ying Tyan float s0; 911*88364387SHung-ying Tyan float b0; 912*88364387SHung-ying Tyan float b1; 913*88364387SHung-ying Tyan float b2; 914*88364387SHung-ying Tyan } __packed; 915*88364387SHung-ying Tyan 916*88364387SHung-ying Tyan /*****************************************************************************/ 917*88364387SHung-ying Tyan /* CROS_EC - Matrix KeyBoard Protocol */ 918*88364387SHung-ying Tyan 919*88364387SHung-ying Tyan /* 920*88364387SHung-ying Tyan * Read key state 921*88364387SHung-ying Tyan * 922*88364387SHung-ying Tyan * Returns raw data for keyboard cols; see ec_response_cros_ec_info.cols for 923*88364387SHung-ying Tyan * expected response size. 924*88364387SHung-ying Tyan */ 925*88364387SHung-ying Tyan #define EC_CMD_CROS_EC_STATE 0x60 926*88364387SHung-ying Tyan 927*88364387SHung-ying Tyan /* Provide information about the matrix : number of rows and columns */ 928*88364387SHung-ying Tyan #define EC_CMD_CROS_EC_INFO 0x61 929*88364387SHung-ying Tyan 930*88364387SHung-ying Tyan struct ec_response_cros_ec_info { 931*88364387SHung-ying Tyan uint32_t rows; 932*88364387SHung-ying Tyan uint32_t cols; 933*88364387SHung-ying Tyan uint8_t switches; 934*88364387SHung-ying Tyan } __packed; 935*88364387SHung-ying Tyan 936*88364387SHung-ying Tyan /* Simulate key press */ 937*88364387SHung-ying Tyan #define EC_CMD_CROS_EC_SIMULATE_KEY 0x62 938*88364387SHung-ying Tyan 939*88364387SHung-ying Tyan struct ec_params_cros_ec_simulate_key { 940*88364387SHung-ying Tyan uint8_t col; 941*88364387SHung-ying Tyan uint8_t row; 942*88364387SHung-ying Tyan uint8_t pressed; 943*88364387SHung-ying Tyan } __packed; 944*88364387SHung-ying Tyan 945*88364387SHung-ying Tyan /* Configure keyboard scanning */ 946*88364387SHung-ying Tyan #define EC_CMD_CROS_EC_SET_CONFIG 0x64 947*88364387SHung-ying Tyan #define EC_CMD_CROS_EC_GET_CONFIG 0x65 948*88364387SHung-ying Tyan 949*88364387SHung-ying Tyan /* flags */ 950*88364387SHung-ying Tyan enum cros_ec_config_flags { 951*88364387SHung-ying Tyan EC_CROS_EC_FLAGS_ENABLE = 1, /* Enable keyboard scanning */ 952*88364387SHung-ying Tyan }; 953*88364387SHung-ying Tyan 954*88364387SHung-ying Tyan enum cros_ec_config_valid { 955*88364387SHung-ying Tyan EC_CROS_EC_VALID_SCAN_PERIOD = 1 << 0, 956*88364387SHung-ying Tyan EC_CROS_EC_VALID_POLL_TIMEOUT = 1 << 1, 957*88364387SHung-ying Tyan EC_CROS_EC_VALID_MIN_POST_SCAN_DELAY = 1 << 3, 958*88364387SHung-ying Tyan EC_CROS_EC_VALID_OUTPUT_SETTLE = 1 << 4, 959*88364387SHung-ying Tyan EC_CROS_EC_VALID_DEBOUNCE_DOWN = 1 << 5, 960*88364387SHung-ying Tyan EC_CROS_EC_VALID_DEBOUNCE_UP = 1 << 6, 961*88364387SHung-ying Tyan EC_CROS_EC_VALID_FIFO_MAX_DEPTH = 1 << 7, 962*88364387SHung-ying Tyan }; 963*88364387SHung-ying Tyan 964*88364387SHung-ying Tyan /* Configuration for our key scanning algorithm */ 965*88364387SHung-ying Tyan struct ec_cros_ec_config { 966*88364387SHung-ying Tyan uint32_t valid_mask; /* valid fields */ 967*88364387SHung-ying Tyan uint8_t flags; /* some flags (enum cros_ec_config_flags) */ 968*88364387SHung-ying Tyan uint8_t valid_flags; /* which flags are valid */ 969*88364387SHung-ying Tyan uint16_t scan_period_us; /* period between start of scans */ 970*88364387SHung-ying Tyan /* revert to interrupt mode after no activity for this long */ 971*88364387SHung-ying Tyan uint32_t poll_timeout_us; 972*88364387SHung-ying Tyan /* 973*88364387SHung-ying Tyan * minimum post-scan relax time. Once we finish a scan we check 974*88364387SHung-ying Tyan * the time until we are due to start the next one. If this time is 975*88364387SHung-ying Tyan * shorter this field, we use this instead. 976*88364387SHung-ying Tyan */ 977*88364387SHung-ying Tyan uint16_t min_post_scan_delay_us; 978*88364387SHung-ying Tyan /* delay between setting up output and waiting for it to settle */ 979*88364387SHung-ying Tyan uint16_t output_settle_us; 980*88364387SHung-ying Tyan uint16_t debounce_down_us; /* time for debounce on key down */ 981*88364387SHung-ying Tyan uint16_t debounce_up_us; /* time for debounce on key up */ 982*88364387SHung-ying Tyan /* maximum depth to allow for fifo (0 = no keyscan output) */ 983*88364387SHung-ying Tyan uint8_t fifo_max_depth; 984*88364387SHung-ying Tyan } __packed; 985*88364387SHung-ying Tyan 986*88364387SHung-ying Tyan struct ec_params_cros_ec_set_config { 987*88364387SHung-ying Tyan struct ec_cros_ec_config config; 988*88364387SHung-ying Tyan } __packed; 989*88364387SHung-ying Tyan 990*88364387SHung-ying Tyan struct ec_response_cros_ec_get_config { 991*88364387SHung-ying Tyan struct ec_cros_ec_config config; 992*88364387SHung-ying Tyan } __packed; 993*88364387SHung-ying Tyan 994*88364387SHung-ying Tyan /* Run the key scan emulation */ 995*88364387SHung-ying Tyan #define EC_CMD_KEYSCAN_SEQ_CTRL 0x66 996*88364387SHung-ying Tyan 997*88364387SHung-ying Tyan enum ec_keyscan_seq_cmd { 998*88364387SHung-ying Tyan EC_KEYSCAN_SEQ_STATUS = 0, /* Get status information */ 999*88364387SHung-ying Tyan EC_KEYSCAN_SEQ_CLEAR = 1, /* Clear sequence */ 1000*88364387SHung-ying Tyan EC_KEYSCAN_SEQ_ADD = 2, /* Add item to sequence */ 1001*88364387SHung-ying Tyan EC_KEYSCAN_SEQ_START = 3, /* Start running sequence */ 1002*88364387SHung-ying Tyan EC_KEYSCAN_SEQ_COLLECT = 4, /* Collect sequence summary data */ 1003*88364387SHung-ying Tyan }; 1004*88364387SHung-ying Tyan 1005*88364387SHung-ying Tyan enum ec_collect_flags { 1006*88364387SHung-ying Tyan /* 1007*88364387SHung-ying Tyan * Indicates this scan was processed by the EC. Due to timing, some 1008*88364387SHung-ying Tyan * scans may be skipped. 1009*88364387SHung-ying Tyan */ 1010*88364387SHung-ying Tyan EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0, 1011*88364387SHung-ying Tyan }; 1012*88364387SHung-ying Tyan 1013*88364387SHung-ying Tyan struct ec_collect_item { 1014*88364387SHung-ying Tyan uint8_t flags; /* some flags (enum ec_collect_flags) */ 1015*88364387SHung-ying Tyan }; 1016*88364387SHung-ying Tyan 1017*88364387SHung-ying Tyan struct ec_params_keyscan_seq_ctrl { 1018*88364387SHung-ying Tyan uint8_t cmd; /* Command to send (enum ec_keyscan_seq_cmd) */ 1019*88364387SHung-ying Tyan union { 1020*88364387SHung-ying Tyan struct { 1021*88364387SHung-ying Tyan uint8_t active; /* still active */ 1022*88364387SHung-ying Tyan uint8_t num_items; /* number of items */ 1023*88364387SHung-ying Tyan /* Current item being presented */ 1024*88364387SHung-ying Tyan uint8_t cur_item; 1025*88364387SHung-ying Tyan } status; 1026*88364387SHung-ying Tyan struct { 1027*88364387SHung-ying Tyan /* 1028*88364387SHung-ying Tyan * Absolute time for this scan, measured from the 1029*88364387SHung-ying Tyan * start of the sequence. 1030*88364387SHung-ying Tyan */ 1031*88364387SHung-ying Tyan uint32_t time_us; 1032*88364387SHung-ying Tyan uint8_t scan[0]; /* keyscan data */ 1033*88364387SHung-ying Tyan } add; 1034*88364387SHung-ying Tyan struct { 1035*88364387SHung-ying Tyan uint8_t start_item; /* First item to return */ 1036*88364387SHung-ying Tyan uint8_t num_items; /* Number of items to return */ 1037*88364387SHung-ying Tyan } collect; 1038*88364387SHung-ying Tyan }; 1039*88364387SHung-ying Tyan } __packed; 1040*88364387SHung-ying Tyan 1041*88364387SHung-ying Tyan struct ec_result_keyscan_seq_ctrl { 1042*88364387SHung-ying Tyan union { 1043*88364387SHung-ying Tyan struct { 1044*88364387SHung-ying Tyan uint8_t num_items; /* Number of items */ 1045*88364387SHung-ying Tyan /* Data for each item */ 1046*88364387SHung-ying Tyan struct ec_collect_item item[0]; 1047*88364387SHung-ying Tyan } collect; 1048*88364387SHung-ying Tyan }; 1049*88364387SHung-ying Tyan } __packed; 1050*88364387SHung-ying Tyan 1051*88364387SHung-ying Tyan /*****************************************************************************/ 1052*88364387SHung-ying Tyan /* Temperature sensor commands */ 1053*88364387SHung-ying Tyan 1054*88364387SHung-ying Tyan /* Read temperature sensor info */ 1055*88364387SHung-ying Tyan #define EC_CMD_TEMP_SENSOR_GET_INFO 0x70 1056*88364387SHung-ying Tyan 1057*88364387SHung-ying Tyan struct ec_params_temp_sensor_get_info { 1058*88364387SHung-ying Tyan uint8_t id; 1059*88364387SHung-ying Tyan } __packed; 1060*88364387SHung-ying Tyan 1061*88364387SHung-ying Tyan struct ec_response_temp_sensor_get_info { 1062*88364387SHung-ying Tyan char sensor_name[32]; 1063*88364387SHung-ying Tyan uint8_t sensor_type; 1064*88364387SHung-ying Tyan } __packed; 1065*88364387SHung-ying Tyan 1066*88364387SHung-ying Tyan /*****************************************************************************/ 1067*88364387SHung-ying Tyan 1068*88364387SHung-ying Tyan /* 1069*88364387SHung-ying Tyan * Note: host commands 0x80 - 0x87 are reserved to avoid conflict with ACPI 1070*88364387SHung-ying Tyan * commands accidentally sent to the wrong interface. See the ACPI section 1071*88364387SHung-ying Tyan * below. 1072*88364387SHung-ying Tyan */ 1073*88364387SHung-ying Tyan 1074*88364387SHung-ying Tyan /*****************************************************************************/ 1075*88364387SHung-ying Tyan /* Host event commands */ 1076*88364387SHung-ying Tyan 1077*88364387SHung-ying Tyan /* 1078*88364387SHung-ying Tyan * Host event mask params and response structures, shared by all of the host 1079*88364387SHung-ying Tyan * event commands below. 1080*88364387SHung-ying Tyan */ 1081*88364387SHung-ying Tyan struct ec_params_host_event_mask { 1082*88364387SHung-ying Tyan uint32_t mask; 1083*88364387SHung-ying Tyan } __packed; 1084*88364387SHung-ying Tyan 1085*88364387SHung-ying Tyan struct ec_response_host_event_mask { 1086*88364387SHung-ying Tyan uint32_t mask; 1087*88364387SHung-ying Tyan } __packed; 1088*88364387SHung-ying Tyan 1089*88364387SHung-ying Tyan /* These all use ec_response_host_event_mask */ 1090*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_B 0x87 1091*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x88 1092*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x89 1093*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x8d 1094*88364387SHung-ying Tyan 1095*88364387SHung-ying Tyan /* These all use ec_params_host_event_mask */ 1096*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x8a 1097*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x8b 1098*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_CLEAR 0x8c 1099*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x8e 1100*88364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_CLEAR_B 0x8f 1101*88364387SHung-ying Tyan 1102*88364387SHung-ying Tyan /*****************************************************************************/ 1103*88364387SHung-ying Tyan /* Switch commands */ 1104*88364387SHung-ying Tyan 1105*88364387SHung-ying Tyan /* Enable/disable LCD backlight */ 1106*88364387SHung-ying Tyan #define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x90 1107*88364387SHung-ying Tyan 1108*88364387SHung-ying Tyan struct ec_params_switch_enable_backlight { 1109*88364387SHung-ying Tyan uint8_t enabled; 1110*88364387SHung-ying Tyan } __packed; 1111*88364387SHung-ying Tyan 1112*88364387SHung-ying Tyan /* Enable/disable WLAN/Bluetooth */ 1113*88364387SHung-ying Tyan #define EC_CMD_SWITCH_ENABLE_WIRELESS 0x91 1114*88364387SHung-ying Tyan 1115*88364387SHung-ying Tyan struct ec_params_switch_enable_wireless { 1116*88364387SHung-ying Tyan uint8_t enabled; 1117*88364387SHung-ying Tyan } __packed; 1118*88364387SHung-ying Tyan 1119*88364387SHung-ying Tyan /*****************************************************************************/ 1120*88364387SHung-ying Tyan /* GPIO commands. Only available on EC if write protect has been disabled. */ 1121*88364387SHung-ying Tyan 1122*88364387SHung-ying Tyan /* Set GPIO output value */ 1123*88364387SHung-ying Tyan #define EC_CMD_GPIO_SET 0x92 1124*88364387SHung-ying Tyan 1125*88364387SHung-ying Tyan struct ec_params_gpio_set { 1126*88364387SHung-ying Tyan char name[32]; 1127*88364387SHung-ying Tyan uint8_t val; 1128*88364387SHung-ying Tyan } __packed; 1129*88364387SHung-ying Tyan 1130*88364387SHung-ying Tyan /* Get GPIO value */ 1131*88364387SHung-ying Tyan #define EC_CMD_GPIO_GET 0x93 1132*88364387SHung-ying Tyan 1133*88364387SHung-ying Tyan struct ec_params_gpio_get { 1134*88364387SHung-ying Tyan char name[32]; 1135*88364387SHung-ying Tyan } __packed; 1136*88364387SHung-ying Tyan struct ec_response_gpio_get { 1137*88364387SHung-ying Tyan uint8_t val; 1138*88364387SHung-ying Tyan } __packed; 1139*88364387SHung-ying Tyan 1140*88364387SHung-ying Tyan /*****************************************************************************/ 1141*88364387SHung-ying Tyan /* I2C commands. Only available when flash write protect is unlocked. */ 1142*88364387SHung-ying Tyan 1143*88364387SHung-ying Tyan /* Read I2C bus */ 1144*88364387SHung-ying Tyan #define EC_CMD_I2C_READ 0x94 1145*88364387SHung-ying Tyan 1146*88364387SHung-ying Tyan struct ec_params_i2c_read { 1147*88364387SHung-ying Tyan uint16_t addr; 1148*88364387SHung-ying Tyan uint8_t read_size; /* Either 8 or 16. */ 1149*88364387SHung-ying Tyan uint8_t port; 1150*88364387SHung-ying Tyan uint8_t offset; 1151*88364387SHung-ying Tyan } __packed; 1152*88364387SHung-ying Tyan struct ec_response_i2c_read { 1153*88364387SHung-ying Tyan uint16_t data; 1154*88364387SHung-ying Tyan } __packed; 1155*88364387SHung-ying Tyan 1156*88364387SHung-ying Tyan /* Write I2C bus */ 1157*88364387SHung-ying Tyan #define EC_CMD_I2C_WRITE 0x95 1158*88364387SHung-ying Tyan 1159*88364387SHung-ying Tyan struct ec_params_i2c_write { 1160*88364387SHung-ying Tyan uint16_t data; 1161*88364387SHung-ying Tyan uint16_t addr; 1162*88364387SHung-ying Tyan uint8_t write_size; /* Either 8 or 16. */ 1163*88364387SHung-ying Tyan uint8_t port; 1164*88364387SHung-ying Tyan uint8_t offset; 1165*88364387SHung-ying Tyan } __packed; 1166*88364387SHung-ying Tyan 1167*88364387SHung-ying Tyan /*****************************************************************************/ 1168*88364387SHung-ying Tyan /* Charge state commands. Only available when flash write protect unlocked. */ 1169*88364387SHung-ying Tyan 1170*88364387SHung-ying Tyan /* Force charge state machine to stop in idle mode */ 1171*88364387SHung-ying Tyan #define EC_CMD_CHARGE_FORCE_IDLE 0x96 1172*88364387SHung-ying Tyan 1173*88364387SHung-ying Tyan struct ec_params_force_idle { 1174*88364387SHung-ying Tyan uint8_t enabled; 1175*88364387SHung-ying Tyan } __packed; 1176*88364387SHung-ying Tyan 1177*88364387SHung-ying Tyan /*****************************************************************************/ 1178*88364387SHung-ying Tyan /* Console commands. Only available when flash write protect is unlocked. */ 1179*88364387SHung-ying Tyan 1180*88364387SHung-ying Tyan /* Snapshot console output buffer for use by EC_CMD_CONSOLE_READ. */ 1181*88364387SHung-ying Tyan #define EC_CMD_CONSOLE_SNAPSHOT 0x97 1182*88364387SHung-ying Tyan 1183*88364387SHung-ying Tyan /* 1184*88364387SHung-ying Tyan * Read next chunk of data from saved snapshot. 1185*88364387SHung-ying Tyan * 1186*88364387SHung-ying Tyan * Response is null-terminated string. Empty string, if there is no more 1187*88364387SHung-ying Tyan * remaining output. 1188*88364387SHung-ying Tyan */ 1189*88364387SHung-ying Tyan #define EC_CMD_CONSOLE_READ 0x98 1190*88364387SHung-ying Tyan 1191*88364387SHung-ying Tyan /*****************************************************************************/ 1192*88364387SHung-ying Tyan 1193*88364387SHung-ying Tyan /* 1194*88364387SHung-ying Tyan * Cut off battery power output if the battery supports. 1195*88364387SHung-ying Tyan * 1196*88364387SHung-ying Tyan * For unsupported battery, just don't implement this command and lets EC 1197*88364387SHung-ying Tyan * return EC_RES_INVALID_COMMAND. 1198*88364387SHung-ying Tyan */ 1199*88364387SHung-ying Tyan #define EC_CMD_BATTERY_CUT_OFF 0x99 1200*88364387SHung-ying Tyan 1201*88364387SHung-ying Tyan /*****************************************************************************/ 1202*88364387SHung-ying Tyan /* USB port mux control. */ 1203*88364387SHung-ying Tyan 1204*88364387SHung-ying Tyan /* 1205*88364387SHung-ying Tyan * Switch USB mux or return to automatic switching. 1206*88364387SHung-ying Tyan */ 1207*88364387SHung-ying Tyan #define EC_CMD_USB_MUX 0x9a 1208*88364387SHung-ying Tyan 1209*88364387SHung-ying Tyan struct ec_params_usb_mux { 1210*88364387SHung-ying Tyan uint8_t mux; 1211*88364387SHung-ying Tyan } __packed; 1212*88364387SHung-ying Tyan 1213*88364387SHung-ying Tyan /*****************************************************************************/ 1214*88364387SHung-ying Tyan /* LDOs / FETs control. */ 1215*88364387SHung-ying Tyan 1216*88364387SHung-ying Tyan enum ec_ldo_state { 1217*88364387SHung-ying Tyan EC_LDO_STATE_OFF = 0, /* the LDO / FET is shut down */ 1218*88364387SHung-ying Tyan EC_LDO_STATE_ON = 1, /* the LDO / FET is ON / providing power */ 1219*88364387SHung-ying Tyan }; 1220*88364387SHung-ying Tyan 1221*88364387SHung-ying Tyan /* 1222*88364387SHung-ying Tyan * Switch on/off a LDO. 1223*88364387SHung-ying Tyan */ 1224*88364387SHung-ying Tyan #define EC_CMD_LDO_SET 0x9b 1225*88364387SHung-ying Tyan 1226*88364387SHung-ying Tyan struct ec_params_ldo_set { 1227*88364387SHung-ying Tyan uint8_t index; 1228*88364387SHung-ying Tyan uint8_t state; 1229*88364387SHung-ying Tyan } __packed; 1230*88364387SHung-ying Tyan 1231*88364387SHung-ying Tyan /* 1232*88364387SHung-ying Tyan * Get LDO state. 1233*88364387SHung-ying Tyan */ 1234*88364387SHung-ying Tyan #define EC_CMD_LDO_GET 0x9c 1235*88364387SHung-ying Tyan 1236*88364387SHung-ying Tyan struct ec_params_ldo_get { 1237*88364387SHung-ying Tyan uint8_t index; 1238*88364387SHung-ying Tyan } __packed; 1239*88364387SHung-ying Tyan 1240*88364387SHung-ying Tyan struct ec_response_ldo_get { 1241*88364387SHung-ying Tyan uint8_t state; 1242*88364387SHung-ying Tyan } __packed; 1243*88364387SHung-ying Tyan 1244*88364387SHung-ying Tyan /*****************************************************************************/ 1245*88364387SHung-ying Tyan /* Temporary debug commands. TODO: remove this crosbug.com/p/13849 */ 1246*88364387SHung-ying Tyan 1247*88364387SHung-ying Tyan /* 1248*88364387SHung-ying Tyan * Dump charge state machine context. 1249*88364387SHung-ying Tyan * 1250*88364387SHung-ying Tyan * Response is a binary dump of charge state machine context. 1251*88364387SHung-ying Tyan */ 1252*88364387SHung-ying Tyan #define EC_CMD_CHARGE_DUMP 0xa0 1253*88364387SHung-ying Tyan 1254*88364387SHung-ying Tyan /* 1255*88364387SHung-ying Tyan * Set maximum battery charging current. 1256*88364387SHung-ying Tyan */ 1257*88364387SHung-ying Tyan #define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1 1258*88364387SHung-ying Tyan 1259*88364387SHung-ying Tyan struct ec_params_current_limit { 1260*88364387SHung-ying Tyan uint32_t limit; 1261*88364387SHung-ying Tyan } __packed; 1262*88364387SHung-ying Tyan 1263*88364387SHung-ying Tyan /*****************************************************************************/ 1264*88364387SHung-ying Tyan /* Smart battery pass-through */ 1265*88364387SHung-ying Tyan 1266*88364387SHung-ying Tyan /* Get / Set 16-bit smart battery registers */ 1267*88364387SHung-ying Tyan #define EC_CMD_SB_READ_WORD 0xb0 1268*88364387SHung-ying Tyan #define EC_CMD_SB_WRITE_WORD 0xb1 1269*88364387SHung-ying Tyan 1270*88364387SHung-ying Tyan /* Get / Set string smart battery parameters 1271*88364387SHung-ying Tyan * formatted as SMBUS "block". 1272*88364387SHung-ying Tyan */ 1273*88364387SHung-ying Tyan #define EC_CMD_SB_READ_BLOCK 0xb2 1274*88364387SHung-ying Tyan #define EC_CMD_SB_WRITE_BLOCK 0xb3 1275*88364387SHung-ying Tyan 1276*88364387SHung-ying Tyan struct ec_params_sb_rd { 1277*88364387SHung-ying Tyan uint8_t reg; 1278*88364387SHung-ying Tyan } __packed; 1279*88364387SHung-ying Tyan 1280*88364387SHung-ying Tyan struct ec_response_sb_rd_word { 1281*88364387SHung-ying Tyan uint16_t value; 1282*88364387SHung-ying Tyan } __packed; 1283*88364387SHung-ying Tyan 1284*88364387SHung-ying Tyan struct ec_params_sb_wr_word { 1285*88364387SHung-ying Tyan uint8_t reg; 1286*88364387SHung-ying Tyan uint16_t value; 1287*88364387SHung-ying Tyan } __packed; 1288*88364387SHung-ying Tyan 1289*88364387SHung-ying Tyan struct ec_response_sb_rd_block { 1290*88364387SHung-ying Tyan uint8_t data[32]; 1291*88364387SHung-ying Tyan } __packed; 1292*88364387SHung-ying Tyan 1293*88364387SHung-ying Tyan struct ec_params_sb_wr_block { 1294*88364387SHung-ying Tyan uint8_t reg; 1295*88364387SHung-ying Tyan uint16_t data[32]; 1296*88364387SHung-ying Tyan } __packed; 1297*88364387SHung-ying Tyan 1298*88364387SHung-ying Tyan /*****************************************************************************/ 1299*88364387SHung-ying Tyan /* System commands */ 1300*88364387SHung-ying Tyan 1301*88364387SHung-ying Tyan /* 1302*88364387SHung-ying Tyan * TODO: this is a confusing name, since it doesn't necessarily reboot the EC. 1303*88364387SHung-ying Tyan * Rename to "set image" or something similar. 1304*88364387SHung-ying Tyan */ 1305*88364387SHung-ying Tyan #define EC_CMD_REBOOT_EC 0xd2 1306*88364387SHung-ying Tyan 1307*88364387SHung-ying Tyan /* Command */ 1308*88364387SHung-ying Tyan enum ec_reboot_cmd { 1309*88364387SHung-ying Tyan EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */ 1310*88364387SHung-ying Tyan EC_REBOOT_JUMP_RO = 1, /* Jump to RO without rebooting */ 1311*88364387SHung-ying Tyan EC_REBOOT_JUMP_RW = 2, /* Jump to RW without rebooting */ 1312*88364387SHung-ying Tyan /* (command 3 was jump to RW-B) */ 1313*88364387SHung-ying Tyan EC_REBOOT_COLD = 4, /* Cold-reboot */ 1314*88364387SHung-ying Tyan EC_REBOOT_DISABLE_JUMP = 5, /* Disable jump until next reboot */ 1315*88364387SHung-ying Tyan EC_REBOOT_HIBERNATE = 6 /* Hibernate EC */ 1316*88364387SHung-ying Tyan }; 1317*88364387SHung-ying Tyan 1318*88364387SHung-ying Tyan /* Flags for ec_params_reboot_ec.reboot_flags */ 1319*88364387SHung-ying Tyan #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */ 1320*88364387SHung-ying Tyan #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */ 1321*88364387SHung-ying Tyan 1322*88364387SHung-ying Tyan struct ec_params_reboot_ec { 1323*88364387SHung-ying Tyan uint8_t cmd; /* enum ec_reboot_cmd */ 1324*88364387SHung-ying Tyan uint8_t flags; /* See EC_REBOOT_FLAG_* */ 1325*88364387SHung-ying Tyan } __packed; 1326*88364387SHung-ying Tyan 1327*88364387SHung-ying Tyan /* 1328*88364387SHung-ying Tyan * Get information on last EC panic. 1329*88364387SHung-ying Tyan * 1330*88364387SHung-ying Tyan * Returns variable-length platform-dependent panic information. See panic.h 1331*88364387SHung-ying Tyan * for details. 1332*88364387SHung-ying Tyan */ 1333*88364387SHung-ying Tyan #define EC_CMD_GET_PANIC_INFO 0xd3 1334*88364387SHung-ying Tyan 1335*88364387SHung-ying Tyan /*****************************************************************************/ 1336*88364387SHung-ying Tyan /* 1337*88364387SHung-ying Tyan * ACPI commands 1338*88364387SHung-ying Tyan * 1339*88364387SHung-ying Tyan * These are valid ONLY on the ACPI command/data port. 1340*88364387SHung-ying Tyan */ 1341*88364387SHung-ying Tyan 1342*88364387SHung-ying Tyan /* 1343*88364387SHung-ying Tyan * ACPI Read Embedded Controller 1344*88364387SHung-ying Tyan * 1345*88364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 1346*88364387SHung-ying Tyan * 1347*88364387SHung-ying Tyan * Use the following sequence: 1348*88364387SHung-ying Tyan * 1349*88364387SHung-ying Tyan * - Write EC_CMD_ACPI_READ to EC_LPC_ADDR_ACPI_CMD 1350*88364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 1351*88364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 1352*88364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_DATA bit to set 1353*88364387SHung-ying Tyan * - Read value from EC_LPC_ADDR_ACPI_DATA 1354*88364387SHung-ying Tyan */ 1355*88364387SHung-ying Tyan #define EC_CMD_ACPI_READ 0x80 1356*88364387SHung-ying Tyan 1357*88364387SHung-ying Tyan /* 1358*88364387SHung-ying Tyan * ACPI Write Embedded Controller 1359*88364387SHung-ying Tyan * 1360*88364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 1361*88364387SHung-ying Tyan * 1362*88364387SHung-ying Tyan * Use the following sequence: 1363*88364387SHung-ying Tyan * 1364*88364387SHung-ying Tyan * - Write EC_CMD_ACPI_WRITE to EC_LPC_ADDR_ACPI_CMD 1365*88364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 1366*88364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 1367*88364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 1368*88364387SHung-ying Tyan * - Write value to EC_LPC_ADDR_ACPI_DATA 1369*88364387SHung-ying Tyan */ 1370*88364387SHung-ying Tyan #define EC_CMD_ACPI_WRITE 0x81 1371*88364387SHung-ying Tyan 1372*88364387SHung-ying Tyan /* 1373*88364387SHung-ying Tyan * ACPI Query Embedded Controller 1374*88364387SHung-ying Tyan * 1375*88364387SHung-ying Tyan * This clears the lowest-order bit in the currently pending host events, and 1376*88364387SHung-ying Tyan * sets the result code to the 1-based index of the bit (event 0x00000001 = 1, 1377*88364387SHung-ying Tyan * event 0x80000000 = 32), or 0 if no event was pending. 1378*88364387SHung-ying Tyan */ 1379*88364387SHung-ying Tyan #define EC_CMD_ACPI_QUERY_EVENT 0x84 1380*88364387SHung-ying Tyan 1381*88364387SHung-ying Tyan /* Valid addresses in ACPI memory space, for read/write commands */ 1382*88364387SHung-ying Tyan /* Memory space version; set to EC_ACPI_MEM_VERSION_CURRENT */ 1383*88364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION 0x00 1384*88364387SHung-ying Tyan /* 1385*88364387SHung-ying Tyan * Test location; writing value here updates test compliment byte to (0xff - 1386*88364387SHung-ying Tyan * value). 1387*88364387SHung-ying Tyan */ 1388*88364387SHung-ying Tyan #define EC_ACPI_MEM_TEST 0x01 1389*88364387SHung-ying Tyan /* Test compliment; writes here are ignored. */ 1390*88364387SHung-ying Tyan #define EC_ACPI_MEM_TEST_COMPLIMENT 0x02 1391*88364387SHung-ying Tyan /* Keyboard backlight brightness percent (0 - 100) */ 1392*88364387SHung-ying Tyan #define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03 1393*88364387SHung-ying Tyan 1394*88364387SHung-ying Tyan /* Current version of ACPI memory address space */ 1395*88364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION_CURRENT 1 1396*88364387SHung-ying Tyan 1397*88364387SHung-ying Tyan 1398*88364387SHung-ying Tyan /*****************************************************************************/ 1399*88364387SHung-ying Tyan /* 1400*88364387SHung-ying Tyan * Special commands 1401*88364387SHung-ying Tyan * 1402*88364387SHung-ying Tyan * These do not follow the normal rules for commands. See each command for 1403*88364387SHung-ying Tyan * details. 1404*88364387SHung-ying Tyan */ 1405*88364387SHung-ying Tyan 1406*88364387SHung-ying Tyan /* 1407*88364387SHung-ying Tyan * Reboot NOW 1408*88364387SHung-ying Tyan * 1409*88364387SHung-ying Tyan * This command will work even when the EC LPC interface is busy, because the 1410*88364387SHung-ying Tyan * reboot command is processed at interrupt level. Note that when the EC 1411*88364387SHung-ying Tyan * reboots, the host will reboot too, so there is no response to this command. 1412*88364387SHung-ying Tyan * 1413*88364387SHung-ying Tyan * Use EC_CMD_REBOOT_EC to reboot the EC more politely. 1414*88364387SHung-ying Tyan */ 1415*88364387SHung-ying Tyan #define EC_CMD_REBOOT 0xd1 /* Think "die" */ 1416*88364387SHung-ying Tyan 1417*88364387SHung-ying Tyan /* 1418*88364387SHung-ying Tyan * Resend last response (not supported on LPC). 1419*88364387SHung-ying Tyan * 1420*88364387SHung-ying Tyan * Returns EC_RES_UNAVAILABLE if there is no response available - for example, 1421*88364387SHung-ying Tyan * there was no previous command, or the previous command's response was too 1422*88364387SHung-ying Tyan * big to save. 1423*88364387SHung-ying Tyan */ 1424*88364387SHung-ying Tyan #define EC_CMD_RESEND_RESPONSE 0xdb 1425*88364387SHung-ying Tyan 1426*88364387SHung-ying Tyan /* 1427*88364387SHung-ying Tyan * This header byte on a command indicate version 0. Any header byte less 1428*88364387SHung-ying Tyan * than this means that we are talking to an old EC which doesn't support 1429*88364387SHung-ying Tyan * versioning. In that case, we assume version 0. 1430*88364387SHung-ying Tyan * 1431*88364387SHung-ying Tyan * Header bytes greater than this indicate a later version. For example, 1432*88364387SHung-ying Tyan * EC_CMD_VERSION0 + 1 means we are using version 1. 1433*88364387SHung-ying Tyan * 1434*88364387SHung-ying Tyan * The old EC interface must not use commands 0dc or higher. 1435*88364387SHung-ying Tyan */ 1436*88364387SHung-ying Tyan #define EC_CMD_VERSION0 0xdc 1437*88364387SHung-ying Tyan 1438*88364387SHung-ying Tyan #endif /* !__ACPI__ */ 1439*88364387SHung-ying Tyan 1440*88364387SHung-ying Tyan #endif /* __CROS_EC_COMMANDS_H */ 1441