Skip to content

Commit 7235560

Browse files
Evan GreenLee Jones
authored andcommitted
platform/chrome: Add support for v1 of host sleep event
Add support in code for the new forms of the host sleep event. Detects the presence of this version of the command at runtime, and use whichever form the EC supports. At this time, always request the default timeout, and only report the failing response via a WARN_ONCE(). Future versions could accept the sleep parameter from outside the driver, and return the response information to usermode or elsewhere. Signed-off-by: Evan Green <[email protected]> Reviewed-by: Rajat Jain <[email protected]> Reviewed-by: Guenter Roeck <[email protected]> Acked-by: Enric Balletbo i Serra <[email protected]> Signed-off-by: Lee Jones <[email protected]>
1 parent afe2bb5 commit 7235560

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

drivers/mfd/cros_ec.c

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,49 @@ static irqreturn_t ec_irq_thread(int irq, void *data)
7575

7676
static int cros_ec_sleep_event(struct cros_ec_device *ec_dev, u8 sleep_event)
7777
{
78+
int ret;
7879
struct {
7980
struct cros_ec_command msg;
80-
struct ec_params_host_sleep_event req;
81+
union {
82+
struct ec_params_host_sleep_event req0;
83+
struct ec_params_host_sleep_event_v1 req1;
84+
struct ec_response_host_sleep_event_v1 resp1;
85+
} u;
8186
} __packed buf;
8287

8388
memset(&buf, 0, sizeof(buf));
8489

85-
buf.req.sleep_event = sleep_event;
90+
if (ec_dev->host_sleep_v1) {
91+
buf.u.req1.sleep_event = sleep_event;
92+
buf.u.req1.suspend_params.sleep_timeout_ms =
93+
EC_HOST_SLEEP_TIMEOUT_DEFAULT;
94+
95+
buf.msg.outsize = sizeof(buf.u.req1);
96+
if ((sleep_event == HOST_SLEEP_EVENT_S3_RESUME) ||
97+
(sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME))
98+
buf.msg.insize = sizeof(buf.u.resp1);
99+
100+
buf.msg.version = 1;
101+
102+
} else {
103+
buf.u.req0.sleep_event = sleep_event;
104+
buf.msg.outsize = sizeof(buf.u.req0);
105+
}
86106

87107
buf.msg.command = EC_CMD_HOST_SLEEP_EVENT;
88-
buf.msg.version = 0;
89-
buf.msg.outsize = sizeof(buf.req);
90108

91-
return cros_ec_cmd_xfer(ec_dev, &buf.msg);
109+
ret = cros_ec_cmd_xfer(ec_dev, &buf.msg);
110+
111+
/* For now, report failure to transition to S0ix with a warning. */
112+
if (ret >= 0 && ec_dev->host_sleep_v1 &&
113+
(sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME))
114+
WARN_ONCE(buf.u.resp1.resume_response.sleep_transitions &
115+
EC_HOST_RESUME_SLEEP_TIMEOUT,
116+
"EC detected sleep transition timeout. Total slp_s0 transitions: %d",
117+
buf.u.resp1.resume_response.sleep_transitions &
118+
EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK);
119+
120+
return ret;
92121
}
93122

94123
int cros_ec_register(struct cros_ec_device *ec_dev)

drivers/platform/chrome/cros_ec_proto.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,12 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev)
414414
else
415415
ec_dev->mkbp_event_supported = 1;
416416

417+
/* Probe if host sleep v1 is supported for S0ix failure detection. */
418+
ret = cros_ec_get_host_command_version_mask(ec_dev,
419+
EC_CMD_HOST_SLEEP_EVENT,
420+
&ver_mask);
421+
ec_dev->host_sleep_v1 = (ret >= 0 && (ver_mask & EC_VER_MASK(1)));
422+
417423
/*
418424
* Get host event wake mask, assume all events are wake events
419425
* if unavailable.

include/linux/mfd/cros_ec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ struct cros_ec_command {
121121
* @pkt_xfer: Send packet to EC and get response.
122122
* @lock: One transaction at a time.
123123
* @mkbp_event_supported: True if this EC supports the MKBP event protocol.
124+
* @host_sleep_v1: True if this EC supports the sleep v1 command.
124125
* @event_notifier: Interrupt event notifier for transport devices.
125126
* @event_data: Raw payload transferred with the MKBP event.
126127
* @event_size: Size in bytes of the event data.
@@ -154,6 +155,7 @@ struct cros_ec_device {
154155
struct cros_ec_command *msg);
155156
struct mutex lock;
156157
bool mkbp_event_supported;
158+
bool host_sleep_v1;
157159
struct blocking_notifier_head event_notifier;
158160

159161
struct ec_response_get_next_event_v1 event_data;

0 commit comments

Comments
 (0)