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
20device_manager_info *gDeviceManager;
21random_for_controller_interface *gRandom;
22dpc_module_info *gDPC;
23
24
25//	#pragma mark -	Driver module interface
26
27
28static float
29virtio_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
52static status_t
53virtio_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
66static status_t
67virtio_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
84static void
85virtio_rng_uninit_driver(void *cookie)
86{
87	VirtioRNGDevice *device = (VirtioRNGDevice*)cookie;
88	delete device;
89}
90
91
92static 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
108module_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
116module_info *modules[] = {
117	(module_info *)&sVirtioRNGDriver,
118	NULL
119};
120