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