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

Commit 22953ce9 authored by Stephen Boyd's avatar Stephen Boyd Committed by Matt Wagantall
Browse files

ARM: arch_timer: resurrect cntpct for MSM users



  ARM: arch_timer: resurrect cntpct for MSM users

  We have some users of the physical counter reading function, and
  they need to work when either the cp15 or mmio timers are present
  in any configuration. Bring back the functionality and expose it
  to drivers so that the RPM code and SMEM code have proper global
  timestamps to communicate with other processors.

  Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>

  ARM64: arch_timer: resurrect cntpct for MSM users

  We have some users of the physical counter reading function, and
  they need to work when either the cp15 or mmio timers are present
  in any configuration.

  Change-Id: If37d73be1a75ef33be1e2276d4fa84740d933891
  Signed-off-by: default avatarAbhimanyu Kapur <abhimany@codeaurora.org>

[joshc: combine 32-bit and 64-bit patches, fixed up trivial add/change conflict]
Signed-off-by: default avatarJosh Cartwright <joshc@codeaurora.org>
[abhimany: fixed up trivial add/change conflict]
Signed-off-by: default avatarAbhimanyu Kapur <abhimany@codeaurora.org>
parent 22dea776
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -78,7 +78,16 @@ static inline u32 arch_timer_get_cntfrq(void)
	return val;
}

static inline u64 arch_counter_get_cntvct(void)
static inline u64 arch_counter_get_cntpct_cp15(void)
{
	u64 cval;

	isb();
	asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (cval));
	return cval;
}

static inline u64 arch_counter_get_cntvct_cp15(void)
{
	u64 cval;

+11 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ static inline void arch_timer_set_cntkctl(u32 cntkctl)
	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
}

static inline u64 arch_counter_get_cntvct(void)
static inline u64 arch_counter_get_cntvct_cp15(void)
{
	u64 cval;

@@ -114,6 +114,16 @@ static inline u64 arch_counter_get_cntvct(void)
	return cval;
}

static inline u64 arch_counter_get_cntpct_cp15(void)
{
	u64 cval;

	isb();
	asm volatile("mrs %0, cntpct_el0" : "=r" (cval));

	return cval;
}

static inline int arch_timer_arch_init(void)
{
	return 0;
+30 −2
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@
#define CNTTIDR		0x08
#define CNTTIDR_VIRT(n)	(BIT(1) << ((n) * 4))

#define CNTPCT_LO	0x00
#define CNTPCT_HI	0x04
#define CNTVCT_LO	0x08
#define CNTVCT_HI	0x0c
#define CNTFRQ		0x10
@@ -405,6 +407,19 @@ u32 arch_timer_get_rate(void)
	return arch_timer_rate;
}

static u64 arch_counter_get_cntpct_mem(void)
{
	u32 pct_lo, pct_hi, tmp_hi;

	do {
		pct_hi = readl_relaxed(arch_counter_base + CNTPCT_HI);
		pct_lo = readl_relaxed(arch_counter_base + CNTPCT_LO);
		tmp_hi = readl_relaxed(arch_counter_base + CNTPCT_HI);
	} while (pct_hi != tmp_hi);

	return ((u64) pct_hi << 32) | pct_lo;
}

static u64 arch_counter_get_cntvct_mem(void)
{
	u32 vct_lo, vct_hi, tmp_hi;
@@ -424,7 +439,7 @@ static u64 arch_counter_get_cntvct_mem(void)
 * to exist on arm64. arm doesn't use this before DT is probed so even
 * if we don't have the cp15 accessors we won't have a problem.
 */
u64 (*arch_timer_read_counter)(void) = arch_counter_get_cntvct;
u64 (*arch_timer_read_counter)(void) = arch_counter_get_cntvct_cp15;

static cycle_t arch_counter_read(struct clocksource *cs)
{
@@ -436,6 +451,19 @@ static cycle_t arch_counter_read_cc(const struct cyclecounter *cc)
	return arch_timer_read_counter();
}

u64 arch_counter_get_cntpct(void)
{
	if (arch_timer_read_counter == arch_counter_get_cntvct_cp15)
		return arch_counter_get_cntpct_cp15();
	else
		return arch_counter_get_cntpct_mem();
}

u64 arch_counter_get_cntvct(void)
{
	return arch_timer_read_counter();
}

static struct clocksource clocksource_counter = {
	.name	= "arch_sys_counter",
	.rating	= 400,
@@ -462,7 +490,7 @@ static void __init arch_counter_register(unsigned type)

	/* Register the CP15 based counter if we have one */
	if (type & ARCH_CP15_TIMER) {
		arch_timer_read_counter = arch_counter_get_cntvct;
		arch_timer_read_counter = arch_counter_get_cntvct_cp15;
	} else {
		arch_timer_read_counter = arch_counter_get_cntvct_mem;

+6 −0
Original line number Diff line number Diff line
@@ -48,6 +48,8 @@ enum arch_timer_reg {
extern u32 arch_timer_get_rate(void);
extern u64 (*arch_timer_read_counter)(void);
extern struct timecounter *arch_timer_get_timecounter(void);
extern u64 arch_counter_get_cntpct(void);
extern u64 arch_counter_get_cntvct(void);

#else

@@ -66,6 +68,10 @@ static inline struct timecounter *arch_timer_get_timecounter(void)
	return NULL;
}

static inline u64 arch_counter_get_cntpct(void) { return 0; }

static inline u64 arch_counter_get_cntvct(void) { return 0; }

#endif

#endif