1 /* 2 * Host communication command constants for ChromeOS EC 3 * 4 * Copyright (C) 2012 Google, Inc 5 * 6 * This software is licensed under the terms of the GNU General Public 7 * License version 2, as published by the Free Software Foundation, and 8 * may be copied, distributed, and modified under those terms. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * The ChromeOS EC multi function device is used to mux all the requests 16 * to the EC device for its multiple features: keyboard controller, 17 * battery charging and regulator control, firmware update. 18 * 19 * NOTE: This file is copied verbatim from the ChromeOS EC Open Source 20 * project in an attempt to make future updates easy to make. 21 */ 22 23 #ifndef __CROS_EC_COMMANDS_H 24 #define __CROS_EC_COMMANDS_H 25 26 /* 27 * Current version of this protocol 28 * 29 * TODO(crosbug.com/p/11223): This is effectively useless; protocol is 30 * determined in other ways. Remove this once the kernel code no longer 31 * depends on it. 32 */ 33 #define EC_PROTO_VERSION 0x00000002 34 35 /* Command version mask */ 36 #define EC_VER_MASK(version) (1UL << (version)) 37 38 /* I/O addresses for ACPI commands */ 39 #define EC_LPC_ADDR_ACPI_DATA 0x62 40 #define EC_LPC_ADDR_ACPI_CMD 0x66 41 42 /* I/O addresses for host command */ 43 #define EC_LPC_ADDR_HOST_DATA 0x200 44 #define EC_LPC_ADDR_HOST_CMD 0x204 45 46 /* I/O addresses for host command args and params */ 47 /* Protocol version 2 */ 48 #define EC_LPC_ADDR_HOST_ARGS 0x800 /* And 0x801, 0x802, 0x803 */ 49 #define EC_LPC_ADDR_HOST_PARAM 0x804 /* For version 2 params; size is 50 * EC_PROTO2_MAX_PARAM_SIZE */ 51 /* Protocol version 3 */ 52 #define EC_LPC_ADDR_HOST_PACKET 0x800 /* Offset of version 3 packet */ 53 #define EC_LPC_HOST_PACKET_SIZE 0x100 /* Max size of version 3 packet */ 54 55 /* The actual block is 0x800-0x8ff, but some BIOSes think it's 0x880-0x8ff 56 * and they tell the kernel that so we have to think of it as two parts. */ 57 #define EC_HOST_CMD_REGION0 0x800 58 #define EC_HOST_CMD_REGION1 0x880 59 #define EC_HOST_CMD_REGION_SIZE 0x80 60 61 /* EC command register bit functions */ 62 #define EC_LPC_CMDR_DATA (1 << 0) /* Data ready for host to read */ 63 #define EC_LPC_CMDR_PENDING (1 << 1) /* Write pending to EC */ 64 #define EC_LPC_CMDR_BUSY (1 << 2) /* EC is busy processing a command */ 65 #define EC_LPC_CMDR_CMD (1 << 3) /* Last host write was a command */ 66 #define EC_LPC_CMDR_ACPI_BRST (1 << 4) /* Burst mode (not used) */ 67 #define EC_LPC_CMDR_SCI (1 << 5) /* SCI event is pending */ 68 #define EC_LPC_CMDR_SMI (1 << 6) /* SMI event is pending */ 69 70 #define EC_LPC_ADDR_MEMMAP 0x900 71 #define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */ 72 #define EC_MEMMAP_TEXT_MAX 8 /* Size of a string in the memory map */ 73 74 /* The offset address of each type of data in mapped memory. */ 75 #define EC_MEMMAP_TEMP_SENSOR 0x00 /* Temp sensors 0x00 - 0x0f */ 76 #define EC_MEMMAP_FAN 0x10 /* Fan speeds 0x10 - 0x17 */ 77 #define EC_MEMMAP_TEMP_SENSOR_B 0x18 /* More temp sensors 0x18 - 0x1f */ 78 #define EC_MEMMAP_ID 0x20 /* 0x20 == 'E', 0x21 == 'C' */ 79 #define EC_MEMMAP_ID_VERSION 0x22 /* Version of data in 0x20 - 0x2f */ 80 #define EC_MEMMAP_THERMAL_VERSION 0x23 /* Version of data in 0x00 - 0x1f */ 81 #define EC_MEMMAP_BATTERY_VERSION 0x24 /* Version of data in 0x40 - 0x7f */ 82 #define EC_MEMMAP_SWITCHES_VERSION 0x25 /* Version of data in 0x30 - 0x33 */ 83 #define EC_MEMMAP_EVENTS_VERSION 0x26 /* Version of data in 0x34 - 0x3f */ 84 #define EC_MEMMAP_HOST_CMD_FLAGS 0x27 /* Host cmd interface flags (8 bits) */ 85 /* Unused 0x28 - 0x2f */ 86 #define EC_MEMMAP_SWITCHES 0x30 /* 8 bits */ 87 /* Unused 0x31 - 0x33 */ 88 #define EC_MEMMAP_HOST_EVENTS 0x34 /* 32 bits */ 89 /* Reserve 0x38 - 0x3f for additional host event-related stuff */ 90 /* Battery values are all 32 bits */ 91 #define EC_MEMMAP_BATT_VOLT 0x40 /* Battery Present Voltage */ 92 #define EC_MEMMAP_BATT_RATE 0x44 /* Battery Present Rate */ 93 #define EC_MEMMAP_BATT_CAP 0x48 /* Battery Remaining Capacity */ 94 #define EC_MEMMAP_BATT_FLAG 0x4c /* Battery State, defined below */ 95 #define EC_MEMMAP_BATT_DCAP 0x50 /* Battery Design Capacity */ 96 #define EC_MEMMAP_BATT_DVLT 0x54 /* Battery Design Voltage */ 97 #define EC_MEMMAP_BATT_LFCC 0x58 /* Battery Last Full Charge Capacity */ 98 #define EC_MEMMAP_BATT_CCNT 0x5c /* Battery Cycle Count */ 99 /* Strings are all 8 bytes (EC_MEMMAP_TEXT_MAX) */ 100 #define EC_MEMMAP_BATT_MFGR 0x60 /* Battery Manufacturer String */ 101 #define EC_MEMMAP_BATT_MODEL 0x68 /* Battery Model Number String */ 102 #define EC_MEMMAP_BATT_SERIAL 0x70 /* Battery Serial Number String */ 103 #define EC_MEMMAP_BATT_TYPE 0x78 /* Battery Type String */ 104 #define EC_MEMMAP_ALS 0x80 /* ALS readings in lux (2 X 16 bits) */ 105 /* Unused 0x84 - 0x8f */ 106 #define EC_MEMMAP_ACC_STATUS 0x90 /* Accelerometer status (8 bits )*/ 107 /* Unused 0x91 */ 108 #define EC_MEMMAP_ACC_DATA 0x92 /* Accelerometer data 0x92 - 0x9f */ 109 #define EC_MEMMAP_GYRO_DATA 0xa0 /* Gyroscope data 0xa0 - 0xa5 */ 110 /* Unused 0xa6 - 0xfe (remember, 0xff is NOT part of the memmap region) */ 111 112 113 /* Define the format of the accelerometer mapped memory status byte. */ 114 #define EC_MEMMAP_ACC_STATUS_SAMPLE_ID_MASK 0x0f 115 #define EC_MEMMAP_ACC_STATUS_BUSY_BIT (1 << 4) 116 #define EC_MEMMAP_ACC_STATUS_PRESENCE_BIT (1 << 7) 117 118 /* Number of temp sensors at EC_MEMMAP_TEMP_SENSOR */ 119 #define EC_TEMP_SENSOR_ENTRIES 16 120 /* 121 * Number of temp sensors at EC_MEMMAP_TEMP_SENSOR_B. 122 * 123 * Valid only if EC_MEMMAP_THERMAL_VERSION returns >= 2. 124 */ 125 #define EC_TEMP_SENSOR_B_ENTRIES 8 126 127 /* Special values for mapped temperature sensors */ 128 #define EC_TEMP_SENSOR_NOT_PRESENT 0xff 129 #define EC_TEMP_SENSOR_ERROR 0xfe 130 #define EC_TEMP_SENSOR_NOT_POWERED 0xfd 131 #define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc 132 /* 133 * The offset of temperature value stored in mapped memory. This allows 134 * reporting a temperature range of 200K to 454K = -73C to 181C. 135 */ 136 #define EC_TEMP_SENSOR_OFFSET 200 137 138 /* 139 * Number of ALS readings at EC_MEMMAP_ALS 140 */ 141 #define EC_ALS_ENTRIES 2 142 143 /* 144 * The default value a temperature sensor will return when it is present but 145 * has not been read this boot. This is a reasonable number to avoid 146 * triggering alarms on the host. 147 */ 148 #define EC_TEMP_SENSOR_DEFAULT (296 - EC_TEMP_SENSOR_OFFSET) 149 150 #define EC_FAN_SPEED_ENTRIES 4 /* Number of fans at EC_MEMMAP_FAN */ 151 #define EC_FAN_SPEED_NOT_PRESENT 0xffff /* Entry not present */ 152 #define EC_FAN_SPEED_STALLED 0xfffe /* Fan stalled */ 153 154 /* Battery bit flags at EC_MEMMAP_BATT_FLAG. */ 155 #define EC_BATT_FLAG_AC_PRESENT 0x01 156 #define EC_BATT_FLAG_BATT_PRESENT 0x02 157 #define EC_BATT_FLAG_DISCHARGING 0x04 158 #define EC_BATT_FLAG_CHARGING 0x08 159 #define EC_BATT_FLAG_LEVEL_CRITICAL 0x10 160 161 /* Switch flags at EC_MEMMAP_SWITCHES */ 162 #define EC_SWITCH_LID_OPEN 0x01 163 #define EC_SWITCH_POWER_BUTTON_PRESSED 0x02 164 #define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04 165 /* Was recovery requested via keyboard; now unused. */ 166 #define EC_SWITCH_IGNORE1 0x08 167 /* Recovery requested via dedicated signal (from servo board) */ 168 #define EC_SWITCH_DEDICATED_RECOVERY 0x10 169 /* Was fake developer mode switch; now unused. Remove in next refactor. */ 170 #define EC_SWITCH_IGNORE0 0x20 171 172 /* Host command interface flags */ 173 /* Host command interface supports LPC args (LPC interface only) */ 174 #define EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED 0x01 175 /* Host command interface supports version 3 protocol */ 176 #define EC_HOST_CMD_FLAG_VERSION_3 0x02 177 178 /* Wireless switch flags */ 179 #define EC_WIRELESS_SWITCH_ALL ~0x00 /* All flags */ 180 #define EC_WIRELESS_SWITCH_WLAN 0x01 /* WLAN radio */ 181 #define EC_WIRELESS_SWITCH_BLUETOOTH 0x02 /* Bluetooth radio */ 182 #define EC_WIRELESS_SWITCH_WWAN 0x04 /* WWAN power */ 183 #define EC_WIRELESS_SWITCH_WLAN_POWER 0x08 /* WLAN power */ 184 185 /* 186 * This header file is used in coreboot both in C and ACPI code. The ACPI code 187 * is pre-processed to handle constants but the ASL compiler is unable to 188 * handle actual C code so keep it separate. 189 */ 190 #ifndef __ACPI__ 191 192 /* 193 * Define __packed if someone hasn't beat us to it. Linux kernel style 194 * checking prefers __packed over __attribute__((packed)). 195 */ 196 #ifndef __packed 197 #define __packed __attribute__((packed)) 198 #endif 199 200 /* LPC command status byte masks */ 201 /* EC has written a byte in the data register and host hasn't read it yet */ 202 #define EC_LPC_STATUS_TO_HOST 0x01 203 /* Host has written a command/data byte and the EC hasn't read it yet */ 204 #define EC_LPC_STATUS_FROM_HOST 0x02 205 /* EC is processing a command */ 206 #define EC_LPC_STATUS_PROCESSING 0x04 207 /* Last write to EC was a command, not data */ 208 #define EC_LPC_STATUS_LAST_CMD 0x08 209 /* EC is in burst mode. Unsupported by Chrome EC, so this bit is never set */ 210 #define EC_LPC_STATUS_BURST_MODE 0x10 211 /* SCI event is pending (requesting SCI query) */ 212 #define EC_LPC_STATUS_SCI_PENDING 0x20 213 /* SMI event is pending (requesting SMI query) */ 214 #define EC_LPC_STATUS_SMI_PENDING 0x40 215 /* (reserved) */ 216 #define EC_LPC_STATUS_RESERVED 0x80 217 218 /* 219 * EC is busy. This covers both the EC processing a command, and the host has 220 * written a new command but the EC hasn't picked it up yet. 221 */ 222 #define EC_LPC_STATUS_BUSY_MASK \ 223 (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING) 224 225 /* Host command response codes */ 226 enum ec_status { 227 EC_RES_SUCCESS = 0, 228 EC_RES_INVALID_COMMAND = 1, 229 EC_RES_ERROR = 2, 230 EC_RES_INVALID_PARAM = 3, 231 EC_RES_ACCESS_DENIED = 4, 232 EC_RES_INVALID_RESPONSE = 5, 233 EC_RES_INVALID_VERSION = 6, 234 EC_RES_INVALID_CHECKSUM = 7, 235 EC_RES_IN_PROGRESS = 8, /* Accepted, command in progress */ 236 EC_RES_UNAVAILABLE = 9, /* No response available */ 237 EC_RES_TIMEOUT = 10, /* We got a timeout */ 238 EC_RES_OVERFLOW = 11, /* Table / data overflow */ 239 EC_RES_INVALID_HEADER = 12, /* Header contains invalid data */ 240 EC_RES_REQUEST_TRUNCATED = 13, /* Didn't get the entire request */ 241 EC_RES_RESPONSE_TOO_BIG = 14 /* Response was too big to handle */ 242 }; 243 244 /* 245 * Host event codes. Note these are 1-based, not 0-based, because ACPI query 246 * EC command uses code 0 to mean "no event pending". We explicitly specify 247 * each value in the enum listing so they won't change if we delete/insert an 248 * item or rearrange the list (it needs to be stable across platforms, not 249 * just within a single compiled instance). 250 */ 251 enum host_event_code { 252 EC_HOST_EVENT_LID_CLOSED = 1, 253 EC_HOST_EVENT_LID_OPEN = 2, 254 EC_HOST_EVENT_POWER_BUTTON = 3, 255 EC_HOST_EVENT_AC_CONNECTED = 4, 256 EC_HOST_EVENT_AC_DISCONNECTED = 5, 257 EC_HOST_EVENT_BATTERY_LOW = 6, 258 EC_HOST_EVENT_BATTERY_CRITICAL = 7, 259 EC_HOST_EVENT_BATTERY = 8, 260 EC_HOST_EVENT_THERMAL_THRESHOLD = 9, 261 EC_HOST_EVENT_THERMAL_OVERLOAD = 10, 262 EC_HOST_EVENT_THERMAL = 11, 263 EC_HOST_EVENT_USB_CHARGER = 12, 264 EC_HOST_EVENT_KEY_PRESSED = 13, 265 /* 266 * EC has finished initializing the host interface. The host can check 267 * for this event following sending a EC_CMD_REBOOT_EC command to 268 * determine when the EC is ready to accept subsequent commands. 269 */ 270 EC_HOST_EVENT_INTERFACE_READY = 14, 271 /* Keyboard recovery combo has been pressed */ 272 EC_HOST_EVENT_KEYBOARD_RECOVERY = 15, 273 274 /* Shutdown due to thermal overload */ 275 EC_HOST_EVENT_THERMAL_SHUTDOWN = 16, 276 /* Shutdown due to battery level too low */ 277 EC_HOST_EVENT_BATTERY_SHUTDOWN = 17, 278 279 /* Suggest that the AP throttle itself */ 280 EC_HOST_EVENT_THROTTLE_START = 18, 281 /* Suggest that the AP resume normal speed */ 282 EC_HOST_EVENT_THROTTLE_STOP = 19, 283 284 /* Hang detect logic detected a hang and host event timeout expired */ 285 EC_HOST_EVENT_HANG_DETECT = 20, 286 /* Hang detect logic detected a hang and warm rebooted the AP */ 287 EC_HOST_EVENT_HANG_REBOOT = 21, 288 289 /* 290 * The high bit of the event mask is not used as a host event code. If 291 * it reads back as set, then the entire event mask should be 292 * considered invalid by the host. This can happen when reading the 293 * raw event status via EC_MEMMAP_HOST_EVENTS but the LPC interface is 294 * not initialized on the EC, or improperly configured on the host. 295 */ 296 EC_HOST_EVENT_INVALID = 32 297 }; 298 /* Host event mask */ 299 #define EC_HOST_EVENT_MASK(event_code) (1UL << ((event_code) - 1)) 300 301 /* Arguments at EC_LPC_ADDR_HOST_ARGS */ 302 struct ec_lpc_host_args { 303 uint8_t flags; 304 uint8_t command_version; 305 uint8_t data_size; 306 /* 307 * Checksum; sum of command + flags + command_version + data_size + 308 * all params/response data bytes. 309 */ 310 uint8_t checksum; 311 } __packed; 312 313 /* Flags for ec_lpc_host_args.flags */ 314 /* 315 * Args are from host. Data area at EC_LPC_ADDR_HOST_PARAM contains command 316 * params. 317 * 318 * If EC gets a command and this flag is not set, this is an old-style command. 319 * Command version is 0 and params from host are at EC_LPC_ADDR_OLD_PARAM with 320 * unknown length. EC must respond with an old-style response (that is, 321 * withouth setting EC_HOST_ARGS_FLAG_TO_HOST). 322 */ 323 #define EC_HOST_ARGS_FLAG_FROM_HOST 0x01 324 /* 325 * Args are from EC. Data area at EC_LPC_ADDR_HOST_PARAM contains response. 326 * 327 * If EC responds to a command and this flag is not set, this is an old-style 328 * response. Command version is 0 and response data from EC is at 329 * EC_LPC_ADDR_OLD_PARAM with unknown length. 330 */ 331 #define EC_HOST_ARGS_FLAG_TO_HOST 0x02 332 333 /*****************************************************************************/ 334 /* 335 * Byte codes returned by EC over SPI interface. 336 * 337 * These can be used by the AP to debug the EC interface, and to determine 338 * when the EC is not in a state where it will ever get around to responding 339 * to the AP. 340 * 341 * Example of sequence of bytes read from EC for a current good transfer: 342 * 1. - - AP asserts chip select (CS#) 343 * 2. EC_SPI_OLD_READY - AP sends first byte(s) of request 344 * 3. - - EC starts handling CS# interrupt 345 * 4. EC_SPI_RECEIVING - AP sends remaining byte(s) of request 346 * 5. EC_SPI_PROCESSING - EC starts processing request; AP is clocking in 347 * bytes looking for EC_SPI_FRAME_START 348 * 6. - - EC finishes processing and sets up response 349 * 7. EC_SPI_FRAME_START - AP reads frame byte 350 * 8. (response packet) - AP reads response packet 351 * 9. EC_SPI_PAST_END - Any additional bytes read by AP 352 * 10 - - AP deasserts chip select 353 * 11 - - EC processes CS# interrupt and sets up DMA for 354 * next request 355 * 356 * If the AP is waiting for EC_SPI_FRAME_START and sees any value other than 357 * the following byte values: 358 * EC_SPI_OLD_READY 359 * EC_SPI_RX_READY 360 * EC_SPI_RECEIVING 361 * EC_SPI_PROCESSING 362 * 363 * Then the EC found an error in the request, or was not ready for the request 364 * and lost data. The AP should give up waiting for EC_SPI_FRAME_START, 365 * because the EC is unable to tell when the AP is done sending its request. 366 */ 367 368 /* 369 * Framing byte which precedes a response packet from the EC. After sending a 370 * request, the AP will clock in bytes until it sees the framing byte, then 371 * clock in the response packet. 372 */ 373 #define EC_SPI_FRAME_START 0xec 374 375 /* 376 * Padding bytes which are clocked out after the end of a response packet. 377 */ 378 #define EC_SPI_PAST_END 0xed 379 380 /* 381 * EC is ready to receive, and has ignored the byte sent by the AP. EC expects 382 * that the AP will send a valid packet header (starting with 383 * EC_COMMAND_PROTOCOL_3) in the next 32 bytes. 384 */ 385 #define EC_SPI_RX_READY 0xf8 386 387 /* 388 * EC has started receiving the request from the AP, but hasn't started 389 * processing it yet. 390 */ 391 #define EC_SPI_RECEIVING 0xf9 392 393 /* EC has received the entire request from the AP and is processing it. */ 394 #define EC_SPI_PROCESSING 0xfa 395 396 /* 397 * EC received bad data from the AP, such as a packet header with an invalid 398 * length. EC will ignore all data until chip select deasserts. 399 */ 400 #define EC_SPI_RX_BAD_DATA 0xfb 401 402 /* 403 * EC received data from the AP before it was ready. That is, the AP asserted 404 * chip select and started clocking data before the EC was ready to receive it. 405 * EC will ignore all data until chip select deasserts. 406 */ 407 #define EC_SPI_NOT_READY 0xfc 408 409 /* 410 * EC was ready to receive a request from the AP. EC has treated the byte sent 411 * by the AP as part of a request packet, or (for old-style ECs) is processing 412 * a fully received packet but is not ready to respond yet. 413 */ 414 #define EC_SPI_OLD_READY 0xfd 415 416 /*****************************************************************************/ 417 418 /* 419 * Protocol version 2 for I2C and SPI send a request this way: 420 * 421 * 0 EC_CMD_VERSION0 + (command version) 422 * 1 Command number 423 * 2 Length of params = N 424 * 3..N+2 Params, if any 425 * N+3 8-bit checksum of bytes 0..N+2 426 * 427 * The corresponding response is: 428 * 429 * 0 Result code (EC_RES_*) 430 * 1 Length of params = M 431 * 2..M+1 Params, if any 432 * M+2 8-bit checksum of bytes 0..M+1 433 */ 434 #define EC_PROTO2_REQUEST_HEADER_BYTES 3 435 #define EC_PROTO2_REQUEST_TRAILER_BYTES 1 436 #define EC_PROTO2_REQUEST_OVERHEAD (EC_PROTO2_REQUEST_HEADER_BYTES + \ 437 EC_PROTO2_REQUEST_TRAILER_BYTES) 438 439 #define EC_PROTO2_RESPONSE_HEADER_BYTES 2 440 #define EC_PROTO2_RESPONSE_TRAILER_BYTES 1 441 #define EC_PROTO2_RESPONSE_OVERHEAD (EC_PROTO2_RESPONSE_HEADER_BYTES + \ 442 EC_PROTO2_RESPONSE_TRAILER_BYTES) 443 444 /* Parameter length was limited by the LPC interface */ 445 #define EC_PROTO2_MAX_PARAM_SIZE 0xfc 446 447 /* Maximum request and response packet sizes for protocol version 2 */ 448 #define EC_PROTO2_MAX_REQUEST_SIZE (EC_PROTO2_REQUEST_OVERHEAD + \ 449 EC_PROTO2_MAX_PARAM_SIZE) 450 #define EC_PROTO2_MAX_RESPONSE_SIZE (EC_PROTO2_RESPONSE_OVERHEAD + \ 451 EC_PROTO2_MAX_PARAM_SIZE) 452 453 /*****************************************************************************/ 454 455 /* 456 * Value written to legacy command port / prefix byte to indicate protocol 457 * 3+ structs are being used. Usage is bus-dependent. 458 */ 459 #define EC_COMMAND_PROTOCOL_3 0xda 460 461 #define EC_HOST_REQUEST_VERSION 3 462 463 /* Version 3 request from host */ 464 struct ec_host_request { 465 /* Struct version (=3) 466 * 467 * EC will return EC_RES_INVALID_HEADER if it receives a header with a 468 * version it doesn't know how to parse. 469 */ 470 uint8_t struct_version; 471 472 /* 473 * Checksum of request and data; sum of all bytes including checksum 474 * should total to 0. 475 */ 476 uint8_t checksum; 477 478 /* Command code */ 479 uint16_t command; 480 481 /* Command version */ 482 uint8_t command_version; 483 484 /* Unused byte in current protocol version; set to 0 */ 485 uint8_t reserved; 486 487 /* Length of data which follows this header */ 488 uint16_t data_len; 489 } __packed; 490 491 #define EC_HOST_RESPONSE_VERSION 3 492 493 /* Version 3 response from EC */ 494 struct ec_host_response { 495 /* Struct version (=3) */ 496 uint8_t struct_version; 497 498 /* 499 * Checksum of response and data; sum of all bytes including checksum 500 * should total to 0. 501 */ 502 uint8_t checksum; 503 504 /* Result code (EC_RES_*) */ 505 uint16_t result; 506 507 /* Length of data which follows this header */ 508 uint16_t data_len; 509 510 /* Unused bytes in current protocol version; set to 0 */ 511 uint16_t reserved; 512 } __packed; 513 514 /*****************************************************************************/ 515 /* 516 * Notes on commands: 517 * 518 * Each command is an 8-byte command value. Commands which take params or 519 * return response data specify structs for that data. If no struct is 520 * specified, the command does not input or output data, respectively. 521 * Parameter/response length is implicit in the structs. Some underlying 522 * communication protocols (I2C, SPI) may add length or checksum headers, but 523 * those are implementation-dependent and not defined here. 524 */ 525 526 /*****************************************************************************/ 527 /* General / test commands */ 528 529 /* 530 * Get protocol version, used to deal with non-backward compatible protocol 531 * changes. 532 */ 533 #define EC_CMD_PROTO_VERSION 0x00 534 535 struct ec_response_proto_version { 536 uint32_t version; 537 } __packed; 538 539 /* 540 * Hello. This is a simple command to test the EC is responsive to 541 * commands. 542 */ 543 #define EC_CMD_HELLO 0x01 544 545 struct ec_params_hello { 546 uint32_t in_data; /* Pass anything here */ 547 } __packed; 548 549 struct ec_response_hello { 550 uint32_t out_data; /* Output will be in_data + 0x01020304 */ 551 } __packed; 552 553 /* Get version number */ 554 #define EC_CMD_GET_VERSION 0x02 555 556 enum ec_current_image { 557 EC_IMAGE_UNKNOWN = 0, 558 EC_IMAGE_RO, 559 EC_IMAGE_RW 560 }; 561 562 struct ec_response_get_version { 563 /* Null-terminated version strings for RO, RW */ 564 char version_string_ro[32]; 565 char version_string_rw[32]; 566 char reserved[32]; /* Was previously RW-B string */ 567 uint32_t current_image; /* One of ec_current_image */ 568 } __packed; 569 570 /* Read test */ 571 #define EC_CMD_READ_TEST 0x03 572 573 struct ec_params_read_test { 574 uint32_t offset; /* Starting value for read buffer */ 575 uint32_t size; /* Size to read in bytes */ 576 } __packed; 577 578 struct ec_response_read_test { 579 uint32_t data[32]; 580 } __packed; 581 582 /* 583 * Get build information 584 * 585 * Response is null-terminated string. 586 */ 587 #define EC_CMD_GET_BUILD_INFO 0x04 588 589 /* Get chip info */ 590 #define EC_CMD_GET_CHIP_INFO 0x05 591 592 struct ec_response_get_chip_info { 593 /* Null-terminated strings */ 594 char vendor[32]; 595 char name[32]; 596 char revision[32]; /* Mask version */ 597 } __packed; 598 599 /* Get board HW version */ 600 #define EC_CMD_GET_BOARD_VERSION 0x06 601 602 struct ec_response_board_version { 603 uint16_t board_version; /* A monotonously incrementing number. */ 604 } __packed; 605 606 /* 607 * Read memory-mapped data. 608 * 609 * This is an alternate interface to memory-mapped data for bus protocols 610 * which don't support direct-mapped memory - I2C, SPI, etc. 611 * 612 * Response is params.size bytes of data. 613 */ 614 #define EC_CMD_READ_MEMMAP 0x07 615 616 struct ec_params_read_memmap { 617 uint8_t offset; /* Offset in memmap (EC_MEMMAP_*) */ 618 uint8_t size; /* Size to read in bytes */ 619 } __packed; 620 621 /* Read versions supported for a command */ 622 #define EC_CMD_GET_CMD_VERSIONS 0x08 623 624 struct ec_params_get_cmd_versions { 625 uint8_t cmd; /* Command to check */ 626 } __packed; 627 628 struct ec_response_get_cmd_versions { 629 /* 630 * Mask of supported versions; use EC_VER_MASK() to compare with a 631 * desired version. 632 */ 633 uint32_t version_mask; 634 } __packed; 635 636 /* 637 * Check EC communcations status (busy). This is needed on i2c/spi but not 638 * on lpc since it has its own out-of-band busy indicator. 639 * 640 * lpc must read the status from the command register. Attempting this on 641 * lpc will overwrite the args/parameter space and corrupt its data. 642 */ 643 #define EC_CMD_GET_COMMS_STATUS 0x09 644 645 /* Avoid using ec_status which is for return values */ 646 enum ec_comms_status { 647 EC_COMMS_STATUS_PROCESSING = 1 << 0, /* Processing cmd */ 648 }; 649 650 struct ec_response_get_comms_status { 651 uint32_t flags; /* Mask of enum ec_comms_status */ 652 } __packed; 653 654 /* Fake a variety of responses, purely for testing purposes. */ 655 #define EC_CMD_TEST_PROTOCOL 0x0a 656 657 /* Tell the EC what to send back to us. */ 658 struct ec_params_test_protocol { 659 uint32_t ec_result; 660 uint32_t ret_len; 661 uint8_t buf[32]; 662 } __packed; 663 664 /* Here it comes... */ 665 struct ec_response_test_protocol { 666 uint8_t buf[32]; 667 } __packed; 668 669 /* Get prococol information */ 670 #define EC_CMD_GET_PROTOCOL_INFO 0x0b 671 672 /* Flags for ec_response_get_protocol_info.flags */ 673 /* EC_RES_IN_PROGRESS may be returned if a command is slow */ 674 #define EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED (1 << 0) 675 676 struct ec_response_get_protocol_info { 677 /* Fields which exist if at least protocol version 3 supported */ 678 679 /* Bitmask of protocol versions supported (1 << n means version n)*/ 680 uint32_t protocol_versions; 681 682 /* Maximum request packet size, in bytes */ 683 uint16_t max_request_packet_size; 684 685 /* Maximum response packet size, in bytes */ 686 uint16_t max_response_packet_size; 687 688 /* Flags; see EC_PROTOCOL_INFO_* */ 689 uint32_t flags; 690 } __packed; 691 692 693 /*****************************************************************************/ 694 /* Get/Set miscellaneous values */ 695 696 /* The upper byte of .flags tells what to do (nothing means "get") */ 697 #define EC_GSV_SET 0x80000000 698 699 /* The lower three bytes of .flags identifies the parameter, if that has 700 meaning for an individual command. */ 701 #define EC_GSV_PARAM_MASK 0x00ffffff 702 703 struct ec_params_get_set_value { 704 uint32_t flags; 705 uint32_t value; 706 } __packed; 707 708 struct ec_response_get_set_value { 709 uint32_t flags; 710 uint32_t value; 711 } __packed; 712 713 /* More than one command can use these structs to get/set paramters. */ 714 #define EC_CMD_GSV_PAUSE_IN_S5 0x0c 715 716 717 /*****************************************************************************/ 718 /* Flash commands */ 719 720 /* Get flash info */ 721 #define EC_CMD_FLASH_INFO 0x10 722 723 /* Version 0 returns these fields */ 724 struct ec_response_flash_info { 725 /* Usable flash size, in bytes */ 726 uint32_t flash_size; 727 /* 728 * Write block size. Write offset and size must be a multiple 729 * of this. 730 */ 731 uint32_t write_block_size; 732 /* 733 * Erase block size. Erase offset and size must be a multiple 734 * of this. 735 */ 736 uint32_t erase_block_size; 737 /* 738 * Protection block size. Protection offset and size must be a 739 * multiple of this. 740 */ 741 uint32_t protect_block_size; 742 } __packed; 743 744 /* Flags for version 1+ flash info command */ 745 /* EC flash erases bits to 0 instead of 1 */ 746 #define EC_FLASH_INFO_ERASE_TO_0 (1 << 0) 747 748 /* 749 * Version 1 returns the same initial fields as version 0, with additional 750 * fields following. 751 * 752 * gcc anonymous structs don't seem to get along with the __packed directive; 753 * if they did we'd define the version 0 struct as a sub-struct of this one. 754 */ 755 struct ec_response_flash_info_1 { 756 /* Version 0 fields; see above for description */ 757 uint32_t flash_size; 758 uint32_t write_block_size; 759 uint32_t erase_block_size; 760 uint32_t protect_block_size; 761 762 /* Version 1 adds these fields: */ 763 /* 764 * Ideal write size in bytes. Writes will be fastest if size is 765 * exactly this and offset is a multiple of this. For example, an EC 766 * may have a write buffer which can do half-page operations if data is 767 * aligned, and a slower word-at-a-time write mode. 768 */ 769 uint32_t write_ideal_size; 770 771 /* Flags; see EC_FLASH_INFO_* */ 772 uint32_t flags; 773 } __packed; 774 775 /* 776 * Read flash 777 * 778 * Response is params.size bytes of data. 779 */ 780 #define EC_CMD_FLASH_READ 0x11 781 782 struct ec_params_flash_read { 783 uint32_t offset; /* Byte offset to read */ 784 uint32_t size; /* Size to read in bytes */ 785 } __packed; 786 787 /* Write flash */ 788 #define EC_CMD_FLASH_WRITE 0x12 789 #define EC_VER_FLASH_WRITE 1 790 791 /* Version 0 of the flash command supported only 64 bytes of data */ 792 #define EC_FLASH_WRITE_VER0_SIZE 64 793 794 struct ec_params_flash_write { 795 uint32_t offset; /* Byte offset to write */ 796 uint32_t size; /* Size to write in bytes */ 797 /* Followed by data to write */ 798 } __packed; 799 800 /* Erase flash */ 801 #define EC_CMD_FLASH_ERASE 0x13 802 803 struct ec_params_flash_erase { 804 uint32_t offset; /* Byte offset to erase */ 805 uint32_t size; /* Size to erase in bytes */ 806 } __packed; 807 808 /* 809 * Get/set flash protection. 810 * 811 * If mask!=0, sets/clear the requested bits of flags. Depending on the 812 * firmware write protect GPIO, not all flags will take effect immediately; 813 * some flags require a subsequent hard reset to take effect. Check the 814 * returned flags bits to see what actually happened. 815 * 816 * If mask=0, simply returns the current flags state. 817 */ 818 #define EC_CMD_FLASH_PROTECT 0x15 819 #define EC_VER_FLASH_PROTECT 1 /* Command version 1 */ 820 821 /* Flags for flash protection */ 822 /* RO flash code protected when the EC boots */ 823 #define EC_FLASH_PROTECT_RO_AT_BOOT (1 << 0) 824 /* 825 * RO flash code protected now. If this bit is set, at-boot status cannot 826 * be changed. 827 */ 828 #define EC_FLASH_PROTECT_RO_NOW (1 << 1) 829 /* Entire flash code protected now, until reboot. */ 830 #define EC_FLASH_PROTECT_ALL_NOW (1 << 2) 831 /* Flash write protect GPIO is asserted now */ 832 #define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3) 833 /* Error - at least one bank of flash is stuck locked, and cannot be unlocked */ 834 #define EC_FLASH_PROTECT_ERROR_STUCK (1 << 4) 835 /* 836 * Error - flash protection is in inconsistent state. At least one bank of 837 * flash which should be protected is not protected. Usually fixed by 838 * re-requesting the desired flags, or by a hard reset if that fails. 839 */ 840 #define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5) 841 /* Entile flash code protected when the EC boots */ 842 #define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6) 843 844 struct ec_params_flash_protect { 845 uint32_t mask; /* Bits in flags to apply */ 846 uint32_t flags; /* New flags to apply */ 847 } __packed; 848 849 struct ec_response_flash_protect { 850 /* Current value of flash protect flags */ 851 uint32_t flags; 852 /* 853 * Flags which are valid on this platform. This allows the caller 854 * to distinguish between flags which aren't set vs. flags which can't 855 * be set on this platform. 856 */ 857 uint32_t valid_flags; 858 /* Flags which can be changed given the current protection state */ 859 uint32_t writable_flags; 860 } __packed; 861 862 /* 863 * Note: commands 0x14 - 0x19 version 0 were old commands to get/set flash 864 * write protect. These commands may be reused with version > 0. 865 */ 866 867 /* Get the region offset/size */ 868 #define EC_CMD_FLASH_REGION_INFO 0x16 869 #define EC_VER_FLASH_REGION_INFO 1 870 871 enum ec_flash_region { 872 /* Region which holds read-only EC image */ 873 EC_FLASH_REGION_RO = 0, 874 /* Region which holds rewritable EC image */ 875 EC_FLASH_REGION_RW, 876 /* 877 * Region which should be write-protected in the factory (a superset of 878 * EC_FLASH_REGION_RO) 879 */ 880 EC_FLASH_REGION_WP_RO, 881 /* Number of regions */ 882 EC_FLASH_REGION_COUNT, 883 }; 884 885 struct ec_params_flash_region_info { 886 uint32_t region; /* enum ec_flash_region */ 887 } __packed; 888 889 struct ec_response_flash_region_info { 890 uint32_t offset; 891 uint32_t size; 892 } __packed; 893 894 /* Read/write VbNvContext */ 895 #define EC_CMD_VBNV_CONTEXT 0x17 896 #define EC_VER_VBNV_CONTEXT 1 897 #define EC_VBNV_BLOCK_SIZE 16 898 899 enum ec_vbnvcontext_op { 900 EC_VBNV_CONTEXT_OP_READ, 901 EC_VBNV_CONTEXT_OP_WRITE, 902 }; 903 904 struct ec_params_vbnvcontext { 905 uint32_t op; 906 uint8_t block[EC_VBNV_BLOCK_SIZE]; 907 } __packed; 908 909 struct ec_response_vbnvcontext { 910 uint8_t block[EC_VBNV_BLOCK_SIZE]; 911 } __packed; 912 913 /*****************************************************************************/ 914 /* PWM commands */ 915 916 /* Get fan target RPM */ 917 #define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x20 918 919 struct ec_response_pwm_get_fan_rpm { 920 uint32_t rpm; 921 } __packed; 922 923 /* Set target fan RPM */ 924 #define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x21 925 926 struct ec_params_pwm_set_fan_target_rpm { 927 uint32_t rpm; 928 } __packed; 929 930 /* Get keyboard backlight */ 931 #define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x22 932 933 struct ec_response_pwm_get_keyboard_backlight { 934 uint8_t percent; 935 uint8_t enabled; 936 } __packed; 937 938 /* Set keyboard backlight */ 939 #define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x23 940 941 struct ec_params_pwm_set_keyboard_backlight { 942 uint8_t percent; 943 } __packed; 944 945 /* Set target fan PWM duty cycle */ 946 #define EC_CMD_PWM_SET_FAN_DUTY 0x24 947 948 struct ec_params_pwm_set_fan_duty { 949 uint32_t percent; 950 } __packed; 951 952 /*****************************************************************************/ 953 /* 954 * Lightbar commands. This looks worse than it is. Since we only use one HOST 955 * command to say "talk to the lightbar", we put the "and tell it to do X" part 956 * into a subcommand. We'll make separate structs for subcommands with 957 * different input args, so that we know how much to expect. 958 */ 959 #define EC_CMD_LIGHTBAR_CMD 0x28 960 961 struct rgb_s { 962 uint8_t r, g, b; 963 }; 964 965 #define LB_BATTERY_LEVELS 4 966 /* List of tweakable parameters. NOTE: It's __packed so it can be sent in a 967 * host command, but the alignment is the same regardless. Keep it that way. 968 */ 969 struct lightbar_params { 970 /* Timing */ 971 int32_t google_ramp_up; 972 int32_t google_ramp_down; 973 int32_t s3s0_ramp_up; 974 int32_t s0_tick_delay[2]; /* AC=0/1 */ 975 int32_t s0a_tick_delay[2]; /* AC=0/1 */ 976 int32_t s0s3_ramp_down; 977 int32_t s3_sleep_for; 978 int32_t s3_ramp_up; 979 int32_t s3_ramp_down; 980 981 /* Oscillation */ 982 uint8_t new_s0; 983 uint8_t osc_min[2]; /* AC=0/1 */ 984 uint8_t osc_max[2]; /* AC=0/1 */ 985 uint8_t w_ofs[2]; /* AC=0/1 */ 986 987 /* Brightness limits based on the backlight and AC. */ 988 uint8_t bright_bl_off_fixed[2]; /* AC=0/1 */ 989 uint8_t bright_bl_on_min[2]; /* AC=0/1 */ 990 uint8_t bright_bl_on_max[2]; /* AC=0/1 */ 991 992 /* Battery level thresholds */ 993 uint8_t battery_threshold[LB_BATTERY_LEVELS - 1]; 994 995 /* Map [AC][battery_level] to color index */ 996 uint8_t s0_idx[2][LB_BATTERY_LEVELS]; /* AP is running */ 997 uint8_t s3_idx[2][LB_BATTERY_LEVELS]; /* AP is sleeping */ 998 999 /* Color palette */ 1000 struct rgb_s color[8]; /* 0-3 are Google colors */ 1001 } __packed; 1002 1003 struct ec_params_lightbar { 1004 uint8_t cmd; /* Command (see enum lightbar_command) */ 1005 union { 1006 struct { 1007 /* no args */ 1008 } dump, off, on, init, get_seq, get_params, version; 1009 1010 struct num { 1011 uint8_t num; 1012 } brightness, seq, demo; 1013 1014 struct reg { 1015 uint8_t ctrl, reg, value; 1016 } reg; 1017 1018 struct rgb { 1019 uint8_t led, red, green, blue; 1020 } rgb; 1021 1022 struct lightbar_params set_params; 1023 }; 1024 } __packed; 1025 1026 struct ec_response_lightbar { 1027 union { 1028 struct dump { 1029 struct { 1030 uint8_t reg; 1031 uint8_t ic0; 1032 uint8_t ic1; 1033 } vals[23]; 1034 } dump; 1035 1036 struct get_seq { 1037 uint8_t num; 1038 } get_seq; 1039 1040 struct lightbar_params get_params; 1041 1042 struct version { 1043 uint32_t num; 1044 uint32_t flags; 1045 } version; 1046 1047 struct { 1048 /* no return params */ 1049 } off, on, init, brightness, seq, reg, rgb, demo, set_params; 1050 }; 1051 } __packed; 1052 1053 /* Lightbar commands */ 1054 enum lightbar_command { 1055 LIGHTBAR_CMD_DUMP = 0, 1056 LIGHTBAR_CMD_OFF = 1, 1057 LIGHTBAR_CMD_ON = 2, 1058 LIGHTBAR_CMD_INIT = 3, 1059 LIGHTBAR_CMD_BRIGHTNESS = 4, 1060 LIGHTBAR_CMD_SEQ = 5, 1061 LIGHTBAR_CMD_REG = 6, 1062 LIGHTBAR_CMD_RGB = 7, 1063 LIGHTBAR_CMD_GET_SEQ = 8, 1064 LIGHTBAR_CMD_DEMO = 9, 1065 LIGHTBAR_CMD_GET_PARAMS = 10, 1066 LIGHTBAR_CMD_SET_PARAMS = 11, 1067 LIGHTBAR_CMD_VERSION = 12, 1068 LIGHTBAR_NUM_CMDS 1069 }; 1070 1071 /*****************************************************************************/ 1072 /* LED control commands */ 1073 1074 #define EC_CMD_LED_CONTROL 0x29 1075 1076 enum ec_led_id { 1077 /* LED to indicate battery state of charge */ 1078 EC_LED_ID_BATTERY_LED = 0, 1079 /* 1080 * LED to indicate system power state (on or in suspend). 1081 * May be on power button or on C-panel. 1082 */ 1083 EC_LED_ID_POWER_LED, 1084 /* LED on power adapter or its plug */ 1085 EC_LED_ID_ADAPTER_LED, 1086 1087 EC_LED_ID_COUNT 1088 }; 1089 1090 /* LED control flags */ 1091 #define EC_LED_FLAGS_QUERY (1 << 0) /* Query LED capability only */ 1092 #define EC_LED_FLAGS_AUTO (1 << 1) /* Switch LED back to automatic control */ 1093 1094 enum ec_led_colors { 1095 EC_LED_COLOR_RED = 0, 1096 EC_LED_COLOR_GREEN, 1097 EC_LED_COLOR_BLUE, 1098 EC_LED_COLOR_YELLOW, 1099 EC_LED_COLOR_WHITE, 1100 1101 EC_LED_COLOR_COUNT 1102 }; 1103 1104 struct ec_params_led_control { 1105 uint8_t led_id; /* Which LED to control */ 1106 uint8_t flags; /* Control flags */ 1107 1108 uint8_t brightness[EC_LED_COLOR_COUNT]; 1109 } __packed; 1110 1111 struct ec_response_led_control { 1112 /* 1113 * Available brightness value range. 1114 * 1115 * Range 0 means color channel not present. 1116 * Range 1 means on/off control. 1117 * Other values means the LED is control by PWM. 1118 */ 1119 uint8_t brightness_range[EC_LED_COLOR_COUNT]; 1120 } __packed; 1121 1122 /*****************************************************************************/ 1123 /* Verified boot commands */ 1124 1125 /* 1126 * Note: command code 0x29 version 0 was VBOOT_CMD in Link EVT; it may be 1127 * reused for other purposes with version > 0. 1128 */ 1129 1130 /* Verified boot hash command */ 1131 #define EC_CMD_VBOOT_HASH 0x2A 1132 1133 struct ec_params_vboot_hash { 1134 uint8_t cmd; /* enum ec_vboot_hash_cmd */ 1135 uint8_t hash_type; /* enum ec_vboot_hash_type */ 1136 uint8_t nonce_size; /* Nonce size; may be 0 */ 1137 uint8_t reserved0; /* Reserved; set 0 */ 1138 uint32_t offset; /* Offset in flash to hash */ 1139 uint32_t size; /* Number of bytes to hash */ 1140 uint8_t nonce_data[64]; /* Nonce data; ignored if nonce_size=0 */ 1141 } __packed; 1142 1143 struct ec_response_vboot_hash { 1144 uint8_t status; /* enum ec_vboot_hash_status */ 1145 uint8_t hash_type; /* enum ec_vboot_hash_type */ 1146 uint8_t digest_size; /* Size of hash digest in bytes */ 1147 uint8_t reserved0; /* Ignore; will be 0 */ 1148 uint32_t offset; /* Offset in flash which was hashed */ 1149 uint32_t size; /* Number of bytes hashed */ 1150 uint8_t hash_digest[64]; /* Hash digest data */ 1151 } __packed; 1152 1153 enum ec_vboot_hash_cmd { 1154 EC_VBOOT_HASH_GET = 0, /* Get current hash status */ 1155 EC_VBOOT_HASH_ABORT = 1, /* Abort calculating current hash */ 1156 EC_VBOOT_HASH_START = 2, /* Start computing a new hash */ 1157 EC_VBOOT_HASH_RECALC = 3, /* Synchronously compute a new hash */ 1158 }; 1159 1160 enum ec_vboot_hash_type { 1161 EC_VBOOT_HASH_TYPE_SHA256 = 0, /* SHA-256 */ 1162 }; 1163 1164 enum ec_vboot_hash_status { 1165 EC_VBOOT_HASH_STATUS_NONE = 0, /* No hash (not started, or aborted) */ 1166 EC_VBOOT_HASH_STATUS_DONE = 1, /* Finished computing a hash */ 1167 EC_VBOOT_HASH_STATUS_BUSY = 2, /* Busy computing a hash */ 1168 }; 1169 1170 /* 1171 * Special values for offset for EC_VBOOT_HASH_START and EC_VBOOT_HASH_RECALC. 1172 * If one of these is specified, the EC will automatically update offset and 1173 * size to the correct values for the specified image (RO or RW). 1174 */ 1175 #define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe 1176 #define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd 1177 1178 /*****************************************************************************/ 1179 /* 1180 * Motion sense commands. We'll make separate structs for sub-commands with 1181 * different input args, so that we know how much to expect. 1182 */ 1183 #define EC_CMD_MOTION_SENSE_CMD 0x2B 1184 1185 /* Motion sense commands */ 1186 enum motionsense_command { 1187 /* 1188 * Dump command returns all motion sensor data including motion sense 1189 * module flags and individual sensor flags. 1190 */ 1191 MOTIONSENSE_CMD_DUMP = 0, 1192 1193 /* 1194 * Info command returns data describing the details of a given sensor, 1195 * including enum motionsensor_type, enum motionsensor_location, and 1196 * enum motionsensor_chip. 1197 */ 1198 MOTIONSENSE_CMD_INFO = 1, 1199 1200 /* 1201 * EC Rate command is a setter/getter command for the EC sampling rate 1202 * of all motion sensors in milliseconds. 1203 */ 1204 MOTIONSENSE_CMD_EC_RATE = 2, 1205 1206 /* 1207 * Sensor ODR command is a setter/getter command for the output data 1208 * rate of a specific motion sensor in millihertz. 1209 */ 1210 MOTIONSENSE_CMD_SENSOR_ODR = 3, 1211 1212 /* 1213 * Sensor range command is a setter/getter command for the range of 1214 * a specified motion sensor in +/-G's or +/- deg/s. 1215 */ 1216 MOTIONSENSE_CMD_SENSOR_RANGE = 4, 1217 1218 /* 1219 * Setter/getter command for the keyboard wake angle. When the lid 1220 * angle is greater than this value, keyboard wake is disabled in S3, 1221 * and when the lid angle goes less than this value, keyboard wake is 1222 * enabled. Note, the lid angle measurement is an approximate, 1223 * un-calibrated value, hence the wake angle isn't exact. 1224 */ 1225 MOTIONSENSE_CMD_KB_WAKE_ANGLE = 5, 1226 1227 /* Number of motionsense sub-commands. */ 1228 MOTIONSENSE_NUM_CMDS 1229 }; 1230 1231 enum motionsensor_id { 1232 EC_MOTION_SENSOR_ACCEL_BASE = 0, 1233 EC_MOTION_SENSOR_ACCEL_LID = 1, 1234 EC_MOTION_SENSOR_GYRO = 2, 1235 1236 /* 1237 * Note, if more sensors are added and this count changes, the padding 1238 * in ec_response_motion_sense dump command must be modified. 1239 */ 1240 EC_MOTION_SENSOR_COUNT = 3 1241 }; 1242 1243 /* List of motion sensor types. */ 1244 enum motionsensor_type { 1245 MOTIONSENSE_TYPE_ACCEL = 0, 1246 MOTIONSENSE_TYPE_GYRO = 1, 1247 }; 1248 1249 /* List of motion sensor locations. */ 1250 enum motionsensor_location { 1251 MOTIONSENSE_LOC_BASE = 0, 1252 MOTIONSENSE_LOC_LID = 1, 1253 }; 1254 1255 /* List of motion sensor chips. */ 1256 enum motionsensor_chip { 1257 MOTIONSENSE_CHIP_KXCJ9 = 0, 1258 }; 1259 1260 /* Module flag masks used for the dump sub-command. */ 1261 #define MOTIONSENSE_MODULE_FLAG_ACTIVE (1<<0) 1262 1263 /* Sensor flag masks used for the dump sub-command. */ 1264 #define MOTIONSENSE_SENSOR_FLAG_PRESENT (1<<0) 1265 1266 /* 1267 * Send this value for the data element to only perform a read. If you 1268 * send any other value, the EC will interpret it as data to set and will 1269 * return the actual value set. 1270 */ 1271 #define EC_MOTION_SENSE_NO_VALUE -1 1272 1273 struct ec_params_motion_sense { 1274 uint8_t cmd; 1275 union { 1276 /* Used for MOTIONSENSE_CMD_DUMP. */ 1277 struct { 1278 /* no args */ 1279 } dump; 1280 1281 /* 1282 * Used for MOTIONSENSE_CMD_EC_RATE and 1283 * MOTIONSENSE_CMD_KB_WAKE_ANGLE. 1284 */ 1285 struct { 1286 /* Data to set or EC_MOTION_SENSE_NO_VALUE to read. */ 1287 int16_t data; 1288 } ec_rate, kb_wake_angle; 1289 1290 /* Used for MOTIONSENSE_CMD_INFO. */ 1291 struct { 1292 /* Should be element of enum motionsensor_id. */ 1293 uint8_t sensor_num; 1294 } info; 1295 1296 /* 1297 * Used for MOTIONSENSE_CMD_SENSOR_ODR and 1298 * MOTIONSENSE_CMD_SENSOR_RANGE. 1299 */ 1300 struct { 1301 /* Should be element of enum motionsensor_id. */ 1302 uint8_t sensor_num; 1303 1304 /* Rounding flag, true for round-up, false for down. */ 1305 uint8_t roundup; 1306 1307 uint16_t reserved; 1308 1309 /* Data to set or EC_MOTION_SENSE_NO_VALUE to read. */ 1310 int32_t data; 1311 } sensor_odr, sensor_range; 1312 }; 1313 } __packed; 1314 1315 struct ec_response_motion_sense { 1316 union { 1317 /* Used for MOTIONSENSE_CMD_DUMP. */ 1318 struct { 1319 /* Flags representing the motion sensor module. */ 1320 uint8_t module_flags; 1321 1322 /* Flags for each sensor in enum motionsensor_id. */ 1323 uint8_t sensor_flags[EC_MOTION_SENSOR_COUNT]; 1324 1325 /* Array of all sensor data. Each sensor is 3-axis. */ 1326 int16_t data[3*EC_MOTION_SENSOR_COUNT]; 1327 } dump; 1328 1329 /* Used for MOTIONSENSE_CMD_INFO. */ 1330 struct { 1331 /* Should be element of enum motionsensor_type. */ 1332 uint8_t type; 1333 1334 /* Should be element of enum motionsensor_location. */ 1335 uint8_t location; 1336 1337 /* Should be element of enum motionsensor_chip. */ 1338 uint8_t chip; 1339 } info; 1340 1341 /* 1342 * Used for MOTIONSENSE_CMD_EC_RATE, MOTIONSENSE_CMD_SENSOR_ODR, 1343 * MOTIONSENSE_CMD_SENSOR_RANGE, and 1344 * MOTIONSENSE_CMD_KB_WAKE_ANGLE. 1345 */ 1346 struct { 1347 /* Current value of the parameter queried. */ 1348 int32_t ret; 1349 } ec_rate, sensor_odr, sensor_range, kb_wake_angle; 1350 }; 1351 } __packed; 1352 1353 /*****************************************************************************/ 1354 /* USB charging control commands */ 1355 1356 /* Set USB port charging mode */ 1357 #define EC_CMD_USB_CHARGE_SET_MODE 0x30 1358 1359 struct ec_params_usb_charge_set_mode { 1360 uint8_t usb_port_id; 1361 uint8_t mode; 1362 } __packed; 1363 1364 /*****************************************************************************/ 1365 /* Persistent storage for host */ 1366 1367 /* Maximum bytes that can be read/written in a single command */ 1368 #define EC_PSTORE_SIZE_MAX 64 1369 1370 /* Get persistent storage info */ 1371 #define EC_CMD_PSTORE_INFO 0x40 1372 1373 struct ec_response_pstore_info { 1374 /* Persistent storage size, in bytes */ 1375 uint32_t pstore_size; 1376 /* Access size; read/write offset and size must be a multiple of this */ 1377 uint32_t access_size; 1378 } __packed; 1379 1380 /* 1381 * Read persistent storage 1382 * 1383 * Response is params.size bytes of data. 1384 */ 1385 #define EC_CMD_PSTORE_READ 0x41 1386 1387 struct ec_params_pstore_read { 1388 uint32_t offset; /* Byte offset to read */ 1389 uint32_t size; /* Size to read in bytes */ 1390 } __packed; 1391 1392 /* Write persistent storage */ 1393 #define EC_CMD_PSTORE_WRITE 0x42 1394 1395 struct ec_params_pstore_write { 1396 uint32_t offset; /* Byte offset to write */ 1397 uint32_t size; /* Size to write in bytes */ 1398 uint8_t data[EC_PSTORE_SIZE_MAX]; 1399 } __packed; 1400 1401 /*****************************************************************************/ 1402 /* Real-time clock */ 1403 1404 /* RTC params and response structures */ 1405 struct ec_params_rtc { 1406 uint32_t time; 1407 } __packed; 1408 1409 struct ec_response_rtc { 1410 uint32_t time; 1411 } __packed; 1412 1413 /* These use ec_response_rtc */ 1414 #define EC_CMD_RTC_GET_VALUE 0x44 1415 #define EC_CMD_RTC_GET_ALARM 0x45 1416 1417 /* These all use ec_params_rtc */ 1418 #define EC_CMD_RTC_SET_VALUE 0x46 1419 #define EC_CMD_RTC_SET_ALARM 0x47 1420 1421 /*****************************************************************************/ 1422 /* Port80 log access */ 1423 1424 /* Get last port80 code from previous boot */ 1425 #define EC_CMD_PORT80_LAST_BOOT 0x48 1426 1427 struct ec_response_port80_last_boot { 1428 uint16_t code; 1429 } __packed; 1430 1431 /*****************************************************************************/ 1432 /* Thermal engine commands. Note that there are two implementations. We'll 1433 * reuse the command number, but the data and behavior is incompatible. 1434 * Version 0 is what originally shipped on Link. 1435 * Version 1 separates the CPU thermal limits from the fan control. 1436 */ 1437 1438 #define EC_CMD_THERMAL_SET_THRESHOLD 0x50 1439 #define EC_CMD_THERMAL_GET_THRESHOLD 0x51 1440 1441 /* The version 0 structs are opaque. You have to know what they are for 1442 * the get/set commands to make any sense. 1443 */ 1444 1445 /* Version 0 - set */ 1446 struct ec_params_thermal_set_threshold { 1447 uint8_t sensor_type; 1448 uint8_t threshold_id; 1449 uint16_t value; 1450 } __packed; 1451 1452 /* Version 0 - get */ 1453 struct ec_params_thermal_get_threshold { 1454 uint8_t sensor_type; 1455 uint8_t threshold_id; 1456 } __packed; 1457 1458 struct ec_response_thermal_get_threshold { 1459 uint16_t value; 1460 } __packed; 1461 1462 1463 /* The version 1 structs are visible. */ 1464 enum ec_temp_thresholds { 1465 EC_TEMP_THRESH_WARN = 0, 1466 EC_TEMP_THRESH_HIGH, 1467 EC_TEMP_THRESH_HALT, 1468 1469 EC_TEMP_THRESH_COUNT 1470 }; 1471 1472 /* Thermal configuration for one temperature sensor. Temps are in degrees K. 1473 * Zero values will be silently ignored by the thermal task. 1474 */ 1475 struct ec_thermal_config { 1476 uint32_t temp_host[EC_TEMP_THRESH_COUNT]; /* levels of hotness */ 1477 uint32_t temp_fan_off; /* no active cooling needed */ 1478 uint32_t temp_fan_max; /* max active cooling needed */ 1479 } __packed; 1480 1481 /* Version 1 - get config for one sensor. */ 1482 struct ec_params_thermal_get_threshold_v1 { 1483 uint32_t sensor_num; 1484 } __packed; 1485 /* This returns a struct ec_thermal_config */ 1486 1487 /* Version 1 - set config for one sensor. 1488 * Use read-modify-write for best results! */ 1489 struct ec_params_thermal_set_threshold_v1 { 1490 uint32_t sensor_num; 1491 struct ec_thermal_config cfg; 1492 } __packed; 1493 /* This returns no data */ 1494 1495 /****************************************************************************/ 1496 1497 /* Toggle automatic fan control */ 1498 #define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52 1499 1500 /* Get TMP006 calibration data */ 1501 #define EC_CMD_TMP006_GET_CALIBRATION 0x53 1502 1503 struct ec_params_tmp006_get_calibration { 1504 uint8_t index; 1505 } __packed; 1506 1507 struct ec_response_tmp006_get_calibration { 1508 float s0; 1509 float b0; 1510 float b1; 1511 float b2; 1512 } __packed; 1513 1514 /* Set TMP006 calibration data */ 1515 #define EC_CMD_TMP006_SET_CALIBRATION 0x54 1516 1517 struct ec_params_tmp006_set_calibration { 1518 uint8_t index; 1519 uint8_t reserved[3]; /* Reserved; set 0 */ 1520 float s0; 1521 float b0; 1522 float b1; 1523 float b2; 1524 } __packed; 1525 1526 /* Read raw TMP006 data */ 1527 #define EC_CMD_TMP006_GET_RAW 0x55 1528 1529 struct ec_params_tmp006_get_raw { 1530 uint8_t index; 1531 } __packed; 1532 1533 struct ec_response_tmp006_get_raw { 1534 int32_t t; /* In 1/100 K */ 1535 int32_t v; /* In nV */ 1536 }; 1537 1538 /*****************************************************************************/ 1539 /* MKBP - Matrix KeyBoard Protocol */ 1540 1541 /* 1542 * Read key state 1543 * 1544 * Returns raw data for keyboard cols; see ec_response_mkbp_info.cols for 1545 * expected response size. 1546 */ 1547 #define EC_CMD_MKBP_STATE 0x60 1548 1549 /* Provide information about the matrix : number of rows and columns */ 1550 #define EC_CMD_MKBP_INFO 0x61 1551 1552 struct ec_response_mkbp_info { 1553 uint32_t rows; 1554 uint32_t cols; 1555 uint8_t switches; 1556 } __packed; 1557 1558 /* Simulate key press */ 1559 #define EC_CMD_MKBP_SIMULATE_KEY 0x62 1560 1561 struct ec_params_mkbp_simulate_key { 1562 uint8_t col; 1563 uint8_t row; 1564 uint8_t pressed; 1565 } __packed; 1566 1567 /* Configure keyboard scanning */ 1568 #define EC_CMD_MKBP_SET_CONFIG 0x64 1569 #define EC_CMD_MKBP_GET_CONFIG 0x65 1570 1571 /* flags */ 1572 enum mkbp_config_flags { 1573 EC_MKBP_FLAGS_ENABLE = 1, /* Enable keyboard scanning */ 1574 }; 1575 1576 enum mkbp_config_valid { 1577 EC_MKBP_VALID_SCAN_PERIOD = 1 << 0, 1578 EC_MKBP_VALID_POLL_TIMEOUT = 1 << 1, 1579 EC_MKBP_VALID_MIN_POST_SCAN_DELAY = 1 << 3, 1580 EC_MKBP_VALID_OUTPUT_SETTLE = 1 << 4, 1581 EC_MKBP_VALID_DEBOUNCE_DOWN = 1 << 5, 1582 EC_MKBP_VALID_DEBOUNCE_UP = 1 << 6, 1583 EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7, 1584 }; 1585 1586 /* Configuration for our key scanning algorithm */ 1587 struct ec_mkbp_config { 1588 uint32_t valid_mask; /* valid fields */ 1589 uint8_t flags; /* some flags (enum mkbp_config_flags) */ 1590 uint8_t valid_flags; /* which flags are valid */ 1591 uint16_t scan_period_us; /* period between start of scans */ 1592 /* revert to interrupt mode after no activity for this long */ 1593 uint32_t poll_timeout_us; 1594 /* 1595 * minimum post-scan relax time. Once we finish a scan we check 1596 * the time until we are due to start the next one. If this time is 1597 * shorter this field, we use this instead. 1598 */ 1599 uint16_t min_post_scan_delay_us; 1600 /* delay between setting up output and waiting for it to settle */ 1601 uint16_t output_settle_us; 1602 uint16_t debounce_down_us; /* time for debounce on key down */ 1603 uint16_t debounce_up_us; /* time for debounce on key up */ 1604 /* maximum depth to allow for fifo (0 = no keyscan output) */ 1605 uint8_t fifo_max_depth; 1606 } __packed; 1607 1608 struct ec_params_mkbp_set_config { 1609 struct ec_mkbp_config config; 1610 } __packed; 1611 1612 struct ec_response_mkbp_get_config { 1613 struct ec_mkbp_config config; 1614 } __packed; 1615 1616 /* Run the key scan emulation */ 1617 #define EC_CMD_KEYSCAN_SEQ_CTRL 0x66 1618 1619 enum ec_keyscan_seq_cmd { 1620 EC_KEYSCAN_SEQ_STATUS = 0, /* Get status information */ 1621 EC_KEYSCAN_SEQ_CLEAR = 1, /* Clear sequence */ 1622 EC_KEYSCAN_SEQ_ADD = 2, /* Add item to sequence */ 1623 EC_KEYSCAN_SEQ_START = 3, /* Start running sequence */ 1624 EC_KEYSCAN_SEQ_COLLECT = 4, /* Collect sequence summary data */ 1625 }; 1626 1627 enum ec_collect_flags { 1628 /* 1629 * Indicates this scan was processed by the EC. Due to timing, some 1630 * scans may be skipped. 1631 */ 1632 EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0, 1633 }; 1634 1635 struct ec_collect_item { 1636 uint8_t flags; /* some flags (enum ec_collect_flags) */ 1637 }; 1638 1639 struct ec_params_keyscan_seq_ctrl { 1640 uint8_t cmd; /* Command to send (enum ec_keyscan_seq_cmd) */ 1641 union { 1642 struct { 1643 uint8_t active; /* still active */ 1644 uint8_t num_items; /* number of items */ 1645 /* Current item being presented */ 1646 uint8_t cur_item; 1647 } status; 1648 struct { 1649 /* 1650 * Absolute time for this scan, measured from the 1651 * start of the sequence. 1652 */ 1653 uint32_t time_us; 1654 uint8_t scan[0]; /* keyscan data */ 1655 } add; 1656 struct { 1657 uint8_t start_item; /* First item to return */ 1658 uint8_t num_items; /* Number of items to return */ 1659 } collect; 1660 }; 1661 } __packed; 1662 1663 struct ec_result_keyscan_seq_ctrl { 1664 union { 1665 struct { 1666 uint8_t num_items; /* Number of items */ 1667 /* Data for each item */ 1668 struct ec_collect_item item[0]; 1669 } collect; 1670 }; 1671 } __packed; 1672 1673 /*****************************************************************************/ 1674 /* Temperature sensor commands */ 1675 1676 /* Read temperature sensor info */ 1677 #define EC_CMD_TEMP_SENSOR_GET_INFO 0x70 1678 1679 struct ec_params_temp_sensor_get_info { 1680 uint8_t id; 1681 } __packed; 1682 1683 struct ec_response_temp_sensor_get_info { 1684 char sensor_name[32]; 1685 uint8_t sensor_type; 1686 } __packed; 1687 1688 /*****************************************************************************/ 1689 1690 /* 1691 * Note: host commands 0x80 - 0x87 are reserved to avoid conflict with ACPI 1692 * commands accidentally sent to the wrong interface. See the ACPI section 1693 * below. 1694 */ 1695 1696 /*****************************************************************************/ 1697 /* Host event commands */ 1698 1699 /* 1700 * Host event mask params and response structures, shared by all of the host 1701 * event commands below. 1702 */ 1703 struct ec_params_host_event_mask { 1704 uint32_t mask; 1705 } __packed; 1706 1707 struct ec_response_host_event_mask { 1708 uint32_t mask; 1709 } __packed; 1710 1711 /* These all use ec_response_host_event_mask */ 1712 #define EC_CMD_HOST_EVENT_GET_B 0x87 1713 #define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x88 1714 #define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x89 1715 #define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x8d 1716 1717 /* These all use ec_params_host_event_mask */ 1718 #define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x8a 1719 #define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x8b 1720 #define EC_CMD_HOST_EVENT_CLEAR 0x8c 1721 #define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x8e 1722 #define EC_CMD_HOST_EVENT_CLEAR_B 0x8f 1723 1724 /*****************************************************************************/ 1725 /* Switch commands */ 1726 1727 /* Enable/disable LCD backlight */ 1728 #define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x90 1729 1730 struct ec_params_switch_enable_backlight { 1731 uint8_t enabled; 1732 } __packed; 1733 1734 /* Enable/disable WLAN/Bluetooth */ 1735 #define EC_CMD_SWITCH_ENABLE_WIRELESS 0x91 1736 #define EC_VER_SWITCH_ENABLE_WIRELESS 1 1737 1738 /* Version 0 params; no response */ 1739 struct ec_params_switch_enable_wireless_v0 { 1740 uint8_t enabled; 1741 } __packed; 1742 1743 /* Version 1 params */ 1744 struct ec_params_switch_enable_wireless_v1 { 1745 /* Flags to enable now */ 1746 uint8_t now_flags; 1747 1748 /* Which flags to copy from now_flags */ 1749 uint8_t now_mask; 1750 1751 /* 1752 * Flags to leave enabled in S3, if they're on at the S0->S3 1753 * transition. (Other flags will be disabled by the S0->S3 1754 * transition.) 1755 */ 1756 uint8_t suspend_flags; 1757 1758 /* Which flags to copy from suspend_flags */ 1759 uint8_t suspend_mask; 1760 } __packed; 1761 1762 /* Version 1 response */ 1763 struct ec_response_switch_enable_wireless_v1 { 1764 /* Flags to enable now */ 1765 uint8_t now_flags; 1766 1767 /* Flags to leave enabled in S3 */ 1768 uint8_t suspend_flags; 1769 } __packed; 1770 1771 /*****************************************************************************/ 1772 /* GPIO commands. Only available on EC if write protect has been disabled. */ 1773 1774 /* Set GPIO output value */ 1775 #define EC_CMD_GPIO_SET 0x92 1776 1777 struct ec_params_gpio_set { 1778 char name[32]; 1779 uint8_t val; 1780 } __packed; 1781 1782 /* Get GPIO value */ 1783 #define EC_CMD_GPIO_GET 0x93 1784 1785 struct ec_params_gpio_get { 1786 char name[32]; 1787 } __packed; 1788 struct ec_response_gpio_get { 1789 uint8_t val; 1790 } __packed; 1791 1792 /*****************************************************************************/ 1793 /* I2C commands. Only available when flash write protect is unlocked. */ 1794 1795 /* 1796 * TODO(crosbug.com/p/23570): These commands are deprecated, and will be 1797 * removed soon. Use EC_CMD_I2C_XFER instead. 1798 */ 1799 1800 /* Read I2C bus */ 1801 #define EC_CMD_I2C_READ 0x94 1802 1803 struct ec_params_i2c_read { 1804 uint16_t addr; /* 8-bit address (7-bit shifted << 1) */ 1805 uint8_t read_size; /* Either 8 or 16. */ 1806 uint8_t port; 1807 uint8_t offset; 1808 } __packed; 1809 struct ec_response_i2c_read { 1810 uint16_t data; 1811 } __packed; 1812 1813 /* Write I2C bus */ 1814 #define EC_CMD_I2C_WRITE 0x95 1815 1816 struct ec_params_i2c_write { 1817 uint16_t data; 1818 uint16_t addr; /* 8-bit address (7-bit shifted << 1) */ 1819 uint8_t write_size; /* Either 8 or 16. */ 1820 uint8_t port; 1821 uint8_t offset; 1822 } __packed; 1823 1824 /*****************************************************************************/ 1825 /* Charge state commands. Only available when flash write protect unlocked. */ 1826 1827 /* Force charge state machine to stop charging the battery or force it to 1828 * discharge the battery. 1829 */ 1830 #define EC_CMD_CHARGE_CONTROL 0x96 1831 #define EC_VER_CHARGE_CONTROL 1 1832 1833 enum ec_charge_control_mode { 1834 CHARGE_CONTROL_NORMAL = 0, 1835 CHARGE_CONTROL_IDLE, 1836 CHARGE_CONTROL_DISCHARGE, 1837 }; 1838 1839 struct ec_params_charge_control { 1840 uint32_t mode; /* enum charge_control_mode */ 1841 } __packed; 1842 1843 /*****************************************************************************/ 1844 /* Console commands. Only available when flash write protect is unlocked. */ 1845 1846 /* Snapshot console output buffer for use by EC_CMD_CONSOLE_READ. */ 1847 #define EC_CMD_CONSOLE_SNAPSHOT 0x97 1848 1849 /* 1850 * Read next chunk of data from saved snapshot. 1851 * 1852 * Response is null-terminated string. Empty string, if there is no more 1853 * remaining output. 1854 */ 1855 #define EC_CMD_CONSOLE_READ 0x98 1856 1857 /*****************************************************************************/ 1858 1859 /* 1860 * Cut off battery power output if the battery supports. 1861 * 1862 * For unsupported battery, just don't implement this command and lets EC 1863 * return EC_RES_INVALID_COMMAND. 1864 */ 1865 #define EC_CMD_BATTERY_CUT_OFF 0x99 1866 1867 /*****************************************************************************/ 1868 /* USB port mux control. */ 1869 1870 /* 1871 * Switch USB mux or return to automatic switching. 1872 */ 1873 #define EC_CMD_USB_MUX 0x9a 1874 1875 struct ec_params_usb_mux { 1876 uint8_t mux; 1877 } __packed; 1878 1879 /*****************************************************************************/ 1880 /* LDOs / FETs control. */ 1881 1882 enum ec_ldo_state { 1883 EC_LDO_STATE_OFF = 0, /* the LDO / FET is shut down */ 1884 EC_LDO_STATE_ON = 1, /* the LDO / FET is ON / providing power */ 1885 }; 1886 1887 /* 1888 * Switch on/off a LDO. 1889 */ 1890 #define EC_CMD_LDO_SET 0x9b 1891 1892 struct ec_params_ldo_set { 1893 uint8_t index; 1894 uint8_t state; 1895 } __packed; 1896 1897 /* 1898 * Get LDO state. 1899 */ 1900 #define EC_CMD_LDO_GET 0x9c 1901 1902 struct ec_params_ldo_get { 1903 uint8_t index; 1904 } __packed; 1905 1906 struct ec_response_ldo_get { 1907 uint8_t state; 1908 } __packed; 1909 1910 /*****************************************************************************/ 1911 /* Power info. */ 1912 1913 /* 1914 * Get power info. 1915 */ 1916 #define EC_CMD_POWER_INFO 0x9d 1917 1918 struct ec_response_power_info { 1919 uint32_t usb_dev_type; 1920 uint16_t voltage_ac; 1921 uint16_t voltage_system; 1922 uint16_t current_system; 1923 uint16_t usb_current_limit; 1924 } __packed; 1925 1926 /*****************************************************************************/ 1927 /* I2C passthru command */ 1928 1929 #define EC_CMD_I2C_PASSTHRU 0x9e 1930 1931 /* Read data; if not present, message is a write */ 1932 #define EC_I2C_FLAG_READ (1 << 15) 1933 1934 /* Mask for address */ 1935 #define EC_I2C_ADDR_MASK 0x3ff 1936 1937 #define EC_I2C_STATUS_NAK (1 << 0) /* Transfer was not acknowledged */ 1938 #define EC_I2C_STATUS_TIMEOUT (1 << 1) /* Timeout during transfer */ 1939 1940 /* Any error */ 1941 #define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT) 1942 1943 struct ec_params_i2c_passthru_msg { 1944 uint16_t addr_flags; /* I2C slave address (7 or 10 bits) and flags */ 1945 uint16_t len; /* Number of bytes to read or write */ 1946 } __packed; 1947 1948 struct ec_params_i2c_passthru { 1949 uint8_t port; /* I2C port number */ 1950 uint8_t num_msgs; /* Number of messages */ 1951 struct ec_params_i2c_passthru_msg msg[]; 1952 /* Data to write for all messages is concatenated here */ 1953 } __packed; 1954 1955 struct ec_response_i2c_passthru { 1956 uint8_t i2c_status; /* Status flags (EC_I2C_STATUS_...) */ 1957 uint8_t num_msgs; /* Number of messages processed */ 1958 uint8_t data[]; /* Data read by messages concatenated here */ 1959 } __packed; 1960 1961 /*****************************************************************************/ 1962 /* Power button hang detect */ 1963 1964 #define EC_CMD_HANG_DETECT 0x9f 1965 1966 /* Reasons to start hang detection timer */ 1967 /* Power button pressed */ 1968 #define EC_HANG_START_ON_POWER_PRESS (1 << 0) 1969 1970 /* Lid closed */ 1971 #define EC_HANG_START_ON_LID_CLOSE (1 << 1) 1972 1973 /* Lid opened */ 1974 #define EC_HANG_START_ON_LID_OPEN (1 << 2) 1975 1976 /* Start of AP S3->S0 transition (booting or resuming from suspend) */ 1977 #define EC_HANG_START_ON_RESUME (1 << 3) 1978 1979 /* Reasons to cancel hang detection */ 1980 1981 /* Power button released */ 1982 #define EC_HANG_STOP_ON_POWER_RELEASE (1 << 8) 1983 1984 /* Any host command from AP received */ 1985 #define EC_HANG_STOP_ON_HOST_COMMAND (1 << 9) 1986 1987 /* Stop on end of AP S0->S3 transition (suspending or shutting down) */ 1988 #define EC_HANG_STOP_ON_SUSPEND (1 << 10) 1989 1990 /* 1991 * If this flag is set, all the other fields are ignored, and the hang detect 1992 * timer is started. This provides the AP a way to start the hang timer 1993 * without reconfiguring any of the other hang detect settings. Note that 1994 * you must previously have configured the timeouts. 1995 */ 1996 #define EC_HANG_START_NOW (1 << 30) 1997 1998 /* 1999 * If this flag is set, all the other fields are ignored (including 2000 * EC_HANG_START_NOW). This provides the AP a way to stop the hang timer 2001 * without reconfiguring any of the other hang detect settings. 2002 */ 2003 #define EC_HANG_STOP_NOW (1 << 31) 2004 2005 struct ec_params_hang_detect { 2006 /* Flags; see EC_HANG_* */ 2007 uint32_t flags; 2008 2009 /* Timeout in msec before generating host event, if enabled */ 2010 uint16_t host_event_timeout_msec; 2011 2012 /* Timeout in msec before generating warm reboot, if enabled */ 2013 uint16_t warm_reboot_timeout_msec; 2014 } __packed; 2015 2016 /*****************************************************************************/ 2017 /* Commands for battery charging */ 2018 2019 /* 2020 * This is the single catch-all host command to exchange data regarding the 2021 * charge state machine (v2 and up). 2022 */ 2023 #define EC_CMD_CHARGE_STATE 0xa0 2024 2025 /* Subcommands for this host command */ 2026 enum charge_state_command { 2027 CHARGE_STATE_CMD_GET_STATE, 2028 CHARGE_STATE_CMD_GET_PARAM, 2029 CHARGE_STATE_CMD_SET_PARAM, 2030 CHARGE_STATE_NUM_CMDS 2031 }; 2032 2033 /* 2034 * Known param numbers are defined here. Ranges are reserved for board-specific 2035 * params, which are handled by the particular implementations. 2036 */ 2037 enum charge_state_params { 2038 CS_PARAM_CHG_VOLTAGE, /* charger voltage limit */ 2039 CS_PARAM_CHG_CURRENT, /* charger current limit */ 2040 CS_PARAM_CHG_INPUT_CURRENT, /* charger input current limit */ 2041 CS_PARAM_CHG_STATUS, /* charger-specific status */ 2042 CS_PARAM_CHG_OPTION, /* charger-specific options */ 2043 /* How many so far? */ 2044 CS_NUM_BASE_PARAMS, 2045 2046 /* Range for CONFIG_CHARGER_PROFILE_OVERRIDE params */ 2047 CS_PARAM_CUSTOM_PROFILE_MIN = 0x10000, 2048 CS_PARAM_CUSTOM_PROFILE_MAX = 0x1ffff, 2049 2050 /* Other custom param ranges go here... */ 2051 }; 2052 2053 struct ec_params_charge_state { 2054 uint8_t cmd; /* enum charge_state_command */ 2055 union { 2056 struct { 2057 /* no args */ 2058 } get_state; 2059 2060 struct { 2061 uint32_t param; /* enum charge_state_param */ 2062 } get_param; 2063 2064 struct { 2065 uint32_t param; /* param to set */ 2066 uint32_t value; /* value to set */ 2067 } set_param; 2068 }; 2069 } __packed; 2070 2071 struct ec_response_charge_state { 2072 union { 2073 struct { 2074 int ac; 2075 int chg_voltage; 2076 int chg_current; 2077 int chg_input_current; 2078 int batt_state_of_charge; 2079 } get_state; 2080 2081 struct { 2082 uint32_t value; 2083 } get_param; 2084 struct { 2085 /* no return values */ 2086 } set_param; 2087 }; 2088 } __packed; 2089 2090 2091 /* 2092 * Set maximum battery charging current. 2093 */ 2094 #define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1 2095 2096 struct ec_params_current_limit { 2097 uint32_t limit; /* in mA */ 2098 } __packed; 2099 2100 /* 2101 * Set maximum external power current. 2102 */ 2103 #define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2 2104 2105 struct ec_params_ext_power_current_limit { 2106 uint32_t limit; /* in mA */ 2107 } __packed; 2108 2109 /*****************************************************************************/ 2110 /* Smart battery pass-through */ 2111 2112 /* Get / Set 16-bit smart battery registers */ 2113 #define EC_CMD_SB_READ_WORD 0xb0 2114 #define EC_CMD_SB_WRITE_WORD 0xb1 2115 2116 /* Get / Set string smart battery parameters 2117 * formatted as SMBUS "block". 2118 */ 2119 #define EC_CMD_SB_READ_BLOCK 0xb2 2120 #define EC_CMD_SB_WRITE_BLOCK 0xb3 2121 2122 struct ec_params_sb_rd { 2123 uint8_t reg; 2124 } __packed; 2125 2126 struct ec_response_sb_rd_word { 2127 uint16_t value; 2128 } __packed; 2129 2130 struct ec_params_sb_wr_word { 2131 uint8_t reg; 2132 uint16_t value; 2133 } __packed; 2134 2135 struct ec_response_sb_rd_block { 2136 uint8_t data[32]; 2137 } __packed; 2138 2139 struct ec_params_sb_wr_block { 2140 uint8_t reg; 2141 uint16_t data[32]; 2142 } __packed; 2143 2144 /*****************************************************************************/ 2145 /* System commands */ 2146 2147 /* 2148 * TODO(crosbug.com/p/23747): This is a confusing name, since it doesn't 2149 * necessarily reboot the EC. Rename to "image" or something similar? 2150 */ 2151 #define EC_CMD_REBOOT_EC 0xd2 2152 2153 /* Command */ 2154 enum ec_reboot_cmd { 2155 EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */ 2156 EC_REBOOT_JUMP_RO = 1, /* Jump to RO without rebooting */ 2157 EC_REBOOT_JUMP_RW = 2, /* Jump to RW without rebooting */ 2158 /* (command 3 was jump to RW-B) */ 2159 EC_REBOOT_COLD = 4, /* Cold-reboot */ 2160 EC_REBOOT_DISABLE_JUMP = 5, /* Disable jump until next reboot */ 2161 EC_REBOOT_HIBERNATE = 6 /* Hibernate EC */ 2162 }; 2163 2164 /* Flags for ec_params_reboot_ec.reboot_flags */ 2165 #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */ 2166 #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */ 2167 2168 struct ec_params_reboot_ec { 2169 uint8_t cmd; /* enum ec_reboot_cmd */ 2170 uint8_t flags; /* See EC_REBOOT_FLAG_* */ 2171 } __packed; 2172 2173 /* 2174 * Get information on last EC panic. 2175 * 2176 * Returns variable-length platform-dependent panic information. See panic.h 2177 * for details. 2178 */ 2179 #define EC_CMD_GET_PANIC_INFO 0xd3 2180 2181 /*****************************************************************************/ 2182 /* 2183 * ACPI commands 2184 * 2185 * These are valid ONLY on the ACPI command/data port. 2186 */ 2187 2188 /* 2189 * ACPI Read Embedded Controller 2190 * 2191 * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 2192 * 2193 * Use the following sequence: 2194 * 2195 * - Write EC_CMD_ACPI_READ to EC_LPC_ADDR_ACPI_CMD 2196 * - Wait for EC_LPC_CMDR_PENDING bit to clear 2197 * - Write address to EC_LPC_ADDR_ACPI_DATA 2198 * - Wait for EC_LPC_CMDR_DATA bit to set 2199 * - Read value from EC_LPC_ADDR_ACPI_DATA 2200 */ 2201 #define EC_CMD_ACPI_READ 0x80 2202 2203 /* 2204 * ACPI Write Embedded Controller 2205 * 2206 * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 2207 * 2208 * Use the following sequence: 2209 * 2210 * - Write EC_CMD_ACPI_WRITE to EC_LPC_ADDR_ACPI_CMD 2211 * - Wait for EC_LPC_CMDR_PENDING bit to clear 2212 * - Write address to EC_LPC_ADDR_ACPI_DATA 2213 * - Wait for EC_LPC_CMDR_PENDING bit to clear 2214 * - Write value to EC_LPC_ADDR_ACPI_DATA 2215 */ 2216 #define EC_CMD_ACPI_WRITE 0x81 2217 2218 /* 2219 * ACPI Query Embedded Controller 2220 * 2221 * This clears the lowest-order bit in the currently pending host events, and 2222 * sets the result code to the 1-based index of the bit (event 0x00000001 = 1, 2223 * event 0x80000000 = 32), or 0 if no event was pending. 2224 */ 2225 #define EC_CMD_ACPI_QUERY_EVENT 0x84 2226 2227 /* Valid addresses in ACPI memory space, for read/write commands */ 2228 2229 /* Memory space version; set to EC_ACPI_MEM_VERSION_CURRENT */ 2230 #define EC_ACPI_MEM_VERSION 0x00 2231 /* 2232 * Test location; writing value here updates test compliment byte to (0xff - 2233 * value). 2234 */ 2235 #define EC_ACPI_MEM_TEST 0x01 2236 /* Test compliment; writes here are ignored. */ 2237 #define EC_ACPI_MEM_TEST_COMPLIMENT 0x02 2238 2239 /* Keyboard backlight brightness percent (0 - 100) */ 2240 #define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03 2241 /* DPTF Target Fan Duty (0-100, 0xff for auto/none) */ 2242 #define EC_ACPI_MEM_FAN_DUTY 0x04 2243 2244 /* 2245 * DPTF temp thresholds. Any of the EC's temp sensors can have up to two 2246 * independent thresholds attached to them. The current value of the ID 2247 * register determines which sensor is affected by the THRESHOLD and COMMIT 2248 * registers. The THRESHOLD register uses the same EC_TEMP_SENSOR_OFFSET scheme 2249 * as the memory-mapped sensors. The COMMIT register applies those settings. 2250 * 2251 * The spec does not mandate any way to read back the threshold settings 2252 * themselves, but when a threshold is crossed the AP needs a way to determine 2253 * which sensor(s) are responsible. Each reading of the ID register clears and 2254 * returns one sensor ID that has crossed one of its threshold (in either 2255 * direction) since the last read. A value of 0xFF means "no new thresholds 2256 * have tripped". Setting or enabling the thresholds for a sensor will clear 2257 * the unread event count for that sensor. 2258 */ 2259 #define EC_ACPI_MEM_TEMP_ID 0x05 2260 #define EC_ACPI_MEM_TEMP_THRESHOLD 0x06 2261 #define EC_ACPI_MEM_TEMP_COMMIT 0x07 2262 /* 2263 * Here are the bits for the COMMIT register: 2264 * bit 0 selects the threshold index for the chosen sensor (0/1) 2265 * bit 1 enables/disables the selected threshold (0 = off, 1 = on) 2266 * Each write to the commit register affects one threshold. 2267 */ 2268 #define EC_ACPI_MEM_TEMP_COMMIT_SELECT_MASK (1 << 0) 2269 #define EC_ACPI_MEM_TEMP_COMMIT_ENABLE_MASK (1 << 1) 2270 /* 2271 * Example: 2272 * 2273 * Set the thresholds for sensor 2 to 50 C and 60 C: 2274 * write 2 to [0x05] -- select temp sensor 2 2275 * write 0x7b to [0x06] -- C_TO_K(50) - EC_TEMP_SENSOR_OFFSET 2276 * write 0x2 to [0x07] -- enable threshold 0 with this value 2277 * write 0x85 to [0x06] -- C_TO_K(60) - EC_TEMP_SENSOR_OFFSET 2278 * write 0x3 to [0x07] -- enable threshold 1 with this value 2279 * 2280 * Disable the 60 C threshold, leaving the 50 C threshold unchanged: 2281 * write 2 to [0x05] -- select temp sensor 2 2282 * write 0x1 to [0x07] -- disable threshold 1 2283 */ 2284 2285 /* DPTF battery charging current limit */ 2286 #define EC_ACPI_MEM_CHARGING_LIMIT 0x08 2287 2288 /* Charging limit is specified in 64 mA steps */ 2289 #define EC_ACPI_MEM_CHARGING_LIMIT_STEP_MA 64 2290 /* Value to disable DPTF battery charging limit */ 2291 #define EC_ACPI_MEM_CHARGING_LIMIT_DISABLED 0xff 2292 2293 /* Current version of ACPI memory address space */ 2294 #define EC_ACPI_MEM_VERSION_CURRENT 1 2295 2296 2297 /*****************************************************************************/ 2298 /* 2299 * Special commands 2300 * 2301 * These do not follow the normal rules for commands. See each command for 2302 * details. 2303 */ 2304 2305 /* 2306 * Reboot NOW 2307 * 2308 * This command will work even when the EC LPC interface is busy, because the 2309 * reboot command is processed at interrupt level. Note that when the EC 2310 * reboots, the host will reboot too, so there is no response to this command. 2311 * 2312 * Use EC_CMD_REBOOT_EC to reboot the EC more politely. 2313 */ 2314 #define EC_CMD_REBOOT 0xd1 /* Think "die" */ 2315 2316 /* 2317 * Resend last response (not supported on LPC). 2318 * 2319 * Returns EC_RES_UNAVAILABLE if there is no response available - for example, 2320 * there was no previous command, or the previous command's response was too 2321 * big to save. 2322 */ 2323 #define EC_CMD_RESEND_RESPONSE 0xdb 2324 2325 /* 2326 * This header byte on a command indicate version 0. Any header byte less 2327 * than this means that we are talking to an old EC which doesn't support 2328 * versioning. In that case, we assume version 0. 2329 * 2330 * Header bytes greater than this indicate a later version. For example, 2331 * EC_CMD_VERSION0 + 1 means we are using version 1. 2332 * 2333 * The old EC interface must not use commands 0xdc or higher. 2334 */ 2335 #define EC_CMD_VERSION0 0xdc 2336 2337 #endif /* !__ACPI__ */ 2338 2339 /*****************************************************************************/ 2340 /* 2341 * Deprecated constants. These constants have been renamed for clarity. The 2342 * meaning and size has not changed. Programs that use the old names should 2343 * switch to the new names soon, as the old names may not be carried forward 2344 * forever. 2345 */ 2346 #define EC_HOST_PARAM_SIZE EC_PROTO2_MAX_PARAM_SIZE 2347 #define EC_LPC_ADDR_OLD_PARAM EC_HOST_CMD_REGION1 2348 #define EC_OLD_PARAM_SIZE EC_HOST_CMD_REGION_SIZE 2349 2350 #endif /* __CROS_EC_COMMANDS_H */ 2351