Hi Rob, On Mon, Feb 18, 2013 at 19:17:29, Rob Herring wrote: > On 02/18/2013 12:30 AM, Afzal Mohammed wrote: > > Register percpu local timer for scheduler tick in the case of one core > > SMP configuration. In other cases - secondary cpu's as well as boot > > cpu's having more than one core, this is being registered as per > > existing boot flow, with a difference that they happens after delay > > calibration. Registering the clock for tick in case of one core should > > be done before Kernel calibrates delay (this is required to boot, > > unless local timer is the only one registered for tick). Registering > > twd local timer at init_time (which platforms are doing now) helps > > achieve that with the proposed change. > > > > This helps in an almost booting Kernel (minimal) by only relying on > > ARM parts for an A9 one core SMP. > > arch/arm/kernel/smp_twd.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c > > index 616268c..118f4f2 100644 > > --- a/arch/arm/kernel/smp_twd.c > > +++ b/arch/arm/kernel/smp_twd.c > > @@ -335,6 +335,9 @@ static int __init twd_local_timer_common_register(struct device_node *np) > > > > twd_get_clock(np); > > > > + if (num_possible_cpus() == 1) > > + twd_timer_setup(evt); > > + > Shouldn't this be fixed in the core code, so the same issue is fixed for > all timers? Is the following that you had in mind ? (with it, this patch as well as 1/8 would not be required), diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index d3a22be..2b6417d 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h @@ -42,6 +42,8 @@ void handle_IPI(int ipinr, struct pt_regs *regs); */ extern void smp_init_cpus(void); +extern void smp_monocore_timer_setup(void); + /* * Provide a function to raise an IPI cross call on CPUs in callmap. diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 5f73f70..7431b77 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -504,6 +504,15 @@ int local_timer_register(struct local_timer_ops *ops) } #endif +void __init smp_monocore_timer_setup(void) +{ + unsigned int cpu = smp_processor_id(); + struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu); + + if (!lt_ops) + lt_ops->setup(evt); +} + static void __cpuinit percpu_timer_setup(void) { unsigned int cpu = smp_processor_id(); diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index 955d92d..eb023ee 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c @@ -116,5 +116,6 @@ int __init register_persistent_clock(clock_access_fn read_boot, void __init time_init(void) { machine_desc->init_time(); + smp_monocore_timer_setup(); sched_clock_postinit(); } Regards Afzal {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I