kvm, arm: Make GIC interrupt lines configurable
authorAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 27 Apr 2016 14:34:48 +0000 (15:34 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Wed, 27 Apr 2016 14:34:48 +0000 (15:34 +0100)
Add support for overriding the number of interrupt lines in the ARM
KvmGic.

Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Radhika Jagtap <radhika.jagtap@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
src/arch/arm/kvm/KvmGic.py
src/arch/arm/kvm/gic.cc
src/arch/arm/kvm/gic.hh

index 53814698e11d8cd26b3c88c417d6264c98ac8f33..74bfe1e0bae8531e6b62d8e94aaccda8a6233824 100644 (file)
@@ -48,6 +48,7 @@ class KvmGic(BaseGic):
 
     dist_addr = Param.Addr(0x1f001000, "Address for distributor")
     cpu_addr = Param.Addr(0x1f000100, "Address for cpu")
+    it_lines = Param.UInt32(128, "Number of interrupt lines supported")
 
     system = Param.System(Parent.any,
                           'System this interrupt controller belongs to')
index bed13ec2c973ef550a7825513ce497344fdbe541..684f026f0fbf6ec3008cfded70ce17faf95d2e1c 100644 (file)
@@ -44,8 +44,8 @@
 #include "debug/Interrupt.hh"
 #include "params/KvmGic.hh"
 
-
-KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr)
+KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr,
+                               unsigned it_lines)
     : cpuRange(RangeSize(cpu_addr, KVM_VGIC_V2_CPU_SIZE)),
       distRange(RangeSize(dist_addr, KVM_VGIC_V2_DIST_SIZE)),
       vm(_vm),
@@ -55,6 +55,8 @@ KvmKernelGicV2::KvmKernelGicV2(KvmVM &_vm, Addr cpu_addr, Addr dist_addr)
         KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_DIST, dist_addr);
     kdev.setAttr<uint64_t>(
         KVM_DEV_ARM_VGIC_GRP_ADDR, KVM_VGIC_V2_ADDR_TYPE_CPU, cpu_addr);
+
+    kdev.setAttr<uint32_t>(KVM_DEV_ARM_VGIC_GRP_NR_IRQS, 0, it_lines);
 }
 
 KvmKernelGicV2::~KvmKernelGicV2()
@@ -104,7 +106,7 @@ KvmKernelGicV2::setIntState(unsigned type, unsigned vcpu, unsigned irq,
 KvmGic::KvmGic(const KvmGicParams *p)
     : BaseGic(p),
       system(*p->system),
-      kernelGic(*p->kvmVM, p->cpu_addr, p->dist_addr),
+      kernelGic(*p->kvmVM, p->cpu_addr, p->dist_addr, p->it_lines),
       addrRanges{kernelGic.distRange, kernelGic.cpuRange}
 {
 }
index 77a7b5e53029fcd476996408c481b53257261712..b16a3f104512ee29ce067d53fde9f40638d2428f 100644 (file)
@@ -65,8 +65,10 @@ class KvmKernelGicV2
      * @param vm KVM VM representing this system
      * @param cpu_addr GIC CPU interface base address
      * @param dist_addr GIC distributor base address
+     * @param it_liens Number of interrupt lines to support
      */
-    KvmKernelGicV2(KvmVM &vm, Addr cpu_addr, Addr dist_addr);
+    KvmKernelGicV2(KvmVM &vm, Addr cpu_addr, Addr dist_addr,
+                   unsigned it_lines);
     virtual ~KvmKernelGicV2();
 
     KvmKernelGicV2(const KvmKernelGicV2 &other) = delete;