1*836bb6e8SSimon 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 */ 45*836bb6e8SSimon Glass /* Protocol version 2 */ 46*836bb6e8SSimon Glass #define EC_LPC_ADDR_HOST_ARGS 0x800 /* And 0x801, 0x802, 0x803 */ 47*836bb6e8SSimon Glass #define EC_LPC_ADDR_HOST_PARAM 0x804 /* For version 2 params; size is 48*836bb6e8SSimon Glass * EC_PROTO2_MAX_PARAM_SIZE */ 49*836bb6e8SSimon Glass /* Protocol version 3 */ 50*836bb6e8SSimon Glass #define EC_LPC_ADDR_HOST_PACKET 0x800 /* Offset of version 3 packet */ 51*836bb6e8SSimon Glass #define EC_LPC_HOST_PACKET_SIZE 0x100 /* Max size of version 3 packet */ 5288364387SHung-ying Tyan 53*836bb6e8SSimon Glass /* The actual block is 0x800-0x8ff, but some BIOSes think it's 0x880-0x8ff 54*836bb6e8SSimon Glass * and they tell the kernel that so we have to think of it as two parts. */ 55*836bb6e8SSimon Glass #define EC_HOST_CMD_REGION0 0x800 56*836bb6e8SSimon Glass #define EC_HOST_CMD_REGION1 0x880 57*836bb6e8SSimon 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 131*836bb6e8SSimon Glass /* Was recovery requested via keyboard; now unused. */ 132*836bb6e8SSimon 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 141*836bb6e8SSimon Glass /* Host command interface supports version 3 protocol */ 142*836bb6e8SSimon 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 147*836bb6e8SSimon 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 */ 203*836bb6e8SSimon Glass EC_RES_INVALID_HEADER = 12, /* Header contains invalid data */ 204*836bb6e8SSimon Glass EC_RES_REQUEST_TRUNCATED = 13, /* Didn't get the entire request */ 205*836bb6e8SSimon 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 287*836bb6e8SSimon Glass /*****************************************************************************/ 288*836bb6e8SSimon Glass 289*836bb6e8SSimon Glass /* 290*836bb6e8SSimon Glass * Protocol version 2 for I2C and SPI send a request this way: 291*836bb6e8SSimon Glass * 292*836bb6e8SSimon Glass * 0 EC_CMD_VERSION0 + (command version) 293*836bb6e8SSimon Glass * 1 Command number 294*836bb6e8SSimon Glass * 2 Length of params = N 295*836bb6e8SSimon Glass * 3..N+2 Params, if any 296*836bb6e8SSimon Glass * N+3 8-bit checksum of bytes 0..N+2 297*836bb6e8SSimon Glass * 298*836bb6e8SSimon Glass * The corresponding response is: 299*836bb6e8SSimon Glass * 300*836bb6e8SSimon Glass * 0 Result code (EC_RES_*) 301*836bb6e8SSimon Glass * 1 Length of params = M 302*836bb6e8SSimon Glass * 2..M+1 Params, if any 303*836bb6e8SSimon Glass * M+2 8-bit checksum of bytes 0..M+1 304*836bb6e8SSimon Glass */ 305*836bb6e8SSimon Glass #define EC_PROTO2_REQUEST_HEADER_BYTES 3 306*836bb6e8SSimon Glass #define EC_PROTO2_REQUEST_TRAILER_BYTES 1 307*836bb6e8SSimon Glass #define EC_PROTO2_REQUEST_OVERHEAD (EC_PROTO2_REQUEST_HEADER_BYTES + \ 308*836bb6e8SSimon Glass EC_PROTO2_REQUEST_TRAILER_BYTES) 309*836bb6e8SSimon Glass 310*836bb6e8SSimon Glass #define EC_PROTO2_RESPONSE_HEADER_BYTES 2 311*836bb6e8SSimon Glass #define EC_PROTO2_RESPONSE_TRAILER_BYTES 1 312*836bb6e8SSimon Glass #define EC_PROTO2_RESPONSE_OVERHEAD (EC_PROTO2_RESPONSE_HEADER_BYTES + \ 313*836bb6e8SSimon Glass EC_PROTO2_RESPONSE_TRAILER_BYTES) 314*836bb6e8SSimon Glass 315*836bb6e8SSimon Glass /* Parameter length was limited by the LPC interface */ 316*836bb6e8SSimon Glass #define EC_PROTO2_MAX_PARAM_SIZE 0xfc 317*836bb6e8SSimon Glass 318*836bb6e8SSimon Glass /* Maximum request and response packet sizes for protocol version 2 */ 319*836bb6e8SSimon Glass #define EC_PROTO2_MAX_REQUEST_SIZE (EC_PROTO2_REQUEST_OVERHEAD + \ 320*836bb6e8SSimon Glass EC_PROTO2_MAX_PARAM_SIZE) 321*836bb6e8SSimon Glass #define EC_PROTO2_MAX_RESPONSE_SIZE (EC_PROTO2_RESPONSE_OVERHEAD + \ 322*836bb6e8SSimon Glass EC_PROTO2_MAX_PARAM_SIZE) 323*836bb6e8SSimon Glass 324*836bb6e8SSimon Glass /*****************************************************************************/ 325*836bb6e8SSimon Glass 326*836bb6e8SSimon Glass /* 327*836bb6e8SSimon Glass * Value written to legacy command port / prefix byte to indicate protocol 328*836bb6e8SSimon Glass * 3+ structs are being used. Usage is bus-dependent. 329*836bb6e8SSimon Glass */ 330*836bb6e8SSimon Glass #define EC_COMMAND_PROTOCOL_3 0xda 331*836bb6e8SSimon Glass 332*836bb6e8SSimon Glass #define EC_HOST_REQUEST_VERSION 3 333*836bb6e8SSimon Glass 334*836bb6e8SSimon Glass /* Version 3 request from host */ 335*836bb6e8SSimon Glass struct ec_host_request { 336*836bb6e8SSimon Glass /* Struct version (=3) 337*836bb6e8SSimon Glass * 338*836bb6e8SSimon Glass * EC will return EC_RES_INVALID_HEADER if it receives a header with a 339*836bb6e8SSimon Glass * version it doesn't know how to parse. 340*836bb6e8SSimon Glass */ 341*836bb6e8SSimon Glass uint8_t struct_version; 342*836bb6e8SSimon Glass 343*836bb6e8SSimon Glass /* 344*836bb6e8SSimon Glass * Checksum of request and data; sum of all bytes including checksum 345*836bb6e8SSimon Glass * should total to 0. 346*836bb6e8SSimon Glass */ 347*836bb6e8SSimon Glass uint8_t checksum; 348*836bb6e8SSimon Glass 349*836bb6e8SSimon Glass /* Command code */ 350*836bb6e8SSimon Glass uint16_t command; 351*836bb6e8SSimon Glass 352*836bb6e8SSimon Glass /* Command version */ 353*836bb6e8SSimon Glass uint8_t command_version; 354*836bb6e8SSimon Glass 355*836bb6e8SSimon Glass /* Unused byte in current protocol version; set to 0 */ 356*836bb6e8SSimon Glass uint8_t reserved; 357*836bb6e8SSimon Glass 358*836bb6e8SSimon Glass /* Length of data which follows this header */ 359*836bb6e8SSimon Glass uint16_t data_len; 360*836bb6e8SSimon Glass } __packed; 361*836bb6e8SSimon Glass 362*836bb6e8SSimon Glass #define EC_HOST_RESPONSE_VERSION 3 363*836bb6e8SSimon Glass 364*836bb6e8SSimon Glass /* Version 3 response from EC */ 365*836bb6e8SSimon Glass struct ec_host_response { 366*836bb6e8SSimon Glass /* Struct version (=3) */ 367*836bb6e8SSimon Glass uint8_t struct_version; 368*836bb6e8SSimon Glass 369*836bb6e8SSimon Glass /* 370*836bb6e8SSimon Glass * Checksum of response and data; sum of all bytes including checksum 371*836bb6e8SSimon Glass * should total to 0. 372*836bb6e8SSimon Glass */ 373*836bb6e8SSimon Glass uint8_t checksum; 374*836bb6e8SSimon Glass 375*836bb6e8SSimon Glass /* Result code (EC_RES_*) */ 376*836bb6e8SSimon Glass uint16_t result; 377*836bb6e8SSimon Glass 378*836bb6e8SSimon Glass /* Length of data which follows this header */ 379*836bb6e8SSimon Glass uint16_t data_len; 380*836bb6e8SSimon Glass 381*836bb6e8SSimon Glass /* Unused bytes in current protocol version; set to 0 */ 382*836bb6e8SSimon Glass uint16_t reserved; 383*836bb6e8SSimon Glass } __packed; 384*836bb6e8SSimon Glass 385*836bb6e8SSimon 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 525*836bb6e8SSimon Glass /* 526*836bb6e8SSimon Glass * Fake a variety of responses, purely for testing purposes. 527*836bb6e8SSimon Glass * FIXME: Would be nice to force checksum errors. 528*836bb6e8SSimon Glass */ 529*836bb6e8SSimon Glass #define EC_CMD_TEST_PROTOCOL 0x0a 530*836bb6e8SSimon Glass 531*836bb6e8SSimon Glass /* Tell the EC what to send back to us. */ 532*836bb6e8SSimon Glass struct ec_params_test_protocol { 533*836bb6e8SSimon Glass uint32_t ec_result; 534*836bb6e8SSimon Glass uint32_t ret_len; 535*836bb6e8SSimon Glass uint8_t buf[32]; 536*836bb6e8SSimon Glass } __packed; 537*836bb6e8SSimon Glass 538*836bb6e8SSimon Glass /* Here it comes... */ 539*836bb6e8SSimon Glass struct ec_response_test_protocol { 540*836bb6e8SSimon Glass uint8_t buf[32]; 541*836bb6e8SSimon Glass } __packed; 542*836bb6e8SSimon Glass 543*836bb6e8SSimon Glass /* Get prococol information */ 544*836bb6e8SSimon Glass #define EC_CMD_GET_PROTOCOL_INFO 0x0b 545*836bb6e8SSimon Glass 546*836bb6e8SSimon Glass /* Flags for ec_response_get_protocol_info.flags */ 547*836bb6e8SSimon Glass /* EC_RES_IN_PROGRESS may be returned if a command is slow */ 548*836bb6e8SSimon Glass #define EC_PROTOCOL_INFO_IN_PROGRESS_SUPPORTED (1 << 0) 549*836bb6e8SSimon Glass 550*836bb6e8SSimon Glass struct ec_response_get_protocol_info { 551*836bb6e8SSimon Glass /* Fields which exist if at least protocol version 3 supported */ 552*836bb6e8SSimon Glass 553*836bb6e8SSimon Glass /* Bitmask of protocol versions supported (1 << n means version n)*/ 554*836bb6e8SSimon Glass uint32_t protocol_versions; 555*836bb6e8SSimon Glass 556*836bb6e8SSimon Glass /* Maximum request packet size, in bytes */ 557*836bb6e8SSimon Glass uint16_t max_request_packet_size; 558*836bb6e8SSimon Glass 559*836bb6e8SSimon Glass /* Maximum response packet size, in bytes */ 560*836bb6e8SSimon Glass uint16_t max_response_packet_size; 561*836bb6e8SSimon Glass 562*836bb6e8SSimon Glass /* Flags; see EC_PROTOCOL_INFO_* */ 563*836bb6e8SSimon Glass uint32_t flags; 564*836bb6e8SSimon 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 606*836bb6e8SSimon Glass #define EC_VER_FLASH_WRITE 1 607*836bb6e8SSimon Glass 608*836bb6e8SSimon Glass /* Version 0 of the flash command supported only 64 bytes of data */ 609*836bb6e8SSimon 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 */ 614*836bb6e8SSimon 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 /*****************************************************************************/ 883*836bb6e8SSimon Glass /* LED control commands */ 884*836bb6e8SSimon Glass 885*836bb6e8SSimon Glass #define EC_CMD_LED_CONTROL 0x29 886*836bb6e8SSimon Glass 887*836bb6e8SSimon Glass enum ec_led_id { 888*836bb6e8SSimon Glass EC_LED_ID_BATTERY_LED = 0, 889*836bb6e8SSimon Glass EC_LED_ID_POWER_BUTTON_LED, 890*836bb6e8SSimon Glass EC_LED_ID_ADAPTER_LED, 891*836bb6e8SSimon Glass }; 892*836bb6e8SSimon Glass 893*836bb6e8SSimon Glass /* LED control flags */ 894*836bb6e8SSimon Glass #define EC_LED_FLAGS_QUERY (1 << 0) /* Query LED capability only */ 895*836bb6e8SSimon Glass #define EC_LED_FLAGS_AUTO (1 << 1) /* Switch LED back to automatic control */ 896*836bb6e8SSimon Glass 897*836bb6e8SSimon Glass enum ec_led_colors { 898*836bb6e8SSimon Glass EC_LED_COLOR_RED = 0, 899*836bb6e8SSimon Glass EC_LED_COLOR_GREEN, 900*836bb6e8SSimon Glass EC_LED_COLOR_BLUE, 901*836bb6e8SSimon Glass EC_LED_COLOR_YELLOW, 902*836bb6e8SSimon Glass EC_LED_COLOR_WHITE, 903*836bb6e8SSimon Glass 904*836bb6e8SSimon Glass EC_LED_COLOR_COUNT 905*836bb6e8SSimon Glass }; 906*836bb6e8SSimon Glass 907*836bb6e8SSimon Glass struct ec_params_led_control { 908*836bb6e8SSimon Glass uint8_t led_id; /* Which LED to control */ 909*836bb6e8SSimon Glass uint8_t flags; /* Control flags */ 910*836bb6e8SSimon Glass 911*836bb6e8SSimon Glass uint8_t brightness[EC_LED_COLOR_COUNT]; 912*836bb6e8SSimon Glass } __packed; 913*836bb6e8SSimon Glass 914*836bb6e8SSimon Glass struct ec_response_led_control { 915*836bb6e8SSimon Glass /* 916*836bb6e8SSimon Glass * Available brightness value range. 917*836bb6e8SSimon Glass * 918*836bb6e8SSimon Glass * Range 0 means color channel not present. 919*836bb6e8SSimon Glass * Range 1 means on/off control. 920*836bb6e8SSimon Glass * Other values means the LED is control by PWM. 921*836bb6e8SSimon Glass */ 922*836bb6e8SSimon Glass uint8_t brightness_range[EC_LED_COLOR_COUNT]; 923*836bb6e8SSimon Glass } __packed; 924*836bb6e8SSimon Glass 925*836bb6e8SSimon 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 /*****************************************************************************/ 1113*836bb6e8SSimon Glass /* MKBP - Matrix KeyBoard Protocol */ 111488364387SHung-ying Tyan 111588364387SHung-ying Tyan /* 111688364387SHung-ying Tyan * Read key state 111788364387SHung-ying Tyan * 1118*836bb6e8SSimon Glass * Returns raw data for keyboard cols; see ec_response_mkbp_info.cols for 111988364387SHung-ying Tyan * expected response size. 112088364387SHung-ying Tyan */ 1121*836bb6e8SSimon Glass #define EC_CMD_MKBP_STATE 0x60 112288364387SHung-ying Tyan 112388364387SHung-ying Tyan /* Provide information about the matrix : number of rows and columns */ 1124*836bb6e8SSimon Glass #define EC_CMD_MKBP_INFO 0x61 112588364387SHung-ying Tyan 1126*836bb6e8SSimon 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 */ 1133*836bb6e8SSimon Glass #define EC_CMD_MKBP_SIMULATE_KEY 0x62 113488364387SHung-ying Tyan 1135*836bb6e8SSimon 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 */ 1142*836bb6e8SSimon Glass #define EC_CMD_MKBP_SET_CONFIG 0x64 1143*836bb6e8SSimon Glass #define EC_CMD_MKBP_GET_CONFIG 0x65 114488364387SHung-ying Tyan 114588364387SHung-ying Tyan /* flags */ 1146*836bb6e8SSimon Glass enum mkbp_config_flags { 1147*836bb6e8SSimon Glass EC_MKBP_FLAGS_ENABLE = 1, /* Enable keyboard scanning */ 114888364387SHung-ying Tyan }; 114988364387SHung-ying Tyan 1150*836bb6e8SSimon Glass enum mkbp_config_valid { 1151*836bb6e8SSimon Glass EC_MKBP_VALID_SCAN_PERIOD = 1 << 0, 1152*836bb6e8SSimon Glass EC_MKBP_VALID_POLL_TIMEOUT = 1 << 1, 1153*836bb6e8SSimon Glass EC_MKBP_VALID_MIN_POST_SCAN_DELAY = 1 << 3, 1154*836bb6e8SSimon Glass EC_MKBP_VALID_OUTPUT_SETTLE = 1 << 4, 1155*836bb6e8SSimon Glass EC_MKBP_VALID_DEBOUNCE_DOWN = 1 << 5, 1156*836bb6e8SSimon Glass EC_MKBP_VALID_DEBOUNCE_UP = 1 << 6, 1157*836bb6e8SSimon Glass EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7, 115888364387SHung-ying Tyan }; 115988364387SHung-ying Tyan 116088364387SHung-ying Tyan /* Configuration for our key scanning algorithm */ 1161*836bb6e8SSimon Glass struct ec_mkbp_config { 116288364387SHung-ying Tyan uint32_t valid_mask; /* valid fields */ 1163*836bb6e8SSimon 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 1182*836bb6e8SSimon Glass struct ec_params_mkbp_set_config { 1183*836bb6e8SSimon Glass struct ec_mkbp_config config; 118488364387SHung-ying Tyan } __packed; 118588364387SHung-ying Tyan 1186*836bb6e8SSimon Glass struct ec_response_mkbp_get_config { 1187*836bb6e8SSimon 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 { 1343*836bb6e8SSimon 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; 1357*836bb6e8SSimon 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 /*****************************************************************************/ 1441*836bb6e8SSimon Glass /* Power info. */ 1442*836bb6e8SSimon Glass 1443*836bb6e8SSimon Glass /* 1444*836bb6e8SSimon Glass * Get power info. 1445*836bb6e8SSimon Glass */ 1446*836bb6e8SSimon Glass #define EC_CMD_POWER_INFO 0x9d 1447*836bb6e8SSimon Glass 1448*836bb6e8SSimon Glass struct ec_response_power_info { 1449*836bb6e8SSimon Glass uint32_t usb_dev_type; 1450*836bb6e8SSimon Glass uint16_t voltage_ac; 1451*836bb6e8SSimon Glass uint16_t voltage_system; 1452*836bb6e8SSimon Glass uint16_t current_system; 1453*836bb6e8SSimon Glass uint16_t usb_current_limit; 1454*836bb6e8SSimon Glass } __packed; 1455*836bb6e8SSimon Glass 1456*836bb6e8SSimon Glass /*****************************************************************************/ 1457*836bb6e8SSimon Glass /* I2C passthru command */ 1458*836bb6e8SSimon Glass 1459*836bb6e8SSimon Glass #define EC_CMD_I2C_PASSTHRU 0x9e 1460*836bb6e8SSimon Glass 1461*836bb6e8SSimon Glass /* Slave address is 10 (not 7) bit */ 1462*836bb6e8SSimon Glass #define EC_I2C_FLAG_10BIT (1 << 16) 1463*836bb6e8SSimon Glass 1464*836bb6e8SSimon Glass /* Read data; if not present, message is a write */ 1465*836bb6e8SSimon Glass #define EC_I2C_FLAG_READ (1 << 15) 1466*836bb6e8SSimon Glass 1467*836bb6e8SSimon Glass /* Mask for address */ 1468*836bb6e8SSimon Glass #define EC_I2C_ADDR_MASK 0x3ff 1469*836bb6e8SSimon Glass 1470*836bb6e8SSimon Glass #define EC_I2C_STATUS_NAK (1 << 0) /* Transfer was not acknowledged */ 1471*836bb6e8SSimon Glass #define EC_I2C_STATUS_TIMEOUT (1 << 1) /* Timeout during transfer */ 1472*836bb6e8SSimon Glass 1473*836bb6e8SSimon Glass /* Any error */ 1474*836bb6e8SSimon Glass #define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT) 1475*836bb6e8SSimon Glass 1476*836bb6e8SSimon Glass struct ec_params_i2c_passthru_msg { 1477*836bb6e8SSimon Glass uint16_t addr_flags; /* I2C slave address (7 or 10 bits) and flags */ 1478*836bb6e8SSimon Glass uint16_t len; /* Number of bytes to read or write */ 1479*836bb6e8SSimon Glass } __packed; 1480*836bb6e8SSimon Glass 1481*836bb6e8SSimon Glass struct ec_params_i2c_passthru { 1482*836bb6e8SSimon Glass uint8_t port; /* I2C port number */ 1483*836bb6e8SSimon Glass uint8_t num_msgs; /* Number of messages */ 1484*836bb6e8SSimon Glass struct ec_params_i2c_passthru_msg msg[]; 1485*836bb6e8SSimon Glass /* Data to write for all messages is concatenated here */ 1486*836bb6e8SSimon Glass } __packed; 1487*836bb6e8SSimon Glass 1488*836bb6e8SSimon Glass struct ec_response_i2c_passthru { 1489*836bb6e8SSimon Glass uint8_t i2c_status; /* Status flags (EC_I2C_STATUS_...) */ 1490*836bb6e8SSimon Glass uint8_t num_msgs; /* Number of messages processed */ 1491*836bb6e8SSimon Glass uint8_t data[]; /* Data read by messages concatenated here */ 1492*836bb6e8SSimon Glass } __packed; 1493*836bb6e8SSimon Glass 1494*836bb6e8SSimon Glass 1495*836bb6e8SSimon 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 { 1511*836bb6e8SSimon Glass uint32_t limit; /* in mA */ 1512*836bb6e8SSimon Glass } __packed; 1513*836bb6e8SSimon Glass 1514*836bb6e8SSimon Glass /* 1515*836bb6e8SSimon Glass * Set maximum external power current. 1516*836bb6e8SSimon Glass */ 1517*836bb6e8SSimon Glass #define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2 1518*836bb6e8SSimon Glass 1519*836bb6e8SSimon Glass struct ec_params_ext_power_current_limit { 1520*836bb6e8SSimon 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 155888364387SHung-ying Tyan /*****************************************************************************/ 155988364387SHung-ying Tyan /* System commands */ 156088364387SHung-ying Tyan 156188364387SHung-ying Tyan /* 156288364387SHung-ying Tyan * TODO: this is a confusing name, since it doesn't necessarily reboot the EC. 156388364387SHung-ying Tyan * Rename to "set image" or something similar. 156488364387SHung-ying Tyan */ 156588364387SHung-ying Tyan #define EC_CMD_REBOOT_EC 0xd2 156688364387SHung-ying Tyan 156788364387SHung-ying Tyan /* Command */ 156888364387SHung-ying Tyan enum ec_reboot_cmd { 156988364387SHung-ying Tyan EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */ 157088364387SHung-ying Tyan EC_REBOOT_JUMP_RO = 1, /* Jump to RO without rebooting */ 157188364387SHung-ying Tyan EC_REBOOT_JUMP_RW = 2, /* Jump to RW without rebooting */ 157288364387SHung-ying Tyan /* (command 3 was jump to RW-B) */ 157388364387SHung-ying Tyan EC_REBOOT_COLD = 4, /* Cold-reboot */ 157488364387SHung-ying Tyan EC_REBOOT_DISABLE_JUMP = 5, /* Disable jump until next reboot */ 157588364387SHung-ying Tyan EC_REBOOT_HIBERNATE = 6 /* Hibernate EC */ 157688364387SHung-ying Tyan }; 157788364387SHung-ying Tyan 157888364387SHung-ying Tyan /* Flags for ec_params_reboot_ec.reboot_flags */ 157988364387SHung-ying Tyan #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */ 158088364387SHung-ying Tyan #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */ 158188364387SHung-ying Tyan 158288364387SHung-ying Tyan struct ec_params_reboot_ec { 158388364387SHung-ying Tyan uint8_t cmd; /* enum ec_reboot_cmd */ 158488364387SHung-ying Tyan uint8_t flags; /* See EC_REBOOT_FLAG_* */ 158588364387SHung-ying Tyan } __packed; 158688364387SHung-ying Tyan 158788364387SHung-ying Tyan /* 158888364387SHung-ying Tyan * Get information on last EC panic. 158988364387SHung-ying Tyan * 159088364387SHung-ying Tyan * Returns variable-length platform-dependent panic information. See panic.h 159188364387SHung-ying Tyan * for details. 159288364387SHung-ying Tyan */ 159388364387SHung-ying Tyan #define EC_CMD_GET_PANIC_INFO 0xd3 159488364387SHung-ying Tyan 159588364387SHung-ying Tyan /*****************************************************************************/ 159688364387SHung-ying Tyan /* 159788364387SHung-ying Tyan * ACPI commands 159888364387SHung-ying Tyan * 159988364387SHung-ying Tyan * These are valid ONLY on the ACPI command/data port. 160088364387SHung-ying Tyan */ 160188364387SHung-ying Tyan 160288364387SHung-ying Tyan /* 160388364387SHung-ying Tyan * ACPI Read Embedded Controller 160488364387SHung-ying Tyan * 160588364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 160688364387SHung-ying Tyan * 160788364387SHung-ying Tyan * Use the following sequence: 160888364387SHung-ying Tyan * 160988364387SHung-ying Tyan * - Write EC_CMD_ACPI_READ to EC_LPC_ADDR_ACPI_CMD 161088364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 161188364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 161288364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_DATA bit to set 161388364387SHung-ying Tyan * - Read value from EC_LPC_ADDR_ACPI_DATA 161488364387SHung-ying Tyan */ 161588364387SHung-ying Tyan #define EC_CMD_ACPI_READ 0x80 161688364387SHung-ying Tyan 161788364387SHung-ying Tyan /* 161888364387SHung-ying Tyan * ACPI Write 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_WRITE 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_PENDING bit to clear 162888364387SHung-ying Tyan * - Write value to EC_LPC_ADDR_ACPI_DATA 162988364387SHung-ying Tyan */ 163088364387SHung-ying Tyan #define EC_CMD_ACPI_WRITE 0x81 163188364387SHung-ying Tyan 163288364387SHung-ying Tyan /* 163388364387SHung-ying Tyan * ACPI Query Embedded Controller 163488364387SHung-ying Tyan * 163588364387SHung-ying Tyan * This clears the lowest-order bit in the currently pending host events, and 163688364387SHung-ying Tyan * sets the result code to the 1-based index of the bit (event 0x00000001 = 1, 163788364387SHung-ying Tyan * event 0x80000000 = 32), or 0 if no event was pending. 163888364387SHung-ying Tyan */ 163988364387SHung-ying Tyan #define EC_CMD_ACPI_QUERY_EVENT 0x84 164088364387SHung-ying Tyan 164188364387SHung-ying Tyan /* Valid addresses in ACPI memory space, for read/write commands */ 164288364387SHung-ying Tyan /* Memory space version; set to EC_ACPI_MEM_VERSION_CURRENT */ 164388364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION 0x00 164488364387SHung-ying Tyan /* 164588364387SHung-ying Tyan * Test location; writing value here updates test compliment byte to (0xff - 164688364387SHung-ying Tyan * value). 164788364387SHung-ying Tyan */ 164888364387SHung-ying Tyan #define EC_ACPI_MEM_TEST 0x01 164988364387SHung-ying Tyan /* Test compliment; writes here are ignored. */ 165088364387SHung-ying Tyan #define EC_ACPI_MEM_TEST_COMPLIMENT 0x02 165188364387SHung-ying Tyan /* Keyboard backlight brightness percent (0 - 100) */ 165288364387SHung-ying Tyan #define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03 165388364387SHung-ying Tyan 165488364387SHung-ying Tyan /* Current version of ACPI memory address space */ 165588364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION_CURRENT 1 165688364387SHung-ying Tyan 165788364387SHung-ying Tyan 165888364387SHung-ying Tyan /*****************************************************************************/ 165988364387SHung-ying Tyan /* 166088364387SHung-ying Tyan * Special commands 166188364387SHung-ying Tyan * 166288364387SHung-ying Tyan * These do not follow the normal rules for commands. See each command for 166388364387SHung-ying Tyan * details. 166488364387SHung-ying Tyan */ 166588364387SHung-ying Tyan 166688364387SHung-ying Tyan /* 166788364387SHung-ying Tyan * Reboot NOW 166888364387SHung-ying Tyan * 166988364387SHung-ying Tyan * This command will work even when the EC LPC interface is busy, because the 167088364387SHung-ying Tyan * reboot command is processed at interrupt level. Note that when the EC 167188364387SHung-ying Tyan * reboots, the host will reboot too, so there is no response to this command. 167288364387SHung-ying Tyan * 167388364387SHung-ying Tyan * Use EC_CMD_REBOOT_EC to reboot the EC more politely. 167488364387SHung-ying Tyan */ 167588364387SHung-ying Tyan #define EC_CMD_REBOOT 0xd1 /* Think "die" */ 167688364387SHung-ying Tyan 167788364387SHung-ying Tyan /* 167888364387SHung-ying Tyan * Resend last response (not supported on LPC). 167988364387SHung-ying Tyan * 168088364387SHung-ying Tyan * Returns EC_RES_UNAVAILABLE if there is no response available - for example, 168188364387SHung-ying Tyan * there was no previous command, or the previous command's response was too 168288364387SHung-ying Tyan * big to save. 168388364387SHung-ying Tyan */ 168488364387SHung-ying Tyan #define EC_CMD_RESEND_RESPONSE 0xdb 168588364387SHung-ying Tyan 168688364387SHung-ying Tyan /* 168788364387SHung-ying Tyan * This header byte on a command indicate version 0. Any header byte less 168888364387SHung-ying Tyan * than this means that we are talking to an old EC which doesn't support 168988364387SHung-ying Tyan * versioning. In that case, we assume version 0. 169088364387SHung-ying Tyan * 169188364387SHung-ying Tyan * Header bytes greater than this indicate a later version. For example, 169288364387SHung-ying Tyan * EC_CMD_VERSION0 + 1 means we are using version 1. 169388364387SHung-ying Tyan * 169488364387SHung-ying Tyan * The old EC interface must not use commands 0dc or higher. 169588364387SHung-ying Tyan */ 169688364387SHung-ying Tyan #define EC_CMD_VERSION0 0xdc 169788364387SHung-ying Tyan 169888364387SHung-ying Tyan #endif /* !__ACPI__ */ 169988364387SHung-ying Tyan 170088364387SHung-ying Tyan #endif /* __CROS_EC_COMMANDS_H */ 1701