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/kstrtox.h>
26 #include <linux/kthread.h>
27 #include <linux/vmalloc.h>
28 #include <linux/efi_embedded_fw.h>
29 #include <linux/string_choices.h>
30
31 MODULE_IMPORT_NS("TEST_FIRMWARE");
32
33 #define TEST_FIRMWARE_NAME "test-firmware.bin"
34 #define TEST_FIRMWARE_NUM_REQS 4
35 #define TEST_FIRMWARE_BUF_SIZE SZ_1K
36 #define TEST_UPLOAD_MAX_SIZE SZ_2K
37 #define TEST_UPLOAD_BLK_SIZE 37 /* Avoid powers of two in testing */
38
39 static DEFINE_MUTEX(test_fw_mutex);
40 static const struct firmware *test_firmware;
41 static LIST_HEAD(test_upload_list);
42
43 struct test_batched_req {
44 u8 idx;
45 int rc;
46 bool sent;
47 const struct firmware *fw;
48 const char *name;
49 const char *fw_buf;
50 struct completion completion;
51 struct task_struct *task;
52 struct device *dev;
53 };
54
55 /**
56 * struct test_config - represents configuration for the test for different triggers
57 *
58 * @name: the name of the firmware file to look for
59 * @into_buf: when the into_buf is used if this is true
60 * request_firmware_into_buf() will be used instead.
61 * @buf_size: size of buf to allocate when into_buf is true
62 * @file_offset: file offset to request when calling request_firmware_into_buf
63 * @partial: partial read opt when calling request_firmware_into_buf
64 * @sync_direct: when the sync trigger is used if this is true
65 * request_firmware_direct() will be used instead.
66 * @send_uevent: whether or not to send a uevent for async requests
67 * @num_requests: number of requests to try per test case. This is trigger
68 * specific.
69 * @reqs: stores all requests information
70 * @read_fw_idx: index of thread from which we want to read firmware results
71 * from through the read_fw trigger.
72 * @upload_name: firmware name to be used with upload_read sysfs node
73 * @test_result: a test may use this to collect the result from the call
74 * of the request_firmware*() calls used in their tests. In order of
75 * priority we always keep first any setup error. If no setup errors were
76 * found then we move on to the first error encountered while running the
77 * API. Note that for async calls this typically will be a successful
78 * result (0) unless of course you've used bogus parameters, or the system
79 * is out of memory. In the async case the callback is expected to do a
80 * bit more homework to figure out what happened, unfortunately the only
81 * information passed today on error is the fact that no firmware was
82 * found so we can only assume -ENOENT on async calls if the firmware is
83 * NULL.
84 *
85 * Errors you can expect:
86 *
87 * API specific:
88 *
89 * 0: success for sync, for async it means request was sent
90 * -EINVAL: invalid parameters or request
91 * -ENOENT: files not found
92 *
93 * System environment:
94 *
95 * -ENOMEM: memory pressure on system
96 * -ENODEV: out of number of devices to test
97 * -EINVAL: an unexpected error has occurred
98 * @req_firmware: if @sync_direct is true this is set to
99 * request_firmware_direct(), otherwise request_firmware()
100 */
101 struct test_config {
102 char *name;
103 bool into_buf;
104 size_t buf_size;
105 size_t file_offset;
106 bool partial;
107 bool sync_direct;
108 bool send_uevent;
109 u8 num_requests;
110 u8 read_fw_idx;
111 char *upload_name;
112
113 /*
114 * These below don't belong her but we'll move them once we create
115 * a struct fw_test_device and stuff the misc_dev under there later.
116 */
117 struct test_batched_req *reqs;
118 int test_result;
119 int (*req_firmware)(const struct firmware **fw, const char *name,
120 struct device *device);
121 };
122
123 struct upload_inject_err {
124 const char *prog;
125 enum fw_upload_err err_code;
126 };
127
128 struct test_firmware_upload {
129 char *name;
130 struct list_head node;
131 char *buf;
132 size_t size;
133 bool cancel_request;
134 struct upload_inject_err inject;
135 struct fw_upload *fwl;
136 };
137
138 static struct test_config *test_fw_config;
139
upload_lookup_name(const char * name)140 static struct test_firmware_upload *upload_lookup_name(const char *name)
141 {
142 struct test_firmware_upload *tst;
143
144 list_for_each_entry(tst, &test_upload_list, node)
145 if (strncmp(name, tst->name, strlen(tst->name)) == 0)
146 return tst;
147
148 return NULL;
149 }
150
test_fw_misc_read(struct file * f,char __user * buf,size_t size,loff_t * offset)151 static ssize_t test_fw_misc_read(struct file *f, char __user *buf,
152 size_t size, loff_t *offset)
153 {
154 ssize_t rc = 0;
155
156 mutex_lock(&test_fw_mutex);
157 if (test_firmware)
158 rc = simple_read_from_buffer(buf, size, offset,
159 test_firmware->data,
160 test_firmware->size);
161 mutex_unlock(&test_fw_mutex);
162 return rc;
163 }
164
165 static const struct file_operations test_fw_fops = {
166 .owner = THIS_MODULE,
167 .read = test_fw_misc_read,
168 };
169
__test_release_all_firmware(void)170 static void __test_release_all_firmware(void)
171 {
172 struct test_batched_req *req;
173 u8 i;
174
175 if (!test_fw_config->reqs)
176 return;
177
178 for (i = 0; i < test_fw_config->num_requests; i++) {
179 req = &test_fw_config->reqs[i];
180 if (req->fw) {
181 if (req->fw_buf) {
182 kfree_const(req->fw_buf);
183 req->fw_buf = NULL;
184 }
185 release_firmware(req->fw);
186 req->fw = NULL;
187 }
188 }
189
190 vfree(test_fw_config->reqs);
191 test_fw_config->reqs = NULL;
192 }
193
test_release_all_firmware(void)194 static void test_release_all_firmware(void)
195 {
196 mutex_lock(&test_fw_mutex);
197 __test_release_all_firmware();
198 mutex_unlock(&test_fw_mutex);
199 }
200
201
__test_firmware_config_free(void)202 static void __test_firmware_config_free(void)
203 {
204 __test_release_all_firmware();
205 kfree_const(test_fw_config->name);
206 test_fw_config->name = NULL;
207 }
208
209 /*
210 * XXX: move to kstrncpy() once merged.
211 *
212 * Users should use kfree_const() when freeing these.
213 */
__kstrncpy(char ** dst,const char * name,size_t count,gfp_t gfp)214 static int __kstrncpy(char **dst, const char *name, size_t count, gfp_t gfp)
215 {
216 *dst = kstrndup(name, count, gfp);
217 if (!*dst)
218 return -ENOMEM;
219 return count;
220 }
221
__test_firmware_config_init(void)222 static int __test_firmware_config_init(void)
223 {
224 int ret;
225
226 ret = __kstrncpy(&test_fw_config->name, TEST_FIRMWARE_NAME,
227 strlen(TEST_FIRMWARE_NAME), GFP_KERNEL);
228 if (ret < 0)
229 goto out;
230
231 test_fw_config->num_requests = TEST_FIRMWARE_NUM_REQS;
232 test_fw_config->send_uevent = true;
233 test_fw_config->into_buf = false;
234 test_fw_config->buf_size = TEST_FIRMWARE_BUF_SIZE;
235 test_fw_config->file_offset = 0;
236 test_fw_config->partial = false;
237 test_fw_config->sync_direct = false;
238 test_fw_config->req_firmware = request_firmware;
239 test_fw_config->test_result = 0;
240 test_fw_config->reqs = NULL;
241 test_fw_config->upload_name = NULL;
242
243 return 0;
244
245 out:
246 __test_firmware_config_free();
247 return ret;
248 }
249
reset_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)250 static ssize_t reset_store(struct device *dev,
251 struct device_attribute *attr,
252 const char *buf, size_t count)
253 {
254 int ret;
255
256 mutex_lock(&test_fw_mutex);
257
258 __test_firmware_config_free();
259
260 ret = __test_firmware_config_init();
261 if (ret < 0) {
262 ret = -ENOMEM;
263 pr_err("could not alloc settings for config trigger: %d\n",
264 ret);
265 goto out;
266 }
267
268 pr_info("reset\n");
269 ret = count;
270
271 out:
272 mutex_unlock(&test_fw_mutex);
273
274 return ret;
275 }
276 static DEVICE_ATTR_WO(reset);
277
config_show(struct device * dev,struct device_attribute * attr,char * buf)278 static ssize_t config_show(struct device *dev,
279 struct device_attribute *attr,
280 char *buf)
281 {
282 int len = 0;
283
284 mutex_lock(&test_fw_mutex);
285
286 len += scnprintf(buf, PAGE_SIZE - len,
287 "Custom trigger configuration for: %s\n",
288 dev_name(dev));
289
290 if (test_fw_config->name)
291 len += scnprintf(buf + len, PAGE_SIZE - len,
292 "name:\t%s\n",
293 test_fw_config->name);
294 else
295 len += scnprintf(buf + len, PAGE_SIZE - len,
296 "name:\tEMPTY\n");
297
298 len += scnprintf(buf + len, PAGE_SIZE - len,
299 "num_requests:\t%u\n", test_fw_config->num_requests);
300
301 len += scnprintf(buf + len, PAGE_SIZE - len,
302 "send_uevent:\t\t%s\n",
303 test_fw_config->send_uevent ?
304 "FW_ACTION_UEVENT" :
305 "FW_ACTION_NOUEVENT");
306 len += scnprintf(buf + len, PAGE_SIZE - len,
307 "into_buf:\t\t%s\n",
308 str_true_false(test_fw_config->into_buf));
309 len += scnprintf(buf + len, PAGE_SIZE - len,
310 "buf_size:\t%zu\n", test_fw_config->buf_size);
311 len += scnprintf(buf + len, PAGE_SIZE - len,
312 "file_offset:\t%zu\n", test_fw_config->file_offset);
313 len += scnprintf(buf + len, PAGE_SIZE - len,
314 "partial:\t\t%s\n",
315 str_true_false(test_fw_config->partial));
316 len += scnprintf(buf + len, PAGE_SIZE - len,
317 "sync_direct:\t\t%s\n",
318 str_true_false(test_fw_config->sync_direct));
319 len += scnprintf(buf + len, PAGE_SIZE - len,
320 "read_fw_idx:\t%u\n", test_fw_config->read_fw_idx);
321 if (test_fw_config->upload_name)
322 len += scnprintf(buf + len, PAGE_SIZE - len,
323 "upload_name:\t%s\n",
324 test_fw_config->upload_name);
325 else
326 len += scnprintf(buf + len, PAGE_SIZE - len,
327 "upload_name:\tEMPTY\n");
328
329 mutex_unlock(&test_fw_mutex);
330
331 return len;
332 }
333 static DEVICE_ATTR_RO(config);
334
config_name_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)335 static ssize_t config_name_store(struct device *dev,
336 struct device_attribute *attr,
337 const char *buf, size_t count)
338 {
339 int ret;
340
341 mutex_lock(&test_fw_mutex);
342 kfree_const(test_fw_config->name);
343 ret = __kstrncpy(&test_fw_config->name, buf, count, GFP_KERNEL);
344 mutex_unlock(&test_fw_mutex);
345
346 return ret;
347 }
348
349 /*
350 * As per sysfs_kf_seq_show() the buf is max PAGE_SIZE.
351 */
config_test_show_str(char * dst,char * src)352 static ssize_t config_test_show_str(char *dst,
353 char *src)
354 {
355 int len;
356
357 mutex_lock(&test_fw_mutex);
358 len = snprintf(dst, PAGE_SIZE, "%s\n", src);
359 mutex_unlock(&test_fw_mutex);
360
361 return len;
362 }
363
__test_dev_config_update_bool(const char * buf,size_t size,bool * cfg)364 static inline int __test_dev_config_update_bool(const char *buf, size_t size,
365 bool *cfg)
366 {
367 int ret;
368
369 if (kstrtobool(buf, cfg) < 0)
370 ret = -EINVAL;
371 else
372 ret = size;
373
374 return ret;
375 }
376
test_dev_config_update_bool(const char * buf,size_t size,bool * cfg)377 static int test_dev_config_update_bool(const char *buf, size_t size,
378 bool *cfg)
379 {
380 int ret;
381
382 mutex_lock(&test_fw_mutex);
383 ret = __test_dev_config_update_bool(buf, size, cfg);
384 mutex_unlock(&test_fw_mutex);
385
386 return ret;
387 }
388
test_dev_config_show_bool(char * buf,bool val)389 static ssize_t test_dev_config_show_bool(char *buf, bool val)
390 {
391 return snprintf(buf, PAGE_SIZE, "%d\n", val);
392 }
393
__test_dev_config_update_size_t(const char * buf,size_t size,size_t * cfg)394 static int __test_dev_config_update_size_t(
395 const char *buf,
396 size_t size,
397 size_t *cfg)
398 {
399 int ret;
400 long new;
401
402 ret = kstrtol(buf, 10, &new);
403 if (ret)
404 return ret;
405
406 *(size_t *)cfg = new;
407
408 /* Always return full write size even if we didn't consume all */
409 return size;
410 }
411
test_dev_config_show_size_t(char * buf,size_t val)412 static ssize_t test_dev_config_show_size_t(char *buf, size_t val)
413 {
414 return snprintf(buf, PAGE_SIZE, "%zu\n", val);
415 }
416
test_dev_config_show_int(char * buf,int val)417 static ssize_t test_dev_config_show_int(char *buf, int val)
418 {
419 return snprintf(buf, PAGE_SIZE, "%d\n", val);
420 }
421
__test_dev_config_update_u8(const char * buf,size_t size,u8 * cfg)422 static int __test_dev_config_update_u8(const char *buf, size_t size, u8 *cfg)
423 {
424 u8 val;
425 int ret;
426
427 ret = kstrtou8(buf, 10, &val);
428 if (ret)
429 return ret;
430
431 *(u8 *)cfg = val;
432
433 /* Always return full write size even if we didn't consume all */
434 return size;
435 }
436
test_dev_config_update_u8(const char * buf,size_t size,u8 * cfg)437 static int test_dev_config_update_u8(const char *buf, size_t size, u8 *cfg)
438 {
439 int ret;
440
441 mutex_lock(&test_fw_mutex);
442 ret = __test_dev_config_update_u8(buf, size, cfg);
443 mutex_unlock(&test_fw_mutex);
444
445 return ret;
446 }
447
test_dev_config_show_u8(char * buf,u8 val)448 static ssize_t test_dev_config_show_u8(char *buf, u8 val)
449 {
450 return snprintf(buf, PAGE_SIZE, "%u\n", val);
451 }
452
config_name_show(struct device * dev,struct device_attribute * attr,char * buf)453 static ssize_t config_name_show(struct device *dev,
454 struct device_attribute *attr,
455 char *buf)
456 {
457 return config_test_show_str(buf, test_fw_config->name);
458 }
459 static DEVICE_ATTR_RW(config_name);
460
config_upload_name_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)461 static ssize_t config_upload_name_store(struct device *dev,
462 struct device_attribute *attr,
463 const char *buf, size_t count)
464 {
465 struct test_firmware_upload *tst;
466 int ret = count;
467
468 mutex_lock(&test_fw_mutex);
469 tst = upload_lookup_name(buf);
470 if (tst)
471 test_fw_config->upload_name = tst->name;
472 else
473 ret = -EINVAL;
474 mutex_unlock(&test_fw_mutex);
475
476 return ret;
477 }
478
config_upload_name_show(struct device * dev,struct device_attribute * attr,char * buf)479 static ssize_t config_upload_name_show(struct device *dev,
480 struct device_attribute *attr,
481 char *buf)
482 {
483 return config_test_show_str(buf, test_fw_config->upload_name);
484 }
485 static DEVICE_ATTR_RW(config_upload_name);
486
config_num_requests_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)487 static ssize_t config_num_requests_store(struct device *dev,
488 struct device_attribute *attr,
489 const char *buf, size_t count)
490 {
491 int rc;
492
493 mutex_lock(&test_fw_mutex);
494 if (test_fw_config->reqs) {
495 pr_err("Must call release_all_firmware prior to changing config\n");
496 rc = -EINVAL;
497 mutex_unlock(&test_fw_mutex);
498 goto out;
499 }
500
501 rc = __test_dev_config_update_u8(buf, count,
502 &test_fw_config->num_requests);
503 mutex_unlock(&test_fw_mutex);
504
505 out:
506 return rc;
507 }
508
config_num_requests_show(struct device * dev,struct device_attribute * attr,char * buf)509 static ssize_t config_num_requests_show(struct device *dev,
510 struct device_attribute *attr,
511 char *buf)
512 {
513 return test_dev_config_show_u8(buf, test_fw_config->num_requests);
514 }
515 static DEVICE_ATTR_RW(config_num_requests);
516
config_into_buf_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)517 static ssize_t config_into_buf_store(struct device *dev,
518 struct device_attribute *attr,
519 const char *buf, size_t count)
520 {
521 return test_dev_config_update_bool(buf,
522 count,
523 &test_fw_config->into_buf);
524 }
525
config_into_buf_show(struct device * dev,struct device_attribute * attr,char * buf)526 static ssize_t config_into_buf_show(struct device *dev,
527 struct device_attribute *attr,
528 char *buf)
529 {
530 return test_dev_config_show_bool(buf, test_fw_config->into_buf);
531 }
532 static DEVICE_ATTR_RW(config_into_buf);
533
config_buf_size_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)534 static ssize_t config_buf_size_store(struct device *dev,
535 struct device_attribute *attr,
536 const char *buf, size_t count)
537 {
538 int rc;
539
540 mutex_lock(&test_fw_mutex);
541 if (test_fw_config->reqs) {
542 pr_err("Must call release_all_firmware prior to changing config\n");
543 rc = -EINVAL;
544 mutex_unlock(&test_fw_mutex);
545 goto out;
546 }
547
548 rc = __test_dev_config_update_size_t(buf, count,
549 &test_fw_config->buf_size);
550 mutex_unlock(&test_fw_mutex);
551
552 out:
553 return rc;
554 }
555
config_buf_size_show(struct device * dev,struct device_attribute * attr,char * buf)556 static ssize_t config_buf_size_show(struct device *dev,
557 struct device_attribute *attr,
558 char *buf)
559 {
560 return test_dev_config_show_size_t(buf, test_fw_config->buf_size);
561 }
562 static DEVICE_ATTR_RW(config_buf_size);
563
config_file_offset_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)564 static ssize_t config_file_offset_store(struct device *dev,
565 struct device_attribute *attr,
566 const char *buf, size_t count)
567 {
568 int rc;
569
570 mutex_lock(&test_fw_mutex);
571 if (test_fw_config->reqs) {
572 pr_err("Must call release_all_firmware prior to changing config\n");
573 rc = -EINVAL;
574 mutex_unlock(&test_fw_mutex);
575 goto out;
576 }
577
578 rc = __test_dev_config_update_size_t(buf, count,
579 &test_fw_config->file_offset);
580 mutex_unlock(&test_fw_mutex);
581
582 out:
583 return rc;
584 }
585
config_file_offset_show(struct device * dev,struct device_attribute * attr,char * buf)586 static ssize_t config_file_offset_show(struct device *dev,
587 struct device_attribute *attr,
588 char *buf)
589 {
590 return test_dev_config_show_size_t(buf, test_fw_config->file_offset);
591 }
592 static DEVICE_ATTR_RW(config_file_offset);
593
config_partial_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)594 static ssize_t config_partial_store(struct device *dev,
595 struct device_attribute *attr,
596 const char *buf, size_t count)
597 {
598 return test_dev_config_update_bool(buf,
599 count,
600 &test_fw_config->partial);
601 }
602
config_partial_show(struct device * dev,struct device_attribute * attr,char * buf)603 static ssize_t config_partial_show(struct device *dev,
604 struct device_attribute *attr,
605 char *buf)
606 {
607 return test_dev_config_show_bool(buf, test_fw_config->partial);
608 }
609 static DEVICE_ATTR_RW(config_partial);
610
config_sync_direct_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)611 static ssize_t config_sync_direct_store(struct device *dev,
612 struct device_attribute *attr,
613 const char *buf, size_t count)
614 {
615 int rc = test_dev_config_update_bool(buf, count,
616 &test_fw_config->sync_direct);
617
618 if (rc == count)
619 test_fw_config->req_firmware = test_fw_config->sync_direct ?
620 request_firmware_direct :
621 request_firmware;
622 return rc;
623 }
624
config_sync_direct_show(struct device * dev,struct device_attribute * attr,char * buf)625 static ssize_t config_sync_direct_show(struct device *dev,
626 struct device_attribute *attr,
627 char *buf)
628 {
629 return test_dev_config_show_bool(buf, test_fw_config->sync_direct);
630 }
631 static DEVICE_ATTR_RW(config_sync_direct);
632
config_send_uevent_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)633 static ssize_t config_send_uevent_store(struct device *dev,
634 struct device_attribute *attr,
635 const char *buf, size_t count)
636 {
637 return test_dev_config_update_bool(buf, count,
638 &test_fw_config->send_uevent);
639 }
640
config_send_uevent_show(struct device * dev,struct device_attribute * attr,char * buf)641 static ssize_t config_send_uevent_show(struct device *dev,
642 struct device_attribute *attr,
643 char *buf)
644 {
645 return test_dev_config_show_bool(buf, test_fw_config->send_uevent);
646 }
647 static DEVICE_ATTR_RW(config_send_uevent);
648
config_read_fw_idx_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)649 static ssize_t config_read_fw_idx_store(struct device *dev,
650 struct device_attribute *attr,
651 const char *buf, size_t count)
652 {
653 return test_dev_config_update_u8(buf, count,
654 &test_fw_config->read_fw_idx);
655 }
656
config_read_fw_idx_show(struct device * dev,struct device_attribute * attr,char * buf)657 static ssize_t config_read_fw_idx_show(struct device *dev,
658 struct device_attribute *attr,
659 char *buf)
660 {
661 return test_dev_config_show_u8(buf, test_fw_config->read_fw_idx);
662 }
663 static DEVICE_ATTR_RW(config_read_fw_idx);
664
665
trigger_request_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)666 static ssize_t trigger_request_store(struct device *dev,
667 struct device_attribute *attr,
668 const char *buf, size_t count)
669 {
670 int rc;
671 char *name;
672
673 name = kstrndup(buf, count, GFP_KERNEL);
674 if (!name)
675 return -ENOMEM;
676
677 pr_info("loading '%s'\n", name);
678
679 mutex_lock(&test_fw_mutex);
680 release_firmware(test_firmware);
681 if (test_fw_config->reqs)
682 __test_release_all_firmware();
683 test_firmware = NULL;
684 rc = request_firmware(&test_firmware, name, dev);
685 if (rc) {
686 pr_info("load of '%s' failed: %d\n", name, rc);
687 goto out;
688 }
689 pr_info("loaded: %zu\n", test_firmware->size);
690 rc = count;
691
692 out:
693 mutex_unlock(&test_fw_mutex);
694
695 kfree(name);
696
697 return rc;
698 }
699 static DEVICE_ATTR_WO(trigger_request);
700
701 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
702 extern struct list_head efi_embedded_fw_list;
703 extern bool efi_embedded_fw_checked;
704
trigger_request_platform_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)705 static ssize_t trigger_request_platform_store(struct device *dev,
706 struct device_attribute *attr,
707 const char *buf, size_t count)
708 {
709 static const u8 test_data[] = {
710 0x55, 0xaa, 0x55, 0xaa, 0x01, 0x02, 0x03, 0x04,
711 0x55, 0xaa, 0x55, 0xaa, 0x05, 0x06, 0x07, 0x08,
712 0x55, 0xaa, 0x55, 0xaa, 0x10, 0x20, 0x30, 0x40,
713 0x55, 0xaa, 0x55, 0xaa, 0x50, 0x60, 0x70, 0x80
714 };
715 struct efi_embedded_fw efi_embedded_fw;
716 const struct firmware *firmware = NULL;
717 bool saved_efi_embedded_fw_checked;
718 char *name;
719 int rc;
720
721 name = kstrndup(buf, count, GFP_KERNEL);
722 if (!name)
723 return -ENOMEM;
724
725 pr_info("inserting test platform fw '%s'\n", name);
726 efi_embedded_fw.name = name;
727 efi_embedded_fw.data = (void *)test_data;
728 efi_embedded_fw.length = sizeof(test_data);
729 list_add(&efi_embedded_fw.list, &efi_embedded_fw_list);
730 saved_efi_embedded_fw_checked = efi_embedded_fw_checked;
731 efi_embedded_fw_checked = true;
732
733 pr_info("loading '%s'\n", name);
734 rc = firmware_request_platform(&firmware, name, dev);
735 if (rc) {
736 pr_info("load of '%s' failed: %d\n", name, rc);
737 goto out;
738 }
739 if (firmware->size != sizeof(test_data) ||
740 memcmp(firmware->data, test_data, sizeof(test_data)) != 0) {
741 pr_info("firmware contents mismatch for '%s'\n", name);
742 rc = -EINVAL;
743 goto out;
744 }
745 pr_info("loaded: %zu\n", firmware->size);
746 rc = count;
747
748 out:
749 efi_embedded_fw_checked = saved_efi_embedded_fw_checked;
750 release_firmware(firmware);
751 list_del(&efi_embedded_fw.list);
752 kfree(name);
753
754 return rc;
755 }
756 static DEVICE_ATTR_WO(trigger_request_platform);
757 #endif
758
759 static DECLARE_COMPLETION(async_fw_done);
760
trigger_async_request_cb(const struct firmware * fw,void * context)761 static void trigger_async_request_cb(const struct firmware *fw, void *context)
762 {
763 test_firmware = fw;
764 complete(&async_fw_done);
765 }
766
trigger_async_request_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)767 static ssize_t trigger_async_request_store(struct device *dev,
768 struct device_attribute *attr,
769 const char *buf, size_t count)
770 {
771 int rc;
772 char *name;
773
774 name = kstrndup(buf, count, GFP_KERNEL);
775 if (!name)
776 return -ENOMEM;
777
778 pr_info("loading '%s'\n", name);
779
780 mutex_lock(&test_fw_mutex);
781 release_firmware(test_firmware);
782 test_firmware = NULL;
783 if (test_fw_config->reqs)
784 __test_release_all_firmware();
785 rc = request_firmware_nowait(THIS_MODULE, 1, name, dev, GFP_KERNEL,
786 NULL, trigger_async_request_cb);
787 if (rc) {
788 pr_info("async load of '%s' failed: %d\n", name, rc);
789 kfree(name);
790 goto out;
791 }
792 /* Free 'name' ASAP, to test for race conditions */
793 kfree(name);
794
795 wait_for_completion(&async_fw_done);
796
797 if (test_firmware) {
798 pr_info("loaded: %zu\n", test_firmware->size);
799 rc = count;
800 } else {
801 pr_err("failed to async load firmware\n");
802 rc = -ENOMEM;
803 }
804
805 out:
806 mutex_unlock(&test_fw_mutex);
807
808 return rc;
809 }
810 static DEVICE_ATTR_WO(trigger_async_request);
811
trigger_custom_fallback_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)812 static ssize_t trigger_custom_fallback_store(struct device *dev,
813 struct device_attribute *attr,
814 const char *buf, size_t count)
815 {
816 int rc;
817 char *name;
818
819 name = kstrndup(buf, count, GFP_KERNEL);
820 if (!name)
821 return -ENOMEM;
822
823 pr_info("loading '%s' using custom fallback mechanism\n", name);
824
825 mutex_lock(&test_fw_mutex);
826 release_firmware(test_firmware);
827 if (test_fw_config->reqs)
828 __test_release_all_firmware();
829 test_firmware = NULL;
830 rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, name,
831 dev, GFP_KERNEL, NULL,
832 trigger_async_request_cb);
833 if (rc) {
834 pr_info("async load of '%s' failed: %d\n", name, rc);
835 kfree(name);
836 goto out;
837 }
838 /* Free 'name' ASAP, to test for race conditions */
839 kfree(name);
840
841 wait_for_completion(&async_fw_done);
842
843 if (test_firmware) {
844 pr_info("loaded: %zu\n", test_firmware->size);
845 rc = count;
846 } else {
847 pr_err("failed to async load firmware\n");
848 rc = -ENODEV;
849 }
850
851 out:
852 mutex_unlock(&test_fw_mutex);
853
854 return rc;
855 }
856 static DEVICE_ATTR_WO(trigger_custom_fallback);
857
test_fw_run_batch_request(void * data)858 static int test_fw_run_batch_request(void *data)
859 {
860 struct test_batched_req *req = data;
861
862 if (!req) {
863 test_fw_config->test_result = -EINVAL;
864 return -EINVAL;
865 }
866
867 if (test_fw_config->into_buf) {
868 void *test_buf;
869
870 test_buf = kzalloc(TEST_FIRMWARE_BUF_SIZE, GFP_KERNEL);
871 if (!test_buf)
872 return -ENOMEM;
873
874 if (test_fw_config->partial)
875 req->rc = request_partial_firmware_into_buf
876 (&req->fw,
877 req->name,
878 req->dev,
879 test_buf,
880 test_fw_config->buf_size,
881 test_fw_config->file_offset);
882 else
883 req->rc = request_firmware_into_buf
884 (&req->fw,
885 req->name,
886 req->dev,
887 test_buf,
888 test_fw_config->buf_size);
889 if (!req->fw)
890 kfree(test_buf);
891 else
892 req->fw_buf = test_buf;
893 } else {
894 req->rc = test_fw_config->req_firmware(&req->fw,
895 req->name,
896 req->dev);
897 }
898
899 if (req->rc) {
900 pr_info("#%u: batched sync load failed: %d\n",
901 req->idx, req->rc);
902 if (!test_fw_config->test_result)
903 test_fw_config->test_result = req->rc;
904 } else if (req->fw) {
905 req->sent = true;
906 pr_info("#%u: batched sync loaded %zu\n",
907 req->idx, req->fw->size);
908 }
909 complete(&req->completion);
910
911 req->task = NULL;
912
913 return 0;
914 }
915
916 /*
917 * We use a kthread as otherwise the kernel serializes all our sync requests
918 * and we would not be able to mimic batched requests on a sync call. Batched
919 * requests on a sync call can for instance happen on a device driver when
920 * multiple cards are used and firmware loading happens outside of probe.
921 */
trigger_batched_requests_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)922 static ssize_t trigger_batched_requests_store(struct device *dev,
923 struct device_attribute *attr,
924 const char *buf, size_t count)
925 {
926 struct test_batched_req *req;
927 int rc;
928 u8 i;
929
930 mutex_lock(&test_fw_mutex);
931
932 if (test_fw_config->reqs) {
933 rc = -EBUSY;
934 goto out_bail;
935 }
936
937 test_fw_config->reqs =
938 vzalloc(array3_size(sizeof(struct test_batched_req),
939 test_fw_config->num_requests, 2));
940 if (!test_fw_config->reqs) {
941 rc = -ENOMEM;
942 goto out_unlock;
943 }
944
945 pr_info("batched sync firmware loading '%s' %u times\n",
946 test_fw_config->name, test_fw_config->num_requests);
947
948 for (i = 0; i < test_fw_config->num_requests; i++) {
949 req = &test_fw_config->reqs[i];
950 req->fw = NULL;
951 req->idx = i;
952 req->name = test_fw_config->name;
953 req->fw_buf = NULL;
954 req->dev = dev;
955 init_completion(&req->completion);
956 req->task = kthread_run(test_fw_run_batch_request, req,
957 "%s-%u", KBUILD_MODNAME, req->idx);
958 if (!req->task || IS_ERR(req->task)) {
959 pr_err("Setting up thread %u failed\n", req->idx);
960 req->task = NULL;
961 rc = -ENOMEM;
962 goto out_bail;
963 }
964 }
965
966 rc = count;
967
968 /*
969 * We require an explicit release to enable more time and delay of
970 * calling release_firmware() to improve our chances of forcing a
971 * batched request. If we instead called release_firmware() right away
972 * then we might miss on an opportunity of having a successful firmware
973 * request pass on the opportunity to be come a batched request.
974 */
975
976 out_bail:
977 for (i = 0; i < test_fw_config->num_requests; i++) {
978 req = &test_fw_config->reqs[i];
979 if (req->task || req->sent)
980 wait_for_completion(&req->completion);
981 }
982
983 /* Override any worker error if we had a general setup error */
984 if (rc < 0)
985 test_fw_config->test_result = rc;
986
987 out_unlock:
988 mutex_unlock(&test_fw_mutex);
989
990 return rc;
991 }
992 static DEVICE_ATTR_WO(trigger_batched_requests);
993
994 /*
995 * We wait for each callback to return with the lock held, no need to lock here
996 */
trigger_batched_cb(const struct firmware * fw,void * context)997 static void trigger_batched_cb(const struct firmware *fw, void *context)
998 {
999 struct test_batched_req *req = context;
1000
1001 if (!req) {
1002 test_fw_config->test_result = -EINVAL;
1003 return;
1004 }
1005
1006 /* forces *some* batched requests to queue up */
1007 if (!req->idx)
1008 ssleep(2);
1009
1010 req->fw = fw;
1011
1012 /*
1013 * Unfortunately the firmware API gives us nothing other than a null FW
1014 * if the firmware was not found on async requests. Best we can do is
1015 * just assume -ENOENT. A better API would pass the actual return
1016 * value to the callback.
1017 */
1018 if (!fw && !test_fw_config->test_result)
1019 test_fw_config->test_result = -ENOENT;
1020
1021 complete(&req->completion);
1022 }
1023
1024 static
trigger_batched_requests_async_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1025 ssize_t trigger_batched_requests_async_store(struct device *dev,
1026 struct device_attribute *attr,
1027 const char *buf, size_t count)
1028 {
1029 struct test_batched_req *req;
1030 bool send_uevent;
1031 int rc;
1032 u8 i;
1033
1034 mutex_lock(&test_fw_mutex);
1035
1036 if (test_fw_config->reqs) {
1037 rc = -EBUSY;
1038 goto out_bail;
1039 }
1040
1041 test_fw_config->reqs =
1042 vzalloc(array3_size(sizeof(struct test_batched_req),
1043 test_fw_config->num_requests, 2));
1044 if (!test_fw_config->reqs) {
1045 rc = -ENOMEM;
1046 goto out;
1047 }
1048
1049 pr_info("batched loading '%s' custom fallback mechanism %u times\n",
1050 test_fw_config->name, test_fw_config->num_requests);
1051
1052 send_uevent = test_fw_config->send_uevent ? FW_ACTION_UEVENT :
1053 FW_ACTION_NOUEVENT;
1054
1055 for (i = 0; i < test_fw_config->num_requests; i++) {
1056 req = &test_fw_config->reqs[i];
1057 req->name = test_fw_config->name;
1058 req->fw_buf = NULL;
1059 req->fw = NULL;
1060 req->idx = i;
1061 init_completion(&req->completion);
1062 rc = request_firmware_nowait(THIS_MODULE, send_uevent,
1063 req->name,
1064 dev, GFP_KERNEL, req,
1065 trigger_batched_cb);
1066 if (rc) {
1067 pr_info("#%u: batched async load failed setup: %d\n",
1068 i, rc);
1069 req->rc = rc;
1070 goto out_bail;
1071 } else
1072 req->sent = true;
1073 }
1074
1075 rc = count;
1076
1077 out_bail:
1078
1079 /*
1080 * We require an explicit release to enable more time and delay of
1081 * calling release_firmware() to improve our chances of forcing a
1082 * batched request. If we instead called release_firmware() right away
1083 * then we might miss on an opportunity of having a successful firmware
1084 * request pass on the opportunity to be come a batched request.
1085 */
1086
1087 for (i = 0; i < test_fw_config->num_requests; i++) {
1088 req = &test_fw_config->reqs[i];
1089 if (req->sent)
1090 wait_for_completion(&req->completion);
1091 }
1092
1093 /* Override any worker error if we had a general setup error */
1094 if (rc < 0)
1095 test_fw_config->test_result = rc;
1096
1097 out:
1098 mutex_unlock(&test_fw_mutex);
1099
1100 return rc;
1101 }
1102 static DEVICE_ATTR_WO(trigger_batched_requests_async);
1103
upload_release(struct test_firmware_upload * tst)1104 static void upload_release(struct test_firmware_upload *tst)
1105 {
1106 firmware_upload_unregister(tst->fwl);
1107 kfree(tst->buf);
1108 kfree(tst->name);
1109 kfree(tst);
1110 }
1111
upload_release_all(void)1112 static void upload_release_all(void)
1113 {
1114 struct test_firmware_upload *tst, *tmp;
1115
1116 list_for_each_entry_safe(tst, tmp, &test_upload_list, node) {
1117 list_del(&tst->node);
1118 upload_release(tst);
1119 }
1120 test_fw_config->upload_name = NULL;
1121 }
1122
1123 /*
1124 * This table is replicated from .../firmware_loader/sysfs_upload.c
1125 * and needs to be kept in sync.
1126 */
1127 static const char * const fw_upload_err_str[] = {
1128 [FW_UPLOAD_ERR_NONE] = "none",
1129 [FW_UPLOAD_ERR_HW_ERROR] = "hw-error",
1130 [FW_UPLOAD_ERR_TIMEOUT] = "timeout",
1131 [FW_UPLOAD_ERR_CANCELED] = "user-abort",
1132 [FW_UPLOAD_ERR_BUSY] = "device-busy",
1133 [FW_UPLOAD_ERR_INVALID_SIZE] = "invalid-file-size",
1134 [FW_UPLOAD_ERR_RW_ERROR] = "read-write-error",
1135 [FW_UPLOAD_ERR_WEAROUT] = "flash-wearout",
1136 [FW_UPLOAD_ERR_FW_INVALID] = "firmware-invalid",
1137 };
1138
upload_err_inject_error(struct test_firmware_upload * tst,const u8 * p,const char * prog)1139 static void upload_err_inject_error(struct test_firmware_upload *tst,
1140 const u8 *p, const char *prog)
1141 {
1142 enum fw_upload_err err;
1143
1144 for (err = FW_UPLOAD_ERR_NONE + 1; err < FW_UPLOAD_ERR_MAX; err++) {
1145 if (strncmp(p, fw_upload_err_str[err],
1146 strlen(fw_upload_err_str[err])) == 0) {
1147 tst->inject.prog = prog;
1148 tst->inject.err_code = err;
1149 return;
1150 }
1151 }
1152 }
1153
upload_err_inject_prog(struct test_firmware_upload * tst,const u8 * p)1154 static void upload_err_inject_prog(struct test_firmware_upload *tst,
1155 const u8 *p)
1156 {
1157 static const char * const progs[] = {
1158 "preparing:", "transferring:", "programming:"
1159 };
1160 int i;
1161
1162 for (i = 0; i < ARRAY_SIZE(progs); i++) {
1163 if (strncmp(p, progs[i], strlen(progs[i])) == 0) {
1164 upload_err_inject_error(tst, p + strlen(progs[i]),
1165 progs[i]);
1166 return;
1167 }
1168 }
1169 }
1170
1171 #define FIVE_MINUTES_MS (5 * 60 * 1000)
1172 static enum fw_upload_err
fw_upload_wait_on_cancel(struct test_firmware_upload * tst)1173 fw_upload_wait_on_cancel(struct test_firmware_upload *tst)
1174 {
1175 int ms_delay;
1176
1177 for (ms_delay = 0; ms_delay < FIVE_MINUTES_MS; ms_delay += 100) {
1178 msleep(100);
1179 if (tst->cancel_request)
1180 return FW_UPLOAD_ERR_CANCELED;
1181 }
1182 return FW_UPLOAD_ERR_NONE;
1183 }
1184
test_fw_upload_prepare(struct fw_upload * fwl,const u8 * data,u32 size)1185 static enum fw_upload_err test_fw_upload_prepare(struct fw_upload *fwl,
1186 const u8 *data, u32 size)
1187 {
1188 struct test_firmware_upload *tst = fwl->dd_handle;
1189 enum fw_upload_err ret = FW_UPLOAD_ERR_NONE;
1190 const char *progress = "preparing:";
1191
1192 tst->cancel_request = false;
1193
1194 if (!size || size > TEST_UPLOAD_MAX_SIZE) {
1195 ret = FW_UPLOAD_ERR_INVALID_SIZE;
1196 goto err_out;
1197 }
1198
1199 if (strncmp(data, "inject:", strlen("inject:")) == 0)
1200 upload_err_inject_prog(tst, data + strlen("inject:"));
1201
1202 memset(tst->buf, 0, TEST_UPLOAD_MAX_SIZE);
1203 tst->size = size;
1204
1205 if (tst->inject.err_code == FW_UPLOAD_ERR_NONE ||
1206 strncmp(tst->inject.prog, progress, strlen(progress)) != 0)
1207 return FW_UPLOAD_ERR_NONE;
1208
1209 if (tst->inject.err_code == FW_UPLOAD_ERR_CANCELED)
1210 ret = fw_upload_wait_on_cancel(tst);
1211 else
1212 ret = tst->inject.err_code;
1213
1214 err_out:
1215 /*
1216 * The cleanup op only executes if the prepare op succeeds.
1217 * If the prepare op fails, it must do it's own clean-up.
1218 */
1219 tst->inject.err_code = FW_UPLOAD_ERR_NONE;
1220 tst->inject.prog = NULL;
1221
1222 return ret;
1223 }
1224
test_fw_upload_write(struct fw_upload * fwl,const u8 * data,u32 offset,u32 size,u32 * written)1225 static enum fw_upload_err test_fw_upload_write(struct fw_upload *fwl,
1226 const u8 *data, u32 offset,
1227 u32 size, u32 *written)
1228 {
1229 struct test_firmware_upload *tst = fwl->dd_handle;
1230 const char *progress = "transferring:";
1231 u32 blk_size;
1232
1233 if (tst->cancel_request)
1234 return FW_UPLOAD_ERR_CANCELED;
1235
1236 blk_size = min_t(u32, TEST_UPLOAD_BLK_SIZE, size);
1237 memcpy(tst->buf + offset, data + offset, blk_size);
1238
1239 *written = blk_size;
1240
1241 if (tst->inject.err_code == FW_UPLOAD_ERR_NONE ||
1242 strncmp(tst->inject.prog, progress, strlen(progress)) != 0)
1243 return FW_UPLOAD_ERR_NONE;
1244
1245 if (tst->inject.err_code == FW_UPLOAD_ERR_CANCELED)
1246 return fw_upload_wait_on_cancel(tst);
1247
1248 return tst->inject.err_code;
1249 }
1250
test_fw_upload_complete(struct fw_upload * fwl)1251 static enum fw_upload_err test_fw_upload_complete(struct fw_upload *fwl)
1252 {
1253 struct test_firmware_upload *tst = fwl->dd_handle;
1254 const char *progress = "programming:";
1255
1256 if (tst->cancel_request)
1257 return FW_UPLOAD_ERR_CANCELED;
1258
1259 if (tst->inject.err_code == FW_UPLOAD_ERR_NONE ||
1260 strncmp(tst->inject.prog, progress, strlen(progress)) != 0)
1261 return FW_UPLOAD_ERR_NONE;
1262
1263 if (tst->inject.err_code == FW_UPLOAD_ERR_CANCELED)
1264 return fw_upload_wait_on_cancel(tst);
1265
1266 return tst->inject.err_code;
1267 }
1268
test_fw_upload_cancel(struct fw_upload * fwl)1269 static void test_fw_upload_cancel(struct fw_upload *fwl)
1270 {
1271 struct test_firmware_upload *tst = fwl->dd_handle;
1272
1273 tst->cancel_request = true;
1274 }
1275
test_fw_cleanup(struct fw_upload * fwl)1276 static void test_fw_cleanup(struct fw_upload *fwl)
1277 {
1278 struct test_firmware_upload *tst = fwl->dd_handle;
1279
1280 tst->inject.err_code = FW_UPLOAD_ERR_NONE;
1281 tst->inject.prog = NULL;
1282 }
1283
1284 static const struct fw_upload_ops upload_test_ops = {
1285 .prepare = test_fw_upload_prepare,
1286 .write = test_fw_upload_write,
1287 .poll_complete = test_fw_upload_complete,
1288 .cancel = test_fw_upload_cancel,
1289 .cleanup = test_fw_cleanup
1290 };
1291
upload_register_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1292 static ssize_t upload_register_store(struct device *dev,
1293 struct device_attribute *attr,
1294 const char *buf, size_t count)
1295 {
1296 struct test_firmware_upload *tst;
1297 struct fw_upload *fwl;
1298 char *name;
1299 int ret;
1300
1301 name = kstrndup(buf, count, GFP_KERNEL);
1302 if (!name)
1303 return -ENOMEM;
1304
1305 mutex_lock(&test_fw_mutex);
1306 tst = upload_lookup_name(name);
1307 if (tst) {
1308 ret = -EEXIST;
1309 goto free_name;
1310 }
1311
1312 tst = kzalloc(sizeof(*tst), GFP_KERNEL);
1313 if (!tst) {
1314 ret = -ENOMEM;
1315 goto free_name;
1316 }
1317
1318 tst->name = name;
1319 tst->buf = kzalloc(TEST_UPLOAD_MAX_SIZE, GFP_KERNEL);
1320 if (!tst->buf) {
1321 ret = -ENOMEM;
1322 goto free_tst;
1323 }
1324
1325 fwl = firmware_upload_register(THIS_MODULE, dev, tst->name,
1326 &upload_test_ops, tst);
1327 if (IS_ERR(fwl)) {
1328 ret = PTR_ERR(fwl);
1329 goto free_buf;
1330 }
1331
1332 tst->fwl = fwl;
1333 list_add_tail(&tst->node, &test_upload_list);
1334 mutex_unlock(&test_fw_mutex);
1335 return count;
1336
1337 free_buf:
1338 kfree(tst->buf);
1339
1340 free_tst:
1341 kfree(tst);
1342
1343 free_name:
1344 mutex_unlock(&test_fw_mutex);
1345 kfree(name);
1346
1347 return ret;
1348 }
1349 static DEVICE_ATTR_WO(upload_register);
1350
upload_unregister_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1351 static ssize_t upload_unregister_store(struct device *dev,
1352 struct device_attribute *attr,
1353 const char *buf, size_t count)
1354 {
1355 struct test_firmware_upload *tst;
1356 int ret = count;
1357
1358 mutex_lock(&test_fw_mutex);
1359 tst = upload_lookup_name(buf);
1360 if (!tst) {
1361 ret = -EINVAL;
1362 goto out;
1363 }
1364
1365 if (test_fw_config->upload_name == tst->name)
1366 test_fw_config->upload_name = NULL;
1367
1368 list_del(&tst->node);
1369 upload_release(tst);
1370
1371 out:
1372 mutex_unlock(&test_fw_mutex);
1373 return ret;
1374 }
1375 static DEVICE_ATTR_WO(upload_unregister);
1376
test_result_show(struct device * dev,struct device_attribute * attr,char * buf)1377 static ssize_t test_result_show(struct device *dev,
1378 struct device_attribute *attr,
1379 char *buf)
1380 {
1381 return test_dev_config_show_int(buf, test_fw_config->test_result);
1382 }
1383 static DEVICE_ATTR_RO(test_result);
1384
release_all_firmware_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1385 static ssize_t release_all_firmware_store(struct device *dev,
1386 struct device_attribute *attr,
1387 const char *buf, size_t count)
1388 {
1389 test_release_all_firmware();
1390 return count;
1391 }
1392 static DEVICE_ATTR_WO(release_all_firmware);
1393
read_firmware_show(struct device * dev,struct device_attribute * attr,char * buf)1394 static ssize_t read_firmware_show(struct device *dev,
1395 struct device_attribute *attr,
1396 char *buf)
1397 {
1398 struct test_batched_req *req;
1399 u8 idx;
1400 ssize_t rc = 0;
1401
1402 mutex_lock(&test_fw_mutex);
1403
1404 idx = test_fw_config->read_fw_idx;
1405 if (idx >= test_fw_config->num_requests) {
1406 rc = -ERANGE;
1407 goto out;
1408 }
1409
1410 if (!test_fw_config->reqs) {
1411 rc = -EINVAL;
1412 goto out;
1413 }
1414
1415 req = &test_fw_config->reqs[idx];
1416 if (!req->fw) {
1417 pr_err("#%u: failed to async load firmware\n", idx);
1418 rc = -ENOENT;
1419 goto out;
1420 }
1421
1422 pr_info("#%u: loaded %zu\n", idx, req->fw->size);
1423
1424 if (req->fw->size > PAGE_SIZE) {
1425 pr_err("Testing interface must use PAGE_SIZE firmware for now\n");
1426 rc = -EINVAL;
1427 goto out;
1428 }
1429 memcpy(buf, req->fw->data, req->fw->size);
1430
1431 rc = req->fw->size;
1432 out:
1433 mutex_unlock(&test_fw_mutex);
1434
1435 return rc;
1436 }
1437 static DEVICE_ATTR_RO(read_firmware);
1438
upload_read_show(struct device * dev,struct device_attribute * attr,char * buf)1439 static ssize_t upload_read_show(struct device *dev,
1440 struct device_attribute *attr,
1441 char *buf)
1442 {
1443 struct test_firmware_upload *tst = NULL;
1444 struct test_firmware_upload *tst_iter;
1445 int ret = -EINVAL;
1446
1447 if (!test_fw_config->upload_name) {
1448 pr_err("Set config_upload_name before using upload_read\n");
1449 return -EINVAL;
1450 }
1451
1452 mutex_lock(&test_fw_mutex);
1453 list_for_each_entry(tst_iter, &test_upload_list, node)
1454 if (tst_iter->name == test_fw_config->upload_name) {
1455 tst = tst_iter;
1456 break;
1457 }
1458
1459 if (!tst) {
1460 pr_err("Firmware name not found: %s\n",
1461 test_fw_config->upload_name);
1462 goto out;
1463 }
1464
1465 if (tst->size > PAGE_SIZE) {
1466 pr_err("Testing interface must use PAGE_SIZE firmware for now\n");
1467 goto out;
1468 }
1469
1470 memcpy(buf, tst->buf, tst->size);
1471 ret = tst->size;
1472 out:
1473 mutex_unlock(&test_fw_mutex);
1474 return ret;
1475 }
1476 static DEVICE_ATTR_RO(upload_read);
1477
1478 #define TEST_FW_DEV_ATTR(name) &dev_attr_##name.attr
1479
1480 static struct attribute *test_dev_attrs[] = {
1481 TEST_FW_DEV_ATTR(reset),
1482
1483 TEST_FW_DEV_ATTR(config),
1484 TEST_FW_DEV_ATTR(config_name),
1485 TEST_FW_DEV_ATTR(config_num_requests),
1486 TEST_FW_DEV_ATTR(config_into_buf),
1487 TEST_FW_DEV_ATTR(config_buf_size),
1488 TEST_FW_DEV_ATTR(config_file_offset),
1489 TEST_FW_DEV_ATTR(config_partial),
1490 TEST_FW_DEV_ATTR(config_sync_direct),
1491 TEST_FW_DEV_ATTR(config_send_uevent),
1492 TEST_FW_DEV_ATTR(config_read_fw_idx),
1493 TEST_FW_DEV_ATTR(config_upload_name),
1494
1495 /* These don't use the config at all - they could be ported! */
1496 TEST_FW_DEV_ATTR(trigger_request),
1497 TEST_FW_DEV_ATTR(trigger_async_request),
1498 TEST_FW_DEV_ATTR(trigger_custom_fallback),
1499 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
1500 TEST_FW_DEV_ATTR(trigger_request_platform),
1501 #endif
1502
1503 /* These use the config and can use the test_result */
1504 TEST_FW_DEV_ATTR(trigger_batched_requests),
1505 TEST_FW_DEV_ATTR(trigger_batched_requests_async),
1506
1507 TEST_FW_DEV_ATTR(release_all_firmware),
1508 TEST_FW_DEV_ATTR(test_result),
1509 TEST_FW_DEV_ATTR(read_firmware),
1510 TEST_FW_DEV_ATTR(upload_read),
1511 TEST_FW_DEV_ATTR(upload_register),
1512 TEST_FW_DEV_ATTR(upload_unregister),
1513 NULL,
1514 };
1515
1516 ATTRIBUTE_GROUPS(test_dev);
1517
1518 static struct miscdevice test_fw_misc_device = {
1519 .minor = MISC_DYNAMIC_MINOR,
1520 .name = "test_firmware",
1521 .fops = &test_fw_fops,
1522 .groups = test_dev_groups,
1523 };
1524
test_firmware_init(void)1525 static int __init test_firmware_init(void)
1526 {
1527 int rc;
1528
1529 test_fw_config = kzalloc(sizeof(struct test_config), GFP_KERNEL);
1530 if (!test_fw_config)
1531 return -ENOMEM;
1532
1533 rc = __test_firmware_config_init();
1534 if (rc) {
1535 kfree(test_fw_config);
1536 pr_err("could not init firmware test config: %d\n", rc);
1537 return rc;
1538 }
1539
1540 rc = misc_register(&test_fw_misc_device);
1541 if (rc) {
1542 __test_firmware_config_free();
1543 kfree(test_fw_config);
1544 pr_err("could not register misc device: %d\n", rc);
1545 return rc;
1546 }
1547
1548 pr_warn("interface ready\n");
1549
1550 return 0;
1551 }
1552
1553 module_init(test_firmware_init);
1554
test_firmware_exit(void)1555 static void __exit test_firmware_exit(void)
1556 {
1557 mutex_lock(&test_fw_mutex);
1558 release_firmware(test_firmware);
1559 misc_deregister(&test_fw_misc_device);
1560 upload_release_all();
1561 __test_firmware_config_free();
1562 kfree(test_fw_config);
1563 mutex_unlock(&test_fw_mutex);
1564
1565 pr_warn("removed interface\n");
1566 }
1567
1568 module_exit(test_firmware_exit);
1569
1570 MODULE_AUTHOR("Kees Cook <keescook@chromium.org>");
1571 MODULE_DESCRIPTION("interface to trigger and test firmware loading");
1572 MODULE_LICENSE("GPL");
1573