summaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel/time_64.c
diff options
context:
space:
mode:
authorPavel Tatashin <pasha.tatashin@oracle.com>2017-06-12 22:41:46 +0200
committerDavid S. Miller <davem@davemloft.net>2017-06-13 00:44:03 +0200
commit83e8eb99d908da78e6eff7dd141f26626fe01d12 (patch)
treee7bc4ce50b1a8543657fc236fde789928e66257c /arch/sparc/kernel/time_64.c
parentsparc64: improve modularity tick options (diff)
downloadlinux-83e8eb99d908da78e6eff7dd141f26626fe01d12.tar.xz
linux-83e8eb99d908da78e6eff7dd141f26626fe01d12.zip
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 <pasha.tatashin@oracle.com> Reviewed-by: Shannon Nelson <shannon.nelson@oracle.com> Reviewed-by: Steven Sistare <steven.sistare@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/time_64.c')
-rw-r--r--arch/sparc/kernel/time_64.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c
index 3bd9e499755b..d149276ddd80 100644
--- a/arch/sparc/kernel/time_64.c
+++ b/arch/sparc/kernel/time_64.c
@@ -49,6 +49,7 @@
#include <asm/irq_regs.h>
#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 = {
@@ -792,10 +791,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);
@@ -804,17 +801,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;