Lines Matching refs:pit

33 #define pr_fmt(fmt) "pit: " fmt
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;
223 if (!kvm_vcpu_is_bsp(vcpu) || !pit)
226 timer = &pit->pit_state.timer;
227 mutex_lock(&pit->pit_state.lock);
230 mutex_unlock(&pit->pit_state.lock);
233 static void destroy_pit_timer(struct kvm_pit *pit)
235 hrtimer_cancel(&pit->pit_state.timer);
236 kthread_flush_work(&pit->expired);
241 struct kvm_pit *pit = container_of(work, struct kvm_pit, expired);
242 struct kvm *kvm = pit->kvm;
245 struct kvm_kpit_state *ps = &pit->pit_state;
250 kvm_set_irq(kvm, pit->irq_source_id, 0, 1, false);
251 kvm_set_irq(kvm, pit->irq_source_id, 0, 0, false);
284 static inline void kvm_pit_reset_reinject(struct kvm_pit *pit)
286 atomic_set(&pit->pit_state.pending, 0);
287 atomic_set(&pit->pit_state.irq_ack, 1);
290 void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject)
292 struct kvm_kpit_state *ps = &pit->pit_state;
293 struct kvm *kvm = pit->kvm;
310 kvm_pit_reset_reinject(pit);
312 kvm_register_irq_mask_notifier(kvm, 0, &pit->mask_notifier);
317 kvm_unregister_irq_mask_notifier(kvm, 0, &pit->mask_notifier);
323 static void create_pit_timer(struct kvm_pit *pit, u32 val, int is_period)
325 struct kvm_kpit_state *ps = &pit->pit_state;
326 struct kvm *kvm = pit->kvm;
335 pr_debug("create pit timer, interval is %llu nsec\n", interval);
339 kthread_flush_work(&pit->expired);
343 kvm_pit_reset_reinject(pit);
366 static void pit_load_count(struct kvm_pit *pit, int channel, u32 val)
368 struct kvm_kpit_state *ps = &pit->pit_state;
393 create_pit_timer(pit, val, 0);
397 create_pit_timer(pit, val, 1);
400 destroy_pit_timer(pit);
404 void kvm_pit_load_count(struct kvm_pit *pit, int channel, u32 val,
409 WARN_ON_ONCE(!mutex_is_locked(&pit->pit_state.lock));
414 saved_mode = pit->pit_state.channels[0].mode;
415 pit->pit_state.channels[0].mode = 0xff; /* disable timer */
416 pit_load_count(pit, channel, val);
417 pit->pit_state.channels[0].mode = saved_mode;
419 pit_load_count(pit, channel, val);
443 struct kvm_pit *pit = dev_to_pit(this);
444 struct kvm_kpit_state *pit_state = &pit->pit_state;
467 pit_latch_count(pit, channel);
469 pit_latch_status(pit, channel);
477 pit_latch_count(pit, channel);
494 pit_load_count(pit, addr, val);
497 pit_load_count(pit, addr, val << 8);
504 pit_load_count(pit, addr, s->write_latch | (val << 8));
518 struct kvm_pit *pit = dev_to_pit(this);
519 struct kvm_kpit_state *pit_state = &pit->pit_state;
556 count = pit_get_count(pit, addr);
560 count = pit_get_count(pit, addr);
564 count = pit_get_count(pit, addr);
569 count = pit_get_count(pit, addr);
588 struct kvm_pit *pit = speaker_to_pit(this);
589 struct kvm_kpit_state *pit_state = &pit->pit_state;
596 pit_set_gate(pit, 2, val & 1);
605 struct kvm_pit *pit = speaker_to_pit(this);
606 struct kvm_kpit_state *pit_state = &pit->pit_state;
616 ret = ((pit_state->speaker_data_on << 1) | pit_get_gate(pit, 2) |
617 (pit_get_out(pit, 2) << 5) | (refresh_clock << 4));
625 static void kvm_pit_reset(struct kvm_pit *pit)
630 pit->pit_state.flags = 0;
632 c = &pit->pit_state.channels[i];
635 pit_load_count(pit, i, 0);
638 kvm_pit_reset_reinject(pit);
643 struct kvm_pit *pit = container_of(kimn, struct kvm_pit, mask_notifier);
646 kvm_pit_reset_reinject(pit);
661 struct kvm_pit *pit;
667 pit = kzalloc(sizeof(struct kvm_pit), GFP_KERNEL_ACCOUNT);
668 if (!pit)
671 pit->irq_source_id = kvm_request_irq_source_id(kvm);
672 if (pit->irq_source_id < 0)
675 mutex_init(&pit->pit_state.lock);
681 pit->worker = kthread_create_worker(0, "kvm-pit/%d", pid_nr);
682 if (IS_ERR(pit->worker))
685 kthread_init_work(&pit->expired, pit_do_work);
687 pit->kvm = kvm;
689 pit_state = &pit->pit_state;
695 pit->mask_notifier.func = pit_mask_notifer;
697 kvm_pit_reset(pit);
699 kvm_pit_set_reinject(pit, true);
702 kvm_iodevice_init(&pit->dev, &pit_dev_ops);
704 KVM_PIT_MEM_LENGTH, &pit->dev);
709 kvm_iodevice_init(&pit->speaker_dev, &speaker_dev_ops);
712 &pit->speaker_dev);
718 return pit;
721 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev);
724 kvm_pit_set_reinject(pit, false);
725 kthread_destroy_worker(pit->worker);
727 kvm_free_irq_source_id(kvm, pit->irq_source_id);
729 kfree(pit);
735 struct kvm_pit *pit = kvm->arch.vpit;
737 if (pit) {
739 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev);
740 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->speaker_dev);
742 kvm_pit_set_reinject(pit, false);
743 hrtimer_cancel(&pit->pit_state.timer);
744 kthread_destroy_worker(pit->worker);
745 kvm_free_irq_source_id(kvm, pit->irq_source_id);
746 kfree(pit);