RE: [RFC 2/8] ARM: twd: register clock event for 1 core SMP

2013-02-19 Thread Mohammed, Afzal
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



Re: [RFC 2/8] ARM: twd: register clock event for 1 core SMP

2013-02-18 Thread Rob Herring
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.
 
 Signed-off-by: Afzal Mohammed af...@ti.com
 ---
  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?

Rob

   return 0;
  
  out_irq:
 

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html