Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f61c80e authored by Marc Zyngier's avatar Marc Zyngier
Browse files

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: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 022c03a2
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -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
+25 −0
Original line number Original line Diff line number Diff line
@@ -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;
}