2 Added support for the AMD Geode LX RNG
3 (c) Copyright 2004-2005 Advanced Micro Devices, Inc.
7 Hardware driver for the Intel/AMD/VIA Random Number Generators (RNG)
12 Hardware driver for the AMD 768 Random Number Generator (RNG)
17 Hardware driver for Intel i810 Random Number Generator (RNG)
23 Copyright 2005 (c) MontaVista Software, Inc.
25 Please read Documentation/hw_random.txt for details on use.
27 ----------------------------------------------------------
28 This software may be used and distributed according to the terms
29 of the GNU General Public License, incorporated herein by reference.
34 #include <linux/device.h>
35 #include <linux/hw_random.h>
36 #include <linux/module.h>
37 #include <linux/kernel.h>
39 #include <linux/sched.h>
40 #include <linux/miscdevice.h>
41 #include <linux/delay.h>
42 #include <linux/slab.h>
43 #include <linux/random.h>
44 #include <asm/uaccess.h>
47 #define RNG_MODULE_NAME "hw_random"
48 #define PFX RNG_MODULE_NAME ": "
49 #define RNG_MISCDEV_MINOR 183 /* official */
52 static struct hwrng *current_rng;
53 static LIST_HEAD(rng_list);
54 static DEFINE_MUTEX(rng_mutex);
55 static int data_avail;
56 static u8 *rng_buffer;
58 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
61 static size_t rng_buffer_size(void)
63 return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
66 static void add_early_randomness(struct hwrng *rng)
68 unsigned char bytes[16];
72 * Currently only virtio-rng cannot return data during device
73 * probe, and that's handled in virtio-rng.c itself. If there
74 * are more such devices, this call to rng_get_data can be
75 * made conditional here instead of doing it per-device.
77 bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1);
79 add_device_randomness(bytes, bytes_read);
82 static inline int hwrng_init(struct hwrng *rng)
91 add_early_randomness(rng);
95 static inline void hwrng_cleanup(struct hwrng *rng)
97 if (rng && rng->cleanup)
101 static int rng_dev_open(struct inode *inode, struct file *filp)
103 /* enforce read-only access to this chrdev */
104 if ((filp->f_mode & FMODE_READ) == 0)
106 if (filp->f_mode & FMODE_WRITE)
111 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
116 return rng->read(rng, (void *)buffer, size, wait);
118 if (rng->data_present)
119 present = rng->data_present(rng, wait);
124 return rng->data_read(rng, (u32 *)buffer);
129 static ssize_t rng_dev_read(struct file *filp, char __user *buf,
130 size_t size, loff_t *offp)
137 if (mutex_lock_interruptible(&rng_mutex)) {
148 bytes_read = rng_get_data(current_rng, rng_buffer,
150 !(filp->f_flags & O_NONBLOCK));
151 if (bytes_read < 0) {
155 data_avail = bytes_read;
159 if (filp->f_flags & O_NONBLOCK) {
170 if (copy_to_user(buf + ret, rng_buffer + data_avail,
180 mutex_unlock(&rng_mutex);
183 schedule_timeout_interruptible(1);
185 if (signal_pending(current)) {
193 mutex_unlock(&rng_mutex);
198 static const struct file_operations rng_chrdev_ops = {
199 .owner = THIS_MODULE,
200 .open = rng_dev_open,
201 .read = rng_dev_read,
202 .llseek = noop_llseek,
205 static struct miscdevice rng_miscdev = {
206 .minor = RNG_MISCDEV_MINOR,
207 .name = RNG_MODULE_NAME,
209 .fops = &rng_chrdev_ops,
213 static ssize_t hwrng_attr_current_store(struct device *dev,
214 struct device_attribute *attr,
215 const char *buf, size_t len)
220 err = mutex_lock_interruptible(&rng_mutex);
224 list_for_each_entry(rng, &rng_list, list) {
225 if (strcmp(rng->name, buf) == 0) {
226 if (rng == current_rng) {
230 err = hwrng_init(rng);
233 hwrng_cleanup(current_rng);
239 mutex_unlock(&rng_mutex);
244 static ssize_t hwrng_attr_current_show(struct device *dev,
245 struct device_attribute *attr,
250 const char *name = "none";
252 err = mutex_lock_interruptible(&rng_mutex);
256 name = current_rng->name;
257 ret = snprintf(buf, PAGE_SIZE, "%s\n", name);
258 mutex_unlock(&rng_mutex);
263 static ssize_t hwrng_attr_available_show(struct device *dev,
264 struct device_attribute *attr,
271 err = mutex_lock_interruptible(&rng_mutex);
275 list_for_each_entry(rng, &rng_list, list) {
276 strncat(buf, rng->name, PAGE_SIZE - ret - 1);
277 ret += strlen(rng->name);
278 strncat(buf, " ", PAGE_SIZE - ret - 1);
281 strncat(buf, "\n", PAGE_SIZE - ret - 1);
283 mutex_unlock(&rng_mutex);
288 static DEVICE_ATTR(rng_current, S_IRUGO | S_IWUSR,
289 hwrng_attr_current_show,
290 hwrng_attr_current_store);
291 static DEVICE_ATTR(rng_available, S_IRUGO,
292 hwrng_attr_available_show,
296 static void unregister_miscdev(void)
298 device_remove_file(rng_miscdev.this_device, &dev_attr_rng_available);
299 device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current);
300 misc_deregister(&rng_miscdev);
303 static int register_miscdev(void)
307 err = misc_register(&rng_miscdev);
310 err = device_create_file(rng_miscdev.this_device,
311 &dev_attr_rng_current);
314 err = device_create_file(rng_miscdev.this_device,
315 &dev_attr_rng_available);
317 goto err_remove_current;
322 device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current);
324 misc_deregister(&rng_miscdev);
328 int hwrng_register(struct hwrng *rng)
331 struct hwrng *old_rng, *tmp;
333 if (rng->name == NULL ||
334 (rng->data_read == NULL && rng->read == NULL))
337 mutex_lock(&rng_mutex);
339 /* kmalloc makes this safe for virt_to_page() in virtio_rng.c */
342 rng_buffer = kmalloc(rng_buffer_size(), GFP_KERNEL);
347 /* Must not register two RNGs with the same name. */
349 list_for_each_entry(tmp, &rng_list, list) {
350 if (strcmp(tmp->name, rng->name) == 0)
354 old_rng = current_rng;
356 err = hwrng_init(rng);
363 err = register_miscdev();
370 INIT_LIST_HEAD(&rng->list);
371 list_add_tail(&rng->list, &rng_list);
373 if (old_rng && !rng->init) {
375 * Use a new device's input to add some randomness to
376 * the system. If this rng device isn't going to be
377 * used right away, its init function hasn't been
378 * called yet; so only use the randomness from devices
379 * that don't need an init callback.
381 add_early_randomness(rng);
385 mutex_unlock(&rng_mutex);
389 EXPORT_SYMBOL_GPL(hwrng_register);
391 void hwrng_unregister(struct hwrng *rng)
395 mutex_lock(&rng_mutex);
397 list_del(&rng->list);
398 if (current_rng == rng) {
400 if (list_empty(&rng_list)) {
403 current_rng = list_entry(rng_list.prev, struct hwrng, list);
404 err = hwrng_init(current_rng);
409 if (list_empty(&rng_list))
410 unregister_miscdev();
412 mutex_unlock(&rng_mutex);
414 EXPORT_SYMBOL_GPL(hwrng_unregister);
416 static void __exit hwrng_exit(void)
418 mutex_lock(&rng_mutex);
421 mutex_unlock(&rng_mutex);
424 module_exit(hwrng_exit);
426 MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver");
427 MODULE_LICENSE("GPL");