[coreboot-gerrit] Change in coreboot[master]: ec/google/wilco: Add power related mailbox commands
Duncan Laurie (Code Review)
gerrit at coreboot.org
Tue Oct 16 00:54:33 CEST 2018
Duncan Laurie has uploaded this change for review. ( https://review.coreboot.org/29116
Change subject: ec/google/wilco: Add power related mailbox commands
......................................................................
ec/google/wilco: Add power related mailbox commands
Add EC mailbox commands that are related to the power and state of the
system. These commands include:
- read the power status registers from the EC
- read & clear the power status registers
- helper function to read the current lid state
- tell the EC why the host is about to power off
- tell the EC that the host is about to enter a sleep state
Change-Id: Iaa7051b4006e3c1687933e0384d962516220621f
Signed-off-by: Duncan Laurie <dlaurie at google.com>
---
M src/ec/google/wilco/commands.c
M src/ec/google/wilco/commands.h
2 files changed, 169 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/16/29116/1
diff --git a/src/ec/google/wilco/commands.c b/src/ec/google/wilco/commands.c
index 4cec58b..ccf9f73 100644
--- a/src/ec/google/wilco/commands.c
+++ b/src/ec/google/wilco/commands.c
@@ -50,3 +50,72 @@
if (!wilco_ec_get_info(GET_EC_BUILD_DATE, info))
printk(BIOS_INFO, "EC Build Date : %s\n", info);
}
+
+int wilco_ec_power_smi(struct ec_pm_event_state *pm)
+{
+ struct ec_response_power_smi rsp;
+
+ if (!pm)
+ return -1;
+ if (wilco_ec_sendrecv_noargs(KB_POWER_SMI, &rsp, sizeof(rsp)) < 0)
+ return -1;
+
+ pm->event[0] = rsp.pm_event_1;
+ pm->event[1] = rsp.pm_event_2;
+ pm->state[0] = rsp.pm_state_1;
+ pm->state[1] = rsp.pm_state_2;
+ pm->state[2] = rsp.pm_state_3;
+ pm->state[3] = rsp.pm_state_4;
+ pm->state[4] = rsp.pm_state_5;
+ pm->state[5] = rsp.pm_state_6;
+ pm->hotkey = rsp.hotkey;
+
+ return 0;
+}
+
+int wilco_ec_power_status(struct ec_pm_event_state *pm)
+{
+ struct ec_response_power_status rsp;
+
+ if (!pm)
+ return -1;
+ if (wilco_ec_sendrecv_noargs(KB_POWER_STATUS, &rsp, sizeof(rsp)) < 0)
+ return -1;
+
+ pm->hotkey = 0;
+ pm->event[0] = 0;
+ pm->event[1] = rsp.pm_event_2;
+ pm->state[0] = rsp.pm_state_1;
+ pm->state[1] = rsp.pm_state_2;
+ pm->state[2] = rsp.pm_state_3;
+ pm->state[3] = rsp.pm_state_4;
+ pm->state[4] = rsp.pm_state_5;
+ pm->state[5] = rsp.pm_state_6;
+ pm->ac_type = rsp.ac_type_msb << 8 | rsp.ac_type_lsb;
+
+ return 0;
+}
+
+int wilco_ec_get_lid_state(void)
+{
+ struct ec_pm_event_state pm;
+
+ if (wilco_ec_power_status(&pm) < 0)
+ return -1;
+
+ return !!(pm.state[0] & EC_PM1_LID_OPEN);
+}
+
+void wilco_ec_slp_en(void)
+{
+ /* EC does not respond to this command */
+ wilco_ec_mailbox(WILCO_EC_MSG_NO_RESPONSE,
+ KB_SLP_EN, NULL, 0, NULL, 0);
+}
+
+void wilco_ec_power_off(enum ec_power_off_reason reason)
+{
+ /* EC does not respond to this command */
+ wilco_ec_mailbox(WILCO_EC_MSG_NO_RESPONSE,
+ KB_POWER_OFF, &reason, 1, NULL, 0);
+}
diff --git a/src/ec/google/wilco/commands.h b/src/ec/google/wilco/commands.h
index 76949d0..c277d83 100644
--- a/src/ec/google/wilco/commands.h
+++ b/src/ec/google/wilco/commands.h
@@ -19,12 +19,20 @@
#include <stdint.h>
enum {
+ /* Read and clear power state information */
+ KB_POWER_SMI = 0x04,
+ /* Read but do not clear power state information */
+ KB_POWER_STATUS = 0x05,
+ /* Inform the EC aboout the reason host is turning off */
+ KB_POWER_OFF = 0x08,
/* Retrieve information about the EC */
KB_EC_INFO = 0x38,
/* Set ACPI mode on or off */
KB_ACPI = 0x3a,
/* Manage the EC power button passthru to the host */
KB_POWER_BUTTON_TO_HOST = 0x3e,
+ /* Inform the EC that the host is about to enter S3 */
+ KB_SLP_EN = 0x64,
};
enum set_acpi_mode_cmd {
@@ -51,4 +59,96 @@
int wilco_ec_get_info(enum get_ec_info_cmd cmd, char *info);
void wilco_ec_print_info(void);
+/*
+ * EC Power State
+ */
+
+enum ec_power_off_reason {
+ EC_PWROFF_FLASH = 0x11,
+ EC_PWROFF_AC_REMOVED = 0x12,
+ EC_PWROFF_BAT_REMOVED = 0x13,
+ EC_PWROFF_LOBAT = 0x15,
+ EC_PWROFF_PWRB_IN_POST = 0x16,
+ EC_PWROFF_FORCE_IMMEDIATE = 0x18,
+ EC_PWROFF_WDT = 0x1b,
+ EC_PWROFF_FORCE_THERMAL = 0x22,
+ EC_PWROFF_ERR_CODE = 0x23,
+ EC_PWROFF_PAID_PWRGD = 0x27,
+ EC_PWROFF_PAID_CPU = 0x28,
+ EC_PWROFF_PAID_GFX = 0x29,
+ EC_PWROFF_PAID_CLK = 0x2a,
+ EC_PWROFF_PAID_NOMEMORY = 0x2b,
+ EC_PWROFF_PAID_MEMORY_ERR = 0x2c,
+ EC_PWROFF_PAID_MEMORY_SPD = 0x2d,
+ EC_SWOFF_ACPI = 0x31,
+ EC_SWOFF_BOOT_PASSWORD = 0x33,
+ EC_SWOFF_DISK_PASSWORD = 0x34,
+ EC_SWOFF_POWER_CYCLE = 0x37,
+ EC_SWOFF_HARD_RESET = 0x3b,
+ EC_SWOFF_FSMI = 0x3f,
+ EC_PWRLOG_THERMTRIP = 0x41,
+ EC_PWRLOG_NO_S5 = 0x42,
+ EC_PWROFF_4S_PWRB = 0x44,
+ EC_PWROFF_ASF2_FORCEOFF = 0x45,
+ EC_PWROFF_PWRB_THERMAL = 0x48,
+ EC_PWROFF_AOAC_TIMER = 0x4b,
+};
+
+/* Tell the EC why the host is about to power off */
+void wilco_ec_power_off(enum ec_power_off_reason reason);
+
+enum ec_pm1_state {
+ EC_PM1_AC_AVAIL = 0x01,
+ EC_PM1_BAT_AVAIL = 0x02,
+ EC_PM1_LO_BAT1 = 0x03,
+ EC_PM1_LO_BAT2 = 0x04,
+ EC_PM1_LID_OPEN = 0x10,
+ EC_PM1_LCD_POWER = 0x20,
+ EC_PM1_OVER_TEMP = 0x40,
+ EC_PM1_DOCKED = 0x80
+};
+
+struct ec_pm_event_state {
+ uint8_t event[2];
+ uint8_t state[6];
+ uint8_t hotkey;
+ uint16_t ac_type;
+};
+
+struct ec_response_power_status {
+ uint8_t pm_state_1;
+ uint8_t pm_state_2;
+ uint8_t pm_state_3;
+ uint8_t pm_state_4;
+ uint8_t pm_state_5;
+ uint8_t ac_type_lsb;
+ uint8_t pm_state_6;
+ uint8_t pm_event_2;
+ uint8_t ac_type_msb;
+} __packed;
+
+/* Retrieve the power state information */
+int wilco_ec_power_status(struct ec_pm_event_state *pm);
+
+/* Read but do not clear lid state */
+int wilco_ec_get_lid_state(void);
+
+struct ec_response_power_smi {
+ uint8_t pm_event_1;
+ uint8_t pm_state_1;
+ uint8_t hotkey;
+ uint8_t pm_state_2;
+ uint8_t pm_state_3;
+ uint8_t pm_state_4;
+ uint8_t pm_state_5;
+ uint8_t pm_event_2;
+ uint8_t pm_state_6;
+} __packed;
+
+/* Retrieve *and clears* the power state information */
+int wilco_ec_power_smi(struct ec_pm_event_state *pm);
+
+/* Tell the EC that the host is entering a sleep state */
+void wilco_ec_slp_en(void);
+
#endif /* EC_GOOGLE_WILCO_COMMANDS_H */
--
To view, visit https://review.coreboot.org/29116
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iaa7051b4006e3c1687933e0384d962516220621f
Gerrit-Change-Number: 29116
Gerrit-PatchSet: 1
Gerrit-Owner: Duncan Laurie <dlaurie at chromium.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20181015/d60f0051/attachment-0001.html>
More information about the coreboot-gerrit
mailing list