On Fri, Nov 21, 2014 at 12:58 PM, Olof Johansson <olof@xxxxxxxxx> wrote: > On Thu, Nov 20, 2014 at 8:58 AM, Catalin Marinas > <catalin.marinas@xxxxxxx> wrote: >> Doug, >> >> On Thu, Nov 20, 2014 at 04:24:09PM +0000, Doug Anderson wrote: >>> On Thu, Nov 20, 2014 at 8:10 AM, Catalin Marinas >>> <catalin.marinas@xxxxxxx> wrote: >>> > On Wed, Oct 08, 2014 at 08:38:57AM +0100, Sonny Rao wrote: >>> >> This is a bug fix for using physical arch timers when >>> >> the arch_timer_use_virtual boolean is false. It restores the >>> >> arch_counter_get_cntpct() function after removal in >>> >> >>> >> 0d651e4e "clocksource: arch_timer: use virtual counters" >>> >> >>> >> We need this on certain ARMv7 systems which are architected like this: >>> >> >>> >> * The firmware doesn't know and doesn't care about hypervisor mode and >>> >> we don't want to add the complexity of hypervisor there. >>> >> >>> >> * The firmware isn't involved in SMP bringup or resume. >>> >> >>> >> * The ARCH timer come up with an uninitialized offset between the >>> >> virtual and physical counters. Each core gets a different random >>> >> offset. >>> >> >>> >> * The device boots in "Secure SVC" mode. >>> >> >>> >> * Nothing has touched the reset value of CNTHCTL.PL1PCEN or >>> >> CNTHCTL.PL1PCTEN (both default to 1 at reset) >>> >> >>> >> One example of such as system is RK3288 where it is much simpler to >>> >> use the physical counter since there's nobody managing the offset and >>> >> each time a core goes down and comes back up it will get reinitialized >>> >> to some other random value. >>> >> >>> >> Fixes: 0d651e4e65e9 ("clocksource: arch_timer: use virtual counters") >>> >> Cc: stable@xxxxxxxxxxxxxxx >>> >> Signed-off-by: Sonny Rao <sonnyrao@xxxxxxxxxxxx> >>> >> Acked-by: Olof Johansson <olof@xxxxxxxxx> >>> > [...] >>> >> --- a/arch/arm64/include/asm/arch_timer.h >>> >> +++ b/arch/arm64/include/asm/arch_timer.h >>> >> @@ -135,6 +135,16 @@ static inline void arch_timer_evtstrm_enable(int divider) >>> >> #endif >>> >> } >>> >> >>> >> +static inline u64 arch_counter_get_cntpct(void) >>> >> +{ >>> >> + u64 cval; >>> >> + >>> >> + isb(); >>> >> + asm volatile("mrs %0, cntpct_el0" : "=r" (cval)); >>> >> + >>> >> + return cval; >>> >> +} >>> > >>> > Sorry but I have to NAK the arm64 changes here. If the firmware is >>> > broken and does not initialise CNTVOFF properly, please fix it (at least >>> > on ARMv8 hardware). Also, on arm64 the vdso gettimeofday() >>> > implementation relies on using the virtual counter, so correct >>> > initialisation of CNTVOFF is essential. >>> >>> Sonny's patch here just makes it so that we honor the global variable. >>> My patch at <https://patchwork.kernel.org/patch/5051881/> is the one >>> that allows the global variable to be set. You can see in that patch >>> that it's impossible for the variable to be set on ARM64. >> >> It just gives people ideas ;), thinking they only need to remove >> IS_ENABLED(CONFIG_ARM) in your patch and get this working on arm64. >> >>> In previous discussions it was agreed that on ARM64 psci (or something >>> similar) was a requirement anyway and that gave us a way to get the >>> firmware involved again if we ever need to bring down a processor and >>> bring it back up in the kernel. PSCI is not a requirement for ARM32. >>> There are systems that don't get the firmware involved when a >>> processor loses state (like if it is powered off and powered on again, >>> maybe for suspend/resume) and there was pushback against the kernel >>> itself transitioning into monitor mode to init CNTVOFF in these cases. >>> People agreed a month ago that these two patches were a reasonable >>> approach for ARM32. >> >> I'm not complaining about about arm32 here, just the arm64 >> implementation. If you want to avoid #ifdefs in the arch timer driver, >> what about, for arm64, defining something like: >> >> static inline u64 arch_counter_get_cntpct(void) >> { >> /* >> * AArch64 kernel and user space mandate the use of CNTVCT. >> */ >> BUG(); >> return 0; >> } > > Seems like a reasonable approach to me. Ok, I will re-spin this one, sorry for the delay. > > > -Olof -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html