xref: /kvmtool/include/kvm/ioport.h (revision 206c41f433bbbb5763851a2f6df928a66f71193e)
113a7760fSPekka Enberg #ifndef KVM__IOPORT_H
213a7760fSPekka Enberg #define KVM__IOPORT_H
313a7760fSPekka Enberg 
43d62dea6SSasha Levin #include "kvm/rbtree-interval.h"
53d62dea6SSasha Levin 
613a7760fSPekka Enberg #include <stdbool.h>
736f5dc91SSasha Levin #include <limits.h>
83fdf659dSSasha Levin #include <asm/types.h>
93fdf659dSSasha Levin #include <linux/types.h>
10aa73be70SMatt Evans #include <linux/byteorder.h>
1113a7760fSPekka Enberg 
12beb095ebSCyrill Gorcunov /* some ports we reserve for own use */
13beb095ebSCyrill Gorcunov #define IOPORT_DBG			0xe0
14c132a6d4SSasha Levin #define IOPORT_START			0x6200
15c132a6d4SSasha Levin #define IOPORT_SIZE			0x400
16c132a6d4SSasha Levin 
17c132a6d4SSasha Levin #define IOPORT_EMPTY			USHRT_MAX
18c132a6d4SSasha Levin 
1913a7760fSPekka Enberg struct kvm;
2013a7760fSPekka Enberg 
213d62dea6SSasha Levin struct ioport {
223d62dea6SSasha Levin 	struct rb_int_node		node;
233d62dea6SSasha Levin 	struct ioport_operations	*ops;
243d62dea6SSasha Levin 	void				*priv;
253d62dea6SSasha Levin };
263d62dea6SSasha Levin 
2713a7760fSPekka Enberg struct ioport_operations {
28c9f6a037SXiao Guangrong 	bool (*io_in)(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size);
29c9f6a037SXiao Guangrong 	bool (*io_out)(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size);
3013a7760fSPekka Enberg };
3113a7760fSPekka Enberg 
324346fd8fSSasha Levin void ioport__setup_arch(struct kvm *kvm);
33*206c41f4SWill Deacon void ioport__map_irq(u8 *irq);
34ac38f433SPekka Enberg 
354346fd8fSSasha Levin int ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops,
364346fd8fSSasha Levin 			int count, void *param);
374346fd8fSSasha Levin int ioport__unregister(struct kvm *kvm, u16 port);
387af40b91SSasha Levin int ioport__init(struct kvm *kvm);
397af40b91SSasha Levin int ioport__exit(struct kvm *kvm);
4013a7760fSPekka Enberg 
413fdf659dSSasha Levin static inline u8 ioport__read8(u8 *data)
42fbc2fbf9SPekka Enberg {
43fbc2fbf9SPekka Enberg 	return *data;
44fbc2fbf9SPekka Enberg }
45aa73be70SMatt Evans /* On BE platforms, PCI I/O is byteswapped, i.e. LE, so swap back. */
463fdf659dSSasha Levin static inline u16 ioport__read16(u16 *data)
478b1ff07eSPekka Enberg {
48aa73be70SMatt Evans 	return le16_to_cpu(*data);
498b1ff07eSPekka Enberg }
508b1ff07eSPekka Enberg 
513fdf659dSSasha Levin static inline u32 ioport__read32(u32 *data)
52fbc2fbf9SPekka Enberg {
53aa73be70SMatt Evans 	return le32_to_cpu(*data);
54fbc2fbf9SPekka Enberg }
55fbc2fbf9SPekka Enberg 
563fdf659dSSasha Levin static inline void ioport__write8(u8 *data, u8 value)
57fbc2fbf9SPekka Enberg {
58fbc2fbf9SPekka Enberg 	*data		 = value;
59fbc2fbf9SPekka Enberg }
60fbc2fbf9SPekka Enberg 
613fdf659dSSasha Levin static inline void ioport__write16(u16 *data, u16 value)
628b1ff07eSPekka Enberg {
63aa73be70SMatt Evans 	*data		 = cpu_to_le16(value);
648b1ff07eSPekka Enberg }
658b1ff07eSPekka Enberg 
663fdf659dSSasha Levin static inline void ioport__write32(u32 *data, u32 value)
67fbc2fbf9SPekka Enberg {
68aa73be70SMatt Evans 	*data		 = cpu_to_le32(value);
69fbc2fbf9SPekka Enberg }
70fbc2fbf9SPekka Enberg 
7113a7760fSPekka Enberg #endif /* KVM__IOPORT_H */
72