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 cpsr5. 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.
Hi Martin
I set GICD_CTLR as 0x47 in secure state. I.e, DS is 1.
Now in my 32bit hyp mode, the value of GICR_ISENABLER0 is 0x300, GICR_IGROUPR0 is 0xffff, GICR_IGRPMODR0 is 0. But I still cannot send out a #8 SGI using icc_sgi1r or GICD_SGIR.
The other SPI interrupt, say timer, works fine in the system.
Do you have any other ideas about this issue?
Thanks.
Couple of questions.
Are you doing this write from Secure state? If so, I would suggest just writing GICR_IGROUPR0 and not setting DS==1. If not, you can't set the DS bit from Non-secure state.
Also, you don't appear to be setting the ARE bits. The ARE bits select between the GICv3 and legacy mode. If you're setting the SRE bits, then the ARE bits should also be set.
EDIT: For reference, attached is a simple assembler program I wrote once to test something. It's a very minimal GICv3 set up sequence, targeting the Base Platform model.
Hi, Can you attach that sample code. I didnt find it so.
Hi, Can you attach that sample code. I have the same issue.