* [PATCH v4] xen/arm: split the init_xen_time() in 2 parts
@ 2015-01-28 10:54 Oleksandr Tyshchenko
2015-01-28 14:06 ` Ian Campbell
2015-01-29 13:18 ` Julien Grall
0 siblings, 2 replies; 5+ messages in thread
From: Oleksandr Tyshchenko @ 2015-01-28 10:54 UTC (permalink / raw)
To: xen-devel; +Cc: julien.grall, tim, ian.campbell, stefano.stabellini
Create preinit_xen_time() and move to it minimum required
subset of operations needed to properly initialized
cpu_khz and boot_count vars. This is allow us to use udelay()
immediately after the call.
Signed-off-by: Oleksandr Tyshchenko <oleksandr.tyshchenko@globallogic.com>
Reviewed-by: Julien Grall <julien.grall@linaro.org>
---
Changes in v4:
No changes.
Changes in v3:
1. Store the device node for timer outside the funcs.
Changes in v2:
1. Move timer_ids out of the find_timer_node() and frop this func.
2. Use void as a return value for preinit_xen_time().
3. Move platform_init() before calling preinit_xen_time().
---
xen/arch/arm/setup.c | 6 ++++--
xen/arch/arm/time.c | 57 ++++++++++++++++++++++++++++----------------------
xen/include/xen/time.h | 1 +
3 files changed, 37 insertions(+), 27 deletions(-)
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index f49569d..a916ca6 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -743,6 +743,10 @@ void __init start_xen(unsigned long boot_phys_offset,
init_IRQ();
+ platform_init();
+
+ preinit_xen_time();
+
dt_uart_init();
console_init_preirq();
console_init_ring();
@@ -751,8 +755,6 @@ void __init start_xen(unsigned long boot_phys_offset,
processor_id();
- platform_init();
-
smp_init_cpus();
cpus = smp_get_max_cpus();
diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c
index 0add494..04291f9 100644
--- a/xen/arch/arm/time.c
+++ b/xen/arch/arm/time.c
@@ -61,56 +61,63 @@ unsigned int timer_get_irq(enum timer_ppi ppi)
return muldiv64(ns, 1000 * cpu_khz, SECONDS(1));
}
-/* Set up the timer on the boot CPU */
-int __init init_xen_time(void)
+static __initdata struct dt_device_node *timer;
+
+/* Set up the timer on the boot CPU (early init function) */
+void __init preinit_xen_time(void)
{
static const struct dt_device_match timer_ids[] __initconst =
{
DT_MATCH_TIMER,
{ /* sentinel */ },
};
- struct dt_device_node *dev;
int res;
- unsigned int i;
u32 rate;
- dev = dt_find_matching_node(NULL, timer_ids);
- if ( !dev )
+ timer = dt_find_matching_node(NULL, timer_ids);
+ if ( !timer )
panic("Unable to find a compatible timer in the device tree");
- dt_device_set_used_by(dev, DOMID_XEN);
+ dt_device_set_used_by(timer, DOMID_XEN);
+
+ res = platform_init_time();
+ if ( res )
+ panic("Timer: Cannot initialize platform timer");
+
+ res = dt_property_read_u32(timer, "clock-frequency", &rate);
+ if ( res )
+ cpu_khz = rate / 1000;
+ else
+ cpu_khz = READ_SYSREG32(CNTFRQ_EL0) / 1000;
+
+ boot_count = READ_SYSREG64(CNTPCT_EL0);
+}
+
+/* Set up the timer on the boot CPU (late init function) */
+int __init init_xen_time(void)
+{
+ int res;
+ unsigned int i;
/* Retrieve all IRQs for the timer */
for ( i = TIMER_PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++ )
{
- res = platform_get_irq(dev, i);
+ res = platform_get_irq(timer, i);
if ( res < 0 )
panic("Timer: Unable to retrieve IRQ %u from the device tree", i);
timer_irq[i] = res;
}
- printk("Generic Timer IRQ: phys=%u hyp=%u virt=%u\n",
- timer_irq[TIMER_PHYS_NONSECURE_PPI],
- timer_irq[TIMER_HYP_PPI],
- timer_irq[TIMER_VIRT_PPI]);
-
- res = platform_init_time();
- if ( res )
- panic("Timer: Cannot initialize platform timer");
-
/* Check that this CPU supports the Generic Timer interface */
if ( !cpu_has_gentimer )
panic("CPU does not support the Generic Timer v1 interface");
- res = dt_property_read_u32(dev, "clock-frequency", &rate);
- if ( res )
- cpu_khz = rate / 1000;
- else
- cpu_khz = READ_SYSREG32(CNTFRQ_EL0) / 1000;
-
- boot_count = READ_SYSREG64(CNTPCT_EL0);
- printk("Using generic timer at %lu KHz\n", cpu_khz);
+ printk("Generic Timer IRQ: phys=%u hyp=%u virt=%u Freq: %lu KHz\n",
+ timer_irq[TIMER_PHYS_NONSECURE_PPI],
+ timer_irq[TIMER_HYP_PPI],
+ timer_irq[TIMER_VIRT_PPI],
+ cpu_khz);
return 0;
}
diff --git a/xen/include/xen/time.h b/xen/include/xen/time.h
index 709501f..bb6259d 100644
--- a/xen/include/xen/time.h
+++ b/xen/include/xen/time.h
@@ -12,6 +12,7 @@
#include <public/xen.h>
extern int init_xen_time(void);
+void preinit_xen_time(void);
extern void cstate_restore_tsc(void);
extern unsigned long cpu_khz;
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v4] xen/arm: split the init_xen_time() in 2 parts
2015-01-28 10:54 [PATCH v4] xen/arm: split the init_xen_time() in 2 parts Oleksandr Tyshchenko
@ 2015-01-28 14:06 ` Ian Campbell
2015-01-29 13:18 ` Julien Grall
1 sibling, 0 replies; 5+ messages in thread
From: Ian Campbell @ 2015-01-28 14:06 UTC (permalink / raw)
To: Oleksandr Tyshchenko; +Cc: julien.grall, tim, stefano.stabellini, xen-devel
On Wed, 2015-01-28 at 12:54 +0200, Oleksandr Tyshchenko wrote:
> Create preinit_xen_time() and move to it minimum required
> subset of operations needed to properly initialized
> cpu_khz and boot_count vars. This is allow us to use udelay()
> immediately after the call.
>
> Signed-off-by: Oleksandr Tyshchenko <oleksandr.tyshchenko@globallogic.com>
> Reviewed-by: Julien Grall <julien.grall@linaro.org>
Acked + applied.
> ---
> Changes in v4:
> No changes.
FYI it's not generally necessary to repost just to accumulate acks, I'm
happy to do it as I commit, I think other comitters are too.
Ian.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4] xen/arm: split the init_xen_time() in 2 parts
2015-01-28 10:54 [PATCH v4] xen/arm: split the init_xen_time() in 2 parts Oleksandr Tyshchenko
2015-01-28 14:06 ` Ian Campbell
@ 2015-01-29 13:18 ` Julien Grall
2015-01-29 13:39 ` Ian Campbell
2015-01-30 15:42 ` Oleksandr Tyshchenko
1 sibling, 2 replies; 5+ messages in thread
From: Julien Grall @ 2015-01-29 13:18 UTC (permalink / raw)
To: Oleksandr Tyshchenko, xen-devel; +Cc: tim, ian.campbell, stefano.stabellini
Hi Oleksandr,
On 28/01/15 10:54, Oleksandr Tyshchenko wrote:
> diff --git a/xen/include/xen/time.h b/xen/include/xen/time.h
> index 709501f..bb6259d 100644
> --- a/xen/include/xen/time.h
> +++ b/xen/include/xen/time.h
> @@ -12,6 +12,7 @@
> #include <public/xen.h>
>
> extern int init_xen_time(void);
> +void preinit_xen_time(void);
This declaration should not be in xen/time.h but asm-arm/time.h.
I spotted a bit too late, sorry. I will send a patch for fixing it.
Regards,
--
Julien Grall
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4] xen/arm: split the init_xen_time() in 2 parts
2015-01-29 13:18 ` Julien Grall
@ 2015-01-29 13:39 ` Ian Campbell
2015-01-30 15:42 ` Oleksandr Tyshchenko
1 sibling, 0 replies; 5+ messages in thread
From: Ian Campbell @ 2015-01-29 13:39 UTC (permalink / raw)
To: Julien Grall; +Cc: Oleksandr Tyshchenko, stefano.stabellini, tim, xen-devel
On Thu, 2015-01-29 at 13:18 +0000, Julien Grall wrote:
> Hi Oleksandr,
>
> On 28/01/15 10:54, Oleksandr Tyshchenko wrote:
> > diff --git a/xen/include/xen/time.h b/xen/include/xen/time.h
> > index 709501f..bb6259d 100644
> > --- a/xen/include/xen/time.h
> > +++ b/xen/include/xen/time.h
> > @@ -12,6 +12,7 @@
> > #include <public/xen.h>
> >
> > extern int init_xen_time(void);
> > +void preinit_xen_time(void);
>
> This declaration should not be in xen/time.h but asm-arm/time.h.
>
> I spotted a bit too late, sorry.
Indeed, me too.
> I will send a patch for fixing it.
Thanks.
Ian.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4] xen/arm: split the init_xen_time() in 2 parts
2015-01-29 13:18 ` Julien Grall
2015-01-29 13:39 ` Ian Campbell
@ 2015-01-30 15:42 ` Oleksandr Tyshchenko
1 sibling, 0 replies; 5+ messages in thread
From: Oleksandr Tyshchenko @ 2015-01-30 15:42 UTC (permalink / raw)
To: Julien Grall
Cc: Stefano Stabellini, Tim Deegan, Ian Campbell,
xen-devel@lists.xen.org
On Thu, Jan 29, 2015 at 3:18 PM, Julien Grall <julien.grall@linaro.org> wrote:
> Hi Oleksandr,
Hi Julien
>
> On 28/01/15 10:54, Oleksandr Tyshchenko wrote:
>> diff --git a/xen/include/xen/time.h b/xen/include/xen/time.h
>> index 709501f..bb6259d 100644
>> --- a/xen/include/xen/time.h
>> +++ b/xen/include/xen/time.h
>> @@ -12,6 +12,7 @@
>> #include <public/xen.h>
>>
>> extern int init_xen_time(void);
>> +void preinit_xen_time(void);
>
> This declaration should not be in xen/time.h but asm-arm/time.h.
>
> I spotted a bit too late, sorry. I will send a patch for fixing it.
Thank you.
>
> Regards,
>
> --
> Julien Grall
--
Oleksandr Tyshchenko | Embedded Dev
GlobalLogic
www.globallogic.com
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-01-30 15:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-28 10:54 [PATCH v4] xen/arm: split the init_xen_time() in 2 parts Oleksandr Tyshchenko
2015-01-28 14:06 ` Ian Campbell
2015-01-29 13:18 ` Julien Grall
2015-01-29 13:39 ` Ian Campbell
2015-01-30 15:42 ` Oleksandr Tyshchenko
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.