• Home
  • Raw
  • Download

Lines Matching +full:firmware +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
14 #include "firmware.h"
17 * firmware fallback mechanism
35 * use small loading timeout for caching devices' firmware because all these
36 * firmware images have been loaded successfully at lease once, also system is
37 * ready for completing firmware loading now. The maximum size of firmware in
77 struct firmware *fw;
94 list_del_init(&fw_priv->pending_list); in __fw_load_abort()
100 struct fw_priv *fw_priv = fw_sysfs->fw_priv; in fw_load_abort()
115 if (!fw_priv->need_uevent || !only_kill_custom) in kill_pending_fw_fallback_reqs()
128 * firmware_timeout_store() - set number of seconds to wait for firmware
134 * Sets the number of seconds to wait for the firmware. Once
136 * firmware will be provided.
169 if (add_uevent_var(env, "FIRMWARE=%s", fw_sysfs->fw_priv->fw_name)) in do_firmware_uevent()
170 return -ENOMEM; in do_firmware_uevent()
172 return -ENOMEM; in do_firmware_uevent()
173 if (add_uevent_var(env, "ASYNC=%d", fw_sysfs->nowait)) in do_firmware_uevent()
174 return -ENOMEM; in do_firmware_uevent()
185 if (fw_sysfs->fw_priv) in firmware_uevent()
192 .name = "firmware",
215 if (fw_sysfs->fw_priv) in firmware_loading_show()
216 loading = fw_sysfs_loading(fw_sysfs->fw_priv); in firmware_loading_show()
225 if (!fw_priv->is_paged_buf) in map_fw_priv_pages()
228 vunmap(fw_priv->data); in map_fw_priv_pages()
229 fw_priv->data = vmap(fw_priv->pages, fw_priv->nr_pages, 0, in map_fw_priv_pages()
231 if (!fw_priv->data) in map_fw_priv_pages()
232 return -ENOMEM; in map_fw_priv_pages()
237 * firmware_loading_store() - set value in the 'loading' control file
247 * -1: Conclude the load with an error and discard any written data.
260 fw_priv = fw_sysfs->fw_priv; in firmware_loading_store()
268 for (i = 0; i < fw_priv->nr_pages; i++) in firmware_loading_store()
269 __free_page(fw_priv->pages[i]); in firmware_loading_store()
270 vfree(fw_priv->pages); in firmware_loading_store()
271 fw_priv->pages = NULL; in firmware_loading_store()
272 fw_priv->page_array_size = 0; in firmware_loading_store()
273 fw_priv->nr_pages = 0; in firmware_loading_store()
283 * one same firmware buf, so let all requests in firmware_loading_store()
284 * see the mapped 'buf->data' once the loading in firmware_loading_store()
293 fw_priv->data, fw_priv->size, in firmware_loading_store()
300 list_del_init(&fw_priv->pending_list); in firmware_loading_store()
313 case -1: in firmware_loading_store()
328 memcpy(buffer, fw_priv->data + offset, count); in firmware_rw_data()
330 memcpy(fw_priv->data + offset, buffer, count); in firmware_rw_data()
339 int page_ofs = offset & (PAGE_SIZE-1); in firmware_rw()
340 int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); in firmware_rw()
342 page_data = kmap(fw_priv->pages[page_nr]); in firmware_rw()
349 kunmap(fw_priv->pages[page_nr]); in firmware_rw()
352 count -= page_cnt; in firmware_rw()
366 fw_priv = fw_sysfs->fw_priv; in firmware_data_read()
368 ret_count = -ENODEV; in firmware_data_read()
371 if (offset > fw_priv->size) { in firmware_data_read()
375 if (count > fw_priv->size - offset) in firmware_data_read()
376 count = fw_priv->size - offset; in firmware_data_read()
380 if (fw_priv->data) in firmware_data_read()
392 struct fw_priv *fw_priv= fw_sysfs->fw_priv; in fw_realloc_pages()
396 if (fw_priv->page_array_size < pages_needed) { in fw_realloc_pages()
398 fw_priv->page_array_size * 2); in fw_realloc_pages()
404 return -ENOMEM; in fw_realloc_pages()
406 memcpy(new_pages, fw_priv->pages, in fw_realloc_pages()
407 fw_priv->page_array_size * sizeof(void *)); in fw_realloc_pages()
408 memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) * in fw_realloc_pages()
409 (new_array_size - fw_priv->page_array_size)); in fw_realloc_pages()
410 vfree(fw_priv->pages); in fw_realloc_pages()
411 fw_priv->pages = new_pages; in fw_realloc_pages()
412 fw_priv->page_array_size = new_array_size; in fw_realloc_pages()
415 while (fw_priv->nr_pages < pages_needed) { in fw_realloc_pages()
416 fw_priv->pages[fw_priv->nr_pages] = in fw_realloc_pages()
419 if (!fw_priv->pages[fw_priv->nr_pages]) { in fw_realloc_pages()
421 return -ENOMEM; in fw_realloc_pages()
423 fw_priv->nr_pages++; in fw_realloc_pages()
429 * firmware_data_write() - write method for firmware
438 * the driver as a firmware image.
450 return -EPERM; in firmware_data_write()
453 fw_priv = fw_sysfs->fw_priv; in firmware_data_write()
455 retval = -ENODEV; in firmware_data_write()
459 if (fw_priv->data) { in firmware_data_write()
460 if (offset + count > fw_priv->allocated_size) { in firmware_data_write()
461 retval = -ENOMEM; in firmware_data_write()
475 fw_priv->size = max_t(size_t, offset + count, fw_priv->size); in firmware_data_write()
482 .attr = { .name = "data", .mode = 0644 },
509 fw_create_instance(struct firmware *firmware, const char *fw_name, in fw_create_instance() argument
517 fw_sysfs = ERR_PTR(-ENOMEM); in fw_create_instance()
521 fw_sysfs->nowait = !!(opt_flags & FW_OPT_NOWAIT); in fw_create_instance()
522 fw_sysfs->fw = firmware; in fw_create_instance()
523 f_dev = &fw_sysfs->dev; in fw_create_instance()
527 f_dev->parent = device; in fw_create_instance()
528 f_dev->class = &firmware_class; in fw_create_instance()
529 f_dev->groups = fw_dev_attr_groups; in fw_create_instance()
535 * fw_load_sysfs_fallback() - load a firmware via the sysfs fallback mechanism
536 * @fw_sysfs: firmware sysfs information for the firmware to load
540 * In charge of constructing a sysfs fallback interface for firmware loading.
546 struct device *f_dev = &fw_sysfs->dev; in fw_load_sysfs_fallback()
547 struct fw_priv *fw_priv = fw_sysfs->fw_priv; in fw_load_sysfs_fallback()
550 if (!fw_priv->data) in fw_load_sysfs_fallback()
551 fw_priv->is_paged_buf = true; in fw_load_sysfs_fallback()
562 list_add(&fw_priv->pending_list, &pending_fw_head); in fw_load_sysfs_fallback()
566 fw_priv->need_uevent = true; in fw_load_sysfs_fallback()
568 dev_dbg(f_dev, "firmware: requesting %s\n", fw_priv->fw_name); in fw_load_sysfs_fallback()
569 kobject_uevent(&fw_sysfs->dev.kobj, KOBJ_ADD); in fw_load_sysfs_fallback()
575 if (retval < 0 && retval != -ENOENT) { in fw_load_sysfs_fallback()
582 if (retval == -ERESTARTSYS) in fw_load_sysfs_fallback()
583 retval = -EINTR; in fw_load_sysfs_fallback()
585 retval = -EAGAIN; in fw_load_sysfs_fallback()
586 } else if (fw_priv->is_paged_buf && !fw_priv->data) in fw_load_sysfs_fallback()
587 retval = -ENOMEM; in fw_load_sysfs_fallback()
595 static int fw_load_from_user_helper(struct firmware *firmware, in fw_load_from_user_helper() argument
596 const char *name, struct device *device, in fw_load_from_user_helper() argument
607 dev_dbg(device, "firmware: %s loading timed out\n", in fw_load_from_user_helper()
608 name); in fw_load_from_user_helper()
609 return -EBUSY; in fw_load_from_user_helper()
614 dev_err(device, "firmware: %s will not be loaded\n", in fw_load_from_user_helper()
615 name); in fw_load_from_user_helper()
620 fw_sysfs = fw_create_instance(firmware, name, device, opt_flags); in fw_load_from_user_helper()
626 fw_sysfs->fw_priv = firmware->priv; in fw_load_from_user_helper()
630 ret = assign_fw(firmware, device, opt_flags); in fw_load_from_user_helper()
652 pr_info_once("Ignoring firmware sysfs fallback due to sysctl knob\n"); in fw_run_sysfs_fallback()
659 /* Also permit LSMs and IMA to fail firmware sysfs fallback */ in fw_run_sysfs_fallback()
668 * firmware_fallback_sysfs() - use the fallback mechanism to find firmware
669 * @fw: pointer to firmware image
670 * @name: name of firmware file to look for
671 * @device: device for which firmware is being loaded
672 * @opt_flags: options to control firmware loading behaviour
675 * This function is called if direct lookup for the firmware failed, it enables
677 * interface. Userspace is in charge of loading the firmware through the syfs
687 int firmware_fallback_sysfs(struct firmware *fw, const char *name, in firmware_fallback_sysfs() argument
697 name); in firmware_fallback_sysfs()
700 name); in firmware_fallback_sysfs()
701 return fw_load_from_user_helper(fw, name, device, opt_flags); in firmware_fallback_sysfs()