找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 17268|回复: 2

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
" H3 z( q" F9 Z" i" }2 b
1. Overview
' z. F. j3 _/ k
' v6 d( V! K. l/ F3 X) C
7 o* I. s% {( p  xC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换4 d% a1 v) W7 `
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
7 v( f3 \& p  J- L" f  h' t: L比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。3 \# G2 _8 r  }! e5 a; c6 `) Y
. c/ K3 T( G$ T4 }4 ]" _
cstate1.jpg

! k8 u8 R1 B5 k9 r# A! Q
1

3 ~: s+ L3 b8 k2 ~+ [2. C-state Control
, h$ b& B3 f& l: A9 e: v5 K0 h/ N. S8 T* I8 n* I( K
1)* i& A' C( q3 Z8 P- u  \
Detect & Enable C-state7 h+ Q3 C2 V  i5 @4 `; `. m
" A3 F0 Q7 ^! S0 ^6 b
BIOS可以通过CPUID function 5 check CPU是否支持C-state,以及支持哪些C-stateC1 C1E C3 C6 C7),支持的最大的C-state也可以通过MSR去设定,默认情况下增强型C-state以及IO MWAIT Redirection是不支持的,BIOS要根据系统的需求决定是否开启支持该功能的register,对于多核的系统就需要对每颗核都要单独去配置它的C-state的支持。. B) d3 e" u0 j0 o) f. {% H) a
# {  ~4 z+ p9 b7 {& o
2)" a; B; n+ S) ?3 ^3 a' m
C-state Basic Configuration9 r9 u! i. o% h; @' k, Y: G
通常情况下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-stateb.MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的supportcode)。
* [, t$ T8 @2 `6 G
! Z5 q% @, I1 W- ]( P5 h- U0 \% o3)
/ @$ J: r! k# x$ P1 sACPI Structure For C-state+ `! H) {: [) v$ a! f$ {' X  M

* ?2 X, d6 @. _# X% |4 tl: \: }5 L1 _/ Z7 y& B
_OSC & _PDC
3 ^1 E* q4 F6 u_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
6 S+ d0 ]: G8 h& J/ Q% Q* J, b: sl
8 L9 {" f' O' y8 C- w8 ^/ e
_CST
" ~* \5 |! |: T8 Q_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
. K# J! F1 f& `$ Z' W7 }CSTPackage : Package ( Count ,
+ T7 S  x$ C: J5 N$ |  }CState ,…,* v5 e& N0 t4 J& s
CState )* y9 S" F3 |& P6 }9 G6 W+ T' x
其中Count表示所支持的C-state的个数% S; p5 q' X; s, [/ K8 Q
CState: Package ( Register ,
  D+ k( B  Q9 a) W0 FType ,
1 s; }) q+ y6 y  XLatency ,8 p! H) U8 x3 y  F+ V
Power )" X" D1 g* X7 Q2 C
& o  ~6 H8 {5 H8 Y2 J
Register表示OSPM调整C-state的方式,Type表示C State的类型(1=C1, 2=C2, 3=C3)Latency表示进入该C-state的最大的延迟, Power表示在该C-state时的功耗(单位是毫瓦)。下述是一个sample code,注释部分已经讲的很明白了CPU0支持4C-state,其中C1使用FFixedHW的方式访问,其它3C-state都是通过P_LVL方式切入,第三和第四个Cstate都被映射到ACPI C3
; u6 Z) O& h+ J3 B5 j0 ~
5 ^+ P7 t/ \* a6 a" G( Q- l- [4 tName(_CST, Package()
1 c# l1 d5 e" ^) v6 e6 _
0 t. X5 q! C0 i+ G/ @! }  L
{ * C4 f* w/ m6 `- H7 N. T+ |6 ^# S
4,6 V, K$ b9 h! d
// There are four C-states defined here with three semantics
& b- n* |1 B$ w' |

" L7 s, q+ P; K; ]: y8 n) M; }// The third and fourth C-states defined have the same C3 entry semantics
5 g" w7 g* W5 ]

% \9 x+ j" @3 s: V( M) E- ]% aPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
" Q2 k% ]9 r4 P4 Q7 M; e( }1,8 f; G. X0 \# u" p) n+ n/ a
20, 1000},
0 |- F8 l  k# E( ?0 N' m* f9 l. W

' G1 p2 d/ k" i3 E" p9 c' W) VPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,, n5 u# f3 z2 [7 x! K
40,
) A- ^9 ]3 }$ ^6 q) ~' [2 H& B750},
' L- l% m0 A3 n
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,- |6 x) B1 P8 }! i% F
60,
( J  b; R8 k& S& e9 a5 ?! q4 G500},
. D& L1 B$ Y- Y! s. [4 V" p
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
0 H2 x  I/ `# ]" j3 b7 w# X250}
" `$ Q8 n7 _' j  ~* A
" z6 B1 m( K/ V' S; K1 Q
})
6 I$ F# W, A6 |3 N6 u8 q* J9 g3 r  B: Y9 d6 M5 [( @
l
8 Q  N0 h# k' I
_CSD
5 `: m8 O% i8 M  I* s
* Z# T; A; g3 X, EC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。3 b9 N/ X5 }  W
+ T$ \+ U! J2 N, o% u/ q
/ E- u8 p# m9 O8 ~0 b/ D

+ r3 t, C+ P# z. U7 X+ ^$ S# Y+ k2 r2 f2 H- B+ ]' q
3. P_LVL VS FFH
$ n: K7 G2 ?/ l9 P* D
+ o6 `4 I0 j5 J& O5 r: t8 w. iP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2), ?( K9 _; E. ^# l5 r% Y
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所示:' l" ~( h, x: x1 ?4 E" G7 D
7 |3 E& D) }0 V8 I
gas2.jpg
% u* A; d' y4 u! z- W
2

/ Z7 n' @* R4 I3 C1 uOSPM解析到该_CST structureID0x7F,在切换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的一个例子:
8 G3 Z3 A4 S9 ^9 j& OName(_CST, Package()' `6 Z/ j+ p; j5 b

3 v# U& O0 G) T( d9 D1 E{
6 W! k0 ]& Y* ]2,; B' x; f7 Y8 {) s! r! S. y, ~4 B
// There are four C-states defined here with three semantics
* R% }/ K$ O- |3 E& o/ Z& @
0 ^. Y/ }0 I: A9 N
// The third and fourth C-states defined have the same C3 entry semantics0 y6 E" u  y6 C5 x3 V- G1 n+ l- D3 R
' s7 ~8 x9 `$ c  f' j
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
' M) Q, d$ Y, c+ M) Y: p2 o. H" k0x01,, \8 [/ Z. m( e: o+ r
0x03, 0x000003e8},2 a  V2 T: A: k/ p0 x; X
5 X% b; l3 S0 E  J
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
0 L' z3 Z) s3 I0 N$ H7 x0x01,( c" e& e0 M4 i
0xf5, 0x0000015e}
. ~: c6 |/ y8 B- A
}) ! n. w1 c& X  P4 [0 Z: J
/ w* H# i. Q% r3 g5 a

4 e- {! I- ?6 \2 o/ jREFF:; r) P% i9 p# Z3 P0 J& @1 g6 M
1.: i  P1 G+ I: c; D; @$ N% k
ACPI Spec 3.0
. O7 M7 J! r9 R  b/ y0 P, |5 m2.
& G7 W$ \) e, X, E) P9 sIntel Processor vendor-Specific ACPI2 U  S) o6 ~+ S9 O
! q: \. y% m. n3 M

: l. s7 S7 A7 J) a3 J0 x& }That’s all!
* O7 V. ~+ m' ~5 U
+ P/ o8 Z. z# X0 q2 W( w5 q! S' ?) nPeter
7 C8 B! B/ \- G
0 Y9 a% v* o2 |3 a6 h) W2010/9/20
4 p$ d* z: V& t: p: M# A/ }# Z  `0 W/ _* }
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
# F( t; U( [9 c0 x2 ]- }% P : _" j" c) K6 y4 Q6 r" o9 d
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
; ?( t7 g. J& g9 zEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。# ~" ]# L5 G; Z7 |: [- b

8 r) Y" `, Q0 D. W) I$ V' G2. P-state Control; J- t& I+ F3 \. r

1 }% a9 C% J% v. X9 f1)
% n# S# o0 |. K* {  H/ XDetect & Enable P-state8 m/ A. _. w4 i* ]3 a

7 b$ Y+ \- G# S# T! I9 \BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state; Y! [* [  `, ?% x! f: j9 Z) o$ T
. A$ ^+ Q8 ]3 R5 e
2)
0 i" Z% D0 m+ a' O- @; @  wSupported P-states
7 B* A' d* K5 E0 U1 E 1 V1 z8 a- L( w9 H2 _1 X
BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) MaxRatioRatioStepSizeNumStates,所有这些信息都可以通过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
; R  C6 F; {4 h- o - S7 ?8 c8 I2 v
MinRatio = PLATFORM_INFO0 @! ^, K: v6 ]' S% u. e
MaxRatio = PLATFORM_INFO1 u* q5 Z. Q4 Z+ ^( D8 }# H
RatioStepSize = 0x01
% u+ O4 }! m9 y) _$ INumStates = (MaxRatio – MinRatio) / RatioStepSize + 1+ @* \  x6 |, m3 q

% |4 R3 d# w/ R; |$ kIf(NumStates > 0x10)) @& B( v  r/ n9 M7 ]4 T3 T
{$ A% @! f# @9 \, x* g9 V" L: p# Z" T
RatioStepSize += 1" S! {) \) J  w* q6 F: W
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1- M) D9 F( t6 y( x+ t" r( y% [
}* D9 K# z9 k- k! a+ x
5 l4 Z6 t. b3 ?+ ~" f! _7 }% p2 F
3)
4 F9 W9 H$ g6 w" OTurbo Mode
4 I. i& Y7 J1 M/ L% m+ i
" G& s1 d/ e5 e* H7 cTurbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermalcurrentpower的信息从而根据这些信息动态的增大CPU以及IGPUfrequencyCPU可以工作在[Max Non-TurboMax Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 reportOSPM,另外Turbo ModeRatio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermalcurrentpower的门限值,BIOS可以通过设置这些参数影响Turbo ModePerformance
. r- c8 J+ s9 E; _ 9 B2 g: p- M; _! N, f( t$ ?: t/ K
4), a  Q- I* g6 D6 a7 o' V
Over Clock
# b+ _3 _+ Y) J0 i * M  G# M- k0 Z% F1 c1 y
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
4 f! p* ?8 a% ^+ q0 O; z% u: ^
. s8 z' N  U& p, W( h) o5)
* ^- |, j) C- w# H# m8 `5 VACPI Structure For P-state6 E7 ]- z- K+ _+ O% V9 O7 Y
3 ^. e8 y# d3 D( j0 s
l2 y: [/ ~: P1 K" S/ Z
_OSC & _PDC
1 O0 |( U5 C( ?6 Y4 D* u8 V" `
6 d9 B. ~' n7 `_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
3 v" K! C% u$ J0 U4 k4 s / {" F% ]& K/ J8 q0 i4 q5 U* `8 J8 W
l& N9 S- S5 U6 y5 m
_PSS) p  _5 N! s! C: _! _: M
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量. e0 @2 K0 l9 G8 W6 u4 ?: J1 p3 Q# E
并且通过一个packaged list的形式回报出该P-Stateinternal CPU core frequencytypical power dissipationcontrol register valuesstatus register values。第0package表示该平台所支持的最高的P-state,第npackage表示最低的P-statePackaged lists的格式如下所示,其中需要说明的是关于ControlStatus这两个参数,其中Control表示要写到 MSR IA32_PERF_CTRL中的值,Status用于当OSPM通过WRMSR 写完IA32_PERF_CTR之后再读取IA32_PERF_STATUS中的值并和Status做比较
- x2 a$ T% Q8 `7 O! Y" h. U7 j* e/ ^以确定P-state切换是否已经完成。& H  D5 ]$ m* F

" G+ ~7 x/ u2 M/ }. AName (_PSS, Package()
% Y+ E3 m. w, D' p{
6 c% X# a) [, \& k' `// Field Name
: a' p" d! C  I! zField Type
; I' i5 e/ k3 z% y& a, l! k# w# E2 E3 N3 Z

1 Z, E3 D/ X5 o8 f+ ^7 J- q# w. B' [
6 c4 i6 d0 T6 P  |0 YPackage ()
- G) ~$ C, s0 N( N// Performance State 0 Definition – P0 6 r. ?" _! Q0 ^$ K

3 z- f& F* k7 E) m7 e8 H{
5 u/ }8 ]# e# y2 `
# b' z, q6 Q0 ?; N- Y, Y
6 E1 w- e# c0 S- QCoreFreq,
8 p: l, ]- c+ }" z& l" M// DWordConst & p- b( R! D. q% k8 |
6 w% V$ T& z; l+ F

: ^: {" a# i% j2 E+ oPower,. `3 H$ U" Z7 X" @6 `8 S6 G* m
// DWordConst
3 P* i  z" d6 @3 A# V2 I, `4 K1 }3 B, T$ }( L
TransitionLatency,
' L& F' K$ F! T4 L! Z% f6 V// DWordConst , r+ L% }8 Y  G- ]
! {' ^- @  a5 o5 _5 j4 U7 x3 f8 z3 J
BusMasterLatency,
; Y# p2 Q) D# Q1 Y; h/ P// DWordConst
' @% P+ F) d' T) A0 T0 `6 d; I. ?% {8 y6 a
Control,# ?6 U* r0 A; }: g/ z
// DWordConst
+ z+ V2 c& b! V' U& N- A5 @7 q; |5 c7 X4 g/ v' b* n
Status
; i& f! F& E6 e- t# \' q* x' N0 M3 d1 W* a
// DWordConst
, Q4 C' z( d! I$ r  u8 d+ f' f8 S$ J4 y
},
$ y* i$ q7 ^8 }! }2 ?& ^8 a8 y1 W  j" q: c2 D( v1 S# H- J+ Y
. 5 L) {4 w) t' l' H; ]6 H: M; s2 ^

6 x( }- k/ E. B9 J+ ?. , G8 H$ J2 G8 J1 ^/ m" h
+ i. U$ n0 A& H8 u" ]- N! e
.
1 S: j2 b; z$ k9 W5 G5 `( E% N}) // End of _PSS object$ j- u0 O* G# }" C" j1 x4 H
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
2 ~9 @4 L+ Z* U0 c 0 o$ H" W4 H/ G+ {$ |* P
Name (_PSS, Package()
3 g& P2 i* D2 E# P- U" j/ |
3 b) d# w0 T; X+ l{ ! `& T' z" X4 T2 P# _0 d5 D; I

4 t' K7 m  j) r: x: [& y2 _/ jPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
5 u9 y9 g% L" M2 u+ ^/ ^! O- T8 o; k* t: x, T7 A) H8 q3 h
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) / K. ~1 O) o1 q" K3 q

$ l  _- E- c' l# _% ?Package(){1400, 8200,* c" R- I1 t; @! H. [7 L( ]" h' ~6 Y  w
10, 10, 0x000E, 0x000E}. e/ v2 L. z( T, b5 s: W& e. J) E
// Performance State two (P2)
. F# ~  X3 ~7 L1 d3 P; N; Y( T3 J+ EPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 9 x# P  ~! U4 {7 G- x3 @0 B
Performance State one (P3)
. @, `# t. ~( a5 D5 o, \# i* e
: A* z7 ~- g/ c3 E; cPackage(){1200, 8200,
9 T3 W9 ^4 {* u$ {- ]& m10, 10, 0x000C, 0x000C}
; D% }! g4 @8 ?( c) F. c) p; w// Performance State two (P4)2 [4 i) A0 t" A% c

6 o- T9 b, g, X7 U* M) a5 g  D}) // End of _PSS object8 z& g& ?' E4 H, s3 x7 M+ d

2 W# q& y' E2 `7 b: m另外当该平台支持Turbo Mode P0将会reportTurbo Mode) Y" k* M8 r# P4 d6 e- j
1 _4 k" j# G, D; L4 [6 w" j# b7 l0 V1 w. L
l
1 t" _6 l/ M8 R3 {: e
_PCT
! G% }, A) {. b( N
$ }9 a, n6 E5 n- h$ f/ }" n4 hPerformance Control用于将P-state MSR interface ReportOSPMOSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample codeOSPM透过_PCT得知是native mode,当系统切换P-state,它应该就会通过MSR IA32_PERF_CTRLIA32_PERF_STATUS的方式来进行。
3 s- [. z8 Z4 X$ L9 @1 i
5 c1 o6 C. Q7 H5 yName(_PCT, Package ()
/ @5 J" F" g1 D% b- r3 |& D' ~; q// Performance Control object
# M$ I% y0 f4 F! v6 W0 ]7 c/ i8 {$ ^, r' K* Z; C/ _6 h
{
5 B9 j' r+ F6 q+ ?
. R5 y2 t4 _5 ^3 G% p) b: s  B4 vResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
" u+ ^: o# l' e# k$ g* j! R. V& }' ?& a// PERF_CTRL
( w3 e$ R( o5 [% V: D( f, }; j
5 N3 n8 H) a, ]8 v3 w/ d6 G/ pResourceTemplate(){Register(FFixedHW, 0, 0, 0)}& V* @. I2 K  V
// PERF_STATUS
1 M4 _" ?. R$ V  }
( Z) |# L1 u$ n5 M4 P  e# T}) // End of _PCT object
% R$ q9 R0 D* z& p: m4 }
. Q% v% K& J' R5 X' L1 cl0 [8 h. }( x1 m+ e2 q% S
_PPC$ W; k* \/ K$ o; y- R* i7 H, {
+ r* ?1 v  p: c2 M; }, n
Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSSreport的所有的P-state [p0,pn] return 1就表示支持[p1,pn]之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(\_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states) U: i1 x7 B  h/ u# Y; k

6 C. B. p1 N# {! k+ v* HMethod (_PPC, 0)6 _( h4 \# N+ G- B; L% u& A& T
// Performance Present Capabilities method ) ]% d/ j) `  x" t( A

% n: Q3 R4 W& }{
* X" [9 C0 i* a; h5 b' i! |- A2 F$ s2 ^, m
If (\_SB.DOCK)
- n% a7 {+ y# j$ V1 w! ^+ i9 J/ |, }. L  l! l5 C! G) @
{   m/ e, ?; L" w8 G7 Y2 |+ o
9 Q: }8 V" C& N- Y
Return(0) // All _PSS states available
; G$ i9 |- Q1 A2 E6 {0 p  e" r  g9 \# X+ r! C" m

4 {) D- Y# i; m0 J7 l} 6 U+ g1 Q7 I% I9 P4 p
6 q1 Z) ?0 j$ P! `9 D3 u5 a
If (\_SB.AC) 0 R7 M  i& A1 Q

/ f2 ^# }9 Y; \{
4 A8 D+ A. V; m; W; H6 _* B- g8 f' R# c3 e
Return(1)
( l& M! c, O; g// States 1 and 2 available
: I3 o) G% p- ^* _, S, E5 x
2 j3 I  P1 H7 [2 Z" u  _7 T} 0 Y) ]' z1 q% P/ U, O/ H
/ M/ q! ^5 V$ J0 G; d, T! a
Else ) P9 R6 u) K* G* @

! l. m" u& |: V2 h! A( R{
2 y, {3 D0 I7 G# ^$ X  t# {$ J/ M& g# f$ B# b) k
Return(2)2 X1 n( C& T: k. @* H
// State 2 available
# B6 x! {) D/ H% D% f6 N0 N; }7 `1 h% s3 p4 i6 ]9 A, x
}
( D9 l/ D/ Q1 ~3 @# g% W0 n3 f
( B( M; \7 ]0 q" ^7 e. w: w; ^! }} // End of _PPC method
! G% k; I5 y+ t# O* X 9 X# j3 m: r6 ~: n: x8 d
l! ]9 K1 `5 K0 ]% ^3 i7 C- Y* G
_PSD, @; C. @) q: O; g/ d
% C8 F3 ]; j* g% L0 N: Y2 A5 ^) }
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
- a  x  X; {" O9 }
! m& i8 X$ p8 y9 R" q# h' R; j3 GREFF:
# B: c; N% y) ^1.
, t: g4 V3 e7 {8 x- U" F9 m- z( cACPI Spec 3.0! @: P; a$ E: F$ p& W2 e) ~
2.
" i# @' f/ g' C$ e4 GIntel Processor vendor-Specific ACPI, b7 P5 `% Q, ], n4 l5 Q) r. O; `/ a

. h! H5 n0 Q  j' V- J( f7 K
4 t* K1 }0 k3 e+ _That’s all!
2 k" x  \7 Y3 b8 m$ y: n% G% v
$ U% Z. }% i% k7 s( WPeter
# d; n" |- T( M6 J
" s/ r$ @$ g) m! j2010/9/24
回复

使用道具 举报

 楼主| 发表于 2010-10-1 20:46:32 | 显示全部楼层

T-state

T-state
1. Overview
. u2 r+ ~% c* _# l% D
3 P9 J; [: K6 z/ sCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-stateT-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工作时间的占空比)的方式
9 f, \4 b- _8 g/ K,影响系统的功耗和温度。: e6 A! N9 n, w0 Y

' T7 c' X5 u' j; t9 A  q; q( G! A* T" B2. T-state Control. m( R8 m4 I# _, d
9 D, W2 a. P$ Y+ ]
1)
1 @+ t# ^6 B, n. c9 tMSR Based Control
2 M- T6 J- c. } ( a/ T% ~  ~6 v$ Y0 Q7 d/ O$ C
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 - {2 W' g7 B" o' h# C
; A" B+ ^& }: M+ I& k
2)
/ u. {& O3 l3 @! K& j$ R) Q0 f3 sI/O Based Control
# g/ w& D6 \* t
3 M6 ]  v+ F" i1 P除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
2 p. N8 Q8 u8 S4 y0 _ + o3 i4 _- V# M7 v; o
3), P3 N) \" g' G- ?( Q4 C
ACPI Structure For P-state
" H/ H) `; _) _- ^, a7 [2 jl
3 T2 D+ M- l' v, m
_PTC. e5 V! Q" e5 K3 z6 D# `
( p. h4 j$ B- s' y
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
7 _4 C5 x+ @5 Z
9 e  _9 D0 }* F3 XName (_PTC, Package()
# }8 _  S5 ^3 T0 T; ^/ W$ b{
  p* [0 Y$ T0 C/ H
4 I; o. C" c  m4 `ResourceTemplate(){Throttling_Control_Register},: [$ r# o0 @/ p& ]: t, X  C! `
//Generic Register Descriptor # u  [7 m  m% V3 i( v# i2 c

& V3 E) f& o% ]6 fResourceTemplate(){Throttling_Status_Register}1 i- s/ Q: O' e6 ^, [% k0 G
//Generic Register Descriptor / G6 {8 n  c: r/ e$ W! k& j
}) // End of _PTC
. u6 a( m3 {- {9 F, ^ 4 l9 u# p* [  o) Z
下述是一个sample code
! {3 b, S2 n7 V( y
! U) u6 `  Y0 u+ x2 a4 e2 V. ^8 s# T! F! D. X
//+ n$ ^+ B& j" P: \

# u9 `9 _9 n5 T4 `! ^// T-State Control/Status interface
, t' w; L, z1 v$ A' N4 U# @% M' h4 J# w/ z  {" W6 o2 T+ l
//
$ d1 p$ |) m1 D0 l& t2 L6 h1 o  R; ~5 q6 ?6 e
Method(_PTC, 0)
+ _" n7 C& F& A! h
  Q" m' Q* T* ~# t7 ?6 T3 `$ V. f{" c! ^0 S5 r4 a4 {8 t

7 g  x" E0 ]2 L- I//
# s/ f( m3 i* L  R( w9 r; T
+ N- v! U  _& S- z5 V  i// IF OSPM is capable of direct access to MSR6 d+ G' x* c- e

7 j  ^/ W0 K. q  r* D  f//
+ t& A7 q' X8 j7 f6 i" e7 WReport MSR interface
9 e/ d" Y  [' R# }* f7 J6 C* X9 f( F' m1 G& i
// ELSE
& l2 r- m2 v. w; s3 k! O  O
( y/ X6 V6 t# A, F//# h  |* `" {3 r* F1 n2 p. _7 `( N
Report I/O interface
2 F3 ]6 k. H$ N$ V. ~- ?) E. a! Q3 ^1 w5 I2 e( i5 y" g5 h5 {
//
# b7 a7 b& O, I1 l% H3 t( [* Q' c
: a( o! X% ^( s# G# T//
8 l- J& t' l8 _PDCx[2] = OSPM is capable of direct access to On
/ Y; n( S8 r  ]  _$ c/ [1 f, ?; g  m* R; K9 ^% B8 E
//( q1 U6 i" y  g& V& p# u9 Z0 `
Demand throttling MSR
# O& {( w' O' l/ w" z& c% z# z. }9 n  k2 ~0 H# V9 I
//. C# g, z1 |% t- G
/ S0 {9 n6 u7 y9 I0 N
If(And(PDC0, 0x0004)) {1 ]1 l4 _6 c* E2 o; j

+ `+ q. q  S  V! X3 ]# MReturn(Package() {+ F( |- |7 k- l1 _3 M$ @
# v( a$ Z* h  q  H$ A1 |* ]) {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},& f4 \, j/ B: ^" N3 l. ~
4 \0 W* z" _# P9 P' u9 j
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}$ ]% d6 t+ \4 t8 o& c
, S, V3 g8 c! o$ t* ], V" g
})
" f9 U+ |  _* F$ u2 N
, j  n6 o+ `3 H0 u# k+ ?}
6 Z' Q& o! Q& l$ m/ L1 ~9 z9 j" T7 @9 P
Return(Package() {
+ @$ [3 T5 T" [: Q2 ]8 D& x  O- Y
4 I! q2 s$ k6 s- x+ U) i: }ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},, P  D' }. W: O) g1 m# x/ z
: N, U! m+ u4 _3 `! [) D# i" _
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}: G2 T. M8 ?& o2 w& C- f; R$ P
& V! i. S+ }& z: E# J- V& p+ ~  c
})
" o5 d4 T; `8 y0 k; |
: ^. h5 m& @3 V}- ?* j1 h6 V: f4 x+ `$ n, p
6 W8 c& V$ X8 r/ w4 L
* u4 H1 l4 K! A
6 h3 b% P' i7 D5 ]2 @0 z) W% H
l2 [) B; F0 U+ F9 _! y
_TSS9 E, l  f8 H& q1 e, k6 N9 ~

$ `" ~% Q; T5 QThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:1 K2 B5 T, T) }
Name (_TSS, Package()
9 W9 ^0 x4 Y7 Y& z{
) x' p* T- C3 i// Field Name
+ P# X+ d* V( G2 l4 i% z5 v: GField Type
4 ?1 n" l, d9 N
# F' @- _9 _1 T9 c6 g/ K; Y% X8 M/ S5 W; @- J
# G! I" W1 ^# E; D& p
Package ()
4 L6 _. _3 i+ d5 ]% `// Throttle State 0 Definition – T0
) t3 U7 N. \' W# B- X+ S. x* y  _6 @: C- t3 P: N
{
6 h) b  n+ m- |1 P( A7 R0 Z6 r; Z" F$ T' J* w1 J! r# R. o# r8 T

9 S) e9 j, i6 gFreqPercentageOfMaximum,
8 H8 h3 E' O' Z; g/ d. W" Z' I! X// DWordConst 4 z% S' M" e8 }" Q

4 A0 p2 e; H! }8 E! X$ `) YPower,
; O# \6 R' U  m5 b  t4 i// DWordConst
: v/ B8 ^( N. d2 P7 M. Y; P( }( l3 _6 T* I
TransitionLatency,
5 i0 a3 i  u& H// DWordConst / z6 p* J6 T/ J7 d
6 C; U# K  S9 s! o) s  v1 f+ X, b( i6 J
Control,6 H& o* s2 O2 W. v8 }
// DWordConst $ @* |2 x, V9 M9 u# H

7 [% A) l4 w# b! x3 y0 |( ^1 ?Status
, w+ R3 q) K3 |8 [! R& A// DWordConst
2 d" t: A; y: K" ]0 [; M! K},
) N% P9 ^$ X, ]' x8 e$ @# T( Q……
+ P$ r$ Q% G$ ~' y$ g* [}
/ e) _* Z! b# ^+ Z9 h
9 j7 M0 g# Z8 ^" {& \+ {. U4 _7 j! LExample code 如下所示:& h  Y! e+ f+ R  ~5 R2 \) `# z$ K' b  C
/ U. h+ p% m% e' r: x; \
Method(_TSS, 0)
! ~) J6 L/ |2 D1 W  y: _: x$ z( P' _0 O5 W# p' z2 D7 I4 @+ K
{: I/ J' ]. S+ X8 g( i8 L8 b

& @* f1 u+ s# e7 vPackage(){100, 1000, 0, 0x00, 0},
' ?1 G- S6 A% [# B: L$ v3 Z; J( S0 l& J$ s3 O
Package(){ 88,
  k& W# z0 v) ]875, 0, 0x1E, 0},
# O! H9 F6 y% ~4 f: ^/ h2 E" J; ~1 l5 i% j% H' ?
Package(){ 75,0 s7 Q# U. i& d5 L2 b
750, 0, 0x1C, 0},
: T3 ^/ E; Y$ {
1 \5 o% n* M/ |  c6 ?, ?" W& W7 APackage(){ 63,
3 i9 X9 O* Z' }% X$ _625, 0, 0x1A, 0},3 E4 D( i+ W: X. a, A- C, Z+ Z/ C* y
3 P+ j8 @* s( t9 e; I
Package(){ 50,
; t4 v0 k8 Z! E500, 0, 0x18, 0},
* i# y; R; Q! X+ P7 l7 q* D0 b9 i  ^7 \! b/ p+ a5 d6 R" y5 a
Package(){ 38,
+ p2 d2 m0 Y! G) N* s+ K/ [! p9 H375, 0, 0x16, 0},
2 F3 |2 m  _2 w6 c7 S/ f6 m1 J8 P- L  X
Package(){ 25,5 l% l3 m: _, V* G3 r; b. q
250, 0, 0x14, 0},
% u8 Z) h6 G9 H- u' }' d/ X5 i9 T  a2 O5 Y. e- @( u
Package(){ 13,6 ^; M( U; H) n! i
125, 0, 0x12, 0}
7 [, @* w' N# j. T
, x- x, y# P& T* d7 q}
7 \7 H: w) }' b) g
- [% F$ Q3 v; A# `/ J0 H! v1 ~. Q: W2 I' d& `& Y6 t+ E1 r
l- i1 N; ^* y% Y5 c0 X; F0 ^
_TPC! W5 L  O8 p6 M5 p" q) v

1 ]* b* [9 t+ I2 E4 lThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
4 H2 U: k7 X; v4 |; Y: B) E ! Y; K' F2 j4 v, {# a; q6 S" b" h8 \6 w
l
2 p) ~9 o+ F6 c: L" |  q* w
_TSD7 H$ L- P' _8 o1 G, J( h% o  t
7 p: u1 V2 H9 T
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
; u! ]$ [' E" W) n   `7 u- G0 F+ o& T
Name (_TSD, Package()
( D1 i  \' G. M& ~5 H" C1 c& p6 |) Y$ M+ Y) v
{
! C) s: u, A) C. o# S+ q7 ?+ w& F% n# W1 q
Package(){5, 0, 0, 0xFD, 2}1 ?; H: ?: |/ W9 a! r
// 5 entries, Revision 0, Domain 0, OSPM
& J5 B; r4 V! k+ H+ dCoordinate, 2 Procs
1 R5 W3 E# m- o, m
0 ^( F& @# e$ m; u2 I, o# q
  r$ O. |( r6 n& v5 g) S2 M. S}) // End of _TSD object3 D9 T1 T' \+ c0 q' P

4 \2 \1 b, b1 P3 P  ~) ~$ tREFF:: h4 t. C/ ], {" S. @" y
1.
3 k) }9 w/ ?1 e8 C! Q' b$ XACPI Spec 3.0# i9 r1 w* k; I# I
2.; G4 d; L3 _" @4 }' y( Y/ s
Intel Processor vendor-Specific ACPI
# I: p  t# `6 [( h/ T" Y& ~: N
3 v" x0 u0 K1 H . f! A/ W2 x9 D% ?* ~/ s
That’s all!# l; s' F! _  \# ]
! r5 z8 P. ^5 x3 m) ^; ]: ?
Peter! l+ d1 ~/ G8 w
0 I: z" K6 m+ ?, Y+ C
2010/10/01
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2024-5-16 00:47 , Processed in 0.040993 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表