Commit 7e362919 authored by Christoffer Dall's avatar Christoffer Dall

arm/arm64: KVM: vgic: Clarify and correct vgic documentation

The VGIC virtual distributor implementation documentation was written a
very long time ago, before the true nature of the beast had been
partially absorbed into my bloodstream.  Clarify the docs.

Plus, it fixes an actual bug.  ICFRn, pfff.
Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
parent 9da48b55
...@@ -36,21 +36,22 @@ ...@@ -36,21 +36,22 @@
* How the whole thing works (courtesy of Christoffer Dall): * How the whole thing works (courtesy of Christoffer Dall):
* *
* - At any time, the dist->irq_pending_on_cpu is the oracle that knows if * - At any time, the dist->irq_pending_on_cpu is the oracle that knows if
* something is pending * something is pending on the CPU interface.
* - VGIC pending interrupts are stored on the vgic.irq_pending vgic * - Interrupts that are pending on the distributor are stored on the
* bitmap (this bitmap is updated by both user land ioctls and guest * vgic.irq_pending vgic bitmap (this bitmap is updated by both user land
* mmio ops, and other in-kernel peripherals such as the * ioctls and guest mmio ops, and other in-kernel peripherals such as the
* arch. timers) and indicate the 'wire' state. * arch. timers).
* - Every time the bitmap changes, the irq_pending_on_cpu oracle is * - Every time the bitmap changes, the irq_pending_on_cpu oracle is
* recalculated * recalculated
* - To calculate the oracle, we need info for each cpu from * - To calculate the oracle, we need info for each cpu from
* compute_pending_for_cpu, which considers: * compute_pending_for_cpu, which considers:
* - PPI: dist->irq_pending & dist->irq_enable * - PPI: dist->irq_pending & dist->irq_enable
* - SPI: dist->irq_pending & dist->irq_enable & dist->irq_spi_target * - SPI: dist->irq_pending & dist->irq_enable & dist->irq_spi_target
* - irq_spi_target is a 'formatted' version of the GICD_ICFGR * - irq_spi_target is a 'formatted' version of the GICD_ITARGETSRn
* registers, stored on each vcpu. We only keep one bit of * registers, stored on each vcpu. We only keep one bit of
* information per interrupt, making sure that only one vcpu can * information per interrupt, making sure that only one vcpu can
* accept the interrupt. * accept the interrupt.
* - If any of the above state changes, we must recalculate the oracle.
* - The same is true when injecting an interrupt, except that we only * - The same is true when injecting an interrupt, except that we only
* consider a single interrupt at a time. The irq_spi_cpu array * consider a single interrupt at a time. The irq_spi_cpu array
* contains the target CPU for each SPI. * contains the target CPU for each SPI.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment