test_firmware.c 37 KB

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