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

CPU Power States

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

5 o  i- R0 v5 A/ \1. Overview& i6 q5 V3 o' J- {) x4 P) y, [3 A
7 _- }1 T# \7 k3 K
2 V+ g% l0 Z3 N& ^0 N" g8 v& {
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换/ |) D5 \9 c+ V5 I; l# P
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看. ^$ O- C8 A# Z! H- J
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。& r) q3 p1 r6 B& ]" j
2 [& ]" j! _) V5 s; H/ c
cstate1.jpg

# c& ~. \- _+ t: E1 a
1

% L+ h% e, z& w2. C-state Control
- {  d6 }) g% u, j
' I6 U1 j9 u9 q( Y2 `% _8 U% E/ L2 u1); b: V5 `  W& b
Detect & Enable C-state: _1 g6 P- I& O* T

; r3 A7 Q4 }8 ^: M: EBIOS可以通过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的支持。
* l% F0 L& Q( e' d" e, W
- X  z% K. }& H! z* o1 u2 d2 C2)
# b7 c# S: |& \C-state Basic Configuration; g* ?4 |* q+ e; E  T
通常情况下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)。' Z2 O/ T& m# P! R- X

, k) S% K9 ?& x% T0 y3)0 q; b  h; M4 c" }# s  e
ACPI Structure For C-state
% Y. c0 T+ `' t" v5 @7 e" ?9 \/ Z) d7 ~% I& @+ {
l
' e; D( M5 C- a* S& P- l+ K
_OSC & _PDC1 J3 L* R0 K; [. [9 V. n" Q
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures3 o& A# r7 _* [: R) P3 Y
l
2 m  m- V" G0 b6 k, U. i' Q
_CST
4 U; o) O. `9 R- x4 j5 P_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:; m+ V" u3 j# a, i" Q
CSTPackage : Package ( Count ,
" o6 }# R* N5 h6 s: t% mCState ,…,
2 p( C$ _0 K$ k9 I0 ~0 JCState )
6 ?* I/ v4 Z& ?其中Count表示所支持的C-state的个数
* _1 D" n5 S) j: t9 N* U0 _  o! DCState: Package ( Register ,+ R7 z4 U0 j0 O
Type ,4 K% V: C0 @/ D1 H% _" _
Latency ,
& }/ H! r- _+ q* ]+ m3 _5 LPower )
3 _# E; G( b( p# k# U8 I/ i7 Y$ D# q# w% ?$ E) ?, g
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
) g5 d% ]- N; o% {# m& ]. _; ]( N( @
Name(_CST, Package()
/ S+ z1 Q% |/ d- s3 h. B

0 p  m9 I  r2 s# G7 U- i0 y) x{ ) T7 e  i1 b5 ?, x* L
4,  \) q* A0 c* l* I
// There are four C-states defined here with three semantics

) Y! m5 t4 ~0 I- j( x
6 X% w. R5 i8 D. P% Z// The third and fourth C-states defined have the same C3 entry semantics
* g4 L8 Q+ O# \

$ j* q+ B+ u4 Q' _Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},2 Q7 r# w& ^1 a$ E+ s- w
1,# [: g  |4 H, _( B
20, 1000},$ @: L9 X1 Z6 s

& g  ]: l; [& c: {2 N; hPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,' I1 a" P6 Y6 z8 c. I4 A  n
40,1 `" A( v' d, f' Q" w0 H6 i  u
750},

+ r0 n  }8 B: k" X: p2 G1 U1 QPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
* k  ?/ Z6 D+ p$ E60,
2 K$ A: Y" M3 Y% y9 o" y/ K500},

. K3 [9 V* E* z1 C2 C9 OPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
4 M' y1 y5 p8 j) u250}$ J- i. A& p, {% G; x

2 p# S3 ^, d3 u/ m* F: R, R}) & Z; x4 j) Z' M( b1 v* _6 I! [$ R

$ l: }# o% I3 Y6 u& }; E2 tl
' I, F2 y, o6 V" f4 M
_CSD
8 F  y$ d: r1 s' p1 G5 I
8 ?7 `: H" T5 a' s0 VC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
. b  U1 V1 N$ h0 g$ y
2 N* S0 F& ^# F6 k) I9 z: s3 Y' h
& Z' P9 K8 ]( i
1 {( E' p3 W1 Z/ h& Z3 f: ?; y9 Y% x6 u. ]% q# y8 C5 f+ o1 k
3. P_LVL VS FFH
4 m/ X- v7 i8 X  v  M
* L1 \0 ]* L, Y' b% L* XP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)& z# q/ A" S* u6 G, w
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所示:
: O1 c) z; C' C5 ?% G8 p7 Y) D. g* S2 b: w2 x3 [
gas2.jpg

8 R" ~4 l1 H7 E4 U# H
2

  l& b4 H2 D1 h- @  R, g. Z( r+ VOSPM解析到该_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的一个例子:
! `7 v8 A7 q  nName(_CST, Package(). K2 U" m9 z! L

4 H" N( Z7 a5 I- P{ & b2 L: r0 A) s6 {; J4 h' |
2,
/ D, l& T+ r$ J$ Y  |// There are four C-states defined here with three semantics
/ q. f" S8 K6 t

7 T% }4 a1 E* C1 ^// The third and fourth C-states defined have the same C3 entry semantics  Y4 i' m" T( j" G+ d( X
, q, Q& y( C$ O( X, D
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},: k- c$ {# j- R, x5 n: C
0x01,$ x1 ~# Z" N. g( G- ^, F. l
0x03, 0x000003e8},- e7 B/ u2 J% A/ f0 f$ X- J
  i" T1 f5 `1 s$ k
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
5 `( N  k9 x4 i  W6 w* P2 L; g" {0x01,
" h( `- `! {* g( J7 h$ z0xf5, 0x0000015e}

& v' ^" N7 _( n}) * j4 g0 {0 d2 H0 U2 b

- G1 I% O2 m' O1 }! P2 c# \$ w& Z
REFF:
! [  f) g( {) d! F2 P1 P" |1.
5 ~+ i/ `0 ?1 ^8 UACPI Spec 3.0( {7 e% K  ^, v' C( u! \! A* R2 g3 t
2.
" @- Z* _# }: t8 J$ j6 }$ OIntel Processor vendor-Specific ACPI
- J7 j, N- P) |. f6 R5 G4 G7 X/ `' y* |9 I7 b- e; `

, F! @- m8 V1 z4 X5 d0 B) b8 P; KThat’s all!) @: r3 j& T8 q/ y. I
: S: [+ |& E! v( G/ _! v/ a# l& E
Peter2 u. A! T6 b2 q* r1 f- L! }3 n+ H" |$ W

$ U8 e7 \* G2 U- r' a/ r0 v2010/9/20
. T6 n( X2 x  w4 j/ I5 ^# j$ }
' x2 f) U4 i& n! H5 X! I[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
0 _8 w" G- Z& S' s$ x & c5 ?# k- ~: U$ h
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
* w, k( L$ _: z2 o+ `+ wEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。: [; r3 [! H) H& v1 x
. l' U. c7 U7 U* g3 x/ @
2. P-state Control* q4 y6 f  g0 ~. t9 M# c* R+ [* G1 E
. F) n- }! u0 ?$ k! k5 u9 T% I9 d
1)  v8 F3 h: b9 N0 ~& T! f. i, l
Detect & Enable P-state) F7 g: j  @* k. ^7 |6 K2 x
# D- V+ L' W2 |4 G
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state: l0 b2 W- x& Q5 e* i3 H

) O; x/ E! i2 v2 @$ y$ M2)8 ~5 S2 |- N( X- X( k
Supported P-states1 _" X) y  o2 C! k. m1 c" A" V: G

5 @2 i; ]1 w) R# S) |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
' p# _" j, d0 }   a9 M  \* G* h
MinRatio = PLATFORM_INFO
7 R7 m6 @/ \7 g- EMaxRatio = PLATFORM_INFO; A% S3 p+ ?; t6 g" p0 N
RatioStepSize = 0x013 {) K% a+ ?  ]3 y
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1  I4 d3 Z5 ]7 x
9 G" g* d& A+ \- z
If(NumStates > 0x10)
. O0 A! ^) s# W{# e& e0 Z0 b4 W* z) j
RatioStepSize += 1
5 _# I  v: z: s& H  N, oNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1- K3 @- T& c* l/ L' m: A
}+ g7 j& q& ]/ v/ V* J
0 m+ m7 S4 r0 a9 C1 b- l
3)
. p- {, u# K6 r# J& A  NTurbo Mode
& n/ _' e, E4 J% S
! Q$ z; l6 r- ]  _6 WTurbo 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) h& u: P! {. ^1 y6 e. j7 |

  J" y8 ?7 a) Y( W! P4)
! C+ Y8 S' z+ d7 {. sOver Clock
* t$ k, B. A  _* _ 1 a% u# R- c5 y. b+ J
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。' C0 [: L+ y2 W: P' y  `- ]' v

& h; ~0 ]4 T) H, t! e! E5)3 z: h( ~! _) ^* c) `  ^8 h, c; A
ACPI Structure For P-state3 ^/ o& T4 F& Z2 A8 q. O0 e

1 L( T; W" m8 C! ~$ Wl; p6 @$ B" B7 r* O- C+ V" w3 k
_OSC & _PDC
1 x/ W. ?9 x' M% z. a7 c
) k0 H5 v" [. o$ w_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures7 |" }8 @2 n3 z" i

- I; Q7 @5 S8 z  h3 P( Bl* i6 r2 N0 U, G
_PSS% _# O8 q" @6 D0 m. a! P
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量; a. ~: p3 Y  w0 X
并且通过一个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做比较/ L5 Q; B7 R+ w$ t6 `( _' ?$ r* H
以确定P-state切换是否已经完成。
* O, n# e5 W' C  ?$ ^ 1 t/ K( f  E  G6 k
Name (_PSS, Package() $ y+ ~( [5 x0 V  t$ Y6 ]
{
5 p7 Q. J5 X) T( ^, b% u7 _// Field Name
- m+ N/ M7 z: r* qField Type 2 _5 e) u2 X# W$ a* r# Y, M$ L( ]3 ^

, c! W; Z9 C; b* Q5 a
$ j( u+ G( z, Y; c; E8 b# j1 ^
9 h9 l. E5 @0 RPackage ()
. z% W  O# e1 |0 R1 a  S// Performance State 0 Definition – P0
" p  K. {: X' p( n
% n9 j! J5 T6 V# r- w; f6 e) ~2 G{& V8 l( C& w$ a6 ?# E! B" I+ H5 u- R
0 _( I6 |! n& m9 d  f3 H% U
, _( X2 `2 Q# f0 n- H
CoreFreq,
4 {/ u( z1 s5 p- `' _2 D$ N0 R// DWordConst
( T/ N2 P6 x( E5 B
) y: a1 b  a; [5 a9 s- E
3 A  o+ A3 c9 r1 yPower,
( w! u( w) H0 F; v( N// DWordConst
+ \+ D+ G7 D2 g
% S0 e9 P6 M* ZTransitionLatency,
4 l& k+ O% \  [+ G' B. h% E7 w// DWordConst & o. L' A% k* @6 _3 \9 T

$ f- N1 u* c- V' b6 uBusMasterLatency,
: B7 g9 ?2 J0 x6 @& s// DWordConst
4 h" g7 @/ C. o* t6 _6 d6 l+ e
/ Z& o2 n# I6 Q- V) E5 hControl,
  a" B; L% \. L// DWordConst 4 _+ O  f( v$ j

$ }  K1 i& u9 ]- {  [& A8 LStatus% V1 S/ a4 `, ?7 ~+ \

' @( ~$ R6 n$ Q/ g// DWordConst
+ P* A, @! L0 l6 g, j: T$ p$ B2 I
& m% g9 D: h6 W# c( _3 i}, 7 y0 T& d3 a* A4 N. @9 ~

2 H1 o" }! ]" K, e1 f. 2 J: |0 D7 r  H( L/ K2 g

8 A" V% ~& d2 _& z, |.
  I2 q. z' A( F; A+ Q# j5 f
, H# Y  Q; H% C% E% t. 7 I& e+ v/ h6 N+ |6 _  G
}) // End of _PSS object/ e1 n" k- i6 s/ g
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
9 e8 y, \# N* e% l, ^1 a
$ i3 ^. i. Y  O- LName (_PSS, Package()
1 q" f7 @9 M! d# d* ~* @: L2 O
$ d' C6 [7 z5 E, Y{
! z$ G, j* r: Q# {1 {* q& t" E1 p7 S8 t* W! x% r
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
' b# l+ f9 T0 T, A; x! m% f
, [6 W( U3 [, ?: T7 Y/ g* XPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) ! u$ j3 J( z; @/ @

6 [$ v4 V7 m0 m' P( @6 p4 ~Package(){1400, 8200,. j1 v; P5 }/ ?2 \
10, 10, 0x000E, 0x000E}/ b8 b: w2 L0 a: M) x
// Performance State two (P2)* D- O  p4 k* q' r
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 5 B# l: M" |0 Z3 X* F( b2 O
Performance State one (P3) . s" x7 d) d" R9 s
- O9 T: N5 F" v; P  a& p7 a
Package(){1200, 8200,
; y% s  q! ]3 C' P- J3 Q10, 10, 0x000C, 0x000C}
' X6 J' T) H0 B; @8 S0 L% p; K( _// Performance State two (P4)  ~6 M, Z% P* B% {* ~& K# x
) c9 O4 X, v( |! ~8 C9 @3 E
}) // End of _PSS object( @8 T/ {: B, b- w% c
. o3 Y& b& }2 @5 D
另外当该平台支持Turbo Mode P0将会reportTurbo Mode1 q! @# Q" s0 s, C  t7 X$ P  G

4 ^' D! n- V4 Bl( Z6 N5 T+ q) T# x4 \" s, Q
_PCT
! T9 x' Y, K+ I0 Q1 z5 |
! u& K7 c1 R9 X, |  ~) X( q$ `. Q, XPerformance 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的方式来进行。2 L! p2 E$ f: D

$ y( n8 e3 y) x' w, xName(_PCT, Package ()" v0 d% g4 P9 n1 ]: R( X! p
// Performance Control object # ~, q# a- G* z7 F% b& G

" @: U: r  v8 l, p- ]{ 1 u" d: m1 r9 ]5 O' o9 \& N$ I
# X5 m9 _; g/ f1 o" v
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' b5 g: p# @* w0 C: L
// PERF_CTRL
% D( \4 j# g$ }8 }' T. z
$ Z/ `; G+ m5 rResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
- C: m( x+ [. _// PERF_STATUS   r; c8 F$ `& u' x7 n# L

' t+ T  ?: U1 U- N% w7 n}) // End of _PCT object- I' J$ x* N+ v% A. `

1 {/ l6 w6 V9 F8 M  ~+ \7 ol
' {+ J+ ]2 h9 Q2 o) D% T; n
_PPC
$ w) _/ Q7 _8 a6 ], i- t6 M 2 V0 K- |* P- 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
9 T) R$ D3 X4 [2 }
- F0 N  J& K% E5 V0 GMethod (_PPC, 0)
  x1 x2 \7 s8 r5 N# e; Q( v// Performance Present Capabilities method
5 O9 Q8 |* _1 n" x, |3 W2 [  D9 P& r4 j/ ?' F
{ : }& S8 {4 w$ C1 D$ M: n& j' ?+ w
  X5 M2 D' h! G: P7 \8 q9 S
If (\_SB.DOCK) 0 \+ h) z6 o$ m% S) S1 i
" H. r4 `1 `( a2 U" N; l* v
{ 3 E4 R% \" R. T' o

) q: w  _1 U( t' J2 i1 s8 uReturn(0) // All _PSS states available! h0 V3 N! y* Q* U. C5 G0 c

. j/ M$ Z* y  }7 U
" }$ y& i5 N, o' X9 ?* B& x} 2 Y/ D8 a, q9 w" b( h( l

5 [; K, w  H  k5 W9 E9 G0 g( \If (\_SB.AC)
! l$ ~- \1 A7 A. |& |3 r* a( M" E+ b. A
{
& x4 H% O1 V3 p) o  E" H" c
8 e( i: s" O6 B1 }Return(1)
7 ~/ k4 ~; A3 |// States 1 and 2 available
9 q& Y: X. I- v2 t5 o4 B
. Z) k" g- z1 Z; s7 r} % S$ F1 W. s% E
+ r& W3 e4 y- N2 P- ?5 Z
Else
0 }/ B0 x+ \/ m* Q5 L/ m1 M# w1 P0 y8 ~* |
{ ) `3 q  r# I# ^9 p! T( d* ]  ?# j1 u

/ S* }/ q; [! mReturn(2)
- a3 ?- c( h$ }' F6 t// State 2 available
! h; e- f* M" \& Q- {$ R! ~1 M  h! S7 H9 C4 A# L5 [$ e- }
}
2 z. e: G8 \1 Y% e
7 j. H% N! E% J& a8 ]/ i. }7 J+ s} // End of _PPC method! w4 W' u% Y4 L5 v

2 R  y) M% Y$ ]( M$ \! v" Nl
% H2 R0 K" r: \9 X0 Y/ |& H
_PSD. y3 F8 t3 Y5 U8 f

" b1 ?" j" u4 CP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。* b9 I6 s" b6 M

7 q# t6 w. e$ L" V+ `REFF:
/ N, O9 C* ?8 G9 f, u- y1.
# ?, t" V! ]6 Q, iACPI Spec 3.0
' e, |/ x2 _2 Y  o5 p) U: e( g& ?2./ B$ F8 F1 F$ U0 u% C
Intel Processor vendor-Specific ACPI( Z* O! U9 Z. E0 j3 W

* Q: L* O* ?0 `, u4 l8 f7 {. F( F# m
+ |2 _- Q% D+ S+ F" YThat’s all!+ u3 i% w3 {$ |: o' H+ v* R( A

3 N! a% F  H; p( f/ K9 _% Q, VPeter
( [& |" f7 [% c% C/ }7 t ' B7 i& o2 c3 k* Q4 v# K6 o; u) `
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview8 H" r) @0 a/ C
" R$ T; M; V0 k7 b6 }! b: d
CPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式' C0 Z5 N0 k5 w3 B8 ?; n% q. t
,影响系统的功耗和温度。3 @. }% y& ^! a9 Q; W! K  L- y; S

$ [1 W; O, s' c. Y: r2. T-state Control8 e% S( |  P) W: Y; \9 N, ^
% Z/ U/ ?8 O$ u( \3 T" @
1)
* v+ `. [2 K( _) BMSR Based Control
# e9 D# ?8 P& y$ o) w
+ J  N! ~/ {; P* oBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
; R: a: i. [& i
5 K. {1 b1 W  [2 _3 W2), ~3 P. a& ^9 G2 m8 C7 q1 P6 l
I/O Based Control
8 `4 s9 Q0 C  O- D6 Y2 X : [$ ]2 {: T" t8 I; V
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。: Q8 Y7 J$ K, e- l% c; i# N0 U
% s$ O, q. K7 T/ m
3)+ @/ @; J. D! i$ w/ V" D4 F% R
ACPI Structure For P-state
! |( S! e" \/ l) vl
. v6 a3 g1 n+ l( j5 H
_PTC; e- E, z3 y8 X" q% E+ e

" a, ^* Z% U/ j! {# qProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:) _, _9 x9 p) t8 D
( K+ f) V8 t7 y) U
Name (_PTC, Package()
) p! C) x# U# N+ y{ : |3 `/ N3 T6 y' C! \" v- K$ f- ?

/ w# b- ~- f- E3 kResourceTemplate(){Throttling_Control_Register},
/ e& w5 ~& R7 [& {% Z//Generic Register Descriptor
! y6 |: p( R; U/ g6 {! S: P! R# B' m3 r, V
ResourceTemplate(){Throttling_Status_Register}
1 K$ q& e! |0 g1 v//Generic Register Descriptor
0 g0 A7 i( N0 N* @}) // End of _PTC
* R# P' S/ |. i' L( B. H
, |0 S+ T* p' x9 m下述是一个sample code7 I' c& i* G) g' z5 R( o- @

4 D& v+ g3 I, p. D2 W" C% S8 F, i, n# m' }9 @  \2 ?2 q
//
8 n/ V/ g9 K1 Y: K: W! K: T' R. `) W  y- i/ ?1 l
// T-State Control/Status interface1 G4 P0 m4 L3 K
. b8 L/ m& |, n$ c- B
//
- W. {' r( c6 ^# N+ K3 r! X9 q0 ~3 n7 g# @+ \! j% F
Method(_PTC, 0)8 m5 D0 q4 J! Q) S) b4 {7 W* |
! {5 K/ H; a; t1 F
{
* v' N1 N) ?4 Z, E2 L5 k0 ]
$ K. _+ V% D) `6 T//% E  o% M! C( i* a; N6 Z$ A+ O! Z
- [4 i! n. J% [* e* E0 z% `
// IF OSPM is capable of direct access to MSR9 Q) d3 ~& m2 b& _; n
8 B& P% R8 H; W/ s  z7 P0 m
//8 H% Z# G6 K" a( v: k, b' |
Report MSR interface% i+ B0 U6 x- v
" O5 W9 A$ b$ ^% B6 R. h/ K
// ELSE4 n; I. m" Q* ]9 v5 @  }6 E
; s* G: r+ r5 {
//
/ |: z  k) V1 T3 b0 rReport I/O interface
: I. B1 c3 Y9 }+ G( O8 R
: w+ i. S- U6 B/ n# w7 u//- ?$ i% {- b1 @2 [( x

6 e6 i1 c0 V+ ]//
/ {/ y4 l1 p/ ^: ^$ d! \9 g# a, BPDCx[2] = OSPM is capable of direct access to On
$ o, k' T3 }( s) B) F2 r4 l9 v" O" d+ M- C2 O0 h
//0 c' R5 i5 P/ @: d3 S: L
Demand throttling MSR
0 g) I" L# e% ?6 d" y: U0 j  d5 n, O3 i6 s% n
//4 I$ q' o6 \* K8 v; ?  e# c

+ Z- S: x  \7 K" t9 }If(And(PDC0, 0x0004)) {) T2 T- o  @7 c
3 Y, c% C* }9 J% \/ K
Return(Package() {
& `5 b8 x! }4 M: N
  W* z  u3 d! p- f! d, d- a: KResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
8 v2 D/ u  f/ y1 N' O5 ^
+ ]1 p4 P/ K- bResourceTemplate(){Register(FFixedHW, 0, 0, 0)}/ A9 q2 @' `0 U  [; P$ W& t, N5 B1 v
3 w3 c: t) {/ d' c
})! {: ?2 F' K: f" H/ [

7 O+ g8 v* W, l, M}  p- b* S" l+ L# e  o% G

- |: z& K, v3 l1 Q3 [' t3 d' {" S' q4 W: cReturn(Package() {6 I+ |8 Z8 d: F  `
8 }  s" x- X1 X
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},. g! R1 a8 J7 }: u" e$ N8 I
4 j$ b% Y9 _; \
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}2 I$ z9 E3 C1 k) N. E

7 ^: ?( C1 M# M, |$ W# q})
( |/ g2 Z/ N2 e3 l# D. z# g: w: R# G8 s9 ?% b3 F/ l
}
$ g+ w" J! ~# T) Q7 ?7 `" v  }3 E% a" D
: c( K, o9 f- y  T! R. N

5 j* @2 K5 e' U; ul
+ m9 [) ^$ O& H3 u8 x3 a5 d
_TSS" h+ s6 r% w8 w6 t
& `; c) L4 n" c, ^# @5 ~( t
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
: Y2 v" x" t5 z3 @8 G! y8 wName (_TSS, Package() 7 u" z6 j1 i' c: E, d; }) v) r
{* L3 Z% b! E- N) M
// Field Name
6 n: B! B7 _2 q. j0 N* G1 s! D# U; bField Type
8 O# r& d% \+ K7 {6 W$ Z, o0 n; F4 F5 a* R6 r. L

0 i& ^4 J0 ?9 w9 s
- ]  s. _* \* H. }Package ()" y, c) j& Y. G- A, R0 F
// Throttle State 0 Definition – T0 0 v! U! J2 g  t' ?! R5 A8 d" _+ [6 _( J
, W$ @: L6 _& y' I6 t% N! D% P# J
{0 S* ~9 V% d9 b- E

! t# T5 @9 T; z; k# ?2 o
# z: l3 Z) t# x$ T7 \FreqPercentageOfMaximum,9 X, q" M9 `; L) J/ l0 Y7 V- `
// DWordConst
0 J  u( M8 H! X# e" ^& ]& a( w: w7 K% b1 C" W$ h7 M3 G) ]
Power,) a* c- D& `/ A: k1 C' W
// DWordConst % U, c% t9 l9 K% L9 \
# B0 f, k  Y! u% X) N
TransitionLatency,
/ D( V- o% t. T7 u; n// DWordConst
5 S5 L4 e" w4 |" P% E/ w  r) e! j) \+ M) X
Control,. k( e+ Z. e3 v; W8 u
// DWordConst ; g% ]% `/ \9 t4 W
0 Q8 a& T! t  l. G$ I4 a
Status! F: k7 J% U& t  s# Z, S: w2 |. s
// DWordConst
& D% B! v4 Y5 k},. D- m4 P4 ?* m  Z2 q
……
6 _. h0 t6 t& n}2 R% n: C9 E4 B+ ]* U
. U8 E8 @: g1 m" j$ w9 v
Example code 如下所示:% f: n( b7 @7 X

& a- t; _: \& P) m- r( dMethod(_TSS, 0)
7 Y% o2 Y( s* J; r
3 ^3 v9 C8 K  j- G& W1 V2 w/ ^{; ~5 y$ K, c; e0 [9 h4 Q- U
6 p/ S+ P4 K3 z3 U+ \6 ?' P
Package(){100, 1000, 0, 0x00, 0},: s* }3 N& F/ o5 O. P
" x* h8 E+ z5 e6 P
Package(){ 88," H. W4 r8 \( b9 i. q. r0 U
875, 0, 0x1E, 0},
/ L) P4 U3 J7 z6 s/ S
4 g) L: G! Z3 L! ZPackage(){ 75,
3 z0 v+ W3 t$ B( d  x+ h5 ^8 {! G750, 0, 0x1C, 0},$ J) |  N# k- V1 I' e) B. x+ Y
1 l; N8 K5 `+ o# k
Package(){ 63,
  [: ~8 I7 o) w7 o, D5 k* E625, 0, 0x1A, 0},
2 J% S  P. z0 L% x  z5 U" m4 x) d
% R% N# N9 |: g0 T* g5 iPackage(){ 50,
0 @$ y( D( V: O: R- ^500, 0, 0x18, 0},
0 H0 t0 H5 y% \! y! Q/ S' @: E, U  w) v) P# T1 Q4 p0 i1 j
Package(){ 38,
( L$ \; P) g1 L2 [# M' k: v6 f5 u) h375, 0, 0x16, 0},
& p1 E; v' {$ u2 {4 k2 A1 j
* c3 {5 {; f$ E. jPackage(){ 25,
2 B, p& E1 e( G0 s7 H" @, V250, 0, 0x14, 0},
' R# I" R" L1 k! r4 n
* O. w) X0 c$ N6 Z. DPackage(){ 13,$ ?" I* R3 \9 J6 R8 g" H
125, 0, 0x12, 0}! k+ K8 }/ l- Y4 Q
" b6 Q! h6 N# Z* i
}
6 {! y1 O4 V# f4 |
( N" s, Q4 J) C' C4 V3 s, x% c. p3 L; j- [+ ^1 T
l! [! P' x* o& {3 e
_TPC7 X! w8 c: B# Y" O3 w

% F+ C) l5 q) `2 C7 G1 m. _; oThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
& J$ V3 t, I- I3 T4 _
( P+ d/ t( [) l$ }5 u7 B& h: Gl! c# y: R4 z7 p4 U9 Z
_TSD
  X  k: a0 a  j3 p
8 N! T2 L# c, \T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
8 \, _* r- A- y) I9 m
5 n0 E# a) N  D9 n/ Y0 vName (_TSD, Package()
6 _( N& x! @" r- D5 }
( t, l  W8 i  s3 `# O! w) }{ 9 E6 K  `; q) R1 m0 K
2 e. ^8 T0 a' |" i6 C
Package(){5, 0, 0, 0xFD, 2}
$ B$ d9 E2 ]# o1 ]// 5 entries, Revision 0, Domain 0, OSPM
- V% Z2 ^. i$ C% ~1 }+ j2 T* vCoordinate, 2 Procs & ~3 O) `% ?2 q* d$ |

) n( H$ {! }( W! ^6 k( n6 I8 ~+ x8 n" p- _1 p' y1 ^5 U5 l; T
}) // End of _TSD object. S6 \; H0 j6 n& c  w0 P" j

$ }1 V: h. b) i8 HREFF:
, Q7 [4 L$ ]( j6 C3 E1.; Y& ^! x8 x- p: ^( j
ACPI Spec 3.0& Z" C  g! ^, q1 a5 o( Z" T6 {& r
2.4 M4 e8 g5 x0 a+ _; m- d7 i
Intel Processor vendor-Specific ACPI
, {) v  G* O5 M* x/ w- }7 i6 [ + B% H, m) B6 ~1 j) G
8 S! X; [  l/ ?) Y' D
That’s all!
+ |4 b4 c( a, F" ]) Y; P + k) N/ p9 X/ s. s, P
Peter1 K+ ^5 ^4 f5 n6 W; D
! e  r6 _3 q  U; F6 M& G
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 08:00 , Processed in 0.095730 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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