Disable LSP flush with context switch to work around bug in LSP that can cause Cyclone to wedge when CONTEXTIDR is written.
ARM64_REG_HID0 |= HID0_DISABLE_LOOP_BUFFER
ARM64_REG_HID1 |= HID1_DISABLE_STALL_INACTIVE_IEX_CTL
// This quirk applies only to A7
ARM64_REG_HID1 |= HID1_DISABLE_LSP_FLUSH_WITH_CONTEXT_SWITCH
ARM64_REG_HID3 |= HID3_DISABLE_XMON_SNP_EVICT_TRIGGER_L2_STARVATION_MODE
ARM64_REG_HID5 &= ~HID5_DISABLE_HWP_LOAD
ARM64_REG_HID5 &= ~HID5_DISABLE_HWP_STORE
// Change the default memcache data set ID from 0 to 15 for all agents
ARM64_REG_HID8 |= (HID8_DATASET_ID0_VALUE | HID8_DATASET_ID1_VALUE)
WFI is giga broken on A7/A8. Disable it so we don't have to hack on Linux. With this setting the cores don't completely turn off, they are only clock-gated instead.
// Corellium A10 Linux port also runs bitclear CYC_OVRD_OK2PWRDN_FORCE_DOWN
ARM64_REG_CYC_OVRD |= CYC_OVRD_OK2PWRDN_FORCE_UP
If you want to hack your kernel, here's the 'proper' WFI setup
First disable MMU prefetch:
ARM64_REG_HID2 |= HID2_DISABLE_MMU_MTLB_PREFETCH
# Make sure everything went through and the core will wake up next time around..
dsb sy
isb sy
And then enable deep sleep & send OK to power down:
ARM64_REG_CYC_CFG = CYC_CFG_DEEP_SLEEP
ARM64_REG_CYC_OVRD |= CYC_OVRD_OK2PWRDN_FORCE_DOWN
dsb sy
isb sy
// XNU calls dsb sy once more, hmm..
wfi
..aaand it's time to return from WFI:
ARM64_REG_HID2 &= ~HID2_DISABLE_MMU_MTLB_PREFETCH
dsb sy
isb sy