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