Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'tag-chrome-platform-for-v5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux

Pull chrome platform updates from Tzung-Bi Shih:
"cros_ec_proto:
- Leverage Kunit and add Kunit test cases
- Clean-ups
- Fix typo

cros_ec_commands:
- Fix typo
- Fix compile errors

cros_kbd_led_backlight:
- Support OF match
- Support EC PWM backend

cros_ec:
- Always expose the last resume result to fix sleep hang detection on
ARM-based chromebooks

wilco_ec:
- Fix typo

cros_ec_typec:
- Clean-ups
- Use Type-C framework utilities to manage altmode structs"

* tag 'tag-chrome-platform-for-v5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux: (59 commits)
platform/chrome: cros_kunit_util: add default value for `msg->result`
platform/chrome: merge Kunit utils and test cases
platform/chrome: cros_kbd_led_backlight: fix build warning
platform/chrome: cros_ec_proto: add Kunit test for cros_ec_cmd()
platform/chrome: cros_ec_proto: add Kunit tests for get_sensor_count
platform/chrome: cros_ec_proto: add Kunit tests for check_features
platform/chrome: cros_ec_proto: add Kunit tests for get_host_event
platform/chrome: cros_ec_proto: add Kunit tests for get_next_event
platform/chrome: cros_ec_proto: add Kunit test for cros_ec_map_error()
platform/chrome: cros_ec_proto: add Kunit tests for cmd_xfer_status
platform/chrome: cros_ec_proto: return -EPROTO if empty payload
platform/chrome: cros_ec_proto: add Kunit test for empty payload
platform/chrome: cros_ec_proto: return -EAGAIN when retries timed out
platform/chrome: cros_ec_proto: change Kunit expectation when timed out
platform/chrome: cros_ec_proto: separate cros_ec_wait_until_complete()
platform/chrome: cros_ec_proto: separate cros_ec_xfer_command()
platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_send_command()
platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_cmd_xfer()
platform/chrome: cros_ec_proto: add "cros_ec_" prefix to send_command()
platform/chrome: cros_ec_typec: Register port altmodes
...

+3517 -362
+35
Documentation/devicetree/bindings/chrome/google,cros-kbd-led-backlight.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/chrome/google,cros-kbd-led-backlight.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: ChromeOS keyboard backlight LED driver. 8 + 9 + maintainers: 10 + - Tzung-Bi Shih <tzungbi@kernel.org> 11 + 12 + properties: 13 + compatible: 14 + const: google,cros-kbd-led-backlight 15 + 16 + required: 17 + - compatible 18 + 19 + additionalProperties: false 20 + 21 + examples: 22 + - | 23 + spi0 { 24 + #address-cells = <1>; 25 + #size-cells = <0>; 26 + 27 + cros_ec: ec@0 { 28 + compatible = "google,cros-ec-spi"; 29 + reg = <0>; 30 + 31 + kbd-led-backlight { 32 + compatible = "google,cros-kbd-led-backlight"; 33 + }; 34 + }; 35 + };
+3
Documentation/devicetree/bindings/mfd/google,cros-ec.yaml
··· 90 90 pwm: 91 91 $ref: "/schemas/pwm/google,cros-ec-pwm.yaml#" 92 92 93 + kbd-led-backlight: 94 + $ref: "/schemas/chrome/google,cros-kbd-led-backlight.yaml#" 95 + 93 96 keyboard-controller: 94 97 $ref: "/schemas/input/google,cros-ec-keyb.yaml#" 95 98
+2 -2
drivers/mfd/cros_ec_dev.c
··· 250 250 * The PCHG device cannot be detected by sending EC_FEATURE_GET_CMD, but 251 251 * it can be detected by querying the number of peripheral chargers. 252 252 */ 253 - retval = cros_ec_command(ec->ec_dev, 0, EC_CMD_PCHG_COUNT, NULL, 0, 254 - &pchg_count, sizeof(pchg_count)); 253 + retval = cros_ec_cmd(ec->ec_dev, 0, EC_CMD_PCHG_COUNT, NULL, 0, 254 + &pchg_count, sizeof(pchg_count)); 255 255 if (retval >= 0 && pchg_count.port_count) { 256 256 retval = mfd_add_hotplug_devices(ec->dev, 257 257 cros_ec_pchg_cells,
+10 -1
drivers/platform/chrome/Kconfig
··· 139 139 140 140 config CROS_KBD_LED_BACKLIGHT 141 141 tristate "Backlight LED support for Chrome OS keyboards" 142 - depends on LEDS_CLASS && ACPI 142 + depends on LEDS_CLASS && (ACPI || CROS_EC) 143 143 help 144 144 This option enables support for the keyboard backlight LEDs on 145 145 select Chrome OS systems. ··· 266 266 minimize drm probe deferral. 267 267 268 268 source "drivers/platform/chrome/wilco_ec/Kconfig" 269 + 270 + # Kunit test cases 271 + config CROS_KUNIT 272 + tristate "Kunit tests for ChromeOS" if !KUNIT_ALL_TESTS 273 + depends on KUNIT && CROS_EC 274 + default KUNIT_ALL_TESTS 275 + select CROS_EC_PROTO 276 + help 277 + ChromeOS Kunit tests. 269 278 270 279 endif # CHROMEOS_PLATFORMS
+5
drivers/platform/chrome/Makefile
··· 30 30 obj-$(CONFIG_CROS_USBPD_NOTIFY) += cros_usbpd_notify.o 31 31 32 32 obj-$(CONFIG_WILCO_EC) += wilco_ec/ 33 + 34 + # Kunit test cases 35 + obj-$(CONFIG_CROS_KUNIT) += cros_kunit.o 36 + cros_kunit-objs := cros_kunit_util.o 37 + cros_kunit-objs += cros_ec_proto_test.o
+4 -7
drivers/platform/chrome/cros_ec.c
··· 19 19 20 20 #include "cros_ec.h" 21 21 22 - #define CROS_EC_DEV_EC_INDEX 0 23 - #define CROS_EC_DEV_PD_INDEX 1 24 - 25 22 static struct cros_ec_platform ec_p = { 26 23 .ec_name = CROS_EC_DEV_NAME, 27 24 .cmd_offset = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_EC_INDEX), ··· 132 135 buf.msg.command = EC_CMD_HOST_SLEEP_EVENT; 133 136 134 137 ret = cros_ec_cmd_xfer_status(ec_dev, &buf.msg); 135 - 136 - /* For now, report failure to transition to S0ix with a warning. */ 138 + /* Report failure to transition to system wide suspend with a warning. */ 137 139 if (ret >= 0 && ec_dev->host_sleep_v1 && 138 - (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME)) { 140 + (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME || 141 + sleep_event == HOST_SLEEP_EVENT_S3_RESUME)) { 139 142 ec_dev->last_resume_result = 140 143 buf.u.resp1.resume_response.sleep_transitions; 141 144 142 145 WARN_ONCE(buf.u.resp1.resume_response.sleep_transitions & 143 146 EC_HOST_RESUME_SLEEP_TIMEOUT, 144 - "EC detected sleep transition timeout. Total slp_s0 transitions: %d", 147 + "EC detected sleep transition timeout. Total sleep transitions: %d", 145 148 buf.u.resp1.resume_response.sleep_transitions & 146 149 EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK); 147 150 }
+275 -252
drivers/platform/chrome/cros_ec_proto.c
··· 52 52 return ret; 53 53 } 54 54 55 - static int prepare_packet(struct cros_ec_device *ec_dev, 56 - struct cros_ec_command *msg) 55 + static int prepare_tx(struct cros_ec_device *ec_dev, 56 + struct cros_ec_command *msg) 57 57 { 58 58 struct ec_host_request *request; 59 59 u8 *out; ··· 85 85 return sizeof(*request) + msg->outsize; 86 86 } 87 87 88 - static int send_command(struct cros_ec_device *ec_dev, 89 - struct cros_ec_command *msg) 90 - { 91 - int ret; 92 - int (*xfer_fxn)(struct cros_ec_device *ec, struct cros_ec_command *msg); 93 - 94 - if (ec_dev->proto_version > 2) 95 - xfer_fxn = ec_dev->pkt_xfer; 96 - else 97 - xfer_fxn = ec_dev->cmd_xfer; 98 - 99 - if (!xfer_fxn) { 100 - /* 101 - * This error can happen if a communication error happened and 102 - * the EC is trying to use protocol v2, on an underlying 103 - * communication mechanism that does not support v2. 104 - */ 105 - dev_err_once(ec_dev->dev, 106 - "missing EC transfer API, cannot send command\n"); 107 - return -EIO; 108 - } 109 - 110 - trace_cros_ec_request_start(msg); 111 - ret = (*xfer_fxn)(ec_dev, msg); 112 - trace_cros_ec_request_done(msg, ret); 113 - if (msg->result == EC_RES_IN_PROGRESS) { 114 - int i; 115 - struct cros_ec_command *status_msg; 116 - struct ec_response_get_comms_status *status; 117 - 118 - status_msg = kmalloc(sizeof(*status_msg) + sizeof(*status), 119 - GFP_KERNEL); 120 - if (!status_msg) 121 - return -ENOMEM; 122 - 123 - status_msg->version = 0; 124 - status_msg->command = EC_CMD_GET_COMMS_STATUS; 125 - status_msg->insize = sizeof(*status); 126 - status_msg->outsize = 0; 127 - 128 - /* 129 - * Query the EC's status until it's no longer busy or 130 - * we encounter an error. 131 - */ 132 - for (i = 0; i < EC_COMMAND_RETRIES; i++) { 133 - usleep_range(10000, 11000); 134 - 135 - trace_cros_ec_request_start(status_msg); 136 - ret = (*xfer_fxn)(ec_dev, status_msg); 137 - trace_cros_ec_request_done(status_msg, ret); 138 - if (ret == -EAGAIN) 139 - continue; 140 - if (ret < 0) 141 - break; 142 - 143 - msg->result = status_msg->result; 144 - if (status_msg->result != EC_RES_SUCCESS) 145 - break; 146 - 147 - status = (struct ec_response_get_comms_status *) 148 - status_msg->data; 149 - if (!(status->flags & EC_COMMS_STATUS_PROCESSING)) 150 - break; 151 - } 152 - 153 - kfree(status_msg); 154 - } 155 - 156 - return ret; 157 - } 158 - 159 - /** 160 - * cros_ec_prepare_tx() - Prepare an outgoing message in the output buffer. 161 - * @ec_dev: Device to register. 162 - * @msg: Message to write. 163 - * 164 - * This is intended to be used by all ChromeOS EC drivers, but at present 165 - * only SPI uses it. Once LPC uses the same protocol it can start using it. 166 - * I2C could use it now, with a refactor of the existing code. 167 - * 168 - * Return: number of prepared bytes on success or negative error code. 169 - */ 170 - int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, 171 - struct cros_ec_command *msg) 88 + static int prepare_tx_legacy(struct cros_ec_device *ec_dev, 89 + struct cros_ec_command *msg) 172 90 { 173 91 u8 *out; 174 92 u8 csum; 175 93 int i; 176 - 177 - if (ec_dev->proto_version > 2) 178 - return prepare_packet(ec_dev, msg); 179 94 180 95 if (msg->outsize > EC_PROTO2_MAX_PARAM_SIZE) 181 96 return -EINVAL; ··· 106 191 107 192 return EC_MSG_TX_PROTO_BYTES + msg->outsize; 108 193 } 194 + 195 + static int cros_ec_xfer_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) 196 + { 197 + int ret; 198 + int (*xfer_fxn)(struct cros_ec_device *ec, struct cros_ec_command *msg); 199 + 200 + if (ec_dev->proto_version > 2) 201 + xfer_fxn = ec_dev->pkt_xfer; 202 + else 203 + xfer_fxn = ec_dev->cmd_xfer; 204 + 205 + if (!xfer_fxn) { 206 + /* 207 + * This error can happen if a communication error happened and 208 + * the EC is trying to use protocol v2, on an underlying 209 + * communication mechanism that does not support v2. 210 + */ 211 + dev_err_once(ec_dev->dev, "missing EC transfer API, cannot send command\n"); 212 + return -EIO; 213 + } 214 + 215 + trace_cros_ec_request_start(msg); 216 + ret = (*xfer_fxn)(ec_dev, msg); 217 + trace_cros_ec_request_done(msg, ret); 218 + 219 + return ret; 220 + } 221 + 222 + static int cros_ec_wait_until_complete(struct cros_ec_device *ec_dev, uint32_t *result) 223 + { 224 + struct { 225 + struct cros_ec_command msg; 226 + struct ec_response_get_comms_status status; 227 + } __packed buf; 228 + struct cros_ec_command *msg = &buf.msg; 229 + struct ec_response_get_comms_status *status = &buf.status; 230 + int ret = 0, i; 231 + 232 + msg->version = 0; 233 + msg->command = EC_CMD_GET_COMMS_STATUS; 234 + msg->insize = sizeof(*status); 235 + msg->outsize = 0; 236 + 237 + /* Query the EC's status until it's no longer busy or we encounter an error. */ 238 + for (i = 0; i < EC_COMMAND_RETRIES; ++i) { 239 + usleep_range(10000, 11000); 240 + 241 + ret = cros_ec_xfer_command(ec_dev, msg); 242 + if (ret == -EAGAIN) 243 + continue; 244 + if (ret < 0) 245 + return ret; 246 + 247 + *result = msg->result; 248 + if (msg->result != EC_RES_SUCCESS) 249 + return ret; 250 + 251 + if (ret == 0) { 252 + ret = -EPROTO; 253 + break; 254 + } 255 + 256 + if (!(status->flags & EC_COMMS_STATUS_PROCESSING)) 257 + return ret; 258 + } 259 + 260 + if (i >= EC_COMMAND_RETRIES) 261 + ret = -EAGAIN; 262 + 263 + return ret; 264 + } 265 + 266 + static int cros_ec_send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) 267 + { 268 + int ret = cros_ec_xfer_command(ec_dev, msg); 269 + 270 + if (msg->result == EC_RES_IN_PROGRESS) 271 + ret = cros_ec_wait_until_complete(ec_dev, &msg->result); 272 + 273 + return ret; 274 + } 275 + 276 + /** 277 + * cros_ec_prepare_tx() - Prepare an outgoing message in the output buffer. 278 + * @ec_dev: Device to register. 279 + * @msg: Message to write. 280 + * 281 + * This is used by all ChromeOS EC drivers to prepare the outgoing message 282 + * according to different protocol versions. 283 + * 284 + * Return: number of prepared bytes on success or negative error code. 285 + */ 286 + int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, 287 + struct cros_ec_command *msg) 288 + { 289 + if (ec_dev->proto_version > 2) 290 + return prepare_tx(ec_dev, msg); 291 + 292 + return prepare_tx_legacy(ec_dev, msg); 293 + } 109 294 EXPORT_SYMBOL(cros_ec_prepare_tx); 110 295 111 296 /** ··· 214 199 * @msg: Message to check. 215 200 * 216 201 * This is used by ChromeOS EC drivers to check the ec_msg->result for 217 - * errors and to warn about them. 202 + * EC_RES_IN_PROGRESS and to warn about them. 218 203 * 219 - * Return: 0 on success or negative error code. 204 + * The function should not check for furthermore error codes. Otherwise, 205 + * it would break the ABI. 206 + * 207 + * Return: -EAGAIN if ec_msg->result == EC_RES_IN_PROGRESS. Otherwise, 0. 220 208 */ 221 209 int cros_ec_check_result(struct cros_ec_device *ec_dev, 222 210 struct cros_ec_command *msg) ··· 246 228 * 247 229 * @ec_dev: EC device to call 248 230 * @msg: message structure to use 249 - * @mask: result when function returns >=0. 231 + * @mask: result when function returns 0. 250 232 * 251 233 * LOCKING: 252 234 * the caller has ec_dev->lock mutex, or the caller knows there is 253 235 * no other command in progress. 254 236 */ 255 - static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, 256 - struct cros_ec_command *msg, 257 - uint32_t *mask) 237 + static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, uint32_t *mask) 258 238 { 239 + struct cros_ec_command *msg; 259 240 struct ec_response_host_event_mask *r; 260 - int ret; 241 + int ret, mapped; 242 + 243 + msg = kzalloc(sizeof(*msg) + sizeof(*r), GFP_KERNEL); 244 + if (!msg) 245 + return -ENOMEM; 261 246 262 247 msg->command = EC_CMD_HOST_EVENT_GET_WAKE_MASK; 263 - msg->version = 0; 264 - msg->outsize = 0; 265 248 msg->insize = sizeof(*r); 266 249 267 - ret = send_command(ec_dev, msg); 268 - if (ret >= 0) { 269 - if (msg->result == EC_RES_INVALID_COMMAND) 270 - return -EOPNOTSUPP; 271 - if (msg->result != EC_RES_SUCCESS) 272 - return -EPROTO; 273 - } 274 - if (ret > 0) { 275 - r = (struct ec_response_host_event_mask *)msg->data; 276 - *mask = r->mask; 250 + ret = cros_ec_send_command(ec_dev, msg); 251 + if (ret < 0) 252 + goto exit; 253 + 254 + mapped = cros_ec_map_error(msg->result); 255 + if (mapped) { 256 + ret = mapped; 257 + goto exit; 277 258 } 278 259 260 + if (ret == 0) { 261 + ret = -EPROTO; 262 + goto exit; 263 + } 264 + 265 + r = (struct ec_response_host_event_mask *)msg->data; 266 + *mask = r->mask; 267 + ret = 0; 268 + exit: 269 + kfree(msg); 279 270 return ret; 280 271 } 281 272 282 - static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev, 283 - int devidx, 284 - struct cros_ec_command *msg) 273 + static int cros_ec_get_proto_info(struct cros_ec_device *ec_dev, int devidx) 285 274 { 286 - /* 287 - * Try using v3+ to query for supported protocols. If this 288 - * command fails, fall back to v2. Returns the highest protocol 289 - * supported by the EC. 290 - * Also sets the max request/response/passthru size. 291 - */ 292 - int ret; 275 + struct cros_ec_command *msg; 276 + struct ec_response_get_protocol_info *info; 277 + int ret, mapped; 293 278 294 - if (!ec_dev->pkt_xfer) 295 - return -EPROTONOSUPPORT; 279 + ec_dev->proto_version = 3; 280 + if (devidx > 0) 281 + ec_dev->max_passthru = 0; 296 282 297 - memset(msg, 0, sizeof(*msg)); 283 + msg = kzalloc(sizeof(*msg) + sizeof(*info), GFP_KERNEL); 284 + if (!msg) 285 + return -ENOMEM; 286 + 298 287 msg->command = EC_CMD_PASSTHRU_OFFSET(devidx) | EC_CMD_GET_PROTOCOL_INFO; 299 - msg->insize = sizeof(struct ec_response_get_protocol_info); 288 + msg->insize = sizeof(*info); 300 289 301 - ret = send_command(ec_dev, msg); 290 + ret = cros_ec_send_command(ec_dev, msg); 302 291 /* 303 292 * Send command once again when timeout occurred. 304 293 * Fingerprint MCU (FPMCU) is restarted during system boot which ··· 314 289 * attempt because we waited at least EC_MSG_DEADLINE_MS. 315 290 */ 316 291 if (ret == -ETIMEDOUT) 317 - ret = send_command(ec_dev, msg); 292 + ret = cros_ec_send_command(ec_dev, msg); 318 293 319 294 if (ret < 0) { 320 295 dev_dbg(ec_dev->dev, 321 296 "failed to check for EC[%d] protocol version: %d\n", 322 297 devidx, ret); 323 - return ret; 298 + goto exit; 324 299 } 325 300 326 - if (devidx > 0 && msg->result == EC_RES_INVALID_COMMAND) 327 - return -ENODEV; 328 - else if (msg->result != EC_RES_SUCCESS) 329 - return msg->result; 301 + mapped = cros_ec_map_error(msg->result); 302 + if (mapped) { 303 + ret = mapped; 304 + goto exit; 305 + } 330 306 331 - return 0; 307 + if (ret == 0) { 308 + ret = -EPROTO; 309 + goto exit; 310 + } 311 + 312 + info = (struct ec_response_get_protocol_info *)msg->data; 313 + 314 + switch (devidx) { 315 + case CROS_EC_DEV_EC_INDEX: 316 + ec_dev->max_request = info->max_request_packet_size - 317 + sizeof(struct ec_host_request); 318 + ec_dev->max_response = info->max_response_packet_size - 319 + sizeof(struct ec_host_response); 320 + ec_dev->proto_version = min(EC_HOST_REQUEST_VERSION, 321 + fls(info->protocol_versions) - 1); 322 + ec_dev->din_size = info->max_response_packet_size + EC_MAX_RESPONSE_OVERHEAD; 323 + ec_dev->dout_size = info->max_request_packet_size + EC_MAX_REQUEST_OVERHEAD; 324 + 325 + dev_dbg(ec_dev->dev, "using proto v%u\n", ec_dev->proto_version); 326 + break; 327 + case CROS_EC_DEV_PD_INDEX: 328 + ec_dev->max_passthru = info->max_request_packet_size - 329 + sizeof(struct ec_host_request); 330 + 331 + dev_dbg(ec_dev->dev, "found PD chip\n"); 332 + break; 333 + default: 334 + dev_dbg(ec_dev->dev, "unknown passthru index: %d\n", devidx); 335 + break; 336 + } 337 + 338 + ret = 0; 339 + exit: 340 + kfree(msg); 341 + return ret; 332 342 } 333 343 334 - static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_dev) 344 + static int cros_ec_get_proto_info_legacy(struct cros_ec_device *ec_dev) 335 345 { 336 346 struct cros_ec_command *msg; 337 - struct ec_params_hello *hello_params; 338 - struct ec_response_hello *hello_response; 339 - int ret; 340 - int len = max(sizeof(*hello_params), sizeof(*hello_response)); 347 + struct ec_params_hello *params; 348 + struct ec_response_hello *response; 349 + int ret, mapped; 341 350 342 - msg = kmalloc(sizeof(*msg) + len, GFP_KERNEL); 351 + ec_dev->proto_version = 2; 352 + 353 + msg = kzalloc(sizeof(*msg) + max(sizeof(*params), sizeof(*response)), GFP_KERNEL); 343 354 if (!msg) 344 355 return -ENOMEM; 345 356 346 - msg->version = 0; 347 357 msg->command = EC_CMD_HELLO; 348 - hello_params = (struct ec_params_hello *)msg->data; 349 - msg->outsize = sizeof(*hello_params); 350 - hello_response = (struct ec_response_hello *)msg->data; 351 - msg->insize = sizeof(*hello_response); 358 + msg->insize = sizeof(*response); 359 + msg->outsize = sizeof(*params); 352 360 353 - hello_params->in_data = 0xa0b0c0d0; 361 + params = (struct ec_params_hello *)msg->data; 362 + params->in_data = 0xa0b0c0d0; 354 363 355 - ret = send_command(ec_dev, msg); 356 - 364 + ret = cros_ec_send_command(ec_dev, msg); 357 365 if (ret < 0) { 358 - dev_dbg(ec_dev->dev, 359 - "EC failed to respond to v2 hello: %d\n", 360 - ret); 366 + dev_dbg(ec_dev->dev, "EC failed to respond to v2 hello: %d\n", ret); 361 367 goto exit; 362 - } else if (msg->result != EC_RES_SUCCESS) { 363 - dev_err(ec_dev->dev, 364 - "EC responded to v2 hello with error: %d\n", 365 - msg->result); 366 - ret = msg->result; 368 + } 369 + 370 + mapped = cros_ec_map_error(msg->result); 371 + if (mapped) { 372 + ret = mapped; 373 + dev_err(ec_dev->dev, "EC responded to v2 hello with error: %d\n", msg->result); 367 374 goto exit; 368 - } else if (hello_response->out_data != 0xa1b2c3d4) { 375 + } 376 + 377 + if (ret == 0) { 378 + ret = -EPROTO; 379 + goto exit; 380 + } 381 + 382 + response = (struct ec_response_hello *)msg->data; 383 + if (response->out_data != 0xa1b2c3d4) { 369 384 dev_err(ec_dev->dev, 370 385 "EC responded to v2 hello with bad result: %u\n", 371 - hello_response->out_data); 386 + response->out_data); 372 387 ret = -EBADMSG; 373 388 goto exit; 374 389 } 375 390 376 - ret = 0; 391 + ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; 392 + ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; 393 + ec_dev->max_passthru = 0; 394 + ec_dev->pkt_xfer = NULL; 395 + ec_dev->din_size = EC_PROTO2_MSG_BYTES; 396 + ec_dev->dout_size = EC_PROTO2_MSG_BYTES; 377 397 378 - exit: 398 + dev_dbg(ec_dev->dev, "falling back to proto v2\n"); 399 + ret = 0; 400 + exit: 379 401 kfree(msg); 380 402 return ret; 381 403 } ··· 443 371 * the caller has ec_dev->lock mutex or the caller knows there is 444 372 * no other command in progress. 445 373 */ 446 - static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec_dev, 447 - u16 cmd, u32 *mask) 374 + static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec_dev, u16 cmd, u32 *mask) 448 375 { 449 376 struct ec_params_get_cmd_versions *pver; 450 377 struct ec_response_get_cmd_versions *rver; 451 378 struct cros_ec_command *msg; 452 - int ret; 379 + int ret, mapped; 453 380 454 381 msg = kmalloc(sizeof(*msg) + max(sizeof(*rver), sizeof(*pver)), 455 382 GFP_KERNEL); ··· 463 392 pver = (struct ec_params_get_cmd_versions *)msg->data; 464 393 pver->cmd = cmd; 465 394 466 - ret = send_command(ec_dev, msg); 467 - if (ret > 0) { 468 - rver = (struct ec_response_get_cmd_versions *)msg->data; 469 - *mask = rver->version_mask; 395 + ret = cros_ec_send_command(ec_dev, msg); 396 + if (ret < 0) 397 + goto exit; 398 + 399 + mapped = cros_ec_map_error(msg->result); 400 + if (mapped) { 401 + ret = mapped; 402 + goto exit; 470 403 } 471 404 472 - kfree(msg); 405 + if (ret == 0) { 406 + ret = -EPROTO; 407 + goto exit; 408 + } 473 409 410 + rver = (struct ec_response_get_cmd_versions *)msg->data; 411 + *mask = rver->version_mask; 412 + ret = 0; 413 + exit: 414 + kfree(msg); 474 415 return ret; 475 416 } 476 417 ··· 496 413 int cros_ec_query_all(struct cros_ec_device *ec_dev) 497 414 { 498 415 struct device *dev = ec_dev->dev; 499 - struct cros_ec_command *proto_msg; 500 - struct ec_response_get_protocol_info *proto_info; 501 - u32 ver_mask = 0; 416 + u32 ver_mask; 502 417 int ret; 503 418 504 - proto_msg = kzalloc(sizeof(*proto_msg) + sizeof(*proto_info), 505 - GFP_KERNEL); 506 - if (!proto_msg) 507 - return -ENOMEM; 508 - 509 419 /* First try sending with proto v3. */ 510 - ec_dev->proto_version = 3; 511 - ret = cros_ec_host_command_proto_query(ec_dev, 0, proto_msg); 512 - 513 - if (ret == 0) { 514 - proto_info = (struct ec_response_get_protocol_info *) 515 - proto_msg->data; 516 - ec_dev->max_request = proto_info->max_request_packet_size - 517 - sizeof(struct ec_host_request); 518 - ec_dev->max_response = proto_info->max_response_packet_size - 519 - sizeof(struct ec_host_response); 520 - ec_dev->proto_version = 521 - min(EC_HOST_REQUEST_VERSION, 522 - fls(proto_info->protocol_versions) - 1); 523 - dev_dbg(ec_dev->dev, 524 - "using proto v%u\n", 525 - ec_dev->proto_version); 526 - 527 - ec_dev->din_size = ec_dev->max_response + 528 - sizeof(struct ec_host_response) + 529 - EC_MAX_RESPONSE_OVERHEAD; 530 - ec_dev->dout_size = ec_dev->max_request + 531 - sizeof(struct ec_host_request) + 532 - EC_MAX_REQUEST_OVERHEAD; 533 - 534 - /* 535 - * Check for PD 536 - */ 537 - ret = cros_ec_host_command_proto_query(ec_dev, 1, proto_msg); 538 - 539 - if (ret) { 540 - dev_dbg(ec_dev->dev, "no PD chip found: %d\n", ret); 541 - ec_dev->max_passthru = 0; 542 - } else { 543 - dev_dbg(ec_dev->dev, "found PD chip\n"); 544 - ec_dev->max_passthru = 545 - proto_info->max_request_packet_size - 546 - sizeof(struct ec_host_request); 547 - } 420 + if (!cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_EC_INDEX)) { 421 + /* Check for PD. */ 422 + cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_PD_INDEX); 548 423 } else { 549 424 /* Try querying with a v2 hello message. */ 550 - ec_dev->proto_version = 2; 551 - ret = cros_ec_host_command_proto_query_v2(ec_dev); 552 - 553 - if (ret == 0) { 554 - /* V2 hello succeeded. */ 555 - dev_dbg(ec_dev->dev, "falling back to proto v2\n"); 556 - 557 - ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; 558 - ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; 559 - ec_dev->max_passthru = 0; 560 - ec_dev->pkt_xfer = NULL; 561 - ec_dev->din_size = EC_PROTO2_MSG_BYTES; 562 - ec_dev->dout_size = EC_PROTO2_MSG_BYTES; 563 - } else { 425 + ret = cros_ec_get_proto_info_legacy(ec_dev); 426 + if (ret) { 564 427 /* 565 428 * It's possible for a test to occur too early when 566 429 * the EC isn't listening. If this happens, we'll ··· 514 485 */ 515 486 ec_dev->proto_version = EC_PROTO_VERSION_UNKNOWN; 516 487 dev_dbg(ec_dev->dev, "EC query failed: %d\n", ret); 517 - goto exit; 488 + return ret; 518 489 } 519 490 } 520 491 ··· 535 506 } 536 507 537 508 /* Probe if MKBP event is supported */ 538 - ret = cros_ec_get_host_command_version_mask(ec_dev, 539 - EC_CMD_GET_NEXT_EVENT, 540 - &ver_mask); 541 - if (ret < 0 || ver_mask == 0) 509 + ret = cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_GET_NEXT_EVENT, &ver_mask); 510 + if (ret < 0 || ver_mask == 0) { 542 511 ec_dev->mkbp_event_supported = 0; 543 - else 512 + } else { 544 513 ec_dev->mkbp_event_supported = fls(ver_mask); 545 514 546 - dev_dbg(ec_dev->dev, "MKBP support version %u\n", 547 - ec_dev->mkbp_event_supported - 1); 515 + dev_dbg(ec_dev->dev, "MKBP support version %u\n", ec_dev->mkbp_event_supported - 1); 516 + } 548 517 549 518 /* Probe if host sleep v1 is supported for S0ix failure detection. */ 550 - ret = cros_ec_get_host_command_version_mask(ec_dev, 551 - EC_CMD_HOST_SLEEP_EVENT, 552 - &ver_mask); 553 - ec_dev->host_sleep_v1 = (ret >= 0 && (ver_mask & EC_VER_MASK(1))); 519 + ret = cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_HOST_SLEEP_EVENT, &ver_mask); 520 + ec_dev->host_sleep_v1 = (ret == 0 && (ver_mask & EC_VER_MASK(1))); 554 521 555 522 /* Get host event wake mask. */ 556 - ret = cros_ec_get_host_event_wake_mask(ec_dev, proto_msg, 557 - &ec_dev->host_event_wake_mask); 523 + ret = cros_ec_get_host_event_wake_mask(ec_dev, &ec_dev->host_event_wake_mask); 558 524 if (ret < 0) { 559 525 /* 560 526 * If the EC doesn't support EC_CMD_HOST_EVENT_GET_WAKE_MASK, ··· 580 556 ret = 0; 581 557 582 558 exit: 583 - kfree(proto_msg); 584 559 return ret; 585 560 } 586 561 EXPORT_SYMBOL(cros_ec_query_all); ··· 624 601 msg->insize = ec_dev->max_response; 625 602 } 626 603 627 - if (msg->command < EC_CMD_PASSTHRU_OFFSET(1)) { 604 + if (msg->command < EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX)) { 628 605 if (msg->outsize > ec_dev->max_request) { 629 606 dev_err(ec_dev->dev, 630 607 "request of size %u is too big (max: %u)\n", ··· 644 621 } 645 622 } 646 623 647 - ret = send_command(ec_dev, msg); 624 + ret = cros_ec_send_command(ec_dev, msg); 648 625 mutex_unlock(&ec_dev->lock); 649 626 650 627 return ret; ··· 875 852 876 853 if (features->flags[0] == -1U && features->flags[1] == -1U) { 877 854 /* features bitmap not read yet */ 878 - ret = cros_ec_command(ec->ec_dev, 0, EC_CMD_GET_FEATURES + ec->cmd_offset, 879 - NULL, 0, features, sizeof(*features)); 855 + ret = cros_ec_cmd(ec->ec_dev, 0, EC_CMD_GET_FEATURES + ec->cmd_offset, 856 + NULL, 0, features, sizeof(*features)); 880 857 if (ret < 0) { 881 858 dev_warn(ec->dev, "cannot get EC features: %d\n", ret); 882 859 memset(features, 0, sizeof(*features)); ··· 957 934 EXPORT_SYMBOL_GPL(cros_ec_get_sensor_count); 958 935 959 936 /** 960 - * cros_ec_command - Send a command to the EC. 937 + * cros_ec_cmd - Send a command to the EC. 961 938 * 962 939 * @ec_dev: EC device 963 940 * @version: EC command version ··· 969 946 * 970 947 * Return: >= 0 on success, negative error number on failure. 971 948 */ 972 - int cros_ec_command(struct cros_ec_device *ec_dev, 973 - unsigned int version, 974 - int command, 975 - void *outdata, 976 - int outsize, 977 - void *indata, 978 - int insize) 949 + int cros_ec_cmd(struct cros_ec_device *ec_dev, 950 + unsigned int version, 951 + int command, 952 + void *outdata, 953 + size_t outsize, 954 + void *indata, 955 + size_t insize) 979 956 { 980 957 struct cros_ec_command *msg; 981 958 int ret; ··· 1002 979 kfree(msg); 1003 980 return ret; 1004 981 } 1005 - EXPORT_SYMBOL_GPL(cros_ec_command); 982 + EXPORT_SYMBOL_GPL(cros_ec_cmd);
+2753
drivers/platform/chrome/cros_ec_proto_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Kunit tests for ChromeOS Embedded Controller protocol. 4 + */ 5 + 6 + #include <kunit/test.h> 7 + 8 + #include <asm-generic/unaligned.h> 9 + #include <linux/platform_data/cros_ec_commands.h> 10 + #include <linux/platform_data/cros_ec_proto.h> 11 + 12 + #include "cros_ec.h" 13 + #include "cros_kunit_util.h" 14 + 15 + #define BUFSIZE 512 16 + 17 + struct cros_ec_proto_test_priv { 18 + struct cros_ec_device ec_dev; 19 + u8 dout[BUFSIZE]; 20 + u8 din[BUFSIZE]; 21 + struct cros_ec_command *msg; 22 + u8 _msg[BUFSIZE]; 23 + }; 24 + 25 + static void cros_ec_proto_test_prepare_tx_legacy_normal(struct kunit *test) 26 + { 27 + struct cros_ec_proto_test_priv *priv = test->priv; 28 + struct cros_ec_device *ec_dev = &priv->ec_dev; 29 + struct cros_ec_command *msg = priv->msg; 30 + int ret, i; 31 + u8 csum; 32 + 33 + ec_dev->proto_version = 2; 34 + 35 + msg->command = EC_CMD_HELLO; 36 + msg->outsize = EC_PROTO2_MAX_PARAM_SIZE; 37 + msg->data[0] = 0xde; 38 + msg->data[1] = 0xad; 39 + msg->data[2] = 0xbe; 40 + msg->data[3] = 0xef; 41 + 42 + ret = cros_ec_prepare_tx(ec_dev, msg); 43 + 44 + KUNIT_EXPECT_EQ(test, ret, EC_MSG_TX_PROTO_BYTES + EC_PROTO2_MAX_PARAM_SIZE); 45 + KUNIT_EXPECT_EQ(test, ec_dev->dout[0], EC_CMD_VERSION0); 46 + KUNIT_EXPECT_EQ(test, ec_dev->dout[1], EC_CMD_HELLO); 47 + KUNIT_EXPECT_EQ(test, ec_dev->dout[2], EC_PROTO2_MAX_PARAM_SIZE); 48 + KUNIT_EXPECT_EQ(test, EC_MSG_TX_HEADER_BYTES, 3); 49 + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 0], 0xde); 50 + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 1], 0xad); 51 + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 2], 0xbe); 52 + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + 3], 0xef); 53 + for (i = 4; i < EC_PROTO2_MAX_PARAM_SIZE; ++i) 54 + KUNIT_EXPECT_EQ(test, ec_dev->dout[EC_MSG_TX_HEADER_BYTES + i], 0); 55 + 56 + csum = EC_CMD_VERSION0; 57 + csum += EC_CMD_HELLO; 58 + csum += EC_PROTO2_MAX_PARAM_SIZE; 59 + csum += 0xde; 60 + csum += 0xad; 61 + csum += 0xbe; 62 + csum += 0xef; 63 + KUNIT_EXPECT_EQ(test, 64 + ec_dev->dout[EC_MSG_TX_HEADER_BYTES + EC_PROTO2_MAX_PARAM_SIZE], 65 + csum); 66 + } 67 + 68 + static void cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize(struct kunit *test) 69 + { 70 + struct cros_ec_proto_test_priv *priv = test->priv; 71 + struct cros_ec_device *ec_dev = &priv->ec_dev; 72 + struct cros_ec_command *msg = priv->msg; 73 + int ret; 74 + 75 + ec_dev->proto_version = 2; 76 + 77 + msg->outsize = EC_PROTO2_MAX_PARAM_SIZE + 1; 78 + 79 + ret = cros_ec_prepare_tx(ec_dev, msg); 80 + KUNIT_EXPECT_EQ(test, ret, -EINVAL); 81 + } 82 + 83 + static void cros_ec_proto_test_prepare_tx_normal(struct kunit *test) 84 + { 85 + struct cros_ec_proto_test_priv *priv = test->priv; 86 + struct cros_ec_device *ec_dev = &priv->ec_dev; 87 + struct cros_ec_command *msg = priv->msg; 88 + struct ec_host_request *request = (struct ec_host_request *)ec_dev->dout; 89 + int ret, i; 90 + u8 csum; 91 + 92 + msg->command = EC_CMD_HELLO; 93 + msg->outsize = 0x88; 94 + msg->data[0] = 0xde; 95 + msg->data[1] = 0xad; 96 + msg->data[2] = 0xbe; 97 + msg->data[3] = 0xef; 98 + 99 + ret = cros_ec_prepare_tx(ec_dev, msg); 100 + 101 + KUNIT_EXPECT_EQ(test, ret, sizeof(*request) + 0x88); 102 + 103 + KUNIT_EXPECT_EQ(test, request->struct_version, EC_HOST_REQUEST_VERSION); 104 + KUNIT_EXPECT_EQ(test, request->command, EC_CMD_HELLO); 105 + KUNIT_EXPECT_EQ(test, request->command_version, 0); 106 + KUNIT_EXPECT_EQ(test, request->data_len, 0x88); 107 + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 0], 0xde); 108 + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 1], 0xad); 109 + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 2], 0xbe); 110 + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + 3], 0xef); 111 + for (i = 4; i < 0x88; ++i) 112 + KUNIT_EXPECT_EQ(test, ec_dev->dout[sizeof(*request) + i], 0); 113 + 114 + csum = EC_HOST_REQUEST_VERSION; 115 + csum += EC_CMD_HELLO; 116 + csum += 0x88; 117 + csum += 0xde; 118 + csum += 0xad; 119 + csum += 0xbe; 120 + csum += 0xef; 121 + KUNIT_EXPECT_EQ(test, request->checksum, (u8)-csum); 122 + } 123 + 124 + static void cros_ec_proto_test_prepare_tx_bad_msg_outsize(struct kunit *test) 125 + { 126 + struct cros_ec_proto_test_priv *priv = test->priv; 127 + struct cros_ec_device *ec_dev = &priv->ec_dev; 128 + struct cros_ec_command *msg = priv->msg; 129 + int ret; 130 + 131 + msg->outsize = ec_dev->dout_size - sizeof(struct ec_host_request) + 1; 132 + 133 + ret = cros_ec_prepare_tx(ec_dev, msg); 134 + KUNIT_EXPECT_EQ(test, ret, -EINVAL); 135 + } 136 + 137 + static void cros_ec_proto_test_check_result(struct kunit *test) 138 + { 139 + struct cros_ec_proto_test_priv *priv = test->priv; 140 + struct cros_ec_device *ec_dev = &priv->ec_dev; 141 + struct cros_ec_command *msg = priv->msg; 142 + int ret, i; 143 + static enum ec_status status[] = { 144 + EC_RES_SUCCESS, 145 + EC_RES_INVALID_COMMAND, 146 + EC_RES_ERROR, 147 + EC_RES_INVALID_PARAM, 148 + EC_RES_ACCESS_DENIED, 149 + EC_RES_INVALID_RESPONSE, 150 + EC_RES_INVALID_VERSION, 151 + EC_RES_INVALID_CHECKSUM, 152 + EC_RES_UNAVAILABLE, 153 + EC_RES_TIMEOUT, 154 + EC_RES_OVERFLOW, 155 + EC_RES_INVALID_HEADER, 156 + EC_RES_REQUEST_TRUNCATED, 157 + EC_RES_RESPONSE_TOO_BIG, 158 + EC_RES_BUS_ERROR, 159 + EC_RES_BUSY, 160 + EC_RES_INVALID_HEADER_VERSION, 161 + EC_RES_INVALID_HEADER_CRC, 162 + EC_RES_INVALID_DATA_CRC, 163 + EC_RES_DUP_UNAVAILABLE, 164 + }; 165 + 166 + for (i = 0; i < ARRAY_SIZE(status); ++i) { 167 + msg->result = status[i]; 168 + ret = cros_ec_check_result(ec_dev, msg); 169 + KUNIT_EXPECT_EQ(test, ret, 0); 170 + } 171 + 172 + msg->result = EC_RES_IN_PROGRESS; 173 + ret = cros_ec_check_result(ec_dev, msg); 174 + KUNIT_EXPECT_EQ(test, ret, -EAGAIN); 175 + } 176 + 177 + static void cros_ec_proto_test_query_all_pretest(struct kunit *test) 178 + { 179 + struct cros_ec_proto_test_priv *priv = test->priv; 180 + struct cros_ec_device *ec_dev = &priv->ec_dev; 181 + 182 + /* 183 + * cros_ec_query_all() will free din and dout and allocate them again to fit the usage by 184 + * calling devm_kfree() and devm_kzalloc(). Set them to NULL as they aren't managed by 185 + * ec_dev->dev but allocated statically in struct cros_ec_proto_test_priv 186 + * (see cros_ec_proto_test_init()). 187 + */ 188 + ec_dev->din = NULL; 189 + ec_dev->dout = NULL; 190 + } 191 + 192 + static void cros_ec_proto_test_query_all_normal(struct kunit *test) 193 + { 194 + struct cros_ec_proto_test_priv *priv = test->priv; 195 + struct cros_ec_device *ec_dev = &priv->ec_dev; 196 + struct ec_xfer_mock *mock; 197 + int ret; 198 + 199 + /* For cros_ec_get_proto_info() without passthru. */ 200 + { 201 + struct ec_response_get_protocol_info *data; 202 + 203 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 204 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 205 + 206 + data = (struct ec_response_get_protocol_info *)mock->o_data; 207 + data->protocol_versions = BIT(3) | BIT(2); 208 + data->max_request_packet_size = 0xbe; 209 + data->max_response_packet_size = 0xef; 210 + } 211 + 212 + /* For cros_ec_get_proto_info() with passthru. */ 213 + { 214 + struct ec_response_get_protocol_info *data; 215 + 216 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 217 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 218 + 219 + data = (struct ec_response_get_protocol_info *)mock->o_data; 220 + data->max_request_packet_size = 0xbf; 221 + } 222 + 223 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 224 + { 225 + struct ec_response_get_cmd_versions *data; 226 + 227 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 228 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 229 + 230 + data = (struct ec_response_get_cmd_versions *)mock->o_data; 231 + data->version_mask = BIT(6) | BIT(5); 232 + } 233 + 234 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 235 + { 236 + struct ec_response_get_cmd_versions *data; 237 + 238 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 239 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 240 + 241 + data = (struct ec_response_get_cmd_versions *)mock->o_data; 242 + data->version_mask = BIT(1); 243 + } 244 + 245 + /* For cros_ec_get_host_event_wake_mask(). */ 246 + { 247 + struct ec_response_host_event_mask *data; 248 + 249 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 250 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 251 + 252 + data = (struct ec_response_host_event_mask *)mock->o_data; 253 + data->mask = 0xbeef; 254 + } 255 + 256 + cros_ec_proto_test_query_all_pretest(test); 257 + ret = cros_ec_query_all(ec_dev); 258 + KUNIT_EXPECT_EQ(test, ret, 0); 259 + 260 + /* For cros_ec_get_proto_info() without passthru. */ 261 + { 262 + mock = cros_kunit_ec_xfer_mock_next(); 263 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 264 + 265 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 266 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 267 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 268 + sizeof(struct ec_response_get_protocol_info)); 269 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 270 + 271 + KUNIT_EXPECT_EQ(test, ec_dev->max_request, 0xbe - sizeof(struct ec_host_request)); 272 + KUNIT_EXPECT_EQ(test, ec_dev->max_response, 0xef - sizeof(struct ec_host_response)); 273 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 3); 274 + KUNIT_EXPECT_EQ(test, ec_dev->din_size, 0xef + EC_MAX_RESPONSE_OVERHEAD); 275 + KUNIT_EXPECT_EQ(test, ec_dev->dout_size, 0xbe + EC_MAX_REQUEST_OVERHEAD); 276 + } 277 + 278 + /* For cros_ec_get_proto_info() with passthru. */ 279 + { 280 + mock = cros_kunit_ec_xfer_mock_next(); 281 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 282 + 283 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 284 + KUNIT_EXPECT_EQ(test, mock->msg.command, 285 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 286 + EC_CMD_GET_PROTOCOL_INFO); 287 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 288 + sizeof(struct ec_response_get_protocol_info)); 289 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 290 + 291 + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0xbf - sizeof(struct ec_host_request)); 292 + } 293 + 294 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 295 + { 296 + struct ec_params_get_cmd_versions *data; 297 + 298 + mock = cros_kunit_ec_xfer_mock_next(); 299 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 300 + 301 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 302 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 303 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 304 + sizeof(struct ec_response_get_cmd_versions)); 305 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 306 + 307 + data = (struct ec_params_get_cmd_versions *)mock->i_data; 308 + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); 309 + 310 + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 7); 311 + } 312 + 313 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 314 + { 315 + struct ec_params_get_cmd_versions *data; 316 + 317 + mock = cros_kunit_ec_xfer_mock_next(); 318 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 319 + 320 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 321 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 322 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 323 + sizeof(struct ec_response_get_cmd_versions)); 324 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 325 + 326 + data = (struct ec_params_get_cmd_versions *)mock->i_data; 327 + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_HOST_SLEEP_EVENT); 328 + 329 + KUNIT_EXPECT_TRUE(test, ec_dev->host_sleep_v1); 330 + } 331 + 332 + /* For cros_ec_get_host_event_wake_mask(). */ 333 + { 334 + mock = cros_kunit_ec_xfer_mock_next(); 335 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 336 + 337 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 338 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK); 339 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask)); 340 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 341 + 342 + KUNIT_EXPECT_EQ(test, ec_dev->host_event_wake_mask, 0xbeef); 343 + } 344 + } 345 + 346 + static void cros_ec_proto_test_query_all_no_pd_return_error(struct kunit *test) 347 + { 348 + struct cros_ec_proto_test_priv *priv = test->priv; 349 + struct cros_ec_device *ec_dev = &priv->ec_dev; 350 + struct ec_xfer_mock *mock; 351 + int ret; 352 + 353 + /* Set some garbage bytes. */ 354 + ec_dev->max_passthru = 0xbf; 355 + 356 + /* For cros_ec_get_proto_info() without passthru. */ 357 + { 358 + struct ec_response_get_protocol_info *data; 359 + 360 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 361 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 362 + 363 + /* 364 + * Although it doesn't check the value, provides valid sizes so that 365 + * cros_ec_query_all() allocates din and dout correctly. 366 + */ 367 + data = (struct ec_response_get_protocol_info *)mock->o_data; 368 + data->max_request_packet_size = 0xbe; 369 + data->max_response_packet_size = 0xef; 370 + } 371 + 372 + /* For cros_ec_get_proto_info() with passthru. */ 373 + { 374 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 375 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 376 + } 377 + 378 + cros_ec_proto_test_query_all_pretest(test); 379 + ret = cros_ec_query_all(ec_dev); 380 + KUNIT_EXPECT_EQ(test, ret, 0); 381 + 382 + /* For cros_ec_get_proto_info() without passthru. */ 383 + { 384 + mock = cros_kunit_ec_xfer_mock_next(); 385 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 386 + 387 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 388 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 389 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 390 + sizeof(struct ec_response_get_protocol_info)); 391 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 392 + } 393 + 394 + /* For cros_ec_get_proto_info() with passthru. */ 395 + { 396 + mock = cros_kunit_ec_xfer_mock_next(); 397 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 398 + 399 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 400 + KUNIT_EXPECT_EQ(test, mock->msg.command, 401 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 402 + EC_CMD_GET_PROTOCOL_INFO); 403 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 404 + sizeof(struct ec_response_get_protocol_info)); 405 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 406 + 407 + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); 408 + } 409 + } 410 + 411 + static void cros_ec_proto_test_query_all_no_pd_return0(struct kunit *test) 412 + { 413 + struct cros_ec_proto_test_priv *priv = test->priv; 414 + struct cros_ec_device *ec_dev = &priv->ec_dev; 415 + struct ec_xfer_mock *mock; 416 + int ret; 417 + 418 + /* Set some garbage bytes. */ 419 + ec_dev->max_passthru = 0xbf; 420 + 421 + /* For cros_ec_get_proto_info() without passthru. */ 422 + { 423 + struct ec_response_get_protocol_info *data; 424 + 425 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 426 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 427 + 428 + /* 429 + * Although it doesn't check the value, provides valid sizes so that 430 + * cros_ec_query_all() allocates din and dout correctly. 431 + */ 432 + data = (struct ec_response_get_protocol_info *)mock->o_data; 433 + data->max_request_packet_size = 0xbe; 434 + data->max_response_packet_size = 0xef; 435 + } 436 + 437 + /* For cros_ec_get_proto_info() with passthru. */ 438 + { 439 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 440 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 441 + } 442 + 443 + cros_ec_proto_test_query_all_pretest(test); 444 + ret = cros_ec_query_all(ec_dev); 445 + KUNIT_EXPECT_EQ(test, ret, 0); 446 + 447 + /* For cros_ec_get_proto_info() without passthru. */ 448 + { 449 + mock = cros_kunit_ec_xfer_mock_next(); 450 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 451 + 452 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 453 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 454 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 455 + sizeof(struct ec_response_get_protocol_info)); 456 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 457 + } 458 + 459 + /* For cros_ec_get_proto_info() with passthru. */ 460 + { 461 + mock = cros_kunit_ec_xfer_mock_next(); 462 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 463 + 464 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 465 + KUNIT_EXPECT_EQ(test, mock->msg.command, 466 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 467 + EC_CMD_GET_PROTOCOL_INFO); 468 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 469 + sizeof(struct ec_response_get_protocol_info)); 470 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 471 + 472 + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); 473 + } 474 + } 475 + 476 + static void cros_ec_proto_test_query_all_legacy_normal_v3_return_error(struct kunit *test) 477 + { 478 + struct cros_ec_proto_test_priv *priv = test->priv; 479 + struct cros_ec_device *ec_dev = &priv->ec_dev; 480 + struct ec_xfer_mock *mock; 481 + int ret; 482 + 483 + /* For cros_ec_get_proto_info() without passthru. */ 484 + { 485 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 486 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 487 + } 488 + 489 + /* For cros_ec_get_proto_info_legacy(). */ 490 + { 491 + struct ec_response_hello *data; 492 + 493 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 494 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 495 + 496 + data = (struct ec_response_hello *)mock->o_data; 497 + data->out_data = 0xa1b2c3d4; 498 + } 499 + 500 + cros_ec_proto_test_query_all_pretest(test); 501 + ret = cros_ec_query_all(ec_dev); 502 + KUNIT_EXPECT_EQ(test, ret, 0); 503 + 504 + /* For cros_ec_get_proto_info() without passthru. */ 505 + { 506 + mock = cros_kunit_ec_xfer_mock_next(); 507 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 508 + 509 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 510 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 511 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 512 + sizeof(struct ec_response_get_protocol_info)); 513 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 514 + } 515 + 516 + /* For cros_ec_get_proto_info_legacy(). */ 517 + { 518 + struct ec_params_hello *data; 519 + 520 + mock = cros_kunit_ec_xfer_mock_next(); 521 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 522 + 523 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 524 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 525 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); 526 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 527 + 528 + data = (struct ec_params_hello *)mock->i_data; 529 + KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0); 530 + 531 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2); 532 + KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE); 533 + KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE); 534 + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); 535 + KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL); 536 + KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES); 537 + KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES); 538 + } 539 + } 540 + 541 + static void cros_ec_proto_test_query_all_legacy_normal_v3_return0(struct kunit *test) 542 + { 543 + struct cros_ec_proto_test_priv *priv = test->priv; 544 + struct cros_ec_device *ec_dev = &priv->ec_dev; 545 + struct ec_xfer_mock *mock; 546 + int ret; 547 + 548 + /* For cros_ec_get_proto_info() without passthru. */ 549 + { 550 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 551 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 552 + } 553 + 554 + /* For cros_ec_get_proto_info_legacy(). */ 555 + { 556 + struct ec_response_hello *data; 557 + 558 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 559 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 560 + 561 + data = (struct ec_response_hello *)mock->o_data; 562 + data->out_data = 0xa1b2c3d4; 563 + } 564 + 565 + cros_ec_proto_test_query_all_pretest(test); 566 + ret = cros_ec_query_all(ec_dev); 567 + KUNIT_EXPECT_EQ(test, ret, 0); 568 + 569 + /* For cros_ec_get_proto_info() without passthru. */ 570 + { 571 + mock = cros_kunit_ec_xfer_mock_next(); 572 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 573 + 574 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 575 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 576 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 577 + sizeof(struct ec_response_get_protocol_info)); 578 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 579 + } 580 + 581 + /* For cros_ec_get_proto_info_legacy(). */ 582 + { 583 + struct ec_params_hello *data; 584 + 585 + mock = cros_kunit_ec_xfer_mock_next(); 586 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 587 + 588 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 589 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 590 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); 591 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 592 + 593 + data = (struct ec_params_hello *)mock->i_data; 594 + KUNIT_EXPECT_EQ(test, data->in_data, 0xa0b0c0d0); 595 + 596 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, 2); 597 + KUNIT_EXPECT_EQ(test, ec_dev->max_request, EC_PROTO2_MAX_PARAM_SIZE); 598 + KUNIT_EXPECT_EQ(test, ec_dev->max_response, EC_PROTO2_MAX_PARAM_SIZE); 599 + KUNIT_EXPECT_EQ(test, ec_dev->max_passthru, 0); 600 + KUNIT_EXPECT_PTR_EQ(test, ec_dev->pkt_xfer, NULL); 601 + KUNIT_EXPECT_EQ(test, ec_dev->din_size, EC_PROTO2_MSG_BYTES); 602 + KUNIT_EXPECT_EQ(test, ec_dev->dout_size, EC_PROTO2_MSG_BYTES); 603 + } 604 + } 605 + 606 + static void cros_ec_proto_test_query_all_legacy_xfer_error(struct kunit *test) 607 + { 608 + struct cros_ec_proto_test_priv *priv = test->priv; 609 + struct cros_ec_device *ec_dev = &priv->ec_dev; 610 + struct ec_xfer_mock *mock; 611 + int ret; 612 + 613 + /* For cros_ec_get_proto_info() without passthru. */ 614 + { 615 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 616 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 617 + } 618 + 619 + /* For cros_ec_get_proto_info_legacy(). */ 620 + { 621 + mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); 622 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 623 + } 624 + 625 + cros_ec_proto_test_query_all_pretest(test); 626 + ret = cros_ec_query_all(ec_dev); 627 + KUNIT_EXPECT_EQ(test, ret, -EIO); 628 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); 629 + 630 + /* For cros_ec_get_proto_info() without passthru. */ 631 + { 632 + mock = cros_kunit_ec_xfer_mock_next(); 633 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 634 + 635 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 636 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 637 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 638 + sizeof(struct ec_response_get_protocol_info)); 639 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 640 + } 641 + 642 + /* For cros_ec_get_proto_info_legacy(). */ 643 + { 644 + mock = cros_kunit_ec_xfer_mock_next(); 645 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 646 + 647 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 648 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 649 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); 650 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); 651 + } 652 + } 653 + 654 + static void cros_ec_proto_test_query_all_legacy_return_error(struct kunit *test) 655 + { 656 + struct cros_ec_proto_test_priv *priv = test->priv; 657 + struct cros_ec_device *ec_dev = &priv->ec_dev; 658 + struct ec_xfer_mock *mock; 659 + int ret; 660 + 661 + /* For cros_ec_get_proto_info() without passthru. */ 662 + { 663 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 664 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 665 + } 666 + 667 + /* For cros_ec_get_proto_info_legacy(). */ 668 + { 669 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 670 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 671 + } 672 + 673 + cros_ec_proto_test_query_all_pretest(test); 674 + ret = cros_ec_query_all(ec_dev); 675 + KUNIT_EXPECT_EQ(test, ret, -EOPNOTSUPP); 676 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); 677 + 678 + /* For cros_ec_get_proto_info() without passthru. */ 679 + { 680 + mock = cros_kunit_ec_xfer_mock_next(); 681 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 682 + 683 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 684 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 685 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 686 + sizeof(struct ec_response_get_protocol_info)); 687 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 688 + } 689 + 690 + /* For cros_ec_get_proto_info_legacy(). */ 691 + { 692 + mock = cros_kunit_ec_xfer_mock_next(); 693 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 694 + 695 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 696 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 697 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); 698 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); 699 + } 700 + } 701 + 702 + static void cros_ec_proto_test_query_all_legacy_data_error(struct kunit *test) 703 + { 704 + struct cros_ec_proto_test_priv *priv = test->priv; 705 + struct cros_ec_device *ec_dev = &priv->ec_dev; 706 + struct ec_xfer_mock *mock; 707 + int ret; 708 + 709 + /* For cros_ec_get_proto_info() without passthru. */ 710 + { 711 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 712 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 713 + } 714 + 715 + /* For cros_ec_get_proto_info_legacy(). */ 716 + { 717 + struct ec_response_hello *data; 718 + 719 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 720 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 721 + 722 + data = (struct ec_response_hello *)mock->o_data; 723 + data->out_data = 0xbeefbfbf; 724 + } 725 + 726 + cros_ec_proto_test_query_all_pretest(test); 727 + ret = cros_ec_query_all(ec_dev); 728 + KUNIT_EXPECT_EQ(test, ret, -EBADMSG); 729 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); 730 + 731 + /* For cros_ec_get_proto_info() without passthru. */ 732 + { 733 + mock = cros_kunit_ec_xfer_mock_next(); 734 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 735 + 736 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 737 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 738 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 739 + sizeof(struct ec_response_get_protocol_info)); 740 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 741 + } 742 + 743 + /* For cros_ec_get_proto_info_legacy(). */ 744 + { 745 + mock = cros_kunit_ec_xfer_mock_next(); 746 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 747 + 748 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 749 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 750 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); 751 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); 752 + } 753 + } 754 + 755 + static void cros_ec_proto_test_query_all_legacy_return0(struct kunit *test) 756 + { 757 + struct cros_ec_proto_test_priv *priv = test->priv; 758 + struct cros_ec_device *ec_dev = &priv->ec_dev; 759 + struct ec_xfer_mock *mock; 760 + int ret; 761 + 762 + /* For cros_ec_get_proto_info() without passthru. */ 763 + { 764 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 765 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 766 + } 767 + 768 + /* For cros_ec_get_proto_info_legacy(). */ 769 + { 770 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 771 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 772 + } 773 + 774 + cros_ec_proto_test_query_all_pretest(test); 775 + ret = cros_ec_query_all(ec_dev); 776 + KUNIT_EXPECT_EQ(test, ret, -EPROTO); 777 + KUNIT_EXPECT_EQ(test, ec_dev->proto_version, EC_PROTO_VERSION_UNKNOWN); 778 + 779 + /* For cros_ec_get_proto_info() without passthru. */ 780 + { 781 + mock = cros_kunit_ec_xfer_mock_next(); 782 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 783 + 784 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 785 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 786 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 787 + sizeof(struct ec_response_get_protocol_info)); 788 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 789 + } 790 + 791 + /* For cros_ec_get_proto_info_legacy(). */ 792 + { 793 + mock = cros_kunit_ec_xfer_mock_next(); 794 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 795 + 796 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 797 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 798 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_hello)); 799 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_hello)); 800 + } 801 + } 802 + 803 + static void cros_ec_proto_test_query_all_no_mkbp(struct kunit *test) 804 + { 805 + struct cros_ec_proto_test_priv *priv = test->priv; 806 + struct cros_ec_device *ec_dev = &priv->ec_dev; 807 + struct ec_xfer_mock *mock; 808 + int ret; 809 + 810 + /* Set some garbage bytes. */ 811 + ec_dev->mkbp_event_supported = 0xbf; 812 + 813 + /* For cros_ec_get_proto_info() without passthru. */ 814 + { 815 + struct ec_response_get_protocol_info *data; 816 + 817 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 818 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 819 + 820 + /* 821 + * Although it doesn't check the value, provides valid sizes so that 822 + * cros_ec_query_all() allocates din and dout correctly. 823 + */ 824 + data = (struct ec_response_get_protocol_info *)mock->o_data; 825 + data->max_request_packet_size = 0xbe; 826 + data->max_response_packet_size = 0xef; 827 + } 828 + 829 + /* For cros_ec_get_proto_info() with passthru. */ 830 + { 831 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 832 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 833 + } 834 + 835 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 836 + { 837 + struct ec_response_get_cmd_versions *data; 838 + 839 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 840 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 841 + 842 + data = (struct ec_response_get_cmd_versions *)mock->o_data; 843 + data->version_mask = 0; 844 + } 845 + 846 + cros_ec_proto_test_query_all_pretest(test); 847 + ret = cros_ec_query_all(ec_dev); 848 + KUNIT_EXPECT_EQ(test, ret, 0); 849 + 850 + /* For cros_ec_get_proto_info() without passthru. */ 851 + { 852 + mock = cros_kunit_ec_xfer_mock_next(); 853 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 854 + 855 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 856 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 857 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 858 + sizeof(struct ec_response_get_protocol_info)); 859 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 860 + } 861 + 862 + /* For cros_ec_get_proto_info() with passthru. */ 863 + { 864 + mock = cros_kunit_ec_xfer_mock_next(); 865 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 866 + 867 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 868 + KUNIT_EXPECT_EQ(test, mock->msg.command, 869 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 870 + EC_CMD_GET_PROTOCOL_INFO); 871 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 872 + sizeof(struct ec_response_get_protocol_info)); 873 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 874 + } 875 + 876 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 877 + { 878 + struct ec_params_get_cmd_versions *data; 879 + 880 + mock = cros_kunit_ec_xfer_mock_next(); 881 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 882 + 883 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 884 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 885 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 886 + sizeof(struct ec_response_get_cmd_versions)); 887 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 888 + 889 + data = (struct ec_params_get_cmd_versions *)mock->i_data; 890 + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); 891 + 892 + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); 893 + } 894 + } 895 + 896 + static void cros_ec_proto_test_query_all_no_mkbp_return_error(struct kunit *test) 897 + { 898 + struct cros_ec_proto_test_priv *priv = test->priv; 899 + struct cros_ec_device *ec_dev = &priv->ec_dev; 900 + struct ec_xfer_mock *mock; 901 + int ret; 902 + 903 + /* Set some garbage bytes. */ 904 + ec_dev->mkbp_event_supported = 0xbf; 905 + 906 + /* For cros_ec_get_proto_info() without passthru. */ 907 + { 908 + struct ec_response_get_protocol_info *data; 909 + 910 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 911 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 912 + 913 + /* 914 + * Although it doesn't check the value, provides valid sizes so that 915 + * cros_ec_query_all() allocates din and dout correctly. 916 + */ 917 + data = (struct ec_response_get_protocol_info *)mock->o_data; 918 + data->max_request_packet_size = 0xbe; 919 + data->max_response_packet_size = 0xef; 920 + } 921 + 922 + /* For cros_ec_get_proto_info() with passthru. */ 923 + { 924 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 925 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 926 + } 927 + 928 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 929 + { 930 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 931 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 932 + } 933 + 934 + cros_ec_proto_test_query_all_pretest(test); 935 + ret = cros_ec_query_all(ec_dev); 936 + KUNIT_EXPECT_EQ(test, ret, 0); 937 + 938 + /* For cros_ec_get_proto_info() without passthru. */ 939 + { 940 + mock = cros_kunit_ec_xfer_mock_next(); 941 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 942 + 943 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 944 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 945 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 946 + sizeof(struct ec_response_get_protocol_info)); 947 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 948 + } 949 + 950 + /* For cros_ec_get_proto_info() with passthru. */ 951 + { 952 + mock = cros_kunit_ec_xfer_mock_next(); 953 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 954 + 955 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 956 + KUNIT_EXPECT_EQ(test, mock->msg.command, 957 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 958 + EC_CMD_GET_PROTOCOL_INFO); 959 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 960 + sizeof(struct ec_response_get_protocol_info)); 961 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 962 + } 963 + 964 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 965 + { 966 + struct ec_params_get_cmd_versions *data; 967 + 968 + mock = cros_kunit_ec_xfer_mock_next(); 969 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 970 + 971 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 972 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 973 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 974 + sizeof(struct ec_response_get_cmd_versions)); 975 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 976 + 977 + data = (struct ec_params_get_cmd_versions *)mock->i_data; 978 + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); 979 + 980 + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); 981 + } 982 + } 983 + 984 + static void cros_ec_proto_test_query_all_no_mkbp_return0(struct kunit *test) 985 + { 986 + struct cros_ec_proto_test_priv *priv = test->priv; 987 + struct cros_ec_device *ec_dev = &priv->ec_dev; 988 + struct ec_xfer_mock *mock; 989 + int ret; 990 + 991 + /* Set some garbage bytes. */ 992 + ec_dev->mkbp_event_supported = 0xbf; 993 + 994 + /* For cros_ec_get_proto_info() without passthru. */ 995 + { 996 + struct ec_response_get_protocol_info *data; 997 + 998 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 999 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1000 + 1001 + /* 1002 + * Although it doesn't check the value, provides valid sizes so that 1003 + * cros_ec_query_all() allocates din and dout correctly. 1004 + */ 1005 + data = (struct ec_response_get_protocol_info *)mock->o_data; 1006 + data->max_request_packet_size = 0xbe; 1007 + data->max_response_packet_size = 0xef; 1008 + } 1009 + 1010 + /* For cros_ec_get_proto_info() with passthru. */ 1011 + { 1012 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1013 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1014 + } 1015 + 1016 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1017 + { 1018 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1019 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1020 + } 1021 + 1022 + cros_ec_proto_test_query_all_pretest(test); 1023 + ret = cros_ec_query_all(ec_dev); 1024 + KUNIT_EXPECT_EQ(test, ret, 0); 1025 + 1026 + /* For cros_ec_get_proto_info() without passthru. */ 1027 + { 1028 + mock = cros_kunit_ec_xfer_mock_next(); 1029 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1030 + 1031 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1032 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 1033 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1034 + sizeof(struct ec_response_get_protocol_info)); 1035 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1036 + } 1037 + 1038 + /* For cros_ec_get_proto_info() with passthru. */ 1039 + { 1040 + mock = cros_kunit_ec_xfer_mock_next(); 1041 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1042 + 1043 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1044 + KUNIT_EXPECT_EQ(test, mock->msg.command, 1045 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 1046 + EC_CMD_GET_PROTOCOL_INFO); 1047 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1048 + sizeof(struct ec_response_get_protocol_info)); 1049 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1050 + } 1051 + 1052 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1053 + { 1054 + struct ec_params_get_cmd_versions *data; 1055 + 1056 + mock = cros_kunit_ec_xfer_mock_next(); 1057 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1058 + 1059 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1060 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1061 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1062 + sizeof(struct ec_response_get_cmd_versions)); 1063 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 1064 + 1065 + data = (struct ec_params_get_cmd_versions *)mock->i_data; 1066 + KUNIT_EXPECT_EQ(test, data->cmd, EC_CMD_GET_NEXT_EVENT); 1067 + 1068 + KUNIT_EXPECT_EQ(test, ec_dev->mkbp_event_supported, 0); 1069 + } 1070 + } 1071 + 1072 + static void cros_ec_proto_test_query_all_no_host_sleep(struct kunit *test) 1073 + { 1074 + struct cros_ec_proto_test_priv *priv = test->priv; 1075 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1076 + struct ec_xfer_mock *mock; 1077 + int ret; 1078 + 1079 + /* Set some garbage bytes. */ 1080 + ec_dev->host_sleep_v1 = true; 1081 + 1082 + /* For cros_ec_get_proto_info() without passthru. */ 1083 + { 1084 + struct ec_response_get_protocol_info *data; 1085 + 1086 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1087 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1088 + 1089 + /* 1090 + * Although it doesn't check the value, provides valid sizes so that 1091 + * cros_ec_query_all() allocates din and dout correctly. 1092 + */ 1093 + data = (struct ec_response_get_protocol_info *)mock->o_data; 1094 + data->max_request_packet_size = 0xbe; 1095 + data->max_response_packet_size = 0xef; 1096 + } 1097 + 1098 + /* For cros_ec_get_proto_info() with passthru. */ 1099 + { 1100 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1101 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1102 + } 1103 + 1104 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1105 + { 1106 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1107 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1108 + } 1109 + 1110 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1111 + { 1112 + struct ec_response_get_cmd_versions *data; 1113 + 1114 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1115 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1116 + 1117 + data = (struct ec_response_get_cmd_versions *)mock->o_data; 1118 + data->version_mask = 0; 1119 + } 1120 + 1121 + cros_ec_proto_test_query_all_pretest(test); 1122 + ret = cros_ec_query_all(ec_dev); 1123 + KUNIT_EXPECT_EQ(test, ret, 0); 1124 + 1125 + /* For cros_ec_get_proto_info() without passthru. */ 1126 + { 1127 + mock = cros_kunit_ec_xfer_mock_next(); 1128 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1129 + 1130 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1131 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 1132 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1133 + sizeof(struct ec_response_get_protocol_info)); 1134 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1135 + } 1136 + 1137 + /* For cros_ec_get_proto_info() with passthru. */ 1138 + { 1139 + mock = cros_kunit_ec_xfer_mock_next(); 1140 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1141 + 1142 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1143 + KUNIT_EXPECT_EQ(test, mock->msg.command, 1144 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 1145 + EC_CMD_GET_PROTOCOL_INFO); 1146 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1147 + sizeof(struct ec_response_get_protocol_info)); 1148 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1149 + } 1150 + 1151 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1152 + { 1153 + mock = cros_kunit_ec_xfer_mock_next(); 1154 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1155 + 1156 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1157 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1158 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1159 + sizeof(struct ec_response_get_cmd_versions)); 1160 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1161 + } 1162 + 1163 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1164 + { 1165 + mock = cros_kunit_ec_xfer_mock_next(); 1166 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1167 + 1168 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1169 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1170 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1171 + sizeof(struct ec_response_get_cmd_versions)); 1172 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1173 + 1174 + KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1); 1175 + } 1176 + } 1177 + 1178 + static void cros_ec_proto_test_query_all_no_host_sleep_return0(struct kunit *test) 1179 + { 1180 + struct cros_ec_proto_test_priv *priv = test->priv; 1181 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1182 + struct ec_xfer_mock *mock; 1183 + int ret; 1184 + 1185 + /* Set some garbage bytes. */ 1186 + ec_dev->host_sleep_v1 = true; 1187 + 1188 + /* For cros_ec_get_proto_info() without passthru. */ 1189 + { 1190 + struct ec_response_get_protocol_info *data; 1191 + 1192 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1193 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1194 + 1195 + /* 1196 + * Although it doesn't check the value, provides valid sizes so that 1197 + * cros_ec_query_all() allocates din and dout correctly. 1198 + */ 1199 + data = (struct ec_response_get_protocol_info *)mock->o_data; 1200 + data->max_request_packet_size = 0xbe; 1201 + data->max_response_packet_size = 0xef; 1202 + } 1203 + 1204 + /* For cros_ec_get_proto_info() with passthru. */ 1205 + { 1206 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1207 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1208 + } 1209 + 1210 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1211 + { 1212 + struct ec_response_get_cmd_versions *data; 1213 + 1214 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1215 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1216 + 1217 + /* In order to pollute next cros_ec_get_host_command_version_mask(). */ 1218 + data = (struct ec_response_get_cmd_versions *)mock->o_data; 1219 + data->version_mask = 0xbeef; 1220 + } 1221 + 1222 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1223 + { 1224 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1225 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1226 + } 1227 + 1228 + cros_ec_proto_test_query_all_pretest(test); 1229 + ret = cros_ec_query_all(ec_dev); 1230 + KUNIT_EXPECT_EQ(test, ret, 0); 1231 + 1232 + /* For cros_ec_get_proto_info() without passthru. */ 1233 + { 1234 + mock = cros_kunit_ec_xfer_mock_next(); 1235 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1236 + 1237 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1238 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 1239 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1240 + sizeof(struct ec_response_get_protocol_info)); 1241 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1242 + } 1243 + 1244 + /* For cros_ec_get_proto_info() with passthru. */ 1245 + { 1246 + mock = cros_kunit_ec_xfer_mock_next(); 1247 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1248 + 1249 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1250 + KUNIT_EXPECT_EQ(test, mock->msg.command, 1251 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 1252 + EC_CMD_GET_PROTOCOL_INFO); 1253 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1254 + sizeof(struct ec_response_get_protocol_info)); 1255 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1256 + } 1257 + 1258 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1259 + { 1260 + mock = cros_kunit_ec_xfer_mock_next(); 1261 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1262 + 1263 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1264 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1265 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1266 + sizeof(struct ec_response_get_cmd_versions)); 1267 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1268 + } 1269 + 1270 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1271 + { 1272 + mock = cros_kunit_ec_xfer_mock_next(); 1273 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1274 + 1275 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1276 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1277 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1278 + sizeof(struct ec_response_get_cmd_versions)); 1279 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1280 + 1281 + KUNIT_EXPECT_FALSE(test, ec_dev->host_sleep_v1); 1282 + } 1283 + } 1284 + 1285 + static void cros_ec_proto_test_query_all_default_wake_mask_return_error(struct kunit *test) 1286 + { 1287 + struct cros_ec_proto_test_priv *priv = test->priv; 1288 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1289 + struct ec_xfer_mock *mock; 1290 + int ret; 1291 + 1292 + /* Set some garbage bytes. */ 1293 + ec_dev->host_event_wake_mask = U32_MAX; 1294 + 1295 + /* For cros_ec_get_proto_info() without passthru. */ 1296 + { 1297 + struct ec_response_get_protocol_info *data; 1298 + 1299 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1300 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1301 + 1302 + /* 1303 + * Although it doesn't check the value, provides valid sizes so that 1304 + * cros_ec_query_all() allocates din and dout correctly. 1305 + */ 1306 + data = (struct ec_response_get_protocol_info *)mock->o_data; 1307 + data->max_request_packet_size = 0xbe; 1308 + data->max_response_packet_size = 0xef; 1309 + } 1310 + 1311 + /* For cros_ec_get_proto_info() with passthru. */ 1312 + { 1313 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1314 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1315 + } 1316 + 1317 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1318 + { 1319 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1320 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1321 + } 1322 + 1323 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1324 + { 1325 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1326 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1327 + } 1328 + 1329 + /* For cros_ec_get_host_event_wake_mask(). */ 1330 + { 1331 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1332 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1333 + } 1334 + 1335 + cros_ec_proto_test_query_all_pretest(test); 1336 + ret = cros_ec_query_all(ec_dev); 1337 + KUNIT_EXPECT_EQ(test, ret, 0); 1338 + 1339 + /* For cros_ec_get_proto_info() without passthru. */ 1340 + { 1341 + mock = cros_kunit_ec_xfer_mock_next(); 1342 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1343 + 1344 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1345 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 1346 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1347 + sizeof(struct ec_response_get_protocol_info)); 1348 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1349 + } 1350 + 1351 + /* For cros_ec_get_proto_info() with passthru. */ 1352 + { 1353 + mock = cros_kunit_ec_xfer_mock_next(); 1354 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1355 + 1356 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1357 + KUNIT_EXPECT_EQ(test, mock->msg.command, 1358 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 1359 + EC_CMD_GET_PROTOCOL_INFO); 1360 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1361 + sizeof(struct ec_response_get_protocol_info)); 1362 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1363 + } 1364 + 1365 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1366 + { 1367 + mock = cros_kunit_ec_xfer_mock_next(); 1368 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1369 + 1370 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1371 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1372 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1373 + sizeof(struct ec_response_get_cmd_versions)); 1374 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1375 + } 1376 + 1377 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1378 + { 1379 + mock = cros_kunit_ec_xfer_mock_next(); 1380 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1381 + 1382 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1383 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1384 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1385 + sizeof(struct ec_response_get_cmd_versions)); 1386 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1387 + } 1388 + 1389 + /* For cros_ec_get_host_event_wake_mask(). */ 1390 + { 1391 + u32 mask; 1392 + 1393 + mock = cros_kunit_ec_xfer_mock_next(); 1394 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1395 + 1396 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1397 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK); 1398 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask)); 1399 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1400 + 1401 + mask = ec_dev->host_event_wake_mask; 1402 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0); 1403 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0); 1404 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0); 1405 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0); 1406 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0); 1407 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0); 1408 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0); 1409 + } 1410 + } 1411 + 1412 + static void cros_ec_proto_test_query_all_default_wake_mask_return0(struct kunit *test) 1413 + { 1414 + struct cros_ec_proto_test_priv *priv = test->priv; 1415 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1416 + struct ec_xfer_mock *mock; 1417 + int ret; 1418 + 1419 + /* Set some garbage bytes. */ 1420 + ec_dev->host_event_wake_mask = U32_MAX; 1421 + 1422 + /* For cros_ec_get_proto_info() without passthru. */ 1423 + { 1424 + struct ec_response_get_protocol_info *data; 1425 + 1426 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1427 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1428 + 1429 + /* 1430 + * Although it doesn't check the value, provides valid sizes so that 1431 + * cros_ec_query_all() allocates din and dout correctly. 1432 + */ 1433 + data = (struct ec_response_get_protocol_info *)mock->o_data; 1434 + data->max_request_packet_size = 0xbe; 1435 + data->max_response_packet_size = 0xef; 1436 + } 1437 + 1438 + /* For cros_ec_get_proto_info() with passthru. */ 1439 + { 1440 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1441 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1442 + } 1443 + 1444 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1445 + { 1446 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1447 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1448 + } 1449 + 1450 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1451 + { 1452 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1453 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1454 + } 1455 + 1456 + /* For get_host_event_wake_mask(). */ 1457 + { 1458 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1459 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1460 + } 1461 + 1462 + cros_ec_proto_test_query_all_pretest(test); 1463 + ret = cros_ec_query_all(ec_dev); 1464 + KUNIT_EXPECT_EQ(test, ret, 0); 1465 + 1466 + /* For cros_ec_get_proto_info() without passthru. */ 1467 + { 1468 + mock = cros_kunit_ec_xfer_mock_next(); 1469 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1470 + 1471 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1472 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_PROTOCOL_INFO); 1473 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1474 + sizeof(struct ec_response_get_protocol_info)); 1475 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1476 + } 1477 + 1478 + /* For cros_ec_get_proto_info() with passthru. */ 1479 + { 1480 + mock = cros_kunit_ec_xfer_mock_next(); 1481 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1482 + 1483 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1484 + KUNIT_EXPECT_EQ(test, mock->msg.command, 1485 + EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) | 1486 + EC_CMD_GET_PROTOCOL_INFO); 1487 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1488 + sizeof(struct ec_response_get_protocol_info)); 1489 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1490 + } 1491 + 1492 + /* For cros_ec_get_host_command_version_mask() for MKBP. */ 1493 + { 1494 + mock = cros_kunit_ec_xfer_mock_next(); 1495 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1496 + 1497 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1498 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1499 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1500 + sizeof(struct ec_response_get_cmd_versions)); 1501 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1502 + } 1503 + 1504 + /* For cros_ec_get_host_command_version_mask() for host sleep v1. */ 1505 + { 1506 + mock = cros_kunit_ec_xfer_mock_next(); 1507 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1508 + 1509 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1510 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_CMD_VERSIONS); 1511 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1512 + sizeof(struct ec_response_get_cmd_versions)); 1513 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(struct ec_params_get_cmd_versions)); 1514 + } 1515 + 1516 + /* For get_host_event_wake_mask(). */ 1517 + { 1518 + u32 mask; 1519 + 1520 + mock = cros_kunit_ec_xfer_mock_next(); 1521 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1522 + 1523 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1524 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HOST_EVENT_GET_WAKE_MASK); 1525 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_host_event_mask)); 1526 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1527 + 1528 + mask = ec_dev->host_event_wake_mask; 1529 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED), 0); 1530 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 0); 1531 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW), 0); 1532 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL), 0); 1533 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY), 0); 1534 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU), 0); 1535 + KUNIT_EXPECT_EQ(test, mask & EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS), 0); 1536 + } 1537 + } 1538 + 1539 + static void cros_ec_proto_test_cmd_xfer_normal(struct kunit *test) 1540 + { 1541 + struct cros_ec_proto_test_priv *priv = test->priv; 1542 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1543 + struct ec_xfer_mock *mock; 1544 + int ret; 1545 + struct { 1546 + struct cros_ec_command msg; 1547 + u8 data[0x100]; 1548 + } __packed buf; 1549 + 1550 + ec_dev->max_request = 0xff; 1551 + ec_dev->max_response = 0xee; 1552 + ec_dev->max_passthru = 0xdd; 1553 + 1554 + buf.msg.version = 0; 1555 + buf.msg.command = EC_CMD_HELLO; 1556 + buf.msg.insize = 4; 1557 + buf.msg.outsize = 2; 1558 + buf.data[0] = 0x55; 1559 + buf.data[1] = 0xaa; 1560 + 1561 + { 1562 + u8 *data; 1563 + 1564 + mock = cros_kunit_ec_xfer_mock_add(test, 4); 1565 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1566 + 1567 + data = (u8 *)mock->o_data; 1568 + data[0] = 0xaa; 1569 + data[1] = 0x55; 1570 + data[2] = 0xcc; 1571 + data[3] = 0x33; 1572 + } 1573 + 1574 + ret = cros_ec_cmd_xfer(ec_dev, &buf.msg); 1575 + KUNIT_EXPECT_EQ(test, ret, 4); 1576 + 1577 + { 1578 + u8 *data; 1579 + 1580 + mock = cros_kunit_ec_xfer_mock_next(); 1581 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1582 + 1583 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1584 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 1585 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 4); 1586 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2); 1587 + 1588 + data = (u8 *)mock->i_data; 1589 + KUNIT_EXPECT_EQ(test, data[0], 0x55); 1590 + KUNIT_EXPECT_EQ(test, data[1], 0xaa); 1591 + 1592 + KUNIT_EXPECT_EQ(test, buf.data[0], 0xaa); 1593 + KUNIT_EXPECT_EQ(test, buf.data[1], 0x55); 1594 + KUNIT_EXPECT_EQ(test, buf.data[2], 0xcc); 1595 + KUNIT_EXPECT_EQ(test, buf.data[3], 0x33); 1596 + } 1597 + } 1598 + 1599 + static void cros_ec_proto_test_cmd_xfer_excess_msg_insize(struct kunit *test) 1600 + { 1601 + struct cros_ec_proto_test_priv *priv = test->priv; 1602 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1603 + struct ec_xfer_mock *mock; 1604 + int ret; 1605 + struct { 1606 + struct cros_ec_command msg; 1607 + u8 data[0x100]; 1608 + } __packed buf; 1609 + 1610 + ec_dev->max_request = 0xff; 1611 + ec_dev->max_response = 0xee; 1612 + ec_dev->max_passthru = 0xdd; 1613 + 1614 + buf.msg.version = 0; 1615 + buf.msg.command = EC_CMD_HELLO; 1616 + buf.msg.insize = 0xee + 1; 1617 + buf.msg.outsize = 2; 1618 + 1619 + { 1620 + mock = cros_kunit_ec_xfer_mock_add(test, 0xcc); 1621 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1622 + } 1623 + 1624 + ret = cros_ec_cmd_xfer(ec_dev, &buf.msg); 1625 + KUNIT_EXPECT_EQ(test, ret, 0xcc); 1626 + 1627 + { 1628 + mock = cros_kunit_ec_xfer_mock_next(); 1629 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1630 + 1631 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1632 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_HELLO); 1633 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 0xee); 1634 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 2); 1635 + } 1636 + } 1637 + 1638 + static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru(struct kunit *test) 1639 + { 1640 + struct cros_ec_proto_test_priv *priv = test->priv; 1641 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1642 + int ret; 1643 + struct { 1644 + struct cros_ec_command msg; 1645 + u8 data[0x100]; 1646 + } __packed buf; 1647 + 1648 + ec_dev->max_request = 0xff; 1649 + ec_dev->max_response = 0xee; 1650 + ec_dev->max_passthru = 0xdd; 1651 + 1652 + buf.msg.version = 0; 1653 + buf.msg.command = EC_CMD_HELLO; 1654 + buf.msg.insize = 4; 1655 + buf.msg.outsize = 0xff + 1; 1656 + 1657 + ret = cros_ec_cmd_xfer(ec_dev, &buf.msg); 1658 + KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE); 1659 + } 1660 + 1661 + static void cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru(struct kunit *test) 1662 + { 1663 + struct cros_ec_proto_test_priv *priv = test->priv; 1664 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1665 + int ret; 1666 + struct { 1667 + struct cros_ec_command msg; 1668 + u8 data[0x100]; 1669 + } __packed buf; 1670 + 1671 + ec_dev->max_request = 0xff; 1672 + ec_dev->max_response = 0xee; 1673 + ec_dev->max_passthru = 0xdd; 1674 + 1675 + buf.msg.version = 0; 1676 + buf.msg.command = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX) + EC_CMD_HELLO; 1677 + buf.msg.insize = 4; 1678 + buf.msg.outsize = 0xdd + 1; 1679 + 1680 + ret = cros_ec_cmd_xfer(ec_dev, &buf.msg); 1681 + KUNIT_EXPECT_EQ(test, ret, -EMSGSIZE); 1682 + } 1683 + 1684 + static void cros_ec_proto_test_cmd_xfer_protocol_v3_normal(struct kunit *test) 1685 + { 1686 + struct cros_ec_proto_test_priv *priv = test->priv; 1687 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1688 + int ret; 1689 + struct cros_ec_command msg; 1690 + 1691 + memset(&msg, 0, sizeof(msg)); 1692 + 1693 + ec_dev->proto_version = 3; 1694 + ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock; 1695 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1696 + 1697 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1698 + KUNIT_EXPECT_EQ(test, ret, 0); 1699 + 1700 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 0); 1701 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 1); 1702 + } 1703 + 1704 + static void cros_ec_proto_test_cmd_xfer_protocol_v3_no_op(struct kunit *test) 1705 + { 1706 + struct cros_ec_proto_test_priv *priv = test->priv; 1707 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1708 + int ret; 1709 + struct cros_ec_command msg; 1710 + 1711 + memset(&msg, 0, sizeof(msg)); 1712 + 1713 + ec_dev->proto_version = 3; 1714 + ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock; 1715 + ec_dev->pkt_xfer = NULL; 1716 + 1717 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1718 + KUNIT_EXPECT_EQ(test, ret, -EIO); 1719 + } 1720 + 1721 + static void cros_ec_proto_test_cmd_xfer_protocol_v2_normal(struct kunit *test) 1722 + { 1723 + struct cros_ec_proto_test_priv *priv = test->priv; 1724 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1725 + int ret; 1726 + struct cros_ec_command msg; 1727 + 1728 + memset(&msg, 0, sizeof(msg)); 1729 + 1730 + ec_dev->proto_version = 2; 1731 + ec_dev->cmd_xfer = cros_kunit_ec_cmd_xfer_mock; 1732 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1733 + 1734 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1735 + KUNIT_EXPECT_EQ(test, ret, 0); 1736 + 1737 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_cmd_xfer_mock_called, 1); 1738 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 0); 1739 + } 1740 + 1741 + static void cros_ec_proto_test_cmd_xfer_protocol_v2_no_op(struct kunit *test) 1742 + { 1743 + struct cros_ec_proto_test_priv *priv = test->priv; 1744 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1745 + int ret; 1746 + struct cros_ec_command msg; 1747 + 1748 + memset(&msg, 0, sizeof(msg)); 1749 + 1750 + ec_dev->proto_version = 2; 1751 + ec_dev->cmd_xfer = NULL; 1752 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1753 + 1754 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1755 + KUNIT_EXPECT_EQ(test, ret, -EIO); 1756 + } 1757 + 1758 + static void cros_ec_proto_test_cmd_xfer_in_progress_normal(struct kunit *test) 1759 + { 1760 + struct cros_ec_proto_test_priv *priv = test->priv; 1761 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1762 + struct ec_xfer_mock *mock; 1763 + int ret; 1764 + struct cros_ec_command msg; 1765 + 1766 + memset(&msg, 0, sizeof(msg)); 1767 + 1768 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1769 + 1770 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1771 + { 1772 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); 1773 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1774 + } 1775 + 1776 + /* For EC_CMD_GET_COMMS_STATUS. */ 1777 + { 1778 + struct ec_response_get_comms_status *data; 1779 + 1780 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1781 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1782 + 1783 + data = (struct ec_response_get_comms_status *)mock->o_data; 1784 + data->flags = 0; 1785 + } 1786 + 1787 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1788 + KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_comms_status)); 1789 + 1790 + KUNIT_EXPECT_EQ(test, msg.result, EC_RES_SUCCESS); 1791 + 1792 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1793 + { 1794 + mock = cros_kunit_ec_xfer_mock_next(); 1795 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1796 + } 1797 + 1798 + /* For EC_CMD_GET_COMMS_STATUS. */ 1799 + { 1800 + mock = cros_kunit_ec_xfer_mock_next(); 1801 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 1802 + 1803 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 1804 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_COMMS_STATUS); 1805 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 1806 + sizeof(struct ec_response_get_comms_status)); 1807 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 1808 + } 1809 + 1810 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2); 1811 + } 1812 + 1813 + static void cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain(struct kunit *test) 1814 + { 1815 + struct cros_ec_proto_test_priv *priv = test->priv; 1816 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1817 + struct ec_xfer_mock *mock; 1818 + int ret; 1819 + struct cros_ec_command msg; 1820 + 1821 + memset(&msg, 0, sizeof(msg)); 1822 + 1823 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1824 + 1825 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1826 + { 1827 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); 1828 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1829 + } 1830 + 1831 + /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ 1832 + cros_kunit_ec_xfer_mock_default_ret = -EAGAIN; 1833 + 1834 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1835 + KUNIT_EXPECT_EQ(test, ret, -EAGAIN); 1836 + 1837 + /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ 1838 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51); 1839 + } 1840 + 1841 + static void cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing(struct kunit *test) 1842 + { 1843 + struct cros_ec_proto_test_priv *priv = test->priv; 1844 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1845 + struct ec_xfer_mock *mock; 1846 + int ret; 1847 + struct cros_ec_command msg; 1848 + 1849 + memset(&msg, 0, sizeof(msg)); 1850 + 1851 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1852 + 1853 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1854 + { 1855 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); 1856 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1857 + } 1858 + 1859 + /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ 1860 + { 1861 + struct ec_response_get_comms_status *data; 1862 + int i; 1863 + 1864 + for (i = 0; i < 50; ++i) { 1865 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 1866 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1867 + 1868 + data = (struct ec_response_get_comms_status *)mock->o_data; 1869 + data->flags |= EC_COMMS_STATUS_PROCESSING; 1870 + } 1871 + } 1872 + 1873 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1874 + KUNIT_EXPECT_EQ(test, ret, -EAGAIN); 1875 + 1876 + /* For EC_CMD_GET_COMMS_STATUS EC_COMMAND_RETRIES times. */ 1877 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 51); 1878 + } 1879 + 1880 + static void cros_ec_proto_test_cmd_xfer_in_progress_xfer_error(struct kunit *test) 1881 + { 1882 + struct cros_ec_proto_test_priv *priv = test->priv; 1883 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1884 + struct ec_xfer_mock *mock; 1885 + int ret; 1886 + struct cros_ec_command msg; 1887 + 1888 + memset(&msg, 0, sizeof(msg)); 1889 + 1890 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1891 + { 1892 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); 1893 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1894 + } 1895 + 1896 + /* For EC_CMD_GET_COMMS_STATUS. */ 1897 + { 1898 + mock = cros_kunit_ec_xfer_mock_addx(test, -EIO, EC_RES_SUCCESS, 0); 1899 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1900 + } 1901 + 1902 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1903 + KUNIT_EXPECT_EQ(test, ret, -EIO); 1904 + } 1905 + 1906 + static void cros_ec_proto_test_cmd_xfer_in_progress_return_error(struct kunit *test) 1907 + { 1908 + struct cros_ec_proto_test_priv *priv = test->priv; 1909 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1910 + struct ec_xfer_mock *mock; 1911 + int ret; 1912 + struct cros_ec_command msg; 1913 + 1914 + memset(&msg, 0, sizeof(msg)); 1915 + 1916 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1917 + 1918 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1919 + { 1920 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); 1921 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1922 + } 1923 + 1924 + /* For EC_CMD_GET_COMMS_STATUS. */ 1925 + { 1926 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_INVALID_COMMAND, 0); 1927 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1928 + } 1929 + 1930 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1931 + KUNIT_EXPECT_EQ(test, ret, 0); 1932 + 1933 + KUNIT_EXPECT_EQ(test, msg.result, EC_RES_INVALID_COMMAND); 1934 + 1935 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2); 1936 + } 1937 + 1938 + static void cros_ec_proto_test_cmd_xfer_in_progress_return0(struct kunit *test) 1939 + { 1940 + struct cros_ec_proto_test_priv *priv = test->priv; 1941 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1942 + struct ec_xfer_mock *mock; 1943 + int ret; 1944 + struct cros_ec_command msg; 1945 + 1946 + memset(&msg, 0, sizeof(msg)); 1947 + 1948 + ec_dev->pkt_xfer = cros_kunit_ec_pkt_xfer_mock; 1949 + 1950 + /* For the first host command to return EC_RES_IN_PROGRESS. */ 1951 + { 1952 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, EC_RES_IN_PROGRESS, 0); 1953 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1954 + } 1955 + 1956 + /* For EC_CMD_GET_COMMS_STATUS. */ 1957 + { 1958 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1959 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1960 + } 1961 + 1962 + ret = cros_ec_cmd_xfer(ec_dev, &msg); 1963 + KUNIT_EXPECT_EQ(test, ret, -EPROTO); 1964 + 1965 + KUNIT_EXPECT_EQ(test, cros_kunit_ec_pkt_xfer_mock_called, 2); 1966 + } 1967 + 1968 + static void cros_ec_proto_test_cmd_xfer_status_normal(struct kunit *test) 1969 + { 1970 + struct cros_ec_proto_test_priv *priv = test->priv; 1971 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1972 + struct ec_xfer_mock *mock; 1973 + int ret; 1974 + struct cros_ec_command msg; 1975 + 1976 + memset(&msg, 0, sizeof(msg)); 1977 + 1978 + /* For cros_ec_cmd_xfer(). */ 1979 + { 1980 + mock = cros_kunit_ec_xfer_mock_add(test, 0); 1981 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 1982 + } 1983 + 1984 + ret = cros_ec_cmd_xfer_status(ec_dev, &msg); 1985 + KUNIT_EXPECT_EQ(test, ret, 0); 1986 + } 1987 + 1988 + static void cros_ec_proto_test_cmd_xfer_status_xfer_error(struct kunit *test) 1989 + { 1990 + struct cros_ec_proto_test_priv *priv = test->priv; 1991 + struct cros_ec_device *ec_dev = &priv->ec_dev; 1992 + struct ec_xfer_mock *mock; 1993 + int ret; 1994 + struct cros_ec_command msg; 1995 + 1996 + memset(&msg, 0, sizeof(msg)); 1997 + 1998 + /* For cros_ec_cmd_xfer(). */ 1999 + { 2000 + mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0); 2001 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2002 + } 2003 + 2004 + ret = cros_ec_cmd_xfer_status(ec_dev, &msg); 2005 + KUNIT_EXPECT_EQ(test, ret, -EPROTO); 2006 + } 2007 + 2008 + static void cros_ec_proto_test_cmd_xfer_status_return_error(struct kunit *test) 2009 + { 2010 + struct cros_ec_proto_test_priv *priv = test->priv; 2011 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2012 + struct ec_xfer_mock *mock; 2013 + int ret, i; 2014 + struct cros_ec_command msg; 2015 + static const int map[] = { 2016 + [EC_RES_SUCCESS] = 0, 2017 + [EC_RES_INVALID_COMMAND] = -EOPNOTSUPP, 2018 + [EC_RES_ERROR] = -EIO, 2019 + [EC_RES_INVALID_PARAM] = -EINVAL, 2020 + [EC_RES_ACCESS_DENIED] = -EACCES, 2021 + [EC_RES_INVALID_RESPONSE] = -EPROTO, 2022 + [EC_RES_INVALID_VERSION] = -ENOPROTOOPT, 2023 + [EC_RES_INVALID_CHECKSUM] = -EBADMSG, 2024 + /* 2025 + * EC_RES_IN_PROGRESS is special because cros_ec_send_command() has extra logic to 2026 + * handle it. Note that default cros_kunit_ec_xfer_mock_default_ret == 0 thus 2027 + * cros_ec_xfer_command() in cros_ec_wait_until_complete() returns 0. As a result, 2028 + * it returns -EPROTO without calling cros_ec_map_error(). 2029 + */ 2030 + [EC_RES_IN_PROGRESS] = -EPROTO, 2031 + [EC_RES_UNAVAILABLE] = -ENODATA, 2032 + [EC_RES_TIMEOUT] = -ETIMEDOUT, 2033 + [EC_RES_OVERFLOW] = -EOVERFLOW, 2034 + [EC_RES_INVALID_HEADER] = -EBADR, 2035 + [EC_RES_REQUEST_TRUNCATED] = -EBADR, 2036 + [EC_RES_RESPONSE_TOO_BIG] = -EFBIG, 2037 + [EC_RES_BUS_ERROR] = -EFAULT, 2038 + [EC_RES_BUSY] = -EBUSY, 2039 + [EC_RES_INVALID_HEADER_VERSION] = -EBADMSG, 2040 + [EC_RES_INVALID_HEADER_CRC] = -EBADMSG, 2041 + [EC_RES_INVALID_DATA_CRC] = -EBADMSG, 2042 + [EC_RES_DUP_UNAVAILABLE] = -ENODATA, 2043 + }; 2044 + 2045 + memset(&msg, 0, sizeof(msg)); 2046 + 2047 + for (i = 0; i < ARRAY_SIZE(map); ++i) { 2048 + mock = cros_kunit_ec_xfer_mock_addx(test, 0, i, 0); 2049 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2050 + 2051 + ret = cros_ec_cmd_xfer_status(ec_dev, &msg); 2052 + KUNIT_EXPECT_EQ(test, ret, map[i]); 2053 + } 2054 + } 2055 + 2056 + static void cros_ec_proto_test_get_next_event_no_mkbp_event(struct kunit *test) 2057 + { 2058 + struct cros_ec_proto_test_priv *priv = test->priv; 2059 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2060 + struct ec_xfer_mock *mock; 2061 + int ret; 2062 + bool wake_event, more_events; 2063 + 2064 + ec_dev->max_request = 0xff; 2065 + ec_dev->max_response = 0xee; 2066 + ec_dev->mkbp_event_supported = 0; 2067 + 2068 + /* Set some garbage bytes. */ 2069 + wake_event = false; 2070 + more_events = true; 2071 + 2072 + /* For get_keyboard_state_event(). */ 2073 + { 2074 + union ec_response_get_next_data_v1 *data; 2075 + 2076 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 2077 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2078 + 2079 + data = (union ec_response_get_next_data_v1 *)mock->o_data; 2080 + data->host_event = 0xbeef; 2081 + } 2082 + 2083 + ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events); 2084 + KUNIT_EXPECT_EQ(test, ret, sizeof(union ec_response_get_next_data_v1)); 2085 + 2086 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_KEY_MATRIX); 2087 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.host_event, 0xbeef); 2088 + 2089 + KUNIT_EXPECT_TRUE(test, wake_event); 2090 + KUNIT_EXPECT_FALSE(test, more_events); 2091 + 2092 + /* For get_keyboard_state_event(). */ 2093 + { 2094 + mock = cros_kunit_ec_xfer_mock_next(); 2095 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2096 + 2097 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 2098 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MKBP_STATE); 2099 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(union ec_response_get_next_data_v1)); 2100 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 2101 + } 2102 + } 2103 + 2104 + static void cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended(struct kunit *test) 2105 + { 2106 + struct cros_ec_proto_test_priv *priv = test->priv; 2107 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2108 + int ret; 2109 + 2110 + ec_dev->mkbp_event_supported = 1; 2111 + ec_dev->suspended = true; 2112 + 2113 + ret = cros_ec_get_next_event(ec_dev, NULL, NULL); 2114 + KUNIT_EXPECT_EQ(test, ret, -EHOSTDOWN); 2115 + } 2116 + 2117 + static void cros_ec_proto_test_get_next_event_mkbp_event_version0(struct kunit *test) 2118 + { 2119 + struct cros_ec_proto_test_priv *priv = test->priv; 2120 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2121 + struct ec_xfer_mock *mock; 2122 + int ret; 2123 + bool wake_event, more_events; 2124 + 2125 + ec_dev->max_request = 0xff; 2126 + ec_dev->max_response = 0xee; 2127 + ec_dev->mkbp_event_supported = 1; 2128 + 2129 + /* Set some garbage bytes. */ 2130 + wake_event = true; 2131 + more_events = false; 2132 + 2133 + /* For get_next_event_xfer(). */ 2134 + { 2135 + struct ec_response_get_next_event *data; 2136 + 2137 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 2138 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2139 + 2140 + data = (struct ec_response_get_next_event *)mock->o_data; 2141 + data->event_type = EC_MKBP_EVENT_SENSOR_FIFO | EC_MKBP_HAS_MORE_EVENTS; 2142 + data->data.sysrq = 0xbeef; 2143 + } 2144 + 2145 + ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events); 2146 + KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event)); 2147 + 2148 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_SENSOR_FIFO); 2149 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef); 2150 + 2151 + KUNIT_EXPECT_FALSE(test, wake_event); 2152 + KUNIT_EXPECT_TRUE(test, more_events); 2153 + 2154 + /* For get_next_event_xfer(). */ 2155 + { 2156 + mock = cros_kunit_ec_xfer_mock_next(); 2157 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2158 + 2159 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 2160 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); 2161 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_next_event)); 2162 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 2163 + } 2164 + } 2165 + 2166 + static void cros_ec_proto_test_get_next_event_mkbp_event_version2(struct kunit *test) 2167 + { 2168 + struct cros_ec_proto_test_priv *priv = test->priv; 2169 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2170 + struct ec_xfer_mock *mock; 2171 + int ret; 2172 + bool wake_event, more_events; 2173 + 2174 + ec_dev->max_request = 0xff; 2175 + ec_dev->max_response = 0xee; 2176 + ec_dev->mkbp_event_supported = 3; 2177 + 2178 + /* Set some garbage bytes. */ 2179 + wake_event = false; 2180 + more_events = true; 2181 + 2182 + /* For get_next_event_xfer(). */ 2183 + { 2184 + struct ec_response_get_next_event_v1 *data; 2185 + 2186 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 2187 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2188 + 2189 + data = (struct ec_response_get_next_event_v1 *)mock->o_data; 2190 + data->event_type = EC_MKBP_EVENT_FINGERPRINT; 2191 + data->data.sysrq = 0xbeef; 2192 + } 2193 + 2194 + ret = cros_ec_get_next_event(ec_dev, &wake_event, &more_events); 2195 + KUNIT_EXPECT_EQ(test, ret, sizeof(struct ec_response_get_next_event_v1)); 2196 + 2197 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_FINGERPRINT); 2198 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.data.sysrq, 0xbeef); 2199 + 2200 + KUNIT_EXPECT_TRUE(test, wake_event); 2201 + KUNIT_EXPECT_FALSE(test, more_events); 2202 + 2203 + /* For get_next_event_xfer(). */ 2204 + { 2205 + mock = cros_kunit_ec_xfer_mock_next(); 2206 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2207 + 2208 + KUNIT_EXPECT_EQ(test, mock->msg.version, 2); 2209 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); 2210 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 2211 + sizeof(struct ec_response_get_next_event_v1)); 2212 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 2213 + } 2214 + } 2215 + 2216 + static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc(struct kunit *test) 2217 + { 2218 + struct cros_ec_proto_test_priv *priv = test->priv; 2219 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2220 + struct ec_xfer_mock *mock; 2221 + int ret; 2222 + bool wake_event; 2223 + struct ec_response_get_next_event_v1 *data; 2224 + 2225 + ec_dev->max_request = 0xff; 2226 + ec_dev->max_response = 0xee; 2227 + ec_dev->mkbp_event_supported = 3; 2228 + ec_dev->host_event_wake_mask = U32_MAX; 2229 + 2230 + /* Set some garbage bytes. */ 2231 + wake_event = true; 2232 + 2233 + /* For get_next_event_xfer(). */ 2234 + { 2235 + mock = cros_kunit_ec_xfer_mock_add(test, 2236 + sizeof(data->event_type) + 2237 + sizeof(data->data.host_event)); 2238 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2239 + 2240 + data = (struct ec_response_get_next_event_v1 *)mock->o_data; 2241 + data->event_type = EC_MKBP_EVENT_HOST_EVENT; 2242 + put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), &data->data.host_event); 2243 + } 2244 + 2245 + ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL); 2246 + KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event)); 2247 + 2248 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT); 2249 + 2250 + KUNIT_EXPECT_FALSE(test, wake_event); 2251 + 2252 + /* For get_next_event_xfer(). */ 2253 + { 2254 + mock = cros_kunit_ec_xfer_mock_next(); 2255 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2256 + 2257 + KUNIT_EXPECT_EQ(test, mock->msg.version, 2); 2258 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); 2259 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 2260 + sizeof(struct ec_response_get_next_event_v1)); 2261 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 2262 + } 2263 + } 2264 + 2265 + static void cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked(struct kunit *test) 2266 + { 2267 + struct cros_ec_proto_test_priv *priv = test->priv; 2268 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2269 + struct ec_xfer_mock *mock; 2270 + int ret; 2271 + bool wake_event; 2272 + struct ec_response_get_next_event_v1 *data; 2273 + 2274 + ec_dev->max_request = 0xff; 2275 + ec_dev->max_response = 0xee; 2276 + ec_dev->mkbp_event_supported = 3; 2277 + ec_dev->host_event_wake_mask = U32_MAX & ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED); 2278 + 2279 + /* Set some garbage bytes. */ 2280 + wake_event = true; 2281 + 2282 + /* For get_next_event_xfer(). */ 2283 + { 2284 + mock = cros_kunit_ec_xfer_mock_add(test, 2285 + sizeof(data->event_type) + 2286 + sizeof(data->data.host_event)); 2287 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2288 + 2289 + data = (struct ec_response_get_next_event_v1 *)mock->o_data; 2290 + data->event_type = EC_MKBP_EVENT_HOST_EVENT; 2291 + put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED), 2292 + &data->data.host_event); 2293 + } 2294 + 2295 + ret = cros_ec_get_next_event(ec_dev, &wake_event, NULL); 2296 + KUNIT_EXPECT_EQ(test, ret, sizeof(data->event_type) + sizeof(data->data.host_event)); 2297 + 2298 + KUNIT_EXPECT_EQ(test, ec_dev->event_data.event_type, EC_MKBP_EVENT_HOST_EVENT); 2299 + 2300 + KUNIT_EXPECT_FALSE(test, wake_event); 2301 + 2302 + /* For get_next_event_xfer(). */ 2303 + { 2304 + mock = cros_kunit_ec_xfer_mock_next(); 2305 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2306 + 2307 + KUNIT_EXPECT_EQ(test, mock->msg.version, 2); 2308 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_NEXT_EVENT); 2309 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 2310 + sizeof(struct ec_response_get_next_event_v1)); 2311 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 2312 + } 2313 + } 2314 + 2315 + static void cros_ec_proto_test_get_host_event_no_mkbp_event(struct kunit *test) 2316 + { 2317 + struct cros_ec_proto_test_priv *priv = test->priv; 2318 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2319 + int ret; 2320 + 2321 + ec_dev->mkbp_event_supported = 0; 2322 + 2323 + ret = cros_ec_get_host_event(ec_dev); 2324 + KUNIT_EXPECT_EQ(test, ret, 0); 2325 + } 2326 + 2327 + static void cros_ec_proto_test_get_host_event_not_host_event(struct kunit *test) 2328 + { 2329 + struct cros_ec_proto_test_priv *priv = test->priv; 2330 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2331 + int ret; 2332 + 2333 + ec_dev->mkbp_event_supported = 1; 2334 + ec_dev->event_data.event_type = EC_MKBP_EVENT_FINGERPRINT; 2335 + 2336 + ret = cros_ec_get_host_event(ec_dev); 2337 + KUNIT_EXPECT_EQ(test, ret, 0); 2338 + } 2339 + 2340 + static void cros_ec_proto_test_get_host_event_wrong_event_size(struct kunit *test) 2341 + { 2342 + struct cros_ec_proto_test_priv *priv = test->priv; 2343 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2344 + int ret; 2345 + 2346 + ec_dev->mkbp_event_supported = 1; 2347 + ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT; 2348 + ec_dev->event_size = 0xff; 2349 + 2350 + ret = cros_ec_get_host_event(ec_dev); 2351 + KUNIT_EXPECT_EQ(test, ret, 0); 2352 + } 2353 + 2354 + static void cros_ec_proto_test_get_host_event_normal(struct kunit *test) 2355 + { 2356 + struct cros_ec_proto_test_priv *priv = test->priv; 2357 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2358 + int ret; 2359 + 2360 + ec_dev->mkbp_event_supported = 1; 2361 + ec_dev->event_data.event_type = EC_MKBP_EVENT_HOST_EVENT; 2362 + ec_dev->event_size = sizeof(ec_dev->event_data.data.host_event); 2363 + put_unaligned_le32(EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC), 2364 + &ec_dev->event_data.data.host_event); 2365 + 2366 + ret = cros_ec_get_host_event(ec_dev); 2367 + KUNIT_EXPECT_EQ(test, ret, EC_HOST_EVENT_MASK(EC_HOST_EVENT_RTC)); 2368 + } 2369 + 2370 + static void cros_ec_proto_test_check_features_cached(struct kunit *test) 2371 + { 2372 + int ret, i; 2373 + struct cros_ec_dev ec; 2374 + 2375 + ec.features.flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT); 2376 + ec.features.flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP); 2377 + 2378 + for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) { 2379 + ret = cros_ec_check_features(&ec, i); 2380 + switch (i) { 2381 + case EC_FEATURE_FINGERPRINT: 2382 + case EC_FEATURE_SCP: 2383 + KUNIT_EXPECT_TRUE(test, ret); 2384 + break; 2385 + default: 2386 + KUNIT_EXPECT_FALSE(test, ret); 2387 + break; 2388 + } 2389 + } 2390 + } 2391 + 2392 + static void cros_ec_proto_test_check_features_not_cached(struct kunit *test) 2393 + { 2394 + struct cros_ec_proto_test_priv *priv = test->priv; 2395 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2396 + struct ec_xfer_mock *mock; 2397 + int ret, i; 2398 + struct cros_ec_dev ec; 2399 + 2400 + ec_dev->max_request = 0xff; 2401 + ec_dev->max_response = 0xee; 2402 + ec.ec_dev = ec_dev; 2403 + ec.dev = ec_dev->dev; 2404 + ec.cmd_offset = 0; 2405 + ec.features.flags[0] = -1; 2406 + ec.features.flags[1] = -1; 2407 + 2408 + /* For EC_CMD_GET_FEATURES. */ 2409 + { 2410 + struct ec_response_get_features *data; 2411 + 2412 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 2413 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2414 + 2415 + data = (struct ec_response_get_features *)mock->o_data; 2416 + data->flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FINGERPRINT); 2417 + data->flags[1] = EC_FEATURE_MASK_0(EC_FEATURE_SCP); 2418 + } 2419 + 2420 + for (i = 0; i < EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK; ++i) { 2421 + ret = cros_ec_check_features(&ec, i); 2422 + switch (i) { 2423 + case EC_FEATURE_FINGERPRINT: 2424 + case EC_FEATURE_SCP: 2425 + KUNIT_EXPECT_TRUE(test, ret); 2426 + break; 2427 + default: 2428 + KUNIT_EXPECT_FALSE(test, ret); 2429 + break; 2430 + } 2431 + } 2432 + 2433 + /* For EC_CMD_GET_FEATURES. */ 2434 + { 2435 + mock = cros_kunit_ec_xfer_mock_next(); 2436 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2437 + 2438 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0); 2439 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_GET_FEATURES); 2440 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_get_features)); 2441 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, 0); 2442 + } 2443 + } 2444 + 2445 + static void cros_ec_proto_test_get_sensor_count_normal(struct kunit *test) 2446 + { 2447 + struct cros_ec_proto_test_priv *priv = test->priv; 2448 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2449 + struct ec_xfer_mock *mock; 2450 + int ret; 2451 + struct cros_ec_dev ec; 2452 + 2453 + ec_dev->max_request = 0xff; 2454 + ec_dev->max_response = 0xee; 2455 + ec.ec_dev = ec_dev; 2456 + ec.dev = ec_dev->dev; 2457 + ec.cmd_offset = 0; 2458 + 2459 + /* For EC_CMD_MOTION_SENSE_CMD. */ 2460 + { 2461 + struct ec_response_motion_sense *data; 2462 + 2463 + mock = cros_kunit_ec_xfer_mock_add(test, sizeof(*data)); 2464 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2465 + 2466 + data = (struct ec_response_motion_sense *)mock->o_data; 2467 + data->dump.sensor_count = 0xbf; 2468 + } 2469 + 2470 + ret = cros_ec_get_sensor_count(&ec); 2471 + KUNIT_EXPECT_EQ(test, ret, 0xbf); 2472 + 2473 + /* For EC_CMD_MOTION_SENSE_CMD. */ 2474 + { 2475 + struct ec_params_motion_sense *data; 2476 + 2477 + mock = cros_kunit_ec_xfer_mock_next(); 2478 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2479 + 2480 + KUNIT_EXPECT_EQ(test, mock->msg.version, 1); 2481 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD); 2482 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense)); 2483 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 2484 + 2485 + data = (struct ec_params_motion_sense *)mock->i_data; 2486 + KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP); 2487 + } 2488 + } 2489 + 2490 + static void cros_ec_proto_test_get_sensor_count_xfer_error(struct kunit *test) 2491 + { 2492 + struct cros_ec_proto_test_priv *priv = test->priv; 2493 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2494 + struct ec_xfer_mock *mock; 2495 + int ret; 2496 + struct cros_ec_dev ec; 2497 + 2498 + ec_dev->max_request = 0xff; 2499 + ec_dev->max_response = 0xee; 2500 + ec.ec_dev = ec_dev; 2501 + ec.dev = ec_dev->dev; 2502 + ec.cmd_offset = 0; 2503 + 2504 + /* For EC_CMD_MOTION_SENSE_CMD. */ 2505 + { 2506 + mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0); 2507 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2508 + } 2509 + 2510 + ret = cros_ec_get_sensor_count(&ec); 2511 + KUNIT_EXPECT_EQ(test, ret, -EPROTO); 2512 + 2513 + /* For EC_CMD_MOTION_SENSE_CMD. */ 2514 + { 2515 + struct ec_params_motion_sense *data; 2516 + 2517 + mock = cros_kunit_ec_xfer_mock_next(); 2518 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2519 + 2520 + KUNIT_EXPECT_EQ(test, mock->msg.version, 1); 2521 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD); 2522 + KUNIT_EXPECT_EQ(test, mock->msg.insize, sizeof(struct ec_response_motion_sense)); 2523 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 2524 + 2525 + data = (struct ec_params_motion_sense *)mock->i_data; 2526 + KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP); 2527 + } 2528 + } 2529 + 2530 + static void cros_ec_proto_test_get_sensor_count_legacy(struct kunit *test) 2531 + { 2532 + struct cros_ec_proto_test_priv *priv = test->priv; 2533 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2534 + struct ec_xfer_mock *mock; 2535 + int ret, i; 2536 + struct cros_ec_dev ec; 2537 + struct { 2538 + u8 readmem_data; 2539 + int expected_result; 2540 + } test_data[] = { 2541 + { 0, 0 }, 2542 + { EC_MEMMAP_ACC_STATUS_PRESENCE_BIT, 2 }, 2543 + }; 2544 + 2545 + ec_dev->max_request = 0xff; 2546 + ec_dev->max_response = 0xee; 2547 + ec_dev->cmd_readmem = cros_kunit_readmem_mock; 2548 + ec.ec_dev = ec_dev; 2549 + ec.dev = ec_dev->dev; 2550 + ec.cmd_offset = 0; 2551 + 2552 + for (i = 0; i < ARRAY_SIZE(test_data); ++i) { 2553 + /* For EC_CMD_MOTION_SENSE_CMD. */ 2554 + { 2555 + mock = cros_kunit_ec_xfer_mock_addx(test, -EPROTO, EC_RES_SUCCESS, 0); 2556 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2557 + } 2558 + 2559 + /* For readmem. */ 2560 + { 2561 + cros_kunit_readmem_mock_data = kunit_kzalloc(test, 1, GFP_KERNEL); 2562 + KUNIT_ASSERT_PTR_NE(test, cros_kunit_readmem_mock_data, NULL); 2563 + cros_kunit_readmem_mock_data[0] = test_data[i].readmem_data; 2564 + 2565 + cros_kunit_ec_xfer_mock_default_ret = 1; 2566 + } 2567 + 2568 + ret = cros_ec_get_sensor_count(&ec); 2569 + KUNIT_EXPECT_EQ(test, ret, test_data[i].expected_result); 2570 + 2571 + /* For EC_CMD_MOTION_SENSE_CMD. */ 2572 + { 2573 + struct ec_params_motion_sense *data; 2574 + 2575 + mock = cros_kunit_ec_xfer_mock_next(); 2576 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2577 + 2578 + KUNIT_EXPECT_EQ(test, mock->msg.version, 1); 2579 + KUNIT_EXPECT_EQ(test, mock->msg.command, EC_CMD_MOTION_SENSE_CMD); 2580 + KUNIT_EXPECT_EQ(test, mock->msg.insize, 2581 + sizeof(struct ec_response_motion_sense)); 2582 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, sizeof(*data)); 2583 + 2584 + data = (struct ec_params_motion_sense *)mock->i_data; 2585 + KUNIT_EXPECT_EQ(test, data->cmd, MOTIONSENSE_CMD_DUMP); 2586 + } 2587 + 2588 + /* For readmem. */ 2589 + { 2590 + KUNIT_EXPECT_EQ(test, cros_kunit_readmem_mock_offset, EC_MEMMAP_ACC_STATUS); 2591 + } 2592 + } 2593 + } 2594 + 2595 + static void cros_ec_proto_test_ec_cmd(struct kunit *test) 2596 + { 2597 + struct cros_ec_proto_test_priv *priv = test->priv; 2598 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2599 + struct ec_xfer_mock *mock; 2600 + int ret; 2601 + u8 out[3], in[2]; 2602 + 2603 + ec_dev->max_request = 0xff; 2604 + ec_dev->max_response = 0xee; 2605 + 2606 + out[0] = 0xdd; 2607 + out[1] = 0xcc; 2608 + out[2] = 0xbb; 2609 + 2610 + { 2611 + u8 *data; 2612 + 2613 + mock = cros_kunit_ec_xfer_mock_add(test, 2); 2614 + KUNIT_ASSERT_PTR_NE(test, mock, NULL); 2615 + 2616 + data = (u8 *)mock->o_data; 2617 + data[0] = 0xaa; 2618 + data[1] = 0x99; 2619 + } 2620 + 2621 + ret = cros_ec_cmd(ec_dev, 0x88, 0x77, out, ARRAY_SIZE(out), in, ARRAY_SIZE(in)); 2622 + KUNIT_EXPECT_EQ(test, ret, 2); 2623 + 2624 + { 2625 + u8 *data; 2626 + 2627 + mock = cros_kunit_ec_xfer_mock_next(); 2628 + KUNIT_EXPECT_PTR_NE(test, mock, NULL); 2629 + 2630 + KUNIT_EXPECT_EQ(test, mock->msg.version, 0x88); 2631 + KUNIT_EXPECT_EQ(test, mock->msg.command, 0x77); 2632 + KUNIT_EXPECT_EQ(test, mock->msg.insize, ARRAY_SIZE(in)); 2633 + KUNIT_EXPECT_EQ(test, mock->msg.outsize, ARRAY_SIZE(out)); 2634 + 2635 + data = (u8 *)mock->i_data; 2636 + KUNIT_EXPECT_EQ(test, data[0], 0xdd); 2637 + KUNIT_EXPECT_EQ(test, data[1], 0xcc); 2638 + KUNIT_EXPECT_EQ(test, data[2], 0xbb); 2639 + } 2640 + } 2641 + 2642 + static void cros_ec_proto_test_release(struct device *dev) 2643 + { 2644 + } 2645 + 2646 + static int cros_ec_proto_test_init(struct kunit *test) 2647 + { 2648 + struct cros_ec_proto_test_priv *priv; 2649 + struct cros_ec_device *ec_dev; 2650 + 2651 + priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); 2652 + if (!priv) 2653 + return -ENOMEM; 2654 + test->priv = priv; 2655 + 2656 + ec_dev = &priv->ec_dev; 2657 + ec_dev->dout = (u8 *)priv->dout; 2658 + ec_dev->dout_size = ARRAY_SIZE(priv->dout); 2659 + ec_dev->din = (u8 *)priv->din; 2660 + ec_dev->din_size = ARRAY_SIZE(priv->din); 2661 + ec_dev->proto_version = EC_HOST_REQUEST_VERSION; 2662 + ec_dev->dev = kunit_kzalloc(test, sizeof(*ec_dev->dev), GFP_KERNEL); 2663 + if (!ec_dev->dev) 2664 + return -ENOMEM; 2665 + device_initialize(ec_dev->dev); 2666 + dev_set_name(ec_dev->dev, "cros_ec_proto_test"); 2667 + ec_dev->dev->release = cros_ec_proto_test_release; 2668 + ec_dev->cmd_xfer = cros_kunit_ec_xfer_mock; 2669 + ec_dev->pkt_xfer = cros_kunit_ec_xfer_mock; 2670 + 2671 + priv->msg = (struct cros_ec_command *)priv->_msg; 2672 + 2673 + cros_kunit_mock_reset(); 2674 + 2675 + return 0; 2676 + } 2677 + 2678 + static void cros_ec_proto_test_exit(struct kunit *test) 2679 + { 2680 + struct cros_ec_proto_test_priv *priv = test->priv; 2681 + struct cros_ec_device *ec_dev = &priv->ec_dev; 2682 + 2683 + put_device(ec_dev->dev); 2684 + } 2685 + 2686 + static struct kunit_case cros_ec_proto_test_cases[] = { 2687 + KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_normal), 2688 + KUNIT_CASE(cros_ec_proto_test_prepare_tx_legacy_bad_msg_outsize), 2689 + KUNIT_CASE(cros_ec_proto_test_prepare_tx_normal), 2690 + KUNIT_CASE(cros_ec_proto_test_prepare_tx_bad_msg_outsize), 2691 + KUNIT_CASE(cros_ec_proto_test_check_result), 2692 + KUNIT_CASE(cros_ec_proto_test_query_all_normal), 2693 + KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return_error), 2694 + KUNIT_CASE(cros_ec_proto_test_query_all_no_pd_return0), 2695 + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return_error), 2696 + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_normal_v3_return0), 2697 + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_xfer_error), 2698 + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return_error), 2699 + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_data_error), 2700 + KUNIT_CASE(cros_ec_proto_test_query_all_legacy_return0), 2701 + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp), 2702 + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return_error), 2703 + KUNIT_CASE(cros_ec_proto_test_query_all_no_mkbp_return0), 2704 + KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep), 2705 + KUNIT_CASE(cros_ec_proto_test_query_all_no_host_sleep_return0), 2706 + KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return_error), 2707 + KUNIT_CASE(cros_ec_proto_test_query_all_default_wake_mask_return0), 2708 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_normal), 2709 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_insize), 2710 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_without_passthru), 2711 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_excess_msg_outsize_with_passthru), 2712 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_normal), 2713 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v3_no_op), 2714 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_normal), 2715 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_protocol_v2_no_op), 2716 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_normal), 2717 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_eagain), 2718 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_retries_status_processing), 2719 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_xfer_error), 2720 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return_error), 2721 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_in_progress_return0), 2722 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_normal), 2723 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_xfer_error), 2724 + KUNIT_CASE(cros_ec_proto_test_cmd_xfer_status_return_error), 2725 + KUNIT_CASE(cros_ec_proto_test_get_next_event_no_mkbp_event), 2726 + KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_ec_suspended), 2727 + KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version0), 2728 + KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_version2), 2729 + KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_rtc), 2730 + KUNIT_CASE(cros_ec_proto_test_get_next_event_mkbp_event_host_event_masked), 2731 + KUNIT_CASE(cros_ec_proto_test_get_host_event_no_mkbp_event), 2732 + KUNIT_CASE(cros_ec_proto_test_get_host_event_not_host_event), 2733 + KUNIT_CASE(cros_ec_proto_test_get_host_event_wrong_event_size), 2734 + KUNIT_CASE(cros_ec_proto_test_get_host_event_normal), 2735 + KUNIT_CASE(cros_ec_proto_test_check_features_cached), 2736 + KUNIT_CASE(cros_ec_proto_test_check_features_not_cached), 2737 + KUNIT_CASE(cros_ec_proto_test_get_sensor_count_normal), 2738 + KUNIT_CASE(cros_ec_proto_test_get_sensor_count_xfer_error), 2739 + KUNIT_CASE(cros_ec_proto_test_get_sensor_count_legacy), 2740 + KUNIT_CASE(cros_ec_proto_test_ec_cmd), 2741 + {} 2742 + }; 2743 + 2744 + static struct kunit_suite cros_ec_proto_test_suite = { 2745 + .name = "cros_ec_proto_test", 2746 + .init = cros_ec_proto_test_init, 2747 + .exit = cros_ec_proto_test_exit, 2748 + .test_cases = cros_ec_proto_test_cases, 2749 + }; 2750 + 2751 + kunit_test_suite(cros_ec_proto_test_suite); 2752 + 2753 + MODULE_LICENSE("GPL");
+4 -4
drivers/platform/chrome/cros_ec_trace.h
··· 30 30 ), 31 31 TP_fast_assign( 32 32 __entry->version = cmd->version; 33 - __entry->offset = cmd->command / EC_CMD_PASSTHRU_OFFSET(1); 34 - __entry->command = cmd->command % EC_CMD_PASSTHRU_OFFSET(1); 33 + __entry->offset = cmd->command / EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX); 34 + __entry->command = cmd->command % EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX); 35 35 __entry->outsize = cmd->outsize; 36 36 __entry->insize = cmd->insize; 37 37 ), ··· 55 55 ), 56 56 TP_fast_assign( 57 57 __entry->version = cmd->version; 58 - __entry->offset = cmd->command / EC_CMD_PASSTHRU_OFFSET(1); 59 - __entry->command = cmd->command % EC_CMD_PASSTHRU_OFFSET(1); 58 + __entry->offset = cmd->command / EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX); 59 + __entry->command = cmd->command % EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX); 60 60 __entry->outsize = cmd->outsize; 61 61 __entry->insize = cmd->insize; 62 62 __entry->result = cmd->result;
+60 -33
drivers/platform/chrome/cros_ec_typec.c
··· 25 25 26 26 #define DRV_NAME "cros-ec-typec" 27 27 28 + #define DP_PORT_VDO (BIT(DP_PIN_ASSIGN_C) | BIT(DP_PIN_ASSIGN_D) | DP_CAP_DFP_D) 29 + 28 30 /* Supported alt modes. */ 29 31 enum { 30 32 CROS_EC_ALTMODE_DP = 0, ··· 62 60 uint8_t mux_flags; 63 61 uint8_t role; 64 62 65 - /* Port alt modes. */ 66 - struct typec_altmode p_altmode[CROS_EC_ALTMODE_MAX]; 63 + struct typec_altmode *port_altmode[CROS_EC_ALTMODE_MAX]; 67 64 68 65 /* Flag indicating that PD partner discovery data parsing is completed. */ 69 66 bool sop_disc_done; ··· 255 254 port->sop_prime_disc_done = false; 256 255 } 257 256 257 + static void cros_typec_unregister_port_altmodes(struct cros_typec_port *port) 258 + { 259 + int i; 260 + 261 + for (i = 0; i < CROS_EC_ALTMODE_MAX; i++) 262 + typec_unregister_altmode(port->port_altmode[i]); 263 + } 264 + 258 265 static void cros_unregister_ports(struct cros_typec_data *typec) 259 266 { 260 267 int i; ··· 277 268 usb_role_switch_put(typec->ports[i]->role_sw); 278 269 typec_switch_put(typec->ports[i]->ori_sw); 279 270 typec_mux_put(typec->ports[i]->mux); 271 + cros_typec_unregister_port_altmodes(typec->ports[i]); 280 272 typec_unregister_port(typec->ports[i]->port); 281 273 } 282 274 } 283 275 284 276 /* 285 - * Fake the alt mode structs until we actually start registering Type C port 286 - * and partner alt modes. 277 + * Register port alt modes with known values till we start retrieving 278 + * port capabilities from the EC. 287 279 */ 288 - static void cros_typec_register_port_altmodes(struct cros_typec_data *typec, 280 + static int cros_typec_register_port_altmodes(struct cros_typec_data *typec, 289 281 int port_num) 290 282 { 291 283 struct cros_typec_port *port = typec->ports[port_num]; 284 + struct typec_altmode_desc desc; 285 + struct typec_altmode *amode; 292 286 293 287 /* All PD capable CrOS devices are assumed to support DP altmode. */ 294 - port->p_altmode[CROS_EC_ALTMODE_DP].svid = USB_TYPEC_DP_SID; 295 - port->p_altmode[CROS_EC_ALTMODE_DP].mode = USB_TYPEC_DP_MODE; 288 + desc.svid = USB_TYPEC_DP_SID, 289 + desc.mode = USB_TYPEC_DP_MODE, 290 + desc.vdo = DP_PORT_VDO, 291 + amode = typec_port_register_altmode(port->port, &desc); 292 + if (IS_ERR(amode)) 293 + return PTR_ERR(amode); 294 + port->port_altmode[CROS_EC_ALTMODE_DP] = amode; 296 295 297 296 /* 298 297 * Register TBT compatibility alt mode. The EC will not enter the mode 299 298 * if it doesn't support it, so it's safe to register it unconditionally 300 299 * here for now. 301 300 */ 302 - port->p_altmode[CROS_EC_ALTMODE_TBT].svid = USB_TYPEC_TBT_SID; 303 - port->p_altmode[CROS_EC_ALTMODE_TBT].mode = TYPEC_ANY_MODE; 301 + memset(&desc, 0, sizeof(desc)); 302 + desc.svid = USB_TYPEC_TBT_SID, 303 + desc.mode = TYPEC_ANY_MODE, 304 + amode = typec_port_register_altmode(port->port, &desc); 305 + if (IS_ERR(amode)) 306 + return PTR_ERR(amode); 307 + port->port_altmode[CROS_EC_ALTMODE_TBT] = amode; 304 308 305 309 port->state.alt = NULL; 306 310 port->state.mode = TYPEC_STATE_USB; 307 311 port->state.data = NULL; 312 + 313 + return 0; 308 314 } 309 315 310 316 static int cros_typec_init_ports(struct cros_typec_data *typec) ··· 376 352 377 353 cros_port->port = typec_register_port(dev, cap); 378 354 if (IS_ERR(cros_port->port)) { 379 - dev_err(dev, "Failed to register port %d\n", port_num); 380 355 ret = PTR_ERR(cros_port->port); 356 + dev_err_probe(dev, ret, "Failed to register port %d\n", port_num); 381 357 goto unregister_ports; 382 358 } 383 359 ··· 386 362 dev_dbg(dev, "No switch control for port %d\n", 387 363 port_num); 388 364 389 - cros_typec_register_port_altmodes(typec, port_num); 365 + ret = cros_typec_register_port_altmodes(typec, port_num); 366 + if (ret) { 367 + dev_err(dev, "Failed to register port altmodes\n"); 368 + goto unregister_ports; 369 + } 390 370 391 371 cros_port->disc_data = devm_kzalloc(dev, EC_PROTO2_MAX_RESPONSE_SIZE, GFP_KERNEL); 392 372 if (!cros_port->disc_data) { ··· 459 431 data.enter_vdo |= TBT_ENTER_MODE_ACTIVE_CABLE; 460 432 461 433 if (!port->state.alt) { 462 - port->state.alt = &port->p_altmode[CROS_EC_ALTMODE_TBT]; 434 + port->state.alt = port->port_altmode[CROS_EC_ALTMODE_TBT]; 463 435 ret = cros_typec_usb_safe_state(port); 464 436 if (ret) 465 437 return ret; ··· 501 473 /* Configuration VDO. */ 502 474 dp_data.conf = DP_CONF_SET_PIN_ASSIGN(pd_ctrl->dp_mode); 503 475 if (!port->state.alt) { 504 - port->state.alt = &port->p_altmode[CROS_EC_ALTMODE_DP]; 476 + port->state.alt = port->port_altmode[CROS_EC_ALTMODE_DP]; 505 477 ret = cros_typec_usb_safe_state(port); 506 478 if (ret) 507 479 return ret; ··· 553 525 enum typec_orientation orientation; 554 526 int ret; 555 527 556 - ret = cros_ec_command(typec->ec, 0, EC_CMD_USB_PD_MUX_INFO, 557 - &req, sizeof(req), &resp, sizeof(resp)); 528 + ret = cros_ec_cmd(typec->ec, 0, EC_CMD_USB_PD_MUX_INFO, 529 + &req, sizeof(req), &resp, sizeof(resp)); 558 530 if (ret < 0) { 559 531 dev_warn(typec->dev, "Failed to get mux info for port: %d, err = %d\n", 560 532 port_num, ret); ··· 613 585 /* Sending Acknowledgment to EC */ 614 586 mux_ack.port = port_num; 615 587 616 - if (cros_ec_command(typec->ec, 0, EC_CMD_USB_PD_MUX_ACK, &mux_ack, 617 - sizeof(mux_ack), NULL, 0) < 0) 588 + if (cros_ec_cmd(typec->ec, 0, EC_CMD_USB_PD_MUX_ACK, &mux_ack, 589 + sizeof(mux_ack), NULL, 0) < 0) 618 590 dev_warn(typec->dev, 619 591 "Failed to send Mux ACK to EC for port: %d\n", 620 592 port_num); ··· 782 754 int ret = 0; 783 755 784 756 memset(disc, 0, EC_PROTO2_MAX_RESPONSE_SIZE); 785 - ret = cros_ec_command(typec->ec, 0, EC_CMD_TYPEC_DISCOVERY, &req, sizeof(req), 786 - disc, EC_PROTO2_MAX_RESPONSE_SIZE); 757 + ret = cros_ec_cmd(typec->ec, 0, EC_CMD_TYPEC_DISCOVERY, &req, sizeof(req), 758 + disc, EC_PROTO2_MAX_RESPONSE_SIZE); 787 759 if (ret < 0) { 788 760 dev_err(typec->dev, "Failed to get SOP' discovery data for port: %d\n", port_num); 789 761 goto sop_prime_disc_exit; ··· 865 837 typec_partner_set_pd_revision(port->partner, pd_revision); 866 838 867 839 memset(sop_disc, 0, EC_PROTO2_MAX_RESPONSE_SIZE); 868 - ret = cros_ec_command(typec->ec, 0, EC_CMD_TYPEC_DISCOVERY, &req, sizeof(req), 869 - sop_disc, EC_PROTO2_MAX_RESPONSE_SIZE); 840 + ret = cros_ec_cmd(typec->ec, 0, EC_CMD_TYPEC_DISCOVERY, &req, sizeof(req), 841 + sop_disc, EC_PROTO2_MAX_RESPONSE_SIZE); 870 842 if (ret < 0) { 871 843 dev_err(typec->dev, "Failed to get SOP discovery data for port: %d\n", port_num); 872 844 goto disc_exit; ··· 898 870 .clear_events_mask = events_mask, 899 871 }; 900 872 901 - return cros_ec_command(typec->ec, 0, EC_CMD_TYPEC_CONTROL, &req, 902 - sizeof(req), NULL, 0); 873 + return cros_ec_cmd(typec->ec, 0, EC_CMD_TYPEC_CONTROL, &req, 874 + sizeof(req), NULL, 0); 903 875 } 904 876 905 877 static void cros_typec_handle_status(struct cros_typec_data *typec, int port_num) ··· 910 882 }; 911 883 int ret; 912 884 913 - ret = cros_ec_command(typec->ec, 0, EC_CMD_TYPEC_STATUS, &req, sizeof(req), 914 - &resp, sizeof(resp)); 885 + ret = cros_ec_cmd(typec->ec, 0, EC_CMD_TYPEC_STATUS, &req, sizeof(req), 886 + &resp, sizeof(resp)); 915 887 if (ret < 0) { 916 888 dev_warn(typec->dev, "EC_CMD_TYPEC_STATUS failed for port: %d\n", port_num); 917 889 return; ··· 988 960 req.mux = USB_PD_CTRL_MUX_NO_CHANGE; 989 961 req.swap = USB_PD_CTRL_SWAP_NONE; 990 962 991 - ret = cros_ec_command(typec->ec, typec->pd_ctrl_ver, 992 - EC_CMD_USB_PD_CONTROL, &req, sizeof(req), 993 - &resp, sizeof(resp)); 963 + ret = cros_ec_cmd(typec->ec, typec->pd_ctrl_ver, 964 + EC_CMD_USB_PD_CONTROL, &req, sizeof(req), 965 + &resp, sizeof(resp)); 994 966 if (ret < 0) 995 967 return ret; 996 968 ··· 1025 997 1026 998 /* We're interested in the PD control command version. */ 1027 999 req_v1.cmd = EC_CMD_USB_PD_CONTROL; 1028 - ret = cros_ec_command(typec->ec, 1, EC_CMD_GET_CMD_VERSIONS, 1029 - &req_v1, sizeof(req_v1), &resp, 1030 - sizeof(resp)); 1000 + ret = cros_ec_cmd(typec->ec, 1, EC_CMD_GET_CMD_VERSIONS, 1001 + &req_v1, sizeof(req_v1), &resp, sizeof(resp)); 1031 1002 if (ret < 0) 1032 1003 return ret; 1033 1004 ··· 1117 1090 typec->typec_cmd_supported = cros_ec_check_features(ec_dev, EC_FEATURE_TYPEC_CMD); 1118 1091 typec->needs_mux_ack = cros_ec_check_features(ec_dev, EC_FEATURE_TYPEC_MUX_REQUIRE_AP_ACK); 1119 1092 1120 - ret = cros_ec_command(typec->ec, 0, EC_CMD_USB_PD_PORTS, NULL, 0, 1121 - &resp, sizeof(resp)); 1093 + ret = cros_ec_cmd(typec->ec, 0, EC_CMD_USB_PD_PORTS, NULL, 0, 1094 + &resp, sizeof(resp)); 1122 1095 if (ret < 0) 1123 1096 return ret; 1124 1097
+174 -22
drivers/platform/chrome/cros_kbd_led_backlight.c
··· 4 4 // Copyright (C) 2012 Google, Inc. 5 5 6 6 #include <linux/acpi.h> 7 - #include <linux/leds.h> 8 7 #include <linux/delay.h> 9 8 #include <linux/err.h> 10 - #include <linux/module.h> 11 9 #include <linux/init.h> 12 10 #include <linux/kernel.h> 11 + #include <linux/leds.h> 12 + #include <linux/module.h> 13 + #include <linux/of.h> 14 + #include <linux/platform_data/cros_ec_commands.h> 15 + #include <linux/platform_data/cros_ec_proto.h> 13 16 #include <linux/platform_device.h> 17 + #include <linux/property.h> 14 18 #include <linux/slab.h> 19 + 20 + struct keyboard_led { 21 + struct led_classdev cdev; 22 + struct cros_ec_device *ec; 23 + }; 24 + 25 + /** 26 + * struct keyboard_led_drvdata - keyboard LED driver data. 27 + * @init: Init function. 28 + * @brightness_get: Get LED brightness level. 29 + * @brightness_set: Set LED brightness level. Must not sleep. 30 + * @brightness_set_blocking: Set LED brightness level. It can block the 31 + * caller for the time required for accessing a 32 + * LED device register 33 + * @max_brightness: Maximum brightness. 34 + * 35 + * See struct led_classdev in include/linux/leds.h for more details. 36 + */ 37 + struct keyboard_led_drvdata { 38 + int (*init)(struct platform_device *pdev); 39 + 40 + enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); 41 + 42 + void (*brightness_set)(struct led_classdev *led_cdev, 43 + enum led_brightness brightness); 44 + int (*brightness_set_blocking)(struct led_classdev *led_cdev, 45 + enum led_brightness brightness); 46 + 47 + enum led_brightness max_brightness; 48 + }; 49 + 50 + #define KEYBOARD_BACKLIGHT_MAX 100 51 + 52 + #ifdef CONFIG_ACPI 15 53 16 54 /* Keyboard LED ACPI Device must be defined in firmware */ 17 55 #define ACPI_KEYBOARD_BACKLIGHT_DEVICE "\\_SB.KBLT" 18 56 #define ACPI_KEYBOARD_BACKLIGHT_READ ACPI_KEYBOARD_BACKLIGHT_DEVICE ".KBQC" 19 57 #define ACPI_KEYBOARD_BACKLIGHT_WRITE ACPI_KEYBOARD_BACKLIGHT_DEVICE ".KBCM" 20 58 21 - #define ACPI_KEYBOARD_BACKLIGHT_MAX 100 22 - 23 - static void keyboard_led_set_brightness(struct led_classdev *cdev, 24 - enum led_brightness brightness) 59 + static void keyboard_led_set_brightness_acpi(struct led_classdev *cdev, 60 + enum led_brightness brightness) 25 61 { 26 62 union acpi_object param; 27 63 struct acpi_object_list input; ··· 76 40 } 77 41 78 42 static enum led_brightness 79 - keyboard_led_get_brightness(struct led_classdev *cdev) 43 + keyboard_led_get_brightness_acpi(struct led_classdev *cdev) 80 44 { 81 45 unsigned long long brightness; 82 46 acpi_status status; ··· 92 56 return brightness; 93 57 } 94 58 95 - static int keyboard_led_probe(struct platform_device *pdev) 59 + static int keyboard_led_init_acpi(struct platform_device *pdev) 96 60 { 97 - struct led_classdev *cdev; 98 61 acpi_handle handle; 99 62 acpi_status status; 100 - int error; 101 63 102 64 /* Look for the keyboard LED ACPI Device */ 103 65 status = acpi_get_handle(ACPI_ROOT_OBJECT, ··· 107 73 return -ENXIO; 108 74 } 109 75 110 - cdev = devm_kzalloc(&pdev->dev, sizeof(*cdev), GFP_KERNEL); 111 - if (!cdev) 76 + return 0; 77 + } 78 + 79 + static const struct keyboard_led_drvdata keyboard_led_drvdata_acpi = { 80 + .init = keyboard_led_init_acpi, 81 + .brightness_set = keyboard_led_set_brightness_acpi, 82 + .brightness_get = keyboard_led_get_brightness_acpi, 83 + .max_brightness = KEYBOARD_BACKLIGHT_MAX, 84 + }; 85 + 86 + #endif /* CONFIG_ACPI */ 87 + 88 + #if IS_ENABLED(CONFIG_CROS_EC) 89 + 90 + static int 91 + keyboard_led_set_brightness_ec_pwm(struct led_classdev *cdev, 92 + enum led_brightness brightness) 93 + { 94 + struct { 95 + struct cros_ec_command msg; 96 + struct ec_params_pwm_set_keyboard_backlight params; 97 + } __packed buf; 98 + struct ec_params_pwm_set_keyboard_backlight *params = &buf.params; 99 + struct cros_ec_command *msg = &buf.msg; 100 + struct keyboard_led *keyboard_led = container_of(cdev, struct keyboard_led, cdev); 101 + 102 + memset(&buf, 0, sizeof(buf)); 103 + 104 + msg->command = EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT; 105 + msg->outsize = sizeof(*params); 106 + 107 + params->percent = brightness; 108 + 109 + return cros_ec_cmd_xfer_status(keyboard_led->ec, msg); 110 + } 111 + 112 + static enum led_brightness 113 + keyboard_led_get_brightness_ec_pwm(struct led_classdev *cdev) 114 + { 115 + struct { 116 + struct cros_ec_command msg; 117 + struct ec_response_pwm_get_keyboard_backlight resp; 118 + } __packed buf; 119 + struct ec_response_pwm_get_keyboard_backlight *resp = &buf.resp; 120 + struct cros_ec_command *msg = &buf.msg; 121 + struct keyboard_led *keyboard_led = container_of(cdev, struct keyboard_led, cdev); 122 + int ret; 123 + 124 + memset(&buf, 0, sizeof(buf)); 125 + 126 + msg->command = EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT; 127 + msg->insize = sizeof(*resp); 128 + 129 + ret = cros_ec_cmd_xfer_status(keyboard_led->ec, msg); 130 + if (ret < 0) 131 + return ret; 132 + 133 + return resp->percent; 134 + } 135 + 136 + static int keyboard_led_init_ec_pwm(struct platform_device *pdev) 137 + { 138 + struct keyboard_led *keyboard_led = platform_get_drvdata(pdev); 139 + 140 + keyboard_led->ec = dev_get_drvdata(pdev->dev.parent); 141 + if (!keyboard_led->ec) { 142 + dev_err(&pdev->dev, "no parent EC device\n"); 143 + return -EINVAL; 144 + } 145 + 146 + return 0; 147 + } 148 + 149 + static const __maybe_unused struct keyboard_led_drvdata keyboard_led_drvdata_ec_pwm = { 150 + .init = keyboard_led_init_ec_pwm, 151 + .brightness_set_blocking = keyboard_led_set_brightness_ec_pwm, 152 + .brightness_get = keyboard_led_get_brightness_ec_pwm, 153 + .max_brightness = KEYBOARD_BACKLIGHT_MAX, 154 + }; 155 + 156 + #else /* IS_ENABLED(CONFIG_CROS_EC) */ 157 + 158 + static const __maybe_unused struct keyboard_led_drvdata keyboard_led_drvdata_ec_pwm = {}; 159 + 160 + #endif /* IS_ENABLED(CONFIG_CROS_EC) */ 161 + 162 + static int keyboard_led_probe(struct platform_device *pdev) 163 + { 164 + const struct keyboard_led_drvdata *drvdata; 165 + struct keyboard_led *keyboard_led; 166 + int error; 167 + 168 + drvdata = device_get_match_data(&pdev->dev); 169 + if (!drvdata) 170 + return -EINVAL; 171 + 172 + keyboard_led = devm_kzalloc(&pdev->dev, sizeof(*keyboard_led), GFP_KERNEL); 173 + if (!keyboard_led) 112 174 return -ENOMEM; 175 + platform_set_drvdata(pdev, keyboard_led); 113 176 114 - cdev->name = "chromeos::kbd_backlight"; 115 - cdev->max_brightness = ACPI_KEYBOARD_BACKLIGHT_MAX; 116 - cdev->flags |= LED_CORE_SUSPENDRESUME; 117 - cdev->brightness_set = keyboard_led_set_brightness; 118 - cdev->brightness_get = keyboard_led_get_brightness; 177 + if (drvdata->init) { 178 + error = drvdata->init(pdev); 179 + if (error) 180 + return error; 181 + } 119 182 120 - error = devm_led_classdev_register(&pdev->dev, cdev); 183 + keyboard_led->cdev.name = "chromeos::kbd_backlight"; 184 + keyboard_led->cdev.flags |= LED_CORE_SUSPENDRESUME; 185 + keyboard_led->cdev.max_brightness = drvdata->max_brightness; 186 + keyboard_led->cdev.brightness_set = drvdata->brightness_set; 187 + keyboard_led->cdev.brightness_set_blocking = drvdata->brightness_set_blocking; 188 + keyboard_led->cdev.brightness_get = drvdata->brightness_get; 189 + 190 + error = devm_led_classdev_register(&pdev->dev, &keyboard_led->cdev); 121 191 if (error) 122 192 return error; 123 193 124 194 return 0; 125 195 } 126 196 127 - static const struct acpi_device_id keyboard_led_id[] = { 128 - { "GOOG0002", 0 }, 197 + #ifdef CONFIG_ACPI 198 + static const struct acpi_device_id keyboard_led_acpi_match[] = { 199 + { "GOOG0002", (kernel_ulong_t)&keyboard_led_drvdata_acpi }, 129 200 { } 130 201 }; 131 - MODULE_DEVICE_TABLE(acpi, keyboard_led_id); 202 + MODULE_DEVICE_TABLE(acpi, keyboard_led_acpi_match); 203 + #endif 204 + 205 + #ifdef CONFIG_OF 206 + static const struct of_device_id keyboard_led_of_match[] = { 207 + { 208 + .compatible = "google,cros-kbd-led-backlight", 209 + .data = &keyboard_led_drvdata_ec_pwm, 210 + }, 211 + {} 212 + }; 213 + MODULE_DEVICE_TABLE(of, keyboard_led_of_match); 214 + #endif 132 215 133 216 static struct platform_driver keyboard_led_driver = { 134 217 .driver = { 135 218 .name = "chromeos-keyboard-leds", 136 - .acpi_match_table = ACPI_PTR(keyboard_led_id), 219 + .acpi_match_table = ACPI_PTR(keyboard_led_acpi_match), 220 + .of_match_table = of_match_ptr(keyboard_led_of_match), 137 221 }, 138 222 .probe = keyboard_led_probe, 139 223 };
+130
drivers/platform/chrome/cros_kunit_util.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * CrOS Kunit tests utilities. 4 + */ 5 + 6 + #include <kunit/test.h> 7 + 8 + #include <linux/list.h> 9 + #include <linux/minmax.h> 10 + #include <linux/platform_data/cros_ec_commands.h> 11 + #include <linux/platform_data/cros_ec_proto.h> 12 + 13 + #include "cros_ec.h" 14 + #include "cros_kunit_util.h" 15 + 16 + int cros_kunit_ec_xfer_mock_default_result; 17 + int cros_kunit_ec_xfer_mock_default_ret; 18 + int cros_kunit_ec_cmd_xfer_mock_called; 19 + int cros_kunit_ec_pkt_xfer_mock_called; 20 + 21 + static struct list_head cros_kunit_ec_xfer_mock_in; 22 + static struct list_head cros_kunit_ec_xfer_mock_out; 23 + 24 + int cros_kunit_ec_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) 25 + { 26 + struct ec_xfer_mock *mock; 27 + 28 + mock = list_first_entry_or_null(&cros_kunit_ec_xfer_mock_in, struct ec_xfer_mock, list); 29 + if (!mock) { 30 + msg->result = cros_kunit_ec_xfer_mock_default_result; 31 + return cros_kunit_ec_xfer_mock_default_ret; 32 + } 33 + 34 + list_del(&mock->list); 35 + 36 + memcpy(&mock->msg, msg, sizeof(*msg)); 37 + if (msg->outsize) { 38 + mock->i_data = kunit_kzalloc(mock->test, msg->outsize, GFP_KERNEL); 39 + if (mock->i_data) 40 + memcpy(mock->i_data, msg->data, msg->outsize); 41 + } 42 + 43 + msg->result = mock->result; 44 + if (msg->insize) 45 + memcpy(msg->data, mock->o_data, min(msg->insize, mock->o_data_len)); 46 + 47 + list_add_tail(&mock->list, &cros_kunit_ec_xfer_mock_out); 48 + 49 + return mock->ret; 50 + } 51 + 52 + int cros_kunit_ec_cmd_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) 53 + { 54 + ++cros_kunit_ec_cmd_xfer_mock_called; 55 + return cros_kunit_ec_xfer_mock(ec_dev, msg); 56 + } 57 + 58 + int cros_kunit_ec_pkt_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) 59 + { 60 + ++cros_kunit_ec_pkt_xfer_mock_called; 61 + return cros_kunit_ec_xfer_mock(ec_dev, msg); 62 + } 63 + 64 + struct ec_xfer_mock *cros_kunit_ec_xfer_mock_add(struct kunit *test, size_t size) 65 + { 66 + return cros_kunit_ec_xfer_mock_addx(test, size, EC_RES_SUCCESS, size); 67 + } 68 + 69 + struct ec_xfer_mock *cros_kunit_ec_xfer_mock_addx(struct kunit *test, 70 + int ret, int result, size_t size) 71 + { 72 + struct ec_xfer_mock *mock; 73 + 74 + mock = kunit_kzalloc(test, sizeof(*mock), GFP_KERNEL); 75 + if (!mock) 76 + return NULL; 77 + 78 + list_add_tail(&mock->list, &cros_kunit_ec_xfer_mock_in); 79 + mock->test = test; 80 + 81 + mock->ret = ret; 82 + mock->result = result; 83 + mock->o_data = kunit_kzalloc(test, size, GFP_KERNEL); 84 + if (!mock->o_data) 85 + return NULL; 86 + mock->o_data_len = size; 87 + 88 + return mock; 89 + } 90 + 91 + struct ec_xfer_mock *cros_kunit_ec_xfer_mock_next(void) 92 + { 93 + struct ec_xfer_mock *mock; 94 + 95 + mock = list_first_entry_or_null(&cros_kunit_ec_xfer_mock_out, struct ec_xfer_mock, list); 96 + if (mock) 97 + list_del(&mock->list); 98 + 99 + return mock; 100 + } 101 + 102 + int cros_kunit_readmem_mock_offset; 103 + u8 *cros_kunit_readmem_mock_data; 104 + int cros_kunit_readmem_mock_ret; 105 + 106 + int cros_kunit_readmem_mock(struct cros_ec_device *ec_dev, unsigned int offset, 107 + unsigned int bytes, void *dest) 108 + { 109 + cros_kunit_readmem_mock_offset = offset; 110 + 111 + memcpy(dest, cros_kunit_readmem_mock_data, bytes); 112 + 113 + return cros_kunit_readmem_mock_ret; 114 + } 115 + 116 + void cros_kunit_mock_reset(void) 117 + { 118 + cros_kunit_ec_xfer_mock_default_result = 0; 119 + cros_kunit_ec_xfer_mock_default_ret = 0; 120 + cros_kunit_ec_cmd_xfer_mock_called = 0; 121 + cros_kunit_ec_pkt_xfer_mock_called = 0; 122 + INIT_LIST_HEAD(&cros_kunit_ec_xfer_mock_in); 123 + INIT_LIST_HEAD(&cros_kunit_ec_xfer_mock_out); 124 + 125 + cros_kunit_readmem_mock_offset = 0; 126 + cros_kunit_readmem_mock_data = NULL; 127 + cros_kunit_readmem_mock_ret = 0; 128 + } 129 + 130 + MODULE_LICENSE("GPL");
+48
drivers/platform/chrome/cros_kunit_util.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * CrOS Kunit tests utilities. 4 + */ 5 + 6 + #ifndef _CROS_KUNIT_UTIL_H_ 7 + #define _CROS_KUNIT_UTIL_H_ 8 + 9 + #include <linux/platform_data/cros_ec_proto.h> 10 + 11 + struct ec_xfer_mock { 12 + struct list_head list; 13 + struct kunit *test; 14 + 15 + /* input */ 16 + struct cros_ec_command msg; 17 + void *i_data; 18 + 19 + /* output */ 20 + int ret; 21 + int result; 22 + void *o_data; 23 + u32 o_data_len; 24 + }; 25 + 26 + extern int cros_kunit_ec_xfer_mock_default_result; 27 + extern int cros_kunit_ec_xfer_mock_default_ret; 28 + extern int cros_kunit_ec_cmd_xfer_mock_called; 29 + extern int cros_kunit_ec_pkt_xfer_mock_called; 30 + 31 + int cros_kunit_ec_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg); 32 + int cros_kunit_ec_cmd_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg); 33 + int cros_kunit_ec_pkt_xfer_mock(struct cros_ec_device *ec_dev, struct cros_ec_command *msg); 34 + struct ec_xfer_mock *cros_kunit_ec_xfer_mock_add(struct kunit *test, size_t size); 35 + struct ec_xfer_mock *cros_kunit_ec_xfer_mock_addx(struct kunit *test, 36 + int ret, int result, size_t size); 37 + struct ec_xfer_mock *cros_kunit_ec_xfer_mock_next(void); 38 + 39 + extern int cros_kunit_readmem_mock_offset; 40 + extern u8 *cros_kunit_readmem_mock_data; 41 + extern int cros_kunit_readmem_mock_ret; 42 + 43 + int cros_kunit_readmem_mock(struct cros_ec_device *ec_dev, unsigned int offset, 44 + unsigned int bytes, void *dest); 45 + 46 + void cros_kunit_mock_reset(void); 47 + 48 + #endif
+2 -2
drivers/platform/chrome/cros_usbpd_notify.c
··· 71 71 } 72 72 73 73 /* Check for PD host events on EC. */ 74 - ret = cros_ec_command(ec_dev, 0, EC_CMD_PD_HOST_EVENT_STATUS, 75 - NULL, 0, &host_event_status, sizeof(host_event_status)); 74 + ret = cros_ec_cmd(ec_dev, 0, EC_CMD_PD_HOST_EVENT_STATUS, 75 + NULL, 0, &host_event_status, sizeof(host_event_status)); 76 76 if (ret < 0) { 77 77 dev_warn(dev, "Can't get host event status (err: %d)\n", ret); 78 78 goto send_notify;
+1 -1
drivers/platform/chrome/wilco_ec/event.c
··· 343 343 * 344 344 * Removes the first event from the queue, places it in the passed buffer. 345 345 * 346 - * If there are no events in the the queue, then one of two things happens, 346 + * If there are no events in the queue, then one of two things happens, 347 347 * depending on if the file was opened in nonblocking mode: If in nonblocking 348 348 * mode, then return -EAGAIN to say there's no data. If in blocking mode, then 349 349 * block until an event is available.
+3 -33
drivers/regulator/cros-ec-regulator.c
··· 22 22 u16 num_voltages; 23 23 }; 24 24 25 - static int cros_ec_cmd(struct cros_ec_device *ec, u32 version, u32 command, 26 - void *outdata, u32 outsize, void *indata, u32 insize) 27 - { 28 - struct cros_ec_command *msg; 29 - int ret; 30 - 31 - msg = kzalloc(sizeof(*msg) + max(outsize, insize), GFP_KERNEL); 32 - if (!msg) 33 - return -ENOMEM; 34 - 35 - msg->version = version; 36 - msg->command = command; 37 - msg->outsize = outsize; 38 - msg->insize = insize; 39 - 40 - if (outdata && outsize > 0) 41 - memcpy(msg->data, outdata, outsize); 42 - 43 - ret = cros_ec_cmd_xfer_status(ec, msg); 44 - if (ret < 0) 45 - goto cleanup; 46 - 47 - if (insize) 48 - memcpy(indata, msg->data, insize); 49 - 50 - cleanup: 51 - kfree(msg); 52 - return ret; 53 - } 54 - 55 25 static int cros_ec_regulator_enable(struct regulator_dev *dev) 56 26 { 57 27 struct cros_ec_regulator_data *data = rdev_get_drvdata(dev); ··· 31 61 }; 32 62 33 63 return cros_ec_cmd(data->ec_dev, 0, EC_CMD_REGULATOR_ENABLE, &cmd, 34 - sizeof(cmd), NULL, 0); 64 + sizeof(cmd), NULL, 0); 35 65 } 36 66 37 67 static int cros_ec_regulator_disable(struct regulator_dev *dev) ··· 43 73 }; 44 74 45 75 return cros_ec_cmd(data->ec_dev, 0, EC_CMD_REGULATOR_ENABLE, &cmd, 46 - sizeof(cmd), NULL, 0); 76 + sizeof(cmd), NULL, 0); 47 77 } 48 78 49 79 static int cros_ec_regulator_is_enabled(struct regulator_dev *dev) ··· 131 161 int ret; 132 162 133 163 ret = cros_ec_cmd(data->ec_dev, 0, EC_CMD_REGULATOR_GET_INFO, &cmd, 134 - sizeof(cmd), &resp, sizeof(resp)); 164 + sizeof(cmd), &resp, sizeof(resp)); 135 165 if (ret < 0) 136 166 return ret; 137 167
+3 -3
include/linux/platform_data/cros_ec_commands.h
··· 13 13 #ifndef __CROS_EC_COMMANDS_H 14 14 #define __CROS_EC_COMMANDS_H 15 15 16 - 17 - 16 + #include <linux/bits.h> 17 + #include <linux/types.h> 18 18 19 19 #define BUILD_ASSERT(_cond) 20 20 ··· 787 787 * 788 788 * Packets always start with a request or response header. They are followed 789 789 * by data_len bytes of data. If the data_crc_present flag is set, the data 790 - * bytes are followed by a CRC-8 of that data, using using x^8 + x^2 + x + 1 790 + * bytes are followed by a CRC-8 of that data, using x^8 + x^2 + x + 1 791 791 * polynomial. 792 792 * 793 793 * Host algorithm when sending a request q:
+5 -2
include/linux/platform_data/cros_ec_proto.h
··· 21 21 #define CROS_EC_DEV_SCP_NAME "cros_scp" 22 22 #define CROS_EC_DEV_TP_NAME "cros_tp" 23 23 24 + #define CROS_EC_DEV_EC_INDEX 0 25 + #define CROS_EC_DEV_PD_INDEX 1 26 + 24 27 /* 25 28 * The EC is unresponsive for a time after a reboot command. Add a 26 29 * simple delay to make sure that the bus stays locked. ··· 234 231 235 232 int cros_ec_get_sensor_count(struct cros_ec_dev *ec); 236 233 237 - int cros_ec_command(struct cros_ec_device *ec_dev, unsigned int version, int command, void *outdata, 238 - int outsize, void *indata, int insize); 234 + int cros_ec_cmd(struct cros_ec_device *ec_dev, unsigned int version, int command, void *outdata, 235 + size_t outsize, void *indata, size_t insize); 239 236 240 237 /** 241 238 * cros_ec_get_time_ns() - Return time in ns.