Bill.Holler wrote:

> On 09/24/08 19:33, Li, Aubrey wrote:
>> Bill.Holler wrote:
>>
>>
>>> On 09/24/08 18:45, Li, Aubrey wrote:
>>>
>>>> Bill.Holler wrote:
>>>>
>>>>
>>>>
>>>>> A callback will work great.  The callback interface is in
>>>>> uts/common/sys/callb.h.  We can add a callback class such as
>>>>> #define    CB_CL_CPU_DEEP_IDLE      16
>>>>>
>>>>> cpudrv can register a CB_CL_CPU_DEEP_IDLE callback
>>>>> in its init function.
>>>>> /dev/pm can invoke callb_execute_class() CB_CL_CPU_DEEP_IDLE from
>>>>> its ioctl case.
>>>>>
>>>>> The cpudrv callback can do whatever it needs to do to enable/
>>>>> disable C-States.  The cpudrv callback can call the hpet
>>>>> interface to enable/disable the cstate_timer.
>>>>>
>>>>>
>>>>>                  power.conf
>>>>>                     |
>>>>>                     v
>>>>>                  pmconfig
>>>>>                     |
>>>>>                     v
>>>>>           pm driver's pm_ioctl
>>>>> callb_execute_class(CB_CL_CPU_DEEP_IDLE)
>>>>>                     |
>>>>>                     v
>>>>>           cpudrv callback function
>>>>>                   |   ^
>>>>>                   v   |
>>>>>      hpet.cstate_timer_[enable|disable]
>>>>>
>>>>>
>>>>>
>>>>> I believe there will be only 1 callback into cpudrv, not
>>>>> 1 callback per driver instance?
>>>>>
>>>>>
>>>>>
>>>> I think so for hpet timer enable/disable. But since idle function
>>>> is per-cpu now, I think we still need idle_cpu_no_deep_c to check
>>>> if we need to enter deep cstate on-the-fly.
>>>>
>>>> Thanks,
>>>> -Aubrey
>>>>
>>>>
>>> Can the callback change the per-cpu idle function pointers?
>>>
>>>
>>
>> It does if you want to use xcall.
>>
>> Thanks,
>> -Aubrey
>>
>
> Should cstate_timer_disable() wakeup all CPUs currently in idle
> using the HPET timer?  That might make the wakeup changeover
> code simpler because it will not have to worry about lost wakeups
> when it changes from IPI to MWAIT type wakeup.
>
Yes, good point!

Thanks,
-Aubrey

Reply via email to