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> 73fdf659dSSasha Levin #include <asm/types.h> 83fdf659dSSasha Levin #include <linux/types.h> 913a7760fSPekka Enberg 10beb095ebSCyrill Gorcunov /* some ports we reserve for own use */ 11beb095ebSCyrill Gorcunov #define IOPORT_DBG 0xe0 12c132a6d4SSasha Levin #define IOPORT_START 0x6200 13c132a6d4SSasha Levin #define IOPORT_SIZE 0x400 14c132a6d4SSasha Levin 15c132a6d4SSasha Levin #define IOPORT_EMPTY USHRT_MAX 16c132a6d4SSasha Levin 1713a7760fSPekka Enberg struct kvm; 1813a7760fSPekka Enberg 193d62dea6SSasha Levin struct ioport { 203d62dea6SSasha Levin struct rb_int_node node; 213d62dea6SSasha Levin struct ioport_operations *ops; 223d62dea6SSasha Levin void *priv; 233d62dea6SSasha Levin }; 243d62dea6SSasha Levin 2513a7760fSPekka Enberg struct ioport_operations { 26*c9f6a037SXiao Guangrong bool (*io_in)(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size); 27*c9f6a037SXiao Guangrong bool (*io_out)(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size); 2813a7760fSPekka Enberg }; 2913a7760fSPekka Enberg 30ac38f433SPekka Enberg void ioport__setup_legacy(void); 31ac38f433SPekka Enberg 32c132a6d4SSasha Levin u16 ioport__register(u16 port, struct ioport_operations *ops, int count, void *param); 3313a7760fSPekka Enberg 343fdf659dSSasha Levin static inline u8 ioport__read8(u8 *data) 35fbc2fbf9SPekka Enberg { 36fbc2fbf9SPekka Enberg return *data; 37fbc2fbf9SPekka Enberg } 38fbc2fbf9SPekka Enberg 393fdf659dSSasha Levin static inline u16 ioport__read16(u16 *data) 408b1ff07eSPekka Enberg { 418b1ff07eSPekka Enberg return *data; 428b1ff07eSPekka Enberg } 438b1ff07eSPekka Enberg 443fdf659dSSasha Levin static inline u32 ioport__read32(u32 *data) 45fbc2fbf9SPekka Enberg { 46fbc2fbf9SPekka Enberg return *data; 47fbc2fbf9SPekka Enberg } 48fbc2fbf9SPekka Enberg 493fdf659dSSasha Levin static inline void ioport__write8(u8 *data, u8 value) 50fbc2fbf9SPekka Enberg { 51fbc2fbf9SPekka Enberg *data = value; 52fbc2fbf9SPekka Enberg } 53fbc2fbf9SPekka Enberg 543fdf659dSSasha Levin static inline void ioport__write16(u16 *data, u16 value) 558b1ff07eSPekka Enberg { 568b1ff07eSPekka Enberg *data = value; 578b1ff07eSPekka Enberg } 588b1ff07eSPekka Enberg 593fdf659dSSasha Levin static inline void ioport__write32(u32 *data, u32 value) 60fbc2fbf9SPekka Enberg { 61fbc2fbf9SPekka Enberg *data = value; 62fbc2fbf9SPekka Enberg } 63fbc2fbf9SPekka Enberg 6413a7760fSPekka Enberg #endif /* KVM__IOPORT_H */ 65