Lines Matching defs:pit
54 static void pit_set_gate(struct kvm_pit *pit, int channel, u32 val)
56 struct kvm_kpit_channel_state *c = &pit->pit_state.channels[channel];
77 static int pit_get_gate(struct kvm_pit *pit, int channel)
79 return pit->pit_state.channels[channel].gate;
82 static s64 __kpit_elapsed(struct kvm_pit *pit)
86 struct kvm_kpit_state *ps = &pit->pit_state;
106 static s64 kpit_elapsed(struct kvm_pit *pit, struct kvm_kpit_channel_state *c,
110 return __kpit_elapsed(pit);
115 static int pit_get_count(struct kvm_pit *pit, int channel)
117 struct kvm_kpit_channel_state *c = &pit->pit_state.channels[channel];
121 t = kpit_elapsed(pit, c, channel);
142 static int pit_get_out(struct kvm_pit *pit, int channel)
144 struct kvm_kpit_channel_state *c = &pit->pit_state.channels[channel];
148 t = kpit_elapsed(pit, c, channel);
174 static void pit_latch_count(struct kvm_pit *pit, int channel)
176 struct kvm_kpit_channel_state *c = &pit->pit_state.channels[channel];
179 c->latched_count = pit_get_count(pit, channel);
184 static void pit_latch_status(struct kvm_pit *pit, int channel)
186 struct kvm_kpit_channel_state *c = &pit->pit_state.channels[channel];
190 c->status = ((pit_get_out(pit, channel) << 7) |
207 struct kvm_pit *pit = pit_state_to_pit(ps);
215 kthread_queue_work(pit->worker, &pit->expired);
220 struct kvm_pit *pit = vcpu->kvm->arch.vpit;
224 if (vcpu->vcpu_id || !pit)
227 timer = &pit->pit_state.timer;
228 mutex_lock(&pit->pit_state.lock);
231 mutex_unlock(&pit->pit_state.lock);
234 static void destroy_pit_timer(struct kvm_pit *pit)
236 hrtimer_cancel(&pit->pit_state.timer);
237 kthread_flush_work(&pit->expired);
242 struct kvm_pit *pit = container_of(work, struct kvm_pit, expired);
243 struct kvm *kvm = pit->kvm;
246 struct kvm_kpit_state *ps = &pit->pit_state;
251 kvm_set_irq(kvm, pit->irq_source_id, 0, 1, false);
252 kvm_set_irq(kvm, pit->irq_source_id, 0, 0, false);
285 static inline void kvm_pit_reset_reinject(struct kvm_pit *pit)
287 atomic_set(&pit->pit_state.pending, 0);
288 atomic_set(&pit->pit_state.irq_ack, 1);
291 void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject)
293 struct kvm_kpit_state *ps = &pit->pit_state;
294 struct kvm *kvm = pit->kvm;
310 kvm_pit_reset_reinject(pit);
312 kvm_register_irq_mask_notifier(kvm, 0, &pit->mask_notifier);
316 kvm_unregister_irq_mask_notifier(kvm, 0, &pit->mask_notifier);
322 static void create_pit_timer(struct kvm_pit *pit, u32 val, int is_period)
324 struct kvm_kpit_state *ps = &pit->pit_state;
325 struct kvm *kvm = pit->kvm;
334 pr_debug("create pit timer, interval is %llu nsec\n", interval);
338 kthread_flush_work(&pit->expired);
342 kvm_pit_reset_reinject(pit);
365 static void pit_load_count(struct kvm_pit *pit, int channel, u32 val)
367 struct kvm_kpit_state *ps = &pit->pit_state;
392 create_pit_timer(pit, val, 0);
396 create_pit_timer(pit, val, 1);
399 destroy_pit_timer(pit);
403 void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val,
408 WARN_ON_ONCE(!mutex_is_locked(&pit->pit_state.lock));
413 saved_mode = pit->pit_state.channels[0].mode;
414 pit->pit_state.channels[0].mode = 0xff; /* disable timer */
415 pit_load_count(pit, channel, val);
416 pit->pit_state.channels[0].mode = saved_mode;
418 pit_load_count(pit, channel, val);
442 struct kvm_pit *pit = dev_to_pit(this);
443 struct kvm_kpit_state *pit_state = &pit->pit_state;
466 pit_latch_count(pit, channel);
468 pit_latch_status(pit, channel);
476 pit_latch_count(pit, channel);
493 pit_load_count(pit, addr, val);
496 pit_load_count(pit, addr, val << 8);
503 pit_load_count(pit, addr, s->write_latch | (val << 8));
517 struct kvm_pit *pit = dev_to_pit(this);
518 struct kvm_kpit_state *pit_state = &pit->pit_state;
555 count = pit_get_count(pit, addr);
559 count = pit_get_count(pit, addr);
563 count = pit_get_count(pit, addr);
568 count = pit_get_count(pit, addr);
587 struct kvm_pit *pit = speaker_to_pit(this);
588 struct kvm_kpit_state *pit_state = &pit->pit_state;
598 pit_set_gate(pit, 2, val & 1);
607 struct kvm_pit *pit = speaker_to_pit(this);
608 struct kvm_kpit_state *pit_state = &pit->pit_state;
619 pit_get_gate(pit, 2) | (pit_get_out(pit, 2) << 5) |
628 static void kvm_pit_reset(struct kvm_pit *pit)
633 pit->pit_state.flags = 0;
635 c = &pit->pit_state.channels[i];
638 pit_load_count(pit, i, 0);
641 kvm_pit_reset_reinject(pit);
646 struct kvm_pit *pit = container_of(kimn, struct kvm_pit, mask_notifier);
649 kvm_pit_reset_reinject(pit);
664 struct kvm_pit *pit;
670 pit = kzalloc(sizeof(struct kvm_pit), GFP_KERNEL_ACCOUNT);
671 if (!pit)
674 pit->irq_source_id = kvm_request_irq_source_id(kvm);
675 if (pit->irq_source_id < 0)
678 mutex_init(&pit->pit_state.lock);
684 pit->worker = kthread_run_worker(0, "kvm-pit/%d", pid_nr);
685 if (IS_ERR(pit->worker))
688 kthread_init_work(&pit->expired, pit_do_work);
690 pit->kvm = kvm;
692 pit_state = &pit->pit_state;
698 pit->mask_notifier.func = pit_mask_notifer;
700 kvm_pit_reset(pit);
702 kvm_pit_set_reinject(pit, true);
705 kvm_iodevice_init(&pit->dev, &pit_dev_ops);
707 KVM_PIT_MEM_LENGTH, &pit->dev);
712 kvm_iodevice_init(&pit->speaker_dev, &speaker_dev_ops);
715 &pit->speaker_dev);
721 return pit;
724 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev);
727 kvm_pit_set_reinject(pit, false);
728 kthread_destroy_worker(pit->worker);
730 kvm_free_irq_source_id(kvm, pit->irq_source_id);
732 kfree(pit);
738 struct kvm_pit *pit = kvm->arch.vpit;
740 if (pit) {
742 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev);
743 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->speaker_dev);
745 kvm_pit_set_reinject(pit, false);
746 hrtimer_cancel(&pit->pit_state.timer);
747 kthread_destroy_worker(pit->worker);
748 kvm_free_irq_source_id(kvm, pit->irq_source_id);
749 kfree(pit);