|
@@ -83,6 +83,7 @@ static int coalesced_mmio_write(struct kvm_vcpu *vcpu,
|
|
|
ring->coalesced_mmio[ring->last].phys_addr = addr;
|
|
|
ring->coalesced_mmio[ring->last].len = len;
|
|
|
memcpy(ring->coalesced_mmio[ring->last].data, val, len);
|
|
|
+ ring->coalesced_mmio[ring->last].pio = dev->zone.pio;
|
|
|
smp_wmb();
|
|
|
ring->last = (ring->last + 1) % KVM_COALESCED_MMIO_MAX;
|
|
|
spin_unlock(&dev->kvm->ring_lock);
|
|
@@ -140,6 +141,9 @@ int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm,
|
|
|
int ret;
|
|
|
struct kvm_coalesced_mmio_dev *dev;
|
|
|
|
|
|
+ if (zone->pio != 1 && zone->pio != 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
dev = kzalloc(sizeof(struct kvm_coalesced_mmio_dev), GFP_KERNEL);
|
|
|
if (!dev)
|
|
|
return -ENOMEM;
|
|
@@ -149,8 +153,9 @@ int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm,
|
|
|
dev->zone = *zone;
|
|
|
|
|
|
mutex_lock(&kvm->slots_lock);
|
|
|
- ret = kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, zone->addr,
|
|
|
- zone->size, &dev->dev);
|
|
|
+ ret = kvm_io_bus_register_dev(kvm,
|
|
|
+ zone->pio ? KVM_PIO_BUS : KVM_MMIO_BUS,
|
|
|
+ zone->addr, zone->size, &dev->dev);
|
|
|
if (ret < 0)
|
|
|
goto out_free_dev;
|
|
|
list_add_tail(&dev->list, &kvm->coalesced_zones);
|
|
@@ -174,7 +179,8 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm,
|
|
|
|
|
|
list_for_each_entry_safe(dev, tmp, &kvm->coalesced_zones, list)
|
|
|
if (coalesced_mmio_in_range(dev, zone->addr, zone->size)) {
|
|
|
- kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &dev->dev);
|
|
|
+ kvm_io_bus_unregister_dev(kvm,
|
|
|
+ zone->pio ? KVM_PIO_BUS : KVM_MMIO_BUS, &dev->dev);
|
|
|
kvm_iodevice_destructor(&dev->dev);
|
|
|
}
|
|
|
|