clocksource/drivers/arm_arch_timer: Extend write side of timer register accessors to u64
The various accessors for the timer sysreg and MMIO registers are currently hardwired to 32bit. However, we are about to introduce the use of the CVAL registers, which require a 64bit access. Upgrade the write side of the accessors to take a 64bit value (the read side is left untouched as we don't plan to ever read back any of these registers). No functional change expected. Reviewed-by: Oliver Upton <oupton@google.com> Reviewed-by: Mark Rutland <mark.rutland@arm.com> Tested-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20211017124225.3018098-4-maz@kernel.org Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
This commit is contained in:
parent
75a5a259c0
commit
c68edf22e2
|
@ -24,15 +24,15 @@ int arch_timer_arch_init(void);
|
||||||
* the code. At least it does so with a recent GCC (4.6.3).
|
* the code. At least it does so with a recent GCC (4.6.3).
|
||||||
*/
|
*/
|
||||||
static __always_inline
|
static __always_inline
|
||||||
void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
|
void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
|
||||||
{
|
{
|
||||||
if (access == ARCH_TIMER_PHYS_ACCESS) {
|
if (access == ARCH_TIMER_PHYS_ACCESS) {
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case ARCH_TIMER_REG_CTRL:
|
case ARCH_TIMER_REG_CTRL:
|
||||||
asm volatile("mcr p15, 0, %0, c14, c2, 1" : : "r" (val));
|
asm volatile("mcr p15, 0, %0, c14, c2, 1" : : "r" ((u32)val));
|
||||||
break;
|
break;
|
||||||
case ARCH_TIMER_REG_TVAL:
|
case ARCH_TIMER_REG_TVAL:
|
||||||
asm volatile("mcr p15, 0, %0, c14, c2, 0" : : "r" (val));
|
asm volatile("mcr p15, 0, %0, c14, c2, 0" : : "r" ((u32)val));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BUILD_BUG();
|
BUILD_BUG();
|
||||||
|
@ -40,10 +40,10 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
|
||||||
} else if (access == ARCH_TIMER_VIRT_ACCESS) {
|
} else if (access == ARCH_TIMER_VIRT_ACCESS) {
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case ARCH_TIMER_REG_CTRL:
|
case ARCH_TIMER_REG_CTRL:
|
||||||
asm volatile("mcr p15, 0, %0, c14, c3, 1" : : "r" (val));
|
asm volatile("mcr p15, 0, %0, c14, c3, 1" : : "r" ((u32)val));
|
||||||
break;
|
break;
|
||||||
case ARCH_TIMER_REG_TVAL:
|
case ARCH_TIMER_REG_TVAL:
|
||||||
asm volatile("mcr p15, 0, %0, c14, c3, 0" : : "r" (val));
|
asm volatile("mcr p15, 0, %0, c14, c3, 0" : : "r" ((u32)val));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BUILD_BUG();
|
BUILD_BUG();
|
||||||
|
|
|
@ -89,7 +89,7 @@ static inline notrace u64 arch_timer_read_cntvct_el0(void)
|
||||||
* the code.
|
* the code.
|
||||||
*/
|
*/
|
||||||
static __always_inline
|
static __always_inline
|
||||||
void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
|
void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
|
||||||
{
|
{
|
||||||
if (access == ARCH_TIMER_PHYS_ACCESS) {
|
if (access == ARCH_TIMER_PHYS_ACCESS) {
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
|
|
|
@ -85,17 +85,17 @@ early_param("clocksource.arm_arch_timer.evtstrm", early_evtstrm_cfg);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static __always_inline
|
static __always_inline
|
||||||
void arch_timer_reg_write(int access, enum arch_timer_reg reg, u32 val,
|
void arch_timer_reg_write(int access, enum arch_timer_reg reg, u64 val,
|
||||||
struct clock_event_device *clk)
|
struct clock_event_device *clk)
|
||||||
{
|
{
|
||||||
if (access == ARCH_TIMER_MEM_PHYS_ACCESS) {
|
if (access == ARCH_TIMER_MEM_PHYS_ACCESS) {
|
||||||
struct arch_timer *timer = to_arch_timer(clk);
|
struct arch_timer *timer = to_arch_timer(clk);
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case ARCH_TIMER_REG_CTRL:
|
case ARCH_TIMER_REG_CTRL:
|
||||||
writel_relaxed(val, timer->base + CNTP_CTL);
|
writel_relaxed((u32)val, timer->base + CNTP_CTL);
|
||||||
break;
|
break;
|
||||||
case ARCH_TIMER_REG_TVAL:
|
case ARCH_TIMER_REG_TVAL:
|
||||||
writel_relaxed(val, timer->base + CNTP_TVAL);
|
writel_relaxed((u32)val, timer->base + CNTP_TVAL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BUILD_BUG();
|
BUILD_BUG();
|
||||||
|
@ -104,10 +104,10 @@ void arch_timer_reg_write(int access, enum arch_timer_reg reg, u32 val,
|
||||||
struct arch_timer *timer = to_arch_timer(clk);
|
struct arch_timer *timer = to_arch_timer(clk);
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case ARCH_TIMER_REG_CTRL:
|
case ARCH_TIMER_REG_CTRL:
|
||||||
writel_relaxed(val, timer->base + CNTV_CTL);
|
writel_relaxed((u32)val, timer->base + CNTV_CTL);
|
||||||
break;
|
break;
|
||||||
case ARCH_TIMER_REG_TVAL:
|
case ARCH_TIMER_REG_TVAL:
|
||||||
writel_relaxed(val, timer->base + CNTV_TVAL);
|
writel_relaxed((u32)val, timer->base + CNTV_TVAL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BUILD_BUG();
|
BUILD_BUG();
|
||||||
|
|
Loading…
Reference in New Issue