Visible to Intel only — GUID: flj1687909043811
Ixiasoft
Visible to Intel only — GUID: flj1687909043811
Ixiasoft
3.6.2. 1717652: Wake_request may not be delivered if multiple cores are woken by PPIs at the same time
Description
The GIC is meant to raise a wake_request signal to the system control processor whenever there is a pending, enabled, and not active interrupt for a core.
In the PPI block, the two types of interrupt that generate wake requests are:
- PPIs
- SGIs that were present before the core entered sleep mode. SGIs sent to sleeping cores are not impacted
Conditions
The PPI block sends each wake request as a packet to the GICD.
If multiple cores are waiting to send wake requests at the same time, by either transient backpressure on the bus to the GICD or by the credit being in use, then the destination core is incorrect and one of the cores might not be woken.
In small implementations, the window is a small number of clock cycles but may extend in distributed systems where the PPI block to GICD traffic is routed over general transport.
Impact
The implications are:
- If a system relies on a PPI (a core timer within the cluster) to wake a core from a power state where GICR_WAKER.ProcessorSleep == 1, then the PPI might not wake that core. LPIs, SPIs, and SGIs will still cause a wake.
- This issue is most likely to occur in systems that use a PPI as a general broadcast mechanism.
- Core power states such as WFI or WFE, where the core remains on are not affected.
- If a core has pending enabled SGIs when GICR_WAKER.ProcessorSleep is set, then the core might not receive an immediate wake request.
Workaround
When Secure software responds to a wake request to power up a core, it must:
- Read the GICR_PWRR register to determine what other cores are on the same PPI block. Software can use the GICR_PWRR.RDgroupOffset value to determine the first core on the PPI block and then increment from there.
- Read GICR_ISPENDR* for each core on the PPI block, to determine if the core must be woken.
- Wake any other cores that it finds with pending PPIs or SGIs.
Note: To avoid spurious wakes, software might also check GICR_ISENABLER and GICR_ISACTIVER.
Category
Category B