Re: [PATCH V4 6/9] cpuidle/ppc: Add basic infrastructure to enable the broadcast framework on ppc
From: Preeti U Murthy <hidden>
Date: 2013-12-02 15:31:25
Also in:
linux-pm, lkml
Hi Thomas, On 11/29/2013 05:28 PM, Thomas Gleixner wrote:
On Fri, 29 Nov 2013, Preeti U Murthy wrote:quoted
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index b44b52c..cafa788 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig@@ -129,6 +129,8 @@ config PPC select GENERIC_CMOS_UPDATE select GENERIC_TIME_VSYSCALL_OLD select GENERIC_CLOCKEVENTS + select GENERIC_CLOCKEVENTS_BROADCAST + select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCASTWhat's the point of this config switch? It's nowhere used.
When broadcast IPIs are to be sent, either the "broadcast" method associated with the local timers is used or an arch-specific method tick_broadcast() is invoked. For the latter be invoked, ARCH_HAS_TICK_BROADCAST config needs to be set. On PowerPC, the broadcast method is not associated with the local timer. Hence we invoke tick_broadcast(). This function has been added in [PATCH 2/9].
quoted
+static int broadcast_set_next_event(unsigned long evt, + struct clock_event_device *dev) +{ + return 0; +} + +static void broadcast_set_mode(enum clock_event_mode mode, + struct clock_event_device *dev) +{ + if (mode != CLOCK_EVT_MODE_ONESHOT) + broadcast_set_next_event(DECREMENTER_MAX, dev);What's the point of calling an empty function?
You are right, this should have remained a dummy function like broadcast_set_next_event() as per the design of this patchset.
quoted
+} + static void decrementer_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) {@@ -840,6 +869,19 @@ static void register_decrementer_clockevent(int cpu) clockevents_register_device(dec); } +static void register_broadcast_clockevent(int cpu) +{ + struct clock_event_device *bc_evt = &bc_timer; + + *bc_evt = broadcast_clockevent; + bc_evt->cpumask = cpu_possible_mask; + + printk_once(KERN_DEBUG "clockevent: %s mult[%x] shift[%d] cpu[%d]\n", + bc_evt->name, bc_evt->mult, bc_evt->shift, cpu); + + clockevents_register_device(bc_evt); +} + static void __init init_decrementer_clockevent(void) { int cpu = smp_processor_id();@@ -854,6 +896,19 @@ static void __init init_decrementer_clockevent(void) register_decrementer_clockevent(cpu); } +static void __init init_broadcast_clockevent(void) +{ + int cpu = smp_processor_id(); + + clockevents_calc_mult_shift(&broadcast_clockevent, ppc_tb_freq, 4); + + broadcast_clockevent.max_delta_ns = + clockevent_delta2ns(DECREMENTER_MAX, &broadcast_clockevent); + broadcast_clockevent.min_delta_ns = + clockevent_delta2ns(2, &broadcast_clockevent);clockevents_config()
Right, I will change this to call clockevents_config(). I see that this needs to be done during the initialization of the decrementer as well. Will do the same. Thank you Regards Preeti U Murthy
Thanks, tglx