1836bb6e8SSimon Glass /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 288364387SHung-ying Tyan * Use of this source code is governed by a BSD-style license that can be 388364387SHung-ying Tyan * found in the LICENSE file. 488364387SHung-ying Tyan */ 588364387SHung-ying Tyan 688364387SHung-ying Tyan /* Host communication command constants for Chrome EC */ 788364387SHung-ying Tyan 888364387SHung-ying Tyan #ifndef __CROS_EC_COMMANDS_H 988364387SHung-ying Tyan #define __CROS_EC_COMMANDS_H 1088364387SHung-ying Tyan 1188364387SHung-ying Tyan /* 1288364387SHung-ying Tyan * Protocol overview 1388364387SHung-ying Tyan * 1488364387SHung-ying Tyan * request: CMD [ P0 P1 P2 ... Pn S ] 1588364387SHung-ying Tyan * response: ERR [ P0 P1 P2 ... Pn S ] 1688364387SHung-ying Tyan * 1788364387SHung-ying Tyan * where the bytes are defined as follow : 1888364387SHung-ying Tyan * - CMD is the command code. (defined by EC_CMD_ constants) 1988364387SHung-ying Tyan * - ERR is the error code. (defined by EC_RES_ constants) 2088364387SHung-ying Tyan * - Px is the optional payload. 2188364387SHung-ying Tyan * it is not sent if the error code is not success. 2288364387SHung-ying Tyan * (defined by ec_params_ and ec_response_ structures) 2388364387SHung-ying Tyan * - S is the checksum which is the sum of all payload bytes. 2488364387SHung-ying Tyan * 2588364387SHung-ying Tyan * On LPC, CMD and ERR are sent/received at EC_LPC_ADDR_KERNEL|USER_CMD 2688364387SHung-ying Tyan * and the payloads are sent/received at EC_LPC_ADDR_KERNEL|USER_PARAM. 2788364387SHung-ying Tyan * On I2C, all bytes are sent serially in the same message. 2888364387SHung-ying Tyan */ 2988364387SHung-ying Tyan 3088364387SHung-ying Tyan /* Current version of this protocol */ 3188364387SHung-ying Tyan #define EC_PROTO_VERSION 0x00000002 3288364387SHung-ying Tyan 3388364387SHung-ying Tyan /* Command version mask */ 3488364387SHung-ying Tyan #define EC_VER_MASK(version) (1UL << (version)) 3588364387SHung-ying Tyan 3688364387SHung-ying Tyan /* I/O addresses for ACPI commands */ 3788364387SHung-ying Tyan #define EC_LPC_ADDR_ACPI_DATA 0x62 3888364387SHung-ying Tyan #define EC_LPC_ADDR_ACPI_CMD 0x66 3988364387SHung-ying Tyan 4088364387SHung-ying Tyan /* I/O addresses for host command */ 4188364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_DATA 0x200 4288364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_CMD 0x204 4388364387SHung-ying Tyan 4488364387SHung-ying Tyan /* I/O addresses for host command args and params */ 45836bb6e8SSimon Glass /* Protocol version 2 */ 46836bb6e8SSimon Glass #define EC_LPC_ADDR_HOST_ARGS 0x800 /* And 0x801, 0x802, 0x803 */ 47836bb6e8SSimon Glass #define EC_LPC_ADDR_HOST_PARAM 0x804 /* For version 2 params; size is 48836bb6e8SSimon Glass * EC_PROTO2_MAX_PARAM_SIZE */ 49836bb6e8SSimon Glass /* Protocol version 3 */ 50836bb6e8SSimon Glass #define EC_LPC_ADDR_HOST_PACKET 0x800 /* Offset of version 3 packet */ 51836bb6e8SSimon Glass #define EC_LPC_HOST_PACKET_SIZE 0x100 /* Max size of version 3 packet */ 5288364387SHung-ying Tyan 53836bb6e8SSimon Glass /* The actual block is 0x800-0x8ff, but some BIOSes think it's 0x880-0x8ff 54836bb6e8SSimon Glass * and they tell the kernel that so we have to think of it as two parts. */ 55836bb6e8SSimon Glass #define EC_HOST_CMD_REGION0 0x800 56836bb6e8SSimon Glass #define EC_HOST_CMD_REGION1 0x880 57836bb6e8SSimon Glass #define EC_HOST_CMD_REGION_SIZE 0x80 5888364387SHung-ying Tyan 5988364387SHung-ying Tyan /* EC command register bit functions */ 6088364387SHung-ying Tyan #define EC_LPC_CMDR_DATA (1 << 0) /* Data ready for host to read */ 6188364387SHung-ying Tyan #define EC_LPC_CMDR_PENDING (1 << 1) /* Write pending to EC */ 6288364387SHung-ying Tyan #define EC_LPC_CMDR_BUSY (1 << 2) /* EC is busy processing a command */ 6388364387SHung-ying Tyan #define EC_LPC_CMDR_CMD (1 << 3) /* Last host write was a command */ 6488364387SHung-ying Tyan #define EC_LPC_CMDR_ACPI_BRST (1 << 4) /* Burst mode (not used) */ 6588364387SHung-ying Tyan #define EC_LPC_CMDR_SCI (1 << 5) /* SCI event is pending */ 6688364387SHung-ying Tyan #define EC_LPC_CMDR_SMI (1 << 6) /* SMI event is pending */ 6788364387SHung-ying Tyan 6888364387SHung-ying Tyan #define EC_LPC_ADDR_MEMMAP 0x900 6988364387SHung-ying Tyan #define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */ 7088364387SHung-ying Tyan #define EC_MEMMAP_TEXT_MAX 8 /* Size of a string in the memory map */ 7188364387SHung-ying Tyan 7288364387SHung-ying Tyan /* The offset address of each type of data in mapped memory. */ 7388364387SHung-ying Tyan #define EC_MEMMAP_TEMP_SENSOR 0x00 /* Temp sensors */ 7488364387SHung-ying Tyan #define EC_MEMMAP_FAN 0x10 /* Fan speeds */ 7588364387SHung-ying Tyan #define EC_MEMMAP_TEMP_SENSOR_B 0x18 /* Temp sensors (second set) */ 7688364387SHung-ying Tyan #define EC_MEMMAP_ID 0x20 /* 'E' 'C' */ 7788364387SHung-ying Tyan #define EC_MEMMAP_ID_VERSION 0x22 /* Version of data in 0x20 - 0x2f */ 7888364387SHung-ying Tyan #define EC_MEMMAP_THERMAL_VERSION 0x23 /* Version of data in 0x00 - 0x1f */ 7988364387SHung-ying Tyan #define EC_MEMMAP_BATTERY_VERSION 0x24 /* Version of data in 0x40 - 0x7f */ 8088364387SHung-ying Tyan #define EC_MEMMAP_SWITCHES_VERSION 0x25 /* Version of data in 0x30 - 0x33 */ 8188364387SHung-ying Tyan #define EC_MEMMAP_EVENTS_VERSION 0x26 /* Version of data in 0x34 - 0x3f */ 8288364387SHung-ying Tyan #define EC_MEMMAP_HOST_CMD_FLAGS 0x27 /* Host command interface flags */ 8388364387SHung-ying Tyan #define EC_MEMMAP_SWITCHES 0x30 8488364387SHung-ying Tyan #define EC_MEMMAP_HOST_EVENTS 0x34 8588364387SHung-ying Tyan #define EC_MEMMAP_BATT_VOLT 0x40 /* Battery Present Voltage */ 8688364387SHung-ying Tyan #define EC_MEMMAP_BATT_RATE 0x44 /* Battery Present Rate */ 8788364387SHung-ying Tyan #define EC_MEMMAP_BATT_CAP 0x48 /* Battery Remaining Capacity */ 8888364387SHung-ying Tyan #define EC_MEMMAP_BATT_FLAG 0x4c /* Battery State, defined below */ 8988364387SHung-ying Tyan #define EC_MEMMAP_BATT_DCAP 0x50 /* Battery Design Capacity */ 9088364387SHung-ying Tyan #define EC_MEMMAP_BATT_DVLT 0x54 /* Battery Design Voltage */ 9188364387SHung-ying Tyan #define EC_MEMMAP_BATT_LFCC 0x58 /* Battery Last Full Charge Capacity */ 9288364387SHung-ying Tyan #define EC_MEMMAP_BATT_CCNT 0x5c /* Battery Cycle Count */ 9388364387SHung-ying Tyan #define EC_MEMMAP_BATT_MFGR 0x60 /* Battery Manufacturer String */ 9488364387SHung-ying Tyan #define EC_MEMMAP_BATT_MODEL 0x68 /* Battery Model Number String */ 9588364387SHung-ying Tyan #define EC_MEMMAP_BATT_SERIAL 0x70 /* Battery Serial Number String */ 9688364387SHung-ying Tyan #define EC_MEMMAP_BATT_TYPE 0x78 /* Battery Type String */ 9788364387SHung-ying Tyan 9888364387SHung-ying Tyan /* Number of temp sensors at EC_MEMMAP_TEMP_SENSOR */ 9988364387SHung-ying Tyan #define EC_TEMP_SENSOR_ENTRIES 16 10088364387SHung-ying Tyan /* 10188364387SHung-ying Tyan * Number of temp sensors at EC_MEMMAP_TEMP_SENSOR_B. 10288364387SHung-ying Tyan * 10388364387SHung-ying Tyan * Valid only if EC_MEMMAP_THERMAL_VERSION returns >= 2. 10488364387SHung-ying Tyan */ 10588364387SHung-ying Tyan #define EC_TEMP_SENSOR_B_ENTRIES 8 10688364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_PRESENT 0xff 10788364387SHung-ying Tyan #define EC_TEMP_SENSOR_ERROR 0xfe 10888364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_POWERED 0xfd 10988364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc 11088364387SHung-ying Tyan /* 11188364387SHung-ying Tyan * The offset of temperature value stored in mapped memory. This allows 11288364387SHung-ying Tyan * reporting a temperature range of 200K to 454K = -73C to 181C. 11388364387SHung-ying Tyan */ 11488364387SHung-ying Tyan #define EC_TEMP_SENSOR_OFFSET 200 11588364387SHung-ying Tyan 11688364387SHung-ying Tyan #define EC_FAN_SPEED_ENTRIES 4 /* Number of fans at EC_MEMMAP_FAN */ 11788364387SHung-ying Tyan #define EC_FAN_SPEED_NOT_PRESENT 0xffff /* Entry not present */ 11888364387SHung-ying Tyan #define EC_FAN_SPEED_STALLED 0xfffe /* Fan stalled */ 11988364387SHung-ying Tyan 12088364387SHung-ying Tyan /* Battery bit flags at EC_MEMMAP_BATT_FLAG. */ 12188364387SHung-ying Tyan #define EC_BATT_FLAG_AC_PRESENT 0x01 12288364387SHung-ying Tyan #define EC_BATT_FLAG_BATT_PRESENT 0x02 12388364387SHung-ying Tyan #define EC_BATT_FLAG_DISCHARGING 0x04 12488364387SHung-ying Tyan #define EC_BATT_FLAG_CHARGING 0x08 12588364387SHung-ying Tyan #define EC_BATT_FLAG_LEVEL_CRITICAL 0x10 12688364387SHung-ying Tyan 12788364387SHung-ying Tyan /* Switch flags at EC_MEMMAP_SWITCHES */ 12888364387SHung-ying Tyan #define EC_SWITCH_LID_OPEN 0x01 12988364387SHung-ying Tyan #define EC_SWITCH_POWER_BUTTON_PRESSED 0x02 13088364387SHung-ying Tyan #define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04 131836bb6e8SSimon Glass /* Was recovery requested via keyboard; now unused. */ 132836bb6e8SSimon Glass #define EC_SWITCH_IGNORE1 0x08 13388364387SHung-ying Tyan /* Recovery requested via dedicated signal (from servo board) */ 13488364387SHung-ying Tyan #define EC_SWITCH_DEDICATED_RECOVERY 0x10 13588364387SHung-ying Tyan /* Was fake developer mode switch; now unused. Remove in next refactor. */ 13688364387SHung-ying Tyan #define EC_SWITCH_IGNORE0 0x20 13788364387SHung-ying Tyan 13888364387SHung-ying Tyan /* Host command interface flags */ 13988364387SHung-ying Tyan /* Host command interface supports LPC args (LPC interface only) */ 14088364387SHung-ying Tyan #define EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED 0x01 141836bb6e8SSimon Glass /* Host command interface supports version 3 protocol */ 142836bb6e8SSimon Glass #define EC_HOST_CMD_FLAG_VERSION_3 0x02 14388364387SHung-ying Tyan 14488364387SHung-ying Tyan /* Wireless switch flags */ 14588364387SHung-ying Tyan #define EC_WIRELESS_SWITCH_WLAN 0x01 14688364387SHung-ying Tyan #define EC_WIRELESS_SWITCH_BLUETOOTH 0x02 147836bb6e8SSimon Glass #define EC_WIRELESS_SWITCH_WWAN 0x04 14888364387SHung-ying Tyan 14988364387SHung-ying Tyan /* 15088364387SHung-ying Tyan * This header file is used in coreboot both in C and ACPI code. The ACPI code 15188364387SHung-ying Tyan * is pre-processed to handle constants but the ASL compiler is unable to 15288364387SHung-ying Tyan * handle actual C code so keep it separate. 15388364387SHung-ying Tyan */ 15488364387SHung-ying Tyan #ifndef __ACPI__ 15588364387SHung-ying Tyan 15688364387SHung-ying Tyan /* 15788364387SHung-ying Tyan * Define __packed if someone hasn't beat us to it. Linux kernel style 15888364387SHung-ying Tyan * checking prefers __packed over __attribute__((packed)). 15988364387SHung-ying Tyan */ 16088364387SHung-ying Tyan #ifndef __packed 16188364387SHung-ying Tyan #define __packed __attribute__((packed)) 16288364387SHung-ying Tyan #endif 16388364387SHung-ying Tyan 16488364387SHung-ying Tyan /* LPC command status byte masks */ 16588364387SHung-ying Tyan /* EC has written a byte in the data register and host hasn't read it yet */ 16688364387SHung-ying Tyan #define EC_LPC_STATUS_TO_HOST 0x01 16788364387SHung-ying Tyan /* Host has written a command/data byte and the EC hasn't read it yet */ 16888364387SHung-ying Tyan #define EC_LPC_STATUS_FROM_HOST 0x02 16988364387SHung-ying Tyan /* EC is processing a command */ 17088364387SHung-ying Tyan #define EC_LPC_STATUS_PROCESSING 0x04 17188364387SHung-ying Tyan /* Last write to EC was a command, not data */ 17288364387SHung-ying Tyan #define EC_LPC_STATUS_LAST_CMD 0x08 17388364387SHung-ying Tyan /* EC is in burst mode. Unsupported by Chrome EC, so this bit is never set */ 17488364387SHung-ying Tyan #define EC_LPC_STATUS_BURST_MODE 0x10 17588364387SHung-ying Tyan /* SCI event is pending (requesting SCI query) */ 17688364387SHung-ying Tyan #define EC_LPC_STATUS_SCI_PENDING 0x20 17788364387SHung-ying Tyan /* SMI event is pending (requesting SMI query) */ 17888364387SHung-ying Tyan #define EC_LPC_STATUS_SMI_PENDING 0x40 17988364387SHung-ying Tyan /* (reserved) */ 18088364387SHung-ying Tyan #define EC_LPC_STATUS_RESERVED 0x80 18188364387SHung-ying Tyan 18288364387SHung-ying Tyan /* 18388364387SHung-ying Tyan * EC is busy. This covers both the EC processing a command, and the host has 18488364387SHung-ying Tyan * written a new command but the EC hasn't picked it up yet. 18588364387SHung-ying Tyan */ 18688364387SHung-ying Tyan #define EC_LPC_STATUS_BUSY_MASK \ 18788364387SHung-ying Tyan (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING) 18888364387SHung-ying Tyan 18988364387SHung-ying Tyan /* Host command response codes */ 19088364387SHung-ying Tyan enum ec_status { 19188364387SHung-ying Tyan EC_RES_SUCCESS = 0, 19288364387SHung-ying Tyan EC_RES_INVALID_COMMAND = 1, 19388364387SHung-ying Tyan EC_RES_ERROR = 2, 19488364387SHung-ying Tyan EC_RES_INVALID_PARAM = 3, 19588364387SHung-ying Tyan EC_RES_ACCESS_DENIED = 4, 19688364387SHung-ying Tyan EC_RES_INVALID_RESPONSE = 5, 19788364387SHung-ying Tyan EC_RES_INVALID_VERSION = 6, 19888364387SHung-ying Tyan EC_RES_INVALID_CHECKSUM = 7, 19988364387SHung-ying Tyan EC_RES_IN_PROGRESS = 8, /* Accepted, command in progress */ 20088364387SHung-ying Tyan EC_RES_UNAVAILABLE = 9, /* No response available */ 20188364387SHung-ying Tyan EC_RES_TIMEOUT = 10, /* We got a timeout */ 20288364387SHung-ying Tyan EC_RES_OVERFLOW = 11, /* Table / data overflow */ 203836bb6e8SSimon Glass EC_RES_INVALID_HEADER = 12, /* Header contains invalid data */ 204836bb6e8SSimon Glass EC_RES_REQUEST_TRUNCATED = 13, /* Didn't get the entire request */ 205836bb6e8SSimon Glass EC_RES_RESPONSE_TOO_BIG = 14 /* Response was too big to handle */ 20688364387SHung-ying Tyan }; 20788364387SHung-ying Tyan 20888364387SHung-ying Tyan /* 20988364387SHung-ying Tyan * Host event codes. Note these are 1-based, not 0-based, because ACPI query 21088364387SHung-ying Tyan * EC command uses code 0 to mean "no event pending". We explicitly specify 21188364387SHung-ying Tyan * each value in the enum listing so they won't change if we delete/insert an 21288364387SHung-ying Tyan * item or rearrange the list (it needs to be stable across platforms, not 21388364387SHung-ying Tyan * just within a single compiled instance). 21488364387SHung-ying Tyan */ 21588364387SHung-ying Tyan enum host_event_code { 21688364387SHung-ying Tyan EC_HOST_EVENT_LID_CLOSED = 1, 21788364387SHung-ying Tyan EC_HOST_EVENT_LID_OPEN = 2, 21888364387SHung-ying Tyan EC_HOST_EVENT_POWER_BUTTON = 3, 21988364387SHung-ying Tyan EC_HOST_EVENT_AC_CONNECTED = 4, 22088364387SHung-ying Tyan EC_HOST_EVENT_AC_DISCONNECTED = 5, 22188364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_LOW = 6, 22288364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_CRITICAL = 7, 22388364387SHung-ying Tyan EC_HOST_EVENT_BATTERY = 8, 22488364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_THRESHOLD = 9, 22588364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_OVERLOAD = 10, 22688364387SHung-ying Tyan EC_HOST_EVENT_THERMAL = 11, 22788364387SHung-ying Tyan EC_HOST_EVENT_USB_CHARGER = 12, 22888364387SHung-ying Tyan EC_HOST_EVENT_KEY_PRESSED = 13, 22988364387SHung-ying Tyan /* 23088364387SHung-ying Tyan * EC has finished initializing the host interface. The host can check 23188364387SHung-ying Tyan * for this event following sending a EC_CMD_REBOOT_EC command to 23288364387SHung-ying Tyan * determine when the EC is ready to accept subsequent commands. 23388364387SHung-ying Tyan */ 23488364387SHung-ying Tyan EC_HOST_EVENT_INTERFACE_READY = 14, 23588364387SHung-ying Tyan /* Keyboard recovery combo has been pressed */ 23688364387SHung-ying Tyan EC_HOST_EVENT_KEYBOARD_RECOVERY = 15, 23788364387SHung-ying Tyan 23888364387SHung-ying Tyan /* Shutdown due to thermal overload */ 23988364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_SHUTDOWN = 16, 24088364387SHung-ying Tyan /* Shutdown due to battery level too low */ 24188364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_SHUTDOWN = 17, 24288364387SHung-ying Tyan 24388364387SHung-ying Tyan /* 24488364387SHung-ying Tyan * The high bit of the event mask is not used as a host event code. If 24588364387SHung-ying Tyan * it reads back as set, then the entire event mask should be 24688364387SHung-ying Tyan * considered invalid by the host. This can happen when reading the 24788364387SHung-ying Tyan * raw event status via EC_MEMMAP_HOST_EVENTS but the LPC interface is 24888364387SHung-ying Tyan * not initialized on the EC, or improperly configured on the host. 24988364387SHung-ying Tyan */ 25088364387SHung-ying Tyan EC_HOST_EVENT_INVALID = 32 25188364387SHung-ying Tyan }; 25288364387SHung-ying Tyan /* Host event mask */ 25388364387SHung-ying Tyan #define EC_HOST_EVENT_MASK(event_code) (1UL << ((event_code) - 1)) 25488364387SHung-ying Tyan 25588364387SHung-ying Tyan /* Arguments at EC_LPC_ADDR_HOST_ARGS */ 25688364387SHung-ying Tyan struct ec_lpc_host_args { 25788364387SHung-ying Tyan uint8_t flags; 25888364387SHung-ying Tyan uint8_t command_version; 25988364387SHung-ying Tyan uint8_t data_size; 26088364387SHung-ying Tyan /* 26188364387SHung-ying Tyan * Checksum; sum of command + flags + command_version + data_size + 26288364387SHung-ying Tyan * all params/response data bytes. 26388364387SHung-ying Tyan */ 26488364387SHung-ying Tyan uint8_t checksum; 26588364387SHung-ying Tyan } __packed; 26688364387SHung-ying Tyan 26788364387SHung-ying Tyan /* Flags for ec_lpc_host_args.flags */ 26888364387SHung-ying Tyan /* 26988364387SHung-ying Tyan * Args are from host. Data area at EC_LPC_ADDR_HOST_PARAM contains command 27088364387SHung-ying Tyan * params. 27188364387SHung-ying Tyan * 27288364387SHung-ying Tyan * If EC gets a command and this flag is not set, this is an old-style command. 27388364387SHung-ying Tyan * Command version is 0 and params from host are at EC_LPC_ADDR_OLD_PARAM with 27488364387SHung-ying Tyan * unknown length. EC must respond with an old-style response (that is, 27588364387SHung-ying Tyan * withouth setting EC_HOST_ARGS_FLAG_TO_HOST). 27688364387SHung-ying Tyan */ 27788364387SHung-ying Tyan #define EC_HOST_ARGS_FLAG_FROM_HOST 0x01 27888364387SHung-ying Tyan /* 27988364387SHung-ying Tyan * Args are from EC. Data area at EC_LPC_ADDR_HOST_PARAM contains response. 28088364387SHung-ying Tyan * 28188364387SHung-ying Tyan * If EC responds to a command and this flag is not set, this is an old-style 28288364387SHung-ying Tyan * response. Command version is 0 and response data from EC is at 28388364387SHung-ying Tyan * EC_LPC_ADDR_OLD_PARAM with unknown length. 28488364387SHung-ying Tyan */ 28588364387SHung-ying Tyan #define EC_HOST_ARGS_FLAG_TO_HOST 0x02 28688364387SHung-ying Tyan 287836bb6e8SSimon Glass /*****************************************************************************/ 288836bb6e8SSimon Glass 289836bb6e8SSimon Glass /* 290836bb6e8SSimon Glass * Protocol version 2 for I2C and SPI send a request this way: 291836bb6e8SSimon Glass * 292836bb6e8SSimon Glass * 0 EC_CMD_VERSION0 + (command version) 293836bb6e8SSimon Glass * 1 Command number 294836bb6e8SSimon Glass * 2 Length of params = N 295836bb6e8SSimon Glass * 3..N+2 Params, if any 296836bb6e8SSimon Glass * N+3 8-bit checksum of bytes 0..N+2 297836bb6e8SSimon Glass * 298836bb6e8SSimon Glass * The corresponding response is: 299836bb6e8SSimon Glass * 300836bb6e8SSimon Glass * 0 Result code (EC_RES_*) 301836bb6e8SSimon Glass * 1 Length of params = M 302836bb6e8SSimon Glass * 2..M+1 Params, if any 303836bb6e8SSimon Glass * M+2 8-bit checksum of bytes 0..M+1 304836bb6e8SSimon Glass */ 305836bb6e8SSimon Glass #define EC_PROTO2_REQUEST_HEADER_BYTES 3 306836bb6e8SSimon Glass #define EC_PROTO2_REQUEST_TRAILER_BYTES 1 307836bb6e8SSimon Glass #define EC_PROTO2_REQUEST_OVERHEAD (EC_PROTO2_REQUEST_HEADER_BYTES + \ 308836bb6e8SSimon Glass EC_PROTO2_REQUEST_TRAILER_BYTES) 309836bb6e8SSimon Glass 310836bb6e8SSimon Glass #define EC_PROTO2_RESPONSE_HEADER_BYTES 2 311836bb6e8SSimon Glass #define EC_PROTO2_RESPONSE_TRAILER_BYTES 1 312836bb6e8SSimon Glass #define EC_PROTO2_RESPONSE_OVERHEAD (EC_PROTO2_RESPONSE_HEADER_BYTES + \ 313836bb6e8SSimon Glass EC_PROTO2_RESPONSE_TRAILER_BYTES) 314836bb6e8SSimon Glass 315836bb6e8SSimon Glass /* Parameter length was limited by the LPC interface */ 316836bb6e8SSimon Glass #define EC_PROTO2_MAX_PARAM_SIZE 0xfc 317836bb6e8SSimon Glass 318836bb6e8SSimon Glass /* Maximum request and response packet sizes for protocol version 2 */ 319836bb6e8SSimon Glass #define EC_PROTO2_MAX_REQUEST_SIZE (EC_PROTO2_REQUEST_OVERHEAD + \ 320836bb6e8SSimon Glass EC_PROTO2_MAX_PARAM_SIZE) 321836bb6e8SSimon Glass #define EC_PROTO2_MAX_RESPONSE_SIZE (EC_PROTO2_RESPONSE_OVERHEAD + \ 322836bb6e8SSimon Glass EC_PROTO2_MAX_PARAM_SIZE) 323836bb6e8SSimon Glass 324836bb6e8SSimon Glass /*****************************************************************************/ 325836bb6e8SSimon Glass 326836bb6e8SSimon Glass /* 327836bb6e8SSimon Glass * Value written to legacy command port / prefix byte to indicate protocol 328836bb6e8SSimon Glass * 3+ structs are being used. Usage is bus-dependent. 329836bb6e8SSimon Glass */ 330836bb6e8SSimon Glass #define EC_COMMAND_PROTOCOL_3 0xda 331836bb6e8SSimon Glass 332836bb6e8SSimon Glass #define EC_HOST_REQUEST_VERSION 3 333836bb6e8SSimon Glass 334836bb6e8SSimon Glass /* Version 3 request from host */ 335836bb6e8SSimon Glass struct ec_host_request { 336836bb6e8SSimon Glass /* Struct version (=3) 337836bb6e8SSimon Glass * 338836bb6e8SSimon Glass * EC will return EC_RES_INVALID_HEADER if it receives a header with a 339836bb6e8SSimon Glass * version it doesn't know how to parse. 340836bb6e8SSimon Glass */ 341836bb6e8SSimon Glass uint8_t struct_version; 342836bb6e8SSimon Glass 343836bb6e8SSimon Glass /* 344836bb6e8SSimon Glass * Checksum of request and data; sum of all bytes including checksum 345836bb6e8SSimon Glass * should total to 0. 346836bb6e8SSimon Glass */ 347836bb6e8SSimon Glass uint8_t checksum; 348836bb6e8SSimon Glass 349836bb6e8SSimon Glass /* Command code */ 350836bb6e8SSimon Glass uint16_t command; 351836bb6e8SSimon Glass 352836bb6e8SSimon Glass /* Command version */ 353836bb6e8SSimon Glass uint8_t command_version; 354836bb6e8SSimon Glass 355836bb6e8SSimon Glass /* Unused byte in current protocol version; set to 0 */ 356836bb6e8SSimon Glass uint8_t reserved; 357836bb6e8SSimon Glass 358836bb6e8SSimon Glass /* Length of data which follows this header */ 359836bb6e8SSimon Glass uint16_t data_len; 360836bb6e8SSimon Glass } __packed; 361836bb6e8SSimon Glass 362836bb6e8SSimon Glass #define EC_HOST_RESPONSE_VERSION 3 363836bb6e8SSimon Glass 364836bb6e8SSimon Glass /* Version 3 response from EC */ 365836bb6e8SSimon Glass struct ec_host_response { 366836bb6e8SSimon Glass /* Struct version (=3) */ 367836bb6e8SSimon Glass uint8_t struct_version; 368836bb6e8SSimon Glass 369836bb6e8SSimon Glass /* 370836bb6e8SSimon Glass * Checksum of response and data; sum of all bytes including checksum 371836bb6e8SSimon Glass * should total to 0. 372836bb6e8SSimon Glass */ 373836bb6e8SSimon Glass uint8_t checksum; 374836bb6e8SSimon Glass 375836bb6e8SSimon Glass /* Result code (EC_RES_*) */ 376836bb6e8SSimon Glass uint16_t result; 377836bb6e8SSimon Glass 378836bb6e8SSimon Glass /* Length of data which follows this header */ 379836bb6e8SSimon Glass uint16_t data_len; 380836bb6e8SSimon Glass 381836bb6e8SSimon Glass /* Unused bytes in current protocol version; set to 0 */ 382836bb6e8SSimon Glass uint16_t reserved; 383836bb6e8SSimon Glass } __packed; 384836bb6e8SSimon Glass 385836bb6e8SSimon Glass /*****************************************************************************/ 38688364387SHung-ying Tyan /* 38788364387SHung-ying Tyan * Notes on commands: 38888364387SHung-ying Tyan * 38988364387SHung-ying Tyan * Each command is an 8-byte command value. Commands which take params or 39088364387SHung-ying Tyan * return response data specify structs for that data. If no struct is 39188364387SHung-ying Tyan * specified, the command does not input or output data, respectively. 39288364387SHung-ying Tyan * Parameter/response length is implicit in the structs. Some underlying 39388364387SHung-ying Tyan * communication protocols (I2C, SPI) may add length or checksum headers, but 39488364387SHung-ying Tyan * those are implementation-dependent and not defined here. 39588364387SHung-ying Tyan */ 39688364387SHung-ying Tyan 39788364387SHung-ying Tyan /*****************************************************************************/ 39888364387SHung-ying Tyan /* General / test commands */ 39988364387SHung-ying Tyan 40088364387SHung-ying Tyan /* 40188364387SHung-ying Tyan * Get protocol version, used to deal with non-backward compatible protocol 40288364387SHung-ying Tyan * changes. 40388364387SHung-ying Tyan */ 40488364387SHung-ying Tyan #define EC_CMD_PROTO_VERSION 0x00 40588364387SHung-ying Tyan 40688364387SHung-ying Tyan struct ec_response_proto_version { 40788364387SHung-ying Tyan uint32_t version; 40888364387SHung-ying Tyan } __packed; 40988364387SHung-ying Tyan 41088364387SHung-ying Tyan /* 41188364387SHung-ying Tyan * Hello. This is a simple command to test the EC is responsive to 41288364387SHung-ying Tyan * commands. 41388364387SHung-ying Tyan */ 41488364387SHung-ying Tyan #define EC_CMD_HELLO 0x01 41588364387SHung-ying Tyan 41688364387SHung-ying Tyan struct ec_params_hello { 41788364387SHung-ying Tyan uint32_t in_data; /* Pass anything here */ 41888364387SHung-ying Tyan } __packed; 41988364387SHung-ying Tyan 42088364387SHung-ying Tyan struct ec_response_hello { 42188364387SHung-ying Tyan uint32_t out_data; /* Output will be in_data + 0x01020304 */ 42288364387SHung-ying Tyan } __packed; 42388364387SHung-ying Tyan 42488364387SHung-ying Tyan /* Get version number */ 42588364387SHung-ying Tyan #define EC_CMD_GET_VERSION 0x02 42688364387SHung-ying Tyan 42788364387SHung-ying Tyan enum ec_current_image { 42888364387SHung-ying Tyan EC_IMAGE_UNKNOWN = 0, 42988364387SHung-ying Tyan EC_IMAGE_RO, 43088364387SHung-ying Tyan EC_IMAGE_RW 43188364387SHung-ying Tyan }; 43288364387SHung-ying Tyan 43388364387SHung-ying Tyan struct ec_response_get_version { 43488364387SHung-ying Tyan /* Null-terminated version strings for RO, RW */ 43588364387SHung-ying Tyan char version_string_ro[32]; 43688364387SHung-ying Tyan char version_string_rw[32]; 43788364387SHung-ying Tyan char reserved[32]; /* Was previously RW-B string */ 43888364387SHung-ying Tyan uint32_t current_image; /* One of ec_current_image */ 43988364387SHung-ying Tyan } __packed; 44088364387SHung-ying Tyan 44188364387SHung-ying Tyan /* Read test */ 44288364387SHung-ying Tyan #define EC_CMD_READ_TEST 0x03 44388364387SHung-ying Tyan 44488364387SHung-ying Tyan struct ec_params_read_test { 44588364387SHung-ying Tyan uint32_t offset; /* Starting value for read buffer */ 44688364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 44788364387SHung-ying Tyan } __packed; 44888364387SHung-ying Tyan 44988364387SHung-ying Tyan struct ec_response_read_test { 45088364387SHung-ying Tyan uint32_t data[32]; 45188364387SHung-ying Tyan } __packed; 45288364387SHung-ying Tyan 45388364387SHung-ying Tyan /* 45488364387SHung-ying Tyan * Get build information 45588364387SHung-ying Tyan * 45688364387SHung-ying Tyan * Response is null-terminated string. 45788364387SHung-ying Tyan */ 45888364387SHung-ying Tyan #define EC_CMD_GET_BUILD_INFO 0x04 45988364387SHung-ying Tyan 46088364387SHung-ying Tyan /* Get chip info */ 46188364387SHung-ying Tyan #define EC_CMD_GET_CHIP_INFO 0x05 46288364387SHung-ying Tyan 46388364387SHung-ying Tyan struct ec_response_get_chip_info { 46488364387SHung-ying Tyan /* Null-terminated strings */ 46588364387SHung-ying Tyan char vendor[32]; 46688364387SHung-ying Tyan char name[32]; 46788364387SHung-ying Tyan char revision[32]; /* Mask version */ 46888364387SHung-ying Tyan } __packed; 46988364387SHung-ying Tyan 47088364387SHung-ying Tyan /* Get board HW version */ 47188364387SHung-ying Tyan #define EC_CMD_GET_BOARD_VERSION 0x06 47288364387SHung-ying Tyan 47388364387SHung-ying Tyan struct ec_response_board_version { 47488364387SHung-ying Tyan uint16_t board_version; /* A monotonously incrementing number. */ 47588364387SHung-ying Tyan } __packed; 47688364387SHung-ying Tyan 47788364387SHung-ying Tyan /* 47888364387SHung-ying Tyan * Read memory-mapped data. 47988364387SHung-ying Tyan * 48088364387SHung-ying Tyan * This is an alternate interface to memory-mapped data for bus protocols 48188364387SHung-ying Tyan * which don't support direct-mapped memory - I2C, SPI, etc. 48288364387SHung-ying Tyan * 48388364387SHung-ying Tyan * Response is params.size bytes of data. 48488364387SHung-ying Tyan */ 48588364387SHung-ying Tyan #define EC_CMD_READ_MEMMAP 0x07 48688364387SHung-ying Tyan 48788364387SHung-ying Tyan struct ec_params_read_memmap { 48888364387SHung-ying Tyan uint8_t offset; /* Offset in memmap (EC_MEMMAP_*) */ 48988364387SHung-ying Tyan uint8_t size; /* Size to read in bytes */ 49088364387SHung-ying Tyan } __packed; 49188364387SHung-ying Tyan 49288364387SHung-ying Tyan /* Read versions supported for a command */ 49388364387SHung-ying Tyan #define EC_CMD_GET_CMD_VERSIONS 0x08 49488364387SHung-ying Tyan 49588364387SHung-ying Tyan struct ec_params_get_cmd_versions { 49688364387SHung-ying Tyan uint8_t cmd; /* Command to check */ 49788364387SHung-ying Tyan } __packed; 49888364387SHung-ying Tyan 49988364387SHung-ying Tyan struct ec_response_get_cmd_versions { 50088364387SHung-ying Tyan /* 50188364387SHung-ying Tyan * Mask of supported versions; use EC_VER_MASK() to compare with a 50288364387SHung-ying Tyan * desired version. 50388364387SHung-ying Tyan */ 50488364387SHung-ying Tyan uint32_t version_mask; 50588364387SHung-ying Tyan } __packed; 50688364387SHung-ying Tyan 50788364387SHung-ying Tyan /* 50888364387SHung-ying Tyan * Check EC communcations status (busy). This is needed on i2c/spi but not 50988364387SHung-ying Tyan * on lpc since it has its own out-of-band busy indicator. 51088364387SHung-ying Tyan * 51188364387SHung-ying Tyan * lpc must read the status from the command register. Attempting this on 51288364387SHung-ying Tyan * lpc will overwrite the args/parameter space and corrupt its data. 51388364387SHung-ying Tyan */ 51488364387SHung-ying Tyan #define EC_CMD_GET_COMMS_STATUS 0x09 51588364387SHung-ying Tyan 51688364387SHung-ying Tyan /* Avoid using ec_status which is for return values */ 51788364387SHung-ying Tyan enum ec_comms_status { 51888364387SHung-ying Tyan EC_COMMS_STATUS_PROCESSING = 1 << 0, /* Processing cmd */ 51988364387SHung-ying Tyan }; 52088364387SHung-ying Tyan 52188364387SHung-ying Tyan struct ec_response_get_comms_status { 52288364387SHung-ying Tyan uint32_t flags; /* Mask of enum ec_comms_status */ 52388364387SHung-ying Tyan } __packed; 52488364387SHung-ying Tyan 525836bb6e8SSimon Glass /* 526836bb6e8SSimon Glass * Fake a variety of responses, purely for testing purposes. 527836bb6e8SSimon Glass * FIXME: Would be nice to force checksum errors. 528836bb6e8SSimon Glass */ 529836bb6e8SSimon Glass #define EC_CMD_TEST_PROTOCOL 0x0a 530836bb6e8SSimon Glass 531836bb6e8SSimon Glass /* Tell the EC what to send back to us. */ 532836bb6e8SSimon Glass struct ec_params_test_protocol { 533836bb6e8SSimon Glass uint32_t ec_result; 534836bb6e8SSimon Glass uint32_t ret_len; 535836bb6e8SSimon Glass uint8_t buf[32]; 536836bb6e8SSimon Glass } __packed; 537836bb6e8SSimon Glass 538836bb6e8SSimon Glass /* Here it comes... */ 539836bb6e8SSimon Glass struct ec_response_test_protocol { 540836bb6e8SSimon Glass uint8_t buf[32]; 541836bb6e8SSimon Glass } __packed; 542836bb6e8SSimon Glass 543836bb6e8SSimon Glass /* Get prococol information */ 544836bb6e8SSimon Glass #define EC_CMD_GET_PROTOCOL_INFO 0x0b 545836bb6e8SSimon Glass 546836bb6e8SSimon Glass /* Flags for ec_response_get_protocol_info.flags */ 547836bb6e8SSimon Glass /* EC_RES_IN_PROGRESS may be returned if a command is slow */ 548836bb6e8SSimon Glass #define EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED (1 << 0) 549836bb6e8SSimon Glass 550836bb6e8SSimon Glass struct ec_response_get_protocol_info { 551836bb6e8SSimon Glass /* Fields which exist if at least protocol version 3 supported */ 552836bb6e8SSimon Glass 553836bb6e8SSimon Glass /* Bitmask of protocol versions supported (1 << n means version n)*/ 554836bb6e8SSimon Glass uint32_t protocol_versions; 555836bb6e8SSimon Glass 556836bb6e8SSimon Glass /* Maximum request packet size, in bytes */ 557836bb6e8SSimon Glass uint16_t max_request_packet_size; 558836bb6e8SSimon Glass 559836bb6e8SSimon Glass /* Maximum response packet size, in bytes */ 560836bb6e8SSimon Glass uint16_t max_response_packet_size; 561836bb6e8SSimon Glass 562836bb6e8SSimon Glass /* Flags; see EC_PROTOCOL_INFO_* */ 563836bb6e8SSimon Glass uint32_t flags; 564836bb6e8SSimon Glass } __packed; 56588364387SHung-ying Tyan 56688364387SHung-ying Tyan /*****************************************************************************/ 56788364387SHung-ying Tyan /* Flash commands */ 56888364387SHung-ying Tyan 56988364387SHung-ying Tyan /* Get flash info */ 57088364387SHung-ying Tyan #define EC_CMD_FLASH_INFO 0x10 57188364387SHung-ying Tyan 57288364387SHung-ying Tyan struct ec_response_flash_info { 57388364387SHung-ying Tyan /* Usable flash size, in bytes */ 57488364387SHung-ying Tyan uint32_t flash_size; 57588364387SHung-ying Tyan /* 57688364387SHung-ying Tyan * Write block size. Write offset and size must be a multiple 57788364387SHung-ying Tyan * of this. 57888364387SHung-ying Tyan */ 57988364387SHung-ying Tyan uint32_t write_block_size; 58088364387SHung-ying Tyan /* 58188364387SHung-ying Tyan * Erase block size. Erase offset and size must be a multiple 58288364387SHung-ying Tyan * of this. 58388364387SHung-ying Tyan */ 58488364387SHung-ying Tyan uint32_t erase_block_size; 58588364387SHung-ying Tyan /* 58688364387SHung-ying Tyan * Protection block size. Protection offset and size must be a 58788364387SHung-ying Tyan * multiple of this. 58888364387SHung-ying Tyan */ 58988364387SHung-ying Tyan uint32_t protect_block_size; 59088364387SHung-ying Tyan } __packed; 59188364387SHung-ying Tyan 59288364387SHung-ying Tyan /* 59388364387SHung-ying Tyan * Read flash 59488364387SHung-ying Tyan * 59588364387SHung-ying Tyan * Response is params.size bytes of data. 59688364387SHung-ying Tyan */ 59788364387SHung-ying Tyan #define EC_CMD_FLASH_READ 0x11 59888364387SHung-ying Tyan 59988364387SHung-ying Tyan struct ec_params_flash_read { 60088364387SHung-ying Tyan uint32_t offset; /* Byte offset to read */ 60188364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 60288364387SHung-ying Tyan } __packed; 60388364387SHung-ying Tyan 60488364387SHung-ying Tyan /* Write flash */ 60588364387SHung-ying Tyan #define EC_CMD_FLASH_WRITE 0x12 606836bb6e8SSimon Glass #define EC_VER_FLASH_WRITE 1 607836bb6e8SSimon Glass 608836bb6e8SSimon Glass /* Version 0 of the flash command supported only 64 bytes of data */ 609836bb6e8SSimon Glass #define EC_FLASH_WRITE_VER0_SIZE 64 61088364387SHung-ying Tyan 61188364387SHung-ying Tyan struct ec_params_flash_write { 61288364387SHung-ying Tyan uint32_t offset; /* Byte offset to write */ 61388364387SHung-ying Tyan uint32_t size; /* Size to write in bytes */ 614836bb6e8SSimon Glass /* Followed by data to write */ 61588364387SHung-ying Tyan } __packed; 61688364387SHung-ying Tyan 61788364387SHung-ying Tyan /* Erase flash */ 61888364387SHung-ying Tyan #define EC_CMD_FLASH_ERASE 0x13 61988364387SHung-ying Tyan 62088364387SHung-ying Tyan struct ec_params_flash_erase { 62188364387SHung-ying Tyan uint32_t offset; /* Byte offset to erase */ 62288364387SHung-ying Tyan uint32_t size; /* Size to erase in bytes */ 62388364387SHung-ying Tyan } __packed; 62488364387SHung-ying Tyan 62588364387SHung-ying Tyan /* 62688364387SHung-ying Tyan * Get/set flash protection. 62788364387SHung-ying Tyan * 62888364387SHung-ying Tyan * If mask!=0, sets/clear the requested bits of flags. Depending on the 62988364387SHung-ying Tyan * firmware write protect GPIO, not all flags will take effect immediately; 63088364387SHung-ying Tyan * some flags require a subsequent hard reset to take effect. Check the 63188364387SHung-ying Tyan * returned flags bits to see what actually happened. 63288364387SHung-ying Tyan * 63388364387SHung-ying Tyan * If mask=0, simply returns the current flags state. 63488364387SHung-ying Tyan */ 63588364387SHung-ying Tyan #define EC_CMD_FLASH_PROTECT 0x15 63688364387SHung-ying Tyan #define EC_VER_FLASH_PROTECT 1 /* Command version 1 */ 63788364387SHung-ying Tyan 63888364387SHung-ying Tyan /* Flags for flash protection */ 63988364387SHung-ying Tyan /* RO flash code protected when the EC boots */ 64088364387SHung-ying Tyan #define EC_FLASH_PROTECT_RO_AT_BOOT (1 << 0) 64188364387SHung-ying Tyan /* 64288364387SHung-ying Tyan * RO flash code protected now. If this bit is set, at-boot status cannot 64388364387SHung-ying Tyan * be changed. 64488364387SHung-ying Tyan */ 64588364387SHung-ying Tyan #define EC_FLASH_PROTECT_RO_NOW (1 << 1) 64688364387SHung-ying Tyan /* Entire flash code protected now, until reboot. */ 64788364387SHung-ying Tyan #define EC_FLASH_PROTECT_ALL_NOW (1 << 2) 64888364387SHung-ying Tyan /* Flash write protect GPIO is asserted now */ 64988364387SHung-ying Tyan #define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3) 65088364387SHung-ying Tyan /* Error - at least one bank of flash is stuck locked, and cannot be unlocked */ 65188364387SHung-ying Tyan #define EC_FLASH_PROTECT_ERROR_STUCK (1 << 4) 65288364387SHung-ying Tyan /* 65388364387SHung-ying Tyan * Error - flash protection is in inconsistent state. At least one bank of 65488364387SHung-ying Tyan * flash which should be protected is not protected. Usually fixed by 65588364387SHung-ying Tyan * re-requesting the desired flags, or by a hard reset if that fails. 65688364387SHung-ying Tyan */ 65788364387SHung-ying Tyan #define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5) 65888364387SHung-ying Tyan /* Entile flash code protected when the EC boots */ 65988364387SHung-ying Tyan #define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6) 66088364387SHung-ying Tyan 66188364387SHung-ying Tyan struct ec_params_flash_protect { 66288364387SHung-ying Tyan uint32_t mask; /* Bits in flags to apply */ 66388364387SHung-ying Tyan uint32_t flags; /* New flags to apply */ 66488364387SHung-ying Tyan } __packed; 66588364387SHung-ying Tyan 66688364387SHung-ying Tyan struct ec_response_flash_protect { 66788364387SHung-ying Tyan /* Current value of flash protect flags */ 66888364387SHung-ying Tyan uint32_t flags; 66988364387SHung-ying Tyan /* 67088364387SHung-ying Tyan * Flags which are valid on this platform. This allows the caller 67188364387SHung-ying Tyan * to distinguish between flags which aren't set vs. flags which can't 67288364387SHung-ying Tyan * be set on this platform. 67388364387SHung-ying Tyan */ 67488364387SHung-ying Tyan uint32_t valid_flags; 67588364387SHung-ying Tyan /* Flags which can be changed given the current protection state */ 67688364387SHung-ying Tyan uint32_t writable_flags; 67788364387SHung-ying Tyan } __packed; 67888364387SHung-ying Tyan 67988364387SHung-ying Tyan /* 68088364387SHung-ying Tyan * Note: commands 0x14 - 0x19 version 0 were old commands to get/set flash 68188364387SHung-ying Tyan * write protect. These commands may be reused with version > 0. 68288364387SHung-ying Tyan */ 68388364387SHung-ying Tyan 68488364387SHung-ying Tyan /* Get the region offset/size */ 68588364387SHung-ying Tyan #define EC_CMD_FLASH_REGION_INFO 0x16 68688364387SHung-ying Tyan #define EC_VER_FLASH_REGION_INFO 1 68788364387SHung-ying Tyan 68888364387SHung-ying Tyan enum ec_flash_region { 68988364387SHung-ying Tyan /* Region which holds read-only EC image */ 690cecb19c0SSimon Glass EC_FLASH_REGION_RO = 0, 69188364387SHung-ying Tyan /* Region which holds rewritable EC image */ 69288364387SHung-ying Tyan EC_FLASH_REGION_RW, 69388364387SHung-ying Tyan /* 69488364387SHung-ying Tyan * Region which should be write-protected in the factory (a superset of 69588364387SHung-ying Tyan * EC_FLASH_REGION_RO) 69688364387SHung-ying Tyan */ 69788364387SHung-ying Tyan EC_FLASH_REGION_WP_RO, 698cecb19c0SSimon Glass /* Number of regions */ 699cecb19c0SSimon Glass EC_FLASH_REGION_COUNT, 70088364387SHung-ying Tyan }; 70188364387SHung-ying Tyan 70288364387SHung-ying Tyan struct ec_params_flash_region_info { 70388364387SHung-ying Tyan uint32_t region; /* enum ec_flash_region */ 70488364387SHung-ying Tyan } __packed; 70588364387SHung-ying Tyan 70688364387SHung-ying Tyan struct ec_response_flash_region_info { 70788364387SHung-ying Tyan uint32_t offset; 70888364387SHung-ying Tyan uint32_t size; 70988364387SHung-ying Tyan } __packed; 71088364387SHung-ying Tyan 71188364387SHung-ying Tyan /* Read/write VbNvContext */ 71288364387SHung-ying Tyan #define EC_CMD_VBNV_CONTEXT 0x17 71388364387SHung-ying Tyan #define EC_VER_VBNV_CONTEXT 1 71488364387SHung-ying Tyan #define EC_VBNV_BLOCK_SIZE 16 71588364387SHung-ying Tyan 71688364387SHung-ying Tyan enum ec_vbnvcontext_op { 71788364387SHung-ying Tyan EC_VBNV_CONTEXT_OP_READ, 71888364387SHung-ying Tyan EC_VBNV_CONTEXT_OP_WRITE, 71988364387SHung-ying Tyan }; 72088364387SHung-ying Tyan 72188364387SHung-ying Tyan struct ec_params_vbnvcontext { 72288364387SHung-ying Tyan uint32_t op; 72388364387SHung-ying Tyan uint8_t block[EC_VBNV_BLOCK_SIZE]; 72488364387SHung-ying Tyan } __packed; 72588364387SHung-ying Tyan 72688364387SHung-ying Tyan struct ec_response_vbnvcontext { 72788364387SHung-ying Tyan uint8_t block[EC_VBNV_BLOCK_SIZE]; 72888364387SHung-ying Tyan } __packed; 72988364387SHung-ying Tyan 73088364387SHung-ying Tyan /*****************************************************************************/ 73188364387SHung-ying Tyan /* PWM commands */ 73288364387SHung-ying Tyan 73388364387SHung-ying Tyan /* Get fan target RPM */ 73488364387SHung-ying Tyan #define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x20 73588364387SHung-ying Tyan 73688364387SHung-ying Tyan struct ec_response_pwm_get_fan_rpm { 73788364387SHung-ying Tyan uint32_t rpm; 73888364387SHung-ying Tyan } __packed; 73988364387SHung-ying Tyan 74088364387SHung-ying Tyan /* Set target fan RPM */ 74188364387SHung-ying Tyan #define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x21 74288364387SHung-ying Tyan 74388364387SHung-ying Tyan struct ec_params_pwm_set_fan_target_rpm { 74488364387SHung-ying Tyan uint32_t rpm; 74588364387SHung-ying Tyan } __packed; 74688364387SHung-ying Tyan 74788364387SHung-ying Tyan /* Get keyboard backlight */ 74888364387SHung-ying Tyan #define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x22 74988364387SHung-ying Tyan 75088364387SHung-ying Tyan struct ec_response_pwm_get_keyboard_backlight { 75188364387SHung-ying Tyan uint8_t percent; 75288364387SHung-ying Tyan uint8_t enabled; 75388364387SHung-ying Tyan } __packed; 75488364387SHung-ying Tyan 75588364387SHung-ying Tyan /* Set keyboard backlight */ 75688364387SHung-ying Tyan #define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x23 75788364387SHung-ying Tyan 75888364387SHung-ying Tyan struct ec_params_pwm_set_keyboard_backlight { 75988364387SHung-ying Tyan uint8_t percent; 76088364387SHung-ying Tyan } __packed; 76188364387SHung-ying Tyan 76288364387SHung-ying Tyan /* Set target fan PWM duty cycle */ 76388364387SHung-ying Tyan #define EC_CMD_PWM_SET_FAN_DUTY 0x24 76488364387SHung-ying Tyan 76588364387SHung-ying Tyan struct ec_params_pwm_set_fan_duty { 76688364387SHung-ying Tyan uint32_t percent; 76788364387SHung-ying Tyan } __packed; 76888364387SHung-ying Tyan 76988364387SHung-ying Tyan /*****************************************************************************/ 77088364387SHung-ying Tyan /* 77188364387SHung-ying Tyan * Lightbar commands. This looks worse than it is. Since we only use one HOST 77288364387SHung-ying Tyan * command to say "talk to the lightbar", we put the "and tell it to do X" part 77388364387SHung-ying Tyan * into a subcommand. We'll make separate structs for subcommands with 77488364387SHung-ying Tyan * different input args, so that we know how much to expect. 77588364387SHung-ying Tyan */ 77688364387SHung-ying Tyan #define EC_CMD_LIGHTBAR_CMD 0x28 77788364387SHung-ying Tyan 77888364387SHung-ying Tyan struct rgb_s { 77988364387SHung-ying Tyan uint8_t r, g, b; 78088364387SHung-ying Tyan }; 78188364387SHung-ying Tyan 78288364387SHung-ying Tyan #define LB_BATTERY_LEVELS 4 78388364387SHung-ying Tyan /* List of tweakable parameters. NOTE: It's __packed so it can be sent in a 78488364387SHung-ying Tyan * host command, but the alignment is the same regardless. Keep it that way. 78588364387SHung-ying Tyan */ 78688364387SHung-ying Tyan struct lightbar_params { 78788364387SHung-ying Tyan /* Timing */ 78888364387SHung-ying Tyan int google_ramp_up; 78988364387SHung-ying Tyan int google_ramp_down; 79088364387SHung-ying Tyan int s3s0_ramp_up; 79188364387SHung-ying Tyan int s0_tick_delay[2]; /* AC=0/1 */ 79288364387SHung-ying Tyan int s0a_tick_delay[2]; /* AC=0/1 */ 79388364387SHung-ying Tyan int s0s3_ramp_down; 79488364387SHung-ying Tyan int s3_sleep_for; 79588364387SHung-ying Tyan int s3_ramp_up; 79688364387SHung-ying Tyan int s3_ramp_down; 79788364387SHung-ying Tyan 79888364387SHung-ying Tyan /* Oscillation */ 79988364387SHung-ying Tyan uint8_t new_s0; 80088364387SHung-ying Tyan uint8_t osc_min[2]; /* AC=0/1 */ 80188364387SHung-ying Tyan uint8_t osc_max[2]; /* AC=0/1 */ 80288364387SHung-ying Tyan uint8_t w_ofs[2]; /* AC=0/1 */ 80388364387SHung-ying Tyan 80488364387SHung-ying Tyan /* Brightness limits based on the backlight and AC. */ 80588364387SHung-ying Tyan uint8_t bright_bl_off_fixed[2]; /* AC=0/1 */ 80688364387SHung-ying Tyan uint8_t bright_bl_on_min[2]; /* AC=0/1 */ 80788364387SHung-ying Tyan uint8_t bright_bl_on_max[2]; /* AC=0/1 */ 80888364387SHung-ying Tyan 80988364387SHung-ying Tyan /* Battery level thresholds */ 81088364387SHung-ying Tyan uint8_t battery_threshold[LB_BATTERY_LEVELS - 1]; 81188364387SHung-ying Tyan 81288364387SHung-ying Tyan /* Map [AC][battery_level] to color index */ 81388364387SHung-ying Tyan uint8_t s0_idx[2][LB_BATTERY_LEVELS]; /* AP is running */ 81488364387SHung-ying Tyan uint8_t s3_idx[2][LB_BATTERY_LEVELS]; /* AP is sleeping */ 81588364387SHung-ying Tyan 81688364387SHung-ying Tyan /* Color palette */ 81788364387SHung-ying Tyan struct rgb_s color[8]; /* 0-3 are Google colors */ 81888364387SHung-ying Tyan } __packed; 81988364387SHung-ying Tyan 82088364387SHung-ying Tyan struct ec_params_lightbar { 82188364387SHung-ying Tyan uint8_t cmd; /* Command (see enum lightbar_command) */ 82288364387SHung-ying Tyan union { 82388364387SHung-ying Tyan struct { 82488364387SHung-ying Tyan /* no args */ 82588364387SHung-ying Tyan } dump, off, on, init, get_seq, get_params; 82688364387SHung-ying Tyan 82788364387SHung-ying Tyan struct num { 82888364387SHung-ying Tyan uint8_t num; 82988364387SHung-ying Tyan } brightness, seq, demo; 83088364387SHung-ying Tyan 83188364387SHung-ying Tyan struct reg { 83288364387SHung-ying Tyan uint8_t ctrl, reg, value; 83388364387SHung-ying Tyan } reg; 83488364387SHung-ying Tyan 83588364387SHung-ying Tyan struct rgb { 83688364387SHung-ying Tyan uint8_t led, red, green, blue; 83788364387SHung-ying Tyan } rgb; 83888364387SHung-ying Tyan 83988364387SHung-ying Tyan struct lightbar_params set_params; 84088364387SHung-ying Tyan }; 84188364387SHung-ying Tyan } __packed; 84288364387SHung-ying Tyan 84388364387SHung-ying Tyan struct ec_response_lightbar { 84488364387SHung-ying Tyan union { 84588364387SHung-ying Tyan struct dump { 84688364387SHung-ying Tyan struct { 84788364387SHung-ying Tyan uint8_t reg; 84888364387SHung-ying Tyan uint8_t ic0; 84988364387SHung-ying Tyan uint8_t ic1; 85088364387SHung-ying Tyan } vals[23]; 85188364387SHung-ying Tyan } dump; 85288364387SHung-ying Tyan 85388364387SHung-ying Tyan struct get_seq { 85488364387SHung-ying Tyan uint8_t num; 85588364387SHung-ying Tyan } get_seq; 85688364387SHung-ying Tyan 85788364387SHung-ying Tyan struct lightbar_params get_params; 85888364387SHung-ying Tyan 85988364387SHung-ying Tyan struct { 86088364387SHung-ying Tyan /* no return params */ 86188364387SHung-ying Tyan } off, on, init, brightness, seq, reg, rgb, demo, set_params; 86288364387SHung-ying Tyan }; 86388364387SHung-ying Tyan } __packed; 86488364387SHung-ying Tyan 86588364387SHung-ying Tyan /* Lightbar commands */ 86688364387SHung-ying Tyan enum lightbar_command { 86788364387SHung-ying Tyan LIGHTBAR_CMD_DUMP = 0, 86888364387SHung-ying Tyan LIGHTBAR_CMD_OFF = 1, 86988364387SHung-ying Tyan LIGHTBAR_CMD_ON = 2, 87088364387SHung-ying Tyan LIGHTBAR_CMD_INIT = 3, 87188364387SHung-ying Tyan LIGHTBAR_CMD_BRIGHTNESS = 4, 87288364387SHung-ying Tyan LIGHTBAR_CMD_SEQ = 5, 87388364387SHung-ying Tyan LIGHTBAR_CMD_REG = 6, 87488364387SHung-ying Tyan LIGHTBAR_CMD_RGB = 7, 87588364387SHung-ying Tyan LIGHTBAR_CMD_GET_SEQ = 8, 87688364387SHung-ying Tyan LIGHTBAR_CMD_DEMO = 9, 87788364387SHung-ying Tyan LIGHTBAR_CMD_GET_PARAMS = 10, 87888364387SHung-ying Tyan LIGHTBAR_CMD_SET_PARAMS = 11, 87988364387SHung-ying Tyan LIGHTBAR_NUM_CMDS 88088364387SHung-ying Tyan }; 88188364387SHung-ying Tyan 88288364387SHung-ying Tyan /*****************************************************************************/ 883836bb6e8SSimon Glass /* LED control commands */ 884836bb6e8SSimon Glass 885836bb6e8SSimon Glass #define EC_CMD_LED_CONTROL 0x29 886836bb6e8SSimon Glass 887836bb6e8SSimon Glass enum ec_led_id { 888836bb6e8SSimon Glass EC_LED_ID_BATTERY_LED = 0, 889836bb6e8SSimon Glass EC_LED_ID_POWER_BUTTON_LED, 890836bb6e8SSimon Glass EC_LED_ID_ADAPTER_LED, 891836bb6e8SSimon Glass }; 892836bb6e8SSimon Glass 893836bb6e8SSimon Glass /* LED control flags */ 894836bb6e8SSimon Glass #define EC_LED_FLAGS_QUERY (1 << 0) /* Query LED capability only */ 895836bb6e8SSimon Glass #define EC_LED_FLAGS_AUTO (1 << 1) /* Switch LED back to automatic control */ 896836bb6e8SSimon Glass 897836bb6e8SSimon Glass enum ec_led_colors { 898836bb6e8SSimon Glass EC_LED_COLOR_RED = 0, 899836bb6e8SSimon Glass EC_LED_COLOR_GREEN, 900836bb6e8SSimon Glass EC_LED_COLOR_BLUE, 901836bb6e8SSimon Glass EC_LED_COLOR_YELLOW, 902836bb6e8SSimon Glass EC_LED_COLOR_WHITE, 903836bb6e8SSimon Glass 904836bb6e8SSimon Glass EC_LED_COLOR_COUNT 905836bb6e8SSimon Glass }; 906836bb6e8SSimon Glass 907836bb6e8SSimon Glass struct ec_params_led_control { 908836bb6e8SSimon Glass uint8_t led_id; /* Which LED to control */ 909836bb6e8SSimon Glass uint8_t flags; /* Control flags */ 910836bb6e8SSimon Glass 911836bb6e8SSimon Glass uint8_t brightness[EC_LED_COLOR_COUNT]; 912836bb6e8SSimon Glass } __packed; 913836bb6e8SSimon Glass 914836bb6e8SSimon Glass struct ec_response_led_control { 915836bb6e8SSimon Glass /* 916836bb6e8SSimon Glass * Available brightness value range. 917836bb6e8SSimon Glass * 918836bb6e8SSimon Glass * Range 0 means color channel not present. 919836bb6e8SSimon Glass * Range 1 means on/off control. 920836bb6e8SSimon Glass * Other values means the LED is control by PWM. 921836bb6e8SSimon Glass */ 922836bb6e8SSimon Glass uint8_t brightness_range[EC_LED_COLOR_COUNT]; 923836bb6e8SSimon Glass } __packed; 924836bb6e8SSimon Glass 925836bb6e8SSimon Glass /*****************************************************************************/ 92688364387SHung-ying Tyan /* Verified boot commands */ 92788364387SHung-ying Tyan 92888364387SHung-ying Tyan /* 92988364387SHung-ying Tyan * Note: command code 0x29 version 0 was VBOOT_CMD in Link EVT; it may be 93088364387SHung-ying Tyan * reused for other purposes with version > 0. 93188364387SHung-ying Tyan */ 93288364387SHung-ying Tyan 93388364387SHung-ying Tyan /* Verified boot hash command */ 93488364387SHung-ying Tyan #define EC_CMD_VBOOT_HASH 0x2A 93588364387SHung-ying Tyan 93688364387SHung-ying Tyan struct ec_params_vboot_hash { 93788364387SHung-ying Tyan uint8_t cmd; /* enum ec_vboot_hash_cmd */ 93888364387SHung-ying Tyan uint8_t hash_type; /* enum ec_vboot_hash_type */ 93988364387SHung-ying Tyan uint8_t nonce_size; /* Nonce size; may be 0 */ 94088364387SHung-ying Tyan uint8_t reserved0; /* Reserved; set 0 */ 94188364387SHung-ying Tyan uint32_t offset; /* Offset in flash to hash */ 94288364387SHung-ying Tyan uint32_t size; /* Number of bytes to hash */ 94388364387SHung-ying Tyan uint8_t nonce_data[64]; /* Nonce data; ignored if nonce_size=0 */ 94488364387SHung-ying Tyan } __packed; 94588364387SHung-ying Tyan 94688364387SHung-ying Tyan struct ec_response_vboot_hash { 94788364387SHung-ying Tyan uint8_t status; /* enum ec_vboot_hash_status */ 94888364387SHung-ying Tyan uint8_t hash_type; /* enum ec_vboot_hash_type */ 94988364387SHung-ying Tyan uint8_t digest_size; /* Size of hash digest in bytes */ 95088364387SHung-ying Tyan uint8_t reserved0; /* Ignore; will be 0 */ 95188364387SHung-ying Tyan uint32_t offset; /* Offset in flash which was hashed */ 95288364387SHung-ying Tyan uint32_t size; /* Number of bytes hashed */ 95388364387SHung-ying Tyan uint8_t hash_digest[64]; /* Hash digest data */ 95488364387SHung-ying Tyan } __packed; 95588364387SHung-ying Tyan 95688364387SHung-ying Tyan enum ec_vboot_hash_cmd { 95788364387SHung-ying Tyan EC_VBOOT_HASH_GET = 0, /* Get current hash status */ 95888364387SHung-ying Tyan EC_VBOOT_HASH_ABORT = 1, /* Abort calculating current hash */ 95988364387SHung-ying Tyan EC_VBOOT_HASH_START = 2, /* Start computing a new hash */ 96088364387SHung-ying Tyan EC_VBOOT_HASH_RECALC = 3, /* Synchronously compute a new hash */ 96188364387SHung-ying Tyan }; 96288364387SHung-ying Tyan 96388364387SHung-ying Tyan enum ec_vboot_hash_type { 96488364387SHung-ying Tyan EC_VBOOT_HASH_TYPE_SHA256 = 0, /* SHA-256 */ 96588364387SHung-ying Tyan }; 96688364387SHung-ying Tyan 96788364387SHung-ying Tyan enum ec_vboot_hash_status { 96888364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_NONE = 0, /* No hash (not started, or aborted) */ 96988364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_DONE = 1, /* Finished computing a hash */ 97088364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_BUSY = 2, /* Busy computing a hash */ 97188364387SHung-ying Tyan }; 97288364387SHung-ying Tyan 97388364387SHung-ying Tyan /* 97488364387SHung-ying Tyan * Special values for offset for EC_VBOOT_HASH_START and EC_VBOOT_HASH_RECALC. 97588364387SHung-ying Tyan * If one of these is specified, the EC will automatically update offset and 97688364387SHung-ying Tyan * size to the correct values for the specified image (RO or RW). 97788364387SHung-ying Tyan */ 97888364387SHung-ying Tyan #define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe 97988364387SHung-ying Tyan #define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd 98088364387SHung-ying Tyan 98188364387SHung-ying Tyan /*****************************************************************************/ 98288364387SHung-ying Tyan /* USB charging control commands */ 98388364387SHung-ying Tyan 98488364387SHung-ying Tyan /* Set USB port charging mode */ 98588364387SHung-ying Tyan #define EC_CMD_USB_CHARGE_SET_MODE 0x30 98688364387SHung-ying Tyan 98788364387SHung-ying Tyan struct ec_params_usb_charge_set_mode { 98888364387SHung-ying Tyan uint8_t usb_port_id; 98988364387SHung-ying Tyan uint8_t mode; 99088364387SHung-ying Tyan } __packed; 99188364387SHung-ying Tyan 99288364387SHung-ying Tyan /*****************************************************************************/ 99388364387SHung-ying Tyan /* Persistent storage for host */ 99488364387SHung-ying Tyan 99588364387SHung-ying Tyan /* Maximum bytes that can be read/written in a single command */ 99688364387SHung-ying Tyan #define EC_PSTORE_SIZE_MAX 64 99788364387SHung-ying Tyan 99888364387SHung-ying Tyan /* Get persistent storage info */ 99988364387SHung-ying Tyan #define EC_CMD_PSTORE_INFO 0x40 100088364387SHung-ying Tyan 100188364387SHung-ying Tyan struct ec_response_pstore_info { 100288364387SHung-ying Tyan /* Persistent storage size, in bytes */ 100388364387SHung-ying Tyan uint32_t pstore_size; 100488364387SHung-ying Tyan /* Access size; read/write offset and size must be a multiple of this */ 100588364387SHung-ying Tyan uint32_t access_size; 100688364387SHung-ying Tyan } __packed; 100788364387SHung-ying Tyan 100888364387SHung-ying Tyan /* 100988364387SHung-ying Tyan * Read persistent storage 101088364387SHung-ying Tyan * 101188364387SHung-ying Tyan * Response is params.size bytes of data. 101288364387SHung-ying Tyan */ 101388364387SHung-ying Tyan #define EC_CMD_PSTORE_READ 0x41 101488364387SHung-ying Tyan 101588364387SHung-ying Tyan struct ec_params_pstore_read { 101688364387SHung-ying Tyan uint32_t offset; /* Byte offset to read */ 101788364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 101888364387SHung-ying Tyan } __packed; 101988364387SHung-ying Tyan 102088364387SHung-ying Tyan /* Write persistent storage */ 102188364387SHung-ying Tyan #define EC_CMD_PSTORE_WRITE 0x42 102288364387SHung-ying Tyan 102388364387SHung-ying Tyan struct ec_params_pstore_write { 102488364387SHung-ying Tyan uint32_t offset; /* Byte offset to write */ 102588364387SHung-ying Tyan uint32_t size; /* Size to write in bytes */ 102688364387SHung-ying Tyan uint8_t data[EC_PSTORE_SIZE_MAX]; 102788364387SHung-ying Tyan } __packed; 102888364387SHung-ying Tyan 102988364387SHung-ying Tyan /*****************************************************************************/ 103088364387SHung-ying Tyan /* Real-time clock */ 103188364387SHung-ying Tyan 103288364387SHung-ying Tyan /* RTC params and response structures */ 103388364387SHung-ying Tyan struct ec_params_rtc { 103488364387SHung-ying Tyan uint32_t time; 103588364387SHung-ying Tyan } __packed; 103688364387SHung-ying Tyan 103788364387SHung-ying Tyan struct ec_response_rtc { 103888364387SHung-ying Tyan uint32_t time; 103988364387SHung-ying Tyan } __packed; 104088364387SHung-ying Tyan 104188364387SHung-ying Tyan /* These use ec_response_rtc */ 104288364387SHung-ying Tyan #define EC_CMD_RTC_GET_VALUE 0x44 104388364387SHung-ying Tyan #define EC_CMD_RTC_GET_ALARM 0x45 104488364387SHung-ying Tyan 104588364387SHung-ying Tyan /* These all use ec_params_rtc */ 104688364387SHung-ying Tyan #define EC_CMD_RTC_SET_VALUE 0x46 104788364387SHung-ying Tyan #define EC_CMD_RTC_SET_ALARM 0x47 104888364387SHung-ying Tyan 104988364387SHung-ying Tyan /*****************************************************************************/ 105088364387SHung-ying Tyan /* Port80 log access */ 105188364387SHung-ying Tyan 105288364387SHung-ying Tyan /* Get last port80 code from previous boot */ 105388364387SHung-ying Tyan #define EC_CMD_PORT80_LAST_BOOT 0x48 105488364387SHung-ying Tyan 105588364387SHung-ying Tyan struct ec_response_port80_last_boot { 105688364387SHung-ying Tyan uint16_t code; 105788364387SHung-ying Tyan } __packed; 105888364387SHung-ying Tyan 105988364387SHung-ying Tyan /*****************************************************************************/ 106088364387SHung-ying Tyan /* Thermal engine commands */ 106188364387SHung-ying Tyan 106288364387SHung-ying Tyan /* Set thershold value */ 106388364387SHung-ying Tyan #define EC_CMD_THERMAL_SET_THRESHOLD 0x50 106488364387SHung-ying Tyan 106588364387SHung-ying Tyan struct ec_params_thermal_set_threshold { 106688364387SHung-ying Tyan uint8_t sensor_type; 106788364387SHung-ying Tyan uint8_t threshold_id; 106888364387SHung-ying Tyan uint16_t value; 106988364387SHung-ying Tyan } __packed; 107088364387SHung-ying Tyan 107188364387SHung-ying Tyan /* Get threshold value */ 107288364387SHung-ying Tyan #define EC_CMD_THERMAL_GET_THRESHOLD 0x51 107388364387SHung-ying Tyan 107488364387SHung-ying Tyan struct ec_params_thermal_get_threshold { 107588364387SHung-ying Tyan uint8_t sensor_type; 107688364387SHung-ying Tyan uint8_t threshold_id; 107788364387SHung-ying Tyan } __packed; 107888364387SHung-ying Tyan 107988364387SHung-ying Tyan struct ec_response_thermal_get_threshold { 108088364387SHung-ying Tyan uint16_t value; 108188364387SHung-ying Tyan } __packed; 108288364387SHung-ying Tyan 108388364387SHung-ying Tyan /* Toggle automatic fan control */ 108488364387SHung-ying Tyan #define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52 108588364387SHung-ying Tyan 108688364387SHung-ying Tyan /* Get TMP006 calibration data */ 108788364387SHung-ying Tyan #define EC_CMD_TMP006_GET_CALIBRATION 0x53 108888364387SHung-ying Tyan 108988364387SHung-ying Tyan struct ec_params_tmp006_get_calibration { 109088364387SHung-ying Tyan uint8_t index; 109188364387SHung-ying Tyan } __packed; 109288364387SHung-ying Tyan 109388364387SHung-ying Tyan struct ec_response_tmp006_get_calibration { 109488364387SHung-ying Tyan float s0; 109588364387SHung-ying Tyan float b0; 109688364387SHung-ying Tyan float b1; 109788364387SHung-ying Tyan float b2; 109888364387SHung-ying Tyan } __packed; 109988364387SHung-ying Tyan 110088364387SHung-ying Tyan /* Set TMP006 calibration data */ 110188364387SHung-ying Tyan #define EC_CMD_TMP006_SET_CALIBRATION 0x54 110288364387SHung-ying Tyan 110388364387SHung-ying Tyan struct ec_params_tmp006_set_calibration { 110488364387SHung-ying Tyan uint8_t index; 110588364387SHung-ying Tyan uint8_t reserved[3]; /* Reserved; set 0 */ 110688364387SHung-ying Tyan float s0; 110788364387SHung-ying Tyan float b0; 110888364387SHung-ying Tyan float b1; 110988364387SHung-ying Tyan float b2; 111088364387SHung-ying Tyan } __packed; 111188364387SHung-ying Tyan 111288364387SHung-ying Tyan /*****************************************************************************/ 1113836bb6e8SSimon Glass /* MKBP - Matrix KeyBoard Protocol */ 111488364387SHung-ying Tyan 111588364387SHung-ying Tyan /* 111688364387SHung-ying Tyan * Read key state 111788364387SHung-ying Tyan * 1118836bb6e8SSimon Glass * Returns raw data for keyboard cols; see ec_response_mkbp_info.cols for 111988364387SHung-ying Tyan * expected response size. 112088364387SHung-ying Tyan */ 1121836bb6e8SSimon Glass #define EC_CMD_MKBP_STATE 0x60 112288364387SHung-ying Tyan 112388364387SHung-ying Tyan /* Provide information about the matrix : number of rows and columns */ 1124836bb6e8SSimon Glass #define EC_CMD_MKBP_INFO 0x61 112588364387SHung-ying Tyan 1126836bb6e8SSimon Glass struct ec_response_mkbp_info { 112788364387SHung-ying Tyan uint32_t rows; 112888364387SHung-ying Tyan uint32_t cols; 112988364387SHung-ying Tyan uint8_t switches; 113088364387SHung-ying Tyan } __packed; 113188364387SHung-ying Tyan 113288364387SHung-ying Tyan /* Simulate key press */ 1133836bb6e8SSimon Glass #define EC_CMD_MKBP_SIMULATE_KEY 0x62 113488364387SHung-ying Tyan 1135836bb6e8SSimon Glass struct ec_params_mkbp_simulate_key { 113688364387SHung-ying Tyan uint8_t col; 113788364387SHung-ying Tyan uint8_t row; 113888364387SHung-ying Tyan uint8_t pressed; 113988364387SHung-ying Tyan } __packed; 114088364387SHung-ying Tyan 114188364387SHung-ying Tyan /* Configure keyboard scanning */ 1142836bb6e8SSimon Glass #define EC_CMD_MKBP_SET_CONFIG 0x64 1143836bb6e8SSimon Glass #define EC_CMD_MKBP_GET_CONFIG 0x65 114488364387SHung-ying Tyan 114588364387SHung-ying Tyan /* flags */ 1146836bb6e8SSimon Glass enum mkbp_config_flags { 1147836bb6e8SSimon Glass EC_MKBP_FLAGS_ENABLE = 1, /* Enable keyboard scanning */ 114888364387SHung-ying Tyan }; 114988364387SHung-ying Tyan 1150836bb6e8SSimon Glass enum mkbp_config_valid { 1151836bb6e8SSimon Glass EC_MKBP_VALID_SCAN_PERIOD = 1 << 0, 1152836bb6e8SSimon Glass EC_MKBP_VALID_POLL_TIMEOUT = 1 << 1, 1153836bb6e8SSimon Glass EC_MKBP_VALID_MIN_POST_SCAN_DELAY = 1 << 3, 1154836bb6e8SSimon Glass EC_MKBP_VALID_OUTPUT_SETTLE = 1 << 4, 1155836bb6e8SSimon Glass EC_MKBP_VALID_DEBOUNCE_DOWN = 1 << 5, 1156836bb6e8SSimon Glass EC_MKBP_VALID_DEBOUNCE_UP = 1 << 6, 1157836bb6e8SSimon Glass EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7, 115888364387SHung-ying Tyan }; 115988364387SHung-ying Tyan 116088364387SHung-ying Tyan /* Configuration for our key scanning algorithm */ 1161836bb6e8SSimon Glass struct ec_mkbp_config { 116288364387SHung-ying Tyan uint32_t valid_mask; /* valid fields */ 1163836bb6e8SSimon Glass uint8_t flags; /* some flags (enum mkbp_config_flags) */ 116488364387SHung-ying Tyan uint8_t valid_flags; /* which flags are valid */ 116588364387SHung-ying Tyan uint16_t scan_period_us; /* period between start of scans */ 116688364387SHung-ying Tyan /* revert to interrupt mode after no activity for this long */ 116788364387SHung-ying Tyan uint32_t poll_timeout_us; 116888364387SHung-ying Tyan /* 116988364387SHung-ying Tyan * minimum post-scan relax time. Once we finish a scan we check 117088364387SHung-ying Tyan * the time until we are due to start the next one. If this time is 117188364387SHung-ying Tyan * shorter this field, we use this instead. 117288364387SHung-ying Tyan */ 117388364387SHung-ying Tyan uint16_t min_post_scan_delay_us; 117488364387SHung-ying Tyan /* delay between setting up output and waiting for it to settle */ 117588364387SHung-ying Tyan uint16_t output_settle_us; 117688364387SHung-ying Tyan uint16_t debounce_down_us; /* time for debounce on key down */ 117788364387SHung-ying Tyan uint16_t debounce_up_us; /* time for debounce on key up */ 117888364387SHung-ying Tyan /* maximum depth to allow for fifo (0 = no keyscan output) */ 117988364387SHung-ying Tyan uint8_t fifo_max_depth; 118088364387SHung-ying Tyan } __packed; 118188364387SHung-ying Tyan 1182836bb6e8SSimon Glass struct ec_params_mkbp_set_config { 1183836bb6e8SSimon Glass struct ec_mkbp_config config; 118488364387SHung-ying Tyan } __packed; 118588364387SHung-ying Tyan 1186836bb6e8SSimon Glass struct ec_response_mkbp_get_config { 1187836bb6e8SSimon Glass struct ec_mkbp_config config; 118888364387SHung-ying Tyan } __packed; 118988364387SHung-ying Tyan 119088364387SHung-ying Tyan /* Run the key scan emulation */ 119188364387SHung-ying Tyan #define EC_CMD_KEYSCAN_SEQ_CTRL 0x66 119288364387SHung-ying Tyan 119388364387SHung-ying Tyan enum ec_keyscan_seq_cmd { 119488364387SHung-ying Tyan EC_KEYSCAN_SEQ_STATUS = 0, /* Get status information */ 119588364387SHung-ying Tyan EC_KEYSCAN_SEQ_CLEAR = 1, /* Clear sequence */ 119688364387SHung-ying Tyan EC_KEYSCAN_SEQ_ADD = 2, /* Add item to sequence */ 119788364387SHung-ying Tyan EC_KEYSCAN_SEQ_START = 3, /* Start running sequence */ 119888364387SHung-ying Tyan EC_KEYSCAN_SEQ_COLLECT = 4, /* Collect sequence summary data */ 119988364387SHung-ying Tyan }; 120088364387SHung-ying Tyan 120188364387SHung-ying Tyan enum ec_collect_flags { 120288364387SHung-ying Tyan /* 120388364387SHung-ying Tyan * Indicates this scan was processed by the EC. Due to timing, some 120488364387SHung-ying Tyan * scans may be skipped. 120588364387SHung-ying Tyan */ 120688364387SHung-ying Tyan EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0, 120788364387SHung-ying Tyan }; 120888364387SHung-ying Tyan 120988364387SHung-ying Tyan struct ec_collect_item { 121088364387SHung-ying Tyan uint8_t flags; /* some flags (enum ec_collect_flags) */ 121188364387SHung-ying Tyan }; 121288364387SHung-ying Tyan 121388364387SHung-ying Tyan struct ec_params_keyscan_seq_ctrl { 121488364387SHung-ying Tyan uint8_t cmd; /* Command to send (enum ec_keyscan_seq_cmd) */ 121588364387SHung-ying Tyan union { 121688364387SHung-ying Tyan struct { 121788364387SHung-ying Tyan uint8_t active; /* still active */ 121888364387SHung-ying Tyan uint8_t num_items; /* number of items */ 121988364387SHung-ying Tyan /* Current item being presented */ 122088364387SHung-ying Tyan uint8_t cur_item; 122188364387SHung-ying Tyan } status; 122288364387SHung-ying Tyan struct { 122388364387SHung-ying Tyan /* 122488364387SHung-ying Tyan * Absolute time for this scan, measured from the 122588364387SHung-ying Tyan * start of the sequence. 122688364387SHung-ying Tyan */ 122788364387SHung-ying Tyan uint32_t time_us; 122888364387SHung-ying Tyan uint8_t scan[0]; /* keyscan data */ 122988364387SHung-ying Tyan } add; 123088364387SHung-ying Tyan struct { 123188364387SHung-ying Tyan uint8_t start_item; /* First item to return */ 123288364387SHung-ying Tyan uint8_t num_items; /* Number of items to return */ 123388364387SHung-ying Tyan } collect; 123488364387SHung-ying Tyan }; 123588364387SHung-ying Tyan } __packed; 123688364387SHung-ying Tyan 123788364387SHung-ying Tyan struct ec_result_keyscan_seq_ctrl { 123888364387SHung-ying Tyan union { 123988364387SHung-ying Tyan struct { 124088364387SHung-ying Tyan uint8_t num_items; /* Number of items */ 124188364387SHung-ying Tyan /* Data for each item */ 124288364387SHung-ying Tyan struct ec_collect_item item[0]; 124388364387SHung-ying Tyan } collect; 124488364387SHung-ying Tyan }; 124588364387SHung-ying Tyan } __packed; 124688364387SHung-ying Tyan 124788364387SHung-ying Tyan /*****************************************************************************/ 124888364387SHung-ying Tyan /* Temperature sensor commands */ 124988364387SHung-ying Tyan 125088364387SHung-ying Tyan /* Read temperature sensor info */ 125188364387SHung-ying Tyan #define EC_CMD_TEMP_SENSOR_GET_INFO 0x70 125288364387SHung-ying Tyan 125388364387SHung-ying Tyan struct ec_params_temp_sensor_get_info { 125488364387SHung-ying Tyan uint8_t id; 125588364387SHung-ying Tyan } __packed; 125688364387SHung-ying Tyan 125788364387SHung-ying Tyan struct ec_response_temp_sensor_get_info { 125888364387SHung-ying Tyan char sensor_name[32]; 125988364387SHung-ying Tyan uint8_t sensor_type; 126088364387SHung-ying Tyan } __packed; 126188364387SHung-ying Tyan 126288364387SHung-ying Tyan /*****************************************************************************/ 126388364387SHung-ying Tyan 126488364387SHung-ying Tyan /* 126588364387SHung-ying Tyan * Note: host commands 0x80 - 0x87 are reserved to avoid conflict with ACPI 126688364387SHung-ying Tyan * commands accidentally sent to the wrong interface. See the ACPI section 126788364387SHung-ying Tyan * below. 126888364387SHung-ying Tyan */ 126988364387SHung-ying Tyan 127088364387SHung-ying Tyan /*****************************************************************************/ 127188364387SHung-ying Tyan /* Host event commands */ 127288364387SHung-ying Tyan 127388364387SHung-ying Tyan /* 127488364387SHung-ying Tyan * Host event mask params and response structures, shared by all of the host 127588364387SHung-ying Tyan * event commands below. 127688364387SHung-ying Tyan */ 127788364387SHung-ying Tyan struct ec_params_host_event_mask { 127888364387SHung-ying Tyan uint32_t mask; 127988364387SHung-ying Tyan } __packed; 128088364387SHung-ying Tyan 128188364387SHung-ying Tyan struct ec_response_host_event_mask { 128288364387SHung-ying Tyan uint32_t mask; 128388364387SHung-ying Tyan } __packed; 128488364387SHung-ying Tyan 128588364387SHung-ying Tyan /* These all use ec_response_host_event_mask */ 128688364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_B 0x87 128788364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x88 128888364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x89 128988364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x8d 129088364387SHung-ying Tyan 129188364387SHung-ying Tyan /* These all use ec_params_host_event_mask */ 129288364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x8a 129388364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x8b 129488364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_CLEAR 0x8c 129588364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x8e 129688364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_CLEAR_B 0x8f 129788364387SHung-ying Tyan 129888364387SHung-ying Tyan /*****************************************************************************/ 129988364387SHung-ying Tyan /* Switch commands */ 130088364387SHung-ying Tyan 130188364387SHung-ying Tyan /* Enable/disable LCD backlight */ 130288364387SHung-ying Tyan #define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x90 130388364387SHung-ying Tyan 130488364387SHung-ying Tyan struct ec_params_switch_enable_backlight { 130588364387SHung-ying Tyan uint8_t enabled; 130688364387SHung-ying Tyan } __packed; 130788364387SHung-ying Tyan 130888364387SHung-ying Tyan /* Enable/disable WLAN/Bluetooth */ 130988364387SHung-ying Tyan #define EC_CMD_SWITCH_ENABLE_WIRELESS 0x91 131088364387SHung-ying Tyan 131188364387SHung-ying Tyan struct ec_params_switch_enable_wireless { 131288364387SHung-ying Tyan uint8_t enabled; 131388364387SHung-ying Tyan } __packed; 131488364387SHung-ying Tyan 131588364387SHung-ying Tyan /*****************************************************************************/ 131688364387SHung-ying Tyan /* GPIO commands. Only available on EC if write protect has been disabled. */ 131788364387SHung-ying Tyan 131888364387SHung-ying Tyan /* Set GPIO output value */ 131988364387SHung-ying Tyan #define EC_CMD_GPIO_SET 0x92 132088364387SHung-ying Tyan 132188364387SHung-ying Tyan struct ec_params_gpio_set { 132288364387SHung-ying Tyan char name[32]; 132388364387SHung-ying Tyan uint8_t val; 132488364387SHung-ying Tyan } __packed; 132588364387SHung-ying Tyan 132688364387SHung-ying Tyan /* Get GPIO value */ 132788364387SHung-ying Tyan #define EC_CMD_GPIO_GET 0x93 132888364387SHung-ying Tyan 132988364387SHung-ying Tyan struct ec_params_gpio_get { 133088364387SHung-ying Tyan char name[32]; 133188364387SHung-ying Tyan } __packed; 133288364387SHung-ying Tyan struct ec_response_gpio_get { 133388364387SHung-ying Tyan uint8_t val; 133488364387SHung-ying Tyan } __packed; 133588364387SHung-ying Tyan 133688364387SHung-ying Tyan /*****************************************************************************/ 133788364387SHung-ying Tyan /* I2C commands. Only available when flash write protect is unlocked. */ 133888364387SHung-ying Tyan 133988364387SHung-ying Tyan /* Read I2C bus */ 134088364387SHung-ying Tyan #define EC_CMD_I2C_READ 0x94 134188364387SHung-ying Tyan 134288364387SHung-ying Tyan struct ec_params_i2c_read { 1343836bb6e8SSimon Glass uint16_t addr; /* 8-bit address (7-bit shifted << 1) */ 134488364387SHung-ying Tyan uint8_t read_size; /* Either 8 or 16. */ 134588364387SHung-ying Tyan uint8_t port; 134688364387SHung-ying Tyan uint8_t offset; 134788364387SHung-ying Tyan } __packed; 134888364387SHung-ying Tyan struct ec_response_i2c_read { 134988364387SHung-ying Tyan uint16_t data; 135088364387SHung-ying Tyan } __packed; 135188364387SHung-ying Tyan 135288364387SHung-ying Tyan /* Write I2C bus */ 135388364387SHung-ying Tyan #define EC_CMD_I2C_WRITE 0x95 135488364387SHung-ying Tyan 135588364387SHung-ying Tyan struct ec_params_i2c_write { 135688364387SHung-ying Tyan uint16_t data; 1357836bb6e8SSimon Glass uint16_t addr; /* 8-bit address (7-bit shifted << 1) */ 135888364387SHung-ying Tyan uint8_t write_size; /* Either 8 or 16. */ 135988364387SHung-ying Tyan uint8_t port; 136088364387SHung-ying Tyan uint8_t offset; 136188364387SHung-ying Tyan } __packed; 136288364387SHung-ying Tyan 136388364387SHung-ying Tyan /*****************************************************************************/ 136488364387SHung-ying Tyan /* Charge state commands. Only available when flash write protect unlocked. */ 136588364387SHung-ying Tyan 136688364387SHung-ying Tyan /* Force charge state machine to stop in idle mode */ 136788364387SHung-ying Tyan #define EC_CMD_CHARGE_FORCE_IDLE 0x96 136888364387SHung-ying Tyan 136988364387SHung-ying Tyan struct ec_params_force_idle { 137088364387SHung-ying Tyan uint8_t enabled; 137188364387SHung-ying Tyan } __packed; 137288364387SHung-ying Tyan 137388364387SHung-ying Tyan /*****************************************************************************/ 137488364387SHung-ying Tyan /* Console commands. Only available when flash write protect is unlocked. */ 137588364387SHung-ying Tyan 137688364387SHung-ying Tyan /* Snapshot console output buffer for use by EC_CMD_CONSOLE_READ. */ 137788364387SHung-ying Tyan #define EC_CMD_CONSOLE_SNAPSHOT 0x97 137888364387SHung-ying Tyan 137988364387SHung-ying Tyan /* 138088364387SHung-ying Tyan * Read next chunk of data from saved snapshot. 138188364387SHung-ying Tyan * 138288364387SHung-ying Tyan * Response is null-terminated string. Empty string, if there is no more 138388364387SHung-ying Tyan * remaining output. 138488364387SHung-ying Tyan */ 138588364387SHung-ying Tyan #define EC_CMD_CONSOLE_READ 0x98 138688364387SHung-ying Tyan 138788364387SHung-ying Tyan /*****************************************************************************/ 138888364387SHung-ying Tyan 138988364387SHung-ying Tyan /* 139088364387SHung-ying Tyan * Cut off battery power output if the battery supports. 139188364387SHung-ying Tyan * 139288364387SHung-ying Tyan * For unsupported battery, just don't implement this command and lets EC 139388364387SHung-ying Tyan * return EC_RES_INVALID_COMMAND. 139488364387SHung-ying Tyan */ 139588364387SHung-ying Tyan #define EC_CMD_BATTERY_CUT_OFF 0x99 139688364387SHung-ying Tyan 139788364387SHung-ying Tyan /*****************************************************************************/ 139888364387SHung-ying Tyan /* USB port mux control. */ 139988364387SHung-ying Tyan 140088364387SHung-ying Tyan /* 140188364387SHung-ying Tyan * Switch USB mux or return to automatic switching. 140288364387SHung-ying Tyan */ 140388364387SHung-ying Tyan #define EC_CMD_USB_MUX 0x9a 140488364387SHung-ying Tyan 140588364387SHung-ying Tyan struct ec_params_usb_mux { 140688364387SHung-ying Tyan uint8_t mux; 140788364387SHung-ying Tyan } __packed; 140888364387SHung-ying Tyan 140988364387SHung-ying Tyan /*****************************************************************************/ 141088364387SHung-ying Tyan /* LDOs / FETs control. */ 141188364387SHung-ying Tyan 141288364387SHung-ying Tyan enum ec_ldo_state { 141388364387SHung-ying Tyan EC_LDO_STATE_OFF = 0, /* the LDO / FET is shut down */ 141488364387SHung-ying Tyan EC_LDO_STATE_ON = 1, /* the LDO / FET is ON / providing power */ 141588364387SHung-ying Tyan }; 141688364387SHung-ying Tyan 141788364387SHung-ying Tyan /* 141888364387SHung-ying Tyan * Switch on/off a LDO. 141988364387SHung-ying Tyan */ 142088364387SHung-ying Tyan #define EC_CMD_LDO_SET 0x9b 142188364387SHung-ying Tyan 142288364387SHung-ying Tyan struct ec_params_ldo_set { 142388364387SHung-ying Tyan uint8_t index; 142488364387SHung-ying Tyan uint8_t state; 142588364387SHung-ying Tyan } __packed; 142688364387SHung-ying Tyan 142788364387SHung-ying Tyan /* 142888364387SHung-ying Tyan * Get LDO state. 142988364387SHung-ying Tyan */ 143088364387SHung-ying Tyan #define EC_CMD_LDO_GET 0x9c 143188364387SHung-ying Tyan 143288364387SHung-ying Tyan struct ec_params_ldo_get { 143388364387SHung-ying Tyan uint8_t index; 143488364387SHung-ying Tyan } __packed; 143588364387SHung-ying Tyan 143688364387SHung-ying Tyan struct ec_response_ldo_get { 143788364387SHung-ying Tyan uint8_t state; 143888364387SHung-ying Tyan } __packed; 143988364387SHung-ying Tyan 144088364387SHung-ying Tyan /*****************************************************************************/ 1441836bb6e8SSimon Glass /* Power info. */ 1442836bb6e8SSimon Glass 1443836bb6e8SSimon Glass /* 1444836bb6e8SSimon Glass * Get power info. 1445836bb6e8SSimon Glass */ 1446836bb6e8SSimon Glass #define EC_CMD_POWER_INFO 0x9d 1447836bb6e8SSimon Glass 1448836bb6e8SSimon Glass struct ec_response_power_info { 1449836bb6e8SSimon Glass uint32_t usb_dev_type; 1450836bb6e8SSimon Glass uint16_t voltage_ac; 1451836bb6e8SSimon Glass uint16_t voltage_system; 1452836bb6e8SSimon Glass uint16_t current_system; 1453836bb6e8SSimon Glass uint16_t usb_current_limit; 1454836bb6e8SSimon Glass } __packed; 1455836bb6e8SSimon Glass 1456836bb6e8SSimon Glass /*****************************************************************************/ 1457836bb6e8SSimon Glass /* I2C passthru command */ 1458836bb6e8SSimon Glass 1459836bb6e8SSimon Glass #define EC_CMD_I2C_PASSTHRU 0x9e 1460836bb6e8SSimon Glass 1461836bb6e8SSimon Glass /* Slave address is 10 (not 7) bit */ 1462836bb6e8SSimon Glass #define EC_I2C_FLAG_10BIT (1 << 16) 1463836bb6e8SSimon Glass 1464836bb6e8SSimon Glass /* Read data; if not present, message is a write */ 1465836bb6e8SSimon Glass #define EC_I2C_FLAG_READ (1 << 15) 1466836bb6e8SSimon Glass 1467836bb6e8SSimon Glass /* Mask for address */ 1468836bb6e8SSimon Glass #define EC_I2C_ADDR_MASK 0x3ff 1469836bb6e8SSimon Glass 1470836bb6e8SSimon Glass #define EC_I2C_STATUS_NAK (1 << 0) /* Transfer was not acknowledged */ 1471836bb6e8SSimon Glass #define EC_I2C_STATUS_TIMEOUT (1 << 1) /* Timeout during transfer */ 1472836bb6e8SSimon Glass 1473836bb6e8SSimon Glass /* Any error */ 1474836bb6e8SSimon Glass #define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT) 1475836bb6e8SSimon Glass 1476836bb6e8SSimon Glass struct ec_params_i2c_passthru_msg { 1477836bb6e8SSimon Glass uint16_t addr_flags; /* I2C slave address (7 or 10 bits) and flags */ 1478836bb6e8SSimon Glass uint16_t len; /* Number of bytes to read or write */ 1479836bb6e8SSimon Glass } __packed; 1480836bb6e8SSimon Glass 1481836bb6e8SSimon Glass struct ec_params_i2c_passthru { 1482836bb6e8SSimon Glass uint8_t port; /* I2C port number */ 1483836bb6e8SSimon Glass uint8_t num_msgs; /* Number of messages */ 1484836bb6e8SSimon Glass struct ec_params_i2c_passthru_msg msg[]; 1485836bb6e8SSimon Glass /* Data to write for all messages is concatenated here */ 1486836bb6e8SSimon Glass } __packed; 1487836bb6e8SSimon Glass 1488836bb6e8SSimon Glass struct ec_response_i2c_passthru { 1489836bb6e8SSimon Glass uint8_t i2c_status; /* Status flags (EC_I2C_STATUS_...) */ 1490836bb6e8SSimon Glass uint8_t num_msgs; /* Number of messages processed */ 1491836bb6e8SSimon Glass uint8_t data[]; /* Data read by messages concatenated here */ 1492836bb6e8SSimon Glass } __packed; 1493836bb6e8SSimon Glass 1494836bb6e8SSimon Glass 1495836bb6e8SSimon Glass /*****************************************************************************/ 149688364387SHung-ying Tyan /* Temporary debug commands. TODO: remove this crosbug.com/p/13849 */ 149788364387SHung-ying Tyan 149888364387SHung-ying Tyan /* 149988364387SHung-ying Tyan * Dump charge state machine context. 150088364387SHung-ying Tyan * 150188364387SHung-ying Tyan * Response is a binary dump of charge state machine context. 150288364387SHung-ying Tyan */ 150388364387SHung-ying Tyan #define EC_CMD_CHARGE_DUMP 0xa0 150488364387SHung-ying Tyan 150588364387SHung-ying Tyan /* 150688364387SHung-ying Tyan * Set maximum battery charging current. 150788364387SHung-ying Tyan */ 150888364387SHung-ying Tyan #define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1 150988364387SHung-ying Tyan 151088364387SHung-ying Tyan struct ec_params_current_limit { 1511836bb6e8SSimon Glass uint32_t limit; /* in mA */ 1512836bb6e8SSimon Glass } __packed; 1513836bb6e8SSimon Glass 1514836bb6e8SSimon Glass /* 1515836bb6e8SSimon Glass * Set maximum external power current. 1516836bb6e8SSimon Glass */ 1517836bb6e8SSimon Glass #define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2 1518836bb6e8SSimon Glass 1519836bb6e8SSimon Glass struct ec_params_ext_power_current_limit { 1520836bb6e8SSimon Glass uint32_t limit; /* in mA */ 152188364387SHung-ying Tyan } __packed; 152288364387SHung-ying Tyan 152388364387SHung-ying Tyan /*****************************************************************************/ 152488364387SHung-ying Tyan /* Smart battery pass-through */ 152588364387SHung-ying Tyan 152688364387SHung-ying Tyan /* Get / Set 16-bit smart battery registers */ 152788364387SHung-ying Tyan #define EC_CMD_SB_READ_WORD 0xb0 152888364387SHung-ying Tyan #define EC_CMD_SB_WRITE_WORD 0xb1 152988364387SHung-ying Tyan 153088364387SHung-ying Tyan /* Get / Set string smart battery parameters 153188364387SHung-ying Tyan * formatted as SMBUS "block". 153288364387SHung-ying Tyan */ 153388364387SHung-ying Tyan #define EC_CMD_SB_READ_BLOCK 0xb2 153488364387SHung-ying Tyan #define EC_CMD_SB_WRITE_BLOCK 0xb3 153588364387SHung-ying Tyan 153688364387SHung-ying Tyan struct ec_params_sb_rd { 153788364387SHung-ying Tyan uint8_t reg; 153888364387SHung-ying Tyan } __packed; 153988364387SHung-ying Tyan 154088364387SHung-ying Tyan struct ec_response_sb_rd_word { 154188364387SHung-ying Tyan uint16_t value; 154288364387SHung-ying Tyan } __packed; 154388364387SHung-ying Tyan 154488364387SHung-ying Tyan struct ec_params_sb_wr_word { 154588364387SHung-ying Tyan uint8_t reg; 154688364387SHung-ying Tyan uint16_t value; 154788364387SHung-ying Tyan } __packed; 154888364387SHung-ying Tyan 154988364387SHung-ying Tyan struct ec_response_sb_rd_block { 155088364387SHung-ying Tyan uint8_t data[32]; 155188364387SHung-ying Tyan } __packed; 155288364387SHung-ying Tyan 155388364387SHung-ying Tyan struct ec_params_sb_wr_block { 155488364387SHung-ying Tyan uint8_t reg; 155588364387SHung-ying Tyan uint16_t data[32]; 155688364387SHung-ying Tyan } __packed; 155788364387SHung-ying Tyan 1558*b5279249SSimon Glass /* 1559*b5279249SSimon Glass * Entering Verified Boot Mode Command 1560*b5279249SSimon Glass * Default mode is VBOOT_MODE_NORMAL if EC did not receive this command. 1561*b5279249SSimon Glass * Valid Modes are: normal, developer, and recovery. 1562*b5279249SSimon Glass */ 1563*b5279249SSimon Glass #define EC_CMD_ENTERING_MODE 0xb6 1564*b5279249SSimon Glass 1565*b5279249SSimon Glass struct ec_params_entering_mode { 1566*b5279249SSimon Glass int vboot_mode; 1567*b5279249SSimon Glass } __packed; 1568*b5279249SSimon Glass 1569*b5279249SSimon Glass #define VBOOT_MODE_NORMAL 0 1570*b5279249SSimon Glass #define VBOOT_MODE_DEVELOPER 1 1571*b5279249SSimon Glass #define VBOOT_MODE_RECOVERY 2 1572*b5279249SSimon Glass 157388364387SHung-ying Tyan /*****************************************************************************/ 157488364387SHung-ying Tyan /* System commands */ 157588364387SHung-ying Tyan 157688364387SHung-ying Tyan /* 157788364387SHung-ying Tyan * TODO: this is a confusing name, since it doesn't necessarily reboot the EC. 157888364387SHung-ying Tyan * Rename to "set image" or something similar. 157988364387SHung-ying Tyan */ 158088364387SHung-ying Tyan #define EC_CMD_REBOOT_EC 0xd2 158188364387SHung-ying Tyan 158288364387SHung-ying Tyan /* Command */ 158388364387SHung-ying Tyan enum ec_reboot_cmd { 158488364387SHung-ying Tyan EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */ 158588364387SHung-ying Tyan EC_REBOOT_JUMP_RO = 1, /* Jump to RO without rebooting */ 158688364387SHung-ying Tyan EC_REBOOT_JUMP_RW = 2, /* Jump to RW without rebooting */ 158788364387SHung-ying Tyan /* (command 3 was jump to RW-B) */ 158888364387SHung-ying Tyan EC_REBOOT_COLD = 4, /* Cold-reboot */ 158988364387SHung-ying Tyan EC_REBOOT_DISABLE_JUMP = 5, /* Disable jump until next reboot */ 159088364387SHung-ying Tyan EC_REBOOT_HIBERNATE = 6 /* Hibernate EC */ 159188364387SHung-ying Tyan }; 159288364387SHung-ying Tyan 159388364387SHung-ying Tyan /* Flags for ec_params_reboot_ec.reboot_flags */ 159488364387SHung-ying Tyan #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */ 159588364387SHung-ying Tyan #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */ 159688364387SHung-ying Tyan 159788364387SHung-ying Tyan struct ec_params_reboot_ec { 159888364387SHung-ying Tyan uint8_t cmd; /* enum ec_reboot_cmd */ 159988364387SHung-ying Tyan uint8_t flags; /* See EC_REBOOT_FLAG_* */ 160088364387SHung-ying Tyan } __packed; 160188364387SHung-ying Tyan 160288364387SHung-ying Tyan /* 160388364387SHung-ying Tyan * Get information on last EC panic. 160488364387SHung-ying Tyan * 160588364387SHung-ying Tyan * Returns variable-length platform-dependent panic information. See panic.h 160688364387SHung-ying Tyan * for details. 160788364387SHung-ying Tyan */ 160888364387SHung-ying Tyan #define EC_CMD_GET_PANIC_INFO 0xd3 160988364387SHung-ying Tyan 161088364387SHung-ying Tyan /*****************************************************************************/ 161188364387SHung-ying Tyan /* 161288364387SHung-ying Tyan * ACPI commands 161388364387SHung-ying Tyan * 161488364387SHung-ying Tyan * These are valid ONLY on the ACPI command/data port. 161588364387SHung-ying Tyan */ 161688364387SHung-ying Tyan 161788364387SHung-ying Tyan /* 161888364387SHung-ying Tyan * ACPI Read Embedded Controller 161988364387SHung-ying Tyan * 162088364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 162188364387SHung-ying Tyan * 162288364387SHung-ying Tyan * Use the following sequence: 162388364387SHung-ying Tyan * 162488364387SHung-ying Tyan * - Write EC_CMD_ACPI_READ to EC_LPC_ADDR_ACPI_CMD 162588364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 162688364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 162788364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_DATA bit to set 162888364387SHung-ying Tyan * - Read value from EC_LPC_ADDR_ACPI_DATA 162988364387SHung-ying Tyan */ 163088364387SHung-ying Tyan #define EC_CMD_ACPI_READ 0x80 163188364387SHung-ying Tyan 163288364387SHung-ying Tyan /* 163388364387SHung-ying Tyan * ACPI Write Embedded Controller 163488364387SHung-ying Tyan * 163588364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 163688364387SHung-ying Tyan * 163788364387SHung-ying Tyan * Use the following sequence: 163888364387SHung-ying Tyan * 163988364387SHung-ying Tyan * - Write EC_CMD_ACPI_WRITE to EC_LPC_ADDR_ACPI_CMD 164088364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 164188364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 164288364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 164388364387SHung-ying Tyan * - Write value to EC_LPC_ADDR_ACPI_DATA 164488364387SHung-ying Tyan */ 164588364387SHung-ying Tyan #define EC_CMD_ACPI_WRITE 0x81 164688364387SHung-ying Tyan 164788364387SHung-ying Tyan /* 164888364387SHung-ying Tyan * ACPI Query Embedded Controller 164988364387SHung-ying Tyan * 165088364387SHung-ying Tyan * This clears the lowest-order bit in the currently pending host events, and 165188364387SHung-ying Tyan * sets the result code to the 1-based index of the bit (event 0x00000001 = 1, 165288364387SHung-ying Tyan * event 0x80000000 = 32), or 0 if no event was pending. 165388364387SHung-ying Tyan */ 165488364387SHung-ying Tyan #define EC_CMD_ACPI_QUERY_EVENT 0x84 165588364387SHung-ying Tyan 165688364387SHung-ying Tyan /* Valid addresses in ACPI memory space, for read/write commands */ 165788364387SHung-ying Tyan /* Memory space version; set to EC_ACPI_MEM_VERSION_CURRENT */ 165888364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION 0x00 165988364387SHung-ying Tyan /* 166088364387SHung-ying Tyan * Test location; writing value here updates test compliment byte to (0xff - 166188364387SHung-ying Tyan * value). 166288364387SHung-ying Tyan */ 166388364387SHung-ying Tyan #define EC_ACPI_MEM_TEST 0x01 166488364387SHung-ying Tyan /* Test compliment; writes here are ignored. */ 166588364387SHung-ying Tyan #define EC_ACPI_MEM_TEST_COMPLIMENT 0x02 166688364387SHung-ying Tyan /* Keyboard backlight brightness percent (0 - 100) */ 166788364387SHung-ying Tyan #define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03 166888364387SHung-ying Tyan 166988364387SHung-ying Tyan /* Current version of ACPI memory address space */ 167088364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION_CURRENT 1 167188364387SHung-ying Tyan 167288364387SHung-ying Tyan 167388364387SHung-ying Tyan /*****************************************************************************/ 167488364387SHung-ying Tyan /* 167588364387SHung-ying Tyan * Special commands 167688364387SHung-ying Tyan * 167788364387SHung-ying Tyan * These do not follow the normal rules for commands. See each command for 167888364387SHung-ying Tyan * details. 167988364387SHung-ying Tyan */ 168088364387SHung-ying Tyan 168188364387SHung-ying Tyan /* 168288364387SHung-ying Tyan * Reboot NOW 168388364387SHung-ying Tyan * 168488364387SHung-ying Tyan * This command will work even when the EC LPC interface is busy, because the 168588364387SHung-ying Tyan * reboot command is processed at interrupt level. Note that when the EC 168688364387SHung-ying Tyan * reboots, the host will reboot too, so there is no response to this command. 168788364387SHung-ying Tyan * 168888364387SHung-ying Tyan * Use EC_CMD_REBOOT_EC to reboot the EC more politely. 168988364387SHung-ying Tyan */ 169088364387SHung-ying Tyan #define EC_CMD_REBOOT 0xd1 /* Think "die" */ 169188364387SHung-ying Tyan 169288364387SHung-ying Tyan /* 169388364387SHung-ying Tyan * Resend last response (not supported on LPC). 169488364387SHung-ying Tyan * 169588364387SHung-ying Tyan * Returns EC_RES_UNAVAILABLE if there is no response available - for example, 169688364387SHung-ying Tyan * there was no previous command, or the previous command's response was too 169788364387SHung-ying Tyan * big to save. 169888364387SHung-ying Tyan */ 169988364387SHung-ying Tyan #define EC_CMD_RESEND_RESPONSE 0xdb 170088364387SHung-ying Tyan 170188364387SHung-ying Tyan /* 170288364387SHung-ying Tyan * This header byte on a command indicate version 0. Any header byte less 170388364387SHung-ying Tyan * than this means that we are talking to an old EC which doesn't support 170488364387SHung-ying Tyan * versioning. In that case, we assume version 0. 170588364387SHung-ying Tyan * 170688364387SHung-ying Tyan * Header bytes greater than this indicate a later version. For example, 170788364387SHung-ying Tyan * EC_CMD_VERSION0 + 1 means we are using version 1. 170888364387SHung-ying Tyan * 170988364387SHung-ying Tyan * The old EC interface must not use commands 0dc or higher. 171088364387SHung-ying Tyan */ 171188364387SHung-ying Tyan #define EC_CMD_VERSION0 0xdc 171288364387SHung-ying Tyan 171388364387SHung-ying Tyan #endif /* !__ACPI__ */ 171488364387SHung-ying Tyan 171588364387SHung-ying Tyan #endif /* __CROS_EC_COMMANDS_H */ 1716