Module Name: src
Committed By: matt
Date: Fri Aug 7 00:11:08 UTC 2009
Modified Files:
src/sys/arch/evbmips/gdium: machdep.c
Log Message:
Get the CPU frequency from the PMON environment (which it provided to us).
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbmips/gdium/machdep.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/evbmips/gdium/machdep.c
diff -u src/sys/arch/evbmips/gdium/machdep.c:1.2 src/sys/arch/evbmips/gdium/machdep.c:1.3
--- src/sys/arch/evbmips/gdium/machdep.c:1.2 Thu Aug 6 16:37:01 2009
+++ src/sys/arch/evbmips/gdium/machdep.c Fri Aug 7 00:11:08 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.2 2009/08/06 16:37:01 matt Exp $ */
+/* $NetBSD: machdep.c,v 1.3 2009/08/07 00:11:08 matt Exp $ */
/*
* Copyright 2001, 2002 Wasabi Systems, Inc.
@@ -112,7 +112,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.2 2009/08/06 16:37:01 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.3 2009/08/07 00:11:08 matt Exp $");
#include "opt_ddb.h"
#include "opt_execfmt.h"
@@ -193,13 +193,13 @@
* Do all the stuff that locore normally does before calling main().
*/
void
-mach_init(int argc, char **argv, char **evnp, void *syms)
+mach_init(int argc, char **argv, char **envp, void *callvec)
{
struct gdium_config *gc = &gdium_configuration;
void *kernend, *v;
u_long first, last;
char *cp;
- int freqok, i, howto;
+ int i, howto;
psize_t memsize;
extern char edata[], end[];
@@ -232,16 +232,38 @@
gdium_cnattach(gc);
/*
- * Calibrate the timer if YAMON failed to tell us.
+ * Get the timer from PMON.
*/
- if (!freqok) {
-#if 0
- bus_space_handle_t sh;
- bus_space_map(&gc->gc_iot, MALTA_RTCADR, 2, 0, &sh);
- malta_cal_timer(&gc->gc_iot, sh);
- bus_space_unmap(&gc->gc_iot, sh, 2);
-#endif
+ for (i = 0; envp[i] != NULL; i++) {
+ if (!strncmp(envp[i], "cpuclock=", 9)) {
+ curcpu()->ci_cpu_freq =
+ strtoul(&envp[i][9], NULL, 10);
+ break;
+ }
}
+
+ if (mips_cpu_flags & CPU_MIPS_DOUBLE_COUNT)
+ curcpu()->ci_cpu_freq /= 2;
+
+ /* Compute the number of ticks for hz. */
+ curcpu()->ci_cycles_per_hz = (curcpu()->ci_cpu_freq + hz / 2) / hz;
+
+ /* Compute the delay divisor. */
+ curcpu()->ci_divisor_delay =
+ ((curcpu()->ci_cpu_freq + 500000) / 1000000);
+
+ /*
+ * Get correct cpu frequency if the CPU runs at twice the
+ * external/cp0-count frequency.
+ */
+ if (mips_cpu_flags & CPU_MIPS_DOUBLE_COUNT)
+ curcpu()->ci_cpu_freq *= 2;
+
+#ifdef DEBUG
+ printf("Timer calibration: %lu cycles/sec\n",
+ curcpu()->ci_cpu_freq);
+ delay(1000000);
+#endif
#if NCOM > 0
/*