From: Jun Sun <jsun@mvista.com>
To: linux-mips@oss.sgi.com
Subject: calibrating MIPS counter frequency
Date: Wed, 28 Nov 2001 14:25:47 -0800 [thread overview]
Message-ID: <3C05646B.51BF79FB@mvista.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 567 bytes --]
I wrote a little routine to calibrate CPU counter if the frequency is not
given by the board setup routine. See the patch below.
Not too much use of it right now - unless you are writing some generic MIPS
performance test program. Then you should be grateful. It removes the board
dependency.
In the future, I think mips counter frequency really should go to mips_cpu
structure. If we always know the counter frequency, either by board setup
routine or runtime calibration, we can get rid of the gettimeoffset
calibration routines.
Feedbacks are welcome.
Jun
[-- Attachment #2: calibrate_mips_counter.011128.011128.patch --]
[-- Type: text/plain, Size: 2572 bytes --]
Calibrate CPU counter frequency if it is not specified by board setup
routine. No usage for now. In the future, it should be part of
mips_cpu structure and we can get rid of the run-time gettimeoffset
calibration routines. Should also speed timer interrupt a little bit.
Jun Sun
diff -Nru linux-2.4.14/init/main.c.orig linux-2.4.14/init/main.c
--- linux-2.4.14/init/main.c.orig Fri Oct 12 10:17:15 2001
+++ linux-2.4.14/init/main.c Wed Nov 28 11:18:58 2001
@@ -539,6 +539,9 @@
* Activate the first processor.
*/
+#if defined(CONFIG_MIPS) && defined(CONFIG_NEW_TIME_C)
+extern void calibrate_mips_counter(void);
+#endif
asmlinkage void __init start_kernel(void)
{
char * command_line;
@@ -581,6 +584,9 @@
kmem_cache_init();
sti();
calibrate_delay();
+#if defined(CONFIG_MIPS) && defined(CONFIG_NEW_TIME_C)
+ calibrate_mips_counter();
+#endif
#ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start && !initrd_below_start_ok &&
initrd_start < min_low_pfn << PAGE_SHIFT) {
diff -Nru linux-2.4.14/arch/mips/kernel/time.c.orig linux-2.4.14/arch/mips/kernel/time.c
--- linux-2.4.14/arch/mips/kernel/time.c.orig Mon Nov 26 18:22:58 2001
+++ linux-2.4.14/arch/mips/kernel/time.c Wed Nov 28 13:57:23 2001
@@ -27,6 +27,7 @@
#include <asm/time.h>
#include <asm/hardirq.h>
#include <asm/div64.h>
+#include <asm/debug.h>
/* This is for machines which generate the exact clock. */
#define USECS_PER_JIFFY (1000000/HZ)
@@ -505,4 +506,47 @@
* Determine the day of week
*/
tm->tm_wday = (gday + 4) % 7; /* 1970/1/1 was Thursday */
+}
+
+/*
+ * calibrate the mips_counter_frequency
+ */
+#define CALIBRATION_CYCLES 20
+void calibrate_mips_counter(void)
+{
+ volatile unsigned long ticks;
+ volatile unsigned long countStart, countEnd;
+
+ if (mips_counter_frequency) {
+ /* it is already specified by the board */
+ return;
+ }
+
+ if ((mips_cpu.options & MIPS_CPU_COUNTER) == 0) {
+ /* we don't have cpu counter */
+ return;
+ }
+
+ printk("calibrating MIPS CPU counter frequency ...");
+
+ /* wait for the change of jiffies */
+ ticks = jiffies;
+ while (ticks == jiffies);
+
+ /* read cpu counter */
+ countStart = read_32bit_cp0_register(CP0_COUNT);
+
+ /* loop for another n jiffies */
+ ticks += CALIBRATION_CYCLES + 1;
+ while (ticks != jiffies);
+
+ /* read counter again */
+ countEnd = read_32bit_cp0_register(CP0_COUNT);
+
+ /* assuming HZ is 10's multiple */
+ db_assert((HZ % CALIBRATION_CYCLES) == 0);
+
+ mips_counter_frequency =
+ (countEnd - countStart) * (HZ / CALIBRATION_CYCLES);
+ printk(" %d Hz\n", mips_counter_frequency);
}
next reply other threads:[~2001-11-28 23:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-11-28 22:25 Jun Sun [this message]
2001-11-29 15:02 ` calibrating MIPS counter frequency Ralf Baechle
2001-11-29 15:21 ` Maciej W. Rozycki
2001-11-29 15:34 ` Alan Cox
2001-11-29 15:34 ` Alan Cox
2001-11-29 15:59 ` Ralf Baechle
2001-11-29 18:17 ` Jun Sun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3C05646B.51BF79FB@mvista.com \
--to=jsun@mvista.com \
--cc=linux-mips@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox