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 set_timebase() into get_timebase_...
details: https://anonhg.NetBSD.org/src/rev/023a28a3db0e
branches: trunk
changeset: 981226:023a28a3db0e
user: thorpej <thorpej%NetBSD.org@localhost>
date: Fri Mar 05 02:58:13 2021 +0000
description:
Split set_timebase() into get_timebase_frequency() and init_decrementer().
Call get_timebase_frequency() much earlier.
diffstat:
sys/arch/powerpc/oea/ofwoea_machdep.c | 40 ++++++++++++++++++++++------------
1 files changed, 26 insertions(+), 14 deletions(-)
diffs (118 lines):
diff -r c1b214afed3b -r 023a28a3db0e sys/arch/powerpc/oea/ofwoea_machdep.c
--- a/sys/arch/powerpc/oea/ofwoea_machdep.c Fri Mar 05 01:33:33 2021 +0000
+++ b/sys/arch/powerpc/oea/ofwoea_machdep.c Fri Mar 05 02:58:13 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ofwoea_machdep.c,v 1.57 2021/03/05 01:33:33 thorpej Exp $ */
+/* $NetBSD: ofwoea_machdep.c,v 1.58 2021/03/05 02:58:13 thorpej Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.57 2021/03/05 01:33:33 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.58 2021/03/05 02:58:13 thorpej Exp $");
#include "ksyms.h"
#include "wsdisplay.h"
@@ -136,8 +136,10 @@
extern uint32_t ns_per_tick;
extern uint32_t ticks_per_intr;
+static void get_timebase_frequency(void);
+static void init_decrementer(void);
+
static void restore_ofmap(void);
-static void set_timebase(void);
void
ofwoea_initppc(u_int startkernel, u_int endkernel, char *args)
@@ -172,6 +174,9 @@
bootpath[len] = 0;
}
+ /* Get the timebase frequency from the firmware. */
+ get_timebase_frequency();
+
/* Initialize bus_space */
ofwoea_bus_space_init();
@@ -267,8 +272,8 @@
ksyms_addsyms_elf((int)((uintptr_t)endsym - (uintptr_t)startsym), startsym, endsym);
#endif
- /* CPU clock stuff */
- set_timebase();
+ /* Kick off the clock. */
+ init_decrementer();
#ifdef DDB
if (boothowto & RB_KDB)
@@ -276,22 +281,22 @@
#endif
}
-void
-set_timebase(void)
+static void
+get_timebase_frequency(void)
{
- int qhandle, phandle, msr, scratch, node;
+ int qhandle, phandle, node;
char type[32];
if (timebase_freq != 0) {
ticks_per_sec = timebase_freq;
- goto found;
+ return;
}
node = OF_finddevice("/cpus/@0");
if (node != -1 &&
OF_getprop(node, "timebase-frequency", &ticks_per_sec,
sizeof ticks_per_sec) > 0) {
- goto found;
+ return;
}
node = OF_finddevice("/");
@@ -300,7 +305,7 @@
&& strcmp(type, "cpu") == 0
&& OF_getprop(qhandle, "timebase-frequency",
&ticks_per_sec, sizeof ticks_per_sec) > 0) {
- goto found;
+ return;
}
if ((phandle = OF_child(qhandle)))
continue;
@@ -311,8 +316,15 @@
}
}
panic("no cpu node");
+}
-found:
+static void
+init_decrementer(void)
+{
+ int scratch, msr;
+
+ KASSERT(ticks_per_sec != 0);
+
__asm volatile ("mfmsr %0; andi. %1,%0,%2; mtmsr %1"
: "=r"(msr), "=r"(scratch) : "K"((u_short)~PSL_EE));
ns_per_tick = 1000000000 / ticks_per_sec;
@@ -321,10 +333,10 @@
#ifdef PPC_OEA601
if ((mfpvr() >> 16) == MPC601)
- curcpu()->ci_lasttb = rtc_nanosecs();
+ curcpu()->ci_lasttb = rtc_nanosecs();
else
#endif
- curcpu()->ci_lasttb = mftbl();
+ curcpu()->ci_lasttb = mftbl();
mtspr(SPR_DEC, ticks_per_intr);
mtmsr(msr);
Home |
Main Index |
Thread Index |
Old Index