188364387SHung-ying Tyan /* Copyright (c) 2012 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 */ 4588364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_ARGS 0x800 4688364387SHung-ying Tyan #define EC_LPC_ADDR_HOST_PARAM 0x804 4788364387SHung-ying Tyan #define EC_HOST_PARAM_SIZE 0x0fc /* Size of param area in bytes */ 4888364387SHung-ying Tyan 4988364387SHung-ying Tyan /* I/O addresses for host command params, old interface */ 5088364387SHung-ying Tyan #define EC_LPC_ADDR_OLD_PARAM 0x880 5188364387SHung-ying Tyan #define EC_OLD_PARAM_SIZE 0x080 /* Size of param area in bytes */ 5288364387SHung-ying Tyan 5388364387SHung-ying Tyan /* EC command register bit functions */ 5488364387SHung-ying Tyan #define EC_LPC_CMDR_DATA (1 << 0) /* Data ready for host to read */ 5588364387SHung-ying Tyan #define EC_LPC_CMDR_PENDING (1 << 1) /* Write pending to EC */ 5688364387SHung-ying Tyan #define EC_LPC_CMDR_BUSY (1 << 2) /* EC is busy processing a command */ 5788364387SHung-ying Tyan #define EC_LPC_CMDR_CMD (1 << 3) /* Last host write was a command */ 5888364387SHung-ying Tyan #define EC_LPC_CMDR_ACPI_BRST (1 << 4) /* Burst mode (not used) */ 5988364387SHung-ying Tyan #define EC_LPC_CMDR_SCI (1 << 5) /* SCI event is pending */ 6088364387SHung-ying Tyan #define EC_LPC_CMDR_SMI (1 << 6) /* SMI event is pending */ 6188364387SHung-ying Tyan 6288364387SHung-ying Tyan #define EC_LPC_ADDR_MEMMAP 0x900 6388364387SHung-ying Tyan #define EC_MEMMAP_SIZE 255 /* ACPI IO buffer max is 255 bytes */ 6488364387SHung-ying Tyan #define EC_MEMMAP_TEXT_MAX 8 /* Size of a string in the memory map */ 6588364387SHung-ying Tyan 6688364387SHung-ying Tyan /* The offset address of each type of data in mapped memory. */ 6788364387SHung-ying Tyan #define EC_MEMMAP_TEMP_SENSOR 0x00 /* Temp sensors */ 6888364387SHung-ying Tyan #define EC_MEMMAP_FAN 0x10 /* Fan speeds */ 6988364387SHung-ying Tyan #define EC_MEMMAP_TEMP_SENSOR_B 0x18 /* Temp sensors (second set) */ 7088364387SHung-ying Tyan #define EC_MEMMAP_ID 0x20 /* 'E' 'C' */ 7188364387SHung-ying Tyan #define EC_MEMMAP_ID_VERSION 0x22 /* Version of data in 0x20 - 0x2f */ 7288364387SHung-ying Tyan #define EC_MEMMAP_THERMAL_VERSION 0x23 /* Version of data in 0x00 - 0x1f */ 7388364387SHung-ying Tyan #define EC_MEMMAP_BATTERY_VERSION 0x24 /* Version of data in 0x40 - 0x7f */ 7488364387SHung-ying Tyan #define EC_MEMMAP_SWITCHES_VERSION 0x25 /* Version of data in 0x30 - 0x33 */ 7588364387SHung-ying Tyan #define EC_MEMMAP_EVENTS_VERSION 0x26 /* Version of data in 0x34 - 0x3f */ 7688364387SHung-ying Tyan #define EC_MEMMAP_HOST_CMD_FLAGS 0x27 /* Host command interface flags */ 7788364387SHung-ying Tyan #define EC_MEMMAP_SWITCHES 0x30 7888364387SHung-ying Tyan #define EC_MEMMAP_HOST_EVENTS 0x34 7988364387SHung-ying Tyan #define EC_MEMMAP_BATT_VOLT 0x40 /* Battery Present Voltage */ 8088364387SHung-ying Tyan #define EC_MEMMAP_BATT_RATE 0x44 /* Battery Present Rate */ 8188364387SHung-ying Tyan #define EC_MEMMAP_BATT_CAP 0x48 /* Battery Remaining Capacity */ 8288364387SHung-ying Tyan #define EC_MEMMAP_BATT_FLAG 0x4c /* Battery State, defined below */ 8388364387SHung-ying Tyan #define EC_MEMMAP_BATT_DCAP 0x50 /* Battery Design Capacity */ 8488364387SHung-ying Tyan #define EC_MEMMAP_BATT_DVLT 0x54 /* Battery Design Voltage */ 8588364387SHung-ying Tyan #define EC_MEMMAP_BATT_LFCC 0x58 /* Battery Last Full Charge Capacity */ 8688364387SHung-ying Tyan #define EC_MEMMAP_BATT_CCNT 0x5c /* Battery Cycle Count */ 8788364387SHung-ying Tyan #define EC_MEMMAP_BATT_MFGR 0x60 /* Battery Manufacturer String */ 8888364387SHung-ying Tyan #define EC_MEMMAP_BATT_MODEL 0x68 /* Battery Model Number String */ 8988364387SHung-ying Tyan #define EC_MEMMAP_BATT_SERIAL 0x70 /* Battery Serial Number String */ 9088364387SHung-ying Tyan #define EC_MEMMAP_BATT_TYPE 0x78 /* Battery Type String */ 9188364387SHung-ying Tyan 9288364387SHung-ying Tyan /* Number of temp sensors at EC_MEMMAP_TEMP_SENSOR */ 9388364387SHung-ying Tyan #define EC_TEMP_SENSOR_ENTRIES 16 9488364387SHung-ying Tyan /* 9588364387SHung-ying Tyan * Number of temp sensors at EC_MEMMAP_TEMP_SENSOR_B. 9688364387SHung-ying Tyan * 9788364387SHung-ying Tyan * Valid only if EC_MEMMAP_THERMAL_VERSION returns >= 2. 9888364387SHung-ying Tyan */ 9988364387SHung-ying Tyan #define EC_TEMP_SENSOR_B_ENTRIES 8 10088364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_PRESENT 0xff 10188364387SHung-ying Tyan #define EC_TEMP_SENSOR_ERROR 0xfe 10288364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_POWERED 0xfd 10388364387SHung-ying Tyan #define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc 10488364387SHung-ying Tyan /* 10588364387SHung-ying Tyan * The offset of temperature value stored in mapped memory. This allows 10688364387SHung-ying Tyan * reporting a temperature range of 200K to 454K = -73C to 181C. 10788364387SHung-ying Tyan */ 10888364387SHung-ying Tyan #define EC_TEMP_SENSOR_OFFSET 200 10988364387SHung-ying Tyan 11088364387SHung-ying Tyan #define EC_FAN_SPEED_ENTRIES 4 /* Number of fans at EC_MEMMAP_FAN */ 11188364387SHung-ying Tyan #define EC_FAN_SPEED_NOT_PRESENT 0xffff /* Entry not present */ 11288364387SHung-ying Tyan #define EC_FAN_SPEED_STALLED 0xfffe /* Fan stalled */ 11388364387SHung-ying Tyan 11488364387SHung-ying Tyan /* Battery bit flags at EC_MEMMAP_BATT_FLAG. */ 11588364387SHung-ying Tyan #define EC_BATT_FLAG_AC_PRESENT 0x01 11688364387SHung-ying Tyan #define EC_BATT_FLAG_BATT_PRESENT 0x02 11788364387SHung-ying Tyan #define EC_BATT_FLAG_DISCHARGING 0x04 11888364387SHung-ying Tyan #define EC_BATT_FLAG_CHARGING 0x08 11988364387SHung-ying Tyan #define EC_BATT_FLAG_LEVEL_CRITICAL 0x10 12088364387SHung-ying Tyan 12188364387SHung-ying Tyan /* Switch flags at EC_MEMMAP_SWITCHES */ 12288364387SHung-ying Tyan #define EC_SWITCH_LID_OPEN 0x01 12388364387SHung-ying Tyan #define EC_SWITCH_POWER_BUTTON_PRESSED 0x02 12488364387SHung-ying Tyan #define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04 12588364387SHung-ying Tyan /* Recovery requested via keyboard */ 12688364387SHung-ying Tyan #define EC_SWITCH_KEYBOARD_RECOVERY 0x08 12788364387SHung-ying Tyan /* Recovery requested via dedicated signal (from servo board) */ 12888364387SHung-ying Tyan #define EC_SWITCH_DEDICATED_RECOVERY 0x10 12988364387SHung-ying Tyan /* Was fake developer mode switch; now unused. Remove in next refactor. */ 13088364387SHung-ying Tyan #define EC_SWITCH_IGNORE0 0x20 13188364387SHung-ying Tyan 13288364387SHung-ying Tyan /* Host command interface flags */ 13388364387SHung-ying Tyan /* Host command interface supports LPC args (LPC interface only) */ 13488364387SHung-ying Tyan #define EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED 0x01 13588364387SHung-ying Tyan 13688364387SHung-ying Tyan /* Wireless switch flags */ 13788364387SHung-ying Tyan #define EC_WIRELESS_SWITCH_WLAN 0x01 13888364387SHung-ying Tyan #define EC_WIRELESS_SWITCH_BLUETOOTH 0x02 13988364387SHung-ying Tyan 14088364387SHung-ying Tyan /* 14188364387SHung-ying Tyan * This header file is used in coreboot both in C and ACPI code. The ACPI code 14288364387SHung-ying Tyan * is pre-processed to handle constants but the ASL compiler is unable to 14388364387SHung-ying Tyan * handle actual C code so keep it separate. 14488364387SHung-ying Tyan */ 14588364387SHung-ying Tyan #ifndef __ACPI__ 14688364387SHung-ying Tyan 14788364387SHung-ying Tyan /* 14888364387SHung-ying Tyan * Define __packed if someone hasn't beat us to it. Linux kernel style 14988364387SHung-ying Tyan * checking prefers __packed over __attribute__((packed)). 15088364387SHung-ying Tyan */ 15188364387SHung-ying Tyan #ifndef __packed 15288364387SHung-ying Tyan #define __packed __attribute__((packed)) 15388364387SHung-ying Tyan #endif 15488364387SHung-ying Tyan 15588364387SHung-ying Tyan /* LPC command status byte masks */ 15688364387SHung-ying Tyan /* EC has written a byte in the data register and host hasn't read it yet */ 15788364387SHung-ying Tyan #define EC_LPC_STATUS_TO_HOST 0x01 15888364387SHung-ying Tyan /* Host has written a command/data byte and the EC hasn't read it yet */ 15988364387SHung-ying Tyan #define EC_LPC_STATUS_FROM_HOST 0x02 16088364387SHung-ying Tyan /* EC is processing a command */ 16188364387SHung-ying Tyan #define EC_LPC_STATUS_PROCESSING 0x04 16288364387SHung-ying Tyan /* Last write to EC was a command, not data */ 16388364387SHung-ying Tyan #define EC_LPC_STATUS_LAST_CMD 0x08 16488364387SHung-ying Tyan /* EC is in burst mode. Unsupported by Chrome EC, so this bit is never set */ 16588364387SHung-ying Tyan #define EC_LPC_STATUS_BURST_MODE 0x10 16688364387SHung-ying Tyan /* SCI event is pending (requesting SCI query) */ 16788364387SHung-ying Tyan #define EC_LPC_STATUS_SCI_PENDING 0x20 16888364387SHung-ying Tyan /* SMI event is pending (requesting SMI query) */ 16988364387SHung-ying Tyan #define EC_LPC_STATUS_SMI_PENDING 0x40 17088364387SHung-ying Tyan /* (reserved) */ 17188364387SHung-ying Tyan #define EC_LPC_STATUS_RESERVED 0x80 17288364387SHung-ying Tyan 17388364387SHung-ying Tyan /* 17488364387SHung-ying Tyan * EC is busy. This covers both the EC processing a command, and the host has 17588364387SHung-ying Tyan * written a new command but the EC hasn't picked it up yet. 17688364387SHung-ying Tyan */ 17788364387SHung-ying Tyan #define EC_LPC_STATUS_BUSY_MASK \ 17888364387SHung-ying Tyan (EC_LPC_STATUS_FROM_HOST | EC_LPC_STATUS_PROCESSING) 17988364387SHung-ying Tyan 18088364387SHung-ying Tyan /* Host command response codes */ 18188364387SHung-ying Tyan enum ec_status { 18288364387SHung-ying Tyan EC_RES_SUCCESS = 0, 18388364387SHung-ying Tyan EC_RES_INVALID_COMMAND = 1, 18488364387SHung-ying Tyan EC_RES_ERROR = 2, 18588364387SHung-ying Tyan EC_RES_INVALID_PARAM = 3, 18688364387SHung-ying Tyan EC_RES_ACCESS_DENIED = 4, 18788364387SHung-ying Tyan EC_RES_INVALID_RESPONSE = 5, 18888364387SHung-ying Tyan EC_RES_INVALID_VERSION = 6, 18988364387SHung-ying Tyan EC_RES_INVALID_CHECKSUM = 7, 19088364387SHung-ying Tyan EC_RES_IN_PROGRESS = 8, /* Accepted, command in progress */ 19188364387SHung-ying Tyan EC_RES_UNAVAILABLE = 9, /* No response available */ 19288364387SHung-ying Tyan EC_RES_TIMEOUT = 10, /* We got a timeout */ 19388364387SHung-ying Tyan EC_RES_OVERFLOW = 11, /* Table / data overflow */ 19488364387SHung-ying Tyan }; 19588364387SHung-ying Tyan 19688364387SHung-ying Tyan /* 19788364387SHung-ying Tyan * Host event codes. Note these are 1-based, not 0-based, because ACPI query 19888364387SHung-ying Tyan * EC command uses code 0 to mean "no event pending". We explicitly specify 19988364387SHung-ying Tyan * each value in the enum listing so they won't change if we delete/insert an 20088364387SHung-ying Tyan * item or rearrange the list (it needs to be stable across platforms, not 20188364387SHung-ying Tyan * just within a single compiled instance). 20288364387SHung-ying Tyan */ 20388364387SHung-ying Tyan enum host_event_code { 20488364387SHung-ying Tyan EC_HOST_EVENT_LID_CLOSED = 1, 20588364387SHung-ying Tyan EC_HOST_EVENT_LID_OPEN = 2, 20688364387SHung-ying Tyan EC_HOST_EVENT_POWER_BUTTON = 3, 20788364387SHung-ying Tyan EC_HOST_EVENT_AC_CONNECTED = 4, 20888364387SHung-ying Tyan EC_HOST_EVENT_AC_DISCONNECTED = 5, 20988364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_LOW = 6, 21088364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_CRITICAL = 7, 21188364387SHung-ying Tyan EC_HOST_EVENT_BATTERY = 8, 21288364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_THRESHOLD = 9, 21388364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_OVERLOAD = 10, 21488364387SHung-ying Tyan EC_HOST_EVENT_THERMAL = 11, 21588364387SHung-ying Tyan EC_HOST_EVENT_USB_CHARGER = 12, 21688364387SHung-ying Tyan EC_HOST_EVENT_KEY_PRESSED = 13, 21788364387SHung-ying Tyan /* 21888364387SHung-ying Tyan * EC has finished initializing the host interface. The host can check 21988364387SHung-ying Tyan * for this event following sending a EC_CMD_REBOOT_EC command to 22088364387SHung-ying Tyan * determine when the EC is ready to accept subsequent commands. 22188364387SHung-ying Tyan */ 22288364387SHung-ying Tyan EC_HOST_EVENT_INTERFACE_READY = 14, 22388364387SHung-ying Tyan /* Keyboard recovery combo has been pressed */ 22488364387SHung-ying Tyan EC_HOST_EVENT_KEYBOARD_RECOVERY = 15, 22588364387SHung-ying Tyan 22688364387SHung-ying Tyan /* Shutdown due to thermal overload */ 22788364387SHung-ying Tyan EC_HOST_EVENT_THERMAL_SHUTDOWN = 16, 22888364387SHung-ying Tyan /* Shutdown due to battery level too low */ 22988364387SHung-ying Tyan EC_HOST_EVENT_BATTERY_SHUTDOWN = 17, 23088364387SHung-ying Tyan 23188364387SHung-ying Tyan /* 23288364387SHung-ying Tyan * The high bit of the event mask is not used as a host event code. If 23388364387SHung-ying Tyan * it reads back as set, then the entire event mask should be 23488364387SHung-ying Tyan * considered invalid by the host. This can happen when reading the 23588364387SHung-ying Tyan * raw event status via EC_MEMMAP_HOST_EVENTS but the LPC interface is 23688364387SHung-ying Tyan * not initialized on the EC, or improperly configured on the host. 23788364387SHung-ying Tyan */ 23888364387SHung-ying Tyan EC_HOST_EVENT_INVALID = 32 23988364387SHung-ying Tyan }; 24088364387SHung-ying Tyan /* Host event mask */ 24188364387SHung-ying Tyan #define EC_HOST_EVENT_MASK(event_code) (1UL << ((event_code) - 1)) 24288364387SHung-ying Tyan 24388364387SHung-ying Tyan /* Arguments at EC_LPC_ADDR_HOST_ARGS */ 24488364387SHung-ying Tyan struct ec_lpc_host_args { 24588364387SHung-ying Tyan uint8_t flags; 24688364387SHung-ying Tyan uint8_t command_version; 24788364387SHung-ying Tyan uint8_t data_size; 24888364387SHung-ying Tyan /* 24988364387SHung-ying Tyan * Checksum; sum of command + flags + command_version + data_size + 25088364387SHung-ying Tyan * all params/response data bytes. 25188364387SHung-ying Tyan */ 25288364387SHung-ying Tyan uint8_t checksum; 25388364387SHung-ying Tyan } __packed; 25488364387SHung-ying Tyan 25588364387SHung-ying Tyan /* Flags for ec_lpc_host_args.flags */ 25688364387SHung-ying Tyan /* 25788364387SHung-ying Tyan * Args are from host. Data area at EC_LPC_ADDR_HOST_PARAM contains command 25888364387SHung-ying Tyan * params. 25988364387SHung-ying Tyan * 26088364387SHung-ying Tyan * If EC gets a command and this flag is not set, this is an old-style command. 26188364387SHung-ying Tyan * Command version is 0 and params from host are at EC_LPC_ADDR_OLD_PARAM with 26288364387SHung-ying Tyan * unknown length. EC must respond with an old-style response (that is, 26388364387SHung-ying Tyan * withouth setting EC_HOST_ARGS_FLAG_TO_HOST). 26488364387SHung-ying Tyan */ 26588364387SHung-ying Tyan #define EC_HOST_ARGS_FLAG_FROM_HOST 0x01 26688364387SHung-ying Tyan /* 26788364387SHung-ying Tyan * Args are from EC. Data area at EC_LPC_ADDR_HOST_PARAM contains response. 26888364387SHung-ying Tyan * 26988364387SHung-ying Tyan * If EC responds to a command and this flag is not set, this is an old-style 27088364387SHung-ying Tyan * response. Command version is 0 and response data from EC is at 27188364387SHung-ying Tyan * EC_LPC_ADDR_OLD_PARAM with unknown length. 27288364387SHung-ying Tyan */ 27388364387SHung-ying Tyan #define EC_HOST_ARGS_FLAG_TO_HOST 0x02 27488364387SHung-ying Tyan 27588364387SHung-ying Tyan /* 27688364387SHung-ying Tyan * Notes on commands: 27788364387SHung-ying Tyan * 27888364387SHung-ying Tyan * Each command is an 8-byte command value. Commands which take params or 27988364387SHung-ying Tyan * return response data specify structs for that data. If no struct is 28088364387SHung-ying Tyan * specified, the command does not input or output data, respectively. 28188364387SHung-ying Tyan * Parameter/response length is implicit in the structs. Some underlying 28288364387SHung-ying Tyan * communication protocols (I2C, SPI) may add length or checksum headers, but 28388364387SHung-ying Tyan * those are implementation-dependent and not defined here. 28488364387SHung-ying Tyan */ 28588364387SHung-ying Tyan 28688364387SHung-ying Tyan /*****************************************************************************/ 28788364387SHung-ying Tyan /* General / test commands */ 28888364387SHung-ying Tyan 28988364387SHung-ying Tyan /* 29088364387SHung-ying Tyan * Get protocol version, used to deal with non-backward compatible protocol 29188364387SHung-ying Tyan * changes. 29288364387SHung-ying Tyan */ 29388364387SHung-ying Tyan #define EC_CMD_PROTO_VERSION 0x00 29488364387SHung-ying Tyan 29588364387SHung-ying Tyan struct ec_response_proto_version { 29688364387SHung-ying Tyan uint32_t version; 29788364387SHung-ying Tyan } __packed; 29888364387SHung-ying Tyan 29988364387SHung-ying Tyan /* 30088364387SHung-ying Tyan * Hello. This is a simple command to test the EC is responsive to 30188364387SHung-ying Tyan * commands. 30288364387SHung-ying Tyan */ 30388364387SHung-ying Tyan #define EC_CMD_HELLO 0x01 30488364387SHung-ying Tyan 30588364387SHung-ying Tyan struct ec_params_hello { 30688364387SHung-ying Tyan uint32_t in_data; /* Pass anything here */ 30788364387SHung-ying Tyan } __packed; 30888364387SHung-ying Tyan 30988364387SHung-ying Tyan struct ec_response_hello { 31088364387SHung-ying Tyan uint32_t out_data; /* Output will be in_data + 0x01020304 */ 31188364387SHung-ying Tyan } __packed; 31288364387SHung-ying Tyan 31388364387SHung-ying Tyan /* Get version number */ 31488364387SHung-ying Tyan #define EC_CMD_GET_VERSION 0x02 31588364387SHung-ying Tyan 31688364387SHung-ying Tyan enum ec_current_image { 31788364387SHung-ying Tyan EC_IMAGE_UNKNOWN = 0, 31888364387SHung-ying Tyan EC_IMAGE_RO, 31988364387SHung-ying Tyan EC_IMAGE_RW 32088364387SHung-ying Tyan }; 32188364387SHung-ying Tyan 32288364387SHung-ying Tyan struct ec_response_get_version { 32388364387SHung-ying Tyan /* Null-terminated version strings for RO, RW */ 32488364387SHung-ying Tyan char version_string_ro[32]; 32588364387SHung-ying Tyan char version_string_rw[32]; 32688364387SHung-ying Tyan char reserved[32]; /* Was previously RW-B string */ 32788364387SHung-ying Tyan uint32_t current_image; /* One of ec_current_image */ 32888364387SHung-ying Tyan } __packed; 32988364387SHung-ying Tyan 33088364387SHung-ying Tyan /* Read test */ 33188364387SHung-ying Tyan #define EC_CMD_READ_TEST 0x03 33288364387SHung-ying Tyan 33388364387SHung-ying Tyan struct ec_params_read_test { 33488364387SHung-ying Tyan uint32_t offset; /* Starting value for read buffer */ 33588364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 33688364387SHung-ying Tyan } __packed; 33788364387SHung-ying Tyan 33888364387SHung-ying Tyan struct ec_response_read_test { 33988364387SHung-ying Tyan uint32_t data[32]; 34088364387SHung-ying Tyan } __packed; 34188364387SHung-ying Tyan 34288364387SHung-ying Tyan /* 34388364387SHung-ying Tyan * Get build information 34488364387SHung-ying Tyan * 34588364387SHung-ying Tyan * Response is null-terminated string. 34688364387SHung-ying Tyan */ 34788364387SHung-ying Tyan #define EC_CMD_GET_BUILD_INFO 0x04 34888364387SHung-ying Tyan 34988364387SHung-ying Tyan /* Get chip info */ 35088364387SHung-ying Tyan #define EC_CMD_GET_CHIP_INFO 0x05 35188364387SHung-ying Tyan 35288364387SHung-ying Tyan struct ec_response_get_chip_info { 35388364387SHung-ying Tyan /* Null-terminated strings */ 35488364387SHung-ying Tyan char vendor[32]; 35588364387SHung-ying Tyan char name[32]; 35688364387SHung-ying Tyan char revision[32]; /* Mask version */ 35788364387SHung-ying Tyan } __packed; 35888364387SHung-ying Tyan 35988364387SHung-ying Tyan /* Get board HW version */ 36088364387SHung-ying Tyan #define EC_CMD_GET_BOARD_VERSION 0x06 36188364387SHung-ying Tyan 36288364387SHung-ying Tyan struct ec_response_board_version { 36388364387SHung-ying Tyan uint16_t board_version; /* A monotonously incrementing number. */ 36488364387SHung-ying Tyan } __packed; 36588364387SHung-ying Tyan 36688364387SHung-ying Tyan /* 36788364387SHung-ying Tyan * Read memory-mapped data. 36888364387SHung-ying Tyan * 36988364387SHung-ying Tyan * This is an alternate interface to memory-mapped data for bus protocols 37088364387SHung-ying Tyan * which don't support direct-mapped memory - I2C, SPI, etc. 37188364387SHung-ying Tyan * 37288364387SHung-ying Tyan * Response is params.size bytes of data. 37388364387SHung-ying Tyan */ 37488364387SHung-ying Tyan #define EC_CMD_READ_MEMMAP 0x07 37588364387SHung-ying Tyan 37688364387SHung-ying Tyan struct ec_params_read_memmap { 37788364387SHung-ying Tyan uint8_t offset; /* Offset in memmap (EC_MEMMAP_*) */ 37888364387SHung-ying Tyan uint8_t size; /* Size to read in bytes */ 37988364387SHung-ying Tyan } __packed; 38088364387SHung-ying Tyan 38188364387SHung-ying Tyan /* Read versions supported for a command */ 38288364387SHung-ying Tyan #define EC_CMD_GET_CMD_VERSIONS 0x08 38388364387SHung-ying Tyan 38488364387SHung-ying Tyan struct ec_params_get_cmd_versions { 38588364387SHung-ying Tyan uint8_t cmd; /* Command to check */ 38688364387SHung-ying Tyan } __packed; 38788364387SHung-ying Tyan 38888364387SHung-ying Tyan struct ec_response_get_cmd_versions { 38988364387SHung-ying Tyan /* 39088364387SHung-ying Tyan * Mask of supported versions; use EC_VER_MASK() to compare with a 39188364387SHung-ying Tyan * desired version. 39288364387SHung-ying Tyan */ 39388364387SHung-ying Tyan uint32_t version_mask; 39488364387SHung-ying Tyan } __packed; 39588364387SHung-ying Tyan 39688364387SHung-ying Tyan /* 39788364387SHung-ying Tyan * Check EC communcations status (busy). This is needed on i2c/spi but not 39888364387SHung-ying Tyan * on lpc since it has its own out-of-band busy indicator. 39988364387SHung-ying Tyan * 40088364387SHung-ying Tyan * lpc must read the status from the command register. Attempting this on 40188364387SHung-ying Tyan * lpc will overwrite the args/parameter space and corrupt its data. 40288364387SHung-ying Tyan */ 40388364387SHung-ying Tyan #define EC_CMD_GET_COMMS_STATUS 0x09 40488364387SHung-ying Tyan 40588364387SHung-ying Tyan /* Avoid using ec_status which is for return values */ 40688364387SHung-ying Tyan enum ec_comms_status { 40788364387SHung-ying Tyan EC_COMMS_STATUS_PROCESSING = 1 << 0, /* Processing cmd */ 40888364387SHung-ying Tyan }; 40988364387SHung-ying Tyan 41088364387SHung-ying Tyan struct ec_response_get_comms_status { 41188364387SHung-ying Tyan uint32_t flags; /* Mask of enum ec_comms_status */ 41288364387SHung-ying Tyan } __packed; 41388364387SHung-ying Tyan 41488364387SHung-ying Tyan 41588364387SHung-ying Tyan /*****************************************************************************/ 41688364387SHung-ying Tyan /* Flash commands */ 41788364387SHung-ying Tyan 41888364387SHung-ying Tyan /* Get flash info */ 41988364387SHung-ying Tyan #define EC_CMD_FLASH_INFO 0x10 42088364387SHung-ying Tyan 42188364387SHung-ying Tyan struct ec_response_flash_info { 42288364387SHung-ying Tyan /* Usable flash size, in bytes */ 42388364387SHung-ying Tyan uint32_t flash_size; 42488364387SHung-ying Tyan /* 42588364387SHung-ying Tyan * Write block size. Write offset and size must be a multiple 42688364387SHung-ying Tyan * of this. 42788364387SHung-ying Tyan */ 42888364387SHung-ying Tyan uint32_t write_block_size; 42988364387SHung-ying Tyan /* 43088364387SHung-ying Tyan * Erase block size. Erase offset and size must be a multiple 43188364387SHung-ying Tyan * of this. 43288364387SHung-ying Tyan */ 43388364387SHung-ying Tyan uint32_t erase_block_size; 43488364387SHung-ying Tyan /* 43588364387SHung-ying Tyan * Protection block size. Protection offset and size must be a 43688364387SHung-ying Tyan * multiple of this. 43788364387SHung-ying Tyan */ 43888364387SHung-ying Tyan uint32_t protect_block_size; 43988364387SHung-ying Tyan } __packed; 44088364387SHung-ying Tyan 44188364387SHung-ying Tyan /* 44288364387SHung-ying Tyan * Read flash 44388364387SHung-ying Tyan * 44488364387SHung-ying Tyan * Response is params.size bytes of data. 44588364387SHung-ying Tyan */ 44688364387SHung-ying Tyan #define EC_CMD_FLASH_READ 0x11 44788364387SHung-ying Tyan 44888364387SHung-ying Tyan struct ec_params_flash_read { 44988364387SHung-ying Tyan uint32_t offset; /* Byte offset to read */ 45088364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 45188364387SHung-ying Tyan } __packed; 45288364387SHung-ying Tyan 45388364387SHung-ying Tyan /* Write flash */ 45488364387SHung-ying Tyan #define EC_CMD_FLASH_WRITE 0x12 45588364387SHung-ying Tyan 45688364387SHung-ying Tyan struct ec_params_flash_write { 45788364387SHung-ying Tyan uint32_t offset; /* Byte offset to write */ 45888364387SHung-ying Tyan uint32_t size; /* Size to write in bytes */ 45988364387SHung-ying Tyan /* 46088364387SHung-ying Tyan * Data to write. Could really use EC_PARAM_SIZE - 8, but tidiest to 46188364387SHung-ying Tyan * use a power of 2 so writes stay aligned. 46288364387SHung-ying Tyan */ 46388364387SHung-ying Tyan uint8_t data[64]; 46488364387SHung-ying Tyan } __packed; 46588364387SHung-ying Tyan 46688364387SHung-ying Tyan /* Erase flash */ 46788364387SHung-ying Tyan #define EC_CMD_FLASH_ERASE 0x13 46888364387SHung-ying Tyan 46988364387SHung-ying Tyan struct ec_params_flash_erase { 47088364387SHung-ying Tyan uint32_t offset; /* Byte offset to erase */ 47188364387SHung-ying Tyan uint32_t size; /* Size to erase in bytes */ 47288364387SHung-ying Tyan } __packed; 47388364387SHung-ying Tyan 47488364387SHung-ying Tyan /* 47588364387SHung-ying Tyan * Get/set flash protection. 47688364387SHung-ying Tyan * 47788364387SHung-ying Tyan * If mask!=0, sets/clear the requested bits of flags. Depending on the 47888364387SHung-ying Tyan * firmware write protect GPIO, not all flags will take effect immediately; 47988364387SHung-ying Tyan * some flags require a subsequent hard reset to take effect. Check the 48088364387SHung-ying Tyan * returned flags bits to see what actually happened. 48188364387SHung-ying Tyan * 48288364387SHung-ying Tyan * If mask=0, simply returns the current flags state. 48388364387SHung-ying Tyan */ 48488364387SHung-ying Tyan #define EC_CMD_FLASH_PROTECT 0x15 48588364387SHung-ying Tyan #define EC_VER_FLASH_PROTECT 1 /* Command version 1 */ 48688364387SHung-ying Tyan 48788364387SHung-ying Tyan /* Flags for flash protection */ 48888364387SHung-ying Tyan /* RO flash code protected when the EC boots */ 48988364387SHung-ying Tyan #define EC_FLASH_PROTECT_RO_AT_BOOT (1 << 0) 49088364387SHung-ying Tyan /* 49188364387SHung-ying Tyan * RO flash code protected now. If this bit is set, at-boot status cannot 49288364387SHung-ying Tyan * be changed. 49388364387SHung-ying Tyan */ 49488364387SHung-ying Tyan #define EC_FLASH_PROTECT_RO_NOW (1 << 1) 49588364387SHung-ying Tyan /* Entire flash code protected now, until reboot. */ 49688364387SHung-ying Tyan #define EC_FLASH_PROTECT_ALL_NOW (1 << 2) 49788364387SHung-ying Tyan /* Flash write protect GPIO is asserted now */ 49888364387SHung-ying Tyan #define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3) 49988364387SHung-ying Tyan /* Error - at least one bank of flash is stuck locked, and cannot be unlocked */ 50088364387SHung-ying Tyan #define EC_FLASH_PROTECT_ERROR_STUCK (1 << 4) 50188364387SHung-ying Tyan /* 50288364387SHung-ying Tyan * Error - flash protection is in inconsistent state. At least one bank of 50388364387SHung-ying Tyan * flash which should be protected is not protected. Usually fixed by 50488364387SHung-ying Tyan * re-requesting the desired flags, or by a hard reset if that fails. 50588364387SHung-ying Tyan */ 50688364387SHung-ying Tyan #define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5) 50788364387SHung-ying Tyan /* Entile flash code protected when the EC boots */ 50888364387SHung-ying Tyan #define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6) 50988364387SHung-ying Tyan 51088364387SHung-ying Tyan struct ec_params_flash_protect { 51188364387SHung-ying Tyan uint32_t mask; /* Bits in flags to apply */ 51288364387SHung-ying Tyan uint32_t flags; /* New flags to apply */ 51388364387SHung-ying Tyan } __packed; 51488364387SHung-ying Tyan 51588364387SHung-ying Tyan struct ec_response_flash_protect { 51688364387SHung-ying Tyan /* Current value of flash protect flags */ 51788364387SHung-ying Tyan uint32_t flags; 51888364387SHung-ying Tyan /* 51988364387SHung-ying Tyan * Flags which are valid on this platform. This allows the caller 52088364387SHung-ying Tyan * to distinguish between flags which aren't set vs. flags which can't 52188364387SHung-ying Tyan * be set on this platform. 52288364387SHung-ying Tyan */ 52388364387SHung-ying Tyan uint32_t valid_flags; 52488364387SHung-ying Tyan /* Flags which can be changed given the current protection state */ 52588364387SHung-ying Tyan uint32_t writable_flags; 52688364387SHung-ying Tyan } __packed; 52788364387SHung-ying Tyan 52888364387SHung-ying Tyan /* 52988364387SHung-ying Tyan * Note: commands 0x14 - 0x19 version 0 were old commands to get/set flash 53088364387SHung-ying Tyan * write protect. These commands may be reused with version > 0. 53188364387SHung-ying Tyan */ 53288364387SHung-ying Tyan 53388364387SHung-ying Tyan /* Get the region offset/size */ 53488364387SHung-ying Tyan #define EC_CMD_FLASH_REGION_INFO 0x16 53588364387SHung-ying Tyan #define EC_VER_FLASH_REGION_INFO 1 53688364387SHung-ying Tyan 53788364387SHung-ying Tyan enum ec_flash_region { 53888364387SHung-ying Tyan /* Region which holds read-only EC image */ 539*cecb19c0SSimon Glass EC_FLASH_REGION_RO = 0, 54088364387SHung-ying Tyan /* Region which holds rewritable EC image */ 54188364387SHung-ying Tyan EC_FLASH_REGION_RW, 54288364387SHung-ying Tyan /* 54388364387SHung-ying Tyan * Region which should be write-protected in the factory (a superset of 54488364387SHung-ying Tyan * EC_FLASH_REGION_RO) 54588364387SHung-ying Tyan */ 54688364387SHung-ying Tyan EC_FLASH_REGION_WP_RO, 547*cecb19c0SSimon Glass /* Number of regions */ 548*cecb19c0SSimon Glass EC_FLASH_REGION_COUNT, 54988364387SHung-ying Tyan }; 55088364387SHung-ying Tyan 55188364387SHung-ying Tyan struct ec_params_flash_region_info { 55288364387SHung-ying Tyan uint32_t region; /* enum ec_flash_region */ 55388364387SHung-ying Tyan } __packed; 55488364387SHung-ying Tyan 55588364387SHung-ying Tyan struct ec_response_flash_region_info { 55688364387SHung-ying Tyan uint32_t offset; 55788364387SHung-ying Tyan uint32_t size; 55888364387SHung-ying Tyan } __packed; 55988364387SHung-ying Tyan 56088364387SHung-ying Tyan /* Read/write VbNvContext */ 56188364387SHung-ying Tyan #define EC_CMD_VBNV_CONTEXT 0x17 56288364387SHung-ying Tyan #define EC_VER_VBNV_CONTEXT 1 56388364387SHung-ying Tyan #define EC_VBNV_BLOCK_SIZE 16 56488364387SHung-ying Tyan 56588364387SHung-ying Tyan enum ec_vbnvcontext_op { 56688364387SHung-ying Tyan EC_VBNV_CONTEXT_OP_READ, 56788364387SHung-ying Tyan EC_VBNV_CONTEXT_OP_WRITE, 56888364387SHung-ying Tyan }; 56988364387SHung-ying Tyan 57088364387SHung-ying Tyan struct ec_params_vbnvcontext { 57188364387SHung-ying Tyan uint32_t op; 57288364387SHung-ying Tyan uint8_t block[EC_VBNV_BLOCK_SIZE]; 57388364387SHung-ying Tyan } __packed; 57488364387SHung-ying Tyan 57588364387SHung-ying Tyan struct ec_response_vbnvcontext { 57688364387SHung-ying Tyan uint8_t block[EC_VBNV_BLOCK_SIZE]; 57788364387SHung-ying Tyan } __packed; 57888364387SHung-ying Tyan 57988364387SHung-ying Tyan /*****************************************************************************/ 58088364387SHung-ying Tyan /* PWM commands */ 58188364387SHung-ying Tyan 58288364387SHung-ying Tyan /* Get fan target RPM */ 58388364387SHung-ying Tyan #define EC_CMD_PWM_GET_FAN_TARGET_RPM 0x20 58488364387SHung-ying Tyan 58588364387SHung-ying Tyan struct ec_response_pwm_get_fan_rpm { 58688364387SHung-ying Tyan uint32_t rpm; 58788364387SHung-ying Tyan } __packed; 58888364387SHung-ying Tyan 58988364387SHung-ying Tyan /* Set target fan RPM */ 59088364387SHung-ying Tyan #define EC_CMD_PWM_SET_FAN_TARGET_RPM 0x21 59188364387SHung-ying Tyan 59288364387SHung-ying Tyan struct ec_params_pwm_set_fan_target_rpm { 59388364387SHung-ying Tyan uint32_t rpm; 59488364387SHung-ying Tyan } __packed; 59588364387SHung-ying Tyan 59688364387SHung-ying Tyan /* Get keyboard backlight */ 59788364387SHung-ying Tyan #define EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT 0x22 59888364387SHung-ying Tyan 59988364387SHung-ying Tyan struct ec_response_pwm_get_keyboard_backlight { 60088364387SHung-ying Tyan uint8_t percent; 60188364387SHung-ying Tyan uint8_t enabled; 60288364387SHung-ying Tyan } __packed; 60388364387SHung-ying Tyan 60488364387SHung-ying Tyan /* Set keyboard backlight */ 60588364387SHung-ying Tyan #define EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT 0x23 60688364387SHung-ying Tyan 60788364387SHung-ying Tyan struct ec_params_pwm_set_keyboard_backlight { 60888364387SHung-ying Tyan uint8_t percent; 60988364387SHung-ying Tyan } __packed; 61088364387SHung-ying Tyan 61188364387SHung-ying Tyan /* Set target fan PWM duty cycle */ 61288364387SHung-ying Tyan #define EC_CMD_PWM_SET_FAN_DUTY 0x24 61388364387SHung-ying Tyan 61488364387SHung-ying Tyan struct ec_params_pwm_set_fan_duty { 61588364387SHung-ying Tyan uint32_t percent; 61688364387SHung-ying Tyan } __packed; 61788364387SHung-ying Tyan 61888364387SHung-ying Tyan /*****************************************************************************/ 61988364387SHung-ying Tyan /* 62088364387SHung-ying Tyan * Lightbar commands. This looks worse than it is. Since we only use one HOST 62188364387SHung-ying Tyan * command to say "talk to the lightbar", we put the "and tell it to do X" part 62288364387SHung-ying Tyan * into a subcommand. We'll make separate structs for subcommands with 62388364387SHung-ying Tyan * different input args, so that we know how much to expect. 62488364387SHung-ying Tyan */ 62588364387SHung-ying Tyan #define EC_CMD_LIGHTBAR_CMD 0x28 62688364387SHung-ying Tyan 62788364387SHung-ying Tyan struct rgb_s { 62888364387SHung-ying Tyan uint8_t r, g, b; 62988364387SHung-ying Tyan }; 63088364387SHung-ying Tyan 63188364387SHung-ying Tyan #define LB_BATTERY_LEVELS 4 63288364387SHung-ying Tyan /* List of tweakable parameters. NOTE: It's __packed so it can be sent in a 63388364387SHung-ying Tyan * host command, but the alignment is the same regardless. Keep it that way. 63488364387SHung-ying Tyan */ 63588364387SHung-ying Tyan struct lightbar_params { 63688364387SHung-ying Tyan /* Timing */ 63788364387SHung-ying Tyan int google_ramp_up; 63888364387SHung-ying Tyan int google_ramp_down; 63988364387SHung-ying Tyan int s3s0_ramp_up; 64088364387SHung-ying Tyan int s0_tick_delay[2]; /* AC=0/1 */ 64188364387SHung-ying Tyan int s0a_tick_delay[2]; /* AC=0/1 */ 64288364387SHung-ying Tyan int s0s3_ramp_down; 64388364387SHung-ying Tyan int s3_sleep_for; 64488364387SHung-ying Tyan int s3_ramp_up; 64588364387SHung-ying Tyan int s3_ramp_down; 64688364387SHung-ying Tyan 64788364387SHung-ying Tyan /* Oscillation */ 64888364387SHung-ying Tyan uint8_t new_s0; 64988364387SHung-ying Tyan uint8_t osc_min[2]; /* AC=0/1 */ 65088364387SHung-ying Tyan uint8_t osc_max[2]; /* AC=0/1 */ 65188364387SHung-ying Tyan uint8_t w_ofs[2]; /* AC=0/1 */ 65288364387SHung-ying Tyan 65388364387SHung-ying Tyan /* Brightness limits based on the backlight and AC. */ 65488364387SHung-ying Tyan uint8_t bright_bl_off_fixed[2]; /* AC=0/1 */ 65588364387SHung-ying Tyan uint8_t bright_bl_on_min[2]; /* AC=0/1 */ 65688364387SHung-ying Tyan uint8_t bright_bl_on_max[2]; /* AC=0/1 */ 65788364387SHung-ying Tyan 65888364387SHung-ying Tyan /* Battery level thresholds */ 65988364387SHung-ying Tyan uint8_t battery_threshold[LB_BATTERY_LEVELS - 1]; 66088364387SHung-ying Tyan 66188364387SHung-ying Tyan /* Map [AC][battery_level] to color index */ 66288364387SHung-ying Tyan uint8_t s0_idx[2][LB_BATTERY_LEVELS]; /* AP is running */ 66388364387SHung-ying Tyan uint8_t s3_idx[2][LB_BATTERY_LEVELS]; /* AP is sleeping */ 66488364387SHung-ying Tyan 66588364387SHung-ying Tyan /* Color palette */ 66688364387SHung-ying Tyan struct rgb_s color[8]; /* 0-3 are Google colors */ 66788364387SHung-ying Tyan } __packed; 66888364387SHung-ying Tyan 66988364387SHung-ying Tyan struct ec_params_lightbar { 67088364387SHung-ying Tyan uint8_t cmd; /* Command (see enum lightbar_command) */ 67188364387SHung-ying Tyan union { 67288364387SHung-ying Tyan struct { 67388364387SHung-ying Tyan /* no args */ 67488364387SHung-ying Tyan } dump, off, on, init, get_seq, get_params; 67588364387SHung-ying Tyan 67688364387SHung-ying Tyan struct num { 67788364387SHung-ying Tyan uint8_t num; 67888364387SHung-ying Tyan } brightness, seq, demo; 67988364387SHung-ying Tyan 68088364387SHung-ying Tyan struct reg { 68188364387SHung-ying Tyan uint8_t ctrl, reg, value; 68288364387SHung-ying Tyan } reg; 68388364387SHung-ying Tyan 68488364387SHung-ying Tyan struct rgb { 68588364387SHung-ying Tyan uint8_t led, red, green, blue; 68688364387SHung-ying Tyan } rgb; 68788364387SHung-ying Tyan 68888364387SHung-ying Tyan struct lightbar_params set_params; 68988364387SHung-ying Tyan }; 69088364387SHung-ying Tyan } __packed; 69188364387SHung-ying Tyan 69288364387SHung-ying Tyan struct ec_response_lightbar { 69388364387SHung-ying Tyan union { 69488364387SHung-ying Tyan struct dump { 69588364387SHung-ying Tyan struct { 69688364387SHung-ying Tyan uint8_t reg; 69788364387SHung-ying Tyan uint8_t ic0; 69888364387SHung-ying Tyan uint8_t ic1; 69988364387SHung-ying Tyan } vals[23]; 70088364387SHung-ying Tyan } dump; 70188364387SHung-ying Tyan 70288364387SHung-ying Tyan struct get_seq { 70388364387SHung-ying Tyan uint8_t num; 70488364387SHung-ying Tyan } get_seq; 70588364387SHung-ying Tyan 70688364387SHung-ying Tyan struct lightbar_params get_params; 70788364387SHung-ying Tyan 70888364387SHung-ying Tyan struct { 70988364387SHung-ying Tyan /* no return params */ 71088364387SHung-ying Tyan } off, on, init, brightness, seq, reg, rgb, demo, set_params; 71188364387SHung-ying Tyan }; 71288364387SHung-ying Tyan } __packed; 71388364387SHung-ying Tyan 71488364387SHung-ying Tyan /* Lightbar commands */ 71588364387SHung-ying Tyan enum lightbar_command { 71688364387SHung-ying Tyan LIGHTBAR_CMD_DUMP = 0, 71788364387SHung-ying Tyan LIGHTBAR_CMD_OFF = 1, 71888364387SHung-ying Tyan LIGHTBAR_CMD_ON = 2, 71988364387SHung-ying Tyan LIGHTBAR_CMD_INIT = 3, 72088364387SHung-ying Tyan LIGHTBAR_CMD_BRIGHTNESS = 4, 72188364387SHung-ying Tyan LIGHTBAR_CMD_SEQ = 5, 72288364387SHung-ying Tyan LIGHTBAR_CMD_REG = 6, 72388364387SHung-ying Tyan LIGHTBAR_CMD_RGB = 7, 72488364387SHung-ying Tyan LIGHTBAR_CMD_GET_SEQ = 8, 72588364387SHung-ying Tyan LIGHTBAR_CMD_DEMO = 9, 72688364387SHung-ying Tyan LIGHTBAR_CMD_GET_PARAMS = 10, 72788364387SHung-ying Tyan LIGHTBAR_CMD_SET_PARAMS = 11, 72888364387SHung-ying Tyan LIGHTBAR_NUM_CMDS 72988364387SHung-ying Tyan }; 73088364387SHung-ying Tyan 73188364387SHung-ying Tyan /*****************************************************************************/ 73288364387SHung-ying Tyan /* Verified boot commands */ 73388364387SHung-ying Tyan 73488364387SHung-ying Tyan /* 73588364387SHung-ying Tyan * Note: command code 0x29 version 0 was VBOOT_CMD in Link EVT; it may be 73688364387SHung-ying Tyan * reused for other purposes with version > 0. 73788364387SHung-ying Tyan */ 73888364387SHung-ying Tyan 73988364387SHung-ying Tyan /* Verified boot hash command */ 74088364387SHung-ying Tyan #define EC_CMD_VBOOT_HASH 0x2A 74188364387SHung-ying Tyan 74288364387SHung-ying Tyan struct ec_params_vboot_hash { 74388364387SHung-ying Tyan uint8_t cmd; /* enum ec_vboot_hash_cmd */ 74488364387SHung-ying Tyan uint8_t hash_type; /* enum ec_vboot_hash_type */ 74588364387SHung-ying Tyan uint8_t nonce_size; /* Nonce size; may be 0 */ 74688364387SHung-ying Tyan uint8_t reserved0; /* Reserved; set 0 */ 74788364387SHung-ying Tyan uint32_t offset; /* Offset in flash to hash */ 74888364387SHung-ying Tyan uint32_t size; /* Number of bytes to hash */ 74988364387SHung-ying Tyan uint8_t nonce_data[64]; /* Nonce data; ignored if nonce_size=0 */ 75088364387SHung-ying Tyan } __packed; 75188364387SHung-ying Tyan 75288364387SHung-ying Tyan struct ec_response_vboot_hash { 75388364387SHung-ying Tyan uint8_t status; /* enum ec_vboot_hash_status */ 75488364387SHung-ying Tyan uint8_t hash_type; /* enum ec_vboot_hash_type */ 75588364387SHung-ying Tyan uint8_t digest_size; /* Size of hash digest in bytes */ 75688364387SHung-ying Tyan uint8_t reserved0; /* Ignore; will be 0 */ 75788364387SHung-ying Tyan uint32_t offset; /* Offset in flash which was hashed */ 75888364387SHung-ying Tyan uint32_t size; /* Number of bytes hashed */ 75988364387SHung-ying Tyan uint8_t hash_digest[64]; /* Hash digest data */ 76088364387SHung-ying Tyan } __packed; 76188364387SHung-ying Tyan 76288364387SHung-ying Tyan enum ec_vboot_hash_cmd { 76388364387SHung-ying Tyan EC_VBOOT_HASH_GET = 0, /* Get current hash status */ 76488364387SHung-ying Tyan EC_VBOOT_HASH_ABORT = 1, /* Abort calculating current hash */ 76588364387SHung-ying Tyan EC_VBOOT_HASH_START = 2, /* Start computing a new hash */ 76688364387SHung-ying Tyan EC_VBOOT_HASH_RECALC = 3, /* Synchronously compute a new hash */ 76788364387SHung-ying Tyan }; 76888364387SHung-ying Tyan 76988364387SHung-ying Tyan enum ec_vboot_hash_type { 77088364387SHung-ying Tyan EC_VBOOT_HASH_TYPE_SHA256 = 0, /* SHA-256 */ 77188364387SHung-ying Tyan }; 77288364387SHung-ying Tyan 77388364387SHung-ying Tyan enum ec_vboot_hash_status { 77488364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_NONE = 0, /* No hash (not started, or aborted) */ 77588364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_DONE = 1, /* Finished computing a hash */ 77688364387SHung-ying Tyan EC_VBOOT_HASH_STATUS_BUSY = 2, /* Busy computing a hash */ 77788364387SHung-ying Tyan }; 77888364387SHung-ying Tyan 77988364387SHung-ying Tyan /* 78088364387SHung-ying Tyan * Special values for offset for EC_VBOOT_HASH_START and EC_VBOOT_HASH_RECALC. 78188364387SHung-ying Tyan * If one of these is specified, the EC will automatically update offset and 78288364387SHung-ying Tyan * size to the correct values for the specified image (RO or RW). 78388364387SHung-ying Tyan */ 78488364387SHung-ying Tyan #define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe 78588364387SHung-ying Tyan #define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd 78688364387SHung-ying Tyan 78788364387SHung-ying Tyan /*****************************************************************************/ 78888364387SHung-ying Tyan /* USB charging control commands */ 78988364387SHung-ying Tyan 79088364387SHung-ying Tyan /* Set USB port charging mode */ 79188364387SHung-ying Tyan #define EC_CMD_USB_CHARGE_SET_MODE 0x30 79288364387SHung-ying Tyan 79388364387SHung-ying Tyan struct ec_params_usb_charge_set_mode { 79488364387SHung-ying Tyan uint8_t usb_port_id; 79588364387SHung-ying Tyan uint8_t mode; 79688364387SHung-ying Tyan } __packed; 79788364387SHung-ying Tyan 79888364387SHung-ying Tyan /*****************************************************************************/ 79988364387SHung-ying Tyan /* Persistent storage for host */ 80088364387SHung-ying Tyan 80188364387SHung-ying Tyan /* Maximum bytes that can be read/written in a single command */ 80288364387SHung-ying Tyan #define EC_PSTORE_SIZE_MAX 64 80388364387SHung-ying Tyan 80488364387SHung-ying Tyan /* Get persistent storage info */ 80588364387SHung-ying Tyan #define EC_CMD_PSTORE_INFO 0x40 80688364387SHung-ying Tyan 80788364387SHung-ying Tyan struct ec_response_pstore_info { 80888364387SHung-ying Tyan /* Persistent storage size, in bytes */ 80988364387SHung-ying Tyan uint32_t pstore_size; 81088364387SHung-ying Tyan /* Access size; read/write offset and size must be a multiple of this */ 81188364387SHung-ying Tyan uint32_t access_size; 81288364387SHung-ying Tyan } __packed; 81388364387SHung-ying Tyan 81488364387SHung-ying Tyan /* 81588364387SHung-ying Tyan * Read persistent storage 81688364387SHung-ying Tyan * 81788364387SHung-ying Tyan * Response is params.size bytes of data. 81888364387SHung-ying Tyan */ 81988364387SHung-ying Tyan #define EC_CMD_PSTORE_READ 0x41 82088364387SHung-ying Tyan 82188364387SHung-ying Tyan struct ec_params_pstore_read { 82288364387SHung-ying Tyan uint32_t offset; /* Byte offset to read */ 82388364387SHung-ying Tyan uint32_t size; /* Size to read in bytes */ 82488364387SHung-ying Tyan } __packed; 82588364387SHung-ying Tyan 82688364387SHung-ying Tyan /* Write persistent storage */ 82788364387SHung-ying Tyan #define EC_CMD_PSTORE_WRITE 0x42 82888364387SHung-ying Tyan 82988364387SHung-ying Tyan struct ec_params_pstore_write { 83088364387SHung-ying Tyan uint32_t offset; /* Byte offset to write */ 83188364387SHung-ying Tyan uint32_t size; /* Size to write in bytes */ 83288364387SHung-ying Tyan uint8_t data[EC_PSTORE_SIZE_MAX]; 83388364387SHung-ying Tyan } __packed; 83488364387SHung-ying Tyan 83588364387SHung-ying Tyan /*****************************************************************************/ 83688364387SHung-ying Tyan /* Real-time clock */ 83788364387SHung-ying Tyan 83888364387SHung-ying Tyan /* RTC params and response structures */ 83988364387SHung-ying Tyan struct ec_params_rtc { 84088364387SHung-ying Tyan uint32_t time; 84188364387SHung-ying Tyan } __packed; 84288364387SHung-ying Tyan 84388364387SHung-ying Tyan struct ec_response_rtc { 84488364387SHung-ying Tyan uint32_t time; 84588364387SHung-ying Tyan } __packed; 84688364387SHung-ying Tyan 84788364387SHung-ying Tyan /* These use ec_response_rtc */ 84888364387SHung-ying Tyan #define EC_CMD_RTC_GET_VALUE 0x44 84988364387SHung-ying Tyan #define EC_CMD_RTC_GET_ALARM 0x45 85088364387SHung-ying Tyan 85188364387SHung-ying Tyan /* These all use ec_params_rtc */ 85288364387SHung-ying Tyan #define EC_CMD_RTC_SET_VALUE 0x46 85388364387SHung-ying Tyan #define EC_CMD_RTC_SET_ALARM 0x47 85488364387SHung-ying Tyan 85588364387SHung-ying Tyan /*****************************************************************************/ 85688364387SHung-ying Tyan /* Port80 log access */ 85788364387SHung-ying Tyan 85888364387SHung-ying Tyan /* Get last port80 code from previous boot */ 85988364387SHung-ying Tyan #define EC_CMD_PORT80_LAST_BOOT 0x48 86088364387SHung-ying Tyan 86188364387SHung-ying Tyan struct ec_response_port80_last_boot { 86288364387SHung-ying Tyan uint16_t code; 86388364387SHung-ying Tyan } __packed; 86488364387SHung-ying Tyan 86588364387SHung-ying Tyan /*****************************************************************************/ 86688364387SHung-ying Tyan /* Thermal engine commands */ 86788364387SHung-ying Tyan 86888364387SHung-ying Tyan /* Set thershold value */ 86988364387SHung-ying Tyan #define EC_CMD_THERMAL_SET_THRESHOLD 0x50 87088364387SHung-ying Tyan 87188364387SHung-ying Tyan struct ec_params_thermal_set_threshold { 87288364387SHung-ying Tyan uint8_t sensor_type; 87388364387SHung-ying Tyan uint8_t threshold_id; 87488364387SHung-ying Tyan uint16_t value; 87588364387SHung-ying Tyan } __packed; 87688364387SHung-ying Tyan 87788364387SHung-ying Tyan /* Get threshold value */ 87888364387SHung-ying Tyan #define EC_CMD_THERMAL_GET_THRESHOLD 0x51 87988364387SHung-ying Tyan 88088364387SHung-ying Tyan struct ec_params_thermal_get_threshold { 88188364387SHung-ying Tyan uint8_t sensor_type; 88288364387SHung-ying Tyan uint8_t threshold_id; 88388364387SHung-ying Tyan } __packed; 88488364387SHung-ying Tyan 88588364387SHung-ying Tyan struct ec_response_thermal_get_threshold { 88688364387SHung-ying Tyan uint16_t value; 88788364387SHung-ying Tyan } __packed; 88888364387SHung-ying Tyan 88988364387SHung-ying Tyan /* Toggle automatic fan control */ 89088364387SHung-ying Tyan #define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52 89188364387SHung-ying Tyan 89288364387SHung-ying Tyan /* Get TMP006 calibration data */ 89388364387SHung-ying Tyan #define EC_CMD_TMP006_GET_CALIBRATION 0x53 89488364387SHung-ying Tyan 89588364387SHung-ying Tyan struct ec_params_tmp006_get_calibration { 89688364387SHung-ying Tyan uint8_t index; 89788364387SHung-ying Tyan } __packed; 89888364387SHung-ying Tyan 89988364387SHung-ying Tyan struct ec_response_tmp006_get_calibration { 90088364387SHung-ying Tyan float s0; 90188364387SHung-ying Tyan float b0; 90288364387SHung-ying Tyan float b1; 90388364387SHung-ying Tyan float b2; 90488364387SHung-ying Tyan } __packed; 90588364387SHung-ying Tyan 90688364387SHung-ying Tyan /* Set TMP006 calibration data */ 90788364387SHung-ying Tyan #define EC_CMD_TMP006_SET_CALIBRATION 0x54 90888364387SHung-ying Tyan 90988364387SHung-ying Tyan struct ec_params_tmp006_set_calibration { 91088364387SHung-ying Tyan uint8_t index; 91188364387SHung-ying Tyan uint8_t reserved[3]; /* Reserved; set 0 */ 91288364387SHung-ying Tyan float s0; 91388364387SHung-ying Tyan float b0; 91488364387SHung-ying Tyan float b1; 91588364387SHung-ying Tyan float b2; 91688364387SHung-ying Tyan } __packed; 91788364387SHung-ying Tyan 91888364387SHung-ying Tyan /*****************************************************************************/ 91988364387SHung-ying Tyan /* CROS_EC - Matrix KeyBoard Protocol */ 92088364387SHung-ying Tyan 92188364387SHung-ying Tyan /* 92288364387SHung-ying Tyan * Read key state 92388364387SHung-ying Tyan * 92488364387SHung-ying Tyan * Returns raw data for keyboard cols; see ec_response_cros_ec_info.cols for 92588364387SHung-ying Tyan * expected response size. 92688364387SHung-ying Tyan */ 92788364387SHung-ying Tyan #define EC_CMD_CROS_EC_STATE 0x60 92888364387SHung-ying Tyan 92988364387SHung-ying Tyan /* Provide information about the matrix : number of rows and columns */ 93088364387SHung-ying Tyan #define EC_CMD_CROS_EC_INFO 0x61 93188364387SHung-ying Tyan 93288364387SHung-ying Tyan struct ec_response_cros_ec_info { 93388364387SHung-ying Tyan uint32_t rows; 93488364387SHung-ying Tyan uint32_t cols; 93588364387SHung-ying Tyan uint8_t switches; 93688364387SHung-ying Tyan } __packed; 93788364387SHung-ying Tyan 93888364387SHung-ying Tyan /* Simulate key press */ 93988364387SHung-ying Tyan #define EC_CMD_CROS_EC_SIMULATE_KEY 0x62 94088364387SHung-ying Tyan 94188364387SHung-ying Tyan struct ec_params_cros_ec_simulate_key { 94288364387SHung-ying Tyan uint8_t col; 94388364387SHung-ying Tyan uint8_t row; 94488364387SHung-ying Tyan uint8_t pressed; 94588364387SHung-ying Tyan } __packed; 94688364387SHung-ying Tyan 94788364387SHung-ying Tyan /* Configure keyboard scanning */ 94888364387SHung-ying Tyan #define EC_CMD_CROS_EC_SET_CONFIG 0x64 94988364387SHung-ying Tyan #define EC_CMD_CROS_EC_GET_CONFIG 0x65 95088364387SHung-ying Tyan 95188364387SHung-ying Tyan /* flags */ 95288364387SHung-ying Tyan enum cros_ec_config_flags { 95388364387SHung-ying Tyan EC_CROS_EC_FLAGS_ENABLE = 1, /* Enable keyboard scanning */ 95488364387SHung-ying Tyan }; 95588364387SHung-ying Tyan 95688364387SHung-ying Tyan enum cros_ec_config_valid { 95788364387SHung-ying Tyan EC_CROS_EC_VALID_SCAN_PERIOD = 1 << 0, 95888364387SHung-ying Tyan EC_CROS_EC_VALID_POLL_TIMEOUT = 1 << 1, 95988364387SHung-ying Tyan EC_CROS_EC_VALID_MIN_POST_SCAN_DELAY = 1 << 3, 96088364387SHung-ying Tyan EC_CROS_EC_VALID_OUTPUT_SETTLE = 1 << 4, 96188364387SHung-ying Tyan EC_CROS_EC_VALID_DEBOUNCE_DOWN = 1 << 5, 96288364387SHung-ying Tyan EC_CROS_EC_VALID_DEBOUNCE_UP = 1 << 6, 96388364387SHung-ying Tyan EC_CROS_EC_VALID_FIFO_MAX_DEPTH = 1 << 7, 96488364387SHung-ying Tyan }; 96588364387SHung-ying Tyan 96688364387SHung-ying Tyan /* Configuration for our key scanning algorithm */ 96788364387SHung-ying Tyan struct ec_cros_ec_config { 96888364387SHung-ying Tyan uint32_t valid_mask; /* valid fields */ 96988364387SHung-ying Tyan uint8_t flags; /* some flags (enum cros_ec_config_flags) */ 97088364387SHung-ying Tyan uint8_t valid_flags; /* which flags are valid */ 97188364387SHung-ying Tyan uint16_t scan_period_us; /* period between start of scans */ 97288364387SHung-ying Tyan /* revert to interrupt mode after no activity for this long */ 97388364387SHung-ying Tyan uint32_t poll_timeout_us; 97488364387SHung-ying Tyan /* 97588364387SHung-ying Tyan * minimum post-scan relax time. Once we finish a scan we check 97688364387SHung-ying Tyan * the time until we are due to start the next one. If this time is 97788364387SHung-ying Tyan * shorter this field, we use this instead. 97888364387SHung-ying Tyan */ 97988364387SHung-ying Tyan uint16_t min_post_scan_delay_us; 98088364387SHung-ying Tyan /* delay between setting up output and waiting for it to settle */ 98188364387SHung-ying Tyan uint16_t output_settle_us; 98288364387SHung-ying Tyan uint16_t debounce_down_us; /* time for debounce on key down */ 98388364387SHung-ying Tyan uint16_t debounce_up_us; /* time for debounce on key up */ 98488364387SHung-ying Tyan /* maximum depth to allow for fifo (0 = no keyscan output) */ 98588364387SHung-ying Tyan uint8_t fifo_max_depth; 98688364387SHung-ying Tyan } __packed; 98788364387SHung-ying Tyan 98888364387SHung-ying Tyan struct ec_params_cros_ec_set_config { 98988364387SHung-ying Tyan struct ec_cros_ec_config config; 99088364387SHung-ying Tyan } __packed; 99188364387SHung-ying Tyan 99288364387SHung-ying Tyan struct ec_response_cros_ec_get_config { 99388364387SHung-ying Tyan struct ec_cros_ec_config config; 99488364387SHung-ying Tyan } __packed; 99588364387SHung-ying Tyan 99688364387SHung-ying Tyan /* Run the key scan emulation */ 99788364387SHung-ying Tyan #define EC_CMD_KEYSCAN_SEQ_CTRL 0x66 99888364387SHung-ying Tyan 99988364387SHung-ying Tyan enum ec_keyscan_seq_cmd { 100088364387SHung-ying Tyan EC_KEYSCAN_SEQ_STATUS = 0, /* Get status information */ 100188364387SHung-ying Tyan EC_KEYSCAN_SEQ_CLEAR = 1, /* Clear sequence */ 100288364387SHung-ying Tyan EC_KEYSCAN_SEQ_ADD = 2, /* Add item to sequence */ 100388364387SHung-ying Tyan EC_KEYSCAN_SEQ_START = 3, /* Start running sequence */ 100488364387SHung-ying Tyan EC_KEYSCAN_SEQ_COLLECT = 4, /* Collect sequence summary data */ 100588364387SHung-ying Tyan }; 100688364387SHung-ying Tyan 100788364387SHung-ying Tyan enum ec_collect_flags { 100888364387SHung-ying Tyan /* 100988364387SHung-ying Tyan * Indicates this scan was processed by the EC. Due to timing, some 101088364387SHung-ying Tyan * scans may be skipped. 101188364387SHung-ying Tyan */ 101288364387SHung-ying Tyan EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0, 101388364387SHung-ying Tyan }; 101488364387SHung-ying Tyan 101588364387SHung-ying Tyan struct ec_collect_item { 101688364387SHung-ying Tyan uint8_t flags; /* some flags (enum ec_collect_flags) */ 101788364387SHung-ying Tyan }; 101888364387SHung-ying Tyan 101988364387SHung-ying Tyan struct ec_params_keyscan_seq_ctrl { 102088364387SHung-ying Tyan uint8_t cmd; /* Command to send (enum ec_keyscan_seq_cmd) */ 102188364387SHung-ying Tyan union { 102288364387SHung-ying Tyan struct { 102388364387SHung-ying Tyan uint8_t active; /* still active */ 102488364387SHung-ying Tyan uint8_t num_items; /* number of items */ 102588364387SHung-ying Tyan /* Current item being presented */ 102688364387SHung-ying Tyan uint8_t cur_item; 102788364387SHung-ying Tyan } status; 102888364387SHung-ying Tyan struct { 102988364387SHung-ying Tyan /* 103088364387SHung-ying Tyan * Absolute time for this scan, measured from the 103188364387SHung-ying Tyan * start of the sequence. 103288364387SHung-ying Tyan */ 103388364387SHung-ying Tyan uint32_t time_us; 103488364387SHung-ying Tyan uint8_t scan[0]; /* keyscan data */ 103588364387SHung-ying Tyan } add; 103688364387SHung-ying Tyan struct { 103788364387SHung-ying Tyan uint8_t start_item; /* First item to return */ 103888364387SHung-ying Tyan uint8_t num_items; /* Number of items to return */ 103988364387SHung-ying Tyan } collect; 104088364387SHung-ying Tyan }; 104188364387SHung-ying Tyan } __packed; 104288364387SHung-ying Tyan 104388364387SHung-ying Tyan struct ec_result_keyscan_seq_ctrl { 104488364387SHung-ying Tyan union { 104588364387SHung-ying Tyan struct { 104688364387SHung-ying Tyan uint8_t num_items; /* Number of items */ 104788364387SHung-ying Tyan /* Data for each item */ 104888364387SHung-ying Tyan struct ec_collect_item item[0]; 104988364387SHung-ying Tyan } collect; 105088364387SHung-ying Tyan }; 105188364387SHung-ying Tyan } __packed; 105288364387SHung-ying Tyan 105388364387SHung-ying Tyan /*****************************************************************************/ 105488364387SHung-ying Tyan /* Temperature sensor commands */ 105588364387SHung-ying Tyan 105688364387SHung-ying Tyan /* Read temperature sensor info */ 105788364387SHung-ying Tyan #define EC_CMD_TEMP_SENSOR_GET_INFO 0x70 105888364387SHung-ying Tyan 105988364387SHung-ying Tyan struct ec_params_temp_sensor_get_info { 106088364387SHung-ying Tyan uint8_t id; 106188364387SHung-ying Tyan } __packed; 106288364387SHung-ying Tyan 106388364387SHung-ying Tyan struct ec_response_temp_sensor_get_info { 106488364387SHung-ying Tyan char sensor_name[32]; 106588364387SHung-ying Tyan uint8_t sensor_type; 106688364387SHung-ying Tyan } __packed; 106788364387SHung-ying Tyan 106888364387SHung-ying Tyan /*****************************************************************************/ 106988364387SHung-ying Tyan 107088364387SHung-ying Tyan /* 107188364387SHung-ying Tyan * Note: host commands 0x80 - 0x87 are reserved to avoid conflict with ACPI 107288364387SHung-ying Tyan * commands accidentally sent to the wrong interface. See the ACPI section 107388364387SHung-ying Tyan * below. 107488364387SHung-ying Tyan */ 107588364387SHung-ying Tyan 107688364387SHung-ying Tyan /*****************************************************************************/ 107788364387SHung-ying Tyan /* Host event commands */ 107888364387SHung-ying Tyan 107988364387SHung-ying Tyan /* 108088364387SHung-ying Tyan * Host event mask params and response structures, shared by all of the host 108188364387SHung-ying Tyan * event commands below. 108288364387SHung-ying Tyan */ 108388364387SHung-ying Tyan struct ec_params_host_event_mask { 108488364387SHung-ying Tyan uint32_t mask; 108588364387SHung-ying Tyan } __packed; 108688364387SHung-ying Tyan 108788364387SHung-ying Tyan struct ec_response_host_event_mask { 108888364387SHung-ying Tyan uint32_t mask; 108988364387SHung-ying Tyan } __packed; 109088364387SHung-ying Tyan 109188364387SHung-ying Tyan /* These all use ec_response_host_event_mask */ 109288364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_B 0x87 109388364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_SMI_MASK 0x88 109488364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_SCI_MASK 0x89 109588364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_GET_WAKE_MASK 0x8d 109688364387SHung-ying Tyan 109788364387SHung-ying Tyan /* These all use ec_params_host_event_mask */ 109888364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_SMI_MASK 0x8a 109988364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_SCI_MASK 0x8b 110088364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_CLEAR 0x8c 110188364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_SET_WAKE_MASK 0x8e 110288364387SHung-ying Tyan #define EC_CMD_HOST_EVENT_CLEAR_B 0x8f 110388364387SHung-ying Tyan 110488364387SHung-ying Tyan /*****************************************************************************/ 110588364387SHung-ying Tyan /* Switch commands */ 110688364387SHung-ying Tyan 110788364387SHung-ying Tyan /* Enable/disable LCD backlight */ 110888364387SHung-ying Tyan #define EC_CMD_SWITCH_ENABLE_BKLIGHT 0x90 110988364387SHung-ying Tyan 111088364387SHung-ying Tyan struct ec_params_switch_enable_backlight { 111188364387SHung-ying Tyan uint8_t enabled; 111288364387SHung-ying Tyan } __packed; 111388364387SHung-ying Tyan 111488364387SHung-ying Tyan /* Enable/disable WLAN/Bluetooth */ 111588364387SHung-ying Tyan #define EC_CMD_SWITCH_ENABLE_WIRELESS 0x91 111688364387SHung-ying Tyan 111788364387SHung-ying Tyan struct ec_params_switch_enable_wireless { 111888364387SHung-ying Tyan uint8_t enabled; 111988364387SHung-ying Tyan } __packed; 112088364387SHung-ying Tyan 112188364387SHung-ying Tyan /*****************************************************************************/ 112288364387SHung-ying Tyan /* GPIO commands. Only available on EC if write protect has been disabled. */ 112388364387SHung-ying Tyan 112488364387SHung-ying Tyan /* Set GPIO output value */ 112588364387SHung-ying Tyan #define EC_CMD_GPIO_SET 0x92 112688364387SHung-ying Tyan 112788364387SHung-ying Tyan struct ec_params_gpio_set { 112888364387SHung-ying Tyan char name[32]; 112988364387SHung-ying Tyan uint8_t val; 113088364387SHung-ying Tyan } __packed; 113188364387SHung-ying Tyan 113288364387SHung-ying Tyan /* Get GPIO value */ 113388364387SHung-ying Tyan #define EC_CMD_GPIO_GET 0x93 113488364387SHung-ying Tyan 113588364387SHung-ying Tyan struct ec_params_gpio_get { 113688364387SHung-ying Tyan char name[32]; 113788364387SHung-ying Tyan } __packed; 113888364387SHung-ying Tyan struct ec_response_gpio_get { 113988364387SHung-ying Tyan uint8_t val; 114088364387SHung-ying Tyan } __packed; 114188364387SHung-ying Tyan 114288364387SHung-ying Tyan /*****************************************************************************/ 114388364387SHung-ying Tyan /* I2C commands. Only available when flash write protect is unlocked. */ 114488364387SHung-ying Tyan 114588364387SHung-ying Tyan /* Read I2C bus */ 114688364387SHung-ying Tyan #define EC_CMD_I2C_READ 0x94 114788364387SHung-ying Tyan 114888364387SHung-ying Tyan struct ec_params_i2c_read { 114988364387SHung-ying Tyan uint16_t addr; 115088364387SHung-ying Tyan uint8_t read_size; /* Either 8 or 16. */ 115188364387SHung-ying Tyan uint8_t port; 115288364387SHung-ying Tyan uint8_t offset; 115388364387SHung-ying Tyan } __packed; 115488364387SHung-ying Tyan struct ec_response_i2c_read { 115588364387SHung-ying Tyan uint16_t data; 115688364387SHung-ying Tyan } __packed; 115788364387SHung-ying Tyan 115888364387SHung-ying Tyan /* Write I2C bus */ 115988364387SHung-ying Tyan #define EC_CMD_I2C_WRITE 0x95 116088364387SHung-ying Tyan 116188364387SHung-ying Tyan struct ec_params_i2c_write { 116288364387SHung-ying Tyan uint16_t data; 116388364387SHung-ying Tyan uint16_t addr; 116488364387SHung-ying Tyan uint8_t write_size; /* Either 8 or 16. */ 116588364387SHung-ying Tyan uint8_t port; 116688364387SHung-ying Tyan uint8_t offset; 116788364387SHung-ying Tyan } __packed; 116888364387SHung-ying Tyan 116988364387SHung-ying Tyan /*****************************************************************************/ 117088364387SHung-ying Tyan /* Charge state commands. Only available when flash write protect unlocked. */ 117188364387SHung-ying Tyan 117288364387SHung-ying Tyan /* Force charge state machine to stop in idle mode */ 117388364387SHung-ying Tyan #define EC_CMD_CHARGE_FORCE_IDLE 0x96 117488364387SHung-ying Tyan 117588364387SHung-ying Tyan struct ec_params_force_idle { 117688364387SHung-ying Tyan uint8_t enabled; 117788364387SHung-ying Tyan } __packed; 117888364387SHung-ying Tyan 117988364387SHung-ying Tyan /*****************************************************************************/ 118088364387SHung-ying Tyan /* Console commands. Only available when flash write protect is unlocked. */ 118188364387SHung-ying Tyan 118288364387SHung-ying Tyan /* Snapshot console output buffer for use by EC_CMD_CONSOLE_READ. */ 118388364387SHung-ying Tyan #define EC_CMD_CONSOLE_SNAPSHOT 0x97 118488364387SHung-ying Tyan 118588364387SHung-ying Tyan /* 118688364387SHung-ying Tyan * Read next chunk of data from saved snapshot. 118788364387SHung-ying Tyan * 118888364387SHung-ying Tyan * Response is null-terminated string. Empty string, if there is no more 118988364387SHung-ying Tyan * remaining output. 119088364387SHung-ying Tyan */ 119188364387SHung-ying Tyan #define EC_CMD_CONSOLE_READ 0x98 119288364387SHung-ying Tyan 119388364387SHung-ying Tyan /*****************************************************************************/ 119488364387SHung-ying Tyan 119588364387SHung-ying Tyan /* 119688364387SHung-ying Tyan * Cut off battery power output if the battery supports. 119788364387SHung-ying Tyan * 119888364387SHung-ying Tyan * For unsupported battery, just don't implement this command and lets EC 119988364387SHung-ying Tyan * return EC_RES_INVALID_COMMAND. 120088364387SHung-ying Tyan */ 120188364387SHung-ying Tyan #define EC_CMD_BATTERY_CUT_OFF 0x99 120288364387SHung-ying Tyan 120388364387SHung-ying Tyan /*****************************************************************************/ 120488364387SHung-ying Tyan /* USB port mux control. */ 120588364387SHung-ying Tyan 120688364387SHung-ying Tyan /* 120788364387SHung-ying Tyan * Switch USB mux or return to automatic switching. 120888364387SHung-ying Tyan */ 120988364387SHung-ying Tyan #define EC_CMD_USB_MUX 0x9a 121088364387SHung-ying Tyan 121188364387SHung-ying Tyan struct ec_params_usb_mux { 121288364387SHung-ying Tyan uint8_t mux; 121388364387SHung-ying Tyan } __packed; 121488364387SHung-ying Tyan 121588364387SHung-ying Tyan /*****************************************************************************/ 121688364387SHung-ying Tyan /* LDOs / FETs control. */ 121788364387SHung-ying Tyan 121888364387SHung-ying Tyan enum ec_ldo_state { 121988364387SHung-ying Tyan EC_LDO_STATE_OFF = 0, /* the LDO / FET is shut down */ 122088364387SHung-ying Tyan EC_LDO_STATE_ON = 1, /* the LDO / FET is ON / providing power */ 122188364387SHung-ying Tyan }; 122288364387SHung-ying Tyan 122388364387SHung-ying Tyan /* 122488364387SHung-ying Tyan * Switch on/off a LDO. 122588364387SHung-ying Tyan */ 122688364387SHung-ying Tyan #define EC_CMD_LDO_SET 0x9b 122788364387SHung-ying Tyan 122888364387SHung-ying Tyan struct ec_params_ldo_set { 122988364387SHung-ying Tyan uint8_t index; 123088364387SHung-ying Tyan uint8_t state; 123188364387SHung-ying Tyan } __packed; 123288364387SHung-ying Tyan 123388364387SHung-ying Tyan /* 123488364387SHung-ying Tyan * Get LDO state. 123588364387SHung-ying Tyan */ 123688364387SHung-ying Tyan #define EC_CMD_LDO_GET 0x9c 123788364387SHung-ying Tyan 123888364387SHung-ying Tyan struct ec_params_ldo_get { 123988364387SHung-ying Tyan uint8_t index; 124088364387SHung-ying Tyan } __packed; 124188364387SHung-ying Tyan 124288364387SHung-ying Tyan struct ec_response_ldo_get { 124388364387SHung-ying Tyan uint8_t state; 124488364387SHung-ying Tyan } __packed; 124588364387SHung-ying Tyan 124688364387SHung-ying Tyan /*****************************************************************************/ 124788364387SHung-ying Tyan /* Temporary debug commands. TODO: remove this crosbug.com/p/13849 */ 124888364387SHung-ying Tyan 124988364387SHung-ying Tyan /* 125088364387SHung-ying Tyan * Dump charge state machine context. 125188364387SHung-ying Tyan * 125288364387SHung-ying Tyan * Response is a binary dump of charge state machine context. 125388364387SHung-ying Tyan */ 125488364387SHung-ying Tyan #define EC_CMD_CHARGE_DUMP 0xa0 125588364387SHung-ying Tyan 125688364387SHung-ying Tyan /* 125788364387SHung-ying Tyan * Set maximum battery charging current. 125888364387SHung-ying Tyan */ 125988364387SHung-ying Tyan #define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1 126088364387SHung-ying Tyan 126188364387SHung-ying Tyan struct ec_params_current_limit { 126288364387SHung-ying Tyan uint32_t limit; 126388364387SHung-ying Tyan } __packed; 126488364387SHung-ying Tyan 126588364387SHung-ying Tyan /*****************************************************************************/ 126688364387SHung-ying Tyan /* Smart battery pass-through */ 126788364387SHung-ying Tyan 126888364387SHung-ying Tyan /* Get / Set 16-bit smart battery registers */ 126988364387SHung-ying Tyan #define EC_CMD_SB_READ_WORD 0xb0 127088364387SHung-ying Tyan #define EC_CMD_SB_WRITE_WORD 0xb1 127188364387SHung-ying Tyan 127288364387SHung-ying Tyan /* Get / Set string smart battery parameters 127388364387SHung-ying Tyan * formatted as SMBUS "block". 127488364387SHung-ying Tyan */ 127588364387SHung-ying Tyan #define EC_CMD_SB_READ_BLOCK 0xb2 127688364387SHung-ying Tyan #define EC_CMD_SB_WRITE_BLOCK 0xb3 127788364387SHung-ying Tyan 127888364387SHung-ying Tyan struct ec_params_sb_rd { 127988364387SHung-ying Tyan uint8_t reg; 128088364387SHung-ying Tyan } __packed; 128188364387SHung-ying Tyan 128288364387SHung-ying Tyan struct ec_response_sb_rd_word { 128388364387SHung-ying Tyan uint16_t value; 128488364387SHung-ying Tyan } __packed; 128588364387SHung-ying Tyan 128688364387SHung-ying Tyan struct ec_params_sb_wr_word { 128788364387SHung-ying Tyan uint8_t reg; 128888364387SHung-ying Tyan uint16_t value; 128988364387SHung-ying Tyan } __packed; 129088364387SHung-ying Tyan 129188364387SHung-ying Tyan struct ec_response_sb_rd_block { 129288364387SHung-ying Tyan uint8_t data[32]; 129388364387SHung-ying Tyan } __packed; 129488364387SHung-ying Tyan 129588364387SHung-ying Tyan struct ec_params_sb_wr_block { 129688364387SHung-ying Tyan uint8_t reg; 129788364387SHung-ying Tyan uint16_t data[32]; 129888364387SHung-ying Tyan } __packed; 129988364387SHung-ying Tyan 130088364387SHung-ying Tyan /*****************************************************************************/ 130188364387SHung-ying Tyan /* System commands */ 130288364387SHung-ying Tyan 130388364387SHung-ying Tyan /* 130488364387SHung-ying Tyan * TODO: this is a confusing name, since it doesn't necessarily reboot the EC. 130588364387SHung-ying Tyan * Rename to "set image" or something similar. 130688364387SHung-ying Tyan */ 130788364387SHung-ying Tyan #define EC_CMD_REBOOT_EC 0xd2 130888364387SHung-ying Tyan 130988364387SHung-ying Tyan /* Command */ 131088364387SHung-ying Tyan enum ec_reboot_cmd { 131188364387SHung-ying Tyan EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */ 131288364387SHung-ying Tyan EC_REBOOT_JUMP_RO = 1, /* Jump to RO without rebooting */ 131388364387SHung-ying Tyan EC_REBOOT_JUMP_RW = 2, /* Jump to RW without rebooting */ 131488364387SHung-ying Tyan /* (command 3 was jump to RW-B) */ 131588364387SHung-ying Tyan EC_REBOOT_COLD = 4, /* Cold-reboot */ 131688364387SHung-ying Tyan EC_REBOOT_DISABLE_JUMP = 5, /* Disable jump until next reboot */ 131788364387SHung-ying Tyan EC_REBOOT_HIBERNATE = 6 /* Hibernate EC */ 131888364387SHung-ying Tyan }; 131988364387SHung-ying Tyan 132088364387SHung-ying Tyan /* Flags for ec_params_reboot_ec.reboot_flags */ 132188364387SHung-ying Tyan #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */ 132288364387SHung-ying Tyan #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */ 132388364387SHung-ying Tyan 132488364387SHung-ying Tyan struct ec_params_reboot_ec { 132588364387SHung-ying Tyan uint8_t cmd; /* enum ec_reboot_cmd */ 132688364387SHung-ying Tyan uint8_t flags; /* See EC_REBOOT_FLAG_* */ 132788364387SHung-ying Tyan } __packed; 132888364387SHung-ying Tyan 132988364387SHung-ying Tyan /* 133088364387SHung-ying Tyan * Get information on last EC panic. 133188364387SHung-ying Tyan * 133288364387SHung-ying Tyan * Returns variable-length platform-dependent panic information. See panic.h 133388364387SHung-ying Tyan * for details. 133488364387SHung-ying Tyan */ 133588364387SHung-ying Tyan #define EC_CMD_GET_PANIC_INFO 0xd3 133688364387SHung-ying Tyan 133788364387SHung-ying Tyan /*****************************************************************************/ 133888364387SHung-ying Tyan /* 133988364387SHung-ying Tyan * ACPI commands 134088364387SHung-ying Tyan * 134188364387SHung-ying Tyan * These are valid ONLY on the ACPI command/data port. 134288364387SHung-ying Tyan */ 134388364387SHung-ying Tyan 134488364387SHung-ying Tyan /* 134588364387SHung-ying Tyan * ACPI Read Embedded Controller 134688364387SHung-ying Tyan * 134788364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 134888364387SHung-ying Tyan * 134988364387SHung-ying Tyan * Use the following sequence: 135088364387SHung-ying Tyan * 135188364387SHung-ying Tyan * - Write EC_CMD_ACPI_READ to EC_LPC_ADDR_ACPI_CMD 135288364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 135388364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 135488364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_DATA bit to set 135588364387SHung-ying Tyan * - Read value from EC_LPC_ADDR_ACPI_DATA 135688364387SHung-ying Tyan */ 135788364387SHung-ying Tyan #define EC_CMD_ACPI_READ 0x80 135888364387SHung-ying Tyan 135988364387SHung-ying Tyan /* 136088364387SHung-ying Tyan * ACPI Write Embedded Controller 136188364387SHung-ying Tyan * 136288364387SHung-ying Tyan * This reads from ACPI memory space on the EC (EC_ACPI_MEM_*). 136388364387SHung-ying Tyan * 136488364387SHung-ying Tyan * Use the following sequence: 136588364387SHung-ying Tyan * 136688364387SHung-ying Tyan * - Write EC_CMD_ACPI_WRITE to EC_LPC_ADDR_ACPI_CMD 136788364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 136888364387SHung-ying Tyan * - Write address to EC_LPC_ADDR_ACPI_DATA 136988364387SHung-ying Tyan * - Wait for EC_LPC_CMDR_PENDING bit to clear 137088364387SHung-ying Tyan * - Write value to EC_LPC_ADDR_ACPI_DATA 137188364387SHung-ying Tyan */ 137288364387SHung-ying Tyan #define EC_CMD_ACPI_WRITE 0x81 137388364387SHung-ying Tyan 137488364387SHung-ying Tyan /* 137588364387SHung-ying Tyan * ACPI Query Embedded Controller 137688364387SHung-ying Tyan * 137788364387SHung-ying Tyan * This clears the lowest-order bit in the currently pending host events, and 137888364387SHung-ying Tyan * sets the result code to the 1-based index of the bit (event 0x00000001 = 1, 137988364387SHung-ying Tyan * event 0x80000000 = 32), or 0 if no event was pending. 138088364387SHung-ying Tyan */ 138188364387SHung-ying Tyan #define EC_CMD_ACPI_QUERY_EVENT 0x84 138288364387SHung-ying Tyan 138388364387SHung-ying Tyan /* Valid addresses in ACPI memory space, for read/write commands */ 138488364387SHung-ying Tyan /* Memory space version; set to EC_ACPI_MEM_VERSION_CURRENT */ 138588364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION 0x00 138688364387SHung-ying Tyan /* 138788364387SHung-ying Tyan * Test location; writing value here updates test compliment byte to (0xff - 138888364387SHung-ying Tyan * value). 138988364387SHung-ying Tyan */ 139088364387SHung-ying Tyan #define EC_ACPI_MEM_TEST 0x01 139188364387SHung-ying Tyan /* Test compliment; writes here are ignored. */ 139288364387SHung-ying Tyan #define EC_ACPI_MEM_TEST_COMPLIMENT 0x02 139388364387SHung-ying Tyan /* Keyboard backlight brightness percent (0 - 100) */ 139488364387SHung-ying Tyan #define EC_ACPI_MEM_KEYBOARD_BACKLIGHT 0x03 139588364387SHung-ying Tyan 139688364387SHung-ying Tyan /* Current version of ACPI memory address space */ 139788364387SHung-ying Tyan #define EC_ACPI_MEM_VERSION_CURRENT 1 139888364387SHung-ying Tyan 139988364387SHung-ying Tyan 140088364387SHung-ying Tyan /*****************************************************************************/ 140188364387SHung-ying Tyan /* 140288364387SHung-ying Tyan * Special commands 140388364387SHung-ying Tyan * 140488364387SHung-ying Tyan * These do not follow the normal rules for commands. See each command for 140588364387SHung-ying Tyan * details. 140688364387SHung-ying Tyan */ 140788364387SHung-ying Tyan 140888364387SHung-ying Tyan /* 140988364387SHung-ying Tyan * Reboot NOW 141088364387SHung-ying Tyan * 141188364387SHung-ying Tyan * This command will work even when the EC LPC interface is busy, because the 141288364387SHung-ying Tyan * reboot command is processed at interrupt level. Note that when the EC 141388364387SHung-ying Tyan * reboots, the host will reboot too, so there is no response to this command. 141488364387SHung-ying Tyan * 141588364387SHung-ying Tyan * Use EC_CMD_REBOOT_EC to reboot the EC more politely. 141688364387SHung-ying Tyan */ 141788364387SHung-ying Tyan #define EC_CMD_REBOOT 0xd1 /* Think "die" */ 141888364387SHung-ying Tyan 141988364387SHung-ying Tyan /* 142088364387SHung-ying Tyan * Resend last response (not supported on LPC). 142188364387SHung-ying Tyan * 142288364387SHung-ying Tyan * Returns EC_RES_UNAVAILABLE if there is no response available - for example, 142388364387SHung-ying Tyan * there was no previous command, or the previous command's response was too 142488364387SHung-ying Tyan * big to save. 142588364387SHung-ying Tyan */ 142688364387SHung-ying Tyan #define EC_CMD_RESEND_RESPONSE 0xdb 142788364387SHung-ying Tyan 142888364387SHung-ying Tyan /* 142988364387SHung-ying Tyan * This header byte on a command indicate version 0. Any header byte less 143088364387SHung-ying Tyan * than this means that we are talking to an old EC which doesn't support 143188364387SHung-ying Tyan * versioning. In that case, we assume version 0. 143288364387SHung-ying Tyan * 143388364387SHung-ying Tyan * Header bytes greater than this indicate a later version. For example, 143488364387SHung-ying Tyan * EC_CMD_VERSION0 + 1 means we are using version 1. 143588364387SHung-ying Tyan * 143688364387SHung-ying Tyan * The old EC interface must not use commands 0dc or higher. 143788364387SHung-ying Tyan */ 143888364387SHung-ying Tyan #define EC_CMD_VERSION0 0xdc 143988364387SHung-ying Tyan 144088364387SHung-ying Tyan #endif /* !__ACPI__ */ 144188364387SHung-ying Tyan 144288364387SHung-ying Tyan #endif /* __CROS_EC_COMMANDS_H */ 1443