[ltt-dev] [PATCH] ltt: rework trace clock code for SH (version 3)
Mathieu Desnoyers
compudj at krystal.dyndns.org
Tue May 11 07:32:51 EDT 2010
* Giuseppe CAVALLARO (peppe.cavallaro at st.com) wrote:
> LTTng trace clock definitions for SuperH were broken for the new Kernels.
> The patch reviews this code using the clocksource API to handle trace clock.
> For example, on ST Kernels the TMU channel 1 continues to be used as
> clocksource and all works fine for LTT (tested on SH4 STM platforms based).
> Concerning the TMU frequency, it comes from the module_clk clock available on
> ST platforms.
> This support was only tested on ST platforms and it is turned-on for
> CPU_SH4 configurations. Other effort and tests are necessary to verify
> it on other SH architectures.
Sorry, I got a little behind on my mailbox. This patch looks good, will
merge.
Thanks,
Mathieu
>
> Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro at st.com>
> ---
> arch/sh/Kconfig | 4 +-
> arch/sh/include/asm/trace-clock.h | 19 +++++--------
> arch/sh/kernel/Makefile | 1 +
> arch/sh/kernel/trace-clock.c | 55 +++++++++++++++++++++++++++++++++++++
> 4 files changed, 65 insertions(+), 14 deletions(-)
> create mode 100644 arch/sh/kernel/trace-clock.c
>
> diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
> index 49e4572..960b2bd 100644
> --- a/arch/sh/Kconfig
> +++ b/arch/sh/Kconfig
> @@ -12,8 +12,6 @@ config SUPERH
> select HAVE_IDE
> select HAVE_LMB
> select HAVE_OPROFILE
> - select HAVE_TRACE_CLOCK
> - select HAVE_TRACE_CLOCK_32_TO_64
> select HAVE_GENERIC_DMA_COHERENT
> select HAVE_IOREMAP_PROT if MMU
> select HAVE_ARCH_TRACEHOOK
> @@ -211,6 +209,8 @@ config CPU_SH4
> select CPU_HAS_FPU if !CPU_SH4AL_DSP
> select SYS_SUPPORTS_TMU
> select SYS_SUPPORTS_HUGETLBFS if MMU
> + select HAVE_TRACE_CLOCK
> + select HAVE_TRACE_CLOCK_32_TO_64
>
> config CPU_SH4A
> bool
> diff --git a/arch/sh/include/asm/trace-clock.h b/arch/sh/include/asm/trace-clock.h
> index 7dfa042..2e90aba 100644
> --- a/arch/sh/include/asm/trace-clock.h
> +++ b/arch/sh/include/asm/trace-clock.h
> @@ -8,7 +8,7 @@
> #ifndef _ASM_SH_TRACE_CLOCK_H
> #define _ASM_SH_TRACE_CLOCK_H
>
> -#include <linux/timer.h>
> +#include <linux/clocksource.h>
> #include <asm/clock.h>
>
> /*
> @@ -24,10 +24,14 @@
> #define TC_EXPECTED_INTERRUPT_LATENCY 30
>
> extern u64 trace_clock_read_synthetic_tsc(void);
> +extern u64 sh_get_clock_frequency(void);
> +extern u32 sh_read_timer_count(void);
> +extern void get_synthetic_tsc(void);
> +extern void put_synthetic_tsc(void);
>
> static inline u32 trace_clock_read32(void)
> {
> - return get_cycles();
> + return sh_read_timer_count();
> }
>
> static inline u64 trace_clock_read64(void)
> @@ -37,13 +41,7 @@ static inline u64 trace_clock_read64(void)
>
> static inline u64 trace_clock_frequency(void)
> {
> - u64 rate;
> - struct clk *tmu1_clk;
> -
> - tmu1_clk = clk_get(NULL, "tmu1_clk");
> - rate = clk_get_rate(tmu1_clk);
> -
> - return rate;
> + return sh_get_clock_frequency();
> }
>
> static inline u32 trace_clock_freq_scale(void)
> @@ -51,9 +49,6 @@ static inline u32 trace_clock_freq_scale(void)
> return 1;
> }
>
> -extern void get_synthetic_tsc(void);
> -extern void put_synthetic_tsc(void);
> -
> static inline void get_trace_clock(void)
> {
> get_synthetic_tsc();
> diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile
> index 0d587da..91fa273 100644
> --- a/arch/sh/kernel/Makefile
> +++ b/arch/sh/kernel/Makefile
> @@ -40,5 +40,6 @@ obj-$(CONFIG_DWARF_UNWINDER) += dwarf.o
> obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_callchain.o
>
> obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) += localtimer.o
> +obj-$(CONFIG_HAVE_TRACE_CLOCK) += trace-clock.o
>
> EXTRA_CFLAGS += -Werror
> diff --git a/arch/sh/kernel/trace-clock.c b/arch/sh/kernel/trace-clock.c
> new file mode 100644
> index 0000000..0c5509b
> --- /dev/null
> +++ b/arch/sh/kernel/trace-clock.c
> @@ -0,0 +1,55 @@
> +/*
> + * arch/sh/kernel/trace-clock.c
> + *
> + * Trace clock for SuperH.
> + *
> + * Copyright (C) 2010 STMicroelectronics Ltd
> + *
> + * Author: Giuseppe Cavallaro <peppe.cavallaro at st.com>
> + *
> + * Note: currently only tested and supported on SH4 CPU
> + * (TODO: tests on other SuperH architectures).
> + */
> +
> +#include <linux/module.h>
> +#include <linux/clocksource.h>
> +#include <asm/clock.h>
> +
> +static struct clocksource *clksrc;
> +
> +/* In case of the TMU, for SH4 architectures, it returns
> + * the value of timer counter register (TCNT). */
> +u32 sh_read_timer_count(void)
> +{
> + u32 value = 0;
> +
> + if (likely(clksrc))
> + value = (u32) clksrc->read(clksrc);
> +
> + return value;
> +}
> +
> +/* Get the clock rate for the timer (e.g. TMU for SH4) */
> +u64 sh_get_clock_frequency(void)
> +{
> + u64 rate = 0;
> + struct clk *clk;
> +
> + clk = clk_get(NULL, "module_clk");
> + if (likely(clk))
> + rate = clk_get_rate(clk) / 4;
> +
> + return rate;
> +}
> +
> +/* Get the clock source needed to read the timer counter.
> + * For example a TMU channel for SH4 architectures. */
> +static __init int init_sh_clocksource(void)
> +{
> + clksrc = clocksource_get_next();
> + if (unlikely(!clksrc))
> + pr_err("%s: no clocksource found\n", __func__);
> +
> + return 0;
> +}
> +early_initcall(init_sh_clocksource);
> --
> 1.6.0.4
>
>
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list