0001
0002 #ifndef __I8254_H
0003 #define __I8254_H
0004
0005 #include <linux/kthread.h>
0006
0007 #include <kvm/iodev.h>
0008
0009 struct kvm_kpit_channel_state {
0010 u32 count;
0011 u16 latched_count;
0012 u8 count_latched;
0013 u8 status_latched;
0014 u8 status;
0015 u8 read_state;
0016 u8 write_state;
0017 u8 write_latch;
0018 u8 rw_mode;
0019 u8 mode;
0020 u8 bcd;
0021 u8 gate;
0022 ktime_t count_load_time;
0023 };
0024
0025 struct kvm_kpit_state {
0026
0027 struct kvm_kpit_channel_state channels[3];
0028 u32 flags;
0029 bool is_periodic;
0030 s64 period;
0031 struct hrtimer timer;
0032
0033 struct mutex lock;
0034 atomic_t reinject;
0035 atomic_t pending;
0036 atomic_t irq_ack;
0037 struct kvm_irq_ack_notifier irq_ack_notifier;
0038 };
0039
0040 struct kvm_pit {
0041 struct kvm_io_device dev;
0042 struct kvm_io_device speaker_dev;
0043 struct kvm *kvm;
0044 struct kvm_kpit_state pit_state;
0045 int irq_source_id;
0046 struct kvm_irq_mask_notifier mask_notifier;
0047 struct kthread_worker *worker;
0048 struct kthread_work expired;
0049 };
0050
0051 #define KVM_PIT_BASE_ADDRESS 0x40
0052 #define KVM_SPEAKER_BASE_ADDRESS 0x61
0053 #define KVM_PIT_MEM_LENGTH 4
0054 #define KVM_PIT_FREQ 1193181
0055 #define KVM_MAX_PIT_INTR_INTERVAL HZ / 100
0056 #define KVM_PIT_CHANNEL_MASK 0x3
0057
0058 struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags);
0059 void kvm_free_pit(struct kvm *kvm);
0060
0061 void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val,
0062 int hpet_legacy_start);
0063 void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject);
0064
0065 #endif