|
@@ -350,10 +350,20 @@ void kvm_pit_load_count(struct kvm *kvm, int channel, u32 val)
|
|
|
mutex_unlock(&kvm->arch.vpit->pit_state.lock);
|
|
|
}
|
|
|
|
|
|
+static inline struct kvm_pit *dev_to_pit(struct kvm_io_device *dev)
|
|
|
+{
|
|
|
+ return container_of(dev, struct kvm_pit, dev);
|
|
|
+}
|
|
|
+
|
|
|
+static inline struct kvm_pit *speaker_to_pit(struct kvm_io_device *dev)
|
|
|
+{
|
|
|
+ return container_of(dev, struct kvm_pit, speaker_dev);
|
|
|
+}
|
|
|
+
|
|
|
static void pit_ioport_write(struct kvm_io_device *this,
|
|
|
gpa_t addr, int len, const void *data)
|
|
|
{
|
|
|
- struct kvm_pit *pit = (struct kvm_pit *)this->private;
|
|
|
+ struct kvm_pit *pit = dev_to_pit(this);
|
|
|
struct kvm_kpit_state *pit_state = &pit->pit_state;
|
|
|
struct kvm *kvm = pit->kvm;
|
|
|
int channel, access;
|
|
@@ -426,7 +436,7 @@ static void pit_ioport_write(struct kvm_io_device *this,
|
|
|
static void pit_ioport_read(struct kvm_io_device *this,
|
|
|
gpa_t addr, int len, void *data)
|
|
|
{
|
|
|
- struct kvm_pit *pit = (struct kvm_pit *)this->private;
|
|
|
+ struct kvm_pit *pit = dev_to_pit(this);
|
|
|
struct kvm_kpit_state *pit_state = &pit->pit_state;
|
|
|
struct kvm *kvm = pit->kvm;
|
|
|
int ret, count;
|
|
@@ -497,7 +507,7 @@ static int pit_in_range(struct kvm_io_device *this, gpa_t addr,
|
|
|
static void speaker_ioport_write(struct kvm_io_device *this,
|
|
|
gpa_t addr, int len, const void *data)
|
|
|
{
|
|
|
- struct kvm_pit *pit = (struct kvm_pit *)this->private;
|
|
|
+ struct kvm_pit *pit = speaker_to_pit(this);
|
|
|
struct kvm_kpit_state *pit_state = &pit->pit_state;
|
|
|
struct kvm *kvm = pit->kvm;
|
|
|
u32 val = *(u32 *) data;
|
|
@@ -511,7 +521,7 @@ static void speaker_ioport_write(struct kvm_io_device *this,
|
|
|
static void speaker_ioport_read(struct kvm_io_device *this,
|
|
|
gpa_t addr, int len, void *data)
|
|
|
{
|
|
|
- struct kvm_pit *pit = (struct kvm_pit *)this->private;
|
|
|
+ struct kvm_pit *pit = speaker_to_pit(this);
|
|
|
struct kvm_kpit_state *pit_state = &pit->pit_state;
|
|
|
struct kvm *kvm = pit->kvm;
|
|
|
unsigned int refresh_clock;
|
|
@@ -563,6 +573,18 @@ static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static const struct kvm_io_device_ops pit_dev_ops = {
|
|
|
+ .read = pit_ioport_read,
|
|
|
+ .write = pit_ioport_write,
|
|
|
+ .in_range = pit_in_range,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct kvm_io_device_ops speaker_dev_ops = {
|
|
|
+ .read = speaker_ioport_read,
|
|
|
+ .write = speaker_ioport_write,
|
|
|
+ .in_range = speaker_in_range,
|
|
|
+};
|
|
|
+
|
|
|
struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
|
|
|
{
|
|
|
struct kvm_pit *pit;
|
|
@@ -583,17 +605,11 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
|
|
|
spin_lock_init(&pit->pit_state.inject_lock);
|
|
|
|
|
|
/* Initialize PIO device */
|
|
|
- pit->dev.read = pit_ioport_read;
|
|
|
- pit->dev.write = pit_ioport_write;
|
|
|
- pit->dev.in_range = pit_in_range;
|
|
|
- pit->dev.private = pit;
|
|
|
+ kvm_iodevice_init(&pit->dev, &pit_dev_ops);
|
|
|
kvm_io_bus_register_dev(&kvm->pio_bus, &pit->dev);
|
|
|
|
|
|
if (flags & KVM_PIT_SPEAKER_DUMMY) {
|
|
|
- pit->speaker_dev.read = speaker_ioport_read;
|
|
|
- pit->speaker_dev.write = speaker_ioport_write;
|
|
|
- pit->speaker_dev.in_range = speaker_in_range;
|
|
|
- pit->speaker_dev.private = pit;
|
|
|
+ kvm_iodevice_init(&pit->speaker_dev, &speaker_dev_ops);
|
|
|
kvm_io_bus_register_dev(&kvm->pio_bus, &pit->speaker_dev);
|
|
|
}
|
|
|
|