why the inter-core SGI interrupt cannot be trigged on GICv3 hardware

My hareware environment:

1.  a ARMv8 processor , which  runs in 64bit EL3 and 32bit EL2&EL1.

2. a GICv3 interrupt controller

Running in 32bit hyp mode,  I try to send a SGI interrupt from core0 to core1, but core1 cannot receive this interrupt. Below are what I've tried.

1. I use ICC_SGI1R to send the interrupt. GICD_SGIR cannot be used because "affinity routing" is enabled.

2. Group0, Group1NS and Group1S interrupt are enabled in GICD_CTLR

3. Write GICR_ISENABLER0 to enable SGI interrupt

4. The IRQ/FIQ are unmasked in core1's cpsr
5. Group1 intersuprt is enabled in core1's ICC_IGRPEN1 register

But after writting to  ICC_SGI1R, I can not find valid bit in pending state register, and core1's ICC_IAR register are also always invalid.

Do you have any suggestions with this issue?

Thanks in advance.

Parents
  • Hi Martin,

    Thanks so much for your reply!

    You said that you'd written GICR_ISENABLER0 to enable the SGI you're sending.  Which core's Redistributor did you write to?  It needs to have been that of receiving core (or both of course)

    - Both core0 & core1 are written

    Did you also write GICR_IGROUPR0 to set the interrupt as NS.G1?  (Note, you'll need to do this in Secure state)

    - No, I didn't, because the core is running in 32 bit hyp mode.  But, even so, if everyghing is ok, core 1 will receive a SGI either in group0 or group1, actually core1 see nothing.

    Have you written GICR_WAKER to make the cores as awake? (You'll need to do this for sender and receiver)

    -Sure, this is done

    What's the priority of the SGI (GICR_IPRORITYRn, of the receiver) and what's the PMR value

    - PMR is 0xff

    Does GICR_ISPENDR0 (of the receiver's Redistributor) show the interrupt as pending after the write to ICC_SGI1R?

    - It's always 0

    Strictly, you'll need a DSB between the write of the ICC_SGI1R and the read of the GICR_ISPENDR0

    - Sure, DSB is used.

Reply
  • Hi Martin,

    Thanks so much for your reply!

    You said that you'd written GICR_ISENABLER0 to enable the SGI you're sending.  Which core's Redistributor did you write to?  It needs to have been that of receiving core (or both of course)

    - Both core0 & core1 are written

    Did you also write GICR_IGROUPR0 to set the interrupt as NS.G1?  (Note, you'll need to do this in Secure state)

    - No, I didn't, because the core is running in 32 bit hyp mode.  But, even so, if everyghing is ok, core 1 will receive a SGI either in group0 or group1, actually core1 see nothing.

    Have you written GICR_WAKER to make the cores as awake? (You'll need to do this for sender and receiver)

    -Sure, this is done

    What's the priority of the SGI (GICR_IPRORITYRn, of the receiver) and what's the PMR value

    - PMR is 0xff

    Does GICR_ISPENDR0 (of the receiver's Redistributor) show the interrupt as pending after the write to ICC_SGI1R?

    - It's always 0

    Strictly, you'll need a DSB between the write of the ICC_SGI1R and the read of the GICR_ISPENDR0

    - Sure, DSB is used.

Children