mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-13 12:26:01 +01:00
sunxi: psci: Avoid hanging when CPU 0 is hot-unplugged
Do not try to send an SGI from CPU 0 to itself. Since FIQs are masked when entering monitor mode, this will hang. Plus, CPU 0 cannot fully power itself off anyway. Instead, have it turn FIQs back on and continue servicing SGIs from other cores. Signed-off-by: Samuel Holland <samuel@sholland.org>
This commit is contained in:
parent
65ec73f689
commit
16d413f8c9
@ -38,6 +38,15 @@
|
||||
#define SUN8I_R40_PWR_CLAMP(cpu) (0x120 + (cpu) * 0x4)
|
||||
#define SUN8I_R40_SRAMC_SOFT_ENTRY_REG0 (0xbc)
|
||||
|
||||
static inline u32 __secure cp15_read_mpidr(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
asm volatile ("mrc p15, 0, %0, c0, c0, 5" : "=r" (val));
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void __secure cp15_write_cntp_tval(u32 tval)
|
||||
{
|
||||
asm volatile ("mcr p15, 0, %0, c14, c2, 0" : : "r" (tval));
|
||||
@ -281,9 +290,14 @@ s32 __secure psci_cpu_off(void)
|
||||
{
|
||||
psci_cpu_off_common();
|
||||
|
||||
/* Ask CPU0 via SGI15 to pull the rug... */
|
||||
writel(BIT(16) | 15, GICD_BASE + GICD_SGIR);
|
||||
dsb();
|
||||
if (cp15_read_mpidr() & 3) {
|
||||
/* Ask CPU0 via SGI15 to pull the rug... */
|
||||
writel(BIT(16) | 15, GICD_BASE + GICD_SGIR);
|
||||
dsb();
|
||||
} else {
|
||||
/* Unmask FIQs to service SGI15. */
|
||||
asm volatile ("cpsie f");
|
||||
}
|
||||
|
||||
/* Wait to be turned off */
|
||||
while (1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user