mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-24 05:04:00 +08:00
mips: vdso: Use generic VDSO clock mode storage
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
This commit is contained in:
parent
b95a8a27c3
commit
e1bdb22ebe
@ -4,7 +4,6 @@ config MIPS
|
|||||||
default y
|
default y
|
||||||
select ARCH_32BIT_OFF_T if !64BIT
|
select ARCH_32BIT_OFF_T if !64BIT
|
||||||
select ARCH_BINFMT_ELF_STATE if MIPS_FP_SUPPORT
|
select ARCH_BINFMT_ELF_STATE if MIPS_FP_SUPPORT
|
||||||
select ARCH_CLOCKSOURCE_DATA
|
|
||||||
select ARCH_HAS_FORTIFY_SOURCE
|
select ARCH_HAS_FORTIFY_SOURCE
|
||||||
select ARCH_HAS_KCOV
|
select ARCH_HAS_KCOV
|
||||||
select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI)
|
select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI)
|
||||||
@ -38,6 +37,7 @@ config MIPS
|
|||||||
select GENERIC_SCHED_CLOCK if !CAVIUM_OCTEON_SOC
|
select GENERIC_SCHED_CLOCK if !CAVIUM_OCTEON_SOC
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select GENERIC_TIME_VSYSCALL
|
select GENERIC_TIME_VSYSCALL
|
||||||
|
select GENERIC_VDSO_CLOCK_MODE
|
||||||
select GUP_GET_PTE_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
|
select GUP_GET_PTE_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
|
||||||
select HANDLE_DOMAIN_IRQ
|
select HANDLE_DOMAIN_IRQ
|
||||||
select HAVE_ARCH_COMPILER_H
|
select HAVE_ARCH_COMPILER_H
|
||||||
|
@ -3,23 +3,11 @@
|
|||||||
* Copyright (C) 2015 Imagination Technologies
|
* Copyright (C) 2015 Imagination Technologies
|
||||||
* Author: Alex Smith <alex.smith@imgtec.com>
|
* Author: Alex Smith <alex.smith@imgtec.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __ASM_CLOCKSOURCE_H
|
#ifndef __ASM_CLOCKSOURCE_H
|
||||||
#define __ASM_CLOCKSOURCE_H
|
#define __ASM_CLOCKSOURCE_H
|
||||||
|
|
||||||
#include <linux/types.h>
|
#define VDSO_ARCH_CLOCKMODES \
|
||||||
|
VDSO_CLOCKMODE_R4K, \
|
||||||
/* VDSO clocksources. */
|
VDSO_CLOCKMODE_GIC
|
||||||
#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;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __ASM_CLOCKSOURCE_H */
|
#endif /* __ASM_CLOCKSOURCE_H */
|
||||||
|
@ -24,8 +24,6 @@
|
|||||||
|
|
||||||
#define VDSO_HAS_CLOCK_GETRES 1
|
#define VDSO_HAS_CLOCK_GETRES 1
|
||||||
|
|
||||||
#define __VDSO_USE_SYSCALL ULLONG_MAX
|
|
||||||
|
|
||||||
static __always_inline long gettimeofday_fallback(
|
static __always_inline long gettimeofday_fallback(
|
||||||
struct __kernel_old_timeval *_tv,
|
struct __kernel_old_timeval *_tv,
|
||||||
struct timezone *_tz)
|
struct timezone *_tz)
|
||||||
@ -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)
|
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
|
#ifdef CONFIG_CSRC_R4K
|
||||||
case VDSO_CLOCK_R4K:
|
if (clock_mode == VDSO_CLOCKMODE_R4K)
|
||||||
cycle_now = read_r4k_count();
|
return read_r4k_count();
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CLKSRC_MIPS_GIC
|
#ifdef CONFIG_CLKSRC_MIPS_GIC
|
||||||
case VDSO_CLOCK_GIC:
|
if (clock_mode == VDSO_CLOCKMODE_GIC)
|
||||||
cycle_now = read_gic_count(data);
|
return read_gic_count(get_vdso_data());
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
default:
|
/*
|
||||||
cycle_now = __VDSO_USE_SYSCALL;
|
* Core checks mode already. So this raced against a concurrent
|
||||||
break;
|
* update. Return something. Core will do another round see the
|
||||||
}
|
* change and fallback to syscall.
|
||||||
|
*/
|
||||||
return cycle_now;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool mips_vdso_hres_capable(void)
|
static inline bool mips_vdso_hres_capable(void)
|
||||||
|
@ -19,15 +19,6 @@ struct vdso_data *__mips_get_k_vdso_data(void)
|
|||||||
}
|
}
|
||||||
#define __arch_get_k_vdso_data __mips_get_k_vdso_data
|
#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 */
|
/* The asm-generic header needs to be included after the definitions above */
|
||||||
#include <asm-generic/vdso/vsyscall.h>
|
#include <asm-generic/vdso/vsyscall.h>
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ int __init init_r4k_clocksource(void)
|
|||||||
* by the VDSO (HWREna is configured by configure_hwrena()).
|
* by the VDSO (HWREna is configured by configure_hwrena()).
|
||||||
*/
|
*/
|
||||||
if (cpu_has_mips_r2_r6 && rdhwr_count_usable())
|
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);
|
clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
|
||||||
|
|
||||||
|
@ -155,10 +155,10 @@ static u64 gic_hpt_read(struct clocksource *cs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct clocksource gic_clocksource = {
|
static struct clocksource gic_clocksource = {
|
||||||
.name = "GIC",
|
.name = "GIC",
|
||||||
.read = gic_hpt_read,
|
.read = gic_hpt_read,
|
||||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||||
.archdata = { .vdso_clock_mode = VDSO_CLOCK_GIC },
|
.vdso_clock_mode = VDSO_CLOCKMODE_GIC,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init __gic_clocksource_init(void)
|
static int __init __gic_clocksource_init(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user