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