xref: /kvmtool/virtio/blk.c (revision b30d05ad0a9ee697ba41a09f05273d63d2f36fb2)
1*b30d05adSPekka Enberg #include "kvm/blk-virtio.h"
2*b30d05adSPekka Enberg 
3*b30d05adSPekka Enberg #include "kvm/ioport.h"
4*b30d05adSPekka Enberg #include "kvm/pci.h"
5*b30d05adSPekka Enberg 
6*b30d05adSPekka Enberg #define PCI_VENDOR_ID_REDHAT_QUMRANET		0x1af4
7*b30d05adSPekka Enberg #define PCI_DEVICE_ID_VIRTIO_BLK		0x1001
8*b30d05adSPekka Enberg #define PCI_SUBSYSTEM_VENDOR_ID_REDHAT_QUMRANET	0x1af4
9*b30d05adSPekka Enberg #define PCI_SUBSYSTEM_ID_VIRTIO_BLK		0x0002
10*b30d05adSPekka Enberg 
11*b30d05adSPekka Enberg static struct pci_device_header virtio_device = {
12*b30d05adSPekka Enberg 	.vendor_id		= PCI_VENDOR_ID_REDHAT_QUMRANET,
13*b30d05adSPekka Enberg 	.device_id		= PCI_DEVICE_ID_VIRTIO_BLK,
14*b30d05adSPekka Enberg 	.header_type		= PCI_HEADER_TYPE_NORMAL,
15*b30d05adSPekka Enberg 	.revision_id		= 0,
16*b30d05adSPekka Enberg 	.class			= 0x010000,
17*b30d05adSPekka Enberg 	.subsys_vendor_id	= PCI_SUBSYSTEM_VENDOR_ID_REDHAT_QUMRANET,
18*b30d05adSPekka Enberg 	.subsys_id		= PCI_SUBSYSTEM_ID_VIRTIO_BLK,
19*b30d05adSPekka Enberg 	.bar[0]			= IOPORT_VIRTIO | PCI_BASE_ADDRESS_SPACE_IO,
20*b30d05adSPekka Enberg };
21*b30d05adSPekka Enberg 
22*b30d05adSPekka Enberg static bool virtio_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
23*b30d05adSPekka Enberg {
24*b30d05adSPekka Enberg 	return true;
25*b30d05adSPekka Enberg }
26*b30d05adSPekka Enberg 
27*b30d05adSPekka Enberg static bool virtio_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count)
28*b30d05adSPekka Enberg {
29*b30d05adSPekka Enberg 	return true;
30*b30d05adSPekka Enberg }
31*b30d05adSPekka Enberg 
32*b30d05adSPekka Enberg static struct ioport_operations virtio_io_ops = {
33*b30d05adSPekka Enberg 	.io_in		= virtio_in,
34*b30d05adSPekka Enberg 	.io_out		= virtio_out,
35*b30d05adSPekka Enberg };
36*b30d05adSPekka Enberg 
37*b30d05adSPekka Enberg void blk_virtio__init(void)
38*b30d05adSPekka Enberg {
39*b30d05adSPekka Enberg 	pci__register(&virtio_device, 1);
40*b30d05adSPekka Enberg 
41*b30d05adSPekka Enberg 	ioport__register(IOPORT_VIRTIO, &virtio_io_ops);
42*b30d05adSPekka Enberg }
43