|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH v2] xen/arm: split the init_xen_time() in 2 parts
On Tue, 2015-01-27 at 15:39 +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.
>
> 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().
Please put these after the first --- so they get cut from the eventual
commit log.
Apart from this the patch looks good to me, is there a reason I'm not
aware of that it is still RFC?
>
> Signed-off-by: Oleksandr Tyshchenko <oleksandr.tyshchenko@xxxxxxxxxxxxxxx>
> CC: Julien Grall <julien.grall@xxxxxxxxxx>
> ---
> xen/arch/arm/setup.c | 6 +++--
> xen/arch/arm/time.c | 62
> ++++++++++++++++++++++++++++++--------------------
> xen/include/xen/time.h | 1 +
> 3 files changed, 42 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..d442e61 100644
> --- a/xen/arch/arm/time.c
> +++ b/xen/arch/arm/time.c
> @@ -61,17 +61,17 @@ 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 const struct dt_device_match timer_ids[] __initconst =
> +{
> + DT_MATCH_TIMER,
> + { /* sentinel */ },
> +};
> +
> +/* 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);
> @@ -80,6 +80,30 @@ int __init init_xen_time(void)
>
> dt_device_set_used_by(dev, DOMID_XEN);
>
> + res = platform_init_time();
> + if ( res )
> + panic("Timer: Cannot initialize platform timer");
> +
> + 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);
> +}
> +
> +/* Set up the timer on the boot CPU (late init function) */
> +int __init init_xen_time(void)
> +{
> + struct dt_device_node *dev;
> + int res;
> + unsigned int i;
> +
> + dev = dt_find_matching_node(NULL, timer_ids);
> + if ( !dev )
> + panic("Unable to find a compatible timer in the device tree");
> +
> /* Retrieve all IRQs for the timer */
> for ( i = TIMER_PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++ )
> {
> @@ -90,27 +114,15 @@ int __init init_xen_time(void)
> 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;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |