1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2015, 2016 ARM Ltd.
7 #include <linux/kvm_host.h>
8 #include <trace/events/kvm.h>
9 #include <kvm/arm_vgic.h>
13 * vgic_irqfd_set_irq: inject the IRQ corresponding to the
14 * irqchip routing entry
16 * This is the entry point for irqfd IRQ injection
18 static int vgic_irqfd_set_irq(struct kvm_kernel_irq_routing_entry
*e
,
19 struct kvm
*kvm
, int irq_source_id
,
20 int level
, bool line_status
)
22 unsigned int spi_id
= e
->irqchip
.pin
+ VGIC_NR_PRIVATE_IRQS
;
24 if (!vgic_valid_spi(kvm
, spi_id
))
26 return kvm_vgic_inject_irq(kvm
, 0, spi_id
, level
, NULL
);
30 * kvm_set_routing_entry: populate a kvm routing entry
31 * from a user routing entry
33 * @kvm: the VM this entry is applied to
34 * @e: kvm kernel routing entry handle
35 * @ue: user api routing entry handle
36 * return 0 on success, -EINVAL on errors.
38 int kvm_set_routing_entry(struct kvm
*kvm
,
39 struct kvm_kernel_irq_routing_entry
*e
,
40 const struct kvm_irq_routing_entry
*ue
)
45 case KVM_IRQ_ROUTING_IRQCHIP
:
46 e
->set
= vgic_irqfd_set_irq
;
47 e
->irqchip
.irqchip
= ue
->u
.irqchip
.irqchip
;
48 e
->irqchip
.pin
= ue
->u
.irqchip
.pin
;
49 if ((e
->irqchip
.pin
>= KVM_IRQCHIP_NUM_PINS
) ||
50 (e
->irqchip
.irqchip
>= KVM_NR_IRQCHIPS
))
53 case KVM_IRQ_ROUTING_MSI
:
55 e
->msi
.address_lo
= ue
->u
.msi
.address_lo
;
56 e
->msi
.address_hi
= ue
->u
.msi
.address_hi
;
57 e
->msi
.data
= ue
->u
.msi
.data
;
58 e
->msi
.flags
= ue
->flags
;
59 e
->msi
.devid
= ue
->u
.msi
.devid
;
69 static void kvm_populate_msi(struct kvm_kernel_irq_routing_entry
*e
,
72 msi
->address_lo
= e
->msi
.address_lo
;
73 msi
->address_hi
= e
->msi
.address_hi
;
74 msi
->data
= e
->msi
.data
;
75 msi
->flags
= e
->msi
.flags
;
76 msi
->devid
= e
->msi
.devid
;
79 * kvm_set_msi: inject the MSI corresponding to the
82 * This is the entry point for irqfd MSI injection
83 * and userspace MSI injection.
85 int kvm_set_msi(struct kvm_kernel_irq_routing_entry
*e
,
86 struct kvm
*kvm
, int irq_source_id
,
87 int level
, bool line_status
)
91 if (!vgic_has_its(kvm
))
97 kvm_populate_msi(e
, &msi
);
98 return vgic_its_inject_msi(kvm
, &msi
);
102 * kvm_arch_set_irq_inatomic: fast-path for irqfd injection
104 * Currently only direct MSI injection is supported.
106 int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry
*e
,
107 struct kvm
*kvm
, int irq_source_id
, int level
,
110 if (e
->type
== KVM_IRQ_ROUTING_MSI
&& vgic_has_its(kvm
) && level
) {
113 kvm_populate_msi(e
, &msi
);
114 if (!vgic_its_inject_cached_translation(kvm
, &msi
))
121 int kvm_vgic_setup_default_irq_routing(struct kvm
*kvm
)
123 struct kvm_irq_routing_entry
*entries
;
124 struct vgic_dist
*dist
= &kvm
->arch
.vgic
;
125 u32 nr
= dist
->nr_spis
;
128 entries
= kcalloc(nr
, sizeof(*entries
), GFP_KERNEL
);
132 for (i
= 0; i
< nr
; i
++) {
134 entries
[i
].type
= KVM_IRQ_ROUTING_IRQCHIP
;
135 entries
[i
].u
.irqchip
.irqchip
= 0;
136 entries
[i
].u
.irqchip
.pin
= i
;
138 ret
= kvm_set_irq_routing(kvm
, entries
, nr
, 0);