^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/kconfig.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/security.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/umh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/sysctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "fallback.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "firmware.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * firmware fallback mechanism
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) MODULE_IMPORT_NS(FIRMWARE_LOADER_PRIVATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) extern struct firmware_fallback_config fw_fallback_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /* These getters are vetted to use int properly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static inline int __firmware_loading_timeout(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) return fw_fallback_config.loading_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /* These setters are vetted to use int properly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) static void __fw_fallback_set_timeout(int timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) fw_fallback_config.loading_timeout = timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * use small loading timeout for caching devices' firmware because all these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * firmware images have been loaded successfully at lease once, also system is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * ready for completing firmware loading now. The maximum size of firmware in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * current distributions is about 2M bytes, so 10 secs should be enough.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) void fw_fallback_set_cache_timeout(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) fw_fallback_config.old_timeout = __firmware_loading_timeout();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) __fw_fallback_set_timeout(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* Restores the timeout to the value last configured during normal operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) void fw_fallback_set_default_timeout(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) __fw_fallback_set_timeout(fw_fallback_config.old_timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static long firmware_loading_timeout(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) return __firmware_loading_timeout() > 0 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) __firmware_loading_timeout() * HZ : MAX_JIFFY_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static inline bool fw_sysfs_done(struct fw_priv *fw_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) return __fw_state_check(fw_priv, FW_STATUS_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) static inline bool fw_sysfs_loading(struct fw_priv *fw_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return __fw_state_check(fw_priv, FW_STATUS_LOADING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static inline int fw_sysfs_wait_timeout(struct fw_priv *fw_priv, long timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return __fw_state_wait_common(fw_priv, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct fw_sysfs {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) bool nowait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct device dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct fw_priv *fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static struct fw_sysfs *to_fw_sysfs(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return container_of(dev, struct fw_sysfs, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) static void __fw_load_abort(struct fw_priv *fw_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * There is a small window in which user can write to 'loading'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * between loading done/aborted and disappearance of 'loading'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (fw_state_is_aborted(fw_priv) || fw_sysfs_done(fw_priv))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) fw_state_aborted(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static void fw_load_abort(struct fw_sysfs *fw_sysfs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct fw_priv *fw_priv = fw_sysfs->fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) __fw_load_abort(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static LIST_HEAD(pending_fw_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) void kill_pending_fw_fallback_reqs(bool only_kill_custom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct fw_priv *fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct fw_priv *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) list_for_each_entry_safe(fw_priv, next, &pending_fw_head,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) pending_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (!fw_priv->need_uevent || !only_kill_custom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) __fw_load_abort(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static ssize_t timeout_show(struct class *class, struct class_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return sysfs_emit(buf, "%d\n", __firmware_loading_timeout());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * firmware_timeout_store() - set number of seconds to wait for firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * @class: device class pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * @attr: device attribute pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * @buf: buffer to scan for timeout value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * @count: number of bytes in @buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * Sets the number of seconds to wait for the firmware. Once
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * this expires an error will be returned to the driver and no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * firmware will be provided.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * Note: zero means 'wait forever'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static ssize_t timeout_store(struct class *class, struct class_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) int tmp_loading_timeout = simple_strtol(buf, NULL, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) if (tmp_loading_timeout < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) tmp_loading_timeout = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) __fw_fallback_set_timeout(tmp_loading_timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static CLASS_ATTR_RW(timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static struct attribute *firmware_class_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) &class_attr_timeout.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ATTRIBUTE_GROUPS(firmware_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static void fw_dev_release(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) kfree(fw_sysfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static int do_firmware_uevent(struct fw_sysfs *fw_sysfs, struct kobj_uevent_env *env)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (add_uevent_var(env, "FIRMWARE=%s", fw_sysfs->fw_priv->fw_name))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (add_uevent_var(env, "TIMEOUT=%i", __firmware_loading_timeout()))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (add_uevent_var(env, "ASYNC=%d", fw_sysfs->nowait))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (fw_sysfs->fw_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) err = do_firmware_uevent(fw_sysfs, env);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static struct class firmware_class = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .name = "firmware",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .class_groups = firmware_class_groups,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .dev_uevent = firmware_uevent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) .dev_release = fw_dev_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int register_sysfs_loader(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) return class_register(&firmware_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) void unregister_sysfs_loader(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) class_unregister(&firmware_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static ssize_t firmware_loading_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int loading = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (fw_sysfs->fw_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) loading = fw_sysfs_loading(fw_sysfs->fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return sysfs_emit(buf, "%d\n", loading);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * firmware_loading_store() - set value in the 'loading' control file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * @dev: device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * @attr: device attribute pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * @buf: buffer to scan for loading control value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * @count: number of bytes in @buf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * The relevant values are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) * 1: Start a load, discarding any previous partial load.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * 0: Conclude the load and hand the data to the driver code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * -1: Conclude the load with an error and discard any written data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static ssize_t firmware_loading_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct fw_priv *fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) ssize_t written = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) int loading = simple_strtol(buf, NULL, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) fw_priv = fw_sysfs->fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) if (fw_state_is_aborted(fw_priv))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) switch (loading) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /* discarding any previous partial load */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (!fw_sysfs_done(fw_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) fw_free_paged_buf(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) fw_state_start(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (fw_sysfs_loading(fw_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * Several loading requests may be pending on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * one same firmware buf, so let all requests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * see the mapped 'buf->data' once the loading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) * is completed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) * */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) rc = fw_map_paged_buf(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) dev_err(dev, "%s: map pages failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) rc = security_kernel_post_load_data(fw_priv->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) fw_priv->size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) LOADING_FIRMWARE, "blob");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * Same logic as fw_load_abort, only the DONE bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * is ignored and we set ABORT only on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) fw_state_aborted(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) written = rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) fw_state_done(fw_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) dev_err(dev, "%s: unexpected value (%d)\n", __func__, loading);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) case -1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) fw_load_abort(fw_sysfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) return written;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) static DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) static void firmware_rw_data(struct fw_priv *fw_priv, char *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) loff_t offset, size_t count, bool read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) if (read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) memcpy(buffer, fw_priv->data + offset, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) memcpy(fw_priv->data + offset, buffer, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) static void firmware_rw(struct fw_priv *fw_priv, char *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) loff_t offset, size_t count, bool read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) void *page_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) int page_nr = offset >> PAGE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) int page_ofs = offset & (PAGE_SIZE-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) page_data = kmap(fw_priv->pages[page_nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) if (read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) memcpy(buffer, page_data + page_ofs, page_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) memcpy(page_data + page_ofs, buffer, page_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) kunmap(fw_priv->pages[page_nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) buffer += page_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) offset += page_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) count -= page_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct bin_attribute *bin_attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) char *buffer, loff_t offset, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) struct device *dev = kobj_to_dev(kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) struct fw_priv *fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) ssize_t ret_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) fw_priv = fw_sysfs->fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) if (!fw_priv || fw_sysfs_done(fw_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) ret_count = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (offset > fw_priv->size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) ret_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (count > fw_priv->size - offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) count = fw_priv->size - offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) ret_count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) if (fw_priv->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) firmware_rw_data(fw_priv, buffer, offset, count, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) firmware_rw(fw_priv, buffer, offset, count, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) return ret_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) static int fw_realloc_pages(struct fw_sysfs *fw_sysfs, int min_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) err = fw_grow_paged_buf(fw_sysfs->fw_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) PAGE_ALIGN(min_size) >> PAGE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) fw_load_abort(fw_sysfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) * firmware_data_write() - write method for firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) * @filp: open sysfs file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) * @kobj: kobject for the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) * @bin_attr: bin_attr structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) * @buffer: buffer being written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) * @offset: buffer offset for write in total data store area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * @count: buffer size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) * Data written to the 'data' attribute will be later handed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) * the driver as a firmware image.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct bin_attribute *bin_attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) char *buffer, loff_t offset, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) struct device *dev = kobj_to_dev(kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) struct fw_priv *fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) ssize_t retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (!capable(CAP_SYS_RAWIO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) fw_priv = fw_sysfs->fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) if (!fw_priv || fw_sysfs_done(fw_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) if (fw_priv->data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) if (offset + count > fw_priv->allocated_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) firmware_rw_data(fw_priv, buffer, offset, count, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) retval = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) retval = fw_realloc_pages(fw_sysfs, offset + count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) retval = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) firmware_rw(fw_priv, buffer, offset, count, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) fw_priv->size = max_t(size_t, offset + count, fw_priv->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) static struct bin_attribute firmware_attr_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) .attr = { .name = "data", .mode = 0644 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) .size = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) .read = firmware_data_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) .write = firmware_data_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) static struct attribute *fw_dev_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) &dev_attr_loading.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) static struct bin_attribute *fw_dev_bin_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) &firmware_attr_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) static const struct attribute_group fw_dev_attr_group = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) .attrs = fw_dev_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .bin_attrs = fw_dev_bin_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) static const struct attribute_group *fw_dev_attr_groups[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) &fw_dev_attr_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static struct fw_sysfs *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) fw_create_instance(struct firmware *firmware, const char *fw_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) struct device *device, u32 opt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct fw_sysfs *fw_sysfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) struct device *f_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) fw_sysfs = kzalloc(sizeof(*fw_sysfs), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) if (!fw_sysfs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) fw_sysfs = ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) fw_sysfs->nowait = !!(opt_flags & FW_OPT_NOWAIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) fw_sysfs->fw = firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) f_dev = &fw_sysfs->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) device_initialize(f_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) dev_set_name(f_dev, "%s", fw_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) f_dev->parent = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) f_dev->class = &firmware_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) f_dev->groups = fw_dev_attr_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) return fw_sysfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * fw_load_sysfs_fallback() - load a firmware via the sysfs fallback mechanism
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * @fw_sysfs: firmware sysfs information for the firmware to load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * @timeout: timeout to wait for the load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * In charge of constructing a sysfs fallback interface for firmware loading.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs, long timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct device *f_dev = &fw_sysfs->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct fw_priv *fw_priv = fw_sysfs->fw_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) /* fall back on userspace loading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) if (!fw_priv->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) fw_priv->is_paged_buf = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) dev_set_uevent_suppress(f_dev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) retval = device_add(f_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) dev_err(f_dev, "%s: device_register failed\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) goto err_put_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) if (fw_state_is_aborted(fw_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) retval = -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) list_add(&fw_priv->pending_list, &pending_fw_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (fw_priv->opt_flags & FW_OPT_UEVENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) fw_priv->need_uevent = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) dev_set_uevent_suppress(f_dev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) dev_dbg(f_dev, "firmware: requesting %s\n", fw_priv->fw_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) kobject_uevent(&fw_sysfs->dev.kobj, KOBJ_ADD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) timeout = MAX_JIFFY_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) retval = fw_sysfs_wait_timeout(fw_priv, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) if (retval < 0 && retval != -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) mutex_lock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) fw_load_abort(fw_sysfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) mutex_unlock(&fw_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (fw_state_is_aborted(fw_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) if (retval == -ERESTARTSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) retval = -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) } else if (fw_priv->is_paged_buf && !fw_priv->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) device_del(f_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) err_put_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) put_device(f_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) static int fw_load_from_user_helper(struct firmware *firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) const char *name, struct device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) u32 opt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) struct fw_sysfs *fw_sysfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) timeout = firmware_loading_timeout();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) if (opt_flags & FW_OPT_NOWAIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) timeout = usermodehelper_read_lock_wait(timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) if (!timeout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) dev_dbg(device, "firmware: %s loading timed out\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) ret = usermodehelper_read_trylock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) if (WARN_ON(ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) dev_err(device, "firmware: %s will not be loaded\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) fw_sysfs = fw_create_instance(firmware, name, device, opt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) if (IS_ERR(fw_sysfs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) ret = PTR_ERR(fw_sysfs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) fw_sysfs->fw_priv = firmware->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) ret = fw_load_sysfs_fallback(fw_sysfs, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) ret = assign_fw(firmware, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) usermodehelper_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) static bool fw_force_sysfs_fallback(u32 opt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) if (fw_fallback_config.force_sysfs_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) if (!(opt_flags & FW_OPT_USERHELPER))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) static bool fw_run_sysfs_fallback(u32 opt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) if (fw_fallback_config.ignore_sysfs_fallback) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) pr_info_once("Ignoring firmware sysfs fallback due to sysctl knob\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) if ((opt_flags & FW_OPT_NOFALLBACK_SYSFS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) /* Also permit LSMs and IMA to fail firmware sysfs fallback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) ret = security_kernel_load_data(LOADING_FIRMWARE, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) return fw_force_sysfs_fallback(opt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) * firmware_fallback_sysfs() - use the fallback mechanism to find firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) * @fw: pointer to firmware image
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) * @name: name of firmware file to look for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * @device: device for which firmware is being loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) * @opt_flags: options to control firmware loading behaviour, as defined by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) * &enum fw_opt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) * @ret: return value from direct lookup which triggered the fallback mechanism
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) * This function is called if direct lookup for the firmware failed, it enables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) * a fallback mechanism through userspace by exposing a sysfs loading
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) * interface. Userspace is in charge of loading the firmware through the sysfs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) * loading interface. This sysfs fallback mechanism may be disabled completely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) * on a system by setting the proc sysctl value ignore_sysfs_fallback to true.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) * If this is false we check if the internal API caller set the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) * @FW_OPT_NOFALLBACK_SYSFS flag, if so it would also disable the fallback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) * mechanism. A system may want to enforce the sysfs fallback mechanism at all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * times, it can do this by setting ignore_sysfs_fallback to false and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * force_sysfs_fallback to true.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) * Enabling force_sysfs_fallback is functionally equivalent to build a kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) * with CONFIG_FW_LOADER_USER_HELPER_FALLBACK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) int firmware_fallback_sysfs(struct firmware *fw, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) struct device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) u32 opt_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) int ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (!fw_run_sysfs_fallback(opt_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (!(opt_flags & FW_OPT_NO_WARN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) dev_warn(device, "Falling back to sysfs fallback for: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) dev_dbg(device, "Falling back to sysfs fallback for: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) return fw_load_from_user_helper(fw, name, device, opt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) }