svn commit: r333272 - in head/sys/powerpc: include powerpc

Justin Hibbits jhibbits at FreeBSD.org
Sat May 5 15:48:40 UTC 2018


Author: jhibbits
Date: Sat May  5 15:48:39 2018
New Revision: 333272
URL: https://svnweb.freebsd.org/changeset/base/333272

Log:
  Break out the cpu_features setup to its own function, to be run earlier
  
  The new POWER9 MMU configuration is slightly different from current setups.
  Rather than special-casing on POWER9, move the initialization of cpu_features
  and cpu_features2 to as early as possible, so that platform and MMU
  configuration can be based upon CPU features instead of specific CPUs if at all
  possible.
  
  Reviewed by:	nwhitehorn

Modified:
  head/sys/powerpc/include/md_var.h
  head/sys/powerpc/powerpc/cpu.c
  head/sys/powerpc/powerpc/machdep.c

Modified: head/sys/powerpc/include/md_var.h
==============================================================================
--- head/sys/powerpc/include/md_var.h	Sat May  5 15:42:58 2018	(r333271)
+++ head/sys/powerpc/include/md_var.h	Sat May  5 15:48:39 2018	(r333272)
@@ -63,6 +63,7 @@ void	decr_init(void);
 void	decr_ap_init(void);
 void	decr_tc_init(void);
 
+void	cpu_feature_setup(void);
 void	cpu_setup(u_int);
 
 struct	trapframe;

Modified: head/sys/powerpc/powerpc/cpu.c
==============================================================================
--- head/sys/powerpc/powerpc/cpu.c	Sat May  5 15:42:58 2018	(r333271)
+++ head/sys/powerpc/powerpc/cpu.c	Sat May  5 15:48:39 2018	(r333272)
@@ -231,6 +231,8 @@ static int	cpu_feature_bit(SYSCTL_HANDLER_ARGS);
 static char model[64];
 SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, model, 0, "");
 
+static const struct cputab	*cput;
+
 u_long cpu_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU;
 u_long cpu_features2 = 0;
 SYSCTL_OPAQUE(_hw, OID_AUTO, cpu_features, CTLFLAG_RD,
@@ -245,14 +247,37 @@ SYSCTL_PROC(_hw, OID_AUTO, floatingpoint, CTLTYPE_INT 
 SYSCTL_PROC(_hw, OID_AUTO, altivec, CTLTYPE_INT | CTLFLAG_RD,
     0, PPC_FEATURE_HAS_ALTIVEC, cpu_feature_bit, "I", "CPU supports Altivec");
 
+/*
+ * Phase 1 (early) CPU setup.  Setup the cpu_features/cpu_features2 variables,
+ * so they can be used during platform and MMU bringup.
+ */
 void
+cpu_feature_setup()
+{
+	u_int		pvr;
+	uint16_t	vers;
+	const struct	cputab *cp;
+
+	pvr = mfpvr();
+	vers = pvr >> 16;
+	for (cp = models; cp->version != 0; cp++) {
+		if (cp->version == vers)
+			break;
+	}
+
+	cput = cp;
+	cpu_features |= cp->features;
+	cpu_features2 |= cp->features2;
+}
+
+
+void
 cpu_setup(u_int cpuid)
 {
-	u_int		pvr, maj, min;
-	uint16_t	vers, rev, revfmt;
 	uint64_t	cps;
-	const struct	cputab *cp;
 	const char	*name;
+	u_int		maj, min, pvr;
+	uint16_t	rev, revfmt, vers;
 
 	pvr = mfpvr();
 	vers = pvr >> 16;
@@ -274,13 +299,8 @@ cpu_setup(u_int cpuid)
 			min = (pvr >>  0) & 0xf;
 	}
 
-	for (cp = models; cp->version != 0; cp++) {
-		if (cp->version == vers)
-			break;
-	}
-
-	revfmt = cp->revfmt;
-	name = cp->name;
+	revfmt = cput->revfmt;
+	name = cput->name;
 	if (rev == MPC750 && pvr == 15) {
 		name = "Motorola MPC755";
 		revfmt = REVFMT_HEX;
@@ -305,8 +325,6 @@ cpu_setup(u_int cpuid)
 		printf(", %jd.%02jd MHz", cps / 1000000, (cps / 10000) % 100);
 	printf("\n");
 
-	cpu_features |= cp->features;
-	cpu_features2 |= cp->features2;
 	printf("cpu%d: Features %b\n", cpuid, (int)cpu_features,
 	    PPC_FEATURE_BITMASK);
 	if (cpu_features2 != 0)
@@ -316,8 +334,8 @@ cpu_setup(u_int cpuid)
 	/*
 	 * Configure CPU
 	 */
-	if (cp->cpu_setup != NULL)
-		cp->cpu_setup(cpuid, vers);
+	if (cput->cpu_setup != NULL)
+		cput->cpu_setup(cpuid, vers);
 }
 
 /* Get current clock frequency for the given cpu id. */

Modified: head/sys/powerpc/powerpc/machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/machdep.c	Sat May  5 15:42:58 2018	(r333271)
+++ head/sys/powerpc/powerpc/machdep.c	Sat May  5 15:48:39 2018	(r333272)
@@ -275,6 +275,8 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	bzero(__bss_start, _end - __bss_start);
 #endif
 
+	cpu_feature_setup();
+
 #ifdef AIM
 	aim_early_init(fdt, toc, ofentry, mdp, mdp_cookie);
 #endif


More information about the svn-src-all mailing list