Lines Matching full:rng

34 /* the current rng has been explicitly chosen by user via sysfs */
41 /* Protects rng read functions, data_avail, rng_buffer and rng_fillbuf */
56 static int hwrng_init(struct hwrng *rng);
59 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
67 static void add_early_randomness(struct hwrng *rng) in add_early_randomness() argument
72 bytes_read = rng_get_data(rng, rng_fillbuf, 32, 0); in add_early_randomness()
75 size_t entropy = bytes_read * 8 * rng->quality / 1024; in add_early_randomness()
82 struct hwrng *rng = container_of(kref, struct hwrng, ref); in cleanup_rng() local
84 if (rng->cleanup) in cleanup_rng()
85 rng->cleanup(rng); in cleanup_rng()
87 complete(&rng->cleanup_done); in cleanup_rng()
90 static int set_current_rng(struct hwrng *rng) in set_current_rng() argument
96 err = hwrng_init(rng); in set_current_rng()
101 current_rng = rng; in set_current_rng()
137 struct hwrng *rng; in get_current_rng() local
142 rng = get_current_rng_nolock(); in get_current_rng()
145 return rng; in get_current_rng()
148 static void put_rng(struct hwrng *rng) in put_rng() argument
152 * on rng again immediately. in put_rng()
155 if (rng) in put_rng()
156 kref_put(&rng->ref, cleanup_rng); in put_rng()
160 static int hwrng_init(struct hwrng *rng) in hwrng_init() argument
162 if (kref_get_unless_zero(&rng->ref)) in hwrng_init()
165 if (rng->init) { in hwrng_init()
168 ret = rng->init(rng); in hwrng_init()
173 kref_init(&rng->ref); in hwrng_init()
174 reinit_completion(&rng->cleanup_done); in hwrng_init()
177 rng->quality = min_t(u16, min_t(u16, default_quality, 1024), rng->quality ?: 1024); in hwrng_init()
178 current_quality = rng->quality; /* obsolete */ in hwrng_init()
193 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, in rng_get_data() argument
198 if (rng->read) in rng_get_data()
199 return rng->read(rng, (void *)buffer, size, wait); in rng_get_data()
201 if (rng->data_present) in rng_get_data()
202 present = rng->data_present(rng, wait); in rng_get_data()
207 return rng->data_read(rng, (u32 *)buffer); in rng_get_data()
219 struct hwrng *rng; in rng_dev_read() local
222 rng = get_current_rng(); in rng_dev_read()
223 if (IS_ERR(rng)) { in rng_dev_read()
224 err = PTR_ERR(rng); in rng_dev_read()
227 if (!rng) { in rng_dev_read()
237 bytes_read = rng_get_data(rng, rng_buffer, in rng_dev_read()
262 put_rng(rng); in rng_dev_read()
290 put_rng(rng); in rng_dev_read()
313 struct hwrng *rng, *new_rng = NULL; in enable_best_rng() local
318 /* no rng to use? */ in enable_best_rng()
325 /* use the rng which offers the best quality */ in enable_best_rng()
326 list_for_each_entry(rng, &rng_list, list) { in enable_best_rng()
327 if (!new_rng || rng->quality > new_rng->quality) in enable_best_rng()
328 new_rng = rng; in enable_best_rng()
343 struct hwrng *rng, *old_rng, *new_rng; in rng_current_store() local
353 list_for_each_entry(rng, &rng_list, list) { in rng_current_store()
354 if (sysfs_streq(rng->name, buf)) { in rng_current_store()
355 err = set_current_rng(rng); in rng_current_store()
379 struct hwrng *rng; in rng_current_show() local
381 rng = get_current_rng(); in rng_current_show()
382 if (IS_ERR(rng)) in rng_current_show()
383 return PTR_ERR(rng); in rng_current_show()
385 ret = snprintf(buf, PAGE_SIZE, "%s\n", rng ? rng->name : "none"); in rng_current_show()
386 put_rng(rng); in rng_current_show()
396 struct hwrng *rng; in rng_available_show() local
402 list_for_each_entry(rng, &rng_list, list) { in rng_available_show()
403 strlcat(buf, rng->name, PAGE_SIZE); in rng_available_show()
424 struct hwrng *rng; in rng_quality_show() local
426 rng = get_current_rng(); in rng_quality_show()
427 if (IS_ERR(rng)) in rng_quality_show()
428 return PTR_ERR(rng); in rng_quality_show()
430 if (!rng) /* no need to put_rng */ in rng_quality_show()
433 ret = sysfs_emit(buf, "%hu\n", rng->quality); in rng_quality_show()
434 put_rng(rng); in rng_quality_show()
467 /* the best available RNG may have changed */ in rng_quality_store()
507 struct hwrng *rng; in hwrng_fillfn() local
509 rng = get_current_rng(); in hwrng_fillfn()
510 if (IS_ERR(rng) || !rng) in hwrng_fillfn()
513 rc = rng_get_data(rng, rng_fillbuf, in hwrng_fillfn()
515 if (current_quality != rng->quality) in hwrng_fillfn()
516 rng->quality = current_quality; /* obsolete */ in hwrng_fillfn()
517 quality = rng->quality; in hwrng_fillfn()
521 hwrng_msleep(rng, 10000); in hwrng_fillfn()
523 put_rng(rng); in hwrng_fillfn()
543 int hwrng_register(struct hwrng *rng) in hwrng_register() argument
549 if (!rng->name || (!rng->data_read && !rng->read)) in hwrng_register()
557 if (strcmp(tmp->name, rng->name) == 0) in hwrng_register()
560 list_add_tail(&rng->list, &rng_list); in hwrng_register()
562 init_completion(&rng->cleanup_done); in hwrng_register()
563 complete(&rng->cleanup_done); in hwrng_register()
564 init_completion(&rng->dying); in hwrng_register()
567 (!cur_rng_set_by_user && rng->quality > current_rng->quality)) { in hwrng_register()
569 * Set new rng as current as the new rng source in hwrng_register()
573 err = set_current_rng(rng); in hwrng_register()
580 kref_get(&rng->ref); in hwrng_register()
583 if (is_new_current || !rng->init) { in hwrng_register()
586 * the system. If this rng device isn't going to be in hwrng_register()
591 add_early_randomness(rng); in hwrng_register()
594 put_rng(rng); in hwrng_register()
603 void hwrng_unregister(struct hwrng *rng) in hwrng_unregister() argument
611 list_del(&rng->list); in hwrng_unregister()
612 complete_all(&rng->dying); in hwrng_unregister()
613 if (current_rng == rng) { in hwrng_unregister()
635 wait_for_completion(&rng->cleanup_done); in hwrng_unregister()
654 int devm_hwrng_register(struct device *dev, struct hwrng *rng) in devm_hwrng_register() argument
663 error = hwrng_register(rng); in devm_hwrng_register()
669 *ptr = rng; in devm_hwrng_register()
675 void devm_hwrng_unregister(struct device *dev, struct hwrng *rng) in devm_hwrng_unregister() argument
677 devres_release(dev, devm_hwrng_release, devm_hwrng_match, rng); in devm_hwrng_unregister()
681 long hwrng_msleep(struct hwrng *rng, unsigned int msecs) in hwrng_msleep() argument
685 return wait_for_completion_interruptible_timeout(&rng->dying, timeout); in hwrng_msleep()
689 long hwrng_yield(struct hwrng *rng) in hwrng_yield() argument
691 return wait_for_completion_interruptible_timeout(&rng->dying, 1); in hwrng_yield()
733 MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver");