Skip to content

Commit

Permalink
mips: vdso: Use generic VDSO clock mode storage
Browse files Browse the repository at this point in the history
Switch to the generic VDSO clock mode storage.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Link: https://lkml.kernel.org/r/20200207124403.244684017@linutronix.de
  • Loading branch information
Thomas Gleixner committed Feb 17, 2020
1 parent b95a8a2 commit e1bdb22
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 50 deletions.
2 changes: 1 addition & 1 deletion arch/mips/Kconfig
Expand Up @@ -4,7 +4,6 @@ config MIPS
default y
select ARCH_32BIT_OFF_T if !64BIT
select ARCH_BINFMT_ELF_STATE if MIPS_FP_SUPPORT
select ARCH_CLOCKSOURCE_DATA
select ARCH_HAS_FORTIFY_SOURCE
select ARCH_HAS_KCOV
select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI)
Expand Down Expand Up @@ -38,6 +37,7 @@ config MIPS
select GENERIC_SCHED_CLOCK if !CAVIUM_OCTEON_SOC
select GENERIC_SMP_IDLE_THREAD
select GENERIC_TIME_VSYSCALL
select GENERIC_VDSO_CLOCK_MODE
select GUP_GET_PTE_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
select HANDLE_DOMAIN_IRQ
select HAVE_ARCH_COMPILER_H
Expand Down
18 changes: 3 additions & 15 deletions arch/mips/include/asm/clocksource.h
Expand Up @@ -3,23 +3,11 @@
* Copyright (C) 2015 Imagination Technologies
* Author: Alex Smith <alex.smith@imgtec.com>
*/

#ifndef __ASM_CLOCKSOURCE_H
#define __ASM_CLOCKSOURCE_H

#include <linux/types.h>

/* VDSO clocksources. */
#define VDSO_CLOCK_NONE 0 /* No suitable clocksource. */
#define VDSO_CLOCK_R4K 1 /* Use the coprocessor 0 count. */
#define VDSO_CLOCK_GIC 2 /* Use the GIC. */

/**
* struct arch_clocksource_data - Architecture-specific clocksource information.
* @vdso_clock_mode: Method the VDSO should use to access the clocksource.
*/
struct arch_clocksource_data {
u8 vdso_clock_mode;
};
#define VDSO_ARCH_CLOCKMODES \
VDSO_CLOCKMODE_R4K, \
VDSO_CLOCKMODE_GIC

#endif /* __ASM_CLOCKSOURCE_H */
30 changes: 10 additions & 20 deletions arch/mips/include/asm/vdso/gettimeofday.h
Expand Up @@ -24,8 +24,6 @@

#define VDSO_HAS_CLOCK_GETRES 1

#define __VDSO_USE_SYSCALL ULLONG_MAX

static __always_inline long gettimeofday_fallback(
struct __kernel_old_timeval *_tv,
struct timezone *_tz)
Expand Down Expand Up @@ -175,28 +173,20 @@ static __always_inline u64 read_gic_count(const struct vdso_data *data)

static __always_inline u64 __arch_get_hw_counter(s32 clock_mode)
{
#ifdef CONFIG_CLKSRC_MIPS_GIC
const struct vdso_data *data = get_vdso_data();
#endif
u64 cycle_now;

switch (clock_mode) {
#ifdef CONFIG_CSRC_R4K
case VDSO_CLOCK_R4K:
cycle_now = read_r4k_count();
break;
if (clock_mode == VDSO_CLOCKMODE_R4K)
return read_r4k_count();
#endif
#ifdef CONFIG_CLKSRC_MIPS_GIC
case VDSO_CLOCK_GIC:
cycle_now = read_gic_count(data);
break;
if (clock_mode == VDSO_CLOCKMODE_GIC)
return read_gic_count(get_vdso_data());
#endif
default:
cycle_now = __VDSO_USE_SYSCALL;
break;
}

return cycle_now;
/*
* Core checks mode already. So this raced against a concurrent
* update. Return something. Core will do another round see the
* change and fallback to syscall.
*/
return 0;
}

static inline bool mips_vdso_hres_capable(void)
Expand Down
9 changes: 0 additions & 9 deletions arch/mips/include/asm/vdso/vsyscall.h
Expand Up @@ -19,15 +19,6 @@ struct vdso_data *__mips_get_k_vdso_data(void)
}
#define __arch_get_k_vdso_data __mips_get_k_vdso_data

static __always_inline
int __mips_get_clock_mode(struct timekeeper *tk)
{
u32 clock_mode = tk->tkr_mono.clock->archdata.vdso_clock_mode;

return clock_mode;
}
#define __arch_get_clock_mode __mips_get_clock_mode

/* The asm-generic header needs to be included after the definitions above */
#include <asm-generic/vdso/vsyscall.h>

Expand Down
2 changes: 1 addition & 1 deletion arch/mips/kernel/csrc-r4k.c
Expand Up @@ -78,7 +78,7 @@ int __init init_r4k_clocksource(void)
* by the VDSO (HWREna is configured by configure_hwrena()).
*/
if (cpu_has_mips_r2_r6 && rdhwr_count_usable())
clocksource_mips.archdata.vdso_clock_mode = VDSO_CLOCK_R4K;
clocksource_mips.vdso_clock_mode = VDSO_CLOCKMODE_R4K;

clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);

Expand Down
8 changes: 4 additions & 4 deletions drivers/clocksource/mips-gic-timer.c
Expand Up @@ -155,10 +155,10 @@ static u64 gic_hpt_read(struct clocksource *cs)
}

static struct clocksource gic_clocksource = {
.name = "GIC",
.read = gic_hpt_read,
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
.archdata = { .vdso_clock_mode = VDSO_CLOCK_GIC },
.name = "GIC",
.read = gic_hpt_read,
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
.vdso_clock_mode = VDSO_CLOCKMODE_GIC,
};

static int __init __gic_clocksource_init(void)
Expand Down

0 comments on commit e1bdb22

Please sign in to comment.