peterhu 发表于 2010-10-1 20:42:05

CPU Power States

C-state
1. Overview


C-state是ACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
降低功耗,图1是C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory request,OS就不会进入C3以及之后的state。从信号上来看
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。


图 1
2. C-state Control

1)
Detect & Enable C-state

BIOS可以通过CPUID function 5 check CPU是否支持C-state,以及支持哪些C-state(C1 C1E C3 C6 C7),支持的最大的C-state也可以通过MSR去设定,默认情况下增强型C-state以及IO MWAIT Redirection是不支持的,BIOS要根据系统的需求决定是否开启支持该功能的register,对于多核的系统就需要对每颗核都要单独去配置它的C-state的支持。

2)
C-state Basic Configuration
通常情况下PPM code会根据MWAIT以及AC/BAT是否存在给出不同的配置方案如:a.当MWAIT支持的时候通常的做法是将CPU 的MWAIT(C1) 映射为ACPI C1,CPU MWAIT(C3)映射为ACPI C2 CPU MWAIT(C7)映射为ACPI C3,当AC存在时为了系统获得更高的性能通常会将MWAIT(C7)不再映射为ACPI C3,也就是支持ACPI C1 C2 两级C-state。b.当MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的support的code)。

3)
ACPI Structure For C-state

l
_OSC & _PDC
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures。
l
_CST
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
CSTPackage : Package ( Count ,
CState ,…,
CState )
其中Count表示所支持的C-state的个数
CState: Package ( Register ,
Type ,
Latency ,
Power )

Register表示OSPM调整C-state的方式,Type表示C State的类型(1=C1, 2=C2, 3=C3)。Latency表示进入该C-state的最大的延迟, Power表示在该C-state时的功耗(单位是毫瓦)。下述是一个sample code,注释部分已经讲的很明白了CPU0支持4个C-state,其中C1使用FFixedHW的方式访问,其它3个C-state都是通过P_LVL方式切入,第三和第四个Cstate都被映射到ACPI C3。

Name(_CST, Package()

{
4,
// There are four C-states defined here with three semantics

// The third and fourth C-states defined have the same C3 entry semantics

Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
1,
20, 1000},

Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
40,
750},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
60,
500},
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
250}

})

l
_CSD

C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。




3. P_LVL VS FFH

P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 的power state(C2)。
FFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS在_CST中的格式如下图2所示:


图 2
OSPM解析到该_CST structure的ID是0x7F,在切换C-state时就可能就会去用Intel特定的native 指令MWAIT去切换,其中Arg0 Arg1主要是MWAIT Extensions指令中传给ECX EAX的参数。Intel之所以将切换C-state的方式从读取P_LVL改成MWAIT指令的方式主要应该是因为性能和时间上的影响,P_LVL的方式就通过IO read 4**地址的方式去做的,IO读取是比较慢也是比较耗时的,所以改成现在通过MWAIT的方式去做,可是现在的CPU仍然可以通过开启IO MWAIT Redirection的方式支持以前的P_LVL的做法。下面的_CST是使用FFH的一个例子:
Name(_CST, Package()

{
2,
// There are four C-states defined here with three semantics

// The third and fourth C-states defined have the same C3 entry semantics

Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
0x01,
0x03, 0x000003e8},

Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
0x01,
0xf5, 0x0000015e}
})


REFF:
1.
ACPI Spec 3.0
2.
Intel Processor vendor-Specific ACPI


That’s all!

Peter

2010/9/20

[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]

peterhu 发表于 2010-10-1 20:45:45

P-state

1. Overview

CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST
(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。

2. P-state Control

1)
Detect & Enable P-state

BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。

2)
Supported P-states

当BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) 、MaxRatio、RatioStepSize、NumStates,所有这些信息都可以通过CPU MSR直接或者间接的获得,其中MinRatio MaxRatio都可以从PLATFORM_INFO中获得(不同的bits),NumStates就是二者的差,有一点需要注意的是如果NumStates > 16,RatioStepSize就会加1直至NumStates <= 16为止。CPU的工作频率 = BCLK * Ratio,旧架构的CPU BCLK通常是由clock gen给出的,通常上是100/200 MHZ。新架构下CPU clock gen是内置的,BCLK固定是100MHZ。

MinRatio = PLATFORM_INFO
MaxRatio = PLATFORM_INFO
RatioStepSize = 0x01
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1

If(NumStates > 0x10)
{
RatioStepSize += 1
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
}

3)
Turbo Mode

Turbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermal、current、power的信息从而根据这些信息动态的增大CPU以及IGPU的frequency。CPU可以工作在,Max Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 report给OSPM,另外Turbo Mode的Ratio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermal、current、power的门限值,BIOS可以通过设置这些参数影响Turbo Mode的Performance。

4)
Over Clock

某些Stepping的CPU具有Over Clock的功能,BIOS Detect并Enable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OC的CPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。

5)
ACPI Structure For P-state

l
_OSC & _PDC

_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。

l
_PSS
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
并且通过一个packaged list的形式回报出该P-State的internal CPU core frequency、typical power dissipation、control register values、status register values。第0个package表示该平台所支持的最高的P-state,第n个package表示最低的P-state。Packaged lists的格式如下所示,其中需要说明的是关于Control和Status这两个参数,其中Control表示要写到 MSR IA32_PERF_CTRL中的值,Status用于当OSPM通过WRMSR 写完IA32_PERF_CTR之后再读取IA32_PERF_STATUS中的值并和Status做比较
以确定P-state切换是否已经完成。

Name (_PSS, Package()
{
// Field Name
Field Type



Package ()
// Performance State 0 Definition – P0

{


CoreFreq,
// DWordConst


Power,
// DWordConst

TransitionLatency,
// DWordConst

BusMasterLatency,
// DWordConst

Control,
// DWordConst

Status

// DWordConst

},

.

.

.
}) // End of _PSS object
前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。

Name (_PSS, Package()

{

Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)

Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)

Package(){1400, 8200,
10, 10, 0x000E, 0x000E}
// Performance State two (P2)
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
Performance State one (P3)

Package(){1200, 8200,
10, 10, 0x000C, 0x000C}
// Performance State two (P4)

}) // End of _PSS object

另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。

l
_PCT

Performance Control用于将P-state MSR interface Report给OSPM,OSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample code,OSPM透过_PCT得知是native mode,当系统切换P-state时,它应该就会通过MSR IA32_PERF_CTRL和IA32_PERF_STATUS的方式来进行。

Name(_PCT, Package ()
// Performance Control object

{

ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
// PERF_CTRL

ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
// PERF_STATUS

}) // End of _PCT object

l
_PPC

Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSS中report的所有的P-state ; return 1就表示支持之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(\_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states。

Method (_PPC, 0)
// Performance Present Capabilities method

{

If (\_SB.DOCK)

{

Return(0) // All _PSS states available


}

If (\_SB.AC)

{

Return(1)
// States 1 and 2 available

}

Else

{

Return(2)
// State 2 available

}

} // End of _PPC method

l
_PSD

P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。

REFF:
1.
ACPI Spec 3.0
2.
Intel Processor vendor-Specific ACPI


That’s all!

Peter

2010/9/24

peterhu 发表于 2010-10-1 20:46:32

T-state

T-state1. Overview

CPU在C0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-state。T-sate全称就是Processor Throttling States,它为OSPM提供了一种通过降低Processor Performance进而降低系统负载和温度的能力,听上去可能和P-state很像,其实是有区别的,P-state通过调整CPU VID电压进而影响CPU的工作频率的方式调整系统系能,而T-state则是通过调整单位时间内CPU Clock On /(Clock On + Clock Off)的时间(也即Clock On工作占整个CPU工作时间的占空比)的方式
,影响系统的功耗和温度。

2. T-state Control

1)
MSR Based Control

BIOS可以通过IA32_CLOCK_MODULATION去Enable/Disable clock modulation,而且也可以通过该register的bit0:3 设置CPU Clock Duty Cycle。当FFH在_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATION做T-state的转换。

2)
I/O Based Control

除了基于MSR的Clock Modulation,新的CPU也支持IO emulation 的Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock Modulation,OSPM将会通过PROC_CNT register bit4:0做T-state的转换。

3)
ACPI Structure For P-state
l
_PTC

Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:

Name (_PTC, Package()
{

ResourceTemplate(){Throttling_Control_Register},
//Generic Register Descriptor

ResourceTemplate(){Throttling_Status_Register}
//Generic Register Descriptor
}) // End of _PTC

下述是一个sample code:


//

// T-State Control/Status interface

//

Method(_PTC, 0)

{

//

// IF OSPM is capable of direct access to MSR

//
Report MSR interface

// ELSE

//
Report I/O interface

//

//
PDCx = OSPM is capable of direct access to On

//
Demand throttling MSR

//

If(And(PDC0, 0x0004)) {

Return(Package() {

ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},

ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}

})

}

Return(Package() {

ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},

ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}

})

}



l
_TSS

Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
Name (_TSS, Package()
{
// Field Name
Field Type



Package ()
// Throttle State 0 Definition – T0

{


FreqPercentageOfMaximum,
// DWordConst

Power,
// DWordConst

TransitionLatency,
// DWordConst

Control,
// DWordConst

Status
// DWordConst
},
……
}

Example code 如下所示:

Method(_TSS, 0)

{

Package(){100, 1000, 0, 0x00, 0},

Package(){ 88,
875, 0, 0x1E, 0},

Package(){ 75,
750, 0, 0x1C, 0},

Package(){ 63,
625, 0, 0x1A, 0},

Package(){ 50,
500, 0, 0x18, 0},

Package(){ 38,
375, 0, 0x16, 0},

Package(){ 25,
250, 0, 0x14, 0},

Package(){ 13,
125, 0, 0x12, 0}

}


l
_TPC

Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states,0表示支持所有的T-state,1表示支持,2表示支持依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC。

l
_TSD

T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code:

Name (_TSD, Package()

{

Package(){5, 0, 0, 0xFD, 2}
// 5 entries, Revision 0, Domain 0, OSPM
Coordinate, 2 Procs


}) // End of _TSD object

REFF:
1.
ACPI Spec 3.0
2.
Intel Processor vendor-Specific ACPI


That’s all!

Peter

2010/10/01
页: [1]
查看完整版本: CPU Power States