summaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2016-03-03 10:43:58 -0500
committerMarc Zyngier <marc.zyngier@arm.com>2016-03-08 23:24:09 -0500
commit0d98d00b8d80bfdee95cf7e85f20f107377e2662 (patch)
tree0962d058aec3a40e6e6488856e6a3b4a5f89f2c5 /virt
parent84e8b9c88d5fe9c9a59ed24ae44d7ac0983df92b (diff)
arm64: KVM: vgic-v3: Reset LRs at boot time
In order to let the GICv3 code be more lazy in the way it accesses the LRs, it is necessary to start with a clean slate. Let's reset the LRs on each CPU when the vgic is probed (which includes a round trip to EL2...). Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/arm/vgic-v3.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/virt/kvm/arm/vgic-v3.c b/virt/kvm/arm/vgic-v3.c
index 11b5ff6ce81c..999bdc6d9d9f 100644
--- a/virt/kvm/arm/vgic-v3.c
+++ b/virt/kvm/arm/vgic-v3.c
@@ -216,6 +216,11 @@ static const struct vgic_ops vgic_v3_ops = {
216 216
217static struct vgic_params vgic_v3_params; 217static struct vgic_params vgic_v3_params;
218 218
219static void vgic_cpu_init_lrs(void *params)
220{
221 kvm_call_hyp(__vgic_v3_init_lrs);
222}
223
219/** 224/**
220 * vgic_v3_probe - probe for a GICv3 compatible interrupt controller in DT 225 * vgic_v3_probe - probe for a GICv3 compatible interrupt controller in DT
221 * @node: pointer to the DT node 226 * @node: pointer to the DT node
@@ -284,6 +289,8 @@ int vgic_v3_probe(struct device_node *vgic_node,
284 kvm_info("%s@%llx IRQ%d\n", vgic_node->name, 289 kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
285 vcpu_res.start, vgic->maint_irq); 290 vcpu_res.start, vgic->maint_irq);
286 291
292 on_each_cpu(vgic_cpu_init_lrs, vgic, 1);
293
287 *ops = &vgic_v3_ops; 294 *ops = &vgic_v3_ops;
288 *params = vgic; 295 *params = vgic;
289 296