From owner-svn-src-head@FreeBSD.ORG Wed Dec 23 04:48:43 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0C1BB106568B; Wed, 23 Dec 2009 04:48:43 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EE2808FC08; Wed, 23 Dec 2009 04:48:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nBN4mg82086444; Wed, 23 Dec 2009 04:48:42 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nBN4mgMW086439; Wed, 23 Dec 2009 04:48:42 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <200912230448.nBN4mgMW086439@svn.freebsd.org> From: Marcel Moolenaar Date: Wed, 23 Dec 2009 04:48:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r200889 - in head/sys/ia64: ia64 include X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Dec 2009 04:48:43 -0000 Author: marcel Date: Wed Dec 23 04:48:42 2009 New Revision: 200889 URL: http://svn.freebsd.org/changeset/base/200889 Log: 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 Modified: head/sys/ia64/ia64/clock.c head/sys/ia64/ia64/machdep.c head/sys/ia64/include/clock.h head/sys/ia64/include/md_var.h Modified: head/sys/ia64/ia64/clock.c ============================================================================== --- head/sys/ia64/ia64/clock.c Wed Dec 23 04:39:05 2009 (r200888) +++ head/sys/ia64/ia64/clock.c Wed Dec 23 04:48:42 2009 (r200889) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include 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 Modified: head/sys/ia64/ia64/machdep.c ============================================================================== --- head/sys/ia64/ia64/machdep.c Wed Dec 23 04:39:05 2009 (r200888) +++ head/sys/ia64/ia64/machdep.c Wed Dec 23 04:48:42 2009 (r200889) @@ -101,11 +101,21 @@ __FBSDID("$FreeBSD$"); #include +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 * 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(); Modified: head/sys/ia64/include/clock.h ============================================================================== --- head/sys/ia64/include/clock.h Wed Dec 23 04:39:05 2009 (r200888) +++ head/sys/ia64/include/clock.h Wed Dec 23 04:48:42 2009 (r200889) @@ -14,7 +14,6 @@ #define CLOCK_VECTOR 254 extern uint64_t ia64_clock_reload; -extern uint64_t itc_frequency; #endif Modified: head/sys/ia64/include/md_var.h ============================================================================== --- head/sys/ia64/include/md_var.h Wed Dec 23 04:39:05 2009 (r200888) +++ head/sys/ia64/include/md_var.h Wed Dec 23 04:48:42 2009 (r200889) @@ -90,6 +90,7 @@ int ia64_highfp_enable(struct thread *, 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 *);