1/*
2 * Copyright 2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _VIRTIO_H_
6#define _VIRTIO_H_
7
8
9#include <device_manager.h>
10#include <KernelExport.h>
11
12
13#define VIRTIO_DEVICE_ID_NETWORK	1
14#define VIRTIO_DEVICE_ID_BLOCK		2
15#define VIRTIO_DEVICE_ID_CONSOLE	3
16#define VIRTIO_DEVICE_ID_ENTROPY	4
17#define VIRTIO_DEVICE_ID_BALLOON	5
18#define VIRTIO_DEVICE_ID_IOMEMORY	6
19#define VIRTIO_DEVICE_ID_RP_MESSAGE	7
20#define VIRTIO_DEVICE_ID_SCSI		8
21#define VIRTIO_DEVICE_ID_9P			9
22#define VIRTIO_DEVICE_ID_RP_SERIAL	11
23#define VIRTIO_DEVICE_ID_CAIF		12
24#define VIRTIO_DEVICE_ID_GPU		16
25#define VIRTIO_DEVICE_ID_INPUT		18
26#define VIRTIO_DEVICE_ID_VSOCK		19
27#define VIRTIO_DEVICE_ID_CRYPTO		20
28#define VIRTIO_DEVICE_ID_SOUND		25
29
30#define VIRTIO_FEATURE_TRANSPORT_MASK	((1ULL << 28) - 1)
31
32#define VIRTIO_FEATURE_NOTIFY_ON_EMPTY		(1 << 24)
33#define VIRTIO_FEATURE_ANY_LAYOUT			(1 << 27)
34#define VIRTIO_FEATURE_RING_INDIRECT_DESC	(1 << 28)
35#define VIRTIO_FEATURE_RING_EVENT_IDX		(1 << 29)
36#define VIRTIO_FEATURE_BAD_FEATURE			(1 << 30)
37#define VIRTIO_FEATURE_VERSION_1			(1ULL << 32)
38
39#define VIRTIO_VIRTQUEUES_MAX_COUNT	8
40
41#define VIRTIO_CONFIG_STATUS_RESET	0x00
42#define VIRTIO_CONFIG_STATUS_ACK	0x01
43#define VIRTIO_CONFIG_STATUS_DRIVER	0x02
44#define VIRTIO_CONFIG_STATUS_DRIVER_OK	0x04
45#define VIRTIO_CONFIG_STATUS_FEATURES_OK	0x08
46#define VIRTIO_CONFIG_STATUS_DEVICE_NEEDS_RESET	0x40
47#define VIRTIO_CONFIG_STATUS_FAILED	0x80
48
49// attributes:
50
51// node type
52#define VIRTIO_BUS_TYPE_NAME "bus/virtio/v1"
53// device type (uint16)
54#define VIRTIO_DEVICE_TYPE_ITEM "virtio/type"
55// alignment (uint16)
56#define VIRTIO_VRING_ALIGNMENT_ITEM "virtio/vring_alignment"
57// version (uint8)
58#define VIRTIO_VERSION_ITEM "virtio/version"
59
60// sim cookie, issued by virtio bus manager
61typedef void* virtio_sim;
62// device cookie, issued by virtio bus manager
63typedef void* virtio_device;
64// queue cookie, issued by virtio bus manager
65typedef void* virtio_queue;
66// callback function for requests
67typedef void (*virtio_callback_func)(void* driverCookie, void* cookie);
68// callback function for interrupts
69typedef void (*virtio_intr_func)(void* cookie);
70
71#define	VIRTIO_DEVICE_MODULE_NAME "bus_managers/virtio/device/v1"
72
73typedef struct {
74	driver_module_info info;
75
76	status_t	(*queue_interrupt_handler)(virtio_sim sim, uint16 queue);
77	status_t	(*config_interrupt_handler)(virtio_sim sim);
78} virtio_for_controller_interface;
79
80#define VIRTIO_FOR_CONTROLLER_MODULE_NAME "bus_managers/virtio/controller/driver_v1"
81
82// Bus manager interface used by Virtio controller drivers.
83typedef struct {
84	driver_module_info info;
85
86	void (*set_sim)(void* cookie, virtio_sim sim);
87	status_t (*read_host_features)(void* cookie, uint64* features);
88	status_t (*write_guest_features)(void* cookie, uint64 features);
89	uint8 (*get_status)(void* cookie);
90	void (*set_status)(void* cookie, uint8 status);
91	status_t (*read_device_config)(void* cookie, uint8 offset, void* buffer,
92		size_t bufferSize);
93	status_t (*write_device_config)(void* cookie, uint8 offset,
94		const void* buffer, size_t bufferSize);
95
96	uint16	(*get_queue_ring_size)(void* cookie, uint16 queue);
97	status_t (*setup_queue)(void* cookie, uint16 queue, phys_addr_t phy, phys_addr_t phyAvail,
98		phys_addr_t phyUsed);
99	status_t (*setup_interrupt)(void* cookie, uint16 queueCount);
100	status_t (*free_interrupt)(void* cookie);
101	void	(*notify_queue)(void* cookie, uint16 queue);
102} virtio_sim_interface;
103
104
105// bus manager device interface for peripheral driver
106typedef struct {
107	driver_module_info info;
108
109	status_t (*negotiate_features)(virtio_device cookie, uint64 supported,
110		uint64* negotiated, const char* (*get_feature_name)(uint64));
111
112	status_t (*clear_feature)(virtio_device cookie, uint64 feature);
113
114	status_t (*read_device_config)(virtio_device cookie, uint8 offset,
115		void* buffer, size_t bufferSize);
116	status_t (*write_device_config)(virtio_device cookie, uint8 offset,
117		const void* buffer, size_t bufferSize);
118
119	status_t (*alloc_queues)(virtio_device cookie, size_t count,
120		virtio_queue* queues);
121
122	void (*free_queues)(virtio_device cookie);
123
124	status_t (*setup_interrupt)(virtio_device cookie,
125		virtio_intr_func config_handler, void* driverCookie);
126
127	status_t (*free_interrupts)(virtio_device cookie);
128
129	status_t (*queue_setup_interrupt)(virtio_queue queue,
130		virtio_callback_func handler, void* cookie);
131
132	status_t (*queue_request)(virtio_queue queue,
133		const physical_entry* readEntry,
134		const physical_entry* writtenEntry, void* cookie);
135
136	status_t (*queue_request_v)(virtio_queue queue,
137		const physical_entry* vector,
138		size_t readVectorCount, size_t writtenVectorCount,
139		void* cookie);
140
141	bool (*queue_is_full)(virtio_queue queue);
142
143	bool (*queue_is_empty)(virtio_queue queue);
144
145	uint16 (*queue_size)(virtio_queue queue);
146
147	bool (*queue_dequeue)(virtio_queue queue, void** _cookie,
148		uint32* _usedLength);
149
150} virtio_device_interface;
151
152
153#endif	/* _VIRTIO_H_ */
154