mirror of
https://github.com/torvalds/linux
synced 2024-10-23 11:46:42 +00:00
ARM: architected timers: Add A15 specific sched_clock implementation
Provide an A15 sched_clock implementation using the virtual counter, which is thought to be more useful than the physical one in a virtualised environment, as it can offset the time spent in another VM or the hypervisor. Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
022c03a2d6
commit
3f61c80eb7
|
@ -9,11 +9,17 @@ struct arch_timer {
|
||||||
|
|
||||||
#ifdef CONFIG_ARM_ARCH_TIMER
|
#ifdef CONFIG_ARM_ARCH_TIMER
|
||||||
int arch_timer_register(struct arch_timer *);
|
int arch_timer_register(struct arch_timer *);
|
||||||
|
int arch_timer_sched_clock_init(void);
|
||||||
#else
|
#else
|
||||||
static inline int arch_timer_register(struct arch_timer *at)
|
static inline int arch_timer_register(struct arch_timer *at)
|
||||||
{
|
{
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int arch_timer_sched_clock_init(void)
|
||||||
|
{
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <asm/localtimer.h>
|
#include <asm/localtimer.h>
|
||||||
#include <asm/arch_timer.h>
|
#include <asm/arch_timer.h>
|
||||||
#include <asm/system_info.h>
|
#include <asm/system_info.h>
|
||||||
|
#include <asm/sched_clock.h>
|
||||||
|
|
||||||
static unsigned long arch_timer_rate;
|
static unsigned long arch_timer_rate;
|
||||||
static int arch_timer_ppi;
|
static int arch_timer_ppi;
|
||||||
|
@ -204,6 +205,18 @@ static inline cycle_t arch_counter_get_cntvct(void)
|
||||||
return ((cycle_t) cvalh << 32) | cvall;
|
return ((cycle_t) cvalh << 32) | cvall;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 notrace arch_counter_get_cntvct32(void)
|
||||||
|
{
|
||||||
|
cycle_t cntvct = arch_counter_get_cntvct();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The sched_clock infrastructure only knows about counters
|
||||||
|
* with at most 32bits. Forget about the upper 24 bits for the
|
||||||
|
* time being...
|
||||||
|
*/
|
||||||
|
return (u32)(cntvct & (u32)~0);
|
||||||
|
}
|
||||||
|
|
||||||
static cycle_t arch_counter_read(struct clocksource *cs)
|
static cycle_t arch_counter_read(struct clocksource *cs)
|
||||||
{
|
{
|
||||||
return arch_counter_get_cntpct();
|
return arch_counter_get_cntpct();
|
||||||
|
@ -286,3 +299,15 @@ int __init arch_timer_register(struct arch_timer *at)
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __init arch_timer_sched_clock_init(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = arch_timer_available();
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
setup_sched_clock(arch_counter_get_cntvct32, 32, arch_timer_rate);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue