xref: /linux/lib/test_firmware.c (revision e406d57be7bd2a4e73ea512c1ae36a40a44e499e)
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