summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2009-12-23 04:48:42 +0000
committermarcel <marcel@FreeBSD.org>2009-12-23 04:48:42 +0000
commit6c6778bb48b1c2300ef6ed51d5ef47cbeaa34830 (patch)
tree80171d7b1c78845525ce5c95e2ea3ec5883cf92b
parent84986e81a575ba523a5119bdf147f38106fcb2c2 (diff)
downloadFreeBSD-src-6c6778bb48b1c2300ef6ed51d5ef47cbeaa34830.zip
FreeBSD-src-6c6778bb48b1c2300ef6ed51d5ef47cbeaa34830.tar.gz
Export the bus, cpu and itc frequencies under the hw.freq sysctl node.
The frequencies are in MHz (i.e. a value of 1000 represents 1GHz). The frequencies are rounded to the nearest whole MHz. While here, rename and re-type bus_frequency, processor_frequency and itc_frequency to bus_freq, cpu_freq and itc_freq and make them static. As unsigned integers, the hw.freq.cpu sysctl can more easily be made generic (across all architectures) making porting easier. MFC after: 3 days
-rw-r--r--sys/ia64/ia64/clock.c9
-rw-r--r--sys/ia64/ia64/machdep.c59
-rw-r--r--sys/ia64/include/clock.h1
-rw-r--r--sys/ia64/include/md_var.h1
4 files changed, 43 insertions, 27 deletions
diff --git a/sys/ia64/ia64/clock.c b/sys/ia64/ia64/clock.c
index 6f2e2d8..a9c39fc 100644
--- a/sys/ia64/ia64/clock.c
+++ b/sys/ia64/ia64/clock.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <machine/clock.h>
#include <machine/cpu.h>
#include <machine/efi.h>
+#include <machine/md_var.h>
uint64_t ia64_clock_reload;
@@ -78,15 +79,15 @@ pcpu_initclock(void)
void
cpu_initclocks()
{
+ u_long itc_freq;
- if (itc_frequency == 0)
- panic("Unknown clock frequency");
+ itc_freq = (u_long)ia64_itc_freq() * 1000000ul;
stathz = hz;
- ia64_clock_reload = (itc_frequency + hz/2) / hz;
+ ia64_clock_reload = (itc_freq + hz/2) / hz;
#ifndef SMP
- ia64_timecounter.tc_frequency = itc_frequency;
+ ia64_timecounter.tc_frequency = itc_freq;
tc_init(&ia64_timecounter);
#endif
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index 6d34e4d..684bf26 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -101,11 +101,21 @@ __FBSDID("$FreeBSD$");
#include <i386/include/specialreg.h>
+SYSCTL_NODE(_hw, OID_AUTO, freq, CTLFLAG_RD, 0, "");
SYSCTL_NODE(_machdep, OID_AUTO, cpu, CTLFLAG_RD, 0, "");
-u_int64_t processor_frequency;
-u_int64_t bus_frequency;
-u_int64_t itc_frequency;
+static u_int bus_freq;
+SYSCTL_UINT(_hw_freq, OID_AUTO, bus, CTLFLAG_RD, &bus_freq, 0,
+ "Bus clock frequency");
+
+static u_int cpu_freq;
+SYSCTL_UINT(_hw_freq, OID_AUTO, cpu, CTLFLAG_RD, &cpu_freq, 0,
+ "CPU clock frequency");
+
+static u_int itc_freq;
+SYSCTL_UINT(_hw_freq, OID_AUTO, itc, CTLFLAG_RD, &itc_freq, 0,
+ "ITC frequency");
+
int cold = 1;
u_int64_t pa_bootinfo;
@@ -203,9 +213,7 @@ identifycpu(void)
* (i.e. the clock frequency) to identify those.
* Allow for roughly 1% error margin.
*/
- tmp = processor_frequency >> 7;
- if ((processor_frequency - tmp) < 1*Ghz &&
- (processor_frequency + tmp) >= 1*Ghz)
+ if (cpu_freq > 990 && cpu_freq < 1010)
model_name = "Deerfield";
else
model_name = "Madison";
@@ -232,11 +240,8 @@ identifycpu(void)
features = ia64_get_cpuid(4);
printf("CPU: %s (", model_name);
- if (processor_frequency) {
- printf("%ld.%02ld-Mhz ",
- (processor_frequency + 4999) / Mhz,
- ((processor_frequency + 4999) / (Mhz/100)) % 100);
- }
+ if (cpu_freq)
+ printf("%u Mhz ", cpu_freq);
printf("%s)\n", family_name);
printf(" Origin = \"%s\" Revision = %d\n", vendor, revision);
printf(" Features = 0x%b\n", (u_int32_t) features,
@@ -396,7 +401,7 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate)
if (pcpu_find(cpu_id) == NULL || rate == NULL)
return (EINVAL);
- *rate = processor_frequency;
+ *rate = (u_long)cpu_freq * 1000000ul;
return (0);
}
@@ -600,6 +605,15 @@ map_gateway_page(void)
ia64_set_k5(VM_MAX_ADDRESS);
}
+static u_int
+freq_ratio(u_long base, u_long ratio)
+{
+ u_long f;
+
+ f = (base * (ratio >> 32)) / (ratio & 0xfffffffful);
+ return ((f + 500000) / 1000000);
+}
+
static void
calculate_frequencies(void)
{
@@ -622,15 +636,9 @@ calculate_frequencies(void)
pal.pal_result[2] >> 32,
pal.pal_result[2] & ((1L << 32) - 1));
}
- processor_frequency =
- sal.sal_result[0] * (pal.pal_result[0] >> 32)
- / (pal.pal_result[0] & ((1L << 32) - 1));
- bus_frequency =
- sal.sal_result[0] * (pal.pal_result[1] >> 32)
- / (pal.pal_result[1] & ((1L << 32) - 1));
- itc_frequency =
- sal.sal_result[0] * (pal.pal_result[2] >> 32)
- / (pal.pal_result[2] & ((1L << 32) - 1));
+ cpu_freq = freq_ratio(sal.sal_result[0], pal.pal_result[0]);
+ bus_freq = freq_ratio(sal.sal_result[0], pal.pal_result[1]);
+ itc_freq = freq_ratio(sal.sal_result[0], pal.pal_result[2]);
}
}
@@ -971,6 +979,13 @@ bzero(void *buf, size_t len)
}
}
+u_int
+ia64_itc_freq(void)
+{
+
+ return (itc_freq);
+}
+
void
DELAY(int n)
{
@@ -979,7 +994,7 @@ DELAY(int n)
sched_pin();
start = ia64_get_itc();
- end = start + (itc_frequency * n) / 1000000;
+ end = start + itc_freq * n;
/* printf("DELAY from 0x%lx to 0x%lx\n", start, end); */
do {
now = ia64_get_itc();
diff --git a/sys/ia64/include/clock.h b/sys/ia64/include/clock.h
index aa4220a..772fc2a 100644
--- a/sys/ia64/include/clock.h
+++ b/sys/ia64/include/clock.h
@@ -14,7 +14,6 @@
#define CLOCK_VECTOR 254
extern uint64_t ia64_clock_reload;
-extern uint64_t itc_frequency;
#endif
diff --git a/sys/ia64/include/md_var.h b/sys/ia64/include/md_var.h
index 6ee4cb4..7fdcb2d 100644
--- a/sys/ia64/include/md_var.h
+++ b/sys/ia64/include/md_var.h
@@ -90,6 +90,7 @@ int ia64_highfp_enable(struct thread *, struct trapframe *);
int ia64_highfp_save(struct thread *);
int ia64_highfp_save_ipi(void);
struct ia64_init_return ia64_init(void);
+u_int ia64_itc_freq(void);
void ia64_probe_sapics(void);
void ia64_sync_icache(vm_offset_t, vm_size_t);
void interrupt(struct trapframe *);
OpenPOWER on IntegriCloud