xref: /linux/arch/arm64/kernel/time.c (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2985c0679SMarc Zyngier /*
3985c0679SMarc Zyngier  * Based on arch/arm/kernel/time.c
4985c0679SMarc Zyngier  *
5985c0679SMarc Zyngier  * Copyright (C) 1991, 1992, 1995  Linus Torvalds
6985c0679SMarc Zyngier  * Modifications for ARM (C) 1994-2001 Russell King
7985c0679SMarc Zyngier  * Copyright (C) 2012 ARM Ltd.
8985c0679SMarc Zyngier  */
9985c0679SMarc Zyngier 
109358d755SLorenzo Pieralisi #include <linux/clockchips.h>
11985c0679SMarc Zyngier #include <linux/export.h>
12985c0679SMarc Zyngier #include <linux/kernel.h>
13985c0679SMarc Zyngier #include <linux/interrupt.h>
14985c0679SMarc Zyngier #include <linux/time.h>
15985c0679SMarc Zyngier #include <linux/init.h>
16985c0679SMarc Zyngier #include <linux/sched.h>
17985c0679SMarc Zyngier #include <linux/smp.h>
18985c0679SMarc Zyngier #include <linux/timex.h>
19985c0679SMarc Zyngier #include <linux/errno.h>
20985c0679SMarc Zyngier #include <linux/profile.h>
21*22ecd975SMadhavan T. Venkataraman #include <linux/stacktrace.h>
22985c0679SMarc Zyngier #include <linux/syscore_ops.h>
23985c0679SMarc Zyngier #include <linux/timer.h>
24985c0679SMarc Zyngier #include <linux/irq.h>
251aee5d7aSMark Rutland #include <linux/delay.h>
260583fe47SRob Herring #include <linux/clocksource.h>
27d9177184SGeert Uytterhoeven #include <linux/of_clk.h>
28b09ca1ecSHanjun Guo #include <linux/acpi.h>
29985c0679SMarc Zyngier 
301aee5d7aSMark Rutland #include <clocksource/arm_arch_timer.h>
31985c0679SMarc Zyngier 
32985c0679SMarc Zyngier #include <asm/thread_info.h>
33e0685fa2SSteven Price #include <asm/paravirt.h>
34985c0679SMarc Zyngier 
profile_pc_cb(void * arg,unsigned long pc)35*22ecd975SMadhavan T. Venkataraman static bool profile_pc_cb(void *arg, unsigned long pc)
36*22ecd975SMadhavan T. Venkataraman {
37*22ecd975SMadhavan T. Venkataraman 	unsigned long *prof_pc = arg;
38*22ecd975SMadhavan T. Venkataraman 
39*22ecd975SMadhavan T. Venkataraman 	if (in_lock_functions(pc))
40*22ecd975SMadhavan T. Venkataraman 		return true;
41*22ecd975SMadhavan T. Venkataraman 	*prof_pc = pc;
42*22ecd975SMadhavan T. Venkataraman 	return false;
43*22ecd975SMadhavan T. Venkataraman }
44*22ecd975SMadhavan T. Venkataraman 
profile_pc(struct pt_regs * regs)45985c0679SMarc Zyngier unsigned long profile_pc(struct pt_regs *regs)
46985c0679SMarc Zyngier {
47*22ecd975SMadhavan T. Venkataraman 	unsigned long prof_pc = 0;
48985c0679SMarc Zyngier 
49*22ecd975SMadhavan T. Venkataraman 	arch_stack_walk(profile_pc_cb, &prof_pc, current, regs);
50985c0679SMarc Zyngier 
51*22ecd975SMadhavan T. Venkataraman 	return prof_pc;
52985c0679SMarc Zyngier }
53985c0679SMarc Zyngier EXPORT_SYMBOL(profile_pc);
54985c0679SMarc Zyngier 
time_init(void)55985c0679SMarc Zyngier void __init time_init(void)
56985c0679SMarc Zyngier {
571aee5d7aSMark Rutland 	u32 arch_timer_rate;
581aee5d7aSMark Rutland 
59bc3ee18aSChanho Min 	of_clk_init(NULL);
60ba5d08c0SDaniel Lezcano 	timer_probe();
611aee5d7aSMark Rutland 
629358d755SLorenzo Pieralisi 	tick_setup_hrtimer_broadcast();
639358d755SLorenzo Pieralisi 
641aee5d7aSMark Rutland 	arch_timer_rate = arch_timer_get_rate();
650583fe47SRob Herring 	if (!arch_timer_rate)
660583fe47SRob Herring 		panic("Unable to initialise architected timer.\n");
671aee5d7aSMark Rutland 
681aee5d7aSMark Rutland 	/* Calibrate the delay loop directly */
691aee5d7aSMark Rutland 	lpj_fine = arch_timer_rate / HZ;
70e0685fa2SSteven Price 
71e0685fa2SSteven Price 	pv_time_init();
72985c0679SMarc Zyngier }
73