The GICH_* constants are defined by the HW spec, and best fit in gic.h. Also rename the bitfields to start with GICH_ as well. Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> --- arch/arm/include/asm/hardware/gic.h | 24 ++++++++++++++++++++++++ arch/arm/include/asm/kvm_arm.h | 12 ------------ arch/arm/include/asm/kvm_vgic.h | 16 ++-------------- arch/arm/kvm/interrupts_head.S | 2 ++ arch/arm/kvm/vgic.c | 32 ++++++++++++++++---------------- 5 files changed, 44 insertions(+), 42 deletions(-) diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h index 4b1ce6c..b699a9c 100644 --- a/arch/arm/include/asm/hardware/gic.h +++ b/arch/arm/include/asm/hardware/gic.h @@ -32,6 +32,30 @@ #define GIC_DIST_CONFIG 0xc00 #define GIC_DIST_SOFTINT 0xf00 +#define GICH_HCR 0x0 +#define GICH_VTR 0x4 +#define GICH_VMCR 0x8 +#define GICH_MISR 0x10 +#define GICH_EISR0 0x20 +#define GICH_EISR1 0x24 +#define GICH_ELRSR0 0x30 +#define GICH_ELRSR1 0x34 +#define GICH_APR 0xf0 +#define GICH_LR0 0x100 + +#define GICH_HCR_EN (1 << 0) +#define GICH_HCR_UIE (1 << 1) + +#define GICH_LR_VIRTUALID (0x3ff << 0) +#define GICH_LR_PHYSID_CPUID (7 << 10) +#define GICH_LR_STATE (3 << 28) +#define GICH_LR_PENDING_BIT (1 << 28) +#define GICH_LR_ACTIVE_BIT (1 << 29) +#define GICH_LR_EOI (1 << 19) + +#define GICH_MISR_EOI (1 << 0) +#define GICH_MISR_U (1 << 1) + #ifndef __ASSEMBLY__ #include <linux/irqdomain.h> struct device_node; diff --git a/arch/arm/include/asm/kvm_arm.h b/arch/arm/include/asm/kvm_arm.h index b4bdd0c..151c4ce 100644 --- a/arch/arm/include/asm/kvm_arm.h +++ b/arch/arm/include/asm/kvm_arm.h @@ -209,16 +209,4 @@ #define HSR_EC_DABT (0x24) #define HSR_EC_DABT_HYP (0x25) -/* GICH offsets */ -#define GICH_HCR 0x0 -#define GICH_VTR 0x4 -#define GICH_VMCR 0x8 -#define GICH_MISR 0x10 -#define GICH_EISR0 0x20 -#define GICH_EISR1 0x24 -#define GICH_ELRSR0 0x30 -#define GICH_ELRSR1 0x34 -#define GICH_APR 0xf0 -#define GICH_LR0 0x100 - #endif /* __ARM_KVM_ARM_H__ */ diff --git a/arch/arm/include/asm/kvm_vgic.h b/arch/arm/include/asm/kvm_vgic.h index 2e2813a..3ecc29c 100644 --- a/arch/arm/include/asm/kvm_vgic.h +++ b/arch/arm/include/asm/kvm_vgic.h @@ -25,6 +25,7 @@ #include <linux/irqreturn.h> #include <linux/spinlock.h> #include <linux/types.h> +#include <asm/hardware/gic.h> #define VGIC_NR_IRQS 128 #define VGIC_NR_SGIS 16 @@ -49,7 +50,7 @@ /* * The GIC distributor registers describing interrupts have two parts: * - 32 per-CPU interrupts (SGI + PPI) - * - a bunch of shared interrups (SPI) + * - a bunch of shared interrupts (SPI) */ struct vgic_bitmap { union { @@ -135,19 +136,6 @@ struct vgic_cpu { #endif }; -#define VGIC_HCR_EN (1 << 0) -#define VGIC_HCR_UIE (1 << 1) - -#define VGIC_LR_VIRTUALID (0x3ff << 0) -#define VGIC_LR_PHYSID_CPUID (7 << 10) -#define VGIC_LR_STATE (3 << 28) -#define VGIC_LR_PENDING_BIT (1 << 28) -#define VGIC_LR_ACTIVE_BIT (1 << 29) -#define VGIC_LR_EOI (1 << 19) - -#define VGIC_MISR_EOI (1 << 0) -#define VGIC_MISR_U (1 << 1) - #define LR_EMPTY 0xff struct kvm; diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S index 5308eb2..2f79247 100644 --- a/arch/arm/kvm/interrupts_head.S +++ b/arch/arm/kvm/interrupts_head.S @@ -1,3 +1,5 @@ +#include <asm/hardware/gic.h> + #define VCPU_USR_REG(_reg_nr) (VCPU_USR_REGS + (_reg_nr * 4)) #define VCPU_USR_SP (VCPU_USR_REG(13)) #define VCPU_USR_LR (VCPU_USR_REG(14)) diff --git a/arch/arm/kvm/vgic.c b/arch/arm/kvm/vgic.c index 9592067..780caf5 100644 --- a/arch/arm/kvm/vgic.c +++ b/arch/arm/kvm/vgic.c @@ -59,7 +59,7 @@ * - When a level interrupt is moved onto a vcpu, the corresponding * bit in irq_active is set. As long as this bit is set, the line * will be ignored for further interrupts. The interrupt is injected - * into the vcpu with the VGIC_LR_EOI bit set (generate a + * into the vcpu with the GICH_LR_EOI bit set (generate a * maintenance interrupt on EOI). * - When the interrupt is EOIed, the maintenance interrupt fires, * and clears the corresponding bit in irq_active. This allow the @@ -806,8 +806,8 @@ static void vgic_update_state(struct kvm *kvm) } } -#define LR_CPUID(lr) (((lr) & VGIC_LR_PHYSID_CPUID) >> 10) -#define MK_LR_PEND(src, irq) (VGIC_LR_PENDING_BIT | ((src) << 10) | (irq)) +#define LR_CPUID(lr) (((lr) & GICH_LR_PHYSID_CPUID) >> 10) +#define MK_LR_PEND(src, irq) (GICH_LR_PENDING_BIT | ((src) << 10) | (irq)) /* * An interrupt may have been disabled after being made pending on the @@ -824,12 +824,12 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu) int lr; for_each_set_bit(lr, vgic_cpu->lr_used, vgic_cpu->nr_lr) { - int irq = vgic_cpu->vgic_lr[lr] & VGIC_LR_VIRTUALID; + int irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID; if (!vgic_irq_is_enabled(vcpu, irq)) { vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY; clear_bit(lr, vgic_cpu->lr_used); - vgic_cpu->vgic_lr[lr] &= ~VGIC_LR_STATE; + vgic_cpu->vgic_lr[lr] &= ~GICH_LR_STATE; if (vgic_irq_is_active(vcpu, irq)) vgic_irq_clear_active(vcpu, irq); } @@ -859,7 +859,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) (LR_CPUID(vgic_cpu->vgic_lr[lr]) == sgi_source_id)) { kvm_debug("LR%d piggyback for IRQ%d %x\n", lr, irq, vgic_cpu->vgic_lr[lr]); BUG_ON(!test_bit(lr, vgic_cpu->lr_used)); - vgic_cpu->vgic_lr[lr] |= VGIC_LR_PENDING_BIT; + vgic_cpu->vgic_lr[lr] |= GICH_LR_PENDING_BIT; goto out; } @@ -877,7 +877,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) out: if (!vgic_irq_is_edge(vcpu, irq)) - vgic_cpu->vgic_lr[lr] |= VGIC_LR_EOI; + vgic_cpu->vgic_lr[lr] |= GICH_LR_EOI; return true; } @@ -977,9 +977,9 @@ static void __kvm_vgic_sync_to_cpu(struct kvm_vcpu *vcpu) epilog: if (overflow) { - vgic_cpu->vgic_hcr |= VGIC_HCR_UIE; + vgic_cpu->vgic_hcr |= GICH_HCR_UIE; } else { - vgic_cpu->vgic_hcr &= ~VGIC_HCR_UIE; + vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE; /* * We're about to run this VCPU, and we've consumed * everything the distributor had in store for @@ -1010,7 +1010,7 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) * this interrupt for this run. Big deal. It is still pending though, * and will get considered when this vcpu exits. */ - if (vgic_cpu->vgic_misr & VGIC_MISR_EOI) { + if (vgic_cpu->vgic_misr & GICH_MISR_EOI) { /* * Some level interrupts have been EOIed. Clear their * active bit. @@ -1019,10 +1019,10 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_eisr, vgic_cpu->nr_lr) { - irq = vgic_cpu->vgic_lr[lr] & VGIC_LR_VIRTUALID; + irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID; vgic_irq_clear_active(vcpu, irq); - vgic_cpu->vgic_lr[lr] &= ~VGIC_LR_EOI; + vgic_cpu->vgic_lr[lr] &= ~GICH_LR_EOI; /* Any additional pending interrupt? */ if (vgic_dist_irq_is_pending(vcpu, irq)) { @@ -1034,8 +1034,8 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu) } } - if (vgic_cpu->vgic_misr & VGIC_MISR_U) - vgic_cpu->vgic_hcr &= ~VGIC_HCR_UIE; + if (vgic_cpu->vgic_misr & GICH_MISR_U) + vgic_cpu->vgic_hcr &= ~GICH_HCR_UIE; return level_pending; } @@ -1063,7 +1063,7 @@ static void __kvm_vgic_sync_from_cpu(struct kvm_vcpu *vcpu) if (!test_and_clear_bit(lr, vgic_cpu->lr_used)) continue; - irq = vgic_cpu->vgic_lr[lr] & VGIC_LR_VIRTUALID; + irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID; BUG_ON(irq >= VGIC_NR_IRQS); vgic_cpu->vgic_irq_lr_map[irq] = LR_EMPTY; @@ -1251,7 +1251,7 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) vgic_cpu->vgic_vmcr = 0; vgic_cpu->nr_lr = vgic_nr_lr; - vgic_cpu->vgic_hcr = VGIC_HCR_EN; /* Get the show on the road... */ + vgic_cpu->vgic_hcr = GICH_HCR_EN; /* Get the show on the road... */ return 0; } -- 1.8.0.1 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm