arch/mips/kernel/time.c
Source file repositories/reference/linux-study-clean/arch/mips/kernel/time.c
File Facts
- System
- Linux kernel
- Corpus path
arch/mips/kernel/time.c- Extension
.c- Size
- 4139 bytes
- Lines
- 168
- Domain
- Architecture Layer
- Bucket
- arch/mips
- Inferred role
- Architecture Layer: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bug.hlinux/clockchips.hlinux/types.hlinux/kernel.hlinux/init.hlinux/sched.hlinux/param.hlinux/time.hlinux/timex.hlinux/smp.hlinux/spinlock.hlinux/export.hlinux/cpufreq.hlinux/delay.hasm/cpu-features.hasm/cpu-type.hasm/div64.hasm/time.h
Detected Declarations
function cpufreq_callbackfunction for_each_online_cpufunction for_each_cpufunction register_cpufreq_notifierfunction null_perf_irqfunction cpu_has_mfc0_count_bugfunction time_initmodule init register_cpufreq_notifierexport rtc_lockexport perf_irqexport mips_hpt_frequency
Annotated Snippet
core_initcall(register_cpufreq_notifier);
#endif /* CONFIG_CPU_FREQ */
/*
* forward reference
*/
DEFINE_SPINLOCK(rtc_lock);
EXPORT_SYMBOL(rtc_lock);
static int null_perf_irq(void)
{
return 0;
}
int (*perf_irq)(void) = null_perf_irq;
EXPORT_SYMBOL(perf_irq);
/*
* time_init() - it does the following things.
*
* 1) plat_time_init() -
* a) (optional) set up RTC routines,
* b) (optional) calibrate and set the mips_hpt_frequency
* (only needed if you intended to use cpu counter as timer interrupt
* source)
* 2) calculate a couple of cached variables for later usage
*/
unsigned int mips_hpt_frequency;
EXPORT_SYMBOL_GPL(mips_hpt_frequency);
static __init int cpu_has_mfc0_count_bug(void)
{
switch (current_cpu_type()) {
case CPU_R4000PC:
case CPU_R4000SC:
case CPU_R4000MC:
/*
* V3.0 is documented as suffering from the mfc0 from count bug.
* Afaik this is the last version of the R4000. Later versions
* were marketed as R4400.
*/
return 1;
case CPU_R4400PC:
case CPU_R4400SC:
case CPU_R4400MC:
/*
* The published errata for the R4400 up to 3.0 say the CPU
* has the mfc0 from count bug. This seems the last version
* produced.
*/
return 1;
}
return 0;
}
void __init time_init(void)
{
plat_time_init();
/*
* The use of the R4k timer as a clock event takes precedence;
* if reading the Count register might interfere with the timer
* interrupt, then we don't use the timer as a clock source.
* We may still use the timer as a clock source though if the
* timer interrupt isn't reliable; the interference doesn't
* matter then, because we don't use the interrupt.
*/
if (mips_clockevent_init() != 0 || !cpu_has_mfc0_count_bug())
init_mips_clocksource();
}
Annotation
- Immediate include surface: `linux/bug.h`, `linux/clockchips.h`, `linux/types.h`, `linux/kernel.h`, `linux/init.h`, `linux/sched.h`, `linux/param.h`, `linux/time.h`.
- Detected declarations: `function cpufreq_callback`, `function for_each_online_cpu`, `function for_each_cpu`, `function register_cpufreq_notifier`, `function null_perf_irq`, `function cpu_has_mfc0_count_bug`, `function time_init`, `module init register_cpufreq_notifier`, `export rtc_lock`, `export perf_irq`.
- Atlas domain: Architecture Layer / arch/mips.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.