]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
clocksource/drivers/arm_arch_timer: Drop unnecessary ISB on CVAL programming
authorMarc Zyngier <maz@kernel.org>
Sun, 17 Oct 2021 12:42:19 +0000 (13:42 +0100)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Sun, 17 Oct 2021 19:47:44 +0000 (21:47 +0200)
Switching from TVAL to CVAL has a small drawback: we need an ISB
before reading the counter. We cannot get rid of it, but we can
instead remove the one that comes just after writing to CVAL.

This reduces the number of ISBs from 3 to 2 when programming
the timer.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20211017124225.3018098-12-maz@kernel.org
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
arch/arm/include/asm/arch_timer.h
arch/arm64/include/asm/arch_timer.h

index 9f4b895b78f729682ac47ef36437c517c6b80fb7..bb129b6d236614d41139d4d069f70ccb88a97d3e 100644 (file)
@@ -31,6 +31,7 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
                switch (reg) {
                case ARCH_TIMER_REG_CTRL:
                        asm volatile("mcr p15, 0, %0, c14, c2, 1" : : "r" ((u32)val));
+                       isb();
                        break;
                case ARCH_TIMER_REG_CVAL:
                        asm volatile("mcrr p15, 2, %Q0, %R0, c14" : : "r" (val));
@@ -42,6 +43,7 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
                switch (reg) {
                case ARCH_TIMER_REG_CTRL:
                        asm volatile("mcr p15, 0, %0, c14, c3, 1" : : "r" ((u32)val));
+                       isb();
                        break;
                case ARCH_TIMER_REG_CVAL:
                        asm volatile("mcrr p15, 3, %Q0, %R0, c14" : : "r" (val));
@@ -52,8 +54,6 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
        } else {
                BUILD_BUG();
        }
-
-       isb();
 }
 
 static __always_inline
index 4f4aa13dd01efd757b969289c91319c783514847..b8000ef71a2c2dc3b35cb58a3c29167733dd3cb8 100644 (file)
@@ -95,6 +95,7 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
                switch (reg) {
                case ARCH_TIMER_REG_CTRL:
                        write_sysreg(val, cntp_ctl_el0);
+                       isb();
                        break;
                case ARCH_TIMER_REG_CVAL:
                        write_sysreg(val, cntp_cval_el0);
@@ -106,6 +107,7 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
                switch (reg) {
                case ARCH_TIMER_REG_CTRL:
                        write_sysreg(val, cntv_ctl_el0);
+                       isb();
                        break;
                case ARCH_TIMER_REG_CVAL:
                        write_sysreg(val, cntv_cval_el0);
@@ -116,8 +118,6 @@ void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u64 val)
        } else {
                BUILD_BUG();
        }
-
-       isb();
 }
 
 static __always_inline