Release 4.10 arch/arm64/include/asm/arch_timer.h
/*
* arch/arm64/include/asm/arch_timer.h
*
* Copyright (C) 2012 ARM Ltd.
* Author: Marc Zyngier <marc.zyngier@arm.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ASM_ARCH_TIMER_H
#define __ASM_ARCH_TIMER_H
#include <asm/barrier.h>
#include <asm/sysreg.h>
#include <linux/bug.h>
#include <linux/init.h>
#include <linux/jump_label.h>
#include <linux/types.h>
#include <clocksource/arm_arch_timer.h>
#if IS_ENABLED(CONFIG_FSL_ERRATUM_A008585)
extern struct static_key_false arch_timer_read_ool_enabled;
#define needs_fsl_a008585_workaround() \
static_branch_unlikely(&arch_timer_read_ool_enabled)
#else
#define needs_fsl_a008585_workaround() false
#endif
u32 __fsl_a008585_read_cntp_tval_el0(void);
u32 __fsl_a008585_read_cntv_tval_el0(void);
u64 __fsl_a008585_read_cntvct_el0(void);
/*
* The number of retries is an arbitrary value well beyond the highest number
* of iterations the loop has been observed to take.
*/
#define __fsl_a008585_read_reg(reg) ({ \
u64 _old, _new; \
int _retries = 200; \
\
do { \
_old = read_sysreg(reg); \
_new = read_sysreg(reg); \
_retries--; \
} while (unlikely(_old != _new) && _retries); \
\
WARN_ON_ONCE(!_retries); \
_new; \
})
#define arch_timer_reg_read_stable(reg) \
({ \
u64 _val; \
if (needs_fsl_a008585_workaround()) \
_val = __fsl_a008585_read_##reg(); \
else \
_val = read_sysreg(reg); \
_val; \
})
/*
* These register accessors are marked inline so the compiler can
* nicely work out which register we want, and chuck away the rest of
* the code.
*/
static __always_inline
void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
{
if (access == ARCH_TIMER_PHYS_ACCESS) {
switch (reg) {
case ARCH_TIMER_REG_CTRL:
write_sysreg(val, cntp_ctl_el0);
break;
case ARCH_TIMER_REG_TVAL:
write_sysreg(val, cntp_tval_el0);
break;
}
} else if (access == ARCH_TIMER_VIRT_ACCESS) {
switch (reg) {
case ARCH_TIMER_REG_CTRL:
write_sysreg(val, cntv_ctl_el0);
break;
case ARCH_TIMER_REG_TVAL:
write_sysreg(val, cntv_tval_el0);
break;
}
}
isb();
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
mark rutland | mark rutland | 61 | 65.59% | 2 | 40.00% |
marc zyngier | marc zyngier | 28 | 30.11% | 1 | 20.00% |
stephen boyd | stephen boyd | 4 | 4.30% | 2 | 40.00% |
| Total | 93 | 100.00% | 5 | 100.00% |
static __always_inline
u32 arch_timer_reg_read_cp15(int access, enum arch_timer_reg reg)
{
if (access == ARCH_TIMER_PHYS_ACCESS) {
switch (reg) {
case ARCH_TIMER_REG_CTRL:
return read_sysreg(cntp_ctl_el0);
case ARCH_TIMER_REG_TVAL:
return arch_timer_reg_read_stable(cntp_tval_el0);
}
} else if (access == ARCH_TIMER_VIRT_ACCESS) {
switch (reg) {
case ARCH_TIMER_REG_CTRL:
return read_sysreg(cntv_ctl_el0);
case ARCH_TIMER_REG_TVAL:
return arch_timer_reg_read_stable(cntv_tval_el0);
}
}
BUG();
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
mark rutland | mark rutland | 56 | 68.29% | 2 | 33.33% |
marc zyngier | marc zyngier | 20 | 24.39% | 1 | 16.67% |
stephen boyd | stephen boyd | 4 | 4.88% | 2 | 33.33% |
scott wood | scott wood | 2 | 2.44% | 1 | 16.67% |
| Total | 82 | 100.00% | 6 | 100.00% |
static inline u32 arch_timer_get_cntfrq(void)
{
return read_sysreg(cntfrq_el0);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
mark rutland | mark rutland | 12 | 80.00% | 2 | 66.67% |
marc zyngier | marc zyngier | 3 | 20.00% | 1 | 33.33% |
| Total | 15 | 100.00% | 3 | 100.00% |
static inline u32 arch_timer_get_cntkctl(void)
{
return read_sysreg(cntkctl_el1);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
marc zyngier | marc zyngier | 6 | 40.00% | 1 | 33.33% |
sudeep karkadanagesha | sudeep karkadanagesha | 5 | 33.33% | 1 | 33.33% |
mark rutland | mark rutland | 4 | 26.67% | 1 | 33.33% |
| Total | 15 | 100.00% | 3 | 100.00% |
static inline void arch_timer_set_cntkctl(u32 cntkctl)
{
write_sysreg(cntkctl, cntkctl_el1);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
sudeep karkadanagesha | sudeep karkadanagesha | 10 | 58.82% | 1 | 50.00% |
mark rutland | mark rutland | 7 | 41.18% | 1 | 50.00% |
| Total | 17 | 100.00% | 2 | 100.00% |
static inline u64 arch_counter_get_cntpct(void)
{
/*
* AArch64 kernel and user space mandate the use of CNTVCT.
*/
BUG();
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
sonny rao | sonny rao | 16 | 100.00% | 1 | 100.00% |
| Total | 16 | 100.00% | 1 | 100.00% |
static inline u64 arch_counter_get_cntvct(void)
{
isb();
return arch_timer_reg_read_stable(cntvct_el0);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
marc zyngier | marc zyngier | 10 | 55.56% | 1 | 20.00% |
mark rutland | mark rutland | 7 | 38.89% | 3 | 60.00% |
scott wood | scott wood | 1 | 5.56% | 1 | 20.00% |
| Total | 18 | 100.00% | 5 | 100.00% |
static inline int arch_timer_arch_init(void)
{
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
rob herring | rob herring | 12 | 100.00% | 1 | 100.00% |
| Total | 12 | 100.00% | 1 | 100.00% |
#endif
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
mark rutland | mark rutland | 163 | 45.40% | 3 | 27.27% |
marc zyngier | marc zyngier | 75 | 20.89% | 1 | 9.09% |
scott wood | scott wood | 66 | 18.38% | 1 | 9.09% |
sonny rao | sonny rao | 16 | 4.46% | 1 | 9.09% |
sudeep karkadanagesha | sudeep karkadanagesha | 15 | 4.18% | 1 | 9.09% |
rob herring | rob herring | 12 | 3.34% | 1 | 9.09% |
stephen boyd | stephen boyd | 9 | 2.51% | 2 | 18.18% |
paul walmsley | paul walmsley | 3 | 0.84% | 1 | 9.09% |
| Total | 359 | 100.00% | 11 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.