Re: [PATCH 09/16] ARM: KVM: vgic: Move GICH constants to gic.h

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 13/12/12 21:52, Christoffer Dall wrote:
> 
> 
> On Thursday, December 6, 2012, Marc Zyngier wrote:
> 
>     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.
> 
> 
> looks fine to me. Do these defines for gic.h need to come in a separate
> patch for the upstreaming?

Probably. I'll cook a separate patch.

>  
> 
> 
>     Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx <javascript:;>>
>     ---
>      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 <javascript:;>
>     https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm
> 


-- 
Jazz is not dead. It just smells funny...


_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux