diff --git a/sys/powerpc/aim/locore.S b/sys/powerpc/aim/locore.S index e566e4defdb..ab6aade70c0 100644 --- a/sys/powerpc/aim/locore.S +++ b/sys/powerpc/aim/locore.S @@ -89,9 +89,6 @@ GLOBAL(esym) GLOBAL(ofmsr) .long 0, 0, 0, 0, 0 /* msr/sprg0-3 used in Open Firmware */ -GLOBAL(powersave) - .long 0 - #define INTSTK 16384 /* 16K interrupt stack */ #define INTRCNT_COUNT 256 /* max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */ GLOBAL(intrnames) diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c index 23c6eb2aa4b..4a705561b9b 100644 --- a/sys/powerpc/aim/machdep.c +++ b/sys/powerpc/aim/machdep.c @@ -107,6 +107,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -737,15 +738,22 @@ cpu_halt(void) void cpu_idle(void) { - /* TODO: Insert code to halt (until next interrupt) */ + uint32_t msr; + + msr = mfmsr(); #ifdef INVARIANTS - if ((mfmsr() & PSL_EE) != PSL_EE) { + if ((msr & PSL_EE) != PSL_EE) { struct thread *td = curthread; printf("td msr %x\n", td->td_md.md_saved_msr); panic("ints disabled in idleproc!"); } #endif + if (powerpc_pow_enabled) { + __asm __volatile("sync"); + mtmsr(msr | PSL_POW); + isync(); + } } /* diff --git a/sys/powerpc/include/md_var.h b/sys/powerpc/include/md_var.h index d0b350f4eb6..f0f254a421f 100644 --- a/sys/powerpc/include/md_var.h +++ b/sys/powerpc/include/md_var.h @@ -44,6 +44,8 @@ extern vm_offset_t kstack0_phys; extern u_long ns_per_tick; +extern int powerpc_pow_enabled; + #if defined(_KERNEL) || defined(_STANDALONE) #define CACHELINESIZE 32 #endif diff --git a/sys/powerpc/powerpc/cpu.c b/sys/powerpc/powerpc/cpu.c index 5d0b279c0d0..93cb6559233 100644 --- a/sys/powerpc/powerpc/cpu.c +++ b/sys/powerpc/powerpc/cpu.c @@ -70,6 +70,8 @@ #include #include +int powerpc_pow_enabled; + struct cputab { const char *name; uint16_t version; @@ -183,9 +185,7 @@ cpu_setup(u_int cpuid) /* Select DOZE mode. */ hid0 &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); hid0 |= HID0_DOZE | HID0_DPM; -#ifdef notyet - powersave = 1; -#endif + powerpc_pow_enabled = 1; break; case MPC7448: @@ -203,9 +203,7 @@ cpu_setup(u_int cpuid) /* Select NAP mode. */ hid0 &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); hid0 |= HID0_NAP | HID0_DPM; -#ifdef notyet - powersave = 0; /* but don't use it */ -#endif + powerpc_pow_enabled = 1; break; default: