KVM
Classes | Macros | Functions
i8254.h File Reference
#include <linux/kthread.h>
#include <kvm/iodev.h>
Include dependency graph for i8254.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  kvm_kpit_channel_state
 
struct  kvm_kpit_state
 
struct  kvm_pit
 

Macros

#define KVM_PIT_BASE_ADDRESS   0x40
 
#define KVM_SPEAKER_BASE_ADDRESS   0x61
 
#define KVM_PIT_MEM_LENGTH   4
 
#define KVM_PIT_FREQ   1193181
 
#define KVM_MAX_PIT_INTR_INTERVAL   HZ / 100
 
#define KVM_PIT_CHANNEL_MASK   0x3
 

Functions

struct kvm_pitkvm_create_pit (struct kvm *kvm, u32 flags)
 
void kvm_free_pit (struct kvm *kvm)
 
void kvm_pit_load_count (struct kvm_pit *pit, int channel, u32 val, int hpet_legacy_start)
 
void kvm_pit_set_reinject (struct kvm_pit *pit, bool reinject)
 

Macro Definition Documentation

◆ KVM_MAX_PIT_INTR_INTERVAL

#define KVM_MAX_PIT_INTR_INTERVAL   HZ / 100

Definition at line 55 of file i8254.h.

◆ KVM_PIT_BASE_ADDRESS

#define KVM_PIT_BASE_ADDRESS   0x40

Definition at line 51 of file i8254.h.

◆ KVM_PIT_CHANNEL_MASK

#define KVM_PIT_CHANNEL_MASK   0x3

Definition at line 56 of file i8254.h.

◆ KVM_PIT_FREQ

#define KVM_PIT_FREQ   1193181

Definition at line 54 of file i8254.h.

◆ KVM_PIT_MEM_LENGTH

#define KVM_PIT_MEM_LENGTH   4

Definition at line 53 of file i8254.h.

◆ KVM_SPEAKER_BASE_ADDRESS

#define KVM_SPEAKER_BASE_ADDRESS   0x61

Definition at line 52 of file i8254.h.

Function Documentation

◆ kvm_create_pit()

struct kvm_pit* kvm_create_pit ( struct kvm *  kvm,
u32  flags 
)

Definition at line 662 of file i8254.c.

663 {
664  struct kvm_pit *pit;
665  struct kvm_kpit_state *pit_state;
666  struct pid *pid;
667  pid_t pid_nr;
668  int ret;
669 
670  pit = kzalloc(sizeof(struct kvm_pit), GFP_KERNEL_ACCOUNT);
671  if (!pit)
672  return NULL;
673 
675  if (pit->irq_source_id < 0)
676  goto fail_request;
677 
678  mutex_init(&pit->pit_state.lock);
679 
680  pid = get_pid(task_tgid(current));
681  pid_nr = pid_vnr(pid);
682  put_pid(pid);
683 
684  pit->worker = kthread_create_worker(0, "kvm-pit/%d", pid_nr);
685  if (IS_ERR(pit->worker))
686  goto fail_kthread;
687 
688  kthread_init_work(&pit->expired, pit_do_work);
689 
690  pit->kvm = kvm;
691 
692  pit_state = &pit->pit_state;
693  hrtimer_init(&pit_state->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
694  pit_state->timer.function = pit_timer_fn;
695 
696  pit_state->irq_ack_notifier.gsi = 0;
697  pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq;
698  pit->mask_notifier.func = pit_mask_notifer;
699 
700  kvm_pit_reset(pit);
701 
702  kvm_pit_set_reinject(pit, true);
703 
704  mutex_lock(&kvm->slots_lock);
706  ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS, KVM_PIT_BASE_ADDRESS,
707  KVM_PIT_MEM_LENGTH, &pit->dev);
708  if (ret < 0)
709  goto fail_register_pit;
710 
711  if (flags & KVM_PIT_SPEAKER_DUMMY) {
713  ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS,
715  &pit->speaker_dev);
716  if (ret < 0)
717  goto fail_register_speaker;
718  }
719  mutex_unlock(&kvm->slots_lock);
720 
721  return pit;
722 
723 fail_register_speaker:
724  kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->dev);
725 fail_register_pit:
726  mutex_unlock(&kvm->slots_lock);
727  kvm_pit_set_reinject(pit, false);
728  kthread_destroy_worker(pit->worker);
729 fail_kthread:
731 fail_request:
732  kfree(pit);
733  return NULL;
734 }
static void kvm_pit_reset(struct kvm_pit *pit)
Definition: i8254.c:628
void kvm_pit_set_reinject(struct kvm_pit *pit, bool reinject)
Definition: i8254.c:291
static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
Definition: i8254.c:268
static const struct kvm_io_device_ops speaker_dev_ops
Definition: i8254.c:657
static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian)
Definition: i8254.c:203
static void pit_do_work(struct kthread_work *work)
Definition: i8254.c:240
static const struct kvm_io_device_ops pit_dev_ops
Definition: i8254.c:652
static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask)
Definition: i8254.c:644
#define KVM_PIT_BASE_ADDRESS
Definition: i8254.h:51
#define KVM_SPEAKER_BASE_ADDRESS
Definition: i8254.h:52
#define KVM_PIT_MEM_LENGTH
Definition: i8254.h:53
static void kvm_iodevice_init(struct kvm_io_device *dev, const struct kvm_io_device_ops *ops)
Definition: iodev.h:36
int kvm_request_irq_source_id(struct kvm *kvm)
Definition: irq_comm.c:197
void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)
Definition: irq_comm.c:220
int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, struct kvm_io_device *dev)
Definition: kvm_main.c:5897
int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, struct kvm_io_device *dev)
Definition: kvm_main.c:5941
struct mutex lock
Definition: i8254.h:33
struct hrtimer timer
Definition: i8254.h:31
struct kvm_irq_ack_notifier irq_ack_notifier
Definition: i8254.h:37
Definition: i8254.h:40
struct kvm * kvm
Definition: i8254.h:43
struct kthread_work expired
Definition: i8254.h:48
int irq_source_id
Definition: i8254.h:45
struct kvm_irq_mask_notifier mask_notifier
Definition: i8254.h:46
struct kthread_worker * worker
Definition: i8254.h:47
struct kvm_io_device dev
Definition: i8254.h:41
struct kvm_kpit_state pit_state
Definition: i8254.h:44
struct kvm_io_device speaker_dev
Definition: i8254.h:42
uint32_t flags
Definition: xen.c:1
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_free_pit()

void kvm_free_pit ( struct kvm *  kvm)

Definition at line 736 of file i8254.c.

737 {
738  struct kvm_pit *pit = kvm->arch.vpit;
739 
740  if (pit) {
741  mutex_lock(&kvm->slots_lock);
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);
744  mutex_unlock(&kvm->slots_lock);
745  kvm_pit_set_reinject(pit, false);
746  hrtimer_cancel(&pit->pit_state.timer);
747  kthread_destroy_worker(pit->worker);
749  kfree(pit);
750  }
751 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_pit_load_count()

void kvm_pit_load_count ( struct kvm_pit pit,
int  channel,
u32  val,
int  hpet_legacy_start 
)

Definition at line 403 of file i8254.c.

405 {
406  u8 saved_mode;
407 
408  WARN_ON_ONCE(!mutex_is_locked(&pit->pit_state.lock));
409 
410  if (hpet_legacy_start) {
411  /* save existing mode for later reenablement */
412  WARN_ON(channel != 0);
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;
417  } else {
418  pit_load_count(pit, channel, val);
419  }
420 }
static void pit_load_count(struct kvm_pit *pit, int channel, u32 val)
Definition: i8254.c:365
struct kvm_kpit_channel_state channels[3]
Definition: i8254.h:27
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kvm_pit_set_reinject()

void kvm_pit_set_reinject ( struct kvm_pit pit,
bool  reinject 
)

Definition at line 291 of file i8254.c.

292 {
293  struct kvm_kpit_state *ps = &pit->pit_state;
294  struct kvm *kvm = pit->kvm;
295 
296  if (atomic_read(&ps->reinject) == reinject)
297  return;
298 
299  /*
300  * AMD SVM AVIC accelerates EOI write and does not trap.
301  * This cause in-kernel PIT re-inject mode to fail
302  * since it checks ps->irq_ack before kvm_set_irq()
303  * and relies on the ack notifier to timely queue
304  * the pt->worker work iterm and reinject the missed tick.
305  * So, deactivate APICv when PIT is in reinject mode.
306  */
307  if (reinject) {
308  kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PIT_REINJ);
309  /* The initial state is preserved while ps->reinject == 0. */
311  kvm_register_irq_ack_notifier(kvm, &ps->irq_ack_notifier);
313  } else {
314  kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PIT_REINJ);
315  kvm_unregister_irq_ack_notifier(kvm, &ps->irq_ack_notifier);
317  }
318 
319  atomic_set(&ps->reinject, reinject);
320 }
static void kvm_pit_reset_reinject(struct kvm_pit *pit)
Definition: i8254.c:285
void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn)
Definition: irq_comm.c:241
void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq, struct kvm_irq_mask_notifier *kimn)
Definition: irq_comm.c:250
atomic_t reinject
Definition: i8254.h:34
Here is the call graph for this function:
Here is the caller graph for this function: