From 2ee075bd1fb051cb3337bfaacf65d4c94bbf1561 Mon Sep 17 00:00:00 2001 From: Pavel Tatashin Date: Mon, 12 Jun 2017 16:41:46 -0400 Subject: [PATCH] sparc64: initialize time early In Linux it is possible to configure printk() to output timestamp next to every line. This is very useful to determine the slow parts of the boot process, and also to avoid regressions, as boot time is visiable to everyone. Also, there are scripts that change these time stamps to intervals. However, on larger machines these timestamps start appearing many seconds, and even minutes into the boot process. This patch gets stick-frequency property early from OpenBoot, and uses its value to initialize time stamps before the first printk() messages are printed. Signed-off-by: Pavel Tatashin Reviewed-by: Shannon Nelson Reviewed-by: Steven Sistare Signed-off-by: David S. Miller Orabug: 24401250 Orabug: 25637776 (cherry picked from commit 83e8eb99d908da78e6eff7dd141f26626fe01d12) Signed-off-by: Pavel Tatashin Signed-off-by: Allen Pais --- arch/sparc/kernel/kernel.h | 3 +++ arch/sparc/kernel/setup_64.c | 1 + arch/sparc/kernel/time_64.c | 21 ++++++++------------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/arch/sparc/kernel/kernel.h b/arch/sparc/kernel/kernel.h index 44f32dd4477f..6333ddc449a1 100644 --- a/arch/sparc/kernel/kernel.h +++ b/arch/sparc/kernel/kernel.h @@ -52,6 +52,9 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs); void do_signal32(struct pt_regs * regs); asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp); +/* time_64.c */ +void __init time_init_early(void); + /* compat_audit.c */ extern unsigned sparc32_dir_class[]; extern unsigned sparc32_chattr_class[]; diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 2286e192ff8b..410a09a107d6 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c @@ -366,6 +366,7 @@ void __init start_early_boot(void) } current_thread_info()->cpu = cpu; + time_init_early(); prom_init_report(); start_kernel(); } diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 081020194db0..3d6a52e1a14a 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c @@ -49,6 +49,7 @@ #include #include "entry.h" +#include "kernel.h" DEFINE_SPINLOCK(rtc_lock); @@ -258,9 +259,7 @@ static int stick_add_compare(unsigned long adj) static unsigned long stick_get_frequency(void) { - struct device_node *dp = of_find_node_by_path("/"); - - return of_getintprop_default(dp, "stick-frequency", 0); + return prom_getint(prom_root_node, "stick-frequency"); } static struct sparc64_tick_ops stick_operations __read_mostly = { @@ -805,10 +804,8 @@ static void init_tick_ops(struct sparc64_tick_ops *ops) tick_operations = *ops; } -void __init time_init(void) +void __init time_init_early(void) { - unsigned long freq; - if (tlb_type == spitfire) { if (is_hummingbird()) init_tick_ops(&hbtick_operations); @@ -817,17 +814,15 @@ void __init time_init(void) } else { init_tick_ops(&stick_operations); } +} + +void __init time_init(void) +{ + unsigned long freq; freq = tick_operations.frequency; tb_ticks_per_usec = freq / USEC_PER_SEC; - tick_operations.ticks_per_nsec_quotient = - clocksource_hz2mult(freq, SPARC64_NSEC_PER_CYC_SHIFT); - - tick_operations.offset = (tick_operations.get_tick() - * tick_operations.ticks_per_nsec_quotient) - >> SPARC64_NSEC_PER_CYC_SHIFT; - clocksource_tick.name = tick_operations.name; clocksource_tick.read = clocksource_tick_read; if (tlb_type == spitfire && is_hummingbird()) -- 2.50.1