xref: /kvmtool/include/kvm/ioport.h (revision 36f5dc916e7f0a5bf900aa188c7dbf7c34b55fcc)
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>
7*36f5dc91SSasha Levin #include <limits.h>
83fdf659dSSasha Levin #include <asm/types.h>
93fdf659dSSasha Levin #include <linux/types.h>
1013a7760fSPekka Enberg 
11beb095ebSCyrill Gorcunov /* some ports we reserve for own use */
12beb095ebSCyrill Gorcunov #define IOPORT_DBG			0xe0
13c132a6d4SSasha Levin #define IOPORT_START			0x6200
14c132a6d4SSasha Levin #define IOPORT_SIZE			0x400
15c132a6d4SSasha Levin 
16c132a6d4SSasha Levin #define IOPORT_EMPTY			USHRT_MAX
17c132a6d4SSasha Levin 
1813a7760fSPekka Enberg struct kvm;
1913a7760fSPekka Enberg 
203d62dea6SSasha Levin struct ioport {
213d62dea6SSasha Levin 	struct rb_int_node		node;
223d62dea6SSasha Levin 	struct ioport_operations	*ops;
233d62dea6SSasha Levin 	void				*priv;
243d62dea6SSasha Levin };
253d62dea6SSasha Levin 
2613a7760fSPekka Enberg struct ioport_operations {
27c9f6a037SXiao Guangrong 	bool (*io_in)(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size);
28c9f6a037SXiao Guangrong 	bool (*io_out)(struct ioport *ioport, struct kvm *kvm, u16 port, void *data, int size);
2913a7760fSPekka Enberg };
3013a7760fSPekka Enberg 
31ac38f433SPekka Enberg void ioport__setup_legacy(void);
32ac38f433SPekka Enberg 
33c132a6d4SSasha Levin u16 ioport__register(u16 port, struct ioport_operations *ops, int count, void *param);
3413a7760fSPekka Enberg 
353fdf659dSSasha Levin static inline u8 ioport__read8(u8 *data)
36fbc2fbf9SPekka Enberg {
37fbc2fbf9SPekka Enberg 	return *data;
38fbc2fbf9SPekka Enberg }
39fbc2fbf9SPekka Enberg 
403fdf659dSSasha Levin static inline u16 ioport__read16(u16 *data)
418b1ff07eSPekka Enberg {
428b1ff07eSPekka Enberg 	return *data;
438b1ff07eSPekka Enberg }
448b1ff07eSPekka Enberg 
453fdf659dSSasha Levin static inline u32 ioport__read32(u32 *data)
46fbc2fbf9SPekka Enberg {
47fbc2fbf9SPekka Enberg 	return *data;
48fbc2fbf9SPekka Enberg }
49fbc2fbf9SPekka Enberg 
503fdf659dSSasha Levin static inline void ioport__write8(u8 *data, u8 value)
51fbc2fbf9SPekka Enberg {
52fbc2fbf9SPekka Enberg 	*data		 = value;
53fbc2fbf9SPekka Enberg }
54fbc2fbf9SPekka Enberg 
553fdf659dSSasha Levin static inline void ioport__write16(u16 *data, u16 value)
568b1ff07eSPekka Enberg {
578b1ff07eSPekka Enberg 	*data		 = value;
588b1ff07eSPekka Enberg }
598b1ff07eSPekka Enberg 
603fdf659dSSasha Levin static inline void ioport__write32(u32 *data, u32 value)
61fbc2fbf9SPekka Enberg {
62fbc2fbf9SPekka Enberg 	*data		 = value;
63fbc2fbf9SPekka Enberg }
64fbc2fbf9SPekka Enberg 
6513a7760fSPekka Enberg #endif /* KVM__IOPORT_H */
66