0001
0002
0003 #include <linux/highmem.h>
0004 #include <linux/module.h>
0005 #include <linux/security.h>
0006 #include <linux/slab.h>
0007 #include <linux/types.h>
0008
0009 #include "sysfs.h"
0010
0011
0012
0013
0014
0015 void __fw_load_abort(struct fw_priv *fw_priv)
0016 {
0017
0018
0019
0020
0021 if (fw_state_is_aborted(fw_priv) || fw_state_is_done(fw_priv))
0022 return;
0023
0024 fw_state_aborted(fw_priv);
0025 }
0026
0027 #ifdef CONFIG_FW_LOADER_USER_HELPER
0028 static ssize_t timeout_show(struct class *class, struct class_attribute *attr,
0029 char *buf)
0030 {
0031 return sysfs_emit(buf, "%d\n", __firmware_loading_timeout());
0032 }
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 static ssize_t timeout_store(struct class *class, struct class_attribute *attr,
0048 const char *buf, size_t count)
0049 {
0050 int tmp_loading_timeout = simple_strtol(buf, NULL, 10);
0051
0052 if (tmp_loading_timeout < 0)
0053 tmp_loading_timeout = 0;
0054
0055 __fw_fallback_set_timeout(tmp_loading_timeout);
0056
0057 return count;
0058 }
0059 static CLASS_ATTR_RW(timeout);
0060
0061 static struct attribute *firmware_class_attrs[] = {
0062 &class_attr_timeout.attr,
0063 NULL,
0064 };
0065 ATTRIBUTE_GROUPS(firmware_class);
0066
0067 static int do_firmware_uevent(struct fw_sysfs *fw_sysfs, struct kobj_uevent_env *env)
0068 {
0069 if (add_uevent_var(env, "FIRMWARE=%s", fw_sysfs->fw_priv->fw_name))
0070 return -ENOMEM;
0071 if (add_uevent_var(env, "TIMEOUT=%i", __firmware_loading_timeout()))
0072 return -ENOMEM;
0073 if (add_uevent_var(env, "ASYNC=%d", fw_sysfs->nowait))
0074 return -ENOMEM;
0075
0076 return 0;
0077 }
0078
0079 static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
0080 {
0081 struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
0082 int err = 0;
0083
0084 mutex_lock(&fw_lock);
0085 if (fw_sysfs->fw_priv)
0086 err = do_firmware_uevent(fw_sysfs, env);
0087 mutex_unlock(&fw_lock);
0088 return err;
0089 }
0090 #endif
0091
0092 static void fw_dev_release(struct device *dev)
0093 {
0094 struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
0095
0096 if (fw_sysfs->fw_upload_priv)
0097 fw_upload_free(fw_sysfs);
0098
0099 kfree(fw_sysfs);
0100 }
0101
0102 static struct class firmware_class = {
0103 .name = "firmware",
0104 #ifdef CONFIG_FW_LOADER_USER_HELPER
0105 .class_groups = firmware_class_groups,
0106 .dev_uevent = firmware_uevent,
0107 #endif
0108 .dev_release = fw_dev_release,
0109 };
0110
0111 int register_sysfs_loader(void)
0112 {
0113 int ret = class_register(&firmware_class);
0114
0115 if (ret != 0)
0116 return ret;
0117 return register_firmware_config_sysctl();
0118 }
0119
0120 void unregister_sysfs_loader(void)
0121 {
0122 unregister_firmware_config_sysctl();
0123 class_unregister(&firmware_class);
0124 }
0125
0126 static ssize_t firmware_loading_show(struct device *dev,
0127 struct device_attribute *attr, char *buf)
0128 {
0129 struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
0130 int loading = 0;
0131
0132 mutex_lock(&fw_lock);
0133 if (fw_sysfs->fw_priv)
0134 loading = fw_state_is_loading(fw_sysfs->fw_priv);
0135 mutex_unlock(&fw_lock);
0136
0137 return sysfs_emit(buf, "%d\n", loading);
0138 }
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 static ssize_t firmware_loading_store(struct device *dev,
0154 struct device_attribute *attr,
0155 const char *buf, size_t count)
0156 {
0157 struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
0158 struct fw_priv *fw_priv;
0159 ssize_t written = count;
0160 int loading = simple_strtol(buf, NULL, 10);
0161
0162 mutex_lock(&fw_lock);
0163 fw_priv = fw_sysfs->fw_priv;
0164 if (fw_state_is_aborted(fw_priv) || fw_state_is_done(fw_priv))
0165 goto out;
0166
0167 switch (loading) {
0168 case 1:
0169
0170 fw_free_paged_buf(fw_priv);
0171 fw_state_start(fw_priv);
0172 break;
0173 case 0:
0174 if (fw_state_is_loading(fw_priv)) {
0175 int rc;
0176
0177
0178
0179
0180
0181
0182
0183 rc = fw_map_paged_buf(fw_priv);
0184 if (rc)
0185 dev_err(dev, "%s: map pages failed\n",
0186 __func__);
0187 else
0188 rc = security_kernel_post_load_data(fw_priv->data,
0189 fw_priv->size,
0190 LOADING_FIRMWARE,
0191 "blob");
0192
0193
0194
0195
0196
0197 if (rc) {
0198 fw_state_aborted(fw_priv);
0199 written = rc;
0200 } else {
0201 fw_state_done(fw_priv);
0202
0203
0204
0205
0206
0207 rc = fw_upload_start(fw_sysfs);
0208 if (rc)
0209 written = rc;
0210 }
0211 break;
0212 }
0213 fallthrough;
0214 default:
0215 dev_err(dev, "%s: unexpected value (%d)\n", __func__, loading);
0216 fallthrough;
0217 case -1:
0218 fw_load_abort(fw_sysfs);
0219 if (fw_sysfs->fw_upload_priv)
0220 fw_state_init(fw_sysfs->fw_priv);
0221
0222 break;
0223 }
0224 out:
0225 mutex_unlock(&fw_lock);
0226 return written;
0227 }
0228
0229 DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store);
0230
0231 static void firmware_rw_data(struct fw_priv *fw_priv, char *buffer,
0232 loff_t offset, size_t count, bool read)
0233 {
0234 if (read)
0235 memcpy(buffer, fw_priv->data + offset, count);
0236 else
0237 memcpy(fw_priv->data + offset, buffer, count);
0238 }
0239
0240 static void firmware_rw(struct fw_priv *fw_priv, char *buffer,
0241 loff_t offset, size_t count, bool read)
0242 {
0243 while (count) {
0244 int page_nr = offset >> PAGE_SHIFT;
0245 int page_ofs = offset & (PAGE_SIZE - 1);
0246 int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);
0247
0248 if (read)
0249 memcpy_from_page(buffer, fw_priv->pages[page_nr],
0250 page_ofs, page_cnt);
0251 else
0252 memcpy_to_page(fw_priv->pages[page_nr], page_ofs,
0253 buffer, page_cnt);
0254
0255 buffer += page_cnt;
0256 offset += page_cnt;
0257 count -= page_cnt;
0258 }
0259 }
0260
0261 static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj,
0262 struct bin_attribute *bin_attr,
0263 char *buffer, loff_t offset, size_t count)
0264 {
0265 struct device *dev = kobj_to_dev(kobj);
0266 struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
0267 struct fw_priv *fw_priv;
0268 ssize_t ret_count;
0269
0270 mutex_lock(&fw_lock);
0271 fw_priv = fw_sysfs->fw_priv;
0272 if (!fw_priv || fw_state_is_done(fw_priv)) {
0273 ret_count = -ENODEV;
0274 goto out;
0275 }
0276 if (offset > fw_priv->size) {
0277 ret_count = 0;
0278 goto out;
0279 }
0280 if (count > fw_priv->size - offset)
0281 count = fw_priv->size - offset;
0282
0283 ret_count = count;
0284
0285 if (fw_priv->data)
0286 firmware_rw_data(fw_priv, buffer, offset, count, true);
0287 else
0288 firmware_rw(fw_priv, buffer, offset, count, true);
0289
0290 out:
0291 mutex_unlock(&fw_lock);
0292 return ret_count;
0293 }
0294
0295 static int fw_realloc_pages(struct fw_sysfs *fw_sysfs, int min_size)
0296 {
0297 int err;
0298
0299 err = fw_grow_paged_buf(fw_sysfs->fw_priv,
0300 PAGE_ALIGN(min_size) >> PAGE_SHIFT);
0301 if (err)
0302 fw_load_abort(fw_sysfs);
0303 return err;
0304 }
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318 static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj,
0319 struct bin_attribute *bin_attr,
0320 char *buffer, loff_t offset, size_t count)
0321 {
0322 struct device *dev = kobj_to_dev(kobj);
0323 struct fw_sysfs *fw_sysfs = to_fw_sysfs(dev);
0324 struct fw_priv *fw_priv;
0325 ssize_t retval;
0326
0327 if (!capable(CAP_SYS_RAWIO))
0328 return -EPERM;
0329
0330 mutex_lock(&fw_lock);
0331 fw_priv = fw_sysfs->fw_priv;
0332 if (!fw_priv || fw_state_is_done(fw_priv)) {
0333 retval = -ENODEV;
0334 goto out;
0335 }
0336
0337 if (fw_priv->data) {
0338 if (offset + count > fw_priv->allocated_size) {
0339 retval = -ENOMEM;
0340 goto out;
0341 }
0342 firmware_rw_data(fw_priv, buffer, offset, count, false);
0343 retval = count;
0344 } else {
0345 retval = fw_realloc_pages(fw_sysfs, offset + count);
0346 if (retval)
0347 goto out;
0348
0349 retval = count;
0350 firmware_rw(fw_priv, buffer, offset, count, false);
0351 }
0352
0353 fw_priv->size = max_t(size_t, offset + count, fw_priv->size);
0354 out:
0355 mutex_unlock(&fw_lock);
0356 return retval;
0357 }
0358
0359 static struct bin_attribute firmware_attr_data = {
0360 .attr = { .name = "data", .mode = 0644 },
0361 .size = 0,
0362 .read = firmware_data_read,
0363 .write = firmware_data_write,
0364 };
0365
0366 static struct attribute *fw_dev_attrs[] = {
0367 &dev_attr_loading.attr,
0368 #ifdef CONFIG_FW_UPLOAD
0369 &dev_attr_cancel.attr,
0370 &dev_attr_status.attr,
0371 &dev_attr_error.attr,
0372 &dev_attr_remaining_size.attr,
0373 #endif
0374 NULL
0375 };
0376
0377 static struct bin_attribute *fw_dev_bin_attrs[] = {
0378 &firmware_attr_data,
0379 NULL
0380 };
0381
0382 static const struct attribute_group fw_dev_attr_group = {
0383 .attrs = fw_dev_attrs,
0384 .bin_attrs = fw_dev_bin_attrs,
0385 #ifdef CONFIG_FW_UPLOAD
0386 .is_visible = fw_upload_is_visible,
0387 #endif
0388 };
0389
0390 static const struct attribute_group *fw_dev_attr_groups[] = {
0391 &fw_dev_attr_group,
0392 NULL
0393 };
0394
0395 struct fw_sysfs *
0396 fw_create_instance(struct firmware *firmware, const char *fw_name,
0397 struct device *device, u32 opt_flags)
0398 {
0399 struct fw_sysfs *fw_sysfs;
0400 struct device *f_dev;
0401
0402 fw_sysfs = kzalloc(sizeof(*fw_sysfs), GFP_KERNEL);
0403 if (!fw_sysfs) {
0404 fw_sysfs = ERR_PTR(-ENOMEM);
0405 goto exit;
0406 }
0407
0408 fw_sysfs->nowait = !!(opt_flags & FW_OPT_NOWAIT);
0409 fw_sysfs->fw = firmware;
0410 f_dev = &fw_sysfs->dev;
0411
0412 device_initialize(f_dev);
0413 dev_set_name(f_dev, "%s", fw_name);
0414 f_dev->parent = device;
0415 f_dev->class = &firmware_class;
0416 f_dev->groups = fw_dev_attr_groups;
0417 exit:
0418 return fw_sysfs;
0419 }