1/* SPDX-License-Identifier: GPL-2.0-only */
2
3#ifndef __KVM_IODEV_H__
4#define __KVM_IODEV_H__
5
6#include <linux/kvm_types.h>
7#include <linux/errno.h>
8
9struct kvm_io_device;
10struct kvm_vcpu;
11
12/**
13 * kvm_io_device_ops are called under kvm slots_lock.
14 * read and write handlers return 0 if the transaction has been handled,
15 * or non-zero to have it passed to the next device.
16 **/
17struct kvm_io_device_ops {
18	int (*read)(struct kvm_vcpu *vcpu,
19		    struct kvm_io_device *this,
20		    gpa_t addr,
21		    int len,
22		    void *val);
23	int (*write)(struct kvm_vcpu *vcpu,
24		     struct kvm_io_device *this,
25		     gpa_t addr,
26		     int len,
27		     const void *val);
28	void (*destructor)(struct kvm_io_device *this);
29};
30
31
32struct kvm_io_device {
33	const struct kvm_io_device_ops *ops;
34};
35
36static inline void kvm_iodevice_init(struct kvm_io_device *dev,
37				     const struct kvm_io_device_ops *ops)
38{
39	dev->ops = ops;
40}
41
42static inline int kvm_iodevice_read(struct kvm_vcpu *vcpu,
43				    struct kvm_io_device *dev, gpa_t addr,
44				    int l, void *v)
45{
46	return dev->ops->read ? dev->ops->read(vcpu, dev, addr, l, v)
47				: -EOPNOTSUPP;
48}
49
50static inline int kvm_iodevice_write(struct kvm_vcpu *vcpu,
51				     struct kvm_io_device *dev, gpa_t addr,
52				     int l, const void *v)
53{
54	return dev->ops->write ? dev->ops->write(vcpu, dev, addr, l, v)
55				 : -EOPNOTSUPP;
56}
57
58#endif /* __KVM_IODEV_H__ */
59