chrome ec: Update EC header from EC repository

- Updated ec_commands.h is copied in directly from EC repo
- Removed "old" interface and update resources for "new" interface
- Updated temp sensor constants and added "not calibrated"
- Update mainboards to remove check for EC_SWITCH_KEYBOARD_RECOVERY

Change-Id: Ic93c1914f86b6f5bc224178270624ed92b5c1e15
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: http://review.coreboot.org/3743
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Duncan Laurie 2013-06-03 10:38:22 -07:00 committed by Stefan Reinauer
parent e8b08ba47c
commit 433432b654
6 changed files with 530 additions and 127 deletions

View File

@ -29,9 +29,10 @@ Device (EC0)
Name (_UID, 1) Name (_UID, 1)
Name (_GPE, EC_SCI_GPI) Name (_GPE, EC_SCI_GPI)
Name (TOFS, EC_TEMP_SENSOR_OFFSET) Name (TOFS, EC_TEMP_SENSOR_OFFSET)
Name (TNOP, 0xFD) // Thermal sensor has no power Name (TNCA, EC_TEMP_SENSOR_NOT_CALIBRATED)
Name (TBAD, 0xFE) // Thermal sensor bad reading Name (TNOP, EC_TEMP_SENSOR_NOT_POWERED)
Name (TNPR, 0xFF) // Thermal sensor not present Name (TBAD, EC_TEMP_SENSOR_ERROR)
Name (TNPR, EC_TEMP_SENSOR_NOT_PRESENT)
Name (DWRN, 15) // Battery capacity warning at 15% Name (DWRN, 15) // Battery capacity warning at 15%
Name (DLOW, 10) // Battery capacity low at 10% Name (DLOW, 10) // Battery capacity low at 10%

View File

@ -29,8 +29,8 @@
* SIO_EC_HOST_ENABLE : Enable EC host command interface resources * SIO_EC_HOST_ENABLE : Enable EC host command interface resources
* EC_LPC_ADDR_HOST_DATA : EC host command interface data port * EC_LPC_ADDR_HOST_DATA : EC host command interface data port
* EC_LPC_ADDR_HOST_CMD : EC host command interface command port * EC_LPC_ADDR_HOST_CMD : EC host command interface command port
* EC_LPC_ADDR_OLD_PARAM : EC host command parameter range base (old) * EC_LPC_ADDR_HOST_ARGS : EC host command arguments
* EC_OLD_PARAM_SIZE : Parameter buffer size (old) * EC_LPC_ADDR_HOST_PARAM : EC host command parameter buffer
*/ */
// Scope is \_SB.PCI0.LPCB // Scope is \_SB.PCI0.LPCB
@ -75,8 +75,9 @@ Device (SIO) {
{ {
FixedIO (EC_LPC_ADDR_HOST_DATA, 1) FixedIO (EC_LPC_ADDR_HOST_DATA, 1)
FixedIO (EC_LPC_ADDR_HOST_CMD, 1) FixedIO (EC_LPC_ADDR_HOST_CMD, 1)
FixedIO (EC_LPC_ADDR_OLD_PARAM, FixedIO (EC_LPC_ADDR_HOST_ARGS, 4)
EC_OLD_PARAM_SIZE) FixedIO (EC_LPC_ADDR_HOST_PARAM,
EC_HOST_PARAM_SIZE)
}) })
Name (_PRS, ResourceTemplate () Name (_PRS, ResourceTemplate ()
@ -84,8 +85,9 @@ Device (SIO) {
StartDependentFn (0, 0) { StartDependentFn (0, 0) {
FixedIO (EC_LPC_ADDR_HOST_DATA, 1) FixedIO (EC_LPC_ADDR_HOST_DATA, 1)
FixedIO (EC_LPC_ADDR_HOST_CMD, 1) FixedIO (EC_LPC_ADDR_HOST_CMD, 1)
FixedIO (EC_LPC_ADDR_OLD_PARAM, FixedIO (EC_LPC_ADDR_HOST_ARGS, 4)
EC_OLD_PARAM_SIZE) FixedIO (EC_LPC_ADDR_HOST_PARAM,
EC_HOST_PARAM_SIZE)
} }
EndDependentFn () EndDependentFn ()
}) })

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be * Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file. * found in the LICENSE file.
*/ */
@ -46,10 +46,6 @@
#define EC_LPC_ADDR_HOST_PARAM 0x804 #define EC_LPC_ADDR_HOST_PARAM 0x804
#define EC_HOST_PARAM_SIZE 0x0fc /* Size of param area in bytes */ #define EC_HOST_PARAM_SIZE 0x0fc /* Size of param area in bytes */
/* I/O addresses for host command params, old interface */
#define EC_LPC_ADDR_OLD_PARAM 0x880
#define EC_OLD_PARAM_SIZE 0x080 /* Size of param area in bytes */
/* EC command register bit functions */ /* EC command register bit functions */
#define EC_LPC_CMDR_DATA (1 << 0) /* Data ready for host to read */ #define EC_LPC_CMDR_DATA (1 << 0) /* Data ready for host to read */
#define EC_LPC_CMDR_PENDING (1 << 1) /* Write pending to EC */ #define EC_LPC_CMDR_PENDING (1 << 1) /* Write pending to EC */
@ -100,6 +96,7 @@
#define EC_TEMP_SENSOR_NOT_PRESENT 0xff #define EC_TEMP_SENSOR_NOT_PRESENT 0xff
#define EC_TEMP_SENSOR_ERROR 0xfe #define EC_TEMP_SENSOR_ERROR 0xfe
#define EC_TEMP_SENSOR_NOT_POWERED 0xfd #define EC_TEMP_SENSOR_NOT_POWERED 0xfd
#define EC_TEMP_SENSOR_NOT_CALIBRATED 0xfc
/* /*
* The offset of temperature value stored in mapped memory. This allows * The offset of temperature value stored in mapped memory. This allows
* reporting a temperature range of 200K to 454K = -73C to 181C. * reporting a temperature range of 200K to 454K = -73C to 181C.
@ -121,8 +118,8 @@
#define EC_SWITCH_LID_OPEN 0x01 #define EC_SWITCH_LID_OPEN 0x01
#define EC_SWITCH_POWER_BUTTON_PRESSED 0x02 #define EC_SWITCH_POWER_BUTTON_PRESSED 0x02
#define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04 #define EC_SWITCH_WRITE_PROTECT_DISABLED 0x04
/* Recovery requested via keyboard */ /* Was recovery requested via keyboard; now unused. */
#define EC_SWITCH_KEYBOARD_RECOVERY 0x08 #define EC_SWITCH_IGNORE1 0x08
/* Recovery requested via dedicated signal (from servo board) */ /* Recovery requested via dedicated signal (from servo board) */
#define EC_SWITCH_DEDICATED_RECOVERY 0x10 #define EC_SWITCH_DEDICATED_RECOVERY 0x10
/* Was fake developer mode switch; now unused. Remove in next refactor. */ /* Was fake developer mode switch; now unused. Remove in next refactor. */
@ -135,6 +132,7 @@
/* Wireless switch flags */ /* Wireless switch flags */
#define EC_WIRELESS_SWITCH_WLAN 0x01 #define EC_WIRELESS_SWITCH_WLAN 0x01
#define EC_WIRELESS_SWITCH_BLUETOOTH 0x02 #define EC_WIRELESS_SWITCH_BLUETOOTH 0x02
#define EC_WIRELESS_SWITCH_WWAN 0x04
/* /*
* This header file is used in coreboot both in C and ACPI code. The ACPI code * This header file is used in coreboot both in C and ACPI code. The ACPI code
@ -186,6 +184,10 @@ enum ec_status {
EC_RES_INVALID_RESPONSE = 5, EC_RES_INVALID_RESPONSE = 5,
EC_RES_INVALID_VERSION = 6, EC_RES_INVALID_VERSION = 6,
EC_RES_INVALID_CHECKSUM = 7, EC_RES_INVALID_CHECKSUM = 7,
EC_RES_IN_PROGRESS = 8, /* Accepted, command in progress */
EC_RES_UNAVAILABLE = 9, /* No response available */
EC_RES_TIMEOUT = 10, /* We got a timeout */
EC_RES_OVERFLOW = 11, /* Table / data overflow */
}; };
/* /*
@ -388,6 +390,25 @@ struct ec_response_get_cmd_versions {
uint32_t version_mask; uint32_t version_mask;
} __packed; } __packed;
/*
* Check EC communcations status (busy). This is needed on i2c/spi but not
* on lpc since it has its own out-of-band busy indicator.
*
* lpc must read the status from the command register. Attempting this on
* lpc will overwrite the args/parameter space and corrupt its data.
*/
#define EC_CMD_GET_COMMS_STATUS 0x09
/* Avoid using ec_status which is for return values */
enum ec_comms_status {
EC_COMMS_STATUS_PROCESSING = 1 << 0, /* Processing cmd */
};
struct ec_response_get_comms_status {
uint32_t flags; /* Mask of enum ec_comms_status */
} __packed;
/*****************************************************************************/ /*****************************************************************************/
/* Flash commands */ /* Flash commands */
@ -468,8 +489,8 @@ struct ec_params_flash_erase {
* be changed. * be changed.
*/ */
#define EC_FLASH_PROTECT_RO_NOW (1 << 1) #define EC_FLASH_PROTECT_RO_NOW (1 << 1)
/* RW flash code protected now, until reboot. */ /* Entire flash code protected now, until reboot. */
#define EC_FLASH_PROTECT_RW_NOW (1 << 2) #define EC_FLASH_PROTECT_ALL_NOW (1 << 2)
/* Flash write protect GPIO is asserted now */ /* Flash write protect GPIO is asserted now */
#define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3) #define EC_FLASH_PROTECT_GPIO_ASSERTED (1 << 3)
/* Error - at least one bank of flash is stuck locked, and cannot be unlocked */ /* Error - at least one bank of flash is stuck locked, and cannot be unlocked */
@ -480,8 +501,8 @@ struct ec_params_flash_erase {
* re-requesting the desired flags, or by a hard reset if that fails. * re-requesting the desired flags, or by a hard reset if that fails.
*/ */
#define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5) #define EC_FLASH_PROTECT_ERROR_INCONSISTENT (1 << 5)
/* RW flash code protected when the EC boots */ /* Entile flash code protected when the EC boots */
#define EC_FLASH_PROTECT_RW_AT_BOOT (1 << 6) #define EC_FLASH_PROTECT_ALL_AT_BOOT (1 << 6)
struct ec_params_flash_protect { struct ec_params_flash_protect {
uint32_t mask; /* Bits in flags to apply */ uint32_t mask; /* Bits in flags to apply */
@ -531,6 +552,24 @@ struct ec_response_flash_region_info {
uint32_t size; uint32_t size;
} __packed; } __packed;
/* Read/write VbNvContext */
#define EC_CMD_VBNV_CONTEXT 0x17
#define EC_VER_VBNV_CONTEXT 1
#define EC_VBNV_BLOCK_SIZE 16
enum ec_vbnvcontext_op {
EC_VBNV_CONTEXT_OP_READ,
EC_VBNV_CONTEXT_OP_WRITE,
};
struct ec_params_vbnvcontext {
uint32_t op;
uint8_t block[EC_VBNV_BLOCK_SIZE];
} __packed;
struct ec_response_vbnvcontext {
uint8_t block[EC_VBNV_BLOCK_SIZE];
} __packed;
/*****************************************************************************/ /*****************************************************************************/
/* PWM commands */ /* PWM commands */
@ -573,34 +612,79 @@ struct ec_params_pwm_set_fan_duty {
/*****************************************************************************/ /*****************************************************************************/
/* /*
* Lightbar commands. This looks worse than it is. Since we only use one LPC * Lightbar commands. This looks worse than it is. Since we only use one HOST
* command to say "talk to the lightbar", we put the "and tell it to do X" part * command to say "talk to the lightbar", we put the "and tell it to do X" part
* into a subcommand. We'll make separate structs for subcommands with * into a subcommand. We'll make separate structs for subcommands with
* different input args, so that we know how much to expect. * different input args, so that we know how much to expect.
*/ */
#define EC_CMD_LIGHTBAR_CMD 0x28 #define EC_CMD_LIGHTBAR_CMD 0x28
struct ec_params_lightbar_cmd { struct rgb_s {
uint8_t r, g, b;
};
#define LB_BATTERY_LEVELS 4
/* List of tweakable parameters. NOTE: It's __packed so it can be sent in a
* host command, but the alignment is the same regardless. Keep it that way.
*/
struct lightbar_params {
/* Timing */
int google_ramp_up;
int google_ramp_down;
int s3s0_ramp_up;
int s0_tick_delay[2]; /* AC=0/1 */
int s0a_tick_delay[2]; /* AC=0/1 */
int s0s3_ramp_down;
int s3_sleep_for;
int s3_ramp_up;
int s3_ramp_down;
/* Oscillation */
uint8_t new_s0;
uint8_t osc_min[2]; /* AC=0/1 */
uint8_t osc_max[2]; /* AC=0/1 */
uint8_t w_ofs[2]; /* AC=0/1 */
/* Brightness limits based on the backlight and AC. */
uint8_t bright_bl_off_fixed[2]; /* AC=0/1 */
uint8_t bright_bl_on_min[2]; /* AC=0/1 */
uint8_t bright_bl_on_max[2]; /* AC=0/1 */
/* Battery level thresholds */
uint8_t battery_threshold[LB_BATTERY_LEVELS - 1];
/* Map [AC][battery_level] to color index */
uint8_t s0_idx[2][LB_BATTERY_LEVELS]; /* AP is running */
uint8_t s3_idx[2][LB_BATTERY_LEVELS]; /* AP is sleeping */
/* Color palette */
struct rgb_s color[8]; /* 0-3 are Google colors */
} __packed;
struct ec_params_lightbar {
uint8_t cmd; /* Command (see enum lightbar_command) */
union { union {
union {
uint8_t cmd;
struct { struct {
uint8_t cmd; /* no args */
} dump, off, on, init, get_seq; } dump, off, on, init, get_seq, get_params;
struct num { struct num {
uint8_t cmd;
uint8_t num; uint8_t num;
} brightness, seq; } brightness, seq, demo;
struct reg { struct reg {
uint8_t cmd;
uint8_t ctrl, reg, value; uint8_t ctrl, reg, value;
} reg; } reg;
struct rgb { struct rgb {
uint8_t cmd;
uint8_t led, red, green, blue; uint8_t led, red, green, blue;
} rgb; } rgb;
} in;
struct lightbar_params set_params;
};
} __packed;
struct ec_response_lightbar {
union { union {
struct dump { struct dump {
struct { struct {
@ -609,16 +693,50 @@ struct ec_params_lightbar_cmd {
uint8_t ic1; uint8_t ic1;
} vals[23]; } vals[23];
} dump; } dump;
struct get_seq { struct get_seq {
uint8_t num; uint8_t num;
} get_seq; } get_seq;
struct lightbar_params get_params;
struct { struct {
/* no return params */ /* no return params */
} off, on, init, brightness, seq, reg, rgb; } off, on, init, brightness, seq, reg, rgb, demo, set_params;
} out;
}; };
} __packed; } __packed;
/* Lightbar commands */
enum lightbar_command {
LIGHTBAR_CMD_DUMP = 0,
LIGHTBAR_CMD_OFF = 1,
LIGHTBAR_CMD_ON = 2,
LIGHTBAR_CMD_INIT = 3,
LIGHTBAR_CMD_BRIGHTNESS = 4,
LIGHTBAR_CMD_SEQ = 5,
LIGHTBAR_CMD_REG = 6,
LIGHTBAR_CMD_RGB = 7,
LIGHTBAR_CMD_GET_SEQ = 8,
LIGHTBAR_CMD_DEMO = 9,
LIGHTBAR_CMD_GET_PARAMS = 10,
LIGHTBAR_CMD_SET_PARAMS = 11,
LIGHTBAR_NUM_CMDS
};
/*****************************************************************************/
/* LED control commands */
#define EC_CMD_LED_SET 0x29
#define EC_LED_FLAGS_AUTO (1 << 1)
struct ec_params_led_set {
uint8_t r;
uint8_t g;
uint8_t b; /* Used as yellow if there is no blue LED */
uint8_t flags;
} __packed;
/*****************************************************************************/ /*****************************************************************************/
/* Verified boot commands */ /* Verified boot commands */
@ -651,22 +769,30 @@ struct ec_response_vboot_hash {
} __packed; } __packed;
enum ec_vboot_hash_cmd { enum ec_vboot_hash_cmd {
EC_VBOOT_HASH_GET, /* Get current hash status */ EC_VBOOT_HASH_GET = 0, /* Get current hash status */
EC_VBOOT_HASH_ABORT, /* Abort calculating current hash */ EC_VBOOT_HASH_ABORT = 1, /* Abort calculating current hash */
EC_VBOOT_HASH_START, /* Start computing a new hash */ EC_VBOOT_HASH_START = 2, /* Start computing a new hash */
EC_VBOOT_HASH_RECALC, /* Synchronously compute a new hash */ EC_VBOOT_HASH_RECALC = 3, /* Synchronously compute a new hash */
}; };
enum ec_vboot_hash_type { enum ec_vboot_hash_type {
EC_VBOOT_HASH_TYPE_SHA256, /* SHA-256 */ EC_VBOOT_HASH_TYPE_SHA256 = 0, /* SHA-256 */
}; };
enum ec_vboot_hash_status { enum ec_vboot_hash_status {
EC_VBOOT_HASH_STATUS_NONE, /* No hash (not started, or aborted) */ EC_VBOOT_HASH_STATUS_NONE = 0, /* No hash (not started, or aborted) */
EC_VBOOT_HASH_STATUS_DONE, /* Finished computing a hash */ EC_VBOOT_HASH_STATUS_DONE = 1, /* Finished computing a hash */
EC_VBOOT_HASH_STATUS_BUSY, /* Busy computing a hash */ EC_VBOOT_HASH_STATUS_BUSY = 2, /* Busy computing a hash */
}; };
/*
* Special values for offset for EC_VBOOT_HASH_START and EC_VBOOT_HASH_RECALC.
* If one of these is specified, the EC will automatically update offset and
* size to the correct values for the specified image (RO or RW).
*/
#define EC_VBOOT_HASH_OFFSET_RO 0xfffffffe
#define EC_VBOOT_HASH_OFFSET_RW 0xfffffffd
/*****************************************************************************/ /*****************************************************************************/
/* USB charging control commands */ /* USB charging control commands */
@ -772,6 +898,32 @@ struct ec_response_thermal_get_threshold {
/* Toggle automatic fan control */ /* Toggle automatic fan control */
#define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52 #define EC_CMD_THERMAL_AUTO_FAN_CTRL 0x52
/* Get TMP006 calibration data */
#define EC_CMD_TMP006_GET_CALIBRATION 0x53
struct ec_params_tmp006_get_calibration {
uint8_t index;
} __packed;
struct ec_response_tmp006_get_calibration {
float s0;
float b0;
float b1;
float b2;
} __packed;
/* Set TMP006 calibration data */
#define EC_CMD_TMP006_SET_CALIBRATION 0x54
struct ec_params_tmp006_set_calibration {
uint8_t index;
uint8_t reserved[3]; /* Reserved; set 0 */
float s0;
float b0;
float b1;
float b2;
} __packed;
/*****************************************************************************/ /*****************************************************************************/
/* MKBP - Matrix KeyBoard Protocol */ /* MKBP - Matrix KeyBoard Protocol */
@ -801,6 +953,112 @@ struct ec_params_mkbp_simulate_key {
uint8_t pressed; uint8_t pressed;
} __packed; } __packed;
/* Configure keyboard scanning */
#define EC_CMD_MKBP_SET_CONFIG 0x64
#define EC_CMD_MKBP_GET_CONFIG 0x65
/* flags */
enum mkbp_config_flags {
EC_MKBP_FLAGS_ENABLE = 1, /* Enable keyboard scanning */
};
enum mkbp_config_valid {
EC_MKBP_VALID_SCAN_PERIOD = 1 << 0,
EC_MKBP_VALID_POLL_TIMEOUT = 1 << 1,
EC_MKBP_VALID_MIN_POST_SCAN_DELAY = 1 << 3,
EC_MKBP_VALID_OUTPUT_SETTLE = 1 << 4,
EC_MKBP_VALID_DEBOUNCE_DOWN = 1 << 5,
EC_MKBP_VALID_DEBOUNCE_UP = 1 << 6,
EC_MKBP_VALID_FIFO_MAX_DEPTH = 1 << 7,
};
/* Configuration for our key scanning algorithm */
struct ec_mkbp_config {
uint32_t valid_mask; /* valid fields */
uint8_t flags; /* some flags (enum mkbp_config_flags) */
uint8_t valid_flags; /* which flags are valid */
uint16_t scan_period_us; /* period between start of scans */
/* revert to interrupt mode after no activity for this long */
uint32_t poll_timeout_us;
/*
* minimum post-scan relax time. Once we finish a scan we check
* the time until we are due to start the next one. If this time is
* shorter this field, we use this instead.
*/
uint16_t min_post_scan_delay_us;
/* delay between setting up output and waiting for it to settle */
uint16_t output_settle_us;
uint16_t debounce_down_us; /* time for debounce on key down */
uint16_t debounce_up_us; /* time for debounce on key up */
/* maximum depth to allow for fifo (0 = no keyscan output) */
uint8_t fifo_max_depth;
} __packed;
struct ec_params_mkbp_set_config {
struct ec_mkbp_config config;
} __packed;
struct ec_response_mkbp_get_config {
struct ec_mkbp_config config;
} __packed;
/* Run the key scan emulation */
#define EC_CMD_KEYSCAN_SEQ_CTRL 0x66
enum ec_keyscan_seq_cmd {
EC_KEYSCAN_SEQ_STATUS = 0, /* Get status information */
EC_KEYSCAN_SEQ_CLEAR = 1, /* Clear sequence */
EC_KEYSCAN_SEQ_ADD = 2, /* Add item to sequence */
EC_KEYSCAN_SEQ_START = 3, /* Start running sequence */
EC_KEYSCAN_SEQ_COLLECT = 4, /* Collect sequence summary data */
};
enum ec_collect_flags {
/*
* Indicates this scan was processed by the EC. Due to timing, some
* scans may be skipped.
*/
EC_KEYSCAN_SEQ_FLAG_DONE = 1 << 0,
};
struct ec_collect_item {
uint8_t flags; /* some flags (enum ec_collect_flags) */
};
struct ec_params_keyscan_seq_ctrl {
uint8_t cmd; /* Command to send (enum ec_keyscan_seq_cmd) */
union {
struct {
uint8_t active; /* still active */
uint8_t num_items; /* number of items */
/* Current item being presented */
uint8_t cur_item;
} status;
struct {
/*
* Absolute time for this scan, measured from the
* start of the sequence.
*/
uint32_t time_us;
uint8_t scan[0]; /* keyscan data */
} add;
struct {
uint8_t start_item; /* First item to return */
uint8_t num_items; /* Number of items to return */
} collect;
};
} __packed;
struct ec_result_keyscan_seq_ctrl {
union {
struct {
uint8_t num_items; /* Number of items */
/* Data for each item */
struct ec_collect_item item[0];
} collect;
};
} __packed;
/*****************************************************************************/ /*****************************************************************************/
/* Temperature sensor commands */ /* Temperature sensor commands */
@ -897,7 +1155,7 @@ struct ec_response_gpio_get {
#define EC_CMD_I2C_READ 0x94 #define EC_CMD_I2C_READ 0x94
struct ec_params_i2c_read { struct ec_params_i2c_read {
uint16_t addr; uint16_t addr; /* 8-bit address (7-bit shifted << 1) */
uint8_t read_size; /* Either 8 or 16. */ uint8_t read_size; /* Either 8 or 16. */
uint8_t port; uint8_t port;
uint8_t offset; uint8_t offset;
@ -911,7 +1169,7 @@ struct ec_response_i2c_read {
struct ec_params_i2c_write { struct ec_params_i2c_write {
uint16_t data; uint16_t data;
uint16_t addr; uint16_t addr; /* 8-bit address (7-bit shifted << 1) */
uint8_t write_size; /* Either 8 or 16. */ uint8_t write_size; /* Either 8 or 16. */
uint8_t port; uint8_t port;
uint8_t offset; uint8_t offset;
@ -941,6 +1199,177 @@ struct ec_params_force_idle {
*/ */
#define EC_CMD_CONSOLE_READ 0x98 #define EC_CMD_CONSOLE_READ 0x98
/*****************************************************************************/
/*
* Cut off battery power output if the battery supports.
*
* For unsupported battery, just don't implement this command and lets EC
* return EC_RES_INVALID_COMMAND.
*/
#define EC_CMD_BATTERY_CUT_OFF 0x99
/*****************************************************************************/
/* USB port mux control. */
/*
* Switch USB mux or return to automatic switching.
*/
#define EC_CMD_USB_MUX 0x9a
struct ec_params_usb_mux {
uint8_t mux;
} __packed;
/*****************************************************************************/
/* LDOs / FETs control. */
enum ec_ldo_state {
EC_LDO_STATE_OFF = 0, /* the LDO / FET is shut down */
EC_LDO_STATE_ON = 1, /* the LDO / FET is ON / providing power */
};
/*
* Switch on/off a LDO.
*/
#define EC_CMD_LDO_SET 0x9b
struct ec_params_ldo_set {
uint8_t index;
uint8_t state;
} __packed;
/*
* Get LDO state.
*/
#define EC_CMD_LDO_GET 0x9c
struct ec_params_ldo_get {
uint8_t index;
} __packed;
struct ec_response_ldo_get {
uint8_t state;
} __packed;
/*****************************************************************************/
/* Power info. */
/*
* Get power info.
*/
#define EC_CMD_POWER_INFO 0x9d
struct ec_response_power_info {
uint32_t usb_dev_type;
uint16_t voltage_ac;
uint16_t voltage_system;
uint16_t current_system;
uint16_t usb_current_limit;
} __packed;
/*****************************************************************************/
/* I2C passthru command */
#define EC_CMD_I2C_PASSTHRU 0x9e
/* Slave address is 10 (not 7) bit */
#define EC_I2C_FLAG_10BIT (1 << 16)
/* Read data; if not present, message is a write */
#define EC_I2C_FLAG_READ (1 << 15)
/* Mask for address */
#define EC_I2C_ADDR_MASK 0x3ff
#define EC_I2C_STATUS_NAK (1 << 0) /* Transfer was not acknowledged */
#define EC_I2C_STATUS_TIMEOUT (1 << 1) /* Timeout during transfer */
/* Any error */
#define EC_I2C_STATUS_ERROR (EC_I2C_STATUS_NAK | EC_I2C_STATUS_TIMEOUT)
struct ec_params_i2c_passthru_msg {
uint16_t addr_flags; /* I2C slave address (7 or 10 bits) and flags */
uint16_t len; /* Number of bytes to read or write */
} __packed;
struct ec_params_i2c_passthru {
uint8_t port; /* I2C port number */
uint8_t num_msgs; /* Number of messages */
struct ec_params_i2c_passthru_msg msg[];
/* Data to write for all messages is concatenated here */
} __packed;
struct ec_response_i2c_passthru {
uint8_t i2c_status; /* Status flags (EC_I2C_STATUS_...) */
uint8_t num_msgs; /* Number of messages processed */
uint8_t data[]; /* Data read by messages concatenated here */
} __packed;
/*****************************************************************************/
/* Temporary debug commands. TODO: remove this crosbug.com/p/13849 */
/*
* Dump charge state machine context.
*
* Response is a binary dump of charge state machine context.
*/
#define EC_CMD_CHARGE_DUMP 0xa0
/*
* Set maximum battery charging current.
*/
#define EC_CMD_CHARGE_CURRENT_LIMIT 0xa1
struct ec_params_current_limit {
uint32_t limit; /* in mA */
} __packed;
/*
* Set maximum external power current.
*/
#define EC_CMD_EXT_POWER_CURRENT_LIMIT 0xa2
struct ec_params_ext_power_current_limit {
uint32_t limit; /* in mA */
} __packed;
/*****************************************************************************/
/* Smart battery pass-through */
/* Get / Set 16-bit smart battery registers */
#define EC_CMD_SB_READ_WORD 0xb0
#define EC_CMD_SB_WRITE_WORD 0xb1
/* Get / Set string smart battery parameters
* formatted as SMBUS "block".
*/
#define EC_CMD_SB_READ_BLOCK 0xb2
#define EC_CMD_SB_WRITE_BLOCK 0xb3
struct ec_params_sb_rd {
uint8_t reg;
} __packed;
struct ec_response_sb_rd_word {
uint16_t value;
} __packed;
struct ec_params_sb_wr_word {
uint8_t reg;
uint16_t value;
} __packed;
struct ec_response_sb_rd_block {
uint8_t data[32];
} __packed;
struct ec_params_sb_wr_block {
uint8_t reg;
uint16_t data[32];
} __packed;
/*****************************************************************************/ /*****************************************************************************/
/* System commands */ /* System commands */
@ -953,23 +1382,31 @@ struct ec_params_force_idle {
/* Command */ /* Command */
enum ec_reboot_cmd { enum ec_reboot_cmd {
EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */ EC_REBOOT_CANCEL = 0, /* Cancel a pending reboot */
EC_REBOOT_JUMP_RO, /* Jump to RO without rebooting */ EC_REBOOT_JUMP_RO = 1, /* Jump to RO without rebooting */
EC_REBOOT_JUMP_RW, /* Jump to RW without rebooting */ EC_REBOOT_JUMP_RW = 2, /* Jump to RW without rebooting */
/* (command 3 was jump to RW-B) */ /* (command 3 was jump to RW-B) */
EC_REBOOT_COLD = 4, /* Cold-reboot */ EC_REBOOT_COLD = 4, /* Cold-reboot */
EC_REBOOT_DISABLE_JUMP, /* Disable jump until next reboot */ EC_REBOOT_DISABLE_JUMP = 5, /* Disable jump until next reboot */
EC_REBOOT_HIBERNATE = 6 /* Hibernate EC */
}; };
/* Flags for ec_params_reboot_ec.reboot_flags */ /* Flags for ec_params_reboot_ec.reboot_flags */
#define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */ #define EC_REBOOT_FLAG_RESERVED0 (1 << 0) /* Was recovery request */
#define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) #define EC_REBOOT_FLAG_ON_AP_SHUTDOWN (1 << 1) /* Reboot after AP shutdown */
#define EC_REBOOT_FLAG_POWER_ON (1 << 2)
struct ec_params_reboot_ec { struct ec_params_reboot_ec {
uint8_t cmd; /* enum ec_reboot_cmd */ uint8_t cmd; /* enum ec_reboot_cmd */
uint8_t flags; /* See EC_REBOOT_FLAG_* */ uint8_t flags; /* See EC_REBOOT_FLAG_* */
} __packed; } __packed;
/*
* Get information on last EC panic.
*
* Returns variable-length platform-dependent panic information. See panic.h
* for details.
*/
#define EC_CMD_GET_PANIC_INFO 0xd3
/*****************************************************************************/ /*****************************************************************************/
/* /*
* ACPI commands * ACPI commands
@ -1052,6 +1489,15 @@ struct ec_params_reboot_ec {
*/ */
#define EC_CMD_REBOOT 0xd1 /* Think "die" */ #define EC_CMD_REBOOT 0xd1 /* Think "die" */
/*
* Resend last response (not supported on LPC).
*
* Returns EC_RES_UNAVAILABLE if there is no response available - for example,
* there was no previous command, or the previous command's response was too
* big to save.
*/
#define EC_CMD_RESEND_RESPONSE 0xdb
/* /*
* This header byte on a command indicate version 0. Any header byte less * This header byte on a command indicate version 0. Any header byte less
* than this means that we are talking to an old EC which doesn't support * than this means that we are talking to an old EC which doesn't support

View File

@ -50,52 +50,6 @@ static int google_chromeec_wait_ready(u16 port)
return 0; return 0;
} }
static int google_chromeec_cmd_args_supported(void)
{
if (inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID) == 'E' &&
inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID + 1) == 'C' &&
(inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_HOST_CMD_FLAGS) &
EC_HOST_CMD_FLAG_LPC_ARGS_SUPPORTED))
return 1;
return 0;
}
static int google_chromeec_command_old(struct chromeec_command *cec_command)
{
int i;
if (cec_command->cmd_version) {
printk(BIOS_ERR, "Invalid version for command protocol!\n");
return 1;
}
if (google_chromeec_wait_ready(EC_LPC_ADDR_HOST_CMD)) {
printk(BIOS_ERR, "Timeout waiting for EC ready!\n");
return 1;
}
/* Copy command data, if any. */
for (i = 0; i < cec_command->cmd_size_in; i++)
outb(((char*)cec_command->cmd_data_in)[i],
EC_LPC_ADDR_OLD_PARAM + i);
/* Issue the command. */
outb(cec_command->cmd_code, EC_LPC_ADDR_HOST_CMD);
if (google_chromeec_wait_ready(EC_LPC_ADDR_HOST_CMD)) {
printk(BIOS_ERR, "Timeout waiting for EC process command %d!\n",
cec_command->cmd_code);
return 1;
}
for (i = 0; i < cec_command->cmd_size_out; i++)
((char*)cec_command->cmd_data_out)[i] =
inb(EC_LPC_ADDR_OLD_PARAM + i);
cec_command->cmd_code = inb(EC_LPC_ADDR_HOST_DATA);
return 0;
}
int google_chromeec_command(struct chromeec_command *cec_command) int google_chromeec_command(struct chromeec_command *cec_command)
{ {
struct ec_lpc_host_args args; struct ec_lpc_host_args args;
@ -105,10 +59,6 @@ int google_chromeec_command(struct chromeec_command *cec_command)
int csum; int csum;
int i; int i;
/* Fall back to old command protocol if necessary */
if (!google_chromeec_cmd_args_supported())
return google_chromeec_command_old(cec_command);
/* Fill in args */ /* Fill in args */
args.flags = EC_HOST_ARGS_FLAG_FROM_HOST; args.flags = EC_HOST_ARGS_FLAG_FROM_HOST;
args.command_version = cec_command->cmd_version; args.command_version = cec_command->cmd_version;

View File

@ -48,6 +48,11 @@ Scope (\_TZ)
// Get CPU Temperature from TIN9/PECI via EC // Get CPU Temperature from TIN9/PECI via EC
Store (\_SB.PCI0.LPCB.EC0.TIN9, Local0) Store (\_SB.PCI0.LPCB.EC0.TIN9, Local0)
// Check for sensor not calibrated
If (LEqual (Local0, \_SB.PCI0.LPCB.EC0.TNCA)) {
Return (CTOK(0))
}
// Check for sensor not present // Check for sensor not present
If (LEqual (Local0, \_SB.PCI0.LPCB.EC0.TNPR)) { If (LEqual (Local0, \_SB.PCI0.LPCB.EC0.TNPR)) {
Return (CTOK(0)) Return (CTOK(0))

View File

@ -107,8 +107,7 @@ int get_recovery_mode_switch(void)
u32 ec_events; u32 ec_events;
/* If a switch is set, we don't need to look at events. */ /* If a switch is set, we don't need to look at events. */
if (ec_switches & (EC_SWITCH_KEYBOARD_RECOVERY | if (ec_switches & (EC_SWITCH_DEDICATED_RECOVERY))
EC_SWITCH_DEDICATED_RECOVERY))
return 1; return 1;
/* Else check if the EC has posted the keyboard recovery event. */ /* Else check if the EC has posted the keyboard recovery event. */