• Christoffer Dall's avatar
    arm/arm64: KVM: vgic: Improve handling of GICD_I{CS}PENDRn · faa1b46c
    Christoffer Dall authored
    Writes to GICD_ISPENDRn and GICD_ICPENDRn are currently not handled
    correctly for level-triggered interrupts.  The spec states that for
    level-triggered interrupts, writes to the GICD_ISPENDRn activate the
    output of a flip-flop which is in turn or'ed with the actual input
    interrupt signal.  Correspondingly, writes to GICD_ICPENDRn simply
    deactivates the output of that flip-flop, but does not (of course) affect
    the external input signal.  Reads from GICC_IAR will also deactivate the
    flip-flop output.
    
    This requires us to track the state of the level-input separately from
    the state in the flip-flop.  We therefore introduce two new variables on
    the distributor struct to track these two states.  Astute readers may
    notice that this is introducing more state than required (because an OR
    of the two states gives you the pending state), but the remaining vgic
    code uses the pending bitmap for optimized operations to figure out, at
    the end of the day, if an interrupt is pending or not on the distributor
    side.  Refactoring the code to consider the two state variables all the
    places where we currently access the precomputed pending value, did not
    look pretty.
    Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
    faa1b46c
vgic.c 54.2 KB