Skip to content

Commit 47e89fe

Browse files
author
Marc Zyngier
committed
Merge branch kvm-arm64/gicv5-prologue into kvmarm-master/next
* kvm-arm64/gicv5-prologue: : . : Prologue to GICv5 support, courtesy of Sascha Bischoff. : : This is preliminary work that sets the scene for the full-blow : support. : . irqchip/gic-v5: Check if impl is virt capable KVM: arm64: gic: Set vgic_model before initing private IRQs arm64/sysreg: Drop ICH_HFGRTR_EL2.ICC_HAPR_EL1 and make RES1 KVM: arm64: gic-v3: Switch vGIC-v3 to use generated ICH_VMCR_EL2 Signed-off-by: Marc Zyngier <maz@kernel.org>
2 parents 1c880ea + 3227c3a commit 47e89fe

10 files changed

Lines changed: 72 additions & 101 deletions

File tree

arch/arm64/include/asm/el2_setup.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,6 @@
235235
ICH_HFGRTR_EL2_ICC_ICSR_EL1 | \
236236
ICH_HFGRTR_EL2_ICC_PCR_EL1 | \
237237
ICH_HFGRTR_EL2_ICC_HPPIR_EL1 | \
238-
ICH_HFGRTR_EL2_ICC_HAPR_EL1 | \
239238
ICH_HFGRTR_EL2_ICC_CR0_EL1 | \
240239
ICH_HFGRTR_EL2_ICC_IDRn_EL1 | \
241240
ICH_HFGRTR_EL2_ICC_APR_EL1)

arch/arm64/include/asm/sysreg.h

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,6 @@
560560
#define SYS_ICC_SRE_EL2 sys_reg(3, 4, 12, 9, 5)
561561
#define SYS_ICH_EISR_EL2 sys_reg(3, 4, 12, 11, 3)
562562
#define SYS_ICH_ELRSR_EL2 sys_reg(3, 4, 12, 11, 5)
563-
#define SYS_ICH_VMCR_EL2 sys_reg(3, 4, 12, 11, 7)
564563

565564
#define __SYS__LR0_EL2(x) sys_reg(3, 4, 12, 12, x)
566565
#define SYS_ICH_LR0_EL2 __SYS__LR0_EL2(0)
@@ -988,26 +987,6 @@
988987
#define ICH_LR_PRIORITY_SHIFT 48
989988
#define ICH_LR_PRIORITY_MASK (0xffULL << ICH_LR_PRIORITY_SHIFT)
990989

991-
/* ICH_VMCR_EL2 bit definitions */
992-
#define ICH_VMCR_ACK_CTL_SHIFT 2
993-
#define ICH_VMCR_ACK_CTL_MASK (1 << ICH_VMCR_ACK_CTL_SHIFT)
994-
#define ICH_VMCR_FIQ_EN_SHIFT 3
995-
#define ICH_VMCR_FIQ_EN_MASK (1 << ICH_VMCR_FIQ_EN_SHIFT)
996-
#define ICH_VMCR_CBPR_SHIFT 4
997-
#define ICH_VMCR_CBPR_MASK (1 << ICH_VMCR_CBPR_SHIFT)
998-
#define ICH_VMCR_EOIM_SHIFT 9
999-
#define ICH_VMCR_EOIM_MASK (1 << ICH_VMCR_EOIM_SHIFT)
1000-
#define ICH_VMCR_BPR1_SHIFT 18
1001-
#define ICH_VMCR_BPR1_MASK (7 << ICH_VMCR_BPR1_SHIFT)
1002-
#define ICH_VMCR_BPR0_SHIFT 21
1003-
#define ICH_VMCR_BPR0_MASK (7 << ICH_VMCR_BPR0_SHIFT)
1004-
#define ICH_VMCR_PMR_SHIFT 24
1005-
#define ICH_VMCR_PMR_MASK (0xffUL << ICH_VMCR_PMR_SHIFT)
1006-
#define ICH_VMCR_ENG0_SHIFT 0
1007-
#define ICH_VMCR_ENG0_MASK (1 << ICH_VMCR_ENG0_SHIFT)
1008-
#define ICH_VMCR_ENG1_SHIFT 1
1009-
#define ICH_VMCR_ENG1_MASK (1 << ICH_VMCR_ENG1_SHIFT)
1010-
1011990
/*
1012991
* Permission Indirection Extension (PIE) permission encodings.
1013992
* Encodings with the _O suffix, have overlays applied (Permission Overlay Extension).

arch/arm64/kvm/hyp/vgic-v3-sr.c

Lines changed: 25 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -569,11 +569,11 @@ static int __vgic_v3_highest_priority_lr(struct kvm_vcpu *vcpu, u32 vmcr,
569569
continue;
570570

571571
/* Group-0 interrupt, but Group-0 disabled? */
572-
if (!(val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_ENG0_MASK))
572+
if (!(val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_EL2_VENG0_MASK))
573573
continue;
574574

575575
/* Group-1 interrupt, but Group-1 disabled? */
576-
if ((val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_ENG1_MASK))
576+
if ((val & ICH_LR_GROUP) && !(vmcr & ICH_VMCR_EL2_VENG1_MASK))
577577
continue;
578578

579579
/* Not the highest priority? */
@@ -646,19 +646,19 @@ static int __vgic_v3_get_highest_active_priority(void)
646646

647647
static unsigned int __vgic_v3_get_bpr0(u32 vmcr)
648648
{
649-
return (vmcr & ICH_VMCR_BPR0_MASK) >> ICH_VMCR_BPR0_SHIFT;
649+
return FIELD_GET(ICH_VMCR_EL2_VBPR0, vmcr);
650650
}
651651

652652
static unsigned int __vgic_v3_get_bpr1(u32 vmcr)
653653
{
654654
unsigned int bpr;
655655

656-
if (vmcr & ICH_VMCR_CBPR_MASK) {
656+
if (vmcr & ICH_VMCR_EL2_VCBPR_MASK) {
657657
bpr = __vgic_v3_get_bpr0(vmcr);
658658
if (bpr < 7)
659659
bpr++;
660660
} else {
661-
bpr = (vmcr & ICH_VMCR_BPR1_MASK) >> ICH_VMCR_BPR1_SHIFT;
661+
bpr = FIELD_GET(ICH_VMCR_EL2_VBPR1, vmcr);
662662
}
663663

664664
return bpr;
@@ -758,7 +758,7 @@ static void __vgic_v3_read_iar(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
758758
if (grp != !!(lr_val & ICH_LR_GROUP))
759759
goto spurious;
760760

761-
pmr = (vmcr & ICH_VMCR_PMR_MASK) >> ICH_VMCR_PMR_SHIFT;
761+
pmr = FIELD_GET(ICH_VMCR_EL2_VPMR, vmcr);
762762
lr_prio = (lr_val & ICH_LR_PRIORITY_MASK) >> ICH_LR_PRIORITY_SHIFT;
763763
if (pmr <= lr_prio)
764764
goto spurious;
@@ -806,7 +806,7 @@ static int ___vgic_v3_write_dir(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
806806
int lr;
807807

808808
/* EOImode == 0, nothing to be done here */
809-
if (!(vmcr & ICH_VMCR_EOIM_MASK))
809+
if (!(vmcr & ICH_VMCR_EL2_VEOIM_MASK))
810810
return 1;
811811

812812
/* No deactivate to be performed on an LPI */
@@ -849,7 +849,7 @@ static void __vgic_v3_write_eoir(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
849849
}
850850

851851
/* EOImode == 1 and not an LPI, nothing to be done here */
852-
if ((vmcr & ICH_VMCR_EOIM_MASK) && !(vid >= VGIC_MIN_LPI))
852+
if ((vmcr & ICH_VMCR_EL2_VEOIM_MASK) && !(vid >= VGIC_MIN_LPI))
853853
return;
854854

855855
lr_prio = (lr_val & ICH_LR_PRIORITY_MASK) >> ICH_LR_PRIORITY_SHIFT;
@@ -865,22 +865,19 @@ static void __vgic_v3_write_eoir(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
865865

866866
static void __vgic_v3_read_igrpen0(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
867867
{
868-
vcpu_set_reg(vcpu, rt, !!(vmcr & ICH_VMCR_ENG0_MASK));
868+
vcpu_set_reg(vcpu, rt, FIELD_GET(ICH_VMCR_EL2_VENG0, vmcr));
869869
}
870870

871871
static void __vgic_v3_read_igrpen1(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
872872
{
873-
vcpu_set_reg(vcpu, rt, !!(vmcr & ICH_VMCR_ENG1_MASK));
873+
vcpu_set_reg(vcpu, rt, FIELD_GET(ICH_VMCR_EL2_VENG1, vmcr));
874874
}
875875

876876
static void __vgic_v3_write_igrpen0(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
877877
{
878878
u64 val = vcpu_get_reg(vcpu, rt);
879879

880-
if (val & 1)
881-
vmcr |= ICH_VMCR_ENG0_MASK;
882-
else
883-
vmcr &= ~ICH_VMCR_ENG0_MASK;
880+
FIELD_MODIFY(ICH_VMCR_EL2_VENG0, &vmcr, val & 1);
884881

885882
__vgic_v3_write_vmcr(vmcr);
886883
}
@@ -889,10 +886,7 @@ static void __vgic_v3_write_igrpen1(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
889886
{
890887
u64 val = vcpu_get_reg(vcpu, rt);
891888

892-
if (val & 1)
893-
vmcr |= ICH_VMCR_ENG1_MASK;
894-
else
895-
vmcr &= ~ICH_VMCR_ENG1_MASK;
889+
FIELD_MODIFY(ICH_VMCR_EL2_VENG1, &vmcr, val & 1);
896890

897891
__vgic_v3_write_vmcr(vmcr);
898892
}
@@ -916,10 +910,7 @@ static void __vgic_v3_write_bpr0(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
916910
if (val < bpr_min)
917911
val = bpr_min;
918912

919-
val <<= ICH_VMCR_BPR0_SHIFT;
920-
val &= ICH_VMCR_BPR0_MASK;
921-
vmcr &= ~ICH_VMCR_BPR0_MASK;
922-
vmcr |= val;
913+
FIELD_MODIFY(ICH_VMCR_EL2_VBPR0, &vmcr, val);
923914

924915
__vgic_v3_write_vmcr(vmcr);
925916
}
@@ -929,17 +920,14 @@ static void __vgic_v3_write_bpr1(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
929920
u64 val = vcpu_get_reg(vcpu, rt);
930921
u8 bpr_min = __vgic_v3_bpr_min();
931922

932-
if (vmcr & ICH_VMCR_CBPR_MASK)
923+
if (FIELD_GET(ICH_VMCR_EL2_VCBPR, val))
933924
return;
934925

935926
/* Enforce BPR limiting */
936927
if (val < bpr_min)
937928
val = bpr_min;
938929

939-
val <<= ICH_VMCR_BPR1_SHIFT;
940-
val &= ICH_VMCR_BPR1_MASK;
941-
vmcr &= ~ICH_VMCR_BPR1_MASK;
942-
vmcr |= val;
930+
FIELD_MODIFY(ICH_VMCR_EL2_VBPR1, &vmcr, val);
943931

944932
__vgic_v3_write_vmcr(vmcr);
945933
}
@@ -1029,19 +1017,14 @@ static void __vgic_v3_read_hppir(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
10291017

10301018
static void __vgic_v3_read_pmr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
10311019
{
1032-
vmcr &= ICH_VMCR_PMR_MASK;
1033-
vmcr >>= ICH_VMCR_PMR_SHIFT;
1034-
vcpu_set_reg(vcpu, rt, vmcr);
1020+
vcpu_set_reg(vcpu, rt, FIELD_GET(ICH_VMCR_EL2_VPMR, vmcr));
10351021
}
10361022

10371023
static void __vgic_v3_write_pmr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
10381024
{
10391025
u32 val = vcpu_get_reg(vcpu, rt);
10401026

1041-
val <<= ICH_VMCR_PMR_SHIFT;
1042-
val &= ICH_VMCR_PMR_MASK;
1043-
vmcr &= ~ICH_VMCR_PMR_MASK;
1044-
vmcr |= val;
1027+
FIELD_MODIFY(ICH_VMCR_EL2_VPMR, &vmcr, val);
10451028

10461029
write_gicreg(vmcr, ICH_VMCR_EL2);
10471030
}
@@ -1064,9 +1047,11 @@ static void __vgic_v3_read_ctlr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
10641047
/* A3V */
10651048
val |= ((vtr >> 21) & 1) << ICC_CTLR_EL1_A3V_SHIFT;
10661049
/* EOImode */
1067-
val |= ((vmcr & ICH_VMCR_EOIM_MASK) >> ICH_VMCR_EOIM_SHIFT) << ICC_CTLR_EL1_EOImode_SHIFT;
1050+
val |= FIELD_PREP(ICC_CTLR_EL1_EOImode_MASK,
1051+
FIELD_GET(ICH_VMCR_EL2_VEOIM, vmcr));
10681052
/* CBPR */
1069-
val |= (vmcr & ICH_VMCR_CBPR_MASK) >> ICH_VMCR_CBPR_SHIFT;
1053+
val |= FIELD_PREP(ICC_CTLR_EL1_CBPR_MASK,
1054+
FIELD_GET(ICH_VMCR_EL2_VCBPR, vmcr));
10701055

10711056
vcpu_set_reg(vcpu, rt, val);
10721057
}
@@ -1075,15 +1060,11 @@ static void __vgic_v3_write_ctlr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
10751060
{
10761061
u32 val = vcpu_get_reg(vcpu, rt);
10771062

1078-
if (val & ICC_CTLR_EL1_CBPR_MASK)
1079-
vmcr |= ICH_VMCR_CBPR_MASK;
1080-
else
1081-
vmcr &= ~ICH_VMCR_CBPR_MASK;
1063+
FIELD_MODIFY(ICH_VMCR_EL2_VCBPR, &vmcr,
1064+
FIELD_GET(ICC_CTLR_EL1_CBPR_MASK, val));
10821065

1083-
if (val & ICC_CTLR_EL1_EOImode_MASK)
1084-
vmcr |= ICH_VMCR_EOIM_MASK;
1085-
else
1086-
vmcr &= ~ICH_VMCR_EOIM_MASK;
1066+
FIELD_MODIFY(ICH_VMCR_EL2_VEOIM, &vmcr,
1067+
FIELD_GET(ICC_CTLR_EL1_EOImode_MASK, val));
10871068

10881069
write_gicreg(vmcr, ICH_VMCR_EL2);
10891070
}

arch/arm64/kvm/vgic/vgic-init.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
140140
goto out_unlock;
141141
}
142142

143+
kvm->arch.vgic.in_kernel = true;
144+
kvm->arch.vgic.vgic_model = type;
145+
kvm->arch.vgic.implementation_rev = KVM_VGIC_IMP_REV_LATEST;
146+
143147
kvm_for_each_vcpu(i, vcpu, kvm) {
144148
ret = vgic_allocate_private_irqs_locked(vcpu, type);
145149
if (ret)
@@ -156,10 +160,6 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
156160
goto out_unlock;
157161
}
158162

159-
kvm->arch.vgic.in_kernel = true;
160-
kvm->arch.vgic.vgic_model = type;
161-
kvm->arch.vgic.implementation_rev = KVM_VGIC_IMP_REV_LATEST;
162-
163163
kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
164164

165165
aa64pfr0 = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1) & ~ID_AA64PFR0_EL1_GIC;

arch/arm64/kvm/vgic/vgic-v3-nested.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,16 +202,16 @@ u64 vgic_v3_get_misr(struct kvm_vcpu *vcpu)
202202
if ((hcr & ICH_HCR_EL2_NPIE) && !mi_state.pend)
203203
reg |= ICH_MISR_EL2_NP;
204204

205-
if ((hcr & ICH_HCR_EL2_VGrp0EIE) && (vmcr & ICH_VMCR_ENG0_MASK))
205+
if ((hcr & ICH_HCR_EL2_VGrp0EIE) && (vmcr & ICH_VMCR_EL2_VENG0_MASK))
206206
reg |= ICH_MISR_EL2_VGrp0E;
207207

208-
if ((hcr & ICH_HCR_EL2_VGrp0DIE) && !(vmcr & ICH_VMCR_ENG0_MASK))
208+
if ((hcr & ICH_HCR_EL2_VGrp0DIE) && !(vmcr & ICH_VMCR_EL2_VENG0_MASK))
209209
reg |= ICH_MISR_EL2_VGrp0D;
210210

211-
if ((hcr & ICH_HCR_EL2_VGrp1EIE) && (vmcr & ICH_VMCR_ENG1_MASK))
211+
if ((hcr & ICH_HCR_EL2_VGrp1EIE) && (vmcr & ICH_VMCR_EL2_VENG1_MASK))
212212
reg |= ICH_MISR_EL2_VGrp1E;
213213

214-
if ((hcr & ICH_HCR_EL2_VGrp1DIE) && !(vmcr & ICH_VMCR_ENG1_MASK))
214+
if ((hcr & ICH_HCR_EL2_VGrp1DIE) && !(vmcr & ICH_VMCR_EL2_VENG1_MASK))
215215
reg |= ICH_MISR_EL2_VGrp1D;
216216

217217
return reg;

arch/arm64/kvm/vgic/vgic-v3.c

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ void vgic_v3_configure_hcr(struct kvm_vcpu *vcpu,
4141
if (!als->nr_sgi)
4242
cpuif->vgic_hcr |= ICH_HCR_EL2_vSGIEOICount;
4343

44-
cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_ENG0_MASK) ?
44+
cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_EL2_VENG0_MASK) ?
4545
ICH_HCR_EL2_VGrp0DIE : ICH_HCR_EL2_VGrp0EIE;
46-
cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_ENG1_MASK) ?
46+
cpuif->vgic_hcr |= (cpuif->vgic_vmcr & ICH_VMCR_EL2_VENG1_MASK) ?
4747
ICH_HCR_EL2_VGrp1DIE : ICH_HCR_EL2_VGrp1EIE;
4848

4949
/*
@@ -215,7 +215,7 @@ void vgic_v3_deactivate(struct kvm_vcpu *vcpu, u64 val)
215215
* We only deal with DIR when EOIMode==1, and only for SGI,
216216
* PPI or SPI.
217217
*/
218-
if (!(cpuif->vgic_vmcr & ICH_VMCR_EOIM_MASK) ||
218+
if (!(cpuif->vgic_vmcr & ICH_VMCR_EL2_VEOIM_MASK) ||
219219
val >= vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS)
220220
return;
221221

@@ -408,25 +408,23 @@ void vgic_v3_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
408408
u32 vmcr;
409409

410410
if (model == KVM_DEV_TYPE_ARM_VGIC_V2) {
411-
vmcr = (vmcrp->ackctl << ICH_VMCR_ACK_CTL_SHIFT) &
412-
ICH_VMCR_ACK_CTL_MASK;
413-
vmcr |= (vmcrp->fiqen << ICH_VMCR_FIQ_EN_SHIFT) &
414-
ICH_VMCR_FIQ_EN_MASK;
411+
vmcr = FIELD_PREP(ICH_VMCR_EL2_VAckCtl, vmcrp->ackctl);
412+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VFIQEn, vmcrp->fiqen);
415413
} else {
416414
/*
417415
* When emulating GICv3 on GICv3 with SRE=1 on the
418416
* VFIQEn bit is RES1 and the VAckCtl bit is RES0.
419417
*/
420-
vmcr = ICH_VMCR_FIQ_EN_MASK;
418+
vmcr = ICH_VMCR_EL2_VFIQEn_MASK;
421419
}
422420

423-
vmcr |= (vmcrp->cbpr << ICH_VMCR_CBPR_SHIFT) & ICH_VMCR_CBPR_MASK;
424-
vmcr |= (vmcrp->eoim << ICH_VMCR_EOIM_SHIFT) & ICH_VMCR_EOIM_MASK;
425-
vmcr |= (vmcrp->abpr << ICH_VMCR_BPR1_SHIFT) & ICH_VMCR_BPR1_MASK;
426-
vmcr |= (vmcrp->bpr << ICH_VMCR_BPR0_SHIFT) & ICH_VMCR_BPR0_MASK;
427-
vmcr |= (vmcrp->pmr << ICH_VMCR_PMR_SHIFT) & ICH_VMCR_PMR_MASK;
428-
vmcr |= (vmcrp->grpen0 << ICH_VMCR_ENG0_SHIFT) & ICH_VMCR_ENG0_MASK;
429-
vmcr |= (vmcrp->grpen1 << ICH_VMCR_ENG1_SHIFT) & ICH_VMCR_ENG1_MASK;
421+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VCBPR, vmcrp->cbpr);
422+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VEOIM, vmcrp->eoim);
423+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VBPR1, vmcrp->abpr);
424+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VBPR0, vmcrp->bpr);
425+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VPMR, vmcrp->pmr);
426+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VENG0, vmcrp->grpen0);
427+
vmcr |= FIELD_PREP(ICH_VMCR_EL2_VENG1, vmcrp->grpen1);
430428

431429
cpu_if->vgic_vmcr = vmcr;
432430
}
@@ -440,10 +438,8 @@ void vgic_v3_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
440438
vmcr = cpu_if->vgic_vmcr;
441439

442440
if (model == KVM_DEV_TYPE_ARM_VGIC_V2) {
443-
vmcrp->ackctl = (vmcr & ICH_VMCR_ACK_CTL_MASK) >>
444-
ICH_VMCR_ACK_CTL_SHIFT;
445-
vmcrp->fiqen = (vmcr & ICH_VMCR_FIQ_EN_MASK) >>
446-
ICH_VMCR_FIQ_EN_SHIFT;
441+
vmcrp->ackctl = FIELD_GET(ICH_VMCR_EL2_VAckCtl, vmcr);
442+
vmcrp->fiqen = FIELD_GET(ICH_VMCR_EL2_VFIQEn, vmcr);
447443
} else {
448444
/*
449445
* When emulating GICv3 on GICv3 with SRE=1 on the
@@ -453,13 +449,13 @@ void vgic_v3_get_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
453449
vmcrp->ackctl = 0;
454450
}
455451

456-
vmcrp->cbpr = (vmcr & ICH_VMCR_CBPR_MASK) >> ICH_VMCR_CBPR_SHIFT;
457-
vmcrp->eoim = (vmcr & ICH_VMCR_EOIM_MASK) >> ICH_VMCR_EOIM_SHIFT;
458-
vmcrp->abpr = (vmcr & ICH_VMCR_BPR1_MASK) >> ICH_VMCR_BPR1_SHIFT;
459-
vmcrp->bpr = (vmcr & ICH_VMCR_BPR0_MASK) >> ICH_VMCR_BPR0_SHIFT;
460-
vmcrp->pmr = (vmcr & ICH_VMCR_PMR_MASK) >> ICH_VMCR_PMR_SHIFT;
461-
vmcrp->grpen0 = (vmcr & ICH_VMCR_ENG0_MASK) >> ICH_VMCR_ENG0_SHIFT;
462-
vmcrp->grpen1 = (vmcr & ICH_VMCR_ENG1_MASK) >> ICH_VMCR_ENG1_SHIFT;
452+
vmcrp->cbpr = FIELD_GET(ICH_VMCR_EL2_VCBPR, vmcr);
453+
vmcrp->eoim = FIELD_GET(ICH_VMCR_EL2_VEOIM, vmcr);
454+
vmcrp->abpr = FIELD_GET(ICH_VMCR_EL2_VBPR1, vmcr);
455+
vmcrp->bpr = FIELD_GET(ICH_VMCR_EL2_VBPR0, vmcr);
456+
vmcrp->pmr = FIELD_GET(ICH_VMCR_EL2_VPMR, vmcr);
457+
vmcrp->grpen0 = FIELD_GET(ICH_VMCR_EL2_VENG0, vmcr);
458+
vmcrp->grpen1 = FIELD_GET(ICH_VMCR_EL2_VENG1, vmcr);
463459
}
464460

465461
#define INITIAL_PENDBASER_VALUE \

arch/arm64/tools/sysreg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4637,7 +4637,7 @@ Field 7 ICC_IAFFIDR_EL1
46374637
Field 6 ICC_ICSR_EL1
46384638
Field 5 ICC_PCR_EL1
46394639
Field 4 ICC_HPPIR_EL1
4640-
Field 3 ICC_HAPR_EL1
4640+
Res1 3
46414641
Field 2 ICC_CR0_EL1
46424642
Field 1 ICC_IDRn_EL1
46434643
Field 0 ICC_APR_EL1

drivers/irqchip/irq-gic-v5-irs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,8 @@ static int __init gicv5_irs_init(struct device_node *node)
743743
* be consistent across IRSes by the architecture.
744744
*/
745745
if (list_empty(&irs_nodes)) {
746+
idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR0);
747+
gicv5_global_data.virt_capable = !FIELD_GET(GICV5_IRS_IDR0_VIRT, idr);
746748

747749
idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR1);
748750
irs_setup_pri_bits(idr);

0 commit comments

Comments
 (0)