#ifndef KVM__IOPORT_H
#define KVM__IOPORT_H

#include "kvm/devices.h"
#include "kvm/kvm-cpu.h"
#include "kvm/rbtree-interval.h"
#include "kvm/fdt.h"

#include <stdbool.h>
#include <limits.h>
#include <asm/types.h>
#include <linux/types.h>
#include <linux/byteorder.h>

/* some ports we reserve for own use */
#define IOPORT_DBG			0xe0

struct kvm;

struct ioport {
	struct rb_int_node		node;
	struct ioport_operations	*ops;
	void				*priv;
	struct device_header		dev_hdr;
};

struct ioport_operations {
	bool (*io_in)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
	bool (*io_out)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
	void (*generate_fdt_node)(struct ioport *ioport, void *fdt,
				  void (*generate_irq_prop)(void *fdt,
							    u8 irq,
							    enum irq_type));
};

int ioport__setup_arch(struct kvm *kvm);
void ioport__map_irq(u8 *irq);

int __must_check ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops,
				  int count, void *param);
int ioport__unregister(struct kvm *kvm, u16 port);
int ioport__init(struct kvm *kvm);
int ioport__exit(struct kvm *kvm);

static inline u8 ioport__read8(u8 *data)
{
	return *data;
}
/* On BE platforms, PCI I/O is byteswapped, i.e. LE, so swap back. */
static inline u16 ioport__read16(u16 *data)
{
	return le16_to_cpu(*data);
}

static inline u32 ioport__read32(u32 *data)
{
	return le32_to_cpu(*data);
}

static inline void ioport__write8(u8 *data, u8 value)
{
	*data		 = value;
}

static inline void ioport__write16(u16 *data, u16 value)
{
	*data		 = cpu_to_le16(value);
}

static inline void ioport__write32(u32 *data, u32 value)
{
	*data		 = cpu_to_le32(value);
}

#endif /* KVM__IOPORT_H */
