aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@linaro.org>2014-07-01 16:39:05 +0800
committerHaojian Zhuang <haojian.zhuang@linaro.org>2014-07-01 16:39:05 +0800
commit97a2f9343f950f255a495625c97bf4c7e62f5812 (patch)
tree1ed7d4782cd568840fedee5440f6c08037083f8a
parentd760dc5f6fe1f24f1dc7e2837c107b4e8465af55 (diff)
virt: kvm: use global variable vgic_nr_lrmcpm-wfi-0708
Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org>
-rw-r--r--virt/kvm/arm/vgic.c29
1 files changed, 12 insertions, 17 deletions
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
index 0e206091ebaf..f4e54c9421f0 100644
--- a/virt/kvm/arm/vgic.c
+++ b/virt/kvm/arm/vgic.c
@@ -76,8 +76,6 @@
#define IMPLEMENTER_ARM 0x43b
#define GICC_ARCH_VERSION_V2 0x2
-#define vgic_nr_lr(vcpu) (vcpu->hw_cfg & HWCFG_NR_LR_MASK)
-
/* Physical address of vgic virtual cpu interface */
static phys_addr_t vgic_vcpu_base;
@@ -99,7 +97,7 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu);
static void vgic_update_state(struct kvm *kvm);
static void vgic_kick_vcpus(struct kvm *kvm);
static void vgic_dispatch_sgi(struct kvm_vcpu *vcpu, u32 reg);
-static u32 vgic_hw_cfg;
+static u32 vgic_hw_cfg, vgic_nr_lr;
static unsigned int vgic_maint_irq;
@@ -625,9 +623,9 @@ static void vgic_unqueue_irqs(struct kvm_vcpu *vcpu)
struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
int vcpu_id = vcpu->vcpu_id;
int i, irq, source_cpu;
- u32 *lr, nr_lr = vgic_nr_lr(vgic_cpu);
+ u32 *lr;
- for_each_set_bit(i, vgic_cpu->lr_used, nr_lr) {
+ for_each_set_bit(i, vgic_cpu->lr_used, vgic_nr_lr) {
lr = &vgic_cpu->vgic_lr[i];
irq = LR_IRQID(*lr);
source_cpu = LR_CPUID(*lr);
@@ -1007,9 +1005,8 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu)
{
struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
int lr;
- int nr_lr = vgic_nr_lr(vgic_cpu);
- for_each_set_bit(lr, vgic_cpu->lr_used, nr_lr) {
+ for_each_set_bit(lr, vgic_cpu->lr_used, vgic_nr_lr) {
int irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
if (!vgic_irq_is_enabled(vcpu, irq)) {
@@ -1028,7 +1025,6 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
{
struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
int lr;
- int nr_lr = vgic_nr_lr(vgic_cpu);
/* Sanitize the input... */
BUG_ON(sgi_source_id & ~7);
@@ -1050,8 +1046,9 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq)
}
/* Try to use another LR for this interrupt */
- lr = find_first_zero_bit((unsigned long *)vgic_cpu->lr_used, nr_lr);
- if (lr >= nr_lr)
+ lr = find_first_zero_bit((unsigned long *)vgic_cpu->lr_used,
+ vgic_nr_lr);
+ if (lr >= vgic_nr_lr)
return false;
kvm_debug("LR%d allocated for IRQ%d %x\n", lr, irq, sgi_source_id);
@@ -1184,10 +1181,9 @@ static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
* active bit.
*/
int lr, irq;
- int nr_lr = vgic_nr_lr(vgic_cpu);
for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_eisr,
- nr_lr) {
+ vgic_nr_lr) {
irq = vgic_cpu->vgic_lr[lr] & GICH_LR_VIRTUALID;
vgic_irq_clear_active(vcpu, irq);
@@ -1225,13 +1221,13 @@ static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
int lr, pending;
- int nr_lr = vgic_nr_lr(vgic_cpu);
bool level_pending;
level_pending = vgic_process_maintenance(vcpu);
/* Clear mappings for empty LRs */
- for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr, nr_lr) {
+ for_each_set_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr,
+ vgic_nr_lr) {
int irq;
if (!test_and_clear_bit(lr, vgic_cpu->lr_used))
@@ -1245,8 +1241,8 @@ static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu)
/* Check if we still have something up our sleeve... */
pending = find_first_zero_bit((unsigned long *)vgic_cpu->vgic_elrsr,
- nr_lr);
- if (level_pending || pending < nr_lr)
+ vgic_nr_lr);
+ if (level_pending || pending < vgic_nr_lr)
set_bit(vcpu->vcpu_id, &dist->irq_pending_on_cpu);
}
@@ -1491,7 +1487,6 @@ int kvm_vgic_hyp_init(void)
struct resource vctrl_res;
struct resource vcpu_res;
const struct of_device_id *match;
- u32 vgic_nr_lr;
vgic_node = of_find_matching_node_and_match(NULL, of_vgic_ids, &match);
if (!vgic_node) {