Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/powerpc/oea Split cpu_model_init() into cpu_feature...
details: https://anonhg.NetBSD.org/src/rev/fa0ada218b53
branches: trunk
changeset: 959840:fa0ada218b53
user: thorpej <thorpej%NetBSD.org@localhost>
date: Fri Feb 26 21:15:20 2021 +0000
description:
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.
diffstat:
sys/arch/powerpc/include/oea/cpufeat.h | 9 ++-
sys/arch/powerpc/oea/cpu_subr.c | 79 ++++++++++++++++++++++++++-------
2 files changed, 68 insertions(+), 20 deletions(-)
diffs (163 lines):
diff -r a37750f2404f -r fa0ada218b53 sys/arch/powerpc/include/oea/cpufeat.h
--- a/sys/arch/powerpc/include/oea/cpufeat.h Fri Feb 26 19:25:12 2021 +0000
+++ b/sys/arch/powerpc/include/oea/cpufeat.h Fri Feb 26 21:15:20 2021 +0000
@@ -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) ? \
diff -r a37750f2404f -r fa0ada218b53 sys/arch/powerpc/oea/cpu_subr.c
--- a/sys/arch/powerpc/oea/cpu_subr.c Fri Feb 26 19:25:12 2021 +0000
+++ b/sys/arch/powerpc/oea/cpu_subr.c Fri Feb 26 21:15:20 2021 +0000
@@ -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 @@
unsigned long oeacpufeat;
-/* This is to be called from locore.S, and nowhere else. */
+void
+cpu_features_probe(void)
+{
+ static bool feature_probe_done;
-void
-cpu_model_init(void)
-{
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 @@
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 @@
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
Home |
Main Index |
Thread Index |
Old Index