#include <linux/irqchip/arm-gic.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
#include <kvm/arm_vgic.h>
#include <asm/kvm_mmu.h>
#include "vgic.h"
Go to the source code of this file.
◆ DEFINE_STATIC_KEY_FALSE()
◆ lr_signals_eoi_mi()
static bool lr_signals_eoi_mi |
( |
u32 |
lr_val | ) |
|
|
static |
Definition at line 36 of file vgic-v2.c.
38 return !(lr_val & GICH_LR_STATE) && (lr_val & GICH_LR_EOI) &&
39 !(lr_val & GICH_LR_HW);
◆ save_lrs()
static void save_lrs |
( |
struct kvm_vcpu * |
vcpu, |
|
|
void __iomem * |
base |
|
) |
| |
|
static |
Definition at line 403 of file vgic-v2.c.
410 elrsr = readl_relaxed(
base + GICH_ELRSR0);
412 elrsr |= ((u64)readl_relaxed(
base + GICH_ELRSR1)) << 32;
415 if (elrsr & (1UL << i))
416 cpu_if->
vgic_lr[i] &= ~GICH_LR_STATE;
418 cpu_if->
vgic_lr[i] = readl_relaxed(
base + GICH_LR0 + (i * 4));
420 writel_relaxed(0,
base + GICH_LR0 + (i * 4));
static unsigned long base
u32 vgic_lr[VGIC_V2_MAX_LRS]
◆ vgic_v2_check_base()
static bool vgic_v2_check_base |
( |
gpa_t |
dist_base, |
|
|
gpa_t |
cpu_base |
|
) |
| |
|
static |
Definition at line 274 of file vgic-v2.c.
276 if (dist_base + KVM_VGIC_V2_DIST_SIZE < dist_base)
278 if (cpu_base + KVM_VGIC_V2_CPU_SIZE < cpu_base)
281 if (dist_base + KVM_VGIC_V2_DIST_SIZE <= cpu_base)
283 if (cpu_base + KVM_VGIC_V2_CPU_SIZE <= dist_base)
◆ vgic_v2_clear_lr()
void vgic_v2_clear_lr |
( |
struct kvm_vcpu * |
vcpu, |
|
|
int |
lr |
|
) |
| |
Definition at line 200 of file vgic-v2.c.
202 vcpu->arch.vgic_cpu.vgic_v2.vgic_lr[lr] = 0;
◆ vgic_v2_enable()
void vgic_v2_enable |
( |
struct kvm_vcpu * |
vcpu | ) |
|
Definition at line 260 of file vgic-v2.c.
267 vcpu->arch.vgic_cpu.vgic_v2.vgic_vmcr = 0;
270 vcpu->arch.vgic_cpu.vgic_v2.vgic_hcr = GICH_HCR_EN;
◆ vgic_v2_fold_lr_state()
void vgic_v2_fold_lr_state |
( |
struct kvm_vcpu * |
vcpu | ) |
|
Definition at line 49 of file vgic-v2.c.
61 u32 cpuid, intid = val & GICH_LR_VIRTUALID;
66 cpuid = val & GICH_LR_PHYSID_CPUID;
67 cpuid >>= GICH_LR_PHYSID_CPUID_SHIFT;
72 kvm_notify_acked_irq(
vcpu->kvm, 0,
80 deactivated = irq->
active && !(val & GICH_LR_ACTIVE_BIT);
81 irq->
active = !!(val & GICH_LR_ACTIVE_BIT);
88 (val & GICH_LR_PENDING_BIT)) {
92 irq->
source |= (1 << cpuid);
#define vgic_valid_spi(k, i)
#define VGIC_NR_PRIVATE_IRQS
struct vgic_v2_cpu_if vgic_v2
enum vgic_irq_config config
static bool lr_signals_eoi_mi(u32 lr_val)
void vgic_irq_handle_resampling(struct vgic_irq *irq, bool lr_deactivated, bool lr_pending)
struct vgic_irq * vgic_get_irq(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 intid)
void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq)
#define DEBUG_SPINLOCK_BUG_ON(p)
#define vgic_irq_is_sgi(intid)
◆ vgic_v2_get_vmcr()
void vgic_v2_get_vmcr |
( |
struct kvm_vcpu * |
vcpu, |
|
|
struct vgic_vmcr * |
vmcrp |
|
) |
| |
Definition at line 232 of file vgic-v2.c.
239 vmcrp->
grpen0 = (vmcr & GICH_VMCR_ENABLE_GRP0_MASK) >>
240 GICH_VMCR_ENABLE_GRP0_SHIFT;
241 vmcrp->
grpen1 = (vmcr & GICH_VMCR_ENABLE_GRP1_MASK) >>
242 GICH_VMCR_ENABLE_GRP1_SHIFT;
243 vmcrp->
ackctl = (vmcr & GICH_VMCR_ACK_CTL_MASK) >>
244 GICH_VMCR_ACK_CTL_SHIFT;
245 vmcrp->
fiqen = (vmcr & GICH_VMCR_FIQ_EN_MASK) >>
246 GICH_VMCR_FIQ_EN_SHIFT;
247 vmcrp->
cbpr = (vmcr & GICH_VMCR_CBPR_MASK) >>
248 GICH_VMCR_CBPR_SHIFT;
249 vmcrp->
eoim = (vmcr & GICH_VMCR_EOI_MODE_MASK) >>
250 GICH_VMCR_EOI_MODE_SHIFT;
252 vmcrp->
abpr = (vmcr & GICH_VMCR_ALIAS_BINPOINT_MASK) >>
253 GICH_VMCR_ALIAS_BINPOINT_SHIFT;
254 vmcrp->
bpr = (vmcr & GICH_VMCR_BINPOINT_MASK) >>
255 GICH_VMCR_BINPOINT_SHIFT;
256 vmcrp->
pmr = ((vmcr & GICH_VMCR_PRIMASK_MASK) >>
257 GICH_VMCR_PRIMASK_SHIFT) << GICV_PMR_PRIORITY_SHIFT;
◆ vgic_v2_init_lrs()
void vgic_v2_init_lrs |
( |
void |
| ) |
|
Definition at line 21 of file vgic-v2.c.
struct vgic_global kvm_vgic_global_state
static void vgic_v2_write_lr(int lr, u32 val)
◆ vgic_v2_load()
void vgic_v2_load |
( |
struct kvm_vcpu * |
vcpu | ) |
|
Definition at line 457 of file vgic-v2.c.
void __iomem * vctrl_base
◆ vgic_v2_map_resources()
int vgic_v2_map_resources |
( |
struct kvm * |
kvm | ) |
|
Definition at line 289 of file vgic-v2.c.
291 struct vgic_dist *dist = &kvm->arch.vgic;
296 kvm_debug(
"Need to set vgic cpu and dist addresses first\n");
301 kvm_debug(
"VGIC CPU and dist frames overlap\n");
311 kvm_err(
"Unable to initialize VGIC dynamic data structures\n");
318 KVM_VGIC_V2_CPU_SIZE,
true);
320 kvm_err(
"Unable to remap VGIC CPU to VCPU\n");
struct static_key_false vgic_v2_cpuif_trap
int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa, phys_addr_t pa, unsigned long size, bool writable)
int vgic_init(struct kvm *kvm)
static bool vgic_v2_check_base(gpa_t dist_base, gpa_t cpu_base)
#define IS_VGIC_ADDR_UNDEF(_x)
◆ vgic_v2_populate_lr()
void vgic_v2_populate_lr |
( |
struct kvm_vcpu * |
vcpu, |
|
|
struct vgic_irq * |
irq, |
|
|
int |
lr |
|
) |
| |
Definition at line 122 of file vgic-v2.c.
124 u32 val = irq->
intid;
125 bool allow_pending =
true;
128 val |= GICH_LR_ACTIVE_BIT;
132 allow_pending =
false;
138 val |= GICH_LR_GROUP1;
142 val |= irq->
hwintid << GICH_LR_PHYSID_CPUID_SHIFT;
149 allow_pending =
false;
159 allow_pending =
false;
164 val |= GICH_LR_PENDING_BIT;
170 u32 src = ffs(irq->
source);
172 if (WARN_RATELIMIT(!src,
"No SGI source for INTID %d\n",
176 val |= (src - 1) << GICH_LR_PHYSID_CPUID_SHIFT;
177 irq->
source &= ~(1 << (src - 1));
195 val |= (irq->
priority >> 3) << GICH_LR_PRIORITY_SHIFT;
197 vcpu->arch.vgic_cpu.vgic_v2.vgic_lr[lr] = val;
static bool vgic_irq_needs_resampling(struct vgic_irq *irq)
static bool vgic_irq_is_multi_sgi(struct vgic_irq *irq)
static bool irq_is_pending(struct vgic_irq *irq)
static bool vgic_irq_is_mapped_level(struct vgic_irq *irq)
◆ vgic_v2_probe()
vgic_v2_probe - probe for a VGICv2 compatible interrupt controller @info: pointer to the GIC description
Returns 0 if the VGICv2 has been probed successfully, returns an error code otherwise
Definition at line 337 of file vgic-v2.c.
342 if (is_protected_kvm_enabled()) {
343 kvm_err(
"GICv2 not supported in protected mode\n");
347 if (!info->vctrl.start) {
348 kvm_err(
"GICH not present in the firmware table\n");
352 if (!PAGE_ALIGNED(info->vcpu.start) ||
353 !PAGE_ALIGNED(resource_size(&info->vcpu))) {
354 kvm_info(
"GICV region size/alignment is unsafe, using trapping (reduced performance)\n");
357 resource_size(&info->vcpu),
361 kvm_err(
"Cannot map GICV into hyp\n");
369 resource_size(&info->vctrl),
373 kvm_err(
"Cannot map VCTRL into hyp\n");
382 kvm_err(
"Cannot register GICv2 KVM device\n");
391 kvm_debug(
"vgic-v2@%llx\n", info->vctrl.start);
int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size, void __iomem **kaddr, void __iomem **haddr)
void __iomem * vcpu_base_va
void __iomem * vcpu_hyp_va
int kvm_register_vgic_device(unsigned long type)
◆ vgic_v2_put()
void vgic_v2_put |
( |
struct kvm_vcpu * |
vcpu | ) |
|
Definition at line 474 of file vgic-v2.c.
void vgic_v2_vmcr_sync(struct kvm_vcpu *vcpu)
◆ vgic_v2_restore_state()
void vgic_v2_restore_state |
( |
struct kvm_vcpu * |
vcpu | ) |
|
◆ vgic_v2_save_state()
void vgic_v2_save_state |
( |
struct kvm_vcpu * |
vcpu | ) |
|
Definition at line 424 of file vgic-v2.c.
427 u64 used_lrs = vcpu->arch.vgic_cpu.vgic_v2.used_lrs;
434 writel_relaxed(0,
base + GICH_HCR);
static void save_lrs(struct kvm_vcpu *vcpu, void __iomem *base)
◆ vgic_v2_set_underflow()
void vgic_v2_set_underflow |
( |
struct kvm_vcpu * |
vcpu | ) |
|
◆ vgic_v2_set_vmcr()
void vgic_v2_set_vmcr |
( |
struct kvm_vcpu * |
vcpu, |
|
|
struct vgic_vmcr * |
vmcrp |
|
) |
| |
Definition at line 205 of file vgic-v2.c.
210 vmcr = (vmcrp->
grpen0 << GICH_VMCR_ENABLE_GRP0_SHIFT) &
211 GICH_VMCR_ENABLE_GRP0_MASK;
212 vmcr |= (vmcrp->
grpen1 << GICH_VMCR_ENABLE_GRP1_SHIFT) &
213 GICH_VMCR_ENABLE_GRP1_MASK;
214 vmcr |= (vmcrp->
ackctl << GICH_VMCR_ACK_CTL_SHIFT) &
215 GICH_VMCR_ACK_CTL_MASK;
216 vmcr |= (vmcrp->
fiqen << GICH_VMCR_FIQ_EN_SHIFT) &
217 GICH_VMCR_FIQ_EN_MASK;
218 vmcr |= (vmcrp->
cbpr << GICH_VMCR_CBPR_SHIFT) &
220 vmcr |= (vmcrp->
eoim << GICH_VMCR_EOI_MODE_SHIFT) &
221 GICH_VMCR_EOI_MODE_MASK;
222 vmcr |= (vmcrp->
abpr << GICH_VMCR_ALIAS_BINPOINT_SHIFT) &
223 GICH_VMCR_ALIAS_BINPOINT_MASK;
224 vmcr |= (vmcrp->
bpr << GICH_VMCR_BINPOINT_SHIFT) &
225 GICH_VMCR_BINPOINT_MASK;
226 vmcr |= ((vmcrp->
pmr >> GICV_PMR_PRIORITY_SHIFT) <<
227 GICH_VMCR_PRIMASK_SHIFT) & GICH_VMCR_PRIMASK_MASK;
◆ vgic_v2_vmcr_sync()
void vgic_v2_vmcr_sync |
( |
struct kvm_vcpu * |
vcpu | ) |
|
◆ vgic_v2_write_lr()
static void vgic_v2_write_lr |
( |
int |
lr, |
|
|
u32 |
val |
|
) |
| |
|
inlinestatic |
Definition at line 14 of file vgic-v2.c.
18 writel_relaxed(val,
base + GICH_LR0 + (lr * 4));