|
@@ -506,6 +506,7 @@ static bool vgic_v2_queue_sgi(struct kvm_vcpu *vcpu, int irq)
|
|
|
static int vgic_v2_map_resources(struct kvm *kvm,
|
|
|
const struct vgic_params *params)
|
|
|
{
|
|
|
+ struct vgic_dist *dist = &kvm->arch.vgic;
|
|
|
int ret = 0;
|
|
|
|
|
|
if (!irqchip_in_kernel(kvm))
|
|
@@ -516,13 +517,17 @@ static int vgic_v2_map_resources(struct kvm *kvm,
|
|
|
if (vgic_ready(kvm))
|
|
|
goto out;
|
|
|
|
|
|
- if (IS_VGIC_ADDR_UNDEF(kvm->arch.vgic.vgic_dist_base) ||
|
|
|
- IS_VGIC_ADDR_UNDEF(kvm->arch.vgic.vgic_cpu_base)) {
|
|
|
+ if (IS_VGIC_ADDR_UNDEF(dist->vgic_dist_base) ||
|
|
|
+ IS_VGIC_ADDR_UNDEF(dist->vgic_cpu_base)) {
|
|
|
kvm_err("Need to set vgic cpu and dist addresses first\n");
|
|
|
ret = -ENXIO;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ vgic_register_kvm_io_dev(kvm, dist->vgic_dist_base,
|
|
|
+ KVM_VGIC_V2_DIST_SIZE,
|
|
|
+ vgic_dist_ranges, -1, &dist->dist_iodev);
|
|
|
+
|
|
|
/*
|
|
|
* Initialize the vgic if this hasn't already been done on demand by
|
|
|
* accessing the vgic state from userspace.
|
|
@@ -530,18 +535,23 @@ static int vgic_v2_map_resources(struct kvm *kvm,
|
|
|
ret = vgic_init(kvm);
|
|
|
if (ret) {
|
|
|
kvm_err("Unable to allocate maps\n");
|
|
|
- goto out;
|
|
|
+ goto out_unregister;
|
|
|
}
|
|
|
|
|
|
- ret = kvm_phys_addr_ioremap(kvm, kvm->arch.vgic.vgic_cpu_base,
|
|
|
+ ret = kvm_phys_addr_ioremap(kvm, dist->vgic_cpu_base,
|
|
|
params->vcpu_base, KVM_VGIC_V2_CPU_SIZE,
|
|
|
true);
|
|
|
if (ret) {
|
|
|
kvm_err("Unable to remap VGIC CPU to VCPU\n");
|
|
|
- goto out;
|
|
|
+ goto out_unregister;
|
|
|
}
|
|
|
|
|
|
- kvm->arch.vgic.ready = true;
|
|
|
+ dist->ready = true;
|
|
|
+ goto out;
|
|
|
+
|
|
|
+out_unregister:
|
|
|
+ kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &dist->dist_iodev.dev);
|
|
|
+
|
|
|
out:
|
|
|
if (ret)
|
|
|
kvm_vgic_destroy(kvm);
|