hwrng: core - do not use multiple blank lines
[linux-block.git] / drivers / char / hw_random / core.c
CommitLineData
844dd05f
MB
1/*
2 Added support for the AMD Geode LX RNG
3 (c) Copyright 2004-2005 Advanced Micro Devices, Inc.
4
5 derived from
6
7 Hardware driver for the Intel/AMD/VIA Random Number Generators (RNG)
8 (c) Copyright 2003 Red Hat Inc <jgarzik@redhat.com>
9
10 derived from
11
12 Hardware driver for the AMD 768 Random Number Generator (RNG)
13 (c) Copyright 2001 Red Hat Inc <alan@redhat.com>
14
15 derived from
16
17 Hardware driver for Intel i810 Random Number Generator (RNG)
18 Copyright 2000,2001 Jeff Garzik <jgarzik@pobox.com>
19 Copyright 2000,2001 Philipp Rumpf <prumpf@mandrakesoft.com>
20
21 Added generic RNG API
eb032b98 22 Copyright 2006 Michael Buesch <m@bues.ch>
844dd05f
MB
23 Copyright 2005 (c) MontaVista Software, Inc.
24
25 Please read Documentation/hw_random.txt for details on use.
26
27 ----------------------------------------------------------
28 This software may be used and distributed according to the terms
29 of the GNU General Public License, incorporated herein by reference.
30
31 */
32
844dd05f
MB
33#include <linux/device.h>
34#include <linux/hw_random.h>
35#include <linux/module.h>
36#include <linux/kernel.h>
37#include <linux/fs.h>
914e2637 38#include <linux/sched.h>
844dd05f 39#include <linux/miscdevice.h>
be4000bc 40#include <linux/kthread.h>
844dd05f 41#include <linux/delay.h>
f7f154f1 42#include <linux/slab.h>
d9e79726 43#include <linux/random.h>
3a2c0ba5 44#include <linux/err.h>
7c0f6ba6 45#include <linux/uaccess.h>
844dd05f 46
844dd05f
MB
47#define RNG_MODULE_NAME "hw_random"
48#define PFX RNG_MODULE_NAME ": "
49#define RNG_MISCDEV_MINOR 183 /* official */
50
844dd05f 51static struct hwrng *current_rng;
be4000bc 52static struct task_struct *hwrng_fill;
844dd05f 53static LIST_HEAD(rng_list);
9372b35e 54/* Protects rng_list and current_rng */
844dd05f 55static DEFINE_MUTEX(rng_mutex);
9372b35e
RR
56/* Protects rng read functions, data_avail, rng_buffer and rng_fillbuf */
57static DEFINE_MUTEX(reading_mutex);
9996508b 58static int data_avail;
be4000bc 59static u8 *rng_buffer, *rng_fillbuf;
0f734e6e
TD
60static unsigned short current_quality;
61static unsigned short default_quality; /* = 0; default to "off" */
be4000bc
TD
62
63module_param(current_quality, ushort, 0644);
64MODULE_PARM_DESC(current_quality,
65 "current hwrng entropy estimation per mill");
0f734e6e
TD
66module_param(default_quality, ushort, 0644);
67MODULE_PARM_DESC(default_quality,
68 "default entropy content of hwrng per mill");
be4000bc 69
ff77c150 70static void drop_current_rng(void);
90ac41bd 71static int hwrng_init(struct hwrng *rng);
be4000bc 72static void start_khwrngd(void);
f7f154f1 73
d3cc7996
AS
74static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
75 int wait);
76
f7f154f1
RR
77static size_t rng_buffer_size(void)
78{
79 return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
80}
844dd05f 81
d3cc7996
AS
82static void add_early_randomness(struct hwrng *rng)
83{
d3cc7996 84 int bytes_read;
6d4952d9 85 size_t size = min_t(size_t, 16, rng_buffer_size());
d3cc7996 86
9372b35e 87 mutex_lock(&reading_mutex);
6d4952d9 88 bytes_read = rng_get_data(rng, rng_buffer, size, 1);
9372b35e 89 mutex_unlock(&reading_mutex);
d3cc7996 90 if (bytes_read > 0)
6d4952d9 91 add_device_randomness(rng_buffer, bytes_read);
2cc75154 92 memset(rng_buffer, 0, size);
d3cc7996
AS
93}
94
3a2c0ba5
RR
95static inline void cleanup_rng(struct kref *kref)
96{
97 struct hwrng *rng = container_of(kref, struct hwrng, ref);
98
99 if (rng->cleanup)
100 rng->cleanup(rng);
a027f30d 101
77584ee5 102 complete(&rng->cleanup_done);
3a2c0ba5
RR
103}
104
90ac41bd 105static int set_current_rng(struct hwrng *rng)
3a2c0ba5 106{
90ac41bd
HX
107 int err;
108
3a2c0ba5 109 BUG_ON(!mutex_is_locked(&rng_mutex));
90ac41bd
HX
110
111 err = hwrng_init(rng);
112 if (err)
113 return err;
114
ff77c150 115 drop_current_rng();
3a2c0ba5 116 current_rng = rng;
90ac41bd
HX
117
118 return 0;
3a2c0ba5
RR
119}
120
121static void drop_current_rng(void)
122{
123 BUG_ON(!mutex_is_locked(&rng_mutex));
124 if (!current_rng)
125 return;
126
127 /* decrease last reference for triggering the cleanup */
128 kref_put(&current_rng->ref, cleanup_rng);
129 current_rng = NULL;
130}
131
132/* Returns ERR_PTR(), NULL or refcounted hwrng */
133static struct hwrng *get_current_rng(void)
134{
135 struct hwrng *rng;
136
137 if (mutex_lock_interruptible(&rng_mutex))
138 return ERR_PTR(-ERESTARTSYS);
139
140 rng = current_rng;
141 if (rng)
142 kref_get(&rng->ref);
143
144 mutex_unlock(&rng_mutex);
145 return rng;
146}
147
148static void put_rng(struct hwrng *rng)
149{
150 /*
151 * Hold rng_mutex here so we serialize in case they set_current_rng
152 * on rng again immediately.
153 */
154 mutex_lock(&rng_mutex);
155 if (rng)
156 kref_put(&rng->ref, cleanup_rng);
157 mutex_unlock(&rng_mutex);
158}
159
90ac41bd 160static int hwrng_init(struct hwrng *rng)
844dd05f 161{
15b66cd5
HX
162 if (kref_get_unless_zero(&rng->ref))
163 goto skip_init;
164
d3cc7996
AS
165 if (rng->init) {
166 int ret;
167
168 ret = rng->init(rng);
169 if (ret)
170 return ret;
171 }
15b66cd5
HX
172
173 kref_init(&rng->ref);
174 reinit_completion(&rng->cleanup_done);
175
176skip_init:
d3cc7996 177 add_early_randomness(rng);
be4000bc 178
0f734e6e 179 current_quality = rng->quality ? : default_quality;
506bf0c0
KP
180 if (current_quality > 1024)
181 current_quality = 1024;
0f734e6e
TD
182
183 if (current_quality == 0 && hwrng_fill)
184 kthread_stop(hwrng_fill);
be4000bc
TD
185 if (current_quality > 0 && !hwrng_fill)
186 start_khwrngd();
187
d3cc7996 188 return 0;
844dd05f
MB
189}
190
844dd05f
MB
191static int rng_dev_open(struct inode *inode, struct file *filp)
192{
193 /* enforce read-only access to this chrdev */
194 if ((filp->f_mode & FMODE_READ) == 0)
195 return -EINVAL;
196 if (filp->f_mode & FMODE_WRITE)
197 return -EINVAL;
198 return 0;
199}
200
9996508b
IM
201static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
202 int wait) {
203 int present;
204
9372b35e 205 BUG_ON(!mutex_is_locked(&reading_mutex));
9996508b
IM
206 if (rng->read)
207 return rng->read(rng, (void *)buffer, size, wait);
208
209 if (rng->data_present)
210 present = rng->data_present(rng, wait);
211 else
212 present = 1;
213
214 if (present)
215 return rng->data_read(rng, (u32 *)buffer);
216
217 return 0;
218}
219
844dd05f
MB
220static ssize_t rng_dev_read(struct file *filp, char __user *buf,
221 size_t size, loff_t *offp)
222{
844dd05f 223 ssize_t ret = 0;
984e976f 224 int err = 0;
9996508b 225 int bytes_read, len;
3a2c0ba5 226 struct hwrng *rng;
844dd05f
MB
227
228 while (size) {
3a2c0ba5
RR
229 rng = get_current_rng();
230 if (IS_ERR(rng)) {
231 err = PTR_ERR(rng);
844dd05f 232 goto out;
9996508b 233 }
3a2c0ba5 234 if (!rng) {
844dd05f 235 err = -ENODEV;
3a2c0ba5 236 goto out;
844dd05f 237 }
984e976f 238
1ab87298
JS
239 if (mutex_lock_interruptible(&reading_mutex)) {
240 err = -ERESTARTSYS;
241 goto out_put;
242 }
9996508b 243 if (!data_avail) {
3a2c0ba5 244 bytes_read = rng_get_data(rng, rng_buffer,
f7f154f1 245 rng_buffer_size(),
9996508b
IM
246 !(filp->f_flags & O_NONBLOCK));
247 if (bytes_read < 0) {
248 err = bytes_read;
9372b35e 249 goto out_unlock_reading;
9996508b
IM
250 }
251 data_avail = bytes_read;
893f1128 252 }
844dd05f 253
9996508b
IM
254 if (!data_avail) {
255 if (filp->f_flags & O_NONBLOCK) {
256 err = -EAGAIN;
9372b35e 257 goto out_unlock_reading;
9996508b
IM
258 }
259 } else {
260 len = data_avail;
261 if (len > size)
262 len = size;
263
264 data_avail -= len;
265
266 if (copy_to_user(buf + ret, rng_buffer + data_avail,
267 len)) {
268 err = -EFAULT;
9372b35e 269 goto out_unlock_reading;
9996508b
IM
270 }
271
272 size -= len;
273 ret += len;
844dd05f
MB
274 }
275
9372b35e 276 mutex_unlock(&reading_mutex);
3a2c0ba5 277 put_rng(rng);
9996508b 278
844dd05f
MB
279 if (need_resched())
280 schedule_timeout_interruptible(1);
9996508b
IM
281
282 if (signal_pending(current)) {
283 err = -ERESTARTSYS;
844dd05f 284 goto out;
9996508b 285 }
844dd05f
MB
286 }
287out:
2cc75154 288 memset(rng_buffer, 0, rng_buffer_size());
844dd05f 289 return ret ? : err;
3a2c0ba5 290
9372b35e
RR
291out_unlock_reading:
292 mutex_unlock(&reading_mutex);
1ab87298 293out_put:
3a2c0ba5
RR
294 put_rng(rng);
295 goto out;
844dd05f
MB
296}
297
62322d25 298static const struct file_operations rng_chrdev_ops = {
844dd05f
MB
299 .owner = THIS_MODULE,
300 .open = rng_dev_open,
301 .read = rng_dev_read,
6038f373 302 .llseek = noop_llseek,
844dd05f
MB
303};
304
0daa7a0a
TI
305static const struct attribute_group *rng_dev_groups[];
306
844dd05f
MB
307static struct miscdevice rng_miscdev = {
308 .minor = RNG_MISCDEV_MINOR,
309 .name = RNG_MODULE_NAME,
e454cea2 310 .nodename = "hwrng",
844dd05f 311 .fops = &rng_chrdev_ops,
0daa7a0a 312 .groups = rng_dev_groups,
844dd05f
MB
313};
314
94fbcded
GKH
315static ssize_t hwrng_attr_current_store(struct device *dev,
316 struct device_attribute *attr,
844dd05f
MB
317 const char *buf, size_t len)
318{
319 int err;
320 struct hwrng *rng;
321
322 err = mutex_lock_interruptible(&rng_mutex);
323 if (err)
324 return -ERESTARTSYS;
325 err = -ENODEV;
326 list_for_each_entry(rng, &rng_list, list) {
d9a53b01 327 if (sysfs_streq(rng->name, buf)) {
844dd05f 328 err = 0;
90ac41bd
HX
329 if (rng != current_rng)
330 err = set_current_rng(rng);
844dd05f
MB
331 break;
332 }
333 }
334 mutex_unlock(&rng_mutex);
335
336 return err ? : len;
337}
338
94fbcded
GKH
339static ssize_t hwrng_attr_current_show(struct device *dev,
340 struct device_attribute *attr,
844dd05f
MB
341 char *buf)
342{
844dd05f 343 ssize_t ret;
3a2c0ba5 344 struct hwrng *rng;
844dd05f 345
3a2c0ba5
RR
346 rng = get_current_rng();
347 if (IS_ERR(rng))
348 return PTR_ERR(rng);
349
350 ret = snprintf(buf, PAGE_SIZE, "%s\n", rng ? rng->name : "none");
351 put_rng(rng);
844dd05f
MB
352
353 return ret;
354}
355
94fbcded
GKH
356static ssize_t hwrng_attr_available_show(struct device *dev,
357 struct device_attribute *attr,
844dd05f
MB
358 char *buf)
359{
360 int err;
844dd05f
MB
361 struct hwrng *rng;
362
363 err = mutex_lock_interruptible(&rng_mutex);
364 if (err)
365 return -ERESTARTSYS;
366 buf[0] = '\0';
367 list_for_each_entry(rng, &rng_list, list) {
61daf055
RS
368 strlcat(buf, rng->name, PAGE_SIZE);
369 strlcat(buf, " ", PAGE_SIZE);
844dd05f 370 }
61daf055 371 strlcat(buf, "\n", PAGE_SIZE);
844dd05f
MB
372 mutex_unlock(&rng_mutex);
373
61daf055 374 return strlen(buf);
844dd05f
MB
375}
376
94fbcded
GKH
377static DEVICE_ATTR(rng_current, S_IRUGO | S_IWUSR,
378 hwrng_attr_current_show,
379 hwrng_attr_current_store);
380static DEVICE_ATTR(rng_available, S_IRUGO,
381 hwrng_attr_available_show,
382 NULL);
844dd05f 383
0daa7a0a
TI
384static struct attribute *rng_dev_attrs[] = {
385 &dev_attr_rng_current.attr,
386 &dev_attr_rng_available.attr,
387 NULL
388};
389
390ATTRIBUTE_GROUPS(rng_dev);
844dd05f 391
ac3a497f 392static void __exit unregister_miscdev(void)
844dd05f 393{
b844eba2 394 misc_deregister(&rng_miscdev);
844dd05f
MB
395}
396
ac3a497f 397static int __init register_miscdev(void)
844dd05f 398{
0daa7a0a 399 return misc_register(&rng_miscdev);
844dd05f
MB
400}
401
be4000bc
TD
402static int hwrng_fillfn(void *unused)
403{
404 long rc;
405
406 while (!kthread_should_stop()) {
3a2c0ba5
RR
407 struct hwrng *rng;
408
409 rng = get_current_rng();
410 if (IS_ERR(rng) || !rng)
be4000bc 411 break;
9372b35e 412 mutex_lock(&reading_mutex);
3a2c0ba5 413 rc = rng_get_data(rng, rng_fillbuf,
be4000bc 414 rng_buffer_size(), 1);
9372b35e 415 mutex_unlock(&reading_mutex);
3a2c0ba5 416 put_rng(rng);
be4000bc
TD
417 if (rc <= 0) {
418 pr_warn("hwrng: no data available\n");
419 msleep_interruptible(10000);
420 continue;
421 }
9372b35e 422 /* Outside lock, sure, but y'know: randomness. */
be4000bc 423 add_hwgenerator_randomness((void *)rng_fillbuf, rc,
e02b8765 424 rc * current_quality * 8 >> 10);
2cc75154 425 memset(rng_fillbuf, 0, rng_buffer_size());
be4000bc 426 }
9dda727d 427 hwrng_fill = NULL;
be4000bc
TD
428 return 0;
429}
430
431static void start_khwrngd(void)
432{
433 hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
17fb874d 434 if (IS_ERR(hwrng_fill)) {
be4000bc
TD
435 pr_err("hwrng_fill thread creation failed");
436 hwrng_fill = NULL;
437 }
438}
439
844dd05f
MB
440int hwrng_register(struct hwrng *rng)
441{
844dd05f
MB
442 int err = -EINVAL;
443 struct hwrng *old_rng, *tmp;
444
445 if (rng->name == NULL ||
9996508b 446 (rng->data_read == NULL && rng->read == NULL))
844dd05f
MB
447 goto out;
448
449 mutex_lock(&rng_mutex);
844dd05f
MB
450 /* Must not register two RNGs with the same name. */
451 err = -EEXIST;
452 list_for_each_entry(tmp, &rng_list, list) {
453 if (strcmp(tmp->name, rng->name) == 0)
454 goto out_unlock;
455 }
456
15b66cd5
HX
457 init_completion(&rng->cleanup_done);
458 complete(&rng->cleanup_done);
459
844dd05f 460 old_rng = current_rng;
ebbbfa24 461 err = 0;
844dd05f 462 if (!old_rng) {
90ac41bd 463 err = set_current_rng(rng);
844dd05f
MB
464 if (err)
465 goto out_unlock;
844dd05f 466 }
844dd05f 467 list_add_tail(&rng->list, &rng_list);
d9e79726 468
d3cc7996
AS
469 if (old_rng && !rng->init) {
470 /*
471 * Use a new device's input to add some randomness to
472 * the system. If this rng device isn't going to be
473 * used right away, its init function hasn't been
474 * called yet; so only use the randomness from devices
475 * that don't need an init callback.
476 */
477 add_early_randomness(rng);
478 }
479
844dd05f
MB
480out_unlock:
481 mutex_unlock(&rng_mutex);
482out:
483 return err;
484}
485EXPORT_SYMBOL_GPL(hwrng_register);
486
b844eba2 487void hwrng_unregister(struct hwrng *rng)
844dd05f 488{
844dd05f
MB
489 mutex_lock(&rng_mutex);
490
491 list_del(&rng->list);
492 if (current_rng == rng) {
3a2c0ba5
RR
493 drop_current_rng();
494 if (!list_empty(&rng_list)) {
495 struct hwrng *tail;
496
497 tail = list_entry(rng_list.prev, struct hwrng, list);
498
90ac41bd 499 set_current_rng(tail);
844dd05f
MB
500 }
501 }
3a2c0ba5 502
be4000bc 503 if (list_empty(&rng_list)) {
1dacb395 504 mutex_unlock(&rng_mutex);
be4000bc
TD
505 if (hwrng_fill)
506 kthread_stop(hwrng_fill);
1dacb395
AK
507 } else
508 mutex_unlock(&rng_mutex);
a027f30d 509
77584ee5 510 wait_for_completion(&rng->cleanup_done);
844dd05f 511}
b844eba2 512EXPORT_SYMBOL_GPL(hwrng_unregister);
844dd05f 513
4d9b519c
DT
514static void devm_hwrng_release(struct device *dev, void *res)
515{
516 hwrng_unregister(*(struct hwrng **)res);
517}
518
519static int devm_hwrng_match(struct device *dev, void *res, void *data)
520{
521 struct hwrng **r = res;
522
523 if (WARN_ON(!r || !*r))
524 return 0;
525
526 return *r == data;
527}
528
529int devm_hwrng_register(struct device *dev, struct hwrng *rng)
530{
531 struct hwrng **ptr;
532 int error;
533
534 ptr = devres_alloc(devm_hwrng_release, sizeof(*ptr), GFP_KERNEL);
535 if (!ptr)
536 return -ENOMEM;
537
538 error = hwrng_register(rng);
539 if (error) {
540 devres_free(ptr);
541 return error;
542 }
543
544 *ptr = rng;
545 devres_add(dev, ptr);
546 return 0;
547}
548EXPORT_SYMBOL_GPL(devm_hwrng_register);
549
550void devm_hwrng_unregister(struct device *dev, struct hwrng *rng)
551{
552 devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng);
553}
554EXPORT_SYMBOL_GPL(devm_hwrng_unregister);
555
ac3a497f
HX
556static int __init hwrng_modinit(void)
557{
58b022ac
PM
558 int ret = -ENOMEM;
559
560 /* kmalloc makes this safe for virt_to_page() in virtio_rng.c */
561 rng_buffer = kmalloc(rng_buffer_size(), GFP_KERNEL);
562 if (!rng_buffer)
563 return -ENOMEM;
564
565 rng_fillbuf = kmalloc(rng_buffer_size(), GFP_KERNEL);
566 if (!rng_fillbuf) {
567 kfree(rng_buffer);
568 return -ENOMEM;
569 }
570
571 ret = register_miscdev();
572 if (ret) {
573 kfree(rng_fillbuf);
574 kfree(rng_buffer);
575 }
576
577 return ret;
ac3a497f
HX
578}
579
580static void __exit hwrng_modexit(void)
b7d44d94
ST
581{
582 mutex_lock(&rng_mutex);
583 BUG_ON(current_rng);
584 kfree(rng_buffer);
be4000bc 585 kfree(rng_fillbuf);
b7d44d94 586 mutex_unlock(&rng_mutex);
ac3a497f
HX
587
588 unregister_miscdev();
b7d44d94
ST
589}
590
ac3a497f
HX
591module_init(hwrng_modinit);
592module_exit(hwrng_modexit);
844dd05f
MB
593
594MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver");
595MODULE_LICENSE("GPL");