Lines Matching refs:kvm

52 void kvm_vgic_early_init(struct kvm *kvm)  in kvm_vgic_early_init()  argument
54 struct vgic_dist *dist = &kvm->arch.vgic; in kvm_vgic_early_init()
71 int kvm_vgic_create(struct kvm *kvm, u32 type) in kvm_vgic_create() argument
95 lockdep_assert_held(&kvm->lock); in kvm_vgic_create()
102 if (kvm_trylock_all_vcpus(kvm)) in kvm_vgic_create()
109 mutex_lock(&kvm->arch.config_lock); in kvm_vgic_create()
118 if (kvm->created_vcpus != atomic_read(&kvm->online_vcpus)) in kvm_vgic_create()
121 if (irqchip_in_kernel(kvm)) { in kvm_vgic_create()
126 kvm_for_each_vcpu(i, vcpu, kvm) { in kvm_vgic_create()
133 kvm->max_vcpus = VGIC_V2_MAX_CPUS; in kvm_vgic_create()
135 kvm->max_vcpus = VGIC_V3_MAX_CPUS; in kvm_vgic_create()
137 if (atomic_read(&kvm->online_vcpus) > kvm->max_vcpus) { in kvm_vgic_create()
142 kvm_for_each_vcpu(i, vcpu, kvm) { in kvm_vgic_create()
149 kvm_for_each_vcpu(i, vcpu, kvm) { in kvm_vgic_create()
158 kvm->arch.vgic.in_kernel = true; in kvm_vgic_create()
159 kvm->arch.vgic.vgic_model = type; in kvm_vgic_create()
160 kvm->arch.vgic.implementation_rev = KVM_VGIC_IMP_REV_LATEST; in kvm_vgic_create()
162 kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF; in kvm_vgic_create()
165 kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF; in kvm_vgic_create()
167 INIT_LIST_HEAD(&kvm->arch.vgic.rd_regions); in kvm_vgic_create()
170 kvm->arch.vgic.nassgicap = system_supports_direct_sgis(); in kvm_vgic_create()
173 mutex_unlock(&kvm->arch.config_lock); in kvm_vgic_create()
174 kvm_unlock_all_vcpus(kvm); in kvm_vgic_create()
185 static int kvm_vgic_dist_init(struct kvm *kvm, unsigned int nr_spis) in kvm_vgic_dist_init() argument
187 struct vgic_dist *dist = &kvm->arch.vgic; in kvm_vgic_dist_init()
188 struct kvm_vcpu *vcpu0 = kvm_get_vcpu(kvm, 0); in kvm_vgic_dist_init()
237 guard(mutex)(&vcpu->kvm->arch.config_lock); in kvm_vgic_vcpu_nv_init()
244 if (vcpu->kvm->arch.vgic.mi_intid == 0) in kvm_vgic_vcpu_nv_init()
245 vcpu->kvm->arch.vgic.mi_intid = DEFAULT_MI_INTID; in kvm_vgic_vcpu_nv_init()
246 ret = kvm_vgic_set_owner(vcpu, vcpu->kvm->arch.vgic.mi_intid, vcpu); in kvm_vgic_vcpu_nv_init()
256 lockdep_assert_held(&vcpu->kvm->arch.config_lock); in vgic_allocate_private_irqs_locked()
309 mutex_lock(&vcpu->kvm->arch.config_lock); in vgic_allocate_private_irqs()
311 mutex_unlock(&vcpu->kvm->arch.config_lock); in vgic_allocate_private_irqs()
328 struct vgic_dist *dist = &vcpu->kvm->arch.vgic; in kvm_vgic_vcpu_init()
337 if (!irqchip_in_kernel(vcpu->kvm)) in kvm_vgic_vcpu_init()
349 mutex_lock(&vcpu->kvm->slots_lock); in kvm_vgic_vcpu_init()
351 mutex_unlock(&vcpu->kvm->slots_lock); in kvm_vgic_vcpu_init()
373 int vgic_init(struct kvm *kvm) in vgic_init() argument
375 struct vgic_dist *dist = &kvm->arch.vgic; in vgic_init()
380 lockdep_assert_held(&kvm->arch.config_lock); in vgic_init()
382 if (vgic_initialized(kvm)) in vgic_init()
386 if (kvm->created_vcpus != atomic_read(&kvm->online_vcpus)) in vgic_init()
393 ret = kvm_vgic_dist_init(kvm, dist->nr_spis); in vgic_init()
401 if (vgic_supports_direct_irqs(kvm)) { in vgic_init()
402 ret = vgic_v4_init(kvm); in vgic_init()
407 kvm_for_each_vcpu(idx, vcpu, kvm) in vgic_init()
410 ret = kvm_vgic_setup_default_irq_routing(kvm); in vgic_init()
414 vgic_debug_init(kvm); in vgic_init()
420 static void kvm_vgic_dist_destroy(struct kvm *kvm) in kvm_vgic_dist_destroy() argument
422 struct vgic_dist *dist = &kvm->arch.vgic; in kvm_vgic_dist_destroy()
435 vgic_v3_free_redist_region(kvm, rdreg); in kvm_vgic_dist_destroy()
441 if (vgic_supports_direct_irqs(kvm)) in kvm_vgic_dist_destroy()
442 vgic_v4_teardown(kvm); in kvm_vgic_dist_destroy()
461 if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) { in __kvm_vgic_vcpu_destroy()
478 if (kvm_get_vcpu_by_id(vcpu->kvm, vcpu->vcpu_id) != vcpu) in __kvm_vgic_vcpu_destroy()
487 struct kvm *kvm = vcpu->kvm; in kvm_vgic_vcpu_destroy() local
489 mutex_lock(&kvm->slots_lock); in kvm_vgic_vcpu_destroy()
491 mutex_unlock(&kvm->slots_lock); in kvm_vgic_vcpu_destroy()
494 void kvm_vgic_destroy(struct kvm *kvm) in kvm_vgic_destroy() argument
499 mutex_lock(&kvm->slots_lock); in kvm_vgic_destroy()
500 mutex_lock(&kvm->arch.config_lock); in kvm_vgic_destroy()
502 vgic_debug_destroy(kvm); in kvm_vgic_destroy()
504 kvm_for_each_vcpu(i, vcpu, kvm) in kvm_vgic_destroy()
507 kvm_vgic_dist_destroy(kvm); in kvm_vgic_destroy()
509 mutex_unlock(&kvm->arch.config_lock); in kvm_vgic_destroy()
511 if (kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) in kvm_vgic_destroy()
512 kvm_for_each_vcpu(i, vcpu, kvm) in kvm_vgic_destroy()
515 mutex_unlock(&kvm->slots_lock); in kvm_vgic_destroy()
524 int vgic_lazy_init(struct kvm *kvm) in vgic_lazy_init() argument
528 if (unlikely(!vgic_initialized(kvm))) { in vgic_lazy_init()
535 if (kvm->arch.vgic.vgic_model != KVM_DEV_TYPE_ARM_VGIC_V2) in vgic_lazy_init()
538 mutex_lock(&kvm->arch.config_lock); in vgic_lazy_init()
539 ret = vgic_init(kvm); in vgic_lazy_init()
540 mutex_unlock(&kvm->arch.config_lock); in vgic_lazy_init()
559 int kvm_vgic_map_resources(struct kvm *kvm) in kvm_vgic_map_resources() argument
561 struct vgic_dist *dist = &kvm->arch.vgic; in kvm_vgic_map_resources()
566 if (likely(vgic_ready(kvm))) in kvm_vgic_map_resources()
569 mutex_lock(&kvm->slots_lock); in kvm_vgic_map_resources()
570 mutex_lock(&kvm->arch.config_lock); in kvm_vgic_map_resources()
571 if (vgic_ready(kvm)) in kvm_vgic_map_resources()
574 if (!irqchip_in_kernel(kvm)) in kvm_vgic_map_resources()
578 ret = vgic_v2_map_resources(kvm); in kvm_vgic_map_resources()
581 ret = vgic_v3_map_resources(kvm); in kvm_vgic_map_resources()
589 mutex_unlock(&kvm->arch.config_lock); in kvm_vgic_map_resources()
591 ret = vgic_register_dist_iodev(kvm, dist_base, type); in kvm_vgic_map_resources()
607 mutex_unlock(&kvm->arch.config_lock); in kvm_vgic_map_resources()
610 kvm_vm_dead(kvm); in kvm_vgic_map_resources()
612 mutex_unlock(&kvm->slots_lock); in kvm_vgic_map_resources()