Module: xenomai-abe
Branch: comedi
Commit: f065a4baa9f14ea7b204d2d784fd72147b04ece4
URL:    
http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=f065a4baa9f14ea7b204d2d784fd72147b04ece4

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Sep 15 17:43:23 2009 +0200

nucleus: start fixing misnomer between clock vs CPU frequency

For historical reason, we wrongly assumed cpufreq == clockfreq in the
early Xenomai days, albeit the CPU frequency may be very different
from the clock source frequency used when measuring time.

This patch contains a small set of related fixes that should be
followed by per-arch updates.

---

 include/asm-generic/bits/timeconv.h |   10 +++---
 include/asm-generic/hal.h           |   47 ++++++++++++++++++++++++++++++----
 ksrc/arch/generic/hal.c             |   16 +++++++++---
 3 files changed, 58 insertions(+), 15 deletions(-)

diff --git a/include/asm-generic/bits/timeconv.h 
b/include/asm-generic/bits/timeconv.h
index 8162369..4b8ecf1 100644
--- a/include/asm-generic/bits/timeconv.h
+++ b/include/asm-generic/bits/timeconv.h
@@ -21,7 +21,7 @@
 
 #include <asm/xenomai/arith.h>
 
-static unsigned long long cpufreq;
+static unsigned long long clockfreq;
 
 #ifdef XNARCH_HAVE_LLMULSHFT
 static unsigned int tsc_scale, tsc_shift;
@@ -71,15 +71,15 @@ long long xnarch_ns_to_tsc(long long ns)
 #else  /* !XNARCH_HAVE_LLMULSHFT */
 long long xnarch_tsc_to_ns(long long ticks)
 {
-       return xnarch_llimd(ticks, 1000000000, cpufreq);
+       return xnarch_llimd(ticks, 1000000000, clockfreq);
 }
 long long xnarch_tsc_to_ns_rounded(long long ticks)
 {
-       return (xnarch_llimd(ticks, 1000000000, cpufreq/2) + 1) / 2;
+       return (xnarch_llimd(ticks, 1000000000, clockfreq/2) + 1) / 2;
 }
 long long xnarch_ns_to_tsc(long long ns)
 {
-       return xnarch_llimd(ns, cpufreq, 1000000000);
+       return xnarch_llimd(ns, clockfreq, 1000000000);
 }
 #endif /* !XNARCH_HAVE_LLMULSHFT */
 
@@ -94,7 +94,7 @@ unsigned long long xnarch_divrem_billion(unsigned long long 
value,
 
 static inline void xnarch_init_timeconv(unsigned long long freq)
 {
-       cpufreq = freq;
+       clockfreq = freq;
 #ifdef XNARCH_HAVE_LLMULSHFT
        xnarch_init_llmulshft(1000000000, freq, &tsc_scale, &tsc_shift);
 #ifdef XNARCH_HAVE_NODIV_LLIMD
diff --git a/include/asm-generic/hal.h b/include/asm-generic/hal.h
index 244ca02..97c549e 100644
--- a/include/asm-generic/hal.h
+++ b/include/asm-generic/hal.h
@@ -46,6 +46,7 @@
 #define RTHAL_DOMAIN_ID                0x58454e4f
 
 #define RTHAL_TIMER_FREQ       (rthal_tunables.timer_freq)
+#define RTHAL_CLOCK_FREQ       (rthal_tunables.clock_freq)
 #define RTHAL_CPU_FREQ         (rthal_tunables.cpu_freq)
 #define RTHAL_NR_APCS          BITS_PER_LONG
 
@@ -177,11 +178,36 @@ typedef spinlock_t rthal_spinlock_t;
 #define rthal_emergency_console()      
ipipe_set_printk_sync(ipipe_current_domain)
 #define rthal_read_tsc(v)              ipipe_read_tsc(v)
 
+#ifdef __IPIPE_FEATURE_SYSINFO_V2
+       
 static inline unsigned long rthal_get_cpufreq(void)
 {
-    struct ipipe_sysinfo sysinfo;
-    rthal_get_sysinfo(&sysinfo);
-    return (unsigned long)sysinfo.cpufreq;
+       struct ipipe_sysinfo sysinfo;
+       rthal_get_sysinfo(&sysinfo);
+       return (unsigned long)sysinfo.sys_cpu_freq;
+}
+
+static inline unsigned long rthal_get_timerfreq(void)
+{
+       struct ipipe_sysinfo sysinfo;
+       rthal_get_sysinfo(&sysinfo);
+       return (unsigned long)sysinfo.sys_hrtimer_freq;
+}
+
+static inline unsigned long rthal_get_clockfreq(void)
+{
+       struct ipipe_sysinfo sysinfo;
+       rthal_get_sysinfo(&sysinfo);
+       return (unsigned long)sysinfo.sys_hrclock_freq;
+}
+
+#else /* !__IPIPE_FEATURE_SYSINFO_V2 */
+
+static inline unsigned long rthal_get_cpufreq(void)
+{
+       struct ipipe_sysinfo sysinfo;
+       rthal_get_sysinfo(&sysinfo);
+       return (unsigned long)sysinfo.cpufreq;
 }
 
 static inline unsigned long rthal_get_timerfreq(void)
@@ -191,6 +217,13 @@ static inline unsigned long rthal_get_timerfreq(void)
        return (unsigned long)sysinfo.archdep.tmfreq;
 }
 
+static inline unsigned long rthal_get_clockfreq(void)
+{
+       return rthal_get_cpufreq();
+}
+
+#endif /* !__IPIPE_FEATURE_SYSINFO_V2 */
+
 #define RTHAL_DECLARE_EVENT(hdlr)                                     \
 static int hdlr (unsigned event, struct ipipe_domain *ipd, void *data) \
 {                                                                     \
@@ -345,9 +378,9 @@ typedef ipipe_irq_handler_t rthal_irq_handler_t;
 typedef ipipe_irq_ackfn_t   rthal_irq_ackfn_t;
 
 struct rthal_calibration_data {
-
-    unsigned long cpu_freq;
-    unsigned long timer_freq;
+       unsigned long cpu_freq;
+       unsigned long timer_freq;
+       unsigned long clock_freq;
 };
 
 typedef int (*rthal_trap_handler_t)(unsigned trapno,
@@ -358,6 +391,8 @@ extern unsigned long rthal_cpufreq_arg;
 
 extern unsigned long rthal_timerfreq_arg;
 
+extern unsigned long rthal_clockfreq_arg;
+
 extern rthal_pipeline_stage_t rthal_domain;
 
 extern struct rthal_calibration_data rthal_tunables;
diff --git a/ksrc/arch/generic/hal.c b/ksrc/arch/generic/hal.c
index 762e544..9bb0020 100644
--- a/ksrc/arch/generic/hal.c
+++ b/ksrc/arch/generic/hal.c
@@ -58,6 +58,9 @@ module_param_named(cpufreq, rthal_cpufreq_arg, ulong, 0444);
 unsigned long rthal_timerfreq_arg;
 module_param_named(timerfreq, rthal_timerfreq_arg, ulong, 0444);
 
+unsigned long rthal_clockfreq_arg;
+module_param_named(clockfreq, rthal_clockfreq_arg, ulong, 0444);
+
 #ifdef CONFIG_SMP
 static unsigned long supported_cpus_arg = -1;
 module_param_named(supported_cpus, supported_cpus_arg, ulong, 0444);
@@ -815,13 +818,18 @@ int rthal_init(void)
     }
 #endif /* CONFIG_SMP */
 
-    /* The arch-dependent support must have updated the frequency args
-       as required. */
+    /*
+     * The arch-dependent support must have updated the various
+     * frequency args as required.
+     */
     rthal_tunables.cpu_freq = rthal_cpufreq_arg;
     rthal_tunables.timer_freq = rthal_timerfreq_arg;
+    rthal_tunables.clock_freq = rthal_clockfreq_arg;
 
-    /* Allocate a virtual interrupt to handle apcs within the Linux
-       domain. */
+    /*
+     * Allocate a virtual interrupt to handle apcs within the Linux
+     * domain.
+     */
     rthal_apc_virq = rthal_alloc_virq();
 
     if (!rthal_apc_virq) {


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to