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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state

0 h% k1 e, z7 ^/ ^1. Overview2 _" U" Z, S2 P1 }- i1 [& n% h* `

3 q& X; A9 z& u5 R, \
$ }6 M; G8 N8 k  z6 RC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
( r+ o' Y2 l. Q1 c3 h降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
4 e5 N2 p% r* ^/ E* {/ x比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
! h2 |  |0 L$ z  }( j' \# D; Z7 i, E( H$ y& U
cstate1.jpg

( j- a* d- }/ D* t. l6 l* z/ b
1
7 y, M, M  P) U; J$ e4 n7 i9 A' ]; {
2. C-state Control
  D+ ~* p7 h7 c) I' D' b  H- h3 g# q& X$ \- I0 k* B7 `
1)
' R. }+ B  K0 |' k6 s* R6 h  _Detect & Enable C-state) r1 [% M3 x4 {3 Y
0 T: D5 j3 J" H% T+ I  \2 ~
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的支持。6 `1 H) g$ C) M7 T

# s  P. U/ N, l* @& s4 x, w2)7 C' ^7 C$ W" }2 h2 n  v- m9 B( X
C-state Basic Configuration
! ?8 t4 n. I8 w+ 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)。
6 f3 W. Z2 Z" j( E* E( q  i) j: C& p4 q+ T5 \, v5 n2 w
3)- j0 S. [, \% P5 S/ m; {8 y+ t6 L' r
ACPI Structure For C-state
7 G5 G. b1 z/ J/ M% A- I$ o* e0 ?2 R+ a. ]: Y8 X; Q
l$ R% q% S) [; X; Q
_OSC & _PDC
! M* o2 Q2 Q" [+ Y/ H# i3 \_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures  W" b  A, v7 n! S$ k  d' P
l4 O* c$ Z& I2 j' k& g) x
_CST
' }$ r3 l" S; g4 z: y0 G_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
( o/ P6 ~- l& t3 TCSTPackage : Package ( Count ,& ^$ x/ x  p; }8 m; v
CState ,…,/ d. F- Q- {* }
CState )$ |" F) J4 r0 y; I/ n
其中Count表示所支持的C-state的个数
9 a) s6 Z; P# ZCState: Package ( Register ,7 P& c% }6 g8 q2 E. }# j8 x
Type ,
7 Y( o* e1 z2 S; K- DLatency ,
1 X/ g: e  l$ Y5 c2 L1 V5 l5 t3 S& sPower )
6 e, z! h8 n, b7 W$ d2 E1 M3 W, V" ^: `9 @4 [6 O' ^
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
* Y) ?* r+ ]" `2 b: Z7 `; N5 ], U, p0 v! [% m
Name(_CST, Package()
7 \1 f. l8 R7 E

/ p1 h: q7 I2 X9 y{ * f9 Z0 [8 z" d
4,/ t) Q' c8 J, e& J% z+ R6 B. ^5 T, b
// There are four C-states defined here with three semantics

) [3 H& h0 E6 |% l2 _: k/ z2 H+ B3 @0 V. F  {' k
// The third and fourth C-states defined have the same C3 entry semantics
, r9 f4 j, X! k5 I8 R2 W* O% J

/ M' v+ d+ L* O. v, u- ~$ Q; D0 QPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},3 r) [( Y5 ?& ~. L) x
1,
" y6 Q- N; S# v20, 1000},% ?" a2 d9 O  ~/ w7 C2 r7 ~' y

& z: c/ M2 S4 T8 D: q' @; W/ lPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
+ L# P4 w2 K' b8 o40,
2 K. m' g6 p! R* B750},

0 E. L. Q/ [+ j+ x" mPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,* z  I% A1 m- H: }5 K
60,
) E' k2 |# f# q; A500},
8 O/ L0 p# ]8 g1 U+ p
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
: E( U' a) `: p& W/ ?4 Y250}, H' R1 b$ X+ O# ~9 q

3 _. h5 @. G9 I5 r3 E/ \- G})
( T7 z+ U; v% {; M* d! j
3 ~  V0 ^+ ^! t1 r9 q! f; gl
0 p; l, p8 m9 k; _
_CSD
3 B( n' E9 E# P0 }
! W  b" r. u' L2 b" z$ `" NC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。: W% z% _7 I0 B5 Q+ c4 h& e

% p6 G5 X# U% o9 ^; _! @+ A) @/ }6 }" v* ^# d, O
$ Y' y& v6 f/ b' m
0 t$ \2 y' {/ G" [
3. P_LVL VS FFH7 Z- y! g8 I' |* o/ _( m! g- y* Y+ P2 z

( {, L/ G! @' c% j, }. g% |; tP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
( p% t+ F+ k) s( Q* cFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
& }8 h6 d: l0 D; s/ @
9 G2 `  ]% {1 p2 B
gas2.jpg
' g: [7 J$ J( h4 m
2
  e/ E: Q9 i- O; m8 Z" M
OSPM解析到该_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的一个例子:+ }! j# M5 }. H
Name(_CST, Package()! h% T4 w, e$ C1 q0 ], C
* U( f2 k. L% X2 }  Y% H
{
. p4 V) d. |5 Q- {( m2,0 _. q5 m+ Q/ }( d
// There are four C-states defined here with three semantics
3 X) r" C) ~7 Z. B* L9 w& j

% ?+ [: X/ t4 ]1 J* J, l# W0 X// The third and fourth C-states defined have the same C3 entry semantics
, U. q& J3 q4 k' ?' b
9 c) e6 w0 A9 Z- S- V
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
& d. P! q( d  a' S) _. e9 B0x01,3 y# ?/ d. T/ j: y
0x03, 0x000003e8},
5 }! e. z1 N5 _) [" f3 b- w

# h, b7 ~, z4 V8 u7 HPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
" `8 A8 u* x3 \3 E7 V# u1 r% s0x01,. g- n+ W' ^5 [' X
0xf5, 0x0000015e}

4 k6 U% B& u9 Q/ `})
- v, m1 X7 i2 `
  D5 E5 q4 l+ e2 J: N, o
: P4 y) f; D; L2 Q$ Q$ }" k4 b2 LREFF:
- g. Y7 {0 Z$ h) e# Y5 P1./ i# \9 o+ D6 S
ACPI Spec 3.0
+ J* q: z+ O/ |9 V% }8 _2.- s5 X7 m1 Z# |  x5 \
Intel Processor vendor-Specific ACPI
0 k- P  u0 y0 e% a; t0 u5 F) M" z+ U% I
4 p# X+ A, @# ~7 E7 w, ^
That’s all!8 R( H0 `- ]2 O# r

# r( o+ O* u+ M; L5 N. j+ a: ]: ?! zPeter
# R0 ]4 A. f# {! M! Z; J9 ]4 y" Y1 Q0 I, S( W; A8 |
2010/9/20
' b. d+ {! |* a; I
, U! c9 P$ P) ~' s7 c* n) e[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview; d) [/ D: M1 Y1 ]' ]! h

" n; Q0 l2 l, Q/ p# ACPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
# {% W& R' v1 P7 v/ HEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。' b. w% l) G' f( Y1 M) K
9 i5 w6 w4 k. d: K; s/ ^/ u
2. P-state Control6 o" a: t5 x7 N8 r, x
. w% b9 {. V$ }3 y# h
1)5 I1 E! I! j/ q1 t" P" [
Detect & Enable P-state
0 H. y( P' ]2 ?0 Q+ I! U
1 q( z" q( o- Y& ]BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state, h1 W$ I% y) K' T& d- `5 z
! H* W) H. g" W1 X, G; ^+ x4 K  x/ b0 I
2): N  Z7 @' J7 ?" T$ F0 y- ~
Supported P-states( v; w1 O- N- C0 I: U( l( Z
, M3 Y8 q8 Y* L- H& e0 T' M% a9 L8 A
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! x$ Z7 ~. O# D6 Q
5 @0 m+ s2 }2 s
MinRatio = PLATFORM_INFO) \+ B0 u+ l4 P
MaxRatio = PLATFORM_INFO
( q- O0 o# k  M/ QRatioStepSize = 0x01/ u; R' D6 N/ j8 g
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 12 ~# M* e6 X# |
! o: M% S, q0 G+ M, j' U1 W
If(NumStates > 0x10)
0 P0 u2 L! ~; n' X# v{# o+ c: N/ A1 m8 u' g
RatioStepSize += 13 ?9 d2 l5 M3 A$ r$ V1 K# H
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
1 R5 b( T9 Q3 a1 x+ V8 F* o/ w}& F6 N( ?0 M) e' E" \& x2 i. D

2 T) a+ `9 L2 D( H5 X% g3)
  m+ v8 W: C. uTurbo Mode
* ]. b; K4 ^- S & x- q/ g' h0 e) y- F& t& T5 S+ M
Turbo 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
# j- Z4 v0 e! l7 y  v   j- K; J- F% Q7 S2 ~8 ?9 S, C
4)
4 o6 ^6 ?  ^/ z7 s0 AOver Clock
( l: m3 D  w: V; u& E % h6 }* h" Q$ r& p) i
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
0 H) i! c3 {; o6 e 2 }3 K, C6 @# ^" x# f* A2 @* |
5)" t1 j- T* s) o/ w/ k0 p" m
ACPI Structure For P-state8 ?% H# _: {8 s  H2 r  ?4 r" h

9 t- `, r% r; F1 c# z, Il' D1 G& c) S* g! A' H! X4 G( v: M
_OSC & _PDC; l+ t( a: l* x2 [5 g& C) z

# L* |3 H8 q. M_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures' O0 H- n: C* @- h. M
1 z' P$ Z3 ~- g2 G# a) {
l" q+ g) W) g+ A: E% S$ d$ W
_PSS
8 H+ @- f) H/ m" {* o" |+ J- fPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
$ f( Y' T8 m2 e2 o5 C0 X' A并且通过一个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做比较6 p8 ]7 F! r: x+ t# ?3 L2 R8 d
以确定P-state切换是否已经完成。
  `: v8 w  j$ ^
- e( {. A: |" ?: e' m/ ~' XName (_PSS, Package()
, v& t. ?0 ]0 o9 R+ t  O& M{
, C) a! M+ ^+ G' `, `$ E: d/ |// Field Name
5 L  i; K8 Q. u7 K3 O0 dField Type 7 u# E. y+ ?: Y2 s& y
) g! V$ q* E9 W( o% C6 r

) K* o% j( h  O1 ^( }6 _7 p! I; J& l" R! M. p9 A
Package ()/ d& `0 u7 ^) |* ?
// Performance State 0 Definition – P0
2 U; k! q/ _( f" }2 y% d! k% g4 a1 c. J( r- B, d0 D! n
{
  Q4 s) O+ D1 Z7 k' }: z; |) i8 }; k: B

' W4 G) p- k6 d' lCoreFreq,% J' e0 o$ _; o
// DWordConst & x$ g# v. y0 f* p4 m- N
$ x+ Y& i+ n! p: j  {4 O7 p6 ^
& T! G  M9 U/ N& r9 S
Power,  E  W3 I* E  @) Z: @
// DWordConst ) Q6 ^! w( K9 |$ N
( z1 I+ Q% r" ~
TransitionLatency,9 E$ \1 Q  }' I' @; p
// DWordConst
7 V4 n) F0 F  D) T3 L1 f7 S1 X* g( W! E" P) d; Q( t
BusMasterLatency,
1 m! N* n7 s2 b1 [// DWordConst ( X: X2 J9 g# z6 u, x$ g1 w
: x9 m! D# k( ]  E1 t) J
Control,
% f2 j# _- x) w6 i& e// DWordConst
$ P) d9 q. N2 R2 w7 a8 Q6 D1 Z0 P# k4 }5 p
Status
& I; T1 M- P: C6 }  E) e
3 h' q, i3 S. v9 j, M! P  @/ f1 ?! X// DWordConst
" P! J8 A) ?# k5 N8 O& r3 ?
5 I5 K' m4 j1 K8 L3 b$ R}, 2 V5 r( j; q1 n  b8 ?+ c8 G

( L8 v- l1 U! c! l; w. ' i% _0 p' @* T" t2 v/ z
+ I1 u& ?( n9 }  A
. $ A6 }" v' X6 U, ~1 P+ k5 B
& Q0 w  W! L- Q
.
' A/ y$ _) y1 y1 Q7 J9 f1 j6 R}) // End of _PSS object
1 ]2 F& c* U, v) g, J前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 ) e" ]: r1 n# z# i( `
# `& m8 ~) r; E8 o
Name (_PSS, Package()   z+ B1 C4 Q0 R2 t) |

& U( e4 E6 L/ H{
# k# ^8 P  Y; J( a
1 N1 i9 D8 s9 w1 [Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) - s  M  l# z  ?# g) m9 U8 z5 X- s' G

9 V1 n- M0 A& g: @Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)   u7 M$ _5 ~( c& B) H6 z
  B. |: b$ S3 n
Package(){1400, 8200,2 ^1 i, f* P4 S) ]# ~+ Y7 ~
10, 10, 0x000E, 0x000E}
  G( D. f+ j# U5 ~9 X% O  Y2 n, d! e// Performance State two (P2)  u$ \& `8 [! q5 e; |
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
1 @0 z# [, E& V9 l! f& l6 j" @1 e! ]Performance State one (P3) + X' O5 W; D, K1 A% {
7 h! S- ]. G3 X8 p) [( ]
Package(){1200, 8200,$ @$ }. |" c0 O. c. d2 D! B
10, 10, 0x000C, 0x000C}6 i2 J* m8 N# s" B8 _" |, l8 L
// Performance State two (P4)+ G' H. C' h/ c# d' Q4 S
5 A; }! E* b; [8 i" r! k& {1 a) W
}) // End of _PSS object6 S" ~: ^# g5 p6 U# B

% C4 l2 r* t. W5 V7 Y1 ?另外当该平台支持Turbo Mode P0将会reportTurbo Mode
2 T0 \+ ]* p1 X' M3 A 6 N8 w7 M9 y! B: z5 U
l) f) L: T* }$ B- n
_PCT% O8 `$ ?5 f. b( n
  a* V& C3 V# P' ]# J7 V  T
Performance 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的方式来进行。; z# J0 d( j' t' e
' Q7 w+ H$ ~7 e& t9 a- }& U
Name(_PCT, Package ()
1 g! t- P7 Z) \, v* c! l8 j  i3 l' v// Performance Control object
( s' |2 T( F+ M" E7 P6 {/ U: N0 T& y7 F0 s/ S# s; `/ y
{ 6 ?0 h# W; q3 J$ }- F
# O/ X8 c# ^( K- U
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 J/ W: _: u  r' e  g  r0 [, r// PERF_CTRL
" H  b* g8 }+ x$ u1 M" ]3 O9 t( r3 n* a7 T$ Z
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}# |' L( T1 ]& Q3 h3 c( J5 C
// PERF_STATUS * D! y" F+ y$ h
' B) y& c  |7 ?0 e( `
}) // End of _PCT object2 E; j, M' C/ q  N" i
/ E8 l7 X# D- F2 ^$ m
l! `9 Q( c9 o! z1 \# ^+ V1 q$ v' ^
_PPC
0 ]3 p  C1 }' O/ @+ K0 h$ N; U
9 {6 q6 ?2 ~! ^, W" LPerformance 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-states2 @; P. [1 `  I- s: J% A
' \6 J) O) O$ {! x9 h# R( e
Method (_PPC, 0)
7 s! t3 x/ x1 ^7 A0 ?// Performance Present Capabilities method + ^* ~1 N" i/ Z& y. U1 r, N: r6 N7 T

. V( E  V" l2 n" u; w{
0 {+ o3 L' \2 U6 D, D- h
3 T/ {4 X8 t- I: L8 uIf (\_SB.DOCK)
& u9 g, j& Y9 e8 o3 O" e- B: ^% d. N$ v7 E* C
{ 9 _6 w* x* M4 y9 S6 ]2 p( |
1 {/ e: ~, J, w) h
Return(0) // All _PSS states available
! \5 O% g9 ~  l0 j
8 J+ J7 G2 a2 }, |7 B0 K, p% W# a% k
} 2 {1 S5 U2 m9 R8 ]

8 w$ Z6 M: W1 X4 w/ K+ \- b  VIf (\_SB.AC)
, m5 ]5 Y" C1 q/ q0 ]" ^) d7 x2 Z# A8 [6 i: s
{ ( [6 _& j/ L; i  T: m7 P. x

& F' P' p8 l. M, [) a3 `Return(1)0 u# l0 W0 }3 b9 B) h$ L& B
// States 1 and 2 available
* e& h- O$ c$ A. p7 o/ |3 V, i1 @: G# q8 }' D
}
, _5 l5 ?  ]+ ?( ]& b, ]
* E5 `+ g# q. o# g% v" iElse
+ Z& }$ E/ y4 v, b6 D1 A2 g. M% H5 Y7 J: [
{
9 \2 o. p# V! A/ k0 t$ ^* ], Z
2 R4 Z2 `- }0 b+ w% z) S4 PReturn(2)& _8 h! Z0 l; U% `1 w6 q
// State 2 available* c5 {; d+ F0 I& X7 V

% i! K" r2 S) S' n}
& ]. F  V8 z. C  H4 e
! a) G7 i' N" ]3 d- ^  m} // End of _PPC method* O- o- F  |' ]6 {6 b# r9 p
: _' g8 M( G' X) C
l
9 F! Q& e: c- d$ e- t
_PSD: V. ~2 b" J2 \% ~1 r6 A) r

  G. j7 u; H& O& j# y+ LP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
5 b+ Q2 Y8 n6 M8 T, K3 t
  ?; P" |- N. l; t( a; i- OREFF:
: O6 P3 r# {5 J1.% {( u/ R: Q+ }1 m( B6 H/ ~  f4 Q
ACPI Spec 3.0" [; ]0 g9 S! I5 h
2.
0 A2 `+ a( G( u! S/ V) {* RIntel Processor vendor-Specific ACPI' h7 W3 W) x2 F

% c7 v+ {  R; o3 S4 k
# Z6 L/ q- }) }/ ^# U$ A8 A2 g, o1 ZThat’s all!7 n9 s" I5 g0 F
5 Z3 R; c& E5 G- ?' \
Peter1 i+ D6 [! z; `, r/ c

0 L# p4 m4 t$ A$ e6 T& B2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
0 C& b" {, [7 y; h
: v( n; j* B$ X/ TCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式# S! B! c# H% b! ^' H# }+ B: R
,影响系统的功耗和温度。
+ ?+ x# H7 [2 `% Y  `6 [+ S
) {: E  g9 [; g) M2. T-state Control1 R& f9 \0 Q. L
( Z* P8 ?! a, a$ F5 S. n' _
1)
) t" W& R" a  Q! TMSR Based Control
2 F* M, H) g) {$ x+ m! r % a7 Z; ]. |5 P. G) e
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 ( d) U  ?" e. r
: @+ A0 h; N0 J3 u/ a% d
2)
8 J9 P' a. _& O. c- V* SI/O Based Control
& {  [% `* w  s3 N% d
' n, a  a- K+ d3 v% s! g除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
: L$ Y. h3 ]1 l5 K
" g* N' e  X6 W! I5 e9 E/ Z8 j# h3)$ Q' j: j4 q" ^( J+ o2 b
ACPI Structure For P-state7 b+ c  n$ D1 t3 t
l
& Q7 C# S3 z3 z0 K2 f* I* U
_PTC0 I/ m# N. s: R# r* X* q$ j5 H8 X
0 W6 w0 k0 k- v# I" j& \% [
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:9 F* k1 P. \. _' A  S* l

3 b* J. N, I$ b# o5 I, l+ FName (_PTC, Package() 9 c" m" `* \9 p1 s
{ . G3 `' w# Q& M6 e: _

6 w$ p4 R. a3 G/ k- a( _ResourceTemplate(){Throttling_Control_Register},
# U4 `4 `; Y, h& {4 e/ U7 ^//Generic Register Descriptor * E, T' x) }! Z& }4 L$ Y, P
6 m  a0 M$ }( K4 ?
ResourceTemplate(){Throttling_Status_Register}& s8 V1 ^5 c; w% i5 \9 q
//Generic Register Descriptor 3 M4 {6 e, @! k' q
}) // End of _PTC4 i3 K0 f+ x# b# M$ G/ }
) F% m9 U/ k3 X' i3 s  e
下述是一个sample code
7 q- q, S3 `+ W% F3 R$ D* E $ E4 X: V0 B  _# o* z6 `7 j3 q, _; c
, L. g+ j% A; x- ^+ C. x% z( y: o
//
' ]% p8 n& D( Z# Y
7 U% W/ D6 ?1 d; D' N// T-State Control/Status interface  g( r+ I# C0 K; D
4 F) A7 y8 I; [& \- j+ q3 i
//  K& ]8 \& Y& p) a7 s

9 K6 Y0 D3 u; hMethod(_PTC, 0)
7 [# o, F3 p* y& b' K. e) E7 M* _, G& Y2 B2 k3 E) L2 z
{( [' m; y  \; ~* H9 @$ e+ ?
* Y& ]% Q' S* Z* |5 _! b$ C& m6 J
//# i6 F1 z7 B" T. ]3 i% X% D+ U/ F& ~
0 E+ z- z1 V- K" q8 j
// IF OSPM is capable of direct access to MSR0 j5 j4 ]; C" G" [" K

+ |( k; W$ t7 Q- c4 E//4 g; w/ f, v' U2 g- @- U
Report MSR interface
; R. C- Q6 K$ |+ S# M5 ^
. {7 D) Z* a5 L) O  Q* Q// ELSE
- P, {8 r! _: N0 V0 j
1 ~. p9 }; Q+ n2 q, V; C//5 ]8 P9 h! o4 U4 F6 d3 o
Report I/O interface; Q3 k& y* d& [+ N2 r' B# L" T

2 p, r* g( }* ^3 i0 _9 M% e//( G/ q4 b  U# V

5 X4 _: A7 G  \//& K! `( M7 t7 @; ]+ c
PDCx[2] = OSPM is capable of direct access to On6 V( T$ G$ R/ `/ q. N
2 ?6 O1 o, _2 R( l/ J6 D, k( y5 l
//
1 a8 X$ }% [3 b7 ^Demand throttling MSR+ G4 F2 z+ [$ ^4 b& G6 I4 Z: g# o

: d( n0 x2 T2 k6 i+ R6 D8 D//& _5 |; Q& {- G2 O4 v

0 K7 \1 F3 u  K- r) uIf(And(PDC0, 0x0004)) {
, _' y  z; w/ Z
' H; o. Z" b9 o$ UReturn(Package() {
: H  P5 J7 z4 V! j$ V; `/ h/ b7 D- z( q5 A. z, ?& f
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
* f/ {4 e1 G! `7 d) V, D3 z% M
$ M: k& R1 ^( L5 ~5 p& _ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}8 M, W  ^( X8 A0 C9 v- r
$ P; {2 A$ e3 ?
})
7 p1 h) R3 T; Y5 _) ^
% j6 H: O9 p& P. z}
+ r1 z6 {0 ]3 v& _; h* F( w7 O8 P  F% O. v: b3 h) G  E% g+ m
Return(Package() {
8 }7 g8 P8 u) M/ b9 [
7 A2 N) b2 b% u/ x- B" |! wResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
2 X: z& |# B. \) Q1 }2 z* z
- z; \4 r5 r' R: h  a& AResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}8 ^: G; }3 I, I- Y$ ~8 b
. y+ W) F* a1 S: _
})# u  {) P# y% @7 R8 z4 M/ B0 Y# x

  h$ b, E  p" R}1 H* e* ~; Y! E% f! D  O

0 f. S3 K5 F+ V2 K, N/ E. |6 S4 v8 e" E: o, q
, B" b* r+ [- F( m2 E1 m% Y. N7 P5 ]
l
7 q& U, u1 h3 J4 s4 i7 t* I& \. b
_TSS
; J& _7 i4 `2 z# @( p! T# }: a
" }1 ~. I  C# C; t7 _; H, {Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
: ]5 c+ w5 j, R# A. S, y8 O1 |Name (_TSS, Package()
# d. ~% J, T4 Q: d! u$ _{  C4 u6 r0 m7 t6 ?+ t: m! Z1 R
// Field Name. F% F0 B# s$ f. V+ B0 H
Field Type
8 R9 L$ o6 Z! O
1 c" A9 ~. l% g
$ [$ J5 Q2 h+ ^, o) O4 H; B$ s- ~$ @  w5 C& B2 _8 E
Package ()
  S4 p  O  S  N8 x* S// Throttle State 0 Definition – T0 - b5 e$ g( d4 i' T% w6 p* C

" h3 T0 g; y4 T! B% e, f{
9 F, O) W# r5 _" r$ s9 q# n5 z
1 Y$ C  L4 K9 B8 m# k( Y
+ r0 h/ L# O0 h( X! L) x/ x+ V3 B, UFreqPercentageOfMaximum,
3 S, Y* e7 q& B0 `1 t3 c1 n! v& v// DWordConst 1 [4 R  L$ C$ k& \: v

3 D+ h1 d! H: sPower,
' t4 q- W& ?1 K% L! o// DWordConst - [5 b" R5 N& N  f
' `$ Z2 Y) K2 G2 o, J
TransitionLatency,0 o& F1 t# R& w; ]! e) @
// DWordConst
: {( G5 c- H/ G& U3 q* w0 j
. A1 o% N! a+ k0 PControl,
1 R! B- {7 C/ I2 \- `- v// DWordConst 8 G. O& _" ^* ~8 g4 H
$ S2 p; {5 v' x% K4 G9 @$ Z
Status
7 m. ~# k6 @- d; ~; P" A/ c$ x// DWordConst
6 m' f& F. r8 k2 N8 G},- r* O9 q/ e- m) B, o$ t9 R
……8 }/ A% o! C, [2 F
}
4 O( Z& T- `3 O. S( C3 ?. }( v. B. r* R+ M
Example code 如下所示:5 [: s+ _, S+ V$ f  W

1 E9 @4 X7 _2 I1 D$ S% yMethod(_TSS, 0)" j* p+ W) D4 c

% ^4 }& Z5 O' S' h( @. {# A{
4 g" e# H5 R# q& r# |, F$ ^3 z& Y, `: G! V. H# c3 O% [
Package(){100, 1000, 0, 0x00, 0},' `: q5 Q. k" h8 n

! N0 `  d& p/ B& Q# @5 t& z! VPackage(){ 88,8 W( K4 O- g9 D6 U
875, 0, 0x1E, 0},
5 f; d3 l! x' c: {# L8 E
& e0 |+ k3 y0 b- t: fPackage(){ 75,
9 c' ]3 R1 b/ q9 @( M& ^, q750, 0, 0x1C, 0},5 Y1 T$ s' g* ~& i
& d8 Y5 ?$ H0 r! G& `4 J
Package(){ 63,' s2 @" ^# Y! @! ]1 A
625, 0, 0x1A, 0},' a# [& W2 K- y; ?& P, G
# L& }9 H0 i" e& ?) P
Package(){ 50,0 r  A3 m* f: X( f7 q  A
500, 0, 0x18, 0},
( S7 D4 C: K) R% k0 U' R5 Z% d' e# Y3 R  k8 B' v/ K
Package(){ 38,) [; _2 y- {& ?
375, 0, 0x16, 0},( {; P9 r. B! _: U7 `# E0 _  U- S
$ O' ?( h! e2 Z# c( E. k! v
Package(){ 25,
" D% G' K3 |+ P9 k250, 0, 0x14, 0},
7 f: i% p+ O* O: P8 q2 X# v: F  c' A: d7 ~' A0 O$ v
Package(){ 13,
6 W# E+ v& I+ R8 E4 m2 W125, 0, 0x12, 0}
& C0 y" p6 D& q- S/ x
4 ~) ]  B) e! g/ p, ^5 d  S}) S: ^% @' T4 h  i9 @; r
" H, s9 Z; ?4 `: I+ m
9 N% v# z. w- m# l8 N/ Q# K
l9 {! b3 J# a3 W0 h
_TPC0 y+ ~# m) X' I% z
3 d+ W3 ~3 O7 J9 t  w
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC: {  y$ b' S- V: [$ T

, J  J5 g3 G1 r; Q1 ^l
, N; l8 O" L, i7 E
_TSD
) q/ q0 H  E- Q# @# t 2 b# H" v2 k& F& o* G
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code, y: N' \$ v! {
. q9 p$ ?. k( K3 \+ @2 U. m
Name (_TSD, Package()
9 B6 l0 z! N1 R) S/ j/ ~' J. c( A) R1 k2 R+ @( }+ b
{
& ?  T6 O  H; G* ^  L2 L+ d6 C; ]/ r2 ]
Package(){5, 0, 0, 0xFD, 2}+ ?6 j; ~" c* z5 F) Q4 N
// 5 entries, Revision 0, Domain 0, OSPM 1 ~1 w0 I  a( ~* q$ H
Coordinate, 2 Procs ) z+ n, m5 c) k3 Y

  f$ Q7 y. n; J7 j/ k- O" e4 p: p8 P
}) // End of _TSD object
3 y: `* a1 y3 D; v # I8 D9 M- y. K
REFF:
0 @: u: d  }6 a1 p0 O1.0 b; j) r& Y. {- E! ?- N9 ]- M
ACPI Spec 3.0
$ i" K4 p) M- ?  H3 r2.
3 c/ }% ]" i! B( a: z8 o* c! \5 OIntel Processor vendor-Specific ACPI% D3 I3 N; D. D3 h% j( M

2 K3 o6 c8 v( X$ M5 O8 k# S7 v 2 a' N- ?8 ]& r; N7 K0 Y5 I
That’s all!6 @7 ~7 O$ `, \; j2 @- j& p

8 R9 _9 T# P" J* a, k) p% uPeter
+ R8 I* H% D6 s0 J ' P  {6 d2 W! g" {
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 18:26 , Processed in 0.125726 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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