Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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; /* can be 65536 */
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; /* not supported */
0021     u8 gate; /* timer start */
0022     ktime_t count_load_time;
0023 };
0024 
0025 struct kvm_kpit_state {
0026     /* All members before "struct mutex lock" are protected by the lock. */
0027     struct kvm_kpit_channel_state channels[3];
0028     u32 flags;
0029     bool is_periodic;
0030     s64 period;                 /* unit: ns */
0031     struct hrtimer timer;
0032 
0033     struct mutex lock;
0034     atomic_t reinject;
0035     atomic_t pending; /* accumulated triggered timers */
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