Lines Matching +full:firmware +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0
15 #include "firmware.h"
18 * firmware fallback mechanism
38 * use small loading timeout for caching devices' firmware because all these
39 * firmware images have been loaded successfully at lease once, also system is
40 * ready for completing firmware loading now. The maximum size of firmware in
80 struct firmware *fw;
102 struct fw_priv *fw_priv = fw_sysfs->fw_priv; in fw_load_abort()
117 if (!fw_priv->need_uevent || !only_kill_custom) in kill_pending_fw_fallback_reqs()
130 * timeout_store() - set number of seconds to wait for firmware
136 * Sets the number of seconds to wait for the firmware. Once
138 * firmware will be provided.
171 if (add_uevent_var(env, "FIRMWARE=%s", fw_sysfs->fw_priv->fw_name)) in do_firmware_uevent()
172 return -ENOMEM; in do_firmware_uevent()
174 return -ENOMEM; in do_firmware_uevent()
175 if (add_uevent_var(env, "ASYNC=%d", fw_sysfs->nowait)) in do_firmware_uevent()
176 return -ENOMEM; in do_firmware_uevent()
187 if (fw_sysfs->fw_priv) in firmware_uevent()
194 .name = "firmware",
217 if (fw_sysfs->fw_priv) in firmware_loading_show()
218 loading = fw_sysfs_loading(fw_sysfs->fw_priv); in firmware_loading_show()
225 * firmware_loading_store() - set value in the 'loading' control file
235 * -1: Conclude the load with an error and discard any written data.
247 fw_priv = fw_sysfs->fw_priv; in firmware_loading_store()
265 * one same firmware buf, so let all requests in firmware_loading_store()
266 * see the mapped 'buf->data' once the loading in firmware_loading_store()
274 rc = security_kernel_post_load_data(fw_priv->data, in firmware_loading_store()
275 fw_priv->size, in firmware_loading_store()
294 case -1: in firmware_loading_store()
309 memcpy(buffer, fw_priv->data + offset, count); in firmware_rw_data()
311 memcpy(fw_priv->data + offset, buffer, count); in firmware_rw_data()
320 int page_ofs = offset & (PAGE_SIZE-1); in firmware_rw()
321 int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); in firmware_rw()
323 page_data = kmap(fw_priv->pages[page_nr]); in firmware_rw()
330 kunmap(fw_priv->pages[page_nr]); in firmware_rw()
333 count -= page_cnt; in firmware_rw()
347 fw_priv = fw_sysfs->fw_priv; in firmware_data_read()
349 ret_count = -ENODEV; in firmware_data_read()
352 if (offset > fw_priv->size) { in firmware_data_read()
356 if (count > fw_priv->size - offset) in firmware_data_read()
357 count = fw_priv->size - offset; in firmware_data_read()
361 if (fw_priv->data) in firmware_data_read()
375 err = fw_grow_paged_buf(fw_sysfs->fw_priv, in fw_realloc_pages()
383 * firmware_data_write() - write method for firmware
392 * the driver as a firmware image.
404 return -EPERM; in firmware_data_write()
407 fw_priv = fw_sysfs->fw_priv; in firmware_data_write()
409 retval = -ENODEV; in firmware_data_write()
413 if (fw_priv->data) { in firmware_data_write()
414 if (offset + count > fw_priv->allocated_size) { in firmware_data_write()
415 retval = -ENOMEM; in firmware_data_write()
429 fw_priv->size = max_t(size_t, offset + count, fw_priv->size); in firmware_data_write()
436 .attr = { .name = "data", .mode = 0644 },
463 fw_create_instance(struct firmware *firmware, const char *fw_name, in fw_create_instance() argument
471 fw_sysfs = ERR_PTR(-ENOMEM); in fw_create_instance()
475 fw_sysfs->nowait = !!(opt_flags & FW_OPT_NOWAIT); in fw_create_instance()
476 fw_sysfs->fw = firmware; in fw_create_instance()
477 f_dev = &fw_sysfs->dev; in fw_create_instance()
481 f_dev->parent = device; in fw_create_instance()
482 f_dev->class = &firmware_class; in fw_create_instance()
483 f_dev->groups = fw_dev_attr_groups; in fw_create_instance()
489 * fw_load_sysfs_fallback() - load a firmware via the sysfs fallback mechanism
490 * @fw_sysfs: firmware sysfs information for the firmware to load
493 * In charge of constructing a sysfs fallback interface for firmware loading.
498 struct device *f_dev = &fw_sysfs->dev; in fw_load_sysfs_fallback()
499 struct fw_priv *fw_priv = fw_sysfs->fw_priv; in fw_load_sysfs_fallback()
502 if (!fw_priv->data) in fw_load_sysfs_fallback()
503 fw_priv->is_paged_buf = true; in fw_load_sysfs_fallback()
516 retval = -EINTR; in fw_load_sysfs_fallback()
519 list_add(&fw_priv->pending_list, &pending_fw_head); in fw_load_sysfs_fallback()
522 if (fw_priv->opt_flags & FW_OPT_UEVENT) { in fw_load_sysfs_fallback()
523 fw_priv->need_uevent = true; in fw_load_sysfs_fallback()
525 dev_dbg(f_dev, "firmware: requesting %s\n", fw_priv->fw_name); in fw_load_sysfs_fallback()
526 kobject_uevent(&fw_sysfs->dev.kobj, KOBJ_ADD); in fw_load_sysfs_fallback()
532 if (retval < 0 && retval != -ENOENT) { in fw_load_sysfs_fallback()
539 if (retval == -ERESTARTSYS) in fw_load_sysfs_fallback()
540 retval = -EINTR; in fw_load_sysfs_fallback()
541 } else if (fw_priv->is_paged_buf && !fw_priv->data) in fw_load_sysfs_fallback()
542 retval = -ENOMEM; in fw_load_sysfs_fallback()
551 static int fw_load_from_user_helper(struct firmware *firmware, in fw_load_from_user_helper() argument
552 const char *name, struct device *device, in fw_load_from_user_helper() argument
563 dev_dbg(device, "firmware: %s loading timed out\n", in fw_load_from_user_helper()
564 name); in fw_load_from_user_helper()
565 return -EBUSY; in fw_load_from_user_helper()
570 dev_err(device, "firmware: %s will not be loaded\n", in fw_load_from_user_helper()
571 name); in fw_load_from_user_helper()
576 fw_sysfs = fw_create_instance(firmware, name, device, opt_flags); in fw_load_from_user_helper()
582 fw_sysfs->fw_priv = firmware->priv; in fw_load_from_user_helper()
586 ret = assign_fw(firmware, device); in fw_load_from_user_helper()
608 pr_info_once("Ignoring firmware sysfs fallback due to sysctl knob\n"); in fw_run_sysfs_fallback()
615 /* Also permit LSMs and IMA to fail firmware sysfs fallback */ in fw_run_sysfs_fallback()
624 * firmware_fallback_sysfs() - use the fallback mechanism to find firmware
625 * @fw: pointer to firmware image
626 * @name: name of firmware file to look for
627 * @device: device for which firmware is being loaded
628 * @opt_flags: options to control firmware loading behaviour, as defined by
632 * This function is called if direct lookup for the firmware failed, it enables
634 * interface. Userspace is in charge of loading the firmware through the sysfs
645 int firmware_fallback_sysfs(struct firmware *fw, const char *name, in firmware_fallback_sysfs() argument
655 name); in firmware_fallback_sysfs()
658 name); in firmware_fallback_sysfs()
659 return fw_load_from_user_helper(fw, name, device, opt_flags); in firmware_fallback_sysfs()