[GIC-500v][ARMv8][A72] why SGI0 can't be triggered twice in validation test?

I am trying to work out a loop SGI0 ~ SGI15 triggering and handling test.

I made it work for only one round. A72 can trigger SGI0~SGI15 and handle it.

But when I try to trigger any SGI again, it will not enter pending state, and be distributed to A72 again.

my first round code is like

init a53/a72/GIC

use a53 to kick off a72

use a72 to read out MPIDR_EL1

use a72 to configure affinity and set ICC_SGI0R_EL1 (SGI0 from A53 to A72)

use a72 to check redistributor GIR_ISPENDER (make sure SGI enter is generated and enter pending state)

use a72 to install interrupt handler (read out IAR0 and set EOIR0)

use a72 to enable interrupt (GICR_WAKER / GIC_PRIORITY / GICR_CFG / GICR_GROUP/ GICR_ISENABLER )

SGI0 ~ SGI15 can be triggered and handled without error. but when I set ICC_SGI0R_EL1 again to trigger anyone of SGI. GIR_ISPENDER is always 0x40000000, seems SGI can't enter pending state again?

why's that? thanks in advance. 

Parents
  • More a set of questions than a potential answer I'm afraid.

    SGI0 ~ SGI15 can be triggered and handled without error

    Do you mean that you successfully trigger all the SGI IDs?  (That is, within the test you trigger 16 interrupts). Or, do you mean that you trigger one interrupt, but it can be any of the SGI IDs?

    but when I set ICC_SGI0R_EL1 again to trigger anyone of SGI

    Was it ICC_SGI0R_EL1 you used for the previous past of the test?

    Has anything changed in the PE?  For example, are you at a different Exception level (EL) or in a different Security state?

    Have you tried adding a "DSB SY" between the write to ICC_SGI0R_EL1 and the read of GICR_IPENDR0?

    use a72 to enable interrupt (GICR_WAKER / GIC_PRIORITY / GICR_CFG / GICR_GROUP/ GICR_ISENABLER )

    What value did you write in into GICR_IGROUPR0?  Are you also programming GICR_IGRPMODR0?

Reply
  • More a set of questions than a potential answer I'm afraid.

    SGI0 ~ SGI15 can be triggered and handled without error

    Do you mean that you successfully trigger all the SGI IDs?  (That is, within the test you trigger 16 interrupts). Or, do you mean that you trigger one interrupt, but it can be any of the SGI IDs?

    but when I set ICC_SGI0R_EL1 again to trigger anyone of SGI

    Was it ICC_SGI0R_EL1 you used for the previous past of the test?

    Has anything changed in the PE?  For example, are you at a different Exception level (EL) or in a different Security state?

    Have you tried adding a "DSB SY" between the write to ICC_SGI0R_EL1 and the read of GICR_IPENDR0?

    use a72 to enable interrupt (GICR_WAKER / GIC_PRIORITY / GICR_CFG / GICR_GROUP/ GICR_ISENABLER )

    What value did you write in into GICR_IGROUPR0?  Are you also programming GICR_IGRPMODR0?

Children