svn commit: r306702 - head/sys/powerpc/mpc85xx
Justin Hibbits
jhibbits at FreeBSD.org
Wed Oct 5 04:40:50 UTC 2016
Author: jhibbits
Date: Wed Oct 5 04:40:48 2016
New Revision: 306702
URL: https://svnweb.freebsd.org/changeset/base/306702
Log:
Fix e500mc/derivatives cpu idle
Setting the doze registers wasn't actually working, and was being masked by a
bad #ifdef. Since the #ifdef was fixed, now e500mc-based SoCs hang at idle.
Fix this by using the intended wait.
MFC after: 1 week
Modified:
head/sys/powerpc/mpc85xx/platform_mpc85xx.c
Modified: head/sys/powerpc/mpc85xx/platform_mpc85xx.c
==============================================================================
--- head/sys/powerpc/mpc85xx/platform_mpc85xx.c Wed Oct 5 01:01:10 2016 (r306701)
+++ head/sys/powerpc/mpc85xx/platform_mpc85xx.c Wed Oct 5 04:40:48 2016 (r306702)
@@ -530,9 +530,11 @@ mpc85xx_idle(platform_t plat, int cpu)
uint32_t reg;
if (mpc85xx_is_qoriq()) {
- reg = ccsr_read4(OCP85XX_RCPM_CDOZCR);
- ccsr_write4(OCP85XX_RCPM_CDOZCR, reg | (1 << cpu));
- ccsr_read4(OCP85XX_RCPM_CDOZCR);
+ /*
+ * Base binutils doesn't know what the 'wait' instruction is, so
+ * use the opcode encoding here.
+ */
+ __asm __volatile("wrteei 1; .long 0x7c00007c");
} else {
reg = mfmsr();
/* Freescale E500 core RM section 6.4.1. */
@@ -544,15 +546,6 @@ mpc85xx_idle(platform_t plat, int cpu)
static int
mpc85xx_idle_wakeup(platform_t plat, int cpu)
{
- uint32_t reg;
-
- if (mpc85xx_is_qoriq()) {
- reg = ccsr_read4(OCP85XX_RCPM_CDOZCR);
- ccsr_write4(OCP85XX_RCPM_CDOZCR, reg & ~(1 << cpu));
- ccsr_read4(OCP85XX_RCPM_CDOZCR);
-
- return (1);
- }
return (0);
}
More information about the svn-src-all
mailing list