1 /*
2 * Copyright 2013, Jérôme Duval, korli@users.berlios.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include "VirtioRNGPrivate.h"
8
9 #include <new>
10 #include <stdlib.h>
11 #include <string.h>
12
13
14 #define VIRTIO_RNG_CONTROLLER_PRETTY_NAME "Virtio RNG Device"
15
16 #define VIRTIO_RNG_DRIVER_MODULE_NAME "busses/random/virtio_rng/driver_v1"
17 #define VIRTIO_RNG_DEVICE_MODULE_NAME "busses/random/virtio_rng/device_v1"
18
19
20 device_manager_info *gDeviceManager;
21 random_for_controller_interface *gRandom;
22 dpc_module_info *gDPC;
23
24
25 // #pragma mark - Driver module interface
26
27
28 static float
virtio_rng_supports_device(device_node * parent)29 virtio_rng_supports_device(device_node *parent)
30 {
31 const char *bus;
32 uint16 deviceType;
33
34 // make sure parent is really the Virtio bus manager
35 if (gDeviceManager->get_attr_string(parent, B_DEVICE_BUS, &bus, false))
36 return -1;
37
38 if (strcmp(bus, "virtio"))
39 return 0.0;
40
41 // check whether it's really a Virtio Entropy Device
42 if (gDeviceManager->get_attr_uint16(parent, VIRTIO_DEVICE_TYPE_ITEM,
43 &deviceType, true) != B_OK || deviceType != VIRTIO_DEVICE_ID_ENTROPY)
44 return 0.0;
45
46 TRACE("Virtio RNG device found!\n");
47
48 return 0.6f;
49 }
50
51
52 static status_t
virtio_rng_register_device(device_node * parent)53 virtio_rng_register_device(device_node *parent)
54 {
55 CALLED();
56
57 device_attr attrs[] = {
58 { NULL }
59 };
60
61 return gDeviceManager->register_node(parent, VIRTIO_RNG_DRIVER_MODULE_NAME,
62 attrs, NULL, NULL);
63 }
64
65
66 static status_t
virtio_rng_init_driver(device_node * node,void ** _cookie)67 virtio_rng_init_driver(device_node *node, void **_cookie)
68 {
69 CALLED();
70 VirtioRNGDevice *device = new(std::nothrow) VirtioRNGDevice(node);
71 if (device == NULL)
72 return B_NO_MEMORY;
73 status_t status = device->InitCheck();
74 if (status < B_OK) {
75 delete device;
76 return status;
77 }
78 *_cookie = device;
79
80 return B_OK;
81 }
82
83
84 static void
virtio_rng_uninit_driver(void * cookie)85 virtio_rng_uninit_driver(void *cookie)
86 {
87 VirtioRNGDevice *device = (VirtioRNGDevice*)cookie;
88 delete device;
89 }
90
91
92 static driver_module_info sVirtioRNGDriver = {
93 {
94 VIRTIO_RNG_DRIVER_MODULE_NAME,
95 0,
96 NULL
97 },
98 virtio_rng_supports_device,
99 virtio_rng_register_device,
100 virtio_rng_init_driver,
101 virtio_rng_uninit_driver,
102 NULL,
103 NULL, // rescan
104 NULL, // device_removed
105 };
106
107
108 module_dependency module_dependencies[] = {
109 { B_DEVICE_MANAGER_MODULE_NAME, (module_info **)&gDeviceManager },
110 { RANDOM_FOR_CONTROLLER_MODULE_NAME, (module_info **)&gRandom },
111 { B_DPC_MODULE_NAME, (module_info **)&gDPC },
112 {}
113 };
114
115
116 module_info *modules[] = {
117 (module_info *)&sVirtioRNGDriver,
118 NULL
119 };
120