timer: Reestablish init_timer(), consolidate timer initialization calls

We have known for a while that the old x86 model of calling init_timer()
in ramstage doesn't make sense on other archs (and is questionable in
general), and finally removed it with CL:219719. However, now timer
initialization is completely buried in the platform code, and it's hard
to ensure it is done in time to set up timestamps. For three out of four
non-x86 SoC vendors we have brought up for now, the timers need some
kind of SoC-specific initialization.

This patch reintroduces init_timer() as a weak function that can be
overridden by platform code. The call in ramstage is restricted to x86
(and should probably eventually be removed from there as well), and
other archs should call them at the earliest reasonable point in their
bootblock. (Only changing arm for now since arm64 and mips bootblocks
are still in very early state and should sync up to features in arm once
their requirements are better understood.) This allows us to move
timestamp_early_init() into arch code, so that we can rely on timestamps
being available at a well-defined point and initialize our base value as
early as possible. (Platforms who know that their timers start at zero
can still safely call timestamp_early_init(0) again from platform code.)

BRANCH=None
BUG=None
TEST=Booted Pinky, Blaze and Storm, compiled Daisy and Pit.

Change-Id: Iece1614b7442d4fa9ca981010e1c8497bdea308d
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/234062
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Julius Werner 2014-12-08 13:39:14 -08:00 committed by chrome-internal-fetch
commit ffaebcd378
16 changed files with 24 additions and 60 deletions

View file

@ -30,10 +30,6 @@
void bootblock_soc_init(void)
{
rk3288_init_timer();
timestamp_early_init(timestamp_get());
rkclk_init();
mmu_init();

View file

@ -40,6 +40,4 @@ static struct rk3288_timer * const timer7_ptr = (void *)TIMER7_BASE;
#define TIMER_LOAD_VAL 0xffffffff
void rk3288_init_timer(void);
#endif /* __SOC_ROCKCHIP_RK3288_TIMER_H__ */

View file

@ -39,7 +39,7 @@ void timer_monotonic_get(struct mono_time *mt)
mono_time_set_usecs(mt, timer_raw_value() / clocks_per_usec);
}
void rk3288_init_timer(void)
void init_timer(void)
{
write32(TIMER_LOAD_VAL, &timer7_ptr->timer_load_count0);
write32(TIMER_LOAD_VAL, &timer7_ptr->timer_load_count1);

View file

@ -23,11 +23,6 @@
void bootblock_soc_init(void)
{
/* kick off the multi-core timer.
* We want to do this as early as we can.
*/
mct_start();
if (get_wakeup_state() == WAKEUP_DIRECT) {
wakeup();
/* Never returns. */

View file

@ -589,9 +589,6 @@ int clock_set_rate(enum periph_id periph_id, unsigned int rate);
/* Clock gate unused IP */
void clock_gate(void);
void mct_start(void);
uint64_t mct_raw_value(void);
/* These are the ratio's for configuring ARM clock */
struct arm_clk_ratios {
unsigned int arm_freq_mhz; /* Frequency of ARM core in MHz */

View file

@ -18,13 +18,14 @@
*/
#include <arch/io.h>
#include <delay.h>
#include <soc/clk.h>
#include <stdint.h>
#include <timer.h>
static const uint32_t clocks_per_usec = MCT_HZ/1000000;
uint64_t mct_raw_value(void)
static uint64_t mct_raw_value(void)
{
uint64_t upper = readl(&exynos_mct->g_cnt_u);
uint64_t lower = readl(&exynos_mct->g_cnt_l);
@ -32,7 +33,7 @@ uint64_t mct_raw_value(void)
return (upper << 32) | lower;
}
void mct_start(void)
void init_timer(void)
{
writel(readl(&exynos_mct->g_tcon) | (0x1 << 8),
&exynos_mct->g_tcon);

View file

@ -30,11 +30,6 @@
void bootblock_soc_init(void)
{
/* kick off the multi-core timer.
* We want to do this as early as we can.
*/
mct_start();
if (get_wakeup_state() == WAKEUP_DIRECT) {
wakeup();
/* Never returns. */

View file

@ -725,9 +725,6 @@ int clock_set_rate(enum periph_id periph_id, unsigned int rate);
/* Clock gate unused IP */
void clock_gate(void);
void mct_start(void);
uint64_t mct_raw_value(void);
/* These are the ratio's for configuring ARM clock */
struct arm_clk_ratios {
unsigned int arm_freq_mhz; /* Frequency of ARM core in MHz */

View file

@ -18,13 +18,14 @@
*/
#include <arch/io.h>
#include <delay.h>
#include <soc/clk.h>
#include <stdint.h>
#include <timer.h>
static const uint32_t clocks_per_usec = MCT_HZ/1000000;
uint64_t mct_raw_value(void)
static uint64_t mct_raw_value(void)
{
uint64_t upper = readl(&exynos_mct->g_cnt_u);
uint64_t lower = readl(&exynos_mct->g_cnt_l);
@ -32,7 +33,7 @@ uint64_t mct_raw_value(void)
return (upper << 32) | lower;
}
void mct_start(void)
void init_timer(void)
{
writel(readl(&exynos_mct->g_tcon) | (0x1 << 8),
&exynos_mct->g_tcon);