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. Venkataramanstatic 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 Zyngierunsigned 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 Zyngiervoid __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