Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 Feb 2019 21:19:53 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r343944 - head/sys/powerpc/powerpc
Message-ID:  <201902092119.x19LJrf8091585@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Sat Feb  9 21:19:53 2019
New Revision: 343944
URL: https://svnweb.freebsd.org/changeset/base/343944

Log:
  powerpc: Split out the e500mc idling from rest of Book-E
  
  The e500v2 and e500mc (and derivatives) have different idling procedures, so
  make them different functions.
  
  MFC after:	2 weeks

Modified:
  head/sys/powerpc/powerpc/cpu.c

Modified: head/sys/powerpc/powerpc/cpu.c
==============================================================================
--- head/sys/powerpc/powerpc/cpu.c	Sat Feb  9 21:08:19 2019	(r343943)
+++ head/sys/powerpc/powerpc/cpu.c	Sat Feb  9 21:19:53 2019	(r343944)
@@ -89,6 +89,7 @@ int powerpc_pow_enabled;
 void (*cpu_idle_hook)(sbintime_t) = NULL;
 static void	cpu_idle_60x(sbintime_t);
 static void	cpu_idle_booke(sbintime_t);
+static void	cpu_idle_e500mc(sbintime_t sbt);
 #if defined(__powerpc64__) && defined(AIM)
 static void	cpu_idle_powerx(sbintime_t);
 static void	cpu_idle_power9(sbintime_t);
@@ -585,10 +586,12 @@ cpu_booke_setup(int cpuid, uint16_t vers)
 	switch (vers) {
 	case FSL_E500mc:
 		bitmask = HID0_E500MC_BITMASK;
+		cpu_idle_hook = cpu_idle_e500mc;
 		break;
 	case FSL_E5500:
 	case FSL_E6500:
 		bitmask = HID0_E5500_BITMASK;
+		cpu_idle_hook = cpu_idle_e500mc;
 		break;
 	case FSL_E500v1:
 	case FSL_E500v2:
@@ -754,25 +757,25 @@ cpu_idle_60x(sbintime_t sbt)
 }
 
 static void
+cpu_idle_e500mc(sbintime_t sbt)
+{
+	/*
+	 * Base binutils doesn't know what the 'wait' instruction is, so
+	 * use the opcode encoding here.
+	 */
+	__asm __volatile(".long 0x7c00007c");
+}
+
+static void
 cpu_idle_booke(sbintime_t sbt)
 {
 	register_t msr;
-	uint16_t vers;
 
 	msr = mfmsr();
-	vers = mfpvr() >> 16;
 
-#ifdef BOOKE
-	switch (vers) {
-	case FSL_E500mc:
-	case FSL_E5500:
-	case FSL_E6500:
-		break;
-	default:
-		powerpc_sync();
-		mtmsr(msr | PSL_WE);
-		break;
-	}
+#ifdef BOOKE_E500
+	powerpc_sync();
+	mtmsr(msr | PSL_WE);
 #endif
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902092119.x19LJrf8091585>