1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * This module provides an interface to trigger and test firmware loading. 4 * 5 * It is designed to be used for basic evaluation of the firmware loading 6 * subsystem (for example when validating firmware verification). It lacks 7 * any extra dependencies, and will not normally be loaded by the system 8 * unless explicitly requested by name. 9 */ 10 11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 12 13 #include <linux/init.h> 14 #include <linux/module.h> 15 #include <linux/printk.h> 16 #include <linux/completion.h> 17 #include <linux/firmware.h> 18 #include <linux/device.h> 19 #include <linux/fs.h> 20 #include <linux/miscdevice.h> 21 #include <linux/sizes.h> 22 #include <linux/slab.h> 23 #include <linux/uaccess.h> 24 #include <linux/delay.h> 25 #include <linux/kthread.h> 26 #include <linux/vmalloc.h> 27 #include <linux/efi_embedded_fw.h> 28 29 MODULE_IMPORT_NS(TEST_FIRMWARE); 30 31 #define TEST_FIRMWARE_NAME "test-firmware.bin" 32 #define TEST_FIRMWARE_NUM_REQS 4 33 #define TEST_FIRMWARE_BUF_SIZE SZ_1K 34 35 static DEFINE_MUTEX(test_fw_mutex); 36 static const struct firmware *test_firmware; 37 38 struct test_batched_req { 39 u8 idx; 40 int rc; 41 bool sent; 42 const struct firmware *fw; 43 const char *name; 44 struct completion completion; 45 struct task_struct *task; 46 struct device *dev; 47 }; 48 49 /** 50 * test_config - represents configuration for the test for different triggers 51 * 52 * @name: the name of the firmware file to look for 53 * @into_buf: when the into_buf is used if this is true 54 * request_firmware_into_buf() will be used instead. 55 * @sync_direct: when the sync trigger is used if this is true 56 * request_firmware_direct() will be used instead. 57 * @send_uevent: whether or not to send a uevent for async requests 58 * @num_requests: number of requests to try per test case. This is trigger 59 * specific. 60 * @reqs: stores all requests information 61 * @read_fw_idx: index of thread from which we want to read firmware results 62 * from through the read_fw trigger. 63 * @test_result: a test may use this to collect the result from the call 64 * of the request_firmware*() calls used in their tests. In order of 65 * priority we always keep first any setup error. If no setup errors were 66 * found then we move on to the first error encountered while running the 67 * API. Note that for async calls this typically will be a successful 68 * result (0) unless of course you've used bogus parameters, or the system 69 * is out of memory. In the async case the callback is expected to do a 70 * bit more homework to figure out what happened, unfortunately the only 71 * information passed today on error is the fact that no firmware was 72 * found so we can only assume -ENOENT on async calls if the firmware is 73 * NULL. 74 * 75 * Errors you can expect: 76 * 77 * API specific: 78 * 79 * 0: success for sync, for async it means request was sent 80 * -EINVAL: invalid parameters or request 81 * -ENOENT: files not found 82 * 83 * System environment: 84 * 85 * -ENOMEM: memory pressure on system 86 * -ENODEV: out of number of devices to test 87 * -EINVAL: an unexpected error has occurred 88 * @req_firmware: if @sync_direct is true this is set to 89 * request_firmware_direct(), otherwise request_firmware() 90 */ 91 struct test_config { 92 char *name; 93 bool into_buf; 94 bool sync_direct; 95 bool send_uevent; 96 u8 num_requests; 97 u8 read_fw_idx; 98 99 /* 100 * These below don't belong her but we'll move them once we create 101 * a struct fw_test_device and stuff the misc_dev under there later. 102 */ 103 struct test_batched_req *reqs; 104 int test_result; 105 int (*req_firmware)(const struct firmware **fw, const char *name, 106 struct device *device); 107 }; 108 109 static struct test_config *test_fw_config; 110 111 static ssize_t test_fw_misc_read(struct file *f, char __user *buf, 112 size_t size, loff_t *offset) 113 { 114 ssize_t rc = 0; 115 116 mutex_lock(&test_fw_mutex); 117 if (test_firmware) 118 rc = simple_read_from_buffer(buf, size, offset, 119 test_firmware->data, 120 test_firmware->size); 121 mutex_unlock(&test_fw_mutex); 122 return rc; 123 } 124 125 static const struct file_operations test_fw_fops = { 126 .owner = THIS_MODULE, 127 .read = test_fw_misc_read, 128 }; 129 130 static void __test_release_all_firmware(void) 131 { 132 struct test_batched_req *req; 133 u8 i; 134 135 if (!test_fw_config->reqs) 136 return; 137 138 for (i = 0; i < test_fw_config->num_requests; i++) { 139 req = &test_fw_config->reqs[i]; 140 if (req->fw) 141 release_firmware(req->fw); 142 } 143 144 vfree(test_fw_config->reqs); 145 test_fw_config->reqs = NULL; 146 } 147 148 static void test_release_all_firmware(void) 149 { 150 mutex_lock(&test_fw_mutex); 151 __test_release_all_firmware(); 152 mutex_unlock(&test_fw_mutex); 153 } 154 155 156 static void __test_firmware_config_free(void) 157 { 158 __test_release_all_firmware(); 159 kfree_const(test_fw_config->name); 160 test_fw_config->name = NULL; 161 } 162 163 /* 164 * XXX: move to kstrncpy() once merged. 165 * 166 * Users should use kfree_const() when freeing these. 167 */ 168 static int __kstrncpy(char **dst, const char *name, size_t count, gfp_t gfp) 169 { 170 *dst = kstrndup(name, count, gfp); 171 if (!*dst) 172 return -ENOSPC; 173 return count; 174 } 175 176 static int __test_firmware_config_init(void) 177 { 178 int ret; 179 180 ret = __kstrncpy(&test_fw_config->name, TEST_FIRMWARE_NAME, 181 strlen(TEST_FIRMWARE_NAME), GFP_KERNEL); 182 if (ret < 0) 183 goto out; 184 185 test_fw_config->num_requests = TEST_FIRMWARE_NUM_REQS; 186 test_fw_config->send_uevent = true; 187 test_fw_config->into_buf = false; 188 test_fw_config->sync_direct = false; 189 test_fw_config->req_firmware = request_firmware; 190 test_fw_config->test_result = 0; 191 test_fw_config->reqs = NULL; 192 193 return 0; 194 195 out: 196 __test_firmware_config_free(); 197 return ret; 198 } 199 200 static ssize_t reset_store(struct device *dev, 201 struct device_attribute *attr, 202 const char *buf, size_t count) 203 { 204 int ret; 205 206 mutex_lock(&test_fw_mutex); 207 208 __test_firmware_config_free(); 209 210 ret = __test_firmware_config_init(); 211 if (ret < 0) { 212 ret = -ENOMEM; 213 pr_err("could not alloc settings for config trigger: %d\n", 214 ret); 215 goto out; 216 } 217 218 pr_info("reset\n"); 219 ret = count; 220 221 out: 222 mutex_unlock(&test_fw_mutex); 223 224 return ret; 225 } 226 static DEVICE_ATTR_WO(reset); 227 228 static ssize_t config_show(struct device *dev, 229 struct device_attribute *attr, 230 char *buf) 231 { 232 int len = 0; 233 234 mutex_lock(&test_fw_mutex); 235 236 len += scnprintf(buf, PAGE_SIZE - len, 237 "Custom trigger configuration for: %s\n", 238 dev_name(dev)); 239 240 if (test_fw_config->name) 241 len += scnprintf(buf+len, PAGE_SIZE - len, 242 "name:\t%s\n", 243 test_fw_config->name); 244 else 245 len += scnprintf(buf+len, PAGE_SIZE - len, 246 "name:\tEMTPY\n"); 247 248 len += scnprintf(buf+len, PAGE_SIZE - len, 249 "num_requests:\t%u\n", test_fw_config->num_requests); 250 251 len += scnprintf(buf+len, PAGE_SIZE - len, 252 "send_uevent:\t\t%s\n", 253 test_fw_config->send_uevent ? 254 "FW_ACTION_HOTPLUG" : 255 "FW_ACTION_NOHOTPLUG"); 256 len += scnprintf(buf+len, PAGE_SIZE - len, 257 "into_buf:\t\t%s\n", 258 test_fw_config->into_buf ? "true" : "false"); 259 len += scnprintf(buf+len, PAGE_SIZE - len, 260 "sync_direct:\t\t%s\n", 261 test_fw_config->sync_direct ? "true" : "false"); 262 len += scnprintf(buf+len, PAGE_SIZE - len, 263 "read_fw_idx:\t%u\n", test_fw_config->read_fw_idx); 264 265 mutex_unlock(&test_fw_mutex); 266 267 return len; 268 } 269 static DEVICE_ATTR_RO(config); 270 271 static ssize_t config_name_store(struct device *dev, 272 struct device_attribute *attr, 273 const char *buf, size_t count) 274 { 275 int ret; 276 277 mutex_lock(&test_fw_mutex); 278 kfree_const(test_fw_config->name); 279 ret = __kstrncpy(&test_fw_config->name, buf, count, GFP_KERNEL); 280 mutex_unlock(&test_fw_mutex); 281 282 return ret; 283 } 284 285 /* 286 * As per sysfs_kf_seq_show() the buf is max PAGE_SIZE. 287 */ 288 static ssize_t config_test_show_str(char *dst, 289 char *src) 290 { 291 int len; 292 293 mutex_lock(&test_fw_mutex); 294 len = snprintf(dst, PAGE_SIZE, "%s\n", src); 295 mutex_unlock(&test_fw_mutex); 296 297 return len; 298 } 299 300 static int test_dev_config_update_bool(const char *buf, size_t size, 301 bool *cfg) 302 { 303 int ret; 304 305 mutex_lock(&test_fw_mutex); 306 if (strtobool(buf, cfg) < 0) 307 ret = -EINVAL; 308 else 309 ret = size; 310 mutex_unlock(&test_fw_mutex); 311 312 return ret; 313 } 314 315 static ssize_t test_dev_config_show_bool(char *buf, bool val) 316 { 317 return snprintf(buf, PAGE_SIZE, "%d\n", val); 318 } 319 320 static ssize_t test_dev_config_show_int(char *buf, int val) 321 { 322 return snprintf(buf, PAGE_SIZE, "%d\n", val); 323 } 324 325 static int test_dev_config_update_u8(const char *buf, size_t size, u8 *cfg) 326 { 327 int ret; 328 long new; 329 330 ret = kstrtol(buf, 10, &new); 331 if (ret) 332 return ret; 333 334 if (new > U8_MAX) 335 return -EINVAL; 336 337 mutex_lock(&test_fw_mutex); 338 *(u8 *)cfg = new; 339 mutex_unlock(&test_fw_mutex); 340 341 /* Always return full write size even if we didn't consume all */ 342 return size; 343 } 344 345 static ssize_t test_dev_config_show_u8(char *buf, u8 val) 346 { 347 return snprintf(buf, PAGE_SIZE, "%u\n", val); 348 } 349 350 static ssize_t config_name_show(struct device *dev, 351 struct device_attribute *attr, 352 char *buf) 353 { 354 return config_test_show_str(buf, test_fw_config->name); 355 } 356 static DEVICE_ATTR_RW(config_name); 357 358 static ssize_t config_num_requests_store(struct device *dev, 359 struct device_attribute *attr, 360 const char *buf, size_t count) 361 { 362 int rc; 363 364 mutex_lock(&test_fw_mutex); 365 if (test_fw_config->reqs) { 366 pr_err("Must call release_all_firmware prior to changing config\n"); 367 rc = -EINVAL; 368 mutex_unlock(&test_fw_mutex); 369 goto out; 370 } 371 mutex_unlock(&test_fw_mutex); 372 373 rc = test_dev_config_update_u8(buf, count, 374 &test_fw_config->num_requests); 375 376 out: 377 return rc; 378 } 379 380 static ssize_t config_num_requests_show(struct device *dev, 381 struct device_attribute *attr, 382 char *buf) 383 { 384 return test_dev_config_show_u8(buf, test_fw_config->num_requests); 385 } 386 static DEVICE_ATTR_RW(config_num_requests); 387 388 static ssize_t config_into_buf_store(struct device *dev, 389 struct device_attribute *attr, 390 const char *buf, size_t count) 391 { 392 return test_dev_config_update_bool(buf, 393 count, 394 &test_fw_config->into_buf); 395 } 396 397 static ssize_t config_into_buf_show(struct device *dev, 398 struct device_attribute *attr, 399 char *buf) 400 { 401 return test_dev_config_show_bool(buf, test_fw_config->into_buf); 402 } 403 static DEVICE_ATTR_RW(config_into_buf); 404 405 static ssize_t config_sync_direct_store(struct device *dev, 406 struct device_attribute *attr, 407 const char *buf, size_t count) 408 { 409 int rc = test_dev_config_update_bool(buf, count, 410 &test_fw_config->sync_direct); 411 412 if (rc == count) 413 test_fw_config->req_firmware = test_fw_config->sync_direct ? 414 request_firmware_direct : 415 request_firmware; 416 return rc; 417 } 418 419 static ssize_t config_sync_direct_show(struct device *dev, 420 struct device_attribute *attr, 421 char *buf) 422 { 423 return test_dev_config_show_bool(buf, test_fw_config->sync_direct); 424 } 425 static DEVICE_ATTR_RW(config_sync_direct); 426 427 static ssize_t config_send_uevent_store(struct device *dev, 428 struct device_attribute *attr, 429 const char *buf, size_t count) 430 { 431 return test_dev_config_update_bool(buf, count, 432 &test_fw_config->send_uevent); 433 } 434 435 static ssize_t config_send_uevent_show(struct device *dev, 436 struct device_attribute *attr, 437 char *buf) 438 { 439 return test_dev_config_show_bool(buf, test_fw_config->send_uevent); 440 } 441 static DEVICE_ATTR_RW(config_send_uevent); 442 443 static ssize_t config_read_fw_idx_store(struct device *dev, 444 struct device_attribute *attr, 445 const char *buf, size_t count) 446 { 447 return test_dev_config_update_u8(buf, count, 448 &test_fw_config->read_fw_idx); 449 } 450 451 static ssize_t config_read_fw_idx_show(struct device *dev, 452 struct device_attribute *attr, 453 char *buf) 454 { 455 return test_dev_config_show_u8(buf, test_fw_config->read_fw_idx); 456 } 457 static DEVICE_ATTR_RW(config_read_fw_idx); 458 459 460 static ssize_t trigger_request_store(struct device *dev, 461 struct device_attribute *attr, 462 const char *buf, size_t count) 463 { 464 int rc; 465 char *name; 466 467 name = kstrndup(buf, count, GFP_KERNEL); 468 if (!name) 469 return -ENOSPC; 470 471 pr_info("loading '%s'\n", name); 472 473 mutex_lock(&test_fw_mutex); 474 release_firmware(test_firmware); 475 test_firmware = NULL; 476 rc = request_firmware(&test_firmware, name, dev); 477 if (rc) { 478 pr_info("load of '%s' failed: %d\n", name, rc); 479 goto out; 480 } 481 pr_info("loaded: %zu\n", test_firmware->size); 482 rc = count; 483 484 out: 485 mutex_unlock(&test_fw_mutex); 486 487 kfree(name); 488 489 return rc; 490 } 491 static DEVICE_ATTR_WO(trigger_request); 492 493 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE 494 extern struct list_head efi_embedded_fw_list; 495 extern bool efi_embedded_fw_checked; 496 497 static ssize_t trigger_request_platform_store(struct device *dev, 498 struct device_attribute *attr, 499 const char *buf, size_t count) 500 { 501 static const u8 test_data[] = { 502 0x55, 0xaa, 0x55, 0xaa, 0x01, 0x02, 0x03, 0x04, 503 0x55, 0xaa, 0x55, 0xaa, 0x05, 0x06, 0x07, 0x08, 504 0x55, 0xaa, 0x55, 0xaa, 0x10, 0x20, 0x30, 0x40, 505 0x55, 0xaa, 0x55, 0xaa, 0x50, 0x60, 0x70, 0x80 506 }; 507 struct efi_embedded_fw efi_embedded_fw; 508 const struct firmware *firmware = NULL; 509 bool saved_efi_embedded_fw_checked; 510 char *name; 511 int rc; 512 513 name = kstrndup(buf, count, GFP_KERNEL); 514 if (!name) 515 return -ENOSPC; 516 517 pr_info("inserting test platform fw '%s'\n", name); 518 efi_embedded_fw.name = name; 519 efi_embedded_fw.data = (void *)test_data; 520 efi_embedded_fw.length = sizeof(test_data); 521 list_add(&efi_embedded_fw.list, &efi_embedded_fw_list); 522 saved_efi_embedded_fw_checked = efi_embedded_fw_checked; 523 efi_embedded_fw_checked = true; 524 525 pr_info("loading '%s'\n", name); 526 rc = firmware_request_platform(&firmware, name, dev); 527 if (rc) { 528 pr_info("load of '%s' failed: %d\n", name, rc); 529 goto out; 530 } 531 if (firmware->size != sizeof(test_data) || 532 memcmp(firmware->data, test_data, sizeof(test_data)) != 0) { 533 pr_info("firmware contents mismatch for '%s'\n", name); 534 rc = -EINVAL; 535 goto out; 536 } 537 pr_info("loaded: %zu\n", firmware->size); 538 rc = count; 539 540 out: 541 efi_embedded_fw_checked = saved_efi_embedded_fw_checked; 542 release_firmware(firmware); 543 list_del(&efi_embedded_fw.list); 544 kfree(name); 545 546 return rc; 547 } 548 static DEVICE_ATTR_WO(trigger_request_platform); 549 #endif 550 551 static DECLARE_COMPLETION(async_fw_done); 552 553 static void trigger_async_request_cb(const struct firmware *fw, void *context) 554 { 555 test_firmware = fw; 556 complete(&async_fw_done); 557 } 558 559 static ssize_t trigger_async_request_store(struct device *dev, 560 struct device_attribute *attr, 561 const char *buf, size_t count) 562 { 563 int rc; 564 char *name; 565 566 name = kstrndup(buf, count, GFP_KERNEL); 567 if (!name) 568 return -ENOSPC; 569 570 pr_info("loading '%s'\n", name); 571 572 mutex_lock(&test_fw_mutex); 573 release_firmware(test_firmware); 574 test_firmware = NULL; 575 rc = request_firmware_nowait(THIS_MODULE, 1, name, dev, GFP_KERNEL, 576 NULL, trigger_async_request_cb); 577 if (rc) { 578 pr_info("async load of '%s' failed: %d\n", name, rc); 579 kfree(name); 580 goto out; 581 } 582 /* Free 'name' ASAP, to test for race conditions */ 583 kfree(name); 584 585 wait_for_completion(&async_fw_done); 586 587 if (test_firmware) { 588 pr_info("loaded: %zu\n", test_firmware->size); 589 rc = count; 590 } else { 591 pr_err("failed to async load firmware\n"); 592 rc = -ENOMEM; 593 } 594 595 out: 596 mutex_unlock(&test_fw_mutex); 597 598 return rc; 599 } 600 static DEVICE_ATTR_WO(trigger_async_request); 601 602 static ssize_t trigger_custom_fallback_store(struct device *dev, 603 struct device_attribute *attr, 604 const char *buf, size_t count) 605 { 606 int rc; 607 char *name; 608 609 name = kstrndup(buf, count, GFP_KERNEL); 610 if (!name) 611 return -ENOSPC; 612 613 pr_info("loading '%s' using custom fallback mechanism\n", name); 614 615 mutex_lock(&test_fw_mutex); 616 release_firmware(test_firmware); 617 test_firmware = NULL; 618 rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG, name, 619 dev, GFP_KERNEL, NULL, 620 trigger_async_request_cb); 621 if (rc) { 622 pr_info("async load of '%s' failed: %d\n", name, rc); 623 kfree(name); 624 goto out; 625 } 626 /* Free 'name' ASAP, to test for race conditions */ 627 kfree(name); 628 629 wait_for_completion(&async_fw_done); 630 631 if (test_firmware) { 632 pr_info("loaded: %zu\n", test_firmware->size); 633 rc = count; 634 } else { 635 pr_err("failed to async load firmware\n"); 636 rc = -ENODEV; 637 } 638 639 out: 640 mutex_unlock(&test_fw_mutex); 641 642 return rc; 643 } 644 static DEVICE_ATTR_WO(trigger_custom_fallback); 645 646 static int test_fw_run_batch_request(void *data) 647 { 648 struct test_batched_req *req = data; 649 650 if (!req) { 651 test_fw_config->test_result = -EINVAL; 652 return -EINVAL; 653 } 654 655 if (test_fw_config->into_buf) { 656 void *test_buf; 657 658 test_buf = kzalloc(TEST_FIRMWARE_BUF_SIZE, GFP_KERNEL); 659 if (!test_buf) 660 return -ENOSPC; 661 662 req->rc = request_firmware_into_buf(&req->fw, 663 req->name, 664 req->dev, 665 test_buf, 666 TEST_FIRMWARE_BUF_SIZE); 667 if (!req->fw) 668 kfree(test_buf); 669 } else { 670 req->rc = test_fw_config->req_firmware(&req->fw, 671 req->name, 672 req->dev); 673 } 674 675 if (req->rc) { 676 pr_info("#%u: batched sync load failed: %d\n", 677 req->idx, req->rc); 678 if (!test_fw_config->test_result) 679 test_fw_config->test_result = req->rc; 680 } else if (req->fw) { 681 req->sent = true; 682 pr_info("#%u: batched sync loaded %zu\n", 683 req->idx, req->fw->size); 684 } 685 complete(&req->completion); 686 687 req->task = NULL; 688 689 return 0; 690 } 691 692 /* 693 * We use a kthread as otherwise the kernel serializes all our sync requests 694 * and we would not be able to mimic batched requests on a sync call. Batched 695 * requests on a sync call can for instance happen on a device driver when 696 * multiple cards are used and firmware loading happens outside of probe. 697 */ 698 static ssize_t trigger_batched_requests_store(struct device *dev, 699 struct device_attribute *attr, 700 const char *buf, size_t count) 701 { 702 struct test_batched_req *req; 703 int rc; 704 u8 i; 705 706 mutex_lock(&test_fw_mutex); 707 708 test_fw_config->reqs = 709 vzalloc(array3_size(sizeof(struct test_batched_req), 710 test_fw_config->num_requests, 2)); 711 if (!test_fw_config->reqs) { 712 rc = -ENOMEM; 713 goto out_unlock; 714 } 715 716 pr_info("batched sync firmware loading '%s' %u times\n", 717 test_fw_config->name, test_fw_config->num_requests); 718 719 for (i = 0; i < test_fw_config->num_requests; i++) { 720 req = &test_fw_config->reqs[i]; 721 req->fw = NULL; 722 req->idx = i; 723 req->name = test_fw_config->name; 724 req->dev = dev; 725 init_completion(&req->completion); 726 req->task = kthread_run(test_fw_run_batch_request, req, 727 "%s-%u", KBUILD_MODNAME, req->idx); 728 if (!req->task || IS_ERR(req->task)) { 729 pr_err("Setting up thread %u failed\n", req->idx); 730 req->task = NULL; 731 rc = -ENOMEM; 732 goto out_bail; 733 } 734 } 735 736 rc = count; 737 738 /* 739 * We require an explicit release to enable more time and delay of 740 * calling release_firmware() to improve our chances of forcing a 741 * batched request. If we instead called release_firmware() right away 742 * then we might miss on an opportunity of having a successful firmware 743 * request pass on the opportunity to be come a batched request. 744 */ 745 746 out_bail: 747 for (i = 0; i < test_fw_config->num_requests; i++) { 748 req = &test_fw_config->reqs[i]; 749 if (req->task || req->sent) 750 wait_for_completion(&req->completion); 751 } 752 753 /* Override any worker error if we had a general setup error */ 754 if (rc < 0) 755 test_fw_config->test_result = rc; 756 757 out_unlock: 758 mutex_unlock(&test_fw_mutex); 759 760 return rc; 761 } 762 static DEVICE_ATTR_WO(trigger_batched_requests); 763 764 /* 765 * We wait for each callback to return with the lock held, no need to lock here 766 */ 767 static void trigger_batched_cb(const struct firmware *fw, void *context) 768 { 769 struct test_batched_req *req = context; 770 771 if (!req) { 772 test_fw_config->test_result = -EINVAL; 773 return; 774 } 775 776 /* forces *some* batched requests to queue up */ 777 if (!req->idx) 778 ssleep(2); 779 780 req->fw = fw; 781 782 /* 783 * Unfortunately the firmware API gives us nothing other than a null FW 784 * if the firmware was not found on async requests. Best we can do is 785 * just assume -ENOENT. A better API would pass the actual return 786 * value to the callback. 787 */ 788 if (!fw && !test_fw_config->test_result) 789 test_fw_config->test_result = -ENOENT; 790 791 complete(&req->completion); 792 } 793 794 static 795 ssize_t trigger_batched_requests_async_store(struct device *dev, 796 struct device_attribute *attr, 797 const char *buf, size_t count) 798 { 799 struct test_batched_req *req; 800 bool send_uevent; 801 int rc; 802 u8 i; 803 804 mutex_lock(&test_fw_mutex); 805 806 test_fw_config->reqs = 807 vzalloc(array3_size(sizeof(struct test_batched_req), 808 test_fw_config->num_requests, 2)); 809 if (!test_fw_config->reqs) { 810 rc = -ENOMEM; 811 goto out; 812 } 813 814 pr_info("batched loading '%s' custom fallback mechanism %u times\n", 815 test_fw_config->name, test_fw_config->num_requests); 816 817 send_uevent = test_fw_config->send_uevent ? FW_ACTION_HOTPLUG : 818 FW_ACTION_NOHOTPLUG; 819 820 for (i = 0; i < test_fw_config->num_requests; i++) { 821 req = &test_fw_config->reqs[i]; 822 req->name = test_fw_config->name; 823 req->fw = NULL; 824 req->idx = i; 825 init_completion(&req->completion); 826 rc = request_firmware_nowait(THIS_MODULE, send_uevent, 827 req->name, 828 dev, GFP_KERNEL, req, 829 trigger_batched_cb); 830 if (rc) { 831 pr_info("#%u: batched async load failed setup: %d\n", 832 i, rc); 833 req->rc = rc; 834 goto out_bail; 835 } else 836 req->sent = true; 837 } 838 839 rc = count; 840 841 out_bail: 842 843 /* 844 * We require an explicit release to enable more time and delay of 845 * calling release_firmware() to improve our chances of forcing a 846 * batched request. If we instead called release_firmware() right away 847 * then we might miss on an opportunity of having a successful firmware 848 * request pass on the opportunity to be come a batched request. 849 */ 850 851 for (i = 0; i < test_fw_config->num_requests; i++) { 852 req = &test_fw_config->reqs[i]; 853 if (req->sent) 854 wait_for_completion(&req->completion); 855 } 856 857 /* Override any worker error if we had a general setup error */ 858 if (rc < 0) 859 test_fw_config->test_result = rc; 860 861 out: 862 mutex_unlock(&test_fw_mutex); 863 864 return rc; 865 } 866 static DEVICE_ATTR_WO(trigger_batched_requests_async); 867 868 static ssize_t test_result_show(struct device *dev, 869 struct device_attribute *attr, 870 char *buf) 871 { 872 return test_dev_config_show_int(buf, test_fw_config->test_result); 873 } 874 static DEVICE_ATTR_RO(test_result); 875 876 static ssize_t release_all_firmware_store(struct device *dev, 877 struct device_attribute *attr, 878 const char *buf, size_t count) 879 { 880 test_release_all_firmware(); 881 return count; 882 } 883 static DEVICE_ATTR_WO(release_all_firmware); 884 885 static ssize_t read_firmware_show(struct device *dev, 886 struct device_attribute *attr, 887 char *buf) 888 { 889 struct test_batched_req *req; 890 u8 idx; 891 ssize_t rc = 0; 892 893 mutex_lock(&test_fw_mutex); 894 895 idx = test_fw_config->read_fw_idx; 896 if (idx >= test_fw_config->num_requests) { 897 rc = -ERANGE; 898 goto out; 899 } 900 901 if (!test_fw_config->reqs) { 902 rc = -EINVAL; 903 goto out; 904 } 905 906 req = &test_fw_config->reqs[idx]; 907 if (!req->fw) { 908 pr_err("#%u: failed to async load firmware\n", idx); 909 rc = -ENOENT; 910 goto out; 911 } 912 913 pr_info("#%u: loaded %zu\n", idx, req->fw->size); 914 915 if (req->fw->size > PAGE_SIZE) { 916 pr_err("Testing interface must use PAGE_SIZE firmware for now\n"); 917 rc = -EINVAL; 918 goto out; 919 } 920 memcpy(buf, req->fw->data, req->fw->size); 921 922 rc = req->fw->size; 923 out: 924 mutex_unlock(&test_fw_mutex); 925 926 return rc; 927 } 928 static DEVICE_ATTR_RO(read_firmware); 929 930 #define TEST_FW_DEV_ATTR(name) &dev_attr_##name.attr 931 932 static struct attribute *test_dev_attrs[] = { 933 TEST_FW_DEV_ATTR(reset), 934 935 TEST_FW_DEV_ATTR(config), 936 TEST_FW_DEV_ATTR(config_name), 937 TEST_FW_DEV_ATTR(config_num_requests), 938 TEST_FW_DEV_ATTR(config_into_buf), 939 TEST_FW_DEV_ATTR(config_sync_direct), 940 TEST_FW_DEV_ATTR(config_send_uevent), 941 TEST_FW_DEV_ATTR(config_read_fw_idx), 942 943 /* These don't use the config at all - they could be ported! */ 944 TEST_FW_DEV_ATTR(trigger_request), 945 TEST_FW_DEV_ATTR(trigger_async_request), 946 TEST_FW_DEV_ATTR(trigger_custom_fallback), 947 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE 948 TEST_FW_DEV_ATTR(trigger_request_platform), 949 #endif 950 951 /* These use the config and can use the test_result */ 952 TEST_FW_DEV_ATTR(trigger_batched_requests), 953 TEST_FW_DEV_ATTR(trigger_batched_requests_async), 954 955 TEST_FW_DEV_ATTR(release_all_firmware), 956 TEST_FW_DEV_ATTR(test_result), 957 TEST_FW_DEV_ATTR(read_firmware), 958 NULL, 959 }; 960 961 ATTRIBUTE_GROUPS(test_dev); 962 963 static struct miscdevice test_fw_misc_device = { 964 .minor = MISC_DYNAMIC_MINOR, 965 .name = "test_firmware", 966 .fops = &test_fw_fops, 967 .groups = test_dev_groups, 968 }; 969 970 static int __init test_firmware_init(void) 971 { 972 int rc; 973 974 test_fw_config = kzalloc(sizeof(struct test_config), GFP_KERNEL); 975 if (!test_fw_config) 976 return -ENOMEM; 977 978 rc = __test_firmware_config_init(); 979 if (rc) { 980 kfree(test_fw_config); 981 pr_err("could not init firmware test config: %d\n", rc); 982 return rc; 983 } 984 985 rc = misc_register(&test_fw_misc_device); 986 if (rc) { 987 kfree(test_fw_config); 988 pr_err("could not register misc device: %d\n", rc); 989 return rc; 990 } 991 992 pr_warn("interface ready\n"); 993 994 return 0; 995 } 996 997 module_init(test_firmware_init); 998 999 static void __exit test_firmware_exit(void) 1000 { 1001 mutex_lock(&test_fw_mutex); 1002 release_firmware(test_firmware); 1003 misc_deregister(&test_fw_misc_device); 1004 __test_firmware_config_free(); 1005 kfree(test_fw_config); 1006 mutex_unlock(&test_fw_mutex); 1007 1008 pr_warn("removed interface\n"); 1009 } 1010 1011 module_exit(test_firmware_exit); 1012 1013 MODULE_AUTHOR("Kees Cook <keescook@chromium.org>"); 1014 MODULE_LICENSE("GPL"); 1015