diff options
Diffstat (limited to 'bsps/powerpc/shared/start/ppc_idle.c')
-rw-r--r-- | bsps/powerpc/shared/start/ppc_idle.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/bsps/powerpc/shared/start/ppc_idle.c b/bsps/powerpc/shared/start/ppc_idle.c new file mode 100644 index 0000000000..44ae87311c --- /dev/null +++ b/bsps/powerpc/shared/start/ppc_idle.c @@ -0,0 +1,106 @@ +/* + * ppc_idle.c + * + * Authorship + * ---------- + * This software was created by + * Till Straumann <strauman@slac.stanford.edu>, 2010, + * Stanford Linear Accelerator Center, Stanford University. + * + * Acknowledgement of sponsorship + * ------------------------------ + * This software was produced by + * the Stanford Linear Accelerator Center, Stanford University, + * under Contract DE-AC03-76SFO0515 with the Department of Energy. + * + * Government disclaimer of liability + * ---------------------------------- + * Neither the United States nor the United States Department of Energy, + * nor any of their employees, makes any warranty, express or implied, or + * assumes any legal liability or responsibility for the accuracy, + * completeness, or usefulness of any data, apparatus, product, or process + * disclosed, or represents that its use would not infringe privately owned + * rights. + * + * Stanford disclaimer of liability + * -------------------------------- + * Stanford University makes no representations or warranties, express or + * implied, nor assumes any liability for the use of this software. + * + * Stanford disclaimer of copyright + * -------------------------------- + * Stanford University, owner of the copyright, hereby disclaims its + * copyright and all other rights in this software. Hence, anyone may + * freely use it for any purpose without restriction. + * + * Maintenance of notices + * ---------------------- + * In the interest of clarity regarding the origin and status of this + * SLAC software, this and all the preceding Stanford University notices + * are to remain affixed to any copy or derivative of this software made + * or distributed by the recipient and are to be affixed to any copy of + * software made or distributed by the recipient that contains a copy or + * derivative of this software. + * + * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03 + */ +#include <bsp.h> +#include <stdint.h> + +#ifdef BSP_IDLE_TASK_BODY + +/* Provide an idle-task body which switches the + * CPU into power-save mode when idle. Any exception + * (including an interrupt/external-exception) + * wakes it up. + * + * IIRC - this cannot be used on real hardware due + * to errata on many chips which is a real + * pity. However, when used under qemu it + * saves host-CPU cycles. + * While qemu-0.12.4 needed to be patched + * (would otherwise hang because an exception + * didn't clear MSR_POW) qemu-0.14.1 seems + * to work fine. + */ + +#include <rtems/powerpc/registers.h> +#include <libcpu/cpuIdent.h> +#include <libcpu/spr.h> + +SPR_RW(HID0) + +void * +bsp_ppc_idle_task_body(uintptr_t ignored) +{ +uint32_t msr; + + switch ( current_ppc_cpu ) { + + case PPC_7400: + case PPC_7455: + case PPC_7457: + /* Must enable NAP mode in HID0 for MSR_POW to work */ + _write_HID0( _read_HID0() | HID0_NAP ); + break; + + default: + break; + } + + for ( ;; ) { + _CPU_MSR_GET(msr); + msr |= MSR_POW; + asm volatile( + "1: sync \n" + " mtmsr %0 \n" + " isync \n" + " b 1b \n" + ::"r"(msr) + ); + } + + return 0; +} + +#endif |