• C
    arm_gic: Fix GIC pending behavior · 8d999995
    Christoffer Dall 提交于
    The existing implementation of the pending behavior in gic_set_irq,
    gic_complete_irq, and the distributor pending set/clear registers does
    not follow the semantics of the GICv2.0 specs, but may implement the
    11MPCore support.  Therefore, maintain the existing semantics for
    11MPCore and v7M NVIC and change the behavior to be in accordance with
    the GICv2.0 specs for "generic implementations" (s->revision == 1 ||
    s->revision == 2).
    
    Generic implementations distinguish between setting a level-triggered
    interrupt pending through writes to the GICD_ISPENDR and when hardware
    raises the interrupt line.  Writing to the GICD_ICPENDR will not cause
    the interrupt to become non-pending if the line is still active, and
    conversely, if the line is deactivated but the interrupt is marked as
    pending through a write to GICD_ISPENDR, the interrupt remains pending.
    Handle this situation in the GIC_TEST_PENDING (which now becomes a
    static inline named gic_test_pending) and let the 'pending' field
    correspond only to the latched state of the D-flip flop in the GICv2.0
    specs Figure 4-10.
    
    The following changes are added:
    
    gic_test_pending:
    Make this a static inline and split out the 11MPCore from the generic
    behavior.  For the generic behavior, consider interrupts pending if:
        ((s->irq_state[irq].pending & (cm) != 0) ||
           (!GIC_TEST_EDGE_TRIGGER(irq) && GIC_TEST_LEVEL(irq, cm))
    
    gic_set_irq:
    Split out the 11MPCore from the generic behavior.  For the generic
    behavior, always GIC_SET_LEVEL() on positive level, but only
    GIC_SET_PENDING for edge-triggered interrupts and always simply
    GIC_CLEAR_LEVEL() on negative level.
    
    gic_complete_irq:
    Only resample the line for line-triggered interrupts on an 11MPCore.
    Generic implementations will sample the line directly in
    gic_test_pending().
    Signed-off-by: NChristoffer Dall <christoffer.dall@linaro.org>
    Reviewed-by: NPeter Maydell <peter.maydell@linaro.org>
    Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
    8d999995
gic_internal.h 3.5 KB