1. 27 Aug, 2015 3 commits
    • Marc Zyngier's avatar
      irqchip/GIC: Convert to EOImode == 1 · 0b996fd3
      Marc Zyngier authored
      So far, GICv2 has been used with EOImode == 0. The effect of this
      mode is to perform the priority drop and the deactivation of the
      interrupt at the same time.
      
      While this works perfectly for Linux (we only have a single priority),
      it causes issues when an interrupt is forwarded to a guest, and when
      we want the guest to perform the EOI itself.
      
      For this case, the GIC architecture provides EOImode == 1, where:
      - A write to the EOI register drops the priority of the interrupt
        and leaves it active. Other interrupts at the same priority level
        can now be taken, but the active interrupt cannot be taken again
      - A write to the DIR marks the interrupt as inactive, meaning it can
        now be taken again.
      
      We only enable this feature when booted in HYP mode and that
      the device-tree reported a suitable CPU interface. Observable behaviour
      should remain unchanged.
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Reviewed-and-tested-by: default avatarEric Auger <eric.auger@linaro.org>
      Cc: Christoffer Dall <christoffer.dall@linaro.org>
      Cc: Jiang Liu <jiang.liu@linux.intel.com>
      Cc: <linux-arm-kernel@lists.infradead.org>
      Cc: kvmarm@lists.cs.columbia.edu
      Cc: Jason Cooper <jason@lakedaemon.net>
      Link: http://lkml.kernel.org/r/1440604845-28229-4-git-send-email-marc.zyngier@arm.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      0b996fd3
    • Marc Zyngier's avatar
      irqchip/GICv3: Don't deactivate interrupts forwarded to a guest · 530bf353
      Marc Zyngier authored
      Commit 0a4377de ("genirq: Introduce irq_set_vcpu_affinity() to
      target an interrupt to a VCPU") added just what we needed at the
      lowest level to allow an interrupt to be deactivated by a guest.
      
      When such a request reaches the GIC, it knows it doesn't need to
      perform the deactivation anymore, and can safely leave the guest
      do its magic. This of course requires additional support in both
      VFIO and KVM.
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Reviewed-and-tested-by: default avatarEric Auger <eric.auger@linaro.org>
      Cc: Christoffer Dall <christoffer.dall@linaro.org>
      Cc: Jiang Liu <jiang.liu@linux.intel.com>
      Cc: <linux-arm-kernel@lists.infradead.org>
      Cc: kvmarm@lists.cs.columbia.edu
      Cc: Jason Cooper <jason@lakedaemon.net>
      Link: http://lkml.kernel.org/r/1440604845-28229-3-git-send-email-marc.zyngier@arm.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      530bf353
    • Marc Zyngier's avatar
      irqchip/GICv3: Convert to EOImode == 1 · 0b6a3da9
      Marc Zyngier authored
      So far, GICv3 has been used in with EOImode == 0. The effect of this
      mode is to perform the priority drop and the deactivation of the
      interrupt at the same time.
      
      While this works perfectly for Linux (we only have a single priority),
      it causes issues when an interrupt is forwarded to a guest, and when
      we want the guest to perform the EOI itself.
      
      For this case, the GIC architecture provides EOImode == 1, where:
      - A write to ICC_EOIR1_EL1 drops the priority of the interrupt and
        leaves it active. Other interrupts at the same priority level can
        now be taken, but the active interrupt cannot be taken again
      - A write to ICC_DIR_EL1 marks the interrupt as inactive, meaning
        it can now be taken again.
      
      This patch converts the driver to be able to use this new mode,
      depending on whether or not the kernel can behave as a hypervisor.
      No feature change.
      Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Reviewed-and-tested-by: default avatarEric Auger <eric.auger@linaro.org>
      Cc: Christoffer Dall <christoffer.dall@linaro.org>
      Cc: Jiang Liu <jiang.liu@linux.intel.com>
      Cc: <linux-arm-kernel@lists.infradead.org>
      Cc: kvmarm@lists.cs.columbia.edu
      Cc: Jason Cooper <jason@lakedaemon.net>
      Link: http://lkml.kernel.org/r/1440604845-28229-2-git-send-email-marc.zyngier@arm.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      0b6a3da9
  2. 24 Aug, 2015 1 commit
  3. 20 Aug, 2015 4 commits
  4. 18 Aug, 2015 1 commit
  5. 04 Aug, 2015 2 commits
    • Jon Hunter's avatar
      irqchip/gic: Ensure gic_cpu_if_up/down() programs correct GIC instance · 4c2880b3
      Jon Hunter authored
      Commit 32289506 ("irqchip: gic: Preserve gic V2 bypass bits in cpu
      ctrl register") added a new function, gic_cpu_if_up(), to program the
      GIC CPU_CTRL register. This function assumes that there is only one GIC
      instance present and hence always uses the chip data for the primary GIC
      controller. Although it is not common for there to be a secondary, some
      devices do support a secondary. Therefore, fix this by passing
      gic_cpu_if_up() a pointer to the appropriate chip data structure.
      
      Similarly, the function gic_cpu_if_down() only assumes that there is a
      single GIC instance present. Update this function so that an instance
      number is passed for the appropriate GIC and return an error code on
      failure. The vexpress TC2 (which has a single GIC) is currently the only
      user of this function and so update it accordingly. Note that because the
      TC2 only has a single GIC, the call to gic_cpu_if_down() should always
      be successful.
      Signed-off-by: default avatarJon Hunter <jonathanh@nvidia.com>
      Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Cc: <linux-arm-kernel@lists.infradead.org>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
      Cc: Jason Cooper <jason@lakedaemon.net>
      Link: http://lkml.kernel.org/r/1438332252-25248-2-git-send-email-jonathanh@nvidia.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      4c2880b3
    • Jon Hunter's avatar
      irqchip/gic: Only allow the primary GIC to set the CPU map · 567e5a01
      Jon Hunter authored
      The gic_init_bases() function initialises an array that stores the mapping
      between the GIC and CPUs. This array is a global array that is
      unconditionally initialised on every call to gic_init_bases(). Although,
      it is not common for there to be more than one GIC instance, there are
      some devices that do support nested GIC controllers and gic_init_bases()
      can be called more than once.
      
      A 2nd call to gic_init_bases() will clear the previous CPU mapping and
      will only setup the mapping again for the CPU calling gic_init_bases().
      Fix this by only allowing the CPU map to be configured for the primary GIC.
      
      For secondary GICs the CPU map is not relevant because these GICs do not
      directly route the interrupts to the main CPU(s) but to other GICs or
      devices.
      Signed-off-by: default avatarJon Hunter <jonathanh@nvidia.com>
      Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
      Cc: <linux-arm-kernel@lists.infradead.org>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
      Cc: Jason Cooper <jason@lakedaemon.net>
      Link: http://lkml.kernel.org/r/1438332252-25248-1-git-send-email-jonathanh@nvidia.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      567e5a01
  6. 01 Aug, 2015 4 commits
  7. 31 Jul, 2015 12 commits
  8. 29 Jul, 2015 13 commits