[PATCH v2 01/17] arm64: sysreg: Add layout for ICH_HCR_EL2
Andre Przywara
andre.przywara at arm.com
Wed Jan 15 10:39:57 PST 2025
On Sun, 12 Jan 2025 17:08:29 +0000
Marc Zyngier <maz at kernel.org> wrote:
> The ICH_HCR_EL2-related macros are missing a number of control
> bits that we are about to handle. Take this opportunity to fully
> describe the layout of that register as part of the automatic
> generation infrastructure.
>
> This results in a bit of churn, unfortunately.
>
> Signed-off-by: Marc Zyngier <maz at kernel.org>
Compared the new bits against the ARM ARM, and also checked that the rest
indeed just got repainted.
Reviewed-by: Andre Przywara <andre.przywara at arm.com>
> ---
> arch/arm64/include/asm/sysreg.h | 12 ------------
> arch/arm64/kvm/emulate-nested.c | 16 ++++++++--------
> arch/arm64/kvm/hyp/vgic-v3-sr.c | 14 +++++++-------
> arch/arm64/kvm/vgic/vgic-v3.c | 17 +++++++++--------
> arch/arm64/tools/sysreg | 22 ++++++++++++++++++++++
> drivers/irqchip/irq-apple-aic.c | 8 ++++----
> tools/arch/arm64/include/asm/sysreg.h | 12 ------------
> 7 files changed, 50 insertions(+), 51 deletions(-)
>
> diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
> index b8303a83c0bff..3e84ef8f5b311 100644
> --- a/arch/arm64/include/asm/sysreg.h
> +++ b/arch/arm64/include/asm/sysreg.h
> @@ -561,7 +561,6 @@
>
> #define SYS_ICH_VSEIR_EL2 sys_reg(3, 4, 12, 9, 4)
> #define SYS_ICC_SRE_EL2 sys_reg(3, 4, 12, 9, 5)
> -#define SYS_ICH_HCR_EL2 sys_reg(3, 4, 12, 11, 0)
> #define SYS_ICH_VTR_EL2 sys_reg(3, 4, 12, 11, 1)
> #define SYS_ICH_MISR_EL2 sys_reg(3, 4, 12, 11, 2)
> #define SYS_ICH_EISR_EL2 sys_reg(3, 4, 12, 11, 3)
> @@ -1011,17 +1010,6 @@
> #define ICH_LR_PRIORITY_SHIFT 48
> #define ICH_LR_PRIORITY_MASK (0xffULL << ICH_LR_PRIORITY_SHIFT)
>
> -/* ICH_HCR_EL2 bit definitions */
> -#define ICH_HCR_EN (1 << 0)
> -#define ICH_HCR_UIE (1 << 1)
> -#define ICH_HCR_NPIE (1 << 3)
> -#define ICH_HCR_TC (1 << 10)
> -#define ICH_HCR_TALL0 (1 << 11)
> -#define ICH_HCR_TALL1 (1 << 12)
> -#define ICH_HCR_TDIR (1 << 14)
> -#define ICH_HCR_EOIcount_SHIFT 27
> -#define ICH_HCR_EOIcount_MASK (0x1f << ICH_HCR_EOIcount_SHIFT)
> -
> /* ICH_VMCR_EL2 bit definitions */
> #define ICH_VMCR_ACK_CTL_SHIFT 2
> #define ICH_VMCR_ACK_CTL_MASK (1 << ICH_VMCR_ACK_CTL_SHIFT)
> diff --git a/arch/arm64/kvm/emulate-nested.c b/arch/arm64/kvm/emulate-nested.c
> index 1ffbfd1c3cf2e..c460b8403aec5 100644
> --- a/arch/arm64/kvm/emulate-nested.c
> +++ b/arch/arm64/kvm/emulate-nested.c
> @@ -395,26 +395,26 @@ static const struct trap_bits coarse_trap_bits[] = {
> },
> [CGT_ICH_HCR_TC] = {
> .index = ICH_HCR_EL2,
> - .value = ICH_HCR_TC,
> - .mask = ICH_HCR_TC,
> + .value = ICH_HCR_EL2_TC,
> + .mask = ICH_HCR_EL2_TC,
> .behaviour = BEHAVE_FORWARD_RW,
> },
> [CGT_ICH_HCR_TALL0] = {
> .index = ICH_HCR_EL2,
> - .value = ICH_HCR_TALL0,
> - .mask = ICH_HCR_TALL0,
> + .value = ICH_HCR_EL2_TALL0,
> + .mask = ICH_HCR_EL2_TALL0,
> .behaviour = BEHAVE_FORWARD_RW,
> },
> [CGT_ICH_HCR_TALL1] = {
> .index = ICH_HCR_EL2,
> - .value = ICH_HCR_TALL1,
> - .mask = ICH_HCR_TALL1,
> + .value = ICH_HCR_EL2_TALL1,
> + .mask = ICH_HCR_EL2_TALL1,
> .behaviour = BEHAVE_FORWARD_RW,
> },
> [CGT_ICH_HCR_TDIR] = {
> .index = ICH_HCR_EL2,
> - .value = ICH_HCR_TDIR,
> - .mask = ICH_HCR_TDIR,
> + .value = ICH_HCR_EL2_TDIR,
> + .mask = ICH_HCR_EL2_TDIR,
> .behaviour = BEHAVE_FORWARD_RW,
> },
> };
> diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c
> index 3f9741e51d41b..b47dede973b3c 100644
> --- a/arch/arm64/kvm/hyp/vgic-v3-sr.c
> +++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c
> @@ -218,7 +218,7 @@ void __vgic_v3_save_state(struct vgic_v3_cpu_if *cpu_if)
>
> elrsr = read_gicreg(ICH_ELRSR_EL2);
>
> - write_gicreg(cpu_if->vgic_hcr & ~ICH_HCR_EN, ICH_HCR_EL2);
> + write_gicreg(cpu_if->vgic_hcr & ~ICH_HCR_EL2_En, ICH_HCR_EL2);
>
> for (i = 0; i < used_lrs; i++) {
> if (elrsr & (1 << i))
> @@ -274,7 +274,7 @@ void __vgic_v3_activate_traps(struct vgic_v3_cpu_if *cpu_if)
> * system registers to trap to EL1 (duh), force ICC_SRE_EL1.SRE to 1
> * so that the trap bits can take effect. Yes, we *loves* the GIC.
> */
> - if (!(cpu_if->vgic_hcr & ICH_HCR_EN)) {
> + if (!(cpu_if->vgic_hcr & ICH_HCR_EL2_En)) {
> write_gicreg(ICC_SRE_EL1_SRE, ICC_SRE_EL1);
> isb();
> } else if (!cpu_if->vgic_sre) {
> @@ -752,7 +752,7 @@ static void __vgic_v3_bump_eoicount(void)
> u32 hcr;
>
> hcr = read_gicreg(ICH_HCR_EL2);
> - hcr += 1 << ICH_HCR_EOIcount_SHIFT;
> + hcr += 1 << ICH_HCR_EL2_EOIcount_SHIFT;
> write_gicreg(hcr, ICH_HCR_EL2);
> }
>
> @@ -1069,7 +1069,7 @@ static bool __vgic_v3_check_trap_forwarding(struct kvm_vcpu *vcpu,
> case SYS_ICC_EOIR0_EL1:
> case SYS_ICC_HPPIR0_EL1:
> case SYS_ICC_IAR0_EL1:
> - return ich_hcr & ICH_HCR_TALL0;
> + return ich_hcr & ICH_HCR_EL2_TALL0;
>
> case SYS_ICC_IGRPEN1_EL1:
> if (is_read &&
> @@ -1090,10 +1090,10 @@ static bool __vgic_v3_check_trap_forwarding(struct kvm_vcpu *vcpu,
> case SYS_ICC_EOIR1_EL1:
> case SYS_ICC_HPPIR1_EL1:
> case SYS_ICC_IAR1_EL1:
> - return ich_hcr & ICH_HCR_TALL1;
> + return ich_hcr & ICH_HCR_EL2_TALL1;
>
> case SYS_ICC_DIR_EL1:
> - if (ich_hcr & ICH_HCR_TDIR)
> + if (ich_hcr & ICH_HCR_EL2_TDIR)
> return true;
>
> fallthrough;
> @@ -1101,7 +1101,7 @@ static bool __vgic_v3_check_trap_forwarding(struct kvm_vcpu *vcpu,
> case SYS_ICC_RPR_EL1:
> case SYS_ICC_CTLR_EL1:
> case SYS_ICC_PMR_EL1:
> - return ich_hcr & ICH_HCR_TC;
> + return ich_hcr & ICH_HCR_EL2_TC;
>
> default:
> return false;
> diff --git a/arch/arm64/kvm/vgic/vgic-v3.c b/arch/arm64/kvm/vgic/vgic-v3.c
> index f267bc2486a18..6c21be12959d6 100644
> --- a/arch/arm64/kvm/vgic/vgic-v3.c
> +++ b/arch/arm64/kvm/vgic/vgic-v3.c
> @@ -23,7 +23,7 @@ void vgic_v3_set_underflow(struct kvm_vcpu *vcpu)
> {
> struct vgic_v3_cpu_if *cpuif = &vcpu->arch.vgic_cpu.vgic_v3;
>
> - cpuif->vgic_hcr |= ICH_HCR_UIE;
> + cpuif->vgic_hcr |= ICH_HCR_EL2_UIE;
> }
>
> static bool lr_signals_eoi_mi(u64 lr_val)
> @@ -41,7 +41,7 @@ void vgic_v3_fold_lr_state(struct kvm_vcpu *vcpu)
>
> DEBUG_SPINLOCK_BUG_ON(!irqs_disabled());
>
> - cpuif->vgic_hcr &= ~ICH_HCR_UIE;
> + cpuif->vgic_hcr &= ~ICH_HCR_EL2_UIE;
>
> for (lr = 0; lr < cpuif->used_lrs; lr++) {
> u64 val = cpuif->vgic_lr[lr];
> @@ -291,7 +291,7 @@ void vgic_v3_enable(struct kvm_vcpu *vcpu)
> ICH_VTR_PRI_BITS_SHIFT) + 1;
>
> /* Get the show on the road... */
> - vgic_v3->vgic_hcr = ICH_HCR_EN;
> + vgic_v3->vgic_hcr = ICH_HCR_EL2_En;
> }
>
> void vcpu_set_ich_hcr(struct kvm_vcpu *vcpu)
> @@ -300,18 +300,19 @@ void vcpu_set_ich_hcr(struct kvm_vcpu *vcpu)
>
> /* Hide GICv3 sysreg if necessary */
> if (!kvm_has_gicv3(vcpu->kvm)) {
> - vgic_v3->vgic_hcr |= ICH_HCR_TALL0 | ICH_HCR_TALL1 | ICH_HCR_TC;
> + vgic_v3->vgic_hcr |= (ICH_HCR_EL2_TALL0 | ICH_HCR_EL2_TALL1 |
> + ICH_HCR_EL2_TC);
> return;
> }
>
> if (group0_trap)
> - vgic_v3->vgic_hcr |= ICH_HCR_TALL0;
> + vgic_v3->vgic_hcr |= ICH_HCR_EL2_TALL0;
> if (group1_trap)
> - vgic_v3->vgic_hcr |= ICH_HCR_TALL1;
> + vgic_v3->vgic_hcr |= ICH_HCR_EL2_TALL1;
> if (common_trap)
> - vgic_v3->vgic_hcr |= ICH_HCR_TC;
> + vgic_v3->vgic_hcr |= ICH_HCR_EL2_TC;
> if (dir_trap)
> - vgic_v3->vgic_hcr |= ICH_HCR_TDIR;
> + vgic_v3->vgic_hcr |= ICH_HCR_EL2_TDIR;
> }
>
> int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq)
> diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg
> index b081b54d6d227..9938926421b5c 100644
> --- a/arch/arm64/tools/sysreg
> +++ b/arch/arm64/tools/sysreg
> @@ -2938,6 +2938,28 @@ Field 31:16 PhyPARTID29
> Field 15:0 PhyPARTID28
> EndSysreg
>
> +Sysreg ICH_HCR_EL2 3 4 12 11 0
> +Res0 63:32
> +Field 31:27 EOIcount
> +Res0 26:16
> +Field 15 DVIM
> +Field 14 TDIR
> +Field 13 TSEI
> +Field 12 TALL1
> +Field 11 TALL0
> +Field 10 TC
> +Res0 9
> +Field 8 vSGIEOICount
> +Field 7 VGrp1DIE
> +Field 6 VGrp1EIE
> +Field 5 VGrp0DIE
> +Field 4 VGrp0EIE
> +Field 3 NPIE
> +Field 2 LRENPIE
> +Field 1 UIE
> +Field 0 En
> +EndSysreg
> +
> Sysreg CONTEXTIDR_EL2 3 4 13 0 1
> Fields CONTEXTIDR_ELx
> EndSysreg
> diff --git a/drivers/irqchip/irq-apple-aic.c b/drivers/irqchip/irq-apple-aic.c
> index da5250f0155cf..7a5cc26529f82 100644
> --- a/drivers/irqchip/irq-apple-aic.c
> +++ b/drivers/irqchip/irq-apple-aic.c
> @@ -409,15 +409,15 @@ static void __exception_irq_entry aic_handle_irq(struct pt_regs *regs)
> * in use, and be cleared when coming back from the handler.
> */
> if (is_kernel_in_hyp_mode() &&
> - (read_sysreg_s(SYS_ICH_HCR_EL2) & ICH_HCR_EN) &&
> + (read_sysreg_s(SYS_ICH_HCR_EL2) & ICH_HCR_EL2_En) &&
> read_sysreg_s(SYS_ICH_MISR_EL2) != 0) {
> generic_handle_domain_irq(aic_irqc->hw_domain,
> AIC_FIQ_HWIRQ(AIC_VGIC_MI));
>
> - if (unlikely((read_sysreg_s(SYS_ICH_HCR_EL2) & ICH_HCR_EN) &&
> + if (unlikely((read_sysreg_s(SYS_ICH_HCR_EL2) & ICH_HCR_EL2_En) &&
> read_sysreg_s(SYS_ICH_MISR_EL2))) {
> pr_err_ratelimited("vGIC IRQ fired and not handled by KVM, disabling.\n");
> - sysreg_clear_set_s(SYS_ICH_HCR_EL2, ICH_HCR_EN, 0);
> + sysreg_clear_set_s(SYS_ICH_HCR_EL2, ICH_HCR_EL2_En, 0);
> }
> }
> }
> @@ -840,7 +840,7 @@ static int aic_init_cpu(unsigned int cpu)
> VM_TMR_FIQ_ENABLE_V | VM_TMR_FIQ_ENABLE_P, 0);
>
> /* vGIC maintenance IRQ */
> - sysreg_clear_set_s(SYS_ICH_HCR_EL2, ICH_HCR_EN, 0);
> + sysreg_clear_set_s(SYS_ICH_HCR_EL2, ICH_HCR_EL2_En, 0);
> }
>
> /* PMC FIQ */
> diff --git a/tools/arch/arm64/include/asm/sysreg.h b/tools/arch/arm64/include/asm/sysreg.h
> index cd8420e8c3ad8..d314ccab7560a 100644
> --- a/tools/arch/arm64/include/asm/sysreg.h
> +++ b/tools/arch/arm64/include/asm/sysreg.h
> @@ -420,7 +420,6 @@
>
> #define SYS_ICH_VSEIR_EL2 sys_reg(3, 4, 12, 9, 4)
> #define SYS_ICC_SRE_EL2 sys_reg(3, 4, 12, 9, 5)
> -#define SYS_ICH_HCR_EL2 sys_reg(3, 4, 12, 11, 0)
> #define SYS_ICH_VTR_EL2 sys_reg(3, 4, 12, 11, 1)
> #define SYS_ICH_MISR_EL2 sys_reg(3, 4, 12, 11, 2)
> #define SYS_ICH_EISR_EL2 sys_reg(3, 4, 12, 11, 3)
> @@ -654,17 +653,6 @@
> #define ICH_LR_PRIORITY_SHIFT 48
> #define ICH_LR_PRIORITY_MASK (0xffULL << ICH_LR_PRIORITY_SHIFT)
>
> -/* ICH_HCR_EL2 bit definitions */
> -#define ICH_HCR_EN (1 << 0)
> -#define ICH_HCR_UIE (1 << 1)
> -#define ICH_HCR_NPIE (1 << 3)
> -#define ICH_HCR_TC (1 << 10)
> -#define ICH_HCR_TALL0 (1 << 11)
> -#define ICH_HCR_TALL1 (1 << 12)
> -#define ICH_HCR_TDIR (1 << 14)
> -#define ICH_HCR_EOIcount_SHIFT 27
> -#define ICH_HCR_EOIcount_MASK (0x1f << ICH_HCR_EOIcount_SHIFT)
> -
> /* ICH_VMCR_EL2 bit definitions */
> #define ICH_VMCR_ACK_CTL_SHIFT 2
> #define ICH_VMCR_ACK_CTL_MASK (1 << ICH_VMCR_ACK_CTL_SHIFT)
More information about the linux-arm-kernel
mailing list