summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/host_command.c92
-rw-r--r--include/config.h3
-rw-r--r--include/ec_commands.h84
-rw-r--r--util/ectool.c55
4 files changed, 233 insertions, 1 deletions
diff --git a/common/host_command.c b/common/host_command.c
index 0a6226b59e..451bff74f3 100644
--- a/common/host_command.c
+++ b/common/host_command.c
@@ -678,6 +678,98 @@ DECLARE_HOST_COMMAND(EC_CMD_TEST_PROTOCOL,
host_command_test_protocol,
EC_VER_MASK(0));
+/* Returns supported features. */
+static int host_command_get_features(struct host_cmd_handler_args *args)
+{
+ struct ec_response_get_features *r = args->response;
+ args->response_size = sizeof(*r);
+
+ memset(r, 0, sizeof(*r));
+ r->flags[0] = 0
+#ifdef CONFIG_FW_LIMITED_IMAGE
+ | EC_FEATURE_MASK_0(EC_FEATURE_LIMITED)
+#endif
+#ifdef CONFIG_FLASH
+ | EC_FEATURE_MASK_0(EC_FEATURE_FLASH)
+#endif
+#ifdef CONFIG_FANS
+ | EC_FEATURE_MASK_0(EC_FEATURE_PWM_FAN)
+#endif
+#ifdef CONFIG_PWM_KBLIGHT
+ | EC_FEATURE_MASK_0(EC_FEATURE_PWM_KEYB)
+#endif
+#ifdef HAS_TASK_LIGHTBAR
+ | EC_FEATURE_MASK_0(EC_FEATURE_LIGHTBAR)
+#endif
+#ifdef CONFIG_LED_COMMON
+ | EC_FEATURE_MASK_0(EC_FEATURE_LED)
+#endif
+#ifdef HAS_TASK_MOTIONSENSE
+ | EC_FEATURE_MASK_0(EC_FEATURE_MOTION_SENSE)
+#endif
+#ifdef HAS_TASK_KEYSCAN
+ | EC_FEATURE_MASK_0(EC_FEATURE_KEYB)
+#endif
+#ifdef CONFIG_PSTORE
+ | EC_FEATURE_MASK_0(EC_FEATURE_PSTORE)
+#endif
+#ifdef CONFIG_LPC
+ | EC_FEATURE_MASK_0(EC_FEATURE_PORT80)
+#endif
+#ifdef CONFIG_TEMP_SENSOR
+ | EC_FEATURE_MASK_0(EC_FEATURE_THERMAL)
+#endif
+/* Hack to uniquely identify Samus and Falco ec */
+#if (defined CONFIG_BACKLIGHT_LID) || \
+ (defined CONFIG_BATTERY_SAMUS) || \
+ (defined CONFIG_EXTPOWER_FALCO)
+ | EC_FEATURE_MASK_0(EC_FEATURE_BKLIGHT_SWITCH)
+#endif
+#ifdef CONFIG_WIRELESS
+ | EC_FEATURE_MASK_0(EC_FEATURE_WIFI_SWITCH)
+#endif
+#ifdef CONFIG_HOSTCMD_EVENTS
+ | EC_FEATURE_MASK_0(EC_FEATURE_HOST_EVENTS)
+#endif
+#ifdef CONFIG_COMMON_GPIO
+ | EC_FEATURE_MASK_0(EC_FEATURE_GPIO)
+#endif
+#ifdef CONFIG_I2C
+ | EC_FEATURE_MASK_0(EC_FEATURE_I2C)
+#endif
+#ifdef CONFIG_CHARGER
+ | EC_FEATURE_MASK_0(EC_FEATURE_CHARGER)
+#endif
+#if (defined CONFIG_BATTERY) || (defined CONFIG_BATTERY_SMART)
+ | EC_FEATURE_MASK_0(EC_FEATURE_BATTERY)
+#endif
+#ifdef CONFIG_BATTERY_SMART
+ | EC_FEATURE_MASK_0(EC_FEATURE_SMART_BATTERY)
+#endif
+#ifdef CONFIG_AP_HANG_DETECT
+ | EC_FEATURE_MASK_0(EC_FEATURE_HANG_DETECT)
+#endif
+#ifdef CONFIG_PMU_POWERINFO
+ | EC_FEATURE_MASK_0(EC_FEATURE_PMU)
+#endif
+#ifdef HAS_TASK_PDCMD
+ | EC_FEATURE_MASK_0(EC_FEATURE_SUB_MCU)
+#endif
+#ifdef CONFIG_CHARGE_MANAGER
+ | EC_FEATURE_MASK_0(EC_FEATURE_USB_PD)
+#endif
+/* should be more generic */
+#ifdef CONFIG_USB_SWITCH_TSU6721
+ | EC_FEATURE_MASK_0(EC_FEATURE_USB_MUX)
+#endif
+ ;
+ return EC_RES_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_GET_FEATURES,
+ host_command_get_features,
+ EC_VER_MASK(0));
+
+
/*****************************************************************************/
/* Console commands */
diff --git a/include/config.h b/include/config.h
index 307edb4722..47370d8aac 100644
--- a/include/config.h
+++ b/include/config.h
@@ -656,6 +656,9 @@
*/
#define CONFIG_FW_INCLUDE_RO
+/* If defined, another image (RW) exists with more features */
+#undef CONFIG_FW_LIMITED_IMAGE
+
/*****************************************************************************/
/* Motion sensor based gesture recognition information */
/* These all require HAS_TASK_MOTIONSENSE to work */
diff --git a/include/ec_commands.h b/include/ec_commands.h
index ef7836d40c..cb064b9588 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -859,6 +859,88 @@ struct ec_response_get_set_value {
/* More than one command can use these structs to get/set paramters. */
#define EC_CMD_GSV_PAUSE_IN_S5 0x0c
+/*****************************************************************************/
+/* List the features supported by the firmware */
+#define EC_CMD_GET_FEATURES 0x0d
+
+/* Supported features */
+enum ec_feature_code {
+ /*
+ * This image contains a limited set of features. Another image
+ * in RW partition may support more features.
+ */
+ EC_FEATURE_LIMITED = 0,
+ /*
+ * Commands for probing/reading/writing/erasing the flash in the
+ * EC are present.
+ */
+ EC_FEATURE_FLASH = 1,
+ /*
+ * Can control the fan speed directly.
+ */
+ EC_FEATURE_PWM_FAN = 2,
+ /*
+ * Can control the intensity of the keyboard backlight.
+ */
+ EC_FEATURE_PWM_KEYB = 3,
+ /*
+ * Support Google lightbar, introduced on Pixel.
+ */
+ EC_FEATURE_LIGHTBAR = 4,
+ /* Control of LEDs */
+ EC_FEATURE_LED = 5,
+ /* Exposes an interface to control gyro and sensors.
+ * The host goes through the EC to access these sensors.
+ * In addition, the EC may provide composite sensors, like lid angle.
+ */
+ EC_FEATURE_MOTION_SENSE = 6,
+ /* The keyboard is controlled by the EC */
+ EC_FEATURE_KEYB = 7,
+ /* The AP can use part of the EC flash as persistent storage. */
+ EC_FEATURE_PSTORE = 8,
+ /* The EC monitors BIOS port 80h, and can return POST codes. */
+ EC_FEATURE_PORT80 = 9,
+ /*
+ * Thermal management: include TMP specific commands.
+ * Higher level than direct fan control.
+ */
+ EC_FEATURE_THERMAL = 10,
+ /* Can switch the screen backlight on/off */
+ EC_FEATURE_BKLIGHT_SWITCH = 11,
+ /* Can switch the wifi module on/off */
+ EC_FEATURE_WIFI_SWITCH = 12,
+ /* Monitor host events, through for example SMI or SCI */
+ EC_FEATURE_HOST_EVENTS = 13,
+ /* The EC exposes GPIO commands to control/monitor connected devices. */
+ EC_FEATURE_GPIO = 14,
+ /* The EC can send i2c messages to downstream devices. */
+ EC_FEATURE_I2C = 15,
+ /* Command to control charger are included */
+ EC_FEATURE_CHARGER = 16,
+ /* Simple battery support. */
+ EC_FEATURE_BATTERY = 17,
+ /*
+ * Support Smart battery protocol
+ * (Common Smart Battery System Interface Specification)
+ */
+ EC_FEATURE_SMART_BATTERY = 18,
+ /* EC can dectect when the host hangs. */
+ EC_FEATURE_HANG_DETECT = 19,
+ /* Report power information, for pit only */
+ EC_FEATURE_PMU = 20,
+ /* Another Cros EC device is present downstream of this one */
+ EC_FEATURE_SUB_MCU = 21,
+ /* Support USB Power delivery (PD) commands */
+ EC_FEATURE_USB_PD = 22,
+ /* Control USB multiplexer, for audio through USB port for instance. */
+ EC_FEATURE_USB_MUX = 23
+};
+
+#define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))
+#define EC_FEATURE_MASK_1(event_code) (1UL << (event_code - 32))
+struct ec_response_get_features {
+ uint32_t flags[2];
+} __packed;
/*****************************************************************************/
/* Flash commands */
@@ -2272,7 +2354,7 @@ enum gpio_get_subcmd {
/*
* TODO(crosbug.com/p/23570): These commands are deprecated, and will be
- * removed soon. Use EC_CMD_I2C_XFER instead.
+ * removed soon. Use EC_CMD_I2C_PASSTHRU instead.
*/
/* Read I2C bus */
diff --git a/util/ectool.c b/util/ectool.c
index c809464d92..9470600029 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -127,6 +127,8 @@ const char help_str[] =
" Perform I2C transfer on EC's I2C bus\n"
" infopddev <port>\n"
" Get info about USB type-C accessory attached to port\n"
+ " inventory\n"
+ " Return the list of supported features\n"
" keyscan <beat_us> <filename>\n"
" Test low-level key scanning\n"
" led <name> <query | auto | off | <color> | <color>=<value>...>\n"
@@ -392,6 +394,58 @@ int cmd_s5(int argc, char *argv[])
return rv < 0;
}
+static const char * const ec_feature_names[] = {
+ [EC_FEATURE_LIMITED] = "Limited image, load RW for more",
+ [EC_FEATURE_FLASH] = "Flash",
+ [EC_FEATURE_PWM_FAN] = "Direct Fan power management",
+ [EC_FEATURE_PWM_KEYB] = "Keyboard backlight",
+ [EC_FEATURE_LIGHTBAR] = "Lightbar",
+ [EC_FEATURE_LED] = "LED",
+ [EC_FEATURE_MOTION_SENSE] = "Motion Sensors",
+ [EC_FEATURE_KEYB] = "Keyboard",
+ [EC_FEATURE_PSTORE] = "Host Permanent Storage",
+ [EC_FEATURE_PORT80] = "BIOS Port 80h access",
+ [EC_FEATURE_THERMAL] = "Thermal management",
+ [EC_FEATURE_BKLIGHT_SWITCH] = "Switch backlight on/off",
+ [EC_FEATURE_WIFI_SWITCH] = "Switch wifi on/off",
+ [EC_FEATURE_HOST_EVENTS] = "Host event",
+ [EC_FEATURE_GPIO] = "GPIO",
+ [EC_FEATURE_I2C] = "I2C master",
+ [EC_FEATURE_CHARGER] = "Charger",
+ [EC_FEATURE_BATTERY] = "Simple Battery",
+ [EC_FEATURE_SMART_BATTERY] = "Smart Battery",
+ [EC_FEATURE_HANG_DETECT] = "Host hang detection",
+ [EC_FEATURE_PMU] = "Power Management",
+ [EC_FEATURE_SUB_MCU] = "Control downstream MCU",
+ [EC_FEATURE_USB_PD] = "USB Cros Power Delievery",
+ [EC_FEATURE_USB_MUX] = "USB Multiplexer",
+};
+
+int cmd_inventory(int argc, char *argv[])
+{
+ struct ec_response_get_features r;
+ int rv, i, j, idx;
+
+ rv = ec_command(EC_CMD_GET_FEATURES, 0, NULL, 0, &r, sizeof(r));
+ if (rv < 0)
+ return rv;
+
+ printf("EC supported features:\n");
+ for (i = 0, idx = 0; i < 2; i++) {
+ for (j = 0; j < 32; j++, idx++) {
+ if (r.flags[i] & (1 << j)) {
+ if (idx >= ARRAY_SIZE(ec_feature_names) ||
+ strlen(ec_feature_names[idx]) == 0)
+ printf("%-4d: Unknown feature\n", idx);
+ else
+ printf("%-4d: %s support\n",
+ idx, ec_feature_names[idx]);
+ }
+ }
+ }
+ return 0;
+}
+
int cmd_cmdversions(int argc, char *argv[])
{
@@ -6155,6 +6209,7 @@ const struct command commands[] = {
{"i2cwrite", cmd_i2c_write},
{"i2cxfer", cmd_i2c_xfer},
{"infopddev", cmd_pd_device_info},
+ {"inventory", cmd_inventory},
{"led", cmd_led},
{"lightbar", cmd_lightbar},
{"keyconfig", cmd_keyconfig},