[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3] xen/arm: split the init_xen_time() in 2 parts



On Wed, Jan 28, 2015 at 12:23 AM, Julien Grall <julien.grall@xxxxxxxxxx> wrote:
> Hi Oleksandr,
Hi Julien
>
> Thank you for the quick change.
Thank you for your suggestion.
>
> On 27/01/2015 18:59, 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@xxxxxxxxxxxxxxx>
>> CC: Julien Grall <julien.grall@xxxxxxxxxx>
>
>
> Reviewed-by: Julien Grall <julien.grall@xxxxxxxxxx>
>
> Regards,
>
>
>> ---
>> 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().
>>
>> Changes in v3:
>> 1. Store the device node for timer outside the funcs.
>>
>> ---
>>   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;
>>
>
> --
> Julien Grall



-- 

Oleksandr Tyshchenko | Embedded Dev
GlobalLogic
www.globallogic.com

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.