Mark.Haywood at Sun.COM wrote:
> Li, Aubrey wrote:
>> Bill.Holler wrote:
>>
>>>>> Eric and I have been talking about a policy to determine which
>>>>> idle state to use. We know decision input will include:
>>>>> 1. time until next cyclic fires on this cpu.
>>>>> 2. dispatcher hint. The power-aware dispatcher will try to move
>>>>> threads off whole cpu chips based on system idleness.
>>>>> 3. User specified policy.
>>>>> 4. C-state round trip latency.
>>>>> cpu_acpi_idle() could call an idle policy function to determine
>>>>> with C state to attempt.
>>>>>
>>>>>
>>>> deeper C-state needs TSC be fixed. What's the status of it and
>>>> HPET timer?
>>>>
>>> We need systems to test TSC fixup code. There are several
>>> strategies we want to test. 1. re-sync a cpu's TSC with a master
>>> using x-call,
>>> 2. keep per-thread or per-cpu "last TST" to fixup when a thread
>>> reads an older TST (yuck). The HPET timer could be used to
>>> re-initialize TSC when all cpus have returned from a deep C-state.
>>> I am starting work on this now. I will start testing by injecting
>>> TSC
>>> clobbers during
>>> C1 idle wakeup on a Core 2 Duo until new hardware arrives.
>>>
>>
>> IA Processor families increment the TSC differently:
>> --> for Pentium M processors ( family [06H], models[09H, 0DH]
>> for Pentium 4 processors, Intel Xeon processors ( family [0FH],
>> models [ 00H, 01H, or 02H]) and for P6 family processors: TSC
>> increments with every internal processor clock cycle.
>>
>> That means Speedstep may impact the TSC on these kinds of CPU.
>> For others TSC increments at a constant rate, it should be ok.
>>
>> So, did we encountered any problem so far when SpeedStep enabled?
>
> No, because Solaris only supports SpeedStep on processors belonging to
> familoes 0xF with models >= 0x3 and familie 0x6 with models >= 0xE.
>
OK, so will the limitation be removed if TSC issue is fixed?
----snip----
family = cpuid_getfamily(CPU);
model = cpuid_getmodel(CPU);
if (!((family == 0xf && model >= 0x3) ||
(family == 0x6 && model >= 0xe))) {
ESSDEBUG(("Variant TSC not supported.\n"));
return (ESS_RET_NO_PM);
}
----snip----
Thanks,
-Aubrey