xref: /linux-6.15/include/linux/hw_random.h (revision 4604b388)
1844dd05fSMichael Buesch /*
2844dd05fSMichael Buesch 	Hardware Random Number Generator
3844dd05fSMichael Buesch 
44f4cfa6cSMauro Carvalho Chehab 	Please read Documentation/admin-guide/hw_random.rst for details on use.
5844dd05fSMichael Buesch 
6844dd05fSMichael Buesch 	----------------------------------------------------------
7844dd05fSMichael Buesch 	This software may be used and distributed according to the terms
8844dd05fSMichael Buesch         of the GNU General Public License, incorporated herein by reference.
9844dd05fSMichael Buesch 
10844dd05fSMichael Buesch  */
11844dd05fSMichael Buesch 
12844dd05fSMichael Buesch #ifndef LINUX_HWRANDOM_H_
13844dd05fSMichael Buesch #define LINUX_HWRANDOM_H_
14844dd05fSMichael Buesch 
1577584ee5SHerbert Xu #include <linux/completion.h>
163a2c0ba5SRusty Russell #include <linux/kref.h>
17*4604b388SAndy Shevchenko #include <linux/types.h>
18844dd05fSMichael Buesch 
19844dd05fSMichael Buesch /**
20844dd05fSMichael Buesch  * struct hwrng - Hardware Random Number Generator driver
21844dd05fSMichael Buesch  * @name:		Unique RNG name.
22844dd05fSMichael Buesch  * @init:		Initialization callback (can be NULL).
23844dd05fSMichael Buesch  * @cleanup:		Cleanup callback (can be NULL).
24844dd05fSMichael Buesch  * @data_present:	Callback to determine if data is available
25844dd05fSMichael Buesch  *			on the RNG. If NULL, it is assumed that
269996508bSIan Molton  *			there is always data available.  *OBSOLETE*
27844dd05fSMichael Buesch  * @data_read:		Read data from the RNG device.
28844dd05fSMichael Buesch  *			Returns the number of lower random bytes in "data".
29988acec9SSasha Levin  *			Must not be NULL.    *OBSOLETE*
309996508bSIan Molton  * @read:		New API. drivers can fill up to max bytes of data
31ed0bd721SDaniel Thompson  *			into the buffer. The buffer is aligned for any type
32ed424bb3SPrasannaKumar Muralidharan  *			and max is a multiple of 4 and >= 32 bytes.
33844dd05fSMichael Buesch  * @priv:		Private data, for use by the RNG driver.
340f734e6eSTorsten Duwe  * @quality:		Estimation of true entropy in RNG's bitstream
35fae29f13SMichael S. Tsirkin  *			(in bits of entropy per 1024 bits of input;
3616bdbae3SJason A. Donenfeld  *			valid values: 1 to 1024, or 0 for maximum).
37844dd05fSMichael Buesch  */
38844dd05fSMichael Buesch struct hwrng {
39844dd05fSMichael Buesch 	const char *name;
40844dd05fSMichael Buesch 	int (*init)(struct hwrng *rng);
41844dd05fSMichael Buesch 	void (*cleanup)(struct hwrng *rng);
42984e976fSPatrick McHardy 	int (*data_present)(struct hwrng *rng, int wait);
43844dd05fSMichael Buesch 	int (*data_read)(struct hwrng *rng, u32 *data);
449996508bSIan Molton 	int (*read)(struct hwrng *rng, void *data, size_t max, bool wait);
45844dd05fSMichael Buesch 	unsigned long priv;
460f734e6eSTorsten Duwe 	unsigned short quality;
47844dd05fSMichael Buesch 
48844dd05fSMichael Buesch 	/* internal. */
49844dd05fSMichael Buesch 	struct list_head list;
503a2c0ba5SRusty Russell 	struct kref ref;
5177584ee5SHerbert Xu 	struct completion cleanup_done;
5236cb6494SJason A. Donenfeld 	struct completion dying;
53844dd05fSMichael Buesch };
54844dd05fSMichael Buesch 
554d9b519cSDmitry Torokhov struct device;
564d9b519cSDmitry Torokhov 
57844dd05fSMichael Buesch /** Register a new Hardware Random Number Generator driver. */
58844dd05fSMichael Buesch extern int hwrng_register(struct hwrng *rng);
594d9b519cSDmitry Torokhov extern int devm_hwrng_register(struct device *dev, struct hwrng *rng);
60844dd05fSMichael Buesch /** Unregister a Hardware Random Number Generator driver. */
61b844eba2SRafael J. Wysocki extern void hwrng_unregister(struct hwrng *rng);
624d9b519cSDmitry Torokhov extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
63844dd05fSMichael Buesch 
6436cb6494SJason A. Donenfeld extern long hwrng_msleep(struct hwrng *rng, unsigned int msecs);
65b58a3600SStefan Wahren extern long hwrng_yield(struct hwrng *rng);
6636cb6494SJason A. Donenfeld 
67844dd05fSMichael Buesch #endif /* LINUX_HWRANDOM_H_ */
68