firmware_class.c 22.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * firmware_class.c - Multi purpose firmware loading support
 *
4
 * Copyright (c) 2003 Manuel Estrada Sainz
L
Linus Torvalds 已提交
5 6 7 8 9
 *
 * Please see Documentation/firmware_class/ for more information.
 *
 */

10
#include <linux/capability.h>
L
Linus Torvalds 已提交
11 12 13 14 15 16 17
#include <linux/device.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/vmalloc.h>
#include <linux/interrupt.h>
#include <linux/bitops.h>
18
#include <linux/mutex.h>
19
#include <linux/workqueue.h>
20
#include <linux/highmem.h>
L
Linus Torvalds 已提交
21
#include <linux/firmware.h>
22
#include <linux/slab.h>
23
#include <linux/sched.h>
24
#include <linux/list.h>
L
Linus Torvalds 已提交
25

26
MODULE_AUTHOR("Manuel Estrada Sainz");
L
Linus Torvalds 已提交
27 28 29
MODULE_DESCRIPTION("Multi purpose firmware loading support");
MODULE_LICENSE("GPL");

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
/* Builtin firmware support */

#ifdef CONFIG_FW_LOADER

extern struct builtin_fw __start_builtin_fw[];
extern struct builtin_fw __end_builtin_fw[];

static bool fw_get_builtin_firmware(struct firmware *fw, const char *name)
{
	struct builtin_fw *b_fw;

	for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++) {
		if (strcmp(name, b_fw->name) == 0) {
			fw->size = b_fw->size;
			fw->data = b_fw->data;
			return true;
		}
	}

	return false;
}

static bool fw_is_builtin_firmware(const struct firmware *fw)
{
	struct builtin_fw *b_fw;

	for (b_fw = __start_builtin_fw; b_fw != __end_builtin_fw; b_fw++)
		if (fw->data == b_fw->data)
			return true;

	return false;
}

#else /* Module case - no builtin firmware support */

static inline bool fw_get_builtin_firmware(struct firmware *fw, const char *name)
{
	return false;
}

static inline bool fw_is_builtin_firmware(const struct firmware *fw)
{
	return false;
}
#endif

L
Linus Torvalds 已提交
76 77 78 79 80 81
enum {
	FW_STATUS_LOADING,
	FW_STATUS_DONE,
	FW_STATUS_ABORT,
};

82
static int loading_timeout = 60;	/* In seconds */
L
Linus Torvalds 已提交
83

84 85 86 87 88
static inline long firmware_loading_timeout(void)
{
	return loading_timeout > 0 ? loading_timeout * HZ : MAX_SCHEDULE_TIMEOUT;
}

89 90 91 92 93
struct firmware_cache {
	/* firmware_buf instance will be added into the below list */
	spinlock_t lock;
	struct list_head head;
};
L
Linus Torvalds 已提交
94

95
struct firmware_buf {
96 97
	struct kref ref;
	struct list_head list;
L
Linus Torvalds 已提交
98
	struct completion completion;
99
	struct firmware_cache *fwc;
L
Linus Torvalds 已提交
100
	unsigned long status;
101 102
	void *data;
	size_t size;
103 104 105
	struct page **pages;
	int nr_pages;
	int page_array_size;
106 107 108 109
	char fw_id[];
};

struct firmware_priv {
L
Linus Torvalds 已提交
110
	struct timer_list timeout;
111
	bool nowait;
112 113
	struct device dev;
	struct firmware_buf *buf;
114
	struct firmware *fw;
L
Linus Torvalds 已提交
115 116
};

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
#define to_fwbuf(d) container_of(d, struct firmware_buf, ref)

/* fw_lock could be moved to 'struct firmware_priv' but since it is just
 * guarding for corner cases a global lock should be OK */
static DEFINE_MUTEX(fw_lock);

static struct firmware_cache fw_cache;

static struct firmware_buf *__allocate_fw_buf(const char *fw_name,
					      struct firmware_cache *fwc)
{
	struct firmware_buf *buf;

	buf = kzalloc(sizeof(*buf) + strlen(fw_name) + 1 , GFP_ATOMIC);

	if (!buf)
		return buf;

	kref_init(&buf->ref);
	strcpy(buf->fw_id, fw_name);
	buf->fwc = fwc;
	init_completion(&buf->completion);

	pr_debug("%s: fw-%s buf=%p\n", __func__, fw_name, buf);

	return buf;
}

145 146 147 148 149 150 151 152 153 154 155
static struct firmware_buf *__fw_lookup_buf(const char *fw_name)
{
	struct firmware_buf *tmp;
	struct firmware_cache *fwc = &fw_cache;

	list_for_each_entry(tmp, &fwc->head, list)
		if (!strcmp(tmp->fw_id, fw_name))
			return tmp;
	return NULL;
}

156 157 158 159 160 161 162
static int fw_lookup_and_allocate_buf(const char *fw_name,
				      struct firmware_cache *fwc,
				      struct firmware_buf **buf)
{
	struct firmware_buf *tmp;

	spin_lock(&fwc->lock);
163 164 165 166 167 168 169
	tmp = __fw_lookup_buf(fw_name);
	if (tmp) {
		kref_get(&tmp->ref);
		spin_unlock(&fwc->lock);
		*buf = tmp;
		return 1;
	}
170 171 172 173 174 175 176 177 178 179
	tmp = __allocate_fw_buf(fw_name, fwc);
	if (tmp)
		list_add(&tmp->list, &fwc->head);
	spin_unlock(&fwc->lock);

	*buf = tmp;

	return tmp ? 0 : -ENOMEM;
}

180 181 182 183 184 185 186 187 188 189 190 191
static struct firmware_buf *fw_lookup_buf(const char *fw_name)
{
	struct firmware_buf *tmp;
	struct firmware_cache *fwc = &fw_cache;

	spin_lock(&fwc->lock);
	tmp = __fw_lookup_buf(fw_name);
	spin_unlock(&fwc->lock);

	return tmp;
}

192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
static void __fw_free_buf(struct kref *ref)
{
	struct firmware_buf *buf = to_fwbuf(ref);
	struct firmware_cache *fwc = buf->fwc;
	int i;

	pr_debug("%s: fw-%s buf=%p data=%p size=%u\n",
		 __func__, buf->fw_id, buf, buf->data,
		 (unsigned int)buf->size);

	spin_lock(&fwc->lock);
	list_del(&buf->list);
	spin_unlock(&fwc->lock);

	vunmap(buf->data);
	for (i = 0; i < buf->nr_pages; i++)
		__free_page(buf->pages[i]);
	kfree(buf->pages);
	kfree(buf);
}

static void fw_free_buf(struct firmware_buf *buf)
{
	kref_put(&buf->ref, __fw_free_buf);
}

static void __init fw_cache_init(void)
{
	spin_lock_init(&fw_cache.lock);
	INIT_LIST_HEAD(&fw_cache.head);
}

224 225 226 227 228 229
static struct firmware_priv *to_firmware_priv(struct device *dev)
{
	return container_of(dev, struct firmware_priv, dev);
}

static void fw_load_abort(struct firmware_priv *fw_priv)
L
Linus Torvalds 已提交
230
{
231 232 233
	struct firmware_buf *buf = fw_priv->buf;

	set_bit(FW_STATUS_ABORT, &buf->status);
234
	complete_all(&buf->completion);
L
Linus Torvalds 已提交
235 236
}

237 238 239
static ssize_t firmware_timeout_show(struct class *class,
				     struct class_attribute *attr,
				     char *buf)
L
Linus Torvalds 已提交
240 241 242 243 244
{
	return sprintf(buf, "%d\n", loading_timeout);
}

/**
245 246
 * firmware_timeout_store - set number of seconds to wait for firmware
 * @class: device class pointer
247
 * @attr: device attribute pointer
248 249 250
 * @buf: buffer to scan for timeout value
 * @count: number of bytes in @buf
 *
L
Linus Torvalds 已提交
251
 *	Sets the number of seconds to wait for the firmware.  Once
252
 *	this expires an error will be returned to the driver and no
L
Linus Torvalds 已提交
253 254
 *	firmware will be provided.
 *
255
 *	Note: zero means 'wait forever'.
L
Linus Torvalds 已提交
256
 **/
257 258 259
static ssize_t firmware_timeout_store(struct class *class,
				      struct class_attribute *attr,
				      const char *buf, size_t count)
L
Linus Torvalds 已提交
260 261
{
	loading_timeout = simple_strtol(buf, NULL, 10);
262 263
	if (loading_timeout < 0)
		loading_timeout = 0;
264

L
Linus Torvalds 已提交
265 266 267
	return count;
}

268 269 270 271 272
static struct class_attribute firmware_class_attrs[] = {
	__ATTR(timeout, S_IWUSR | S_IRUGO,
		firmware_timeout_show, firmware_timeout_store),
	__ATTR_NULL
};
L
Linus Torvalds 已提交
273

274 275 276
static void fw_dev_release(struct device *dev)
{
	struct firmware_priv *fw_priv = to_firmware_priv(dev);
277

278 279 280 281
	kfree(fw_priv);

	module_put(THIS_MODULE);
}
L
Linus Torvalds 已提交
282

283
static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
L
Linus Torvalds 已提交
284
{
285
	struct firmware_priv *fw_priv = to_firmware_priv(dev);
L
Linus Torvalds 已提交
286

287
	if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->buf->fw_id))
L
Linus Torvalds 已提交
288
		return -ENOMEM;
289
	if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout))
290
		return -ENOMEM;
291 292
	if (add_uevent_var(env, "ASYNC=%d", fw_priv->nowait))
		return -ENOMEM;
L
Linus Torvalds 已提交
293 294 295 296

	return 0;
}

297 298
static struct class firmware_class = {
	.name		= "firmware",
299
	.class_attrs	= firmware_class_attrs,
300 301
	.dev_uevent	= firmware_uevent,
	.dev_release	= fw_dev_release,
302 303
};

304 305
static ssize_t firmware_loading_show(struct device *dev,
				     struct device_attribute *attr, char *buf)
L
Linus Torvalds 已提交
306
{
307
	struct firmware_priv *fw_priv = to_firmware_priv(dev);
308
	int loading = test_bit(FW_STATUS_LOADING, &fw_priv->buf->status);
309

L
Linus Torvalds 已提交
310 311 312
	return sprintf(buf, "%d\n", loading);
}

313
/* firmware holds the ownership of pages */
314 315
static void firmware_free_data(const struct firmware *fw)
{
316 317
	WARN_ON(!fw->priv);
	fw_free_buf(fw->priv);
318 319
}

320 321 322 323
/* Some architectures don't have PAGE_KERNEL_RO */
#ifndef PAGE_KERNEL_RO
#define PAGE_KERNEL_RO PAGE_KERNEL
#endif
L
Linus Torvalds 已提交
324
/**
325
 * firmware_loading_store - set value in the 'loading' control file
326
 * @dev: device pointer
327
 * @attr: device attribute pointer
328 329 330
 * @buf: buffer to scan for loading control value
 * @count: number of bytes in @buf
 *
L
Linus Torvalds 已提交
331 332 333
 *	The relevant values are:
 *
 *	 1: Start a load, discarding any previous partial load.
334
 *	 0: Conclude the load and hand the data to the driver code.
L
Linus Torvalds 已提交
335 336
 *	-1: Conclude the load with an error and discard any written data.
 **/
337 338 339
static ssize_t firmware_loading_store(struct device *dev,
				      struct device_attribute *attr,
				      const char *buf, size_t count)
L
Linus Torvalds 已提交
340
{
341
	struct firmware_priv *fw_priv = to_firmware_priv(dev);
342
	struct firmware_buf *fw_buf = fw_priv->buf;
L
Linus Torvalds 已提交
343
	int loading = simple_strtol(buf, NULL, 10);
344
	int i;
L
Linus Torvalds 已提交
345

346 347
	mutex_lock(&fw_lock);

348
	if (!fw_buf)
349 350
		goto out;

L
Linus Torvalds 已提交
351 352
	switch (loading) {
	case 1:
353
		/* discarding any previous partial load */
354 355 356 357 358 359 360 361
		if (!test_bit(FW_STATUS_DONE, &fw_buf->status)) {
			for (i = 0; i < fw_buf->nr_pages; i++)
				__free_page(fw_buf->pages[i]);
			kfree(fw_buf->pages);
			fw_buf->pages = NULL;
			fw_buf->page_array_size = 0;
			fw_buf->nr_pages = 0;
			set_bit(FW_STATUS_LOADING, &fw_buf->status);
362
		}
L
Linus Torvalds 已提交
363 364
		break;
	case 0:
365 366 367
		if (test_bit(FW_STATUS_LOADING, &fw_buf->status)) {
			set_bit(FW_STATUS_DONE, &fw_buf->status);
			clear_bit(FW_STATUS_LOADING, &fw_buf->status);
368
			complete_all(&fw_buf->completion);
L
Linus Torvalds 已提交
369 370 371 372
			break;
		}
		/* fallthrough */
	default:
373
		dev_err(dev, "%s: unexpected value (%d)\n", __func__, loading);
L
Linus Torvalds 已提交
374 375 376 377 378
		/* fallthrough */
	case -1:
		fw_load_abort(fw_priv);
		break;
	}
379 380
out:
	mutex_unlock(&fw_lock);
L
Linus Torvalds 已提交
381 382 383
	return count;
}

384
static DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store);
L
Linus Torvalds 已提交
385

386 387 388
static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj,
				  struct bin_attribute *bin_attr,
				  char *buffer, loff_t offset, size_t count)
L
Linus Torvalds 已提交
389
{
390
	struct device *dev = kobj_to_dev(kobj);
391
	struct firmware_priv *fw_priv = to_firmware_priv(dev);
392
	struct firmware_buf *buf;
393
	ssize_t ret_count;
L
Linus Torvalds 已提交
394

395
	mutex_lock(&fw_lock);
396 397
	buf = fw_priv->buf;
	if (!buf || test_bit(FW_STATUS_DONE, &buf->status)) {
L
Linus Torvalds 已提交
398 399 400
		ret_count = -ENODEV;
		goto out;
	}
401
	if (offset > buf->size) {
402 403 404
		ret_count = 0;
		goto out;
	}
405 406
	if (count > buf->size - offset)
		count = buf->size - offset;
407 408 409 410 411 412 413 414 415

	ret_count = count;

	while (count) {
		void *page_data;
		int page_nr = offset >> PAGE_SHIFT;
		int page_ofs = offset & (PAGE_SIZE-1);
		int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);

416
		page_data = kmap(buf->pages[page_nr]);
417 418 419

		memcpy(buffer, page_data + page_ofs, page_cnt);

420
		kunmap(buf->pages[page_nr]);
421 422 423 424
		buffer += page_cnt;
		offset += page_cnt;
		count -= page_cnt;
	}
L
Linus Torvalds 已提交
425
out:
426
	mutex_unlock(&fw_lock);
L
Linus Torvalds 已提交
427 428
	return ret_count;
}
429

430
static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
L
Linus Torvalds 已提交
431
{
432
	struct firmware_buf *buf = fw_priv->buf;
433 434 435
	int pages_needed = ALIGN(min_size, PAGE_SIZE) >> PAGE_SHIFT;

	/* If the array of pages is too small, grow it... */
436
	if (buf->page_array_size < pages_needed) {
437
		int new_array_size = max(pages_needed,
438
					 buf->page_array_size * 2);
439 440 441 442 443 444 445 446
		struct page **new_pages;

		new_pages = kmalloc(new_array_size * sizeof(void *),
				    GFP_KERNEL);
		if (!new_pages) {
			fw_load_abort(fw_priv);
			return -ENOMEM;
		}
447 448 449 450 451 452 453
		memcpy(new_pages, buf->pages,
		       buf->page_array_size * sizeof(void *));
		memset(&new_pages[buf->page_array_size], 0, sizeof(void *) *
		       (new_array_size - buf->page_array_size));
		kfree(buf->pages);
		buf->pages = new_pages;
		buf->page_array_size = new_array_size;
454
	}
L
Linus Torvalds 已提交
455

456 457
	while (buf->nr_pages < pages_needed) {
		buf->pages[buf->nr_pages] =
458
			alloc_page(GFP_KERNEL | __GFP_HIGHMEM);
L
Linus Torvalds 已提交
459

460
		if (!buf->pages[buf->nr_pages]) {
461 462 463
			fw_load_abort(fw_priv);
			return -ENOMEM;
		}
464
		buf->nr_pages++;
L
Linus Torvalds 已提交
465 466 467 468 469
	}
	return 0;
}

/**
470
 * firmware_data_write - write method for firmware
471
 * @filp: open sysfs file
472
 * @kobj: kobject for the device
473
 * @bin_attr: bin_attr structure
474 475 476
 * @buffer: buffer being written
 * @offset: buffer offset for write in total data store area
 * @count: buffer size
L
Linus Torvalds 已提交
477
 *
478
 *	Data written to the 'data' attribute will be later handed to
L
Linus Torvalds 已提交
479 480
 *	the driver as a firmware image.
 **/
481 482 483
static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj,
				   struct bin_attribute *bin_attr,
				   char *buffer, loff_t offset, size_t count)
L
Linus Torvalds 已提交
484
{
485
	struct device *dev = kobj_to_dev(kobj);
486
	struct firmware_priv *fw_priv = to_firmware_priv(dev);
487
	struct firmware_buf *buf;
L
Linus Torvalds 已提交
488 489 490 491
	ssize_t retval;

	if (!capable(CAP_SYS_RAWIO))
		return -EPERM;
492

493
	mutex_lock(&fw_lock);
494 495
	buf = fw_priv->buf;
	if (!buf || test_bit(FW_STATUS_DONE, &buf->status)) {
L
Linus Torvalds 已提交
496 497 498
		retval = -ENODEV;
		goto out;
	}
499

L
Linus Torvalds 已提交
500 501 502 503 504
	retval = fw_realloc_buffer(fw_priv, offset + count);
	if (retval)
		goto out;

	retval = count;
505 506 507 508 509 510 511

	while (count) {
		void *page_data;
		int page_nr = offset >> PAGE_SHIFT;
		int page_ofs = offset & (PAGE_SIZE - 1);
		int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count);

512
		page_data = kmap(buf->pages[page_nr]);
513 514 515

		memcpy(page_data + page_ofs, buffer, page_cnt);

516
		kunmap(buf->pages[page_nr]);
517 518 519 520 521
		buffer += page_cnt;
		offset += page_cnt;
		count -= page_cnt;
	}

522
	buf->size = max_t(size_t, offset, buf->size);
L
Linus Torvalds 已提交
523
out:
524
	mutex_unlock(&fw_lock);
L
Linus Torvalds 已提交
525 526
	return retval;
}
527

528 529
static struct bin_attribute firmware_attr_data = {
	.attr = { .name = "data", .mode = 0644 },
L
Linus Torvalds 已提交
530 531 532 533 534
	.size = 0,
	.read = firmware_data_read,
	.write = firmware_data_write,
};

535
static void firmware_class_timeout(u_long data)
L
Linus Torvalds 已提交
536 537
{
	struct firmware_priv *fw_priv = (struct firmware_priv *) data;
538

L
Linus Torvalds 已提交
539 540 541
	fw_load_abort(fw_priv);
}

542
static struct firmware_priv *
543
fw_create_instance(struct firmware *firmware, const char *fw_name,
544
		   struct device *device, bool uevent, bool nowait)
L
Linus Torvalds 已提交
545
{
546 547
	struct firmware_priv *fw_priv;
	struct device *f_dev;
L
Linus Torvalds 已提交
548

549
	fw_priv = kzalloc(sizeof(*fw_priv), GFP_KERNEL);
550
	if (!fw_priv) {
551
		dev_err(device, "%s: kmalloc failed\n", __func__);
552 553 554 555
		fw_priv = ERR_PTR(-ENOMEM);
		goto exit;
	}

556
	fw_priv->nowait = nowait;
557
	fw_priv->fw = firmware;
558 559
	setup_timer(&fw_priv->timeout,
		    firmware_class_timeout, (u_long) fw_priv);
L
Linus Torvalds 已提交
560

561 562 563
	f_dev = &fw_priv->dev;

	device_initialize(f_dev);
564
	dev_set_name(f_dev, "%s", fw_name);
565 566
	f_dev->parent = device;
	f_dev->class = &firmware_class;
567
exit:
568
	return fw_priv;
L
Linus Torvalds 已提交
569 570
}

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
/* one pages buffer is mapped/unmapped only once */
static int fw_map_pages_buf(struct firmware_buf *buf)
{
	buf->data = vmap(buf->pages, buf->nr_pages, 0, PAGE_KERNEL_RO);
	if (!buf->data)
		return -ENOMEM;
	return 0;
}

/* store the pages buffer info firmware from buf */
static void fw_set_page_data(struct firmware_buf *buf, struct firmware *fw)
{
	fw->priv = buf;
	fw->pages = buf->pages;
	fw->size = buf->size;
	fw->data = buf->data;

	pr_debug("%s: fw-%s buf=%p data=%p size=%u\n",
		 __func__, buf->fw_id, buf, buf->data,
		 (unsigned int)buf->size);
}

static void _request_firmware_cleanup(const struct firmware **firmware_p)
{
	release_firmware(*firmware_p);
	*firmware_p = NULL;
}

599 600 601
static struct firmware_priv *
_request_firmware_prepare(const struct firmware **firmware_p, const char *name,
			  struct device *device, bool uevent, bool nowait)
L
Linus Torvalds 已提交
602 603
{
	struct firmware *firmware;
604 605 606
	struct firmware_priv *fw_priv = NULL;
	struct firmware_buf *buf;
	int ret;
L
Linus Torvalds 已提交
607 608

	if (!firmware_p)
609
		return ERR_PTR(-EINVAL);
L
Linus Torvalds 已提交
610

611
	*firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
L
Linus Torvalds 已提交
612
	if (!firmware) {
613 614
		dev_err(device, "%s: kmalloc(struct firmware) failed\n",
			__func__);
615
		return ERR_PTR(-ENOMEM);
L
Linus Torvalds 已提交
616 617
	}

618
	if (fw_get_builtin_firmware(firmware, name)) {
619
		dev_dbg(device, "firmware: using built-in firmware %s\n", name);
620
		return NULL;
621 622
	}

623 624 625 626 627 628 629
	ret = fw_lookup_and_allocate_buf(name, &fw_cache, &buf);
	if (!ret)
		fw_priv = fw_create_instance(firmware, name, device,
				uevent, nowait);

	if (IS_ERR(fw_priv) || ret < 0) {
		kfree(firmware);
630
		*firmware_p = NULL;
631 632 633 634 635 636 637 638 639 640
		return ERR_PTR(-ENOMEM);
	} else if (fw_priv) {
		fw_priv->buf = buf;

		/*
		 * bind with 'buf' now to avoid warning in failure path
		 * of requesting firmware.
		 */
		firmware->priv = buf;
		return fw_priv;
641
	}
642

643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
	/* share the cached buf, which is inprogessing or completed */
 check_status:
	mutex_lock(&fw_lock);
	if (test_bit(FW_STATUS_ABORT, &buf->status)) {
		fw_priv = ERR_PTR(-ENOENT);
		_request_firmware_cleanup(firmware_p);
		goto exit;
	} else if (test_bit(FW_STATUS_DONE, &buf->status)) {
		fw_priv = NULL;
		fw_set_page_data(buf, firmware);
		goto exit;
	}
	mutex_unlock(&fw_lock);
	wait_for_completion(&buf->completion);
	goto check_status;
658

659 660 661
exit:
	mutex_unlock(&fw_lock);
	return fw_priv;
662 663
}

664 665
static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent,
				  long timeout)
666
{
667
	int retval = 0;
668
	struct device *f_dev = &fw_priv->dev;
669
	struct firmware_buf *buf = fw_priv->buf;
670 671

	dev_set_uevent_suppress(f_dev, true);
672

673 674
	/* Need to pin this module until class device is destroyed */
	__module_get(THIS_MODULE);
675

676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692
	retval = device_add(f_dev);
	if (retval) {
		dev_err(f_dev, "%s: device_register failed\n", __func__);
		goto err_put_dev;
	}

	retval = device_create_bin_file(f_dev, &firmware_attr_data);
	if (retval) {
		dev_err(f_dev, "%s: sysfs_create_bin_file failed\n", __func__);
		goto err_del_dev;
	}

	retval = device_create_file(f_dev, &dev_attr_loading);
	if (retval) {
		dev_err(f_dev, "%s: device_create_file failed\n", __func__);
		goto err_del_bin_attr;
	}
L
Linus Torvalds 已提交
693

694
	if (uevent) {
695
		dev_set_uevent_suppress(f_dev, false);
696
		dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id);
697
		if (timeout != MAX_SCHEDULE_TIMEOUT)
698
			mod_timer(&fw_priv->timeout,
699
				  round_jiffies_up(jiffies + timeout));
700 701 702 703

		kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
	}

704
	wait_for_completion(&buf->completion);
L
Linus Torvalds 已提交
705

706
	del_timer_sync(&fw_priv->timeout);
L
Linus Torvalds 已提交
707

708
	mutex_lock(&fw_lock);
709
	if (!buf->size || test_bit(FW_STATUS_ABORT, &buf->status))
L
Linus Torvalds 已提交
710
		retval = -ENOENT;
711 712

	if (!retval)
713 714 715 716
		retval = fw_map_pages_buf(buf);

	/* pass the pages buffer to driver at the last minute */
	fw_set_page_data(buf, fw_priv->fw);
717 718

	fw_priv->buf = NULL;
719
	mutex_unlock(&fw_lock);
L
Linus Torvalds 已提交
720

721 722 723 724 725 726 727
	device_remove_file(f_dev, &dev_attr_loading);
err_del_bin_attr:
	device_remove_bin_file(f_dev, &firmware_attr_data);
err_del_dev:
	device_del(f_dev);
err_put_dev:
	put_device(f_dev);
L
Linus Torvalds 已提交
728 729 730
	return retval;
}

731
/**
732
 * request_firmware: - send firmware request and wait for it
733 734 735 736 737
 * @firmware_p: pointer to firmware image
 * @name: name of firmware file
 * @device: device for which firmware is being loaded
 *
 *      @firmware_p will be used to return a firmware image by the name
738 739 740 741
 *      of @name for device @device.
 *
 *      Should be called from user context where sleeping is allowed.
 *
742
 *      @name will be used as $FIRMWARE in the uevent environment and
743 744
 *      should be distinctive enough not to be confused with any other
 *      firmware image for this or any other device.
M
Ming Lei 已提交
745 746
 *
 *	Caller must hold the reference count of @device.
747 748 749 750 751
 **/
int
request_firmware(const struct firmware **firmware_p, const char *name,
                 struct device *device)
{
752
	struct firmware_priv *fw_priv;
753 754
	int ret;

755 756 757 758
	fw_priv = _request_firmware_prepare(firmware_p, name, device, true,
					    false);
	if (IS_ERR_OR_NULL(fw_priv))
		return PTR_RET(fw_priv);
759

760 761 762 763
	ret = usermodehelper_read_trylock();
	if (WARN_ON(ret)) {
		dev_err(device, "firmware: %s will not be loaded\n", name);
	} else {
764
		ret = _request_firmware_load(fw_priv, true,
765 766 767
					firmware_loading_timeout());
		usermodehelper_read_unlock();
	}
768 769 770 771
	if (ret)
		_request_firmware_cleanup(firmware_p);

	return ret;
772 773
}

L
Linus Torvalds 已提交
774 775
/**
 * release_firmware: - release the resource associated with a firmware image
776
 * @fw: firmware resource to release
L
Linus Torvalds 已提交
777
 **/
778
void release_firmware(const struct firmware *fw)
L
Linus Torvalds 已提交
779 780
{
	if (fw) {
781 782
		if (!fw_is_builtin_firmware(fw))
			firmware_free_data(fw);
L
Linus Torvalds 已提交
783 784 785 786 787 788 789 790 791 792 793 794
		kfree(fw);
	}
}

/* Async support */
struct firmware_work {
	struct work_struct work;
	struct module *module;
	const char *name;
	struct device *device;
	void *context;
	void (*cont)(const struct firmware *fw, void *context);
795
	bool uevent;
L
Linus Torvalds 已提交
796 797
};

798
static void request_firmware_work_func(struct work_struct *work)
L
Linus Torvalds 已提交
799
{
800
	struct firmware_work *fw_work;
L
Linus Torvalds 已提交
801
	const struct firmware *fw;
802
	struct firmware_priv *fw_priv;
803
	long timeout;
804
	int ret;
805

806
	fw_work = container_of(work, struct firmware_work, work);
807 808 809 810
	fw_priv = _request_firmware_prepare(&fw, fw_work->name, fw_work->device,
			fw_work->uevent, true);
	if (IS_ERR_OR_NULL(fw_priv)) {
		ret = PTR_RET(fw_priv);
811
		goto out;
812
	}
813

814 815
	timeout = usermodehelper_read_lock_wait(firmware_loading_timeout());
	if (timeout) {
816
		ret = _request_firmware_load(fw_priv, fw_work->uevent, timeout);
817 818 819 820 821 822
		usermodehelper_read_unlock();
	} else {
		dev_dbg(fw_work->device, "firmware: %s loading timed out\n",
			fw_work->name);
		ret = -EAGAIN;
	}
823 824 825 826
	if (ret)
		_request_firmware_cleanup(&fw);

 out:
827
	fw_work->cont(fw, fw_work->context);
M
Ming Lei 已提交
828
	put_device(fw_work->device);
829

L
Linus Torvalds 已提交
830 831 832 833 834
	module_put(fw_work->module);
	kfree(fw_work);
}

/**
835
 * request_firmware_nowait - asynchronous version of request_firmware
836
 * @module: module requesting the firmware
837
 * @uevent: sends uevent to copy the firmware image if this flag
838 839 840
 *	is non-zero else the firmware copy must be done manually.
 * @name: name of firmware file
 * @device: device for which firmware is being loaded
841
 * @gfp: allocation flags
842 843 844 845
 * @context: will be passed over to @cont, and
 *	@fw may be %NULL if firmware request fails.
 * @cont: function will be called asynchronously when the firmware
 *	request is over.
L
Linus Torvalds 已提交
846
 *
M
Ming Lei 已提交
847 848
 *	Caller must hold the reference count of @device.
 *
849 850 851
 *	Asynchronous variant of request_firmware() for user contexts where
 *	it is not possible to sleep for long time. It can't be called
 *	in atomic contexts.
L
Linus Torvalds 已提交
852 853 854
 **/
int
request_firmware_nowait(
855
	struct module *module, bool uevent,
856
	const char *name, struct device *device, gfp_t gfp, void *context,
L
Linus Torvalds 已提交
857 858
	void (*cont)(const struct firmware *fw, void *context))
{
859
	struct firmware_work *fw_work;
L
Linus Torvalds 已提交
860

861
	fw_work = kzalloc(sizeof (struct firmware_work), gfp);
L
Linus Torvalds 已提交
862 863
	if (!fw_work)
		return -ENOMEM;
864 865 866 867 868 869 870 871

	fw_work->module = module;
	fw_work->name = name;
	fw_work->device = device;
	fw_work->context = context;
	fw_work->cont = cont;
	fw_work->uevent = uevent;

L
Linus Torvalds 已提交
872 873 874 875 876
	if (!try_module_get(module)) {
		kfree(fw_work);
		return -EFAULT;
	}

M
Ming Lei 已提交
877
	get_device(fw_work->device);
878 879
	INIT_WORK(&fw_work->work, request_firmware_work_func);
	schedule_work(&fw_work->work);
L
Linus Torvalds 已提交
880 881 882
	return 0;
}

883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942
/**
 * cache_firmware - cache one firmware image in kernel memory space
 * @fw_name: the firmware image name
 *
 * Cache firmware in kernel memory so that drivers can use it when
 * system isn't ready for them to request firmware image from userspace.
 * Once it returns successfully, driver can use request_firmware or its
 * nowait version to get the cached firmware without any interacting
 * with userspace
 *
 * Return 0 if the firmware image has been cached successfully
 * Return !0 otherwise
 *
 */
int cache_firmware(const char *fw_name)
{
	int ret;
	const struct firmware *fw;

	pr_debug("%s: %s\n", __func__, fw_name);

	ret = request_firmware(&fw, fw_name, NULL);
	if (!ret)
		kfree(fw);

	pr_debug("%s: %s ret=%d\n", __func__, fw_name, ret);

	return ret;
}

/**
 * uncache_firmware - remove one cached firmware image
 * @fw_name: the firmware image name
 *
 * Uncache one firmware image which has been cached successfully
 * before.
 *
 * Return 0 if the firmware cache has been removed successfully
 * Return !0 otherwise
 *
 */
int uncache_firmware(const char *fw_name)
{
	struct firmware_buf *buf;
	struct firmware fw;

	pr_debug("%s: %s\n", __func__, fw_name);

	if (fw_get_builtin_firmware(&fw, fw_name))
		return 0;

	buf = fw_lookup_buf(fw_name);
	if (buf) {
		fw_free_buf(buf);
		return 0;
	}

	return -EINVAL;
}

943
static int __init firmware_class_init(void)
L
Linus Torvalds 已提交
944
{
945
	fw_cache_init();
946
	return class_register(&firmware_class);
L
Linus Torvalds 已提交
947
}
948 949

static void __exit firmware_class_exit(void)
L
Linus Torvalds 已提交
950 951 952 953
{
	class_unregister(&firmware_class);
}

954
fs_initcall(firmware_class_init);
L
Linus Torvalds 已提交
955 956 957 958 959
module_exit(firmware_class_exit);

EXPORT_SYMBOL(release_firmware);
EXPORT_SYMBOL(request_firmware);
EXPORT_SYMBOL(request_firmware_nowait);
960 961
EXPORT_SYMBOL_GPL(cache_firmware);
EXPORT_SYMBOL_GPL(uncache_firmware);