|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 2/6] x86/time: refactor init_platform_time()
And accomodate platform time source initialization in
try_platform_time(). This is a preparatory patch for deferring
TSC clocksource initialization to the stage where all CPUS are
up (verify_tsc_reliability init call).
Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
---
Cc: Keir Fraser <keir@xxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
New in v2.
---
xen/arch/x86/time.c | 41 ++++++++++++++++++++++++++---------------
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index 687e39b..ed4ed24 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -533,6 +533,30 @@ static void resume_platform_timer(void)
plt_stamp = plt_src.read_counter();
}
+static int __init try_platform_timer(struct platform_timesource *pts)
+{
+ int rc = -1;
+
+ rc = pts->init(pts);
+ if ( rc <= 0 )
+ return rc;
+
+ plt_mask = (u64)~0ull >> (64 - pts->counter_bits);
+
+ set_time_scale(&plt_scale, pts->frequency);
+
+ plt_overflow_period = scale_delta(
+ 1ull << (pts->counter_bits - 1), &plt_scale);
+ init_timer(&plt_overflow_timer, plt_overflow, NULL, 0);
+ plt_src = *pts;
+ plt_overflow(NULL);
+
+ platform_timer_stamp = plt_stamp64;
+ stime_platform_stamp = NOW();
+
+ return rc;
+}
+
static void __init init_platform_timer(void)
{
static struct platform_timesource * __initdata plt_timers[] = {
@@ -549,7 +573,7 @@ static void __init init_platform_timer(void)
pts = plt_timers[i];
if ( !strcmp(opt_clocksource, pts->id) )
{
- rc = pts->init(pts);
+ rc = try_platform_timer(pts);
break;
}
}
@@ -565,26 +589,13 @@ static void __init init_platform_timer(void)
for ( i = 0; i < ARRAY_SIZE(plt_timers); i++ )
{
pts = plt_timers[i];
- if ( (rc = pts->init(pts)) > 0 )
+ if ( (rc = try_platform_timer(pts)) > 0 )
break;
}
}
BUG_ON(rc <= 0);
- plt_mask = (u64)~0ull >> (64 - pts->counter_bits);
-
- set_time_scale(&plt_scale, pts->frequency);
-
- plt_overflow_period = scale_delta(
- 1ull << (pts->counter_bits-1), &plt_scale);
- init_timer(&plt_overflow_timer, plt_overflow, NULL, 0);
- plt_src = *pts;
- plt_overflow(NULL);
-
- platform_timer_stamp = plt_stamp64;
- stime_platform_stamp = NOW();
-
printk("Platform timer is %s %s\n",
freq_string(pts->frequency), pts->name);
}
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |