xref: /kvm-unit-tests/lib/virtio.h (revision 43402ba5fa2dc06e12855a04f6003f1b3f838070)
1*43402ba5SAndrew Jones #ifndef _VIRTIO_H_
2*43402ba5SAndrew Jones #define _VIRTIO_H_
3*43402ba5SAndrew Jones /*
4*43402ba5SAndrew Jones  * A minimal implementation of virtio.
5*43402ba5SAndrew Jones  * Structures adapted from the Linux Kernel.
6*43402ba5SAndrew Jones  *
7*43402ba5SAndrew Jones  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
8*43402ba5SAndrew Jones  *
9*43402ba5SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
10*43402ba5SAndrew Jones  */
11*43402ba5SAndrew Jones #include "libcflat.h"
12*43402ba5SAndrew Jones 
13*43402ba5SAndrew Jones struct virtio_device_id {
14*43402ba5SAndrew Jones 	u32 device;
15*43402ba5SAndrew Jones 	u32 vendor;
16*43402ba5SAndrew Jones };
17*43402ba5SAndrew Jones 
18*43402ba5SAndrew Jones struct virtio_device {
19*43402ba5SAndrew Jones 	struct virtio_device_id id;
20*43402ba5SAndrew Jones 	const struct virtio_config_ops *config;
21*43402ba5SAndrew Jones };
22*43402ba5SAndrew Jones 
23*43402ba5SAndrew Jones struct virtio_config_ops {
24*43402ba5SAndrew Jones 	void (*get)(struct virtio_device *vdev, unsigned offset,
25*43402ba5SAndrew Jones 		    void *buf, unsigned len);
26*43402ba5SAndrew Jones 	void (*set)(struct virtio_device *vdev, unsigned offset,
27*43402ba5SAndrew Jones 		    const void *buf, unsigned len);
28*43402ba5SAndrew Jones };
29*43402ba5SAndrew Jones 
30*43402ba5SAndrew Jones static inline u8
31*43402ba5SAndrew Jones virtio_config_readb(struct virtio_device *vdev, unsigned offset)
32*43402ba5SAndrew Jones {
33*43402ba5SAndrew Jones 	u8 val;
34*43402ba5SAndrew Jones 	vdev->config->get(vdev, offset, &val, 1);
35*43402ba5SAndrew Jones 	return val;
36*43402ba5SAndrew Jones }
37*43402ba5SAndrew Jones 
38*43402ba5SAndrew Jones static inline u16
39*43402ba5SAndrew Jones virtio_config_readw(struct virtio_device *vdev, unsigned offset)
40*43402ba5SAndrew Jones {
41*43402ba5SAndrew Jones 	u16 val;
42*43402ba5SAndrew Jones 	vdev->config->get(vdev, offset, &val, 2);
43*43402ba5SAndrew Jones 	return val;
44*43402ba5SAndrew Jones }
45*43402ba5SAndrew Jones 
46*43402ba5SAndrew Jones static inline u32
47*43402ba5SAndrew Jones virtio_config_readl(struct virtio_device *vdev, unsigned offset)
48*43402ba5SAndrew Jones {
49*43402ba5SAndrew Jones 	u32 val;
50*43402ba5SAndrew Jones 	vdev->config->get(vdev, offset, &val, 4);
51*43402ba5SAndrew Jones 	return val;
52*43402ba5SAndrew Jones }
53*43402ba5SAndrew Jones 
54*43402ba5SAndrew Jones static inline void
55*43402ba5SAndrew Jones virtio_config_writeb(struct virtio_device *vdev, unsigned offset, u8 val)
56*43402ba5SAndrew Jones {
57*43402ba5SAndrew Jones 	vdev->config->set(vdev, offset, &val, 1);
58*43402ba5SAndrew Jones }
59*43402ba5SAndrew Jones 
60*43402ba5SAndrew Jones static inline void
61*43402ba5SAndrew Jones virtio_config_writew(struct virtio_device *vdev, unsigned offset, u16 val)
62*43402ba5SAndrew Jones {
63*43402ba5SAndrew Jones 	vdev->config->set(vdev, offset, &val, 2);
64*43402ba5SAndrew Jones }
65*43402ba5SAndrew Jones 
66*43402ba5SAndrew Jones static inline void
67*43402ba5SAndrew Jones virtio_config_writel(struct virtio_device *vdev, unsigned offset, u32 val)
68*43402ba5SAndrew Jones {
69*43402ba5SAndrew Jones 	vdev->config->set(vdev, offset, &val, 4);
70*43402ba5SAndrew Jones }
71*43402ba5SAndrew Jones 
72*43402ba5SAndrew Jones extern struct virtio_device *virtio_bind(u32 devid);
73*43402ba5SAndrew Jones 
74*43402ba5SAndrew Jones #endif /* _VIRTIO_H_ */
75