Module Name:    src
Committed By:   thorpej
Date:           Fri Feb 26 21:15:20 UTC 2021

Modified Files:
        src/sys/arch/powerpc/include/oea: cpufeat.h
        src/sys/arch/powerpc/oea: cpu_subr.c

Log Message:
Split cpu_model_init() into cpu_features_probe() and cpu_features_enable()
so that early bootstrap can do those two steps independently, if needed.

Continue to provide a cpu_model_init() wrapper for now.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/powerpc/include/oea/cpufeat.h
cvs rdiff -u -r1.106 -r1.107 src/sys/arch/powerpc/oea/cpu_subr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/include/oea/cpufeat.h
diff -u src/sys/arch/powerpc/include/oea/cpufeat.h:1.5 src/sys/arch/powerpc/include/oea/cpufeat.h:1.6
--- src/sys/arch/powerpc/include/oea/cpufeat.h:1.5	Thu Mar 22 21:26:27 2018
+++ src/sys/arch/powerpc/include/oea/cpufeat.h	Fri Feb 26 21:15:20 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufeat.h,v 1.5 2018/03/22 21:26:27 macallan Exp $ */
+/* $NetBSD: cpufeat.h,v 1.6 2021/02/26 21:15:20 thorpej Exp $ */
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,8 @@
 
 #ifndef _POWERPC_OEA_OEAFEAT_H_
 
-/* Cpu features for OEA Cpus.
+/*
+ * Cpu features for OEA Cpus.
  * These are only features that affect early bootstrap, and decisions
  * that need to be made very early on, like what pmap to use, if bats are
  * available, etc etc.  More can be added later. Some are not yet utilized.
@@ -48,7 +49,9 @@
 #define OEACPU_XBSEN		(1 << 7)	/* BATS > 256MB */
 
 #ifdef _KERNEL
-void cpu_model_init(void);
+void	cpu_features_probe(void);
+void	cpu_features_enable(void);
+void	cpu_model_init(void);
 extern unsigned long oeacpufeat;
 
 #define oea_mapiodev(addr, size) ((oeacpufeat & OEACPU_NOBAT) ? \

Index: src/sys/arch/powerpc/oea/cpu_subr.c
diff -u src/sys/arch/powerpc/oea/cpu_subr.c:1.106 src/sys/arch/powerpc/oea/cpu_subr.c:1.107
--- src/sys/arch/powerpc/oea/cpu_subr.c:1.106	Fri Feb 26 02:18:57 2021
+++ src/sys/arch/powerpc/oea/cpu_subr.c	Fri Feb 26 21:15:20 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu_subr.c,v 1.106 2021/02/26 02:18:57 thorpej Exp $	*/
+/*	$NetBSD: cpu_subr.c,v 1.107 2021/02/26 21:15:20 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2001 Matt Thomas.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.106 2021/02/26 02:18:57 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.107 2021/02/26 21:15:20 thorpej Exp $");
 
 #include "sysmon_envsys.h"
 
@@ -267,20 +267,22 @@ register_t cpu_pslusermask = 0xffff;
 
 unsigned long oeacpufeat;
 
-/* This is to be called from locore.S, and nowhere else. */
-
 void
-cpu_model_init(void)
+cpu_features_probe(void)
 {
+	static bool feature_probe_done;
+
 	u_int pvr, vers;
 
+	if (feature_probe_done) {
+		return;
+	}
+
 	pvr = mfpvr();
 	vers = pvr >> 16;
 
-	oeacpufeat = 0;
-
 	if ((vers >= IBMRS64II && vers <= IBM970GX) || vers == MPC620 ||
-		vers == IBMCELL || vers == IBMPOWER6P5) {
+	    vers == IBMCELL || vers == IBMPOWER6P5) {
 		oeacpufeat |= OEACPU_64;
 		oeacpufeat |= OEACPU_64_BRIDGE;
 		oeacpufeat |= OEACPU_NOBAT;
@@ -289,22 +291,53 @@ cpu_model_init(void)
 		oeacpufeat |= OEACPU_601;
 
 	} else if (MPC745X_P(vers)) {
-		register_t hid1 = mfspr(SPR_HID1);
-
 		if (vers != MPC7450) {
-			register_t hid0 = mfspr(SPR_HID0);
-
 			/* Enable more SPRG registers */
 			oeacpufeat |= OEACPU_HIGHSPRG;
 
 			/* Enable more BAT registers */
 			oeacpufeat |= OEACPU_HIGHBAT;
-			hid0 |= HID0_HIGH_BAT_EN;
 
 			/* Enable larger BAT registers */
 			oeacpufeat |= OEACPU_XBSEN;
+		}
+
+	} else if (vers == IBM750FX || vers == IBM750GX) {
+		oeacpufeat |= OEACPU_HIGHBAT;
+	}
+
+	feature_probe_done = true;
+}
+
+void
+cpu_features_enable(void)
+{
+	static bool feature_enable_done;
+
+	if (feature_enable_done) {
+		return;
+	}
+
+	u_int pvr, vers;
+
+	pvr = mfpvr();
+	vers = pvr >> 16;
+
+	if (MPC745X_P(vers)) {
+		register_t hid0 = mfspr(SPR_HID0);
+		register_t hid1 = mfspr(SPR_HID1);
+
+		const register_t ohid0 = hid0;
+
+		if (oeacpufeat & OEACPU_HIGHBAT) {
+			hid0 |= HID0_HIGH_BAT_EN;
+		}
+
+		if (oeacpufeat & OEACPU_XBSEN) {
 			hid0 |= HID0_XBSEN;
+		}
 
+		if (hid0 != ohid0) {
 			mtspr(SPR_HID0, hid0);
 			__asm volatile("sync;isync");
 		}
@@ -314,10 +347,22 @@ cpu_model_init(void)
 
 		mtspr(SPR_HID1, hid1);
 		__asm volatile("sync;isync");
-
-	} else if (vers == IBM750FX || vers == IBM750GX) {
-		oeacpufeat |= OEACPU_HIGHBAT;
 	}
+
+	feature_enable_done = true;
+}
+
+/* This is to be called from locore.S, and nowhere else. */
+
+void
+cpu_model_init(void)
+{
+	/*
+	 * This is just a wrapper for backwards-compatibility, and will
+	 * probably be garbage-collected in the near future.
+	 */
+	cpu_features_probe();
+	cpu_features_enable();
 }
 
 void

Reply via email to