// SPDX-License-Identifier: GPL-2.0-only
/*
* linux / arch / arm / mach - spear13xx / hotplug . c
*
* Copyright ( C ) 2012 ST Microelectronics Ltd .
* Deepak Sikri < deepak . sikri @ st . com >
*
* based upon linux / arch / arm / mach - realview / hotplug . c
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
#include <asm /cp15.h>
#include <asm /smp_plat.h>
#include "generic.h"
static inline void cpu_enter_lowpower(void )
{
unsigned int v;
asm volatile (
" mcr p15, 0, %1, c7, c5, 0\n"
" dsb\n"
/*
* Turn off coherency
*/
" mrc p15, 0, %0, c1, c0, 1\n"
" bic %0, %0, #0x20\n"
" mcr p15, 0, %0, c1, c0, 1\n"
" mrc p15, 0, %0, c1, c0, 0\n"
" bic %0, %0, %2\n"
" mcr p15, 0, %0, c1, c0, 0\n"
: "=&r" (v)
: "r" (0 ), "Ir" (CR_C)
: "cc" , "memory" );
}
static inline void cpu_leave_lowpower(void )
{
unsigned int v;
asm volatile ("mrc p15, 0, %0, c1, c0, 0\n"
" orr %0, %0, %1\n"
" mcr p15, 0, %0, c1, c0, 0\n"
" mrc p15, 0, %0, c1, c0, 1\n"
" orr %0, %0, #0x20\n"
" mcr p15, 0, %0, c1, c0, 1\n"
: "=&r" (v)
: "Ir" (CR_C)
: "cc" );
}
static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious)
{
for (;;) {
wfi();
if (spear_pen_release == cpu) {
/*
* OK , proper wakeup , we ' re done
*/
break ;
}
/*
* Getting here , means that we have come out of WFI without
* having been woken up - this shouldn ' t happen
*
* Just note it happening - when we ' re woken , we can report
* its occurrence .
*/
(*spurious)++;
}
}
/*
* platform - specific code to shutdown a CPU
*
* Called with IRQs disabled
*/
void spear13xx_cpu_die(unsigned int cpu)
{
int spurious = 0 ;
/*
* we ' re ready for shutdown now , so do it
*/
cpu_enter_lowpower();
spear13xx_do_lowpower(cpu, &spurious);
/*
* bring this CPU back into the world of cache
* coherency , and then restore interrupts
*/
cpu_leave_lowpower();
if (spurious)
pr_warn("CPU%u: %u spurious wakeup calls\n" , cpu, spurious);
}
Messung V0.5 in Prozent C=93 H=69 G=81
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland