1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun Hardware Random Number Generator 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun Please read Documentation/admin-guide/hw_random.rst for details on use. 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun ---------------------------------------------------------- 7*4882a593Smuzhiyun This software may be used and distributed according to the terms 8*4882a593Smuzhiyun of the GNU General Public License, incorporated herein by reference. 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef LINUX_HWRANDOM_H_ 13*4882a593Smuzhiyun #define LINUX_HWRANDOM_H_ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/completion.h> 16*4882a593Smuzhiyun #include <linux/types.h> 17*4882a593Smuzhiyun #include <linux/list.h> 18*4882a593Smuzhiyun #include <linux/kref.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /** 21*4882a593Smuzhiyun * struct hwrng - Hardware Random Number Generator driver 22*4882a593Smuzhiyun * @name: Unique RNG name. 23*4882a593Smuzhiyun * @init: Initialization callback (can be NULL). 24*4882a593Smuzhiyun * @cleanup: Cleanup callback (can be NULL). 25*4882a593Smuzhiyun * @data_present: Callback to determine if data is available 26*4882a593Smuzhiyun * on the RNG. If NULL, it is assumed that 27*4882a593Smuzhiyun * there is always data available. *OBSOLETE* 28*4882a593Smuzhiyun * @data_read: Read data from the RNG device. 29*4882a593Smuzhiyun * Returns the number of lower random bytes in "data". 30*4882a593Smuzhiyun * Must not be NULL. *OBSOLETE* 31*4882a593Smuzhiyun * @read: New API. drivers can fill up to max bytes of data 32*4882a593Smuzhiyun * into the buffer. The buffer is aligned for any type 33*4882a593Smuzhiyun * and max is a multiple of 4 and >= 32 bytes. 34*4882a593Smuzhiyun * @priv: Private data, for use by the RNG driver. 35*4882a593Smuzhiyun * @quality: Estimation of true entropy in RNG's bitstream 36*4882a593Smuzhiyun * (in bits of entropy per 1024 bits of input; 37*4882a593Smuzhiyun * valid values: 1 to 1024, or 0 for unknown). 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun struct hwrng { 40*4882a593Smuzhiyun const char *name; 41*4882a593Smuzhiyun int (*init)(struct hwrng *rng); 42*4882a593Smuzhiyun void (*cleanup)(struct hwrng *rng); 43*4882a593Smuzhiyun int (*data_present)(struct hwrng *rng, int wait); 44*4882a593Smuzhiyun int (*data_read)(struct hwrng *rng, u32 *data); 45*4882a593Smuzhiyun int (*read)(struct hwrng *rng, void *data, size_t max, bool wait); 46*4882a593Smuzhiyun unsigned long priv; 47*4882a593Smuzhiyun unsigned short quality; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* internal. */ 50*4882a593Smuzhiyun struct list_head list; 51*4882a593Smuzhiyun struct kref ref; 52*4882a593Smuzhiyun struct completion cleanup_done; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct device; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /** Register a new Hardware Random Number Generator driver. */ 58*4882a593Smuzhiyun extern int hwrng_register(struct hwrng *rng); 59*4882a593Smuzhiyun extern int devm_hwrng_register(struct device *dev, struct hwrng *rng); 60*4882a593Smuzhiyun /** Unregister a Hardware Random Number Generator driver. */ 61*4882a593Smuzhiyun extern void hwrng_unregister(struct hwrng *rng); 62*4882a593Smuzhiyun extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng); 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #endif /* LINUX_HWRANDOM_H_ */ 65