// SPDX-License-Identifier: GPL-2.0 /* calibrate.c: default delay calibration * * Excised from init/main.c * Copyright (C) 1991, 1992 Linus Torvalds */ #include <linux/jiffies.h> #include <linux/delay.h> #include <linux/init.h> #include <linux/timex.h> #include <linux/smp.h> #include <linux/percpu.h> unsigned long lpj_fine; unsigned long preset_lpj; static int __init lpj_setup(char *str) { … } __setup(…); #ifdef ARCH_HAS_READ_CURRENT_TIMER /* This routine uses the read_current_timer() routine and gets the * loops per jiffy directly, instead of guessing it using delay(). * Also, this code tries to handle non-maskable asynchronous events * (like SMIs) */ #define DELAY_CALIBRATION_TICKS … #define MAX_DIRECT_CALIBRATION_RETRIES … static unsigned long calibrate_delay_direct(void) { … } #else static unsigned long calibrate_delay_direct(void) { return 0; } #endif /* * This is the number of bits of precision for the loops_per_jiffy. Each * time we refine our estimate after the first takes 1.5/HZ seconds, so try * to start with a good estimate. * For the boot cpu we can skip the delay calibration and assign it a value * calculated based on the timer frequency. * For the rest of the CPUs we cannot assume that the timer frequency is same as * the cpu frequency, hence do the calibration for those. */ #define LPS_PREC … static unsigned long calibrate_delay_converge(void) { … } static DEFINE_PER_CPU(unsigned long, cpu_loops_per_jiffy) = …; /* * Check if cpu calibration delay is already known. For example, * some processors with multi-core sockets may have all cores * with the same calibration delay. * * Architectures should override this function if a faster calibration * method is available. */ unsigned long __attribute__((weak)) calibrate_delay_is_known(void) { … } /* * Indicate the cpu delay calibration is done. This can be used by * architectures to stop accepting delay timer registrations after this point. */ void __attribute__((weak)) calibration_delay_done(void) { … } void calibrate_delay(void) { … }