1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Randomness driver for virtio
4 * Copyright (C) 2007, 2008 Rusty Russell IBM Corporation
7 #include <asm/barrier.h>
9 #include <linux/hw_random.h>
10 #include <linux/scatterlist.h>
11 #include <linux/spinlock.h>
12 #include <linux/virtio.h>
13 #include <linux/virtio_rng.h>
14 #include <linux/module.h>
15 #include <linux/slab.h>
17 static DEFINE_IDA(rng_index_ida
);
24 bool hwrng_register_done
;
27 struct completion have_data
;
28 unsigned int data_avail
;
29 unsigned int data_idx
;
30 /* minimal size returned by rng_buffer_size() */
31 #if SMP_CACHE_BYTES < 32
34 u8 data
[SMP_CACHE_BYTES
];
38 static void random_recv_done(struct virtqueue
*vq
)
40 struct virtrng_info
*vi
= vq
->vdev
->priv
;
43 /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */
44 if (!virtqueue_get_buf(vi
->vq
, &len
))
47 smp_store_release(&vi
->data_avail
, len
);
48 complete(&vi
->have_data
);
51 static void request_entropy(struct virtrng_info
*vi
)
53 struct scatterlist sg
;
55 reinit_completion(&vi
->have_data
);
58 sg_init_one(&sg
, vi
->data
, sizeof(vi
->data
));
60 /* There should always be room for one buffer. */
61 virtqueue_add_inbuf(vi
->vq
, &sg
, 1, vi
->data
, GFP_KERNEL
);
63 virtqueue_kick(vi
->vq
);
66 static unsigned int copy_data(struct virtrng_info
*vi
, void *buf
,
69 size
= min_t(unsigned int, size
, vi
->data_avail
);
70 memcpy(buf
, vi
->data
+ vi
->data_idx
, size
);
72 vi
->data_avail
-= size
;
73 if (vi
->data_avail
== 0)
78 static int virtio_read(struct hwrng
*rng
, void *buf
, size_t size
, bool wait
)
81 struct virtrng_info
*vi
= (struct virtrng_info
*)rng
->priv
;
85 if (vi
->hwrng_removed
)
90 /* copy available data */
91 if (smp_load_acquire(&vi
->data_avail
)) {
92 chunk
= copy_data(vi
, buf
, size
);
100 /* We have already copied available entropy,
101 * so either size is 0 or data_avail is 0
104 /* data_avail is 0 but a request is pending */
105 ret
= wait_for_completion_killable(&vi
->have_data
);
108 /* if vi->data_avail is 0, we have been interrupted
109 * by a cleanup, but buffer stays in the queue
111 if (vi
->data_avail
== 0)
114 chunk
= copy_data(vi
, buf
+ read
, size
);
122 static void virtio_cleanup(struct hwrng
*rng
)
124 struct virtrng_info
*vi
= (struct virtrng_info
*)rng
->priv
;
126 complete(&vi
->have_data
);
129 static int probe_common(struct virtio_device
*vdev
)
132 struct virtrng_info
*vi
= NULL
;
134 vi
= kzalloc(sizeof(struct virtrng_info
), GFP_KERNEL
);
138 vi
->index
= index
= ida_alloc(&rng_index_ida
, GFP_KERNEL
);
143 sprintf(vi
->name
, "virtio_rng.%d", index
);
144 init_completion(&vi
->have_data
);
146 vi
->hwrng
= (struct hwrng
) {
148 .cleanup
= virtio_cleanup
,
149 .priv
= (unsigned long)vi
,
154 /* We expect a single virtqueue. */
155 vi
->vq
= virtio_find_single_vq(vdev
, random_recv_done
, "input");
156 if (IS_ERR(vi
->vq
)) {
157 err
= PTR_ERR(vi
->vq
);
161 virtio_device_ready(vdev
);
163 /* we always have a pending entropy request */
169 ida_free(&rng_index_ida
, index
);
175 static void remove_common(struct virtio_device
*vdev
)
177 struct virtrng_info
*vi
= vdev
->priv
;
179 vi
->hwrng_removed
= true;
182 complete(&vi
->have_data
);
183 if (vi
->hwrng_register_done
)
184 hwrng_unregister(&vi
->hwrng
);
185 virtio_reset_device(vdev
);
186 vdev
->config
->del_vqs(vdev
);
187 ida_free(&rng_index_ida
, vi
->index
);
191 static int virtrng_probe(struct virtio_device
*vdev
)
193 return probe_common(vdev
);
196 static void virtrng_remove(struct virtio_device
*vdev
)
201 static void virtrng_scan(struct virtio_device
*vdev
)
203 struct virtrng_info
*vi
= vdev
->priv
;
206 err
= hwrng_register(&vi
->hwrng
);
208 vi
->hwrng_register_done
= true;
211 static int virtrng_freeze(struct virtio_device
*vdev
)
217 static int virtrng_restore(struct virtio_device
*vdev
)
221 err
= probe_common(vdev
);
223 struct virtrng_info
*vi
= vdev
->priv
;
226 * Set hwrng_removed to ensure that virtio_read()
227 * does not block waiting for data before the
228 * registration is complete.
230 vi
->hwrng_removed
= true;
231 err
= hwrng_register(&vi
->hwrng
);
233 vi
->hwrng_register_done
= true;
234 vi
->hwrng_removed
= false;
241 static const struct virtio_device_id id_table
[] = {
242 { VIRTIO_ID_RNG
, VIRTIO_DEV_ANY_ID
},
246 static struct virtio_driver virtio_rng_driver
= {
247 .driver
.name
= KBUILD_MODNAME
,
248 .id_table
= id_table
,
249 .probe
= virtrng_probe
,
250 .remove
= virtrng_remove
,
251 .scan
= virtrng_scan
,
252 .freeze
= pm_sleep_ptr(virtrng_freeze
),
253 .restore
= pm_sleep_ptr(virtrng_restore
),
256 module_virtio_driver(virtio_rng_driver
);
257 MODULE_DEVICE_TABLE(virtio
, id_table
);
258 MODULE_DESCRIPTION("Virtio random number driver");
259 MODULE_LICENSE("GPL");