Skip to content

Commit 57e94c8

Browse files
superna9999Lee Jones
authored andcommitted
mfd: cros-ec: Increase maximum mkbp event size
Having a 16 byte mkbp event size makes it possible to send CEC messages from the EC to the AP directly inside the mkbp event instead of first doing a notification and then a read. Signed-off-by: Stefan Adolfsson <sadolfsson@chromium.org> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
1 parent 9c22912 commit 57e94c8

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

drivers/platform/chrome/cros_ec_proto.c

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -506,29 +506,51 @@ int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,
506506
}
507507
EXPORT_SYMBOL(cros_ec_cmd_xfer_status);
508508

509+
static int get_next_event_xfer(struct cros_ec_device *ec_dev,
510+
struct cros_ec_command *msg,
511+
int version, uint32_t size)
512+
{
513+
int ret;
514+
515+
msg->version = version;
516+
msg->command = EC_CMD_GET_NEXT_EVENT;
517+
msg->insize = size;
518+
msg->outsize = 0;
519+
520+
ret = cros_ec_cmd_xfer(ec_dev, msg);
521+
if (ret > 0) {
522+
ec_dev->event_size = ret - 1;
523+
memcpy(&ec_dev->event_data, msg->data, ec_dev->event_size);
524+
}
525+
526+
return ret;
527+
}
528+
509529
static int get_next_event(struct cros_ec_device *ec_dev)
510530
{
511531
u8 buffer[sizeof(struct cros_ec_command) + sizeof(ec_dev->event_data)];
512532
struct cros_ec_command *msg = (struct cros_ec_command *)&buffer;
533+
static int cmd_version = 1;
513534
int ret;
514535

515536
if (ec_dev->suspended) {
516537
dev_dbg(ec_dev->dev, "Device suspended.\n");
517538
return -EHOSTDOWN;
518539
}
519540

520-
msg->version = 0;
521-
msg->command = EC_CMD_GET_NEXT_EVENT;
522-
msg->insize = sizeof(ec_dev->event_data);
523-
msg->outsize = 0;
541+
if (cmd_version == 1) {
542+
ret = get_next_event_xfer(ec_dev, msg, cmd_version,
543+
sizeof(struct ec_response_get_next_event_v1));
544+
if (ret < 0 || msg->result != EC_RES_INVALID_VERSION)
545+
return ret;
524546

525-
ret = cros_ec_cmd_xfer(ec_dev, msg);
526-
if (ret > 0) {
527-
ec_dev->event_size = ret - 1;
528-
memcpy(&ec_dev->event_data, msg->data,
529-
sizeof(ec_dev->event_data));
547+
/* Fallback to version 0 for future send attempts */
548+
cmd_version = 0;
530549
}
531550

551+
ret = get_next_event_xfer(ec_dev, msg, cmd_version,
552+
sizeof(struct ec_response_get_next_event));
553+
532554
return ret;
533555
}
534556

include/linux/mfd/cros_ec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ struct cros_ec_device {
147147
bool mkbp_event_supported;
148148
struct blocking_notifier_head event_notifier;
149149

150-
struct ec_response_get_next_event event_data;
150+
struct ec_response_get_next_event_v1 event_data;
151151
int event_size;
152152
u32 host_event_wake_mask;
153153
};

include/linux/mfd/cros_ec_commands.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,12 +2093,28 @@ union ec_response_get_next_data {
20932093
uint32_t sysrq;
20942094
} __packed;
20952095

2096+
union ec_response_get_next_data_v1 {
2097+
uint8_t key_matrix[16];
2098+
uint32_t host_event;
2099+
uint32_t buttons;
2100+
uint32_t switches;
2101+
uint32_t sysrq;
2102+
uint32_t cec_events;
2103+
uint8_t cec_message[16];
2104+
} __packed;
2105+
20962106
struct ec_response_get_next_event {
20972107
uint8_t event_type;
20982108
/* Followed by event data if any */
20992109
union ec_response_get_next_data data;
21002110
} __packed;
21012111

2112+
struct ec_response_get_next_event_v1 {
2113+
uint8_t event_type;
2114+
/* Followed by event data if any */
2115+
union ec_response_get_next_data_v1 data;
2116+
} __packed;
2117+
21022118
/* Bit indices for buttons and switches.*/
21032119
/* Buttons */
21042120
#define EC_MKBP_POWER_BUTTON 0

0 commit comments

Comments
 (0)