[PATCH 14/17] omap4: cpuidle: Add MPUSS RET OFF states

Santosh Shilimkar santosh.shilimkar at ti.com
Mon Feb 21 05:26:57 EST 2011


> -----Original Message-----
> From: Jean Pihet [mailto:jean.pihet at newoldbits.com]
> Sent: Monday, February 21, 2011 3:49 PM
> To: Santosh Shilimkar
> Cc: linux-omap at vger.kernel.org; khilman at ti.com; linux-arm-
> kernel at lists.infradead.org; Rajendra Nayak
> Subject: Re: [PATCH 14/17] omap4: cpuidle: Add MPUSS RET OFF states
>
> Hi Santosh,
>
[...]

>
> > + * cpuidle CORE retention support.
> > + * Currently only MPUSS latency numbers are added based on
> > + * measurements done internally. The numbers for MPUSS are
> > + * not board dependent and hence set directly here instead of
> > + * passing it from board files.
> > + */
> >  static struct cpuidle_params cpuidle_params_table[] = {
> > -       /* C1 */
> > -       {1, 2, 2, 5},
> > +       /* C1 - CPU0 WFI + CPU1 ON/OFF + MPU ON   + CORE ON */
> > +       {1,     2,      2,      5},
> > +       /* C2 - CPU0 ON + CPU1 OFF + MPU ON  + CORE ON */
> > +       {1,     140,    160,    300},
> > +       /* C3 - CPU0 OFF + CPU1 OFF + MPU CSWR + CORE ON */
> > +       {1,     200,    300,    700},
> > +       /* C4 - CPU0 OFF + CPU1 OFF + MPU OFF + CORE ON */
> > +       {1,     1400,   600,    5000},
> >  };
> >
> > +DEFINE_PER_CPU(struct cpuidle_device, omap4_idle_dev);
> > +
> > +static int omap4_idle_bm_check(void)
> > +{
> > +       /* FIXME: Populate this with CORE retention support */
> > +       return 0;
> > +}
> > +
> >  /**
> >  * omap4_enter_idle - Programs OMAP4 to enter the specified state
> >  * @dev: cpuidle device
> > @@ -57,7 +92,9 @@ static struct cpuidle_params
> cpuidle_params_table[] = {
> >  static int omap4_enter_idle(struct cpuidle_device *dev,
> >                        struct cpuidle_state *state)
> >  {
> > +       struct omap4_processor_cx *cx =
> cpuidle_get_statedata(state);
> >        struct timespec ts_preidle, ts_postidle, ts_idle;
> > +       u32 cpu1_state;
> >
> >        /* Used to keep track of the total time in idle */
> >        getnstimeofday(&ts_preidle);
> > @@ -65,28 +102,74 @@ static int omap4_enter_idle(struct
> cpuidle_device *dev,
> >        local_irq_disable();
> >        local_fiq_disable();
> >
> > -       cpu_do_idle();
>
> I think the piece of code below is rather difficult to read and
> understand. Based on the patch description and the comment here
> below
> I do not see the relation with the code.
>
There is relation. The comments are as per the conditions. And
The hardware constraint is back-ground behind the conditions.

> " On OMAP4 because of hardware constraints, no low power states are
>  targeted when both CPUs are online and in SMP mode. The low power
>  states are attempted only when secondary CPU gets offline to OFF
>  through hotplug infrastructure. "
> The test below does not seem to match this comment.
>
> > +       /*
> > +        * Special hardware/software considerations:
> > +        * 1. Do only WFI for secondary CPU(non-boot - CPU1).
> > +        *    Secondary cores are taken down only via hotplug
> path.
> The comment looks contradictory. Which one is taken OFF using this
> code, which one from hotplug?
> Does this correspond to the condition '(dev->cpu)' in the test
> below?

Yes.
>
> > +        * 2. Do only a WFI as long as in SMP mode.
> Does this correspond to the condition '(num_online_cpus() > 1)' in
> the
> test below? If so it this one triggering the low power mode for
> cpu0?
yes
>
> > +        * 3. Continue to do only WFI till CPU1 hits OFF state.
> > +        *    This is necessary to honour hardware recommondation
> > +        *    of triggeing all the possible low power modes once
> CPU1 is
> > +        *    out of coherency and in OFF mode.
> Does this correspond to the condition '(cpu1_state !=
> PWRDM_POWER_OFF)' in the test below?
>
Yes

> > +        * Update dev->last_state so that governor stats reflects
> right
> > +        * data.
> > +        */
> > +       cpu1_state = pwrdm_read_pwrst(cpu1_pd);
> > +       if ((dev->cpu) || (num_online_cpus() > 1) ||
> > +                       (cpu1_state != PWRDM_POWER_OFF)) {
> Are '||' correct here?
Yes.

> Sorry if the code behaves correctly, the remarks are about
> readability especially in the comments.
>
You got all three correct. Instead of having three If's doing
same thing I have merged them and added comments above.

And you got all of them correctly.

Regards,
Santosh



More information about the linux-arm-kernel mailing list