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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
& w, l. C8 K2 u8 o. U1 _. }
1. Overview
% E: Q& j" B8 I# _0 V& w+ B; @3 u1 O

7 y! @, m' P, Y+ v6 e, V, F- w* i. |C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换0 I2 [! i1 K( }$ B" I1 E5 K% m+ [$ l
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
& I( T/ c/ n( ]0 X比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。5 O9 p* d0 K# d* v9 E: N. x; z
/ p- R0 f' y. Z# v: _$ }% t
cstate1.jpg
. Y1 r& N& B" O1 |6 H
1

! s7 m; C& Q# W2. C-state Control- Z* z7 \3 B: n7 N. F  u  g

. v2 ~& t' `9 j1 m, y) T1)2 X* a& Q5 T/ g4 ~- v; `/ `
Detect & Enable C-state3 o1 x) l' J/ t: \% U
; Q- O/ }: S1 r4 T! M
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的支持。
  ?" z5 w- j" q1 f( X- c
" ]$ L8 A& v& R* d2)
* i- m" B9 R" D* A# A6 R' RC-state Basic Configuration
) T& I% X1 X% J" l通常情况下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)。5 s6 L8 E6 N$ ^
9 q/ c& e8 P4 t  M' G# p
3)1 I) d" K8 P+ c
ACPI Structure For C-state, J& X. }# a/ [( ?
* O1 g9 n6 v4 b. B& q
l
5 q# D* a% F: _8 {
_OSC & _PDC
9 z% b8 L% `$ _! k* I7 G# o6 D_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
" _, o9 M( r# C" P; N3 ~l
4 Q; E; O1 B2 ]( O" D: P" q# b  R
_CST
  b0 F) @3 H) P_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:$ n  ]! r9 i# M: ^# d9 k8 P
CSTPackage : Package ( Count ,
: D/ B+ g* g; KCState ,…,7 i% R# l$ ~9 s7 r7 {
CState )
& ^- E5 ]2 z* O. s4 t其中Count表示所支持的C-state的个数
7 D- _4 v( E/ _) x- bCState: Package ( Register ,% }: \' l( W! h& Q. r0 E( }' g9 H5 H
Type ,8 T* ?, J+ m# X  l" I1 h
Latency ,$ \. H9 }& k! N; i+ W1 Q
Power )
# x% ^$ X, a4 a; W4 r/ j  g7 U& v0 R9 u- P  v; X3 p0 O  Q/ L) {% |
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 C39 E: G4 L$ g; c' z# ^5 D$ H4 n: v
/ y6 P4 p3 N( a1 e
Name(_CST, Package()  ]% }% E' g# @

; Y, |# ~& t- I* S8 ]{
& i- W. Q: O8 H4,6 w9 C  ?* |4 l# n8 d- w
// There are four C-states defined here with three semantics

* u, s% \2 l4 t- u% c* M/ l# D6 v8 C% n4 g9 s8 S6 g
// The third and fourth C-states defined have the same C3 entry semantics3 d2 [" m; e$ T( U5 B

; R8 B) f3 ~: \- f8 N2 fPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},0 A+ a4 l; @  a) n
1,
1 A! Q, x) |$ T. P( s20, 1000},6 s. Y4 x8 C4 z1 E! y9 `: S
5 g2 U/ K: d. i) K, ~$ E$ q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,1 q- U! {+ w9 ~; C9 L
40,! W( @" o4 _+ Z( l
750},

: U3 ?. d1 O/ ]7 `3 i; A" x7 gPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,  K/ f7 g! ~( H" i
60,
3 |7 w' `1 M9 d500},

- z. C& f5 q' }' xPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,5 }  o- N3 i+ F1 ]" v9 ~) g* r& T+ S
250}6 \9 o* c" G4 f2 V# N& V
- j" ?) f3 A- @3 y  B
})
1 e2 K$ ]+ W" g! I( B, |  J9 `# K3 A" Q0 ?6 C
l
! e1 o8 w! V7 f5 O6 h. ^% u, Q% B
_CSD
1 o5 E& z( `& X( N; u; k6 p9 v6 s* S# t5 }+ b! N- q
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。5 E% N, ?3 F* ^  |+ G; g

, H9 I, c" v6 R0 S: [: o
) e% ?  F/ Q: \4 S, U- K: u( o) q6 l) f: u' Y
8 K) c( Y4 D" D* ]
3. P_LVL VS FFH7 C) ~7 Y+ p- h5 j9 s

0 W$ X( T/ X' _2 b& I0 F' fP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
* v& S* m4 D& eFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:( r2 R/ W0 `+ i. c
6 F" }# l" g- K2 F# A$ G
gas2.jpg
. Q. J6 B5 g9 H0 U3 w4 o& h3 s: B* a
2

) U7 O) Z; b* n& `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的一个例子:
8 a( |7 [; T* `& @9 K: HName(_CST, Package(); X% c4 }" C' K) B+ [, b

* n* k, t+ d0 V  g: Z! E. F{
9 X8 n# {. ~% S% H0 _+ n8 n2,
# X/ ]4 O* L( {7 _! d// There are four C-states defined here with three semantics
) l7 v% @4 P6 m; }
9 Z: q6 ^2 _+ v9 a, Y
// The third and fourth C-states defined have the same C3 entry semantics
: D2 I! @" q! O! _

  ?8 n  A( ], I% G+ n) @Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
) _: C4 E% c6 L0 p  p( ?$ g* F7 A0x01,
: _6 i* p" P9 u5 z' y' J0x03, 0x000003e8},
7 v# f: I4 `( g  H0 E) G7 M5 E
4 z9 {* }% b+ Q# X3 {
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},; `! U* }8 T) b9 X/ _/ Y3 K
0x01,
' [1 i; q4 W( l* X. X1 ^, i0xf5, 0x0000015e}
! b5 S+ D+ b+ X6 K  O% [5 |
})
# f" \4 u* S( |6 D. ]3 x# V; P0 i
# m1 W7 H, D5 N; H
' B2 J% ^. W- L) vREFF:
% w5 ?+ M& X7 s+ R/ O; C5 a9 u1.
, b4 W2 E7 X7 y5 pACPI Spec 3.0
1 c2 g( i' h  d( R9 M2.
1 c, G# w. l7 r6 L0 `3 u/ TIntel Processor vendor-Specific ACPI. \) Q% K& H* |$ y  ~& s" m' u

. i. j. L$ d) F6 p  h1 z0 T+ H, P. s
That’s all!! |4 b5 u. ^, I  F
9 k  E2 N* w9 y& ]6 d3 \
Peter
8 `  G/ C2 a# j! [" L9 n& N& V& u; z3 M+ n5 P8 X" m: X
2010/9/20
" f- `# f+ `% \& h' f0 i( G1 D: h
& _6 ?$ D) ]' `/ E  T& }2 c[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
2 e4 ]; a9 |1 ~- H' W 3 s' }0 R, P8 \3 y7 [) `
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
" [1 r% C: L. ?% `! k7 H7 q1 F: N% T: UEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。$ b0 p8 F0 u( x( v5 Q5 F# N2 n

- E" s, j" ?+ ~2 x1 n' p2. P-state Control' G# E, S3 V; p2 U9 S

$ A3 |2 Y) k4 c  V' s1): l6 ]; B; p3 v% I/ P, I& n
Detect & Enable P-state* n: V6 ~1 B% k9 ?& L$ J) H; z

* W5 C  |& Y8 ]) l. B8 N- `+ rBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
7 G9 r. ^2 D9 p0 n- r
' q$ r: k+ W" h4 A# ^  A2)
' d$ }0 n& a- i: Z. j# g4 _/ jSupported P-states" ]4 P  S7 @/ L* b

. j* J) Z" z+ r% E9 OBIOS 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
1 I0 y) j5 E% D$ M% g# H. t + u. b2 b5 E/ @! d
MinRatio = PLATFORM_INFO
( D6 A& ^0 H* M8 V4 n& j+ n- CMaxRatio = PLATFORM_INFO2 e2 C7 c( f$ X/ w
RatioStepSize = 0x01  J* }- P2 X7 }2 o7 B1 \
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
  L' R4 {- B- V2 s9 N
" ?. F, m$ l0 L' \2 A. JIf(NumStates > 0x10)
- w: W+ j# C9 g$ r* q( P{8 u6 Z, }. o+ [+ m- E9 t
RatioStepSize += 1" q7 F3 u+ r( |' D5 R# h
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 10 \! M0 h/ C, b8 R
}1 m* z/ j& u8 b# W

4 a0 y) [8 S2 d1 V5 {% O/ u3)
6 @8 W9 M* J) [Turbo Mode* `1 K# ^$ n+ i; ^3 _+ }
( c+ m- Z3 r( P5 s+ ]: e$ z
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
$ Y4 L- x7 t: i6 E : I) i) l5 U7 p) b6 U" I  H) K
4): ~7 X7 E6 q4 Z. m% Z6 k& t
Over Clock: y0 g0 H) O8 d- s) H) k

4 b7 }4 H' E3 u& i. M某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。: T7 n9 V& d7 s3 q! \
1 ~) m+ Z' S- }' s' }
5)
, e0 Q; [- G9 C1 n' j3 \ACPI Structure For P-state( N, E: o$ q+ |' _5 m1 n6 \

& w, I; _8 m+ Gl
. x7 c5 _5 M9 y- e8 L$ |7 F5 M7 s+ D1 w
_OSC & _PDC! U: ~1 ^( C  U+ G6 E4 A8 L1 X6 L
2 \/ y/ U/ V) J/ Q( p/ B- T7 @8 n; f
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
7 Y8 d7 l, j; D% z+ {& }" i' T
- `. m- M* `" a2 x- Q! Il
1 L7 n/ }% M/ e% h
_PSS% U& _9 k' f6 ~1 g2 X
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
  F8 }; I; f4 a8 @( H! Q并且通过一个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做比较
7 o; T- @# S/ N$ ]8 J& J以确定P-state切换是否已经完成。) u. B8 b0 e. N% Q5 ~+ ]. s  u
% z; k5 [$ @# N2 z7 U8 q
Name (_PSS, Package() 3 u9 Z" s, |5 x( W9 q1 C
{# A& \0 N" a" C9 x
// Field Name* Y- o. }  y$ X( j
Field Type 4 X1 ?3 e) ]# c0 P& {

6 d& W3 x8 `4 v9 F0 r: {+ I3 b; f* Z& Z

1 w% v1 Q9 H+ T: a: RPackage ()
" y$ K' t( o/ D. b" R9 j, B2 {// Performance State 0 Definition – P0 / ^( v4 U( o. ~5 C3 W9 a1 R* C

+ Y% d$ N8 A; ?1 B% F9 W{5 M, w( L4 `- A* O
) ^. z) X; o, z1 ^+ C# S

' d% B4 S& D" jCoreFreq,
% A* w* e" D& G( }0 U// DWordConst
0 l& z! u2 P1 J/ c+ V4 k! Y' {5 l: ~+ r0 ]3 K. @' @) J
; O% U; ]) c% d0 v  E; P
Power,/ k  t2 W& {- F: w7 N& N6 P
// DWordConst
7 U. e; l) z+ O/ y1 u- v3 c7 L
TransitionLatency,
+ Y) H4 G# \7 S3 V9 I% T// DWordConst 9 S$ t& h: [! }8 D
! `* m: z0 A5 x0 D4 j4 m3 ?
BusMasterLatency,
7 Q0 p( k- u* x4 |// DWordConst
1 M4 @, a6 g+ n& D
9 {# s2 Q$ F" M. yControl,( `1 w6 P, k$ X! k8 g. J" @- [$ D
// DWordConst " R" n4 J4 }" f" d

7 i5 j4 W: v; pStatus9 o" q( q: d  {$ q$ @9 o
" t% Q) z# d5 P. f8 u$ Y3 D6 z
// DWordConst
: I! B/ E( b8 Q* j: \1 I! V% M# U# ~  W! i% ]
}, ; v5 S: N" W  j/ k( D% u

  x  S( A- g0 {5 {& U.
! p( f6 d. n1 z2 _/ K. |* I6 H  f; F3 W$ h6 A! N
. 9 }9 {# B" r$ i! \

4 B" h7 s; ^* P.
! N: Q8 {, o( c9 M1 d& E9 e}) // End of _PSS object8 L  q( w$ A7 D. G5 s: e
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 . b' z  c3 _! D5 c. W6 U3 U

5 f7 z- G) B8 h# R* EName (_PSS, Package()
8 q# H! \1 X1 x) z, v
: @& J* J% p# E/ f9 R& V# e7 N  ]{ , W; j, t- n3 G* A2 D* n
0 @6 I2 r) `" L2 B
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) : _; s* {7 k# H2 k1 l' F& w
  Z( v  y- j' Q3 H7 u
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) % C+ N+ Z1 t" X8 y0 L+ h, R
3 c0 X7 S5 X7 @8 H1 z$ b( ^+ y
Package(){1400, 8200,4 r5 p- e* _4 I% |/ [- ?$ }
10, 10, 0x000E, 0x000E}
7 r, K. w1 S( A% D! V// Performance State two (P2)1 t5 U6 ?( e) ^1 c3 v- h
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // " O' w" o3 B& Z5 S  z
Performance State one (P3)
* _8 x* Y5 q( F8 @2 ~: y% J$ J) V! E) V8 M' l2 s# F! ]
Package(){1200, 8200,# X! H) r8 _6 K  ~1 |: e
10, 10, 0x000C, 0x000C}8 Y& h$ r! \0 j& Y+ z
// Performance State two (P4)( o7 Q& H3 w3 b  k! U& c
+ V. y7 k' P% M* ]
}) // End of _PSS object
( E/ |+ y8 c: j, k" I* i
. G9 Q! G- `" H- B0 m另外当该平台支持Turbo Mode P0将会reportTurbo Mode
+ d( w* N7 P8 ?* x/ ]
0 P  J' g' i$ m( I0 g" S/ O5 dl% T, Z7 [6 q6 F% r; _
_PCT- A+ J1 p# J& P% i" G: Z
9 _0 {- u4 O/ j+ p
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的方式来进行。
0 h+ f: n. v6 V+ d5 m( `8 Z 1 H) @6 ?0 t% L* I, g
Name(_PCT, Package ()
  x: t4 k  g* |8 }* u( w// Performance Control object + B. r9 R* j( p+ V5 `

8 {. U% N& s& S0 P{
) }+ c; w3 U2 b+ e! E* p* f, X
0 m, s* S/ B, @  n3 j; Y7 cResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
. ~6 ?5 y0 X# C. ]/ z- t// PERF_CTRL
0 c3 z: x5 c& K. e; Z. y4 g5 x
5 q. K1 M. n+ FResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, a- x+ \# H3 {* ^; q
// PERF_STATUS
1 J% Q! V4 p  J, a6 [9 r0 L# D! {
! S" {  N: S; Y}) // End of _PCT object. k, D# P# X: `) p. C, x
6 w* K* Z# a4 g& Q9 k( n
l
1 x5 \! E4 @( a2 m" V" u  [: l
_PPC  I) @) i/ i( t# b; O6 E- D) c: G

) F( S0 ]# f* g7 Q" x  o0 j) Y: 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
2 z7 \4 G+ |0 \) s& l, ~
! ?4 H" C8 d" n- E! VMethod (_PPC, 0)
" b# i" O7 D; P9 S% a0 z3 C// Performance Present Capabilities method 1 H, s/ x' n+ ?5 b+ k( {! g9 I  l
! G  x' b, @4 A; Q, P* T+ E( L
{
" f; n5 i; _2 f& Q+ K6 r) @8 N3 A. i/ w1 @9 b
If (\_SB.DOCK)
" [8 T1 F  M4 e, L/ V# p9 |, z0 m# [
) v' b7 O# u0 {6 k& Q+ h9 N{
- e- U; }# j1 r* u' A" B+ `4 c0 B9 i- K; Y% _
Return(0) // All _PSS states available
' H# G0 n! \/ V; g8 ]; F8 \! k+ x4 ]# }. B

; A, n8 g2 m  G$ Q* i$ ^* F5 B- h}
: X" M$ ~5 A) M: h& P! _
+ z* M6 s, ]2 [) P1 \, F$ ^" H7 D3 hIf (\_SB.AC) ; u( w( |. M+ d  Q4 G# _1 R
3 J# c* l. S6 D% u; u
{ # B+ e0 c) X' e; {
6 Y+ O0 R7 \' d9 ~
Return(1)2 i3 Y: k. C  I6 T& _; K( m
// States 1 and 2 available
; m4 J( I: }1 u; A0 j
9 t$ u: E9 N, P5 O* M7 E} 2 |+ K" N- ^  @9 `9 `
# }" D4 u1 y7 H! {3 s
Else
/ D& ^5 I/ l7 E" G
0 [; Y; H; |3 S7 @1 d# Y{ 3 L0 w4 ^4 a" @' r+ i9 n" E
) u" G' {2 r2 y" v) l1 Y
Return(2)
! W) L. K6 [* r" r3 O& A// State 2 available/ f$ W7 {9 N5 ~0 G
5 {  z1 t: q) s& r
}
2 X3 y: x# |) }, M/ R. o- l6 H- ?9 c7 x! K# s9 Z/ m/ x8 R
} // End of _PPC method' e4 N# O' i, T
8 V* m: ?, x0 @% G/ t5 y
l
7 E" i# V' _$ x* k8 @- B; g
_PSD
7 R$ U5 p) j' M0 N" t2 ]3 R3 d * B9 x( h% z7 D
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
% J/ l- Q' ^1 w0 W+ j
. E" S* F) M% I* D2 E, {9 fREFF:6 _" H1 o6 ]* s* i- o' B* g; ~
1.
! F- G4 I0 h, ^' ?! N4 V1 `6 bACPI Spec 3.0) l; b% D$ T  |. m# ]
2.' C6 |# K( ~! ^9 O& D
Intel Processor vendor-Specific ACPI
) u5 z1 X4 _6 y0 Z  k
0 Y% y4 b# r8 v, W: D 4 e* Z. K; J# m# n+ e8 i. z' g
That’s all!1 U/ t9 o- t5 J
0 ~! N- n+ F: J" ]& s
Peter6 E5 ^1 X6 A3 P7 J7 L9 x2 k4 n

( H# c" F, W5 d0 O2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
! n5 C# X" U7 U) j ) \; f' }1 t. ?! r4 f& {
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工作时间的占空比)的方式# Q! S9 l, v3 e. m) ^
,影响系统的功耗和温度。
3 c% s, @/ b' R- \  g. s
& {$ _. E5 h) W" c6 |9 Y6 G. C2. T-state Control! G: m/ y# R0 x& w% w

8 i& G# v% u8 t+ `4 B1)
2 }5 B, @+ A- q0 t  J' l3 \MSR Based Control3 i' ?. s3 k  c1 t

( c; U7 X; i7 hBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
$ N2 @4 _) n' X5 T/ N4 j& a
8 D" x7 ^8 t" W# R+ y! s: x) s2)& D. V2 h5 E8 ^
I/O Based Control
& m! M0 N! ]: P
' H& L  C" |, i: t8 Y5 Y# k除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。0 k5 ~( P1 N- u/ A9 i6 X8 V

) t% a% ?% g( n9 i. g7 `( F3)
; K  U2 h% L. p/ tACPI Structure For P-state
# J& o' Q  t" d" S( Kl
- a3 G: S$ U, N
_PTC
8 |/ y0 `# M& X0 r+ B. m8 w0 a 3 P7 X/ L; Z0 u4 \- `
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
( A8 J# E/ G7 c- v/ j5 {
8 r, Z; ]! o! q1 tName (_PTC, Package() . t1 O9 K, G9 _. @; ]
{
$ k0 I8 ?6 Z7 g% y
, l9 \; |% u4 z( U- HResourceTemplate(){Throttling_Control_Register},
5 D: ^6 _8 D- A% p& x5 Y0 |//Generic Register Descriptor
! S8 F# E$ _3 ]
; o5 O. D- a# g7 j; v$ h4 h  ZResourceTemplate(){Throttling_Status_Register}4 p' O, |" w/ g6 y- Q2 {
//Generic Register Descriptor
- c' g" w1 V) [" n3 c8 U}) // End of _PTC
2 A4 P( v; g1 i9 B
3 a- z* |( Q; y. p" l下述是一个sample code% ?, M) C1 x& m  Q6 ^

, c# G9 X: }( [( d3 U8 o0 z% M- ~! {/ T! O
//
; W! U7 K" J$ ?; L# h" X* v9 r' r, F& C% z. G' J# w) e
// T-State Control/Status interface& h# y  j8 I; s3 M. q6 Z0 z
' @! P' H) \% F# f0 J+ d) H
//
, ^; @( i4 u/ w- b5 e0 z! E& B: a4 ?. s: x) o
Method(_PTC, 0)
! }0 N+ d$ ^9 J! r
4 ~0 L  U# Z; V) C: n( n{- ^9 G! \( g; ?6 t3 c- j

/ N& S3 p% A' e5 w$ T% \& w//$ W7 e2 M4 Y3 h) z) k
& t* R* }4 _, b9 {2 B4 `
// IF OSPM is capable of direct access to MSR) f# I0 r& x! \! Z- {" E2 _

& I( C: v: o( f5 V//
% s+ ^; v/ T7 e/ Z0 N* VReport MSR interface
3 u/ @8 c& `6 W, \, r
0 g6 O, h' Z4 P: I* ?0 X// ELSE
2 X- \9 P2 o5 M7 {- a& f
9 ]: x. J0 ]4 w) l' K/ C8 x//
$ |: u* _! {7 b, R2 o( E8 kReport I/O interface
6 K! b; ^9 Z8 ^
  [1 \$ y; X$ _# m2 F' m//
6 Y* W# h6 @( v1 I4 M
5 N7 ?6 o. j- x: z- S' W//
0 h+ }  G. |* a6 VPDCx[2] = OSPM is capable of direct access to On
' n  p6 _$ L* [, C" C
& D! a7 H/ H1 T/ |: k//
7 m! j5 x9 T/ ?$ ?7 _! }- QDemand throttling MSR
. k4 B! s' O$ h0 u4 D  R4 _& o* ~8 k& k& t
//0 H' G. j# o& [2 B! G# A
% f% O2 S4 s; l2 l( I! {
If(And(PDC0, 0x0004)) {- D8 [) e5 l, V5 B

1 a, M. @- J% \2 c. MReturn(Package() {
7 E& I5 \: u  i8 c, z6 Z% u* s2 e
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},$ Y( D5 j; N- O. ~; v2 F& N

- E9 D. h9 {% X# pResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
0 i9 }9 r" J+ a, @( F; U9 X" f6 r/ B& a$ P+ H; R6 S
})
. z1 t. q! `; q. \% c$ R) ^; F. V. [6 V
}2 [' b$ G( Q* F

  G" I& P+ i) p& {" rReturn(Package() {
  q0 f/ n* ~: g& h4 m6 h
5 k$ Z, u7 w, g; V$ p+ XResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
( ~) }6 [) l( T4 d7 N- o# e4 @5 |: J; [4 s
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
  |6 A/ a# T6 i* r/ B  y" P7 `! ?
+ X6 X  r; J7 b5 j})
4 T% }& ~# b9 ^- X6 ]
1 p5 p  m1 \! g) d5 v4 L* y}
+ i# R1 |! |9 S" {  d; U  G2 x4 u! n

6 v% u+ C0 @9 _, P5 j2 ]5 R+ j
2 D- g" l" G- i: Rl
) M5 F# H% z' D* m3 Q9 x  _' Q& |
_TSS& ^1 Z$ o- B1 H5 R8 h4 p5 P

# ^6 G' ^5 x' q- Q* l8 \Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
, V- v$ T+ d) b8 B4 G" NName (_TSS, Package() ( n- Y" L& S# ?. l7 x
{( Q6 t! @% M" [6 Q: d0 S0 Y9 I
// Field Name4 ~8 g: _; {) c9 H
Field Type
% z: {9 V; |* g9 @" P1 Q
0 o8 ?4 j: i# z- S
9 u% o6 [/ r: U  S* J) J
. R6 f2 Z5 x. O4 A  G8 \& {) Y  r! HPackage ()
% c7 C8 O# @* j! {$ X7 s4 K$ z// Throttle State 0 Definition – T0 ! V- E, a1 v: f5 N; Q

) }' o" N% n+ c{2 w2 Y- ~, r. j9 H

& ]$ _/ o& z: s/ \! ?
( V% c* }2 _" ]! \" zFreqPercentageOfMaximum,: k7 _/ U7 C" ~1 y
// DWordConst
0 q% F/ ?: Z% P0 I2 Z$ b3 a/ B' K8 W  w+ o. D) s
Power,: u7 b) t& ]* f! a3 \& l' M5 i/ {
// DWordConst / K( z7 e( P, J, v# L

: E3 s; ?5 a1 O5 R5 H" [6 CTransitionLatency,0 b' v- g$ K) Y  C4 q2 p0 S
// DWordConst
3 C% V) R3 Y( f2 c+ F; g; l; k' }# f8 y! F
Control,
, J0 x# c' n. r7 }0 J+ A( I// DWordConst
; R2 R. v0 V: H! I4 Q/ A, u+ x( }* T0 w: v% L
Status
0 a: }7 y# \0 Z8 d  b' i1 c// DWordConst ) T( }+ ~( ]0 p
},2 z4 b5 u1 w3 G
……
1 W" o  z  I7 h( _" U0 z! g9 T}
0 F" L# ?4 Y: ?2 w% H$ S4 [0 o4 t7 \' I  H5 _# O, n0 E' O5 p
Example code 如下所示:1 B9 ?( A( f1 [
/ A( X. @, K2 u) j
Method(_TSS, 0)
2 k# }7 O! I) m, B" U
# ]$ |1 T5 _. }! H0 Y" l{
* O4 A( j0 Q8 q5 d% F* f1 U% \" b5 n* _$ W2 w
Package(){100, 1000, 0, 0x00, 0},
5 U5 X) O, U1 \  q1 _
( l  r/ X9 E3 \9 pPackage(){ 88,  h$ d- ]6 U2 z3 F
875, 0, 0x1E, 0},
4 F& Y9 ^5 ~0 }  e! \0 h1 `9 K$ P2 ?" x. [- a7 I9 s
Package(){ 75,
( Q; Y. H9 B$ t7 m, e: G( l750, 0, 0x1C, 0},. a& V9 T8 y" m" P6 B( p

. g; @# l* y( }; n* o" e. XPackage(){ 63,: x5 i* Z6 y. Y) e0 Z
625, 0, 0x1A, 0},& A' \: y6 ?, R0 p6 b' z8 ]/ f. H
) L* M$ t, c8 E2 O2 `6 E
Package(){ 50," U5 Q/ s3 e- k/ V
500, 0, 0x18, 0},' ~" Q3 f/ ?4 Q6 q
+ `; ^+ C% {; q6 |3 D+ N
Package(){ 38,
$ X' P0 {, L3 W' n/ `1 s375, 0, 0x16, 0},
% Y3 E0 k3 J3 O3 R4 D
4 H: x# a0 o- W* b( C+ wPackage(){ 25,
& g' |0 J5 c3 x4 b4 z1 C6 f( E! W250, 0, 0x14, 0},2 Q" d% U  G& d9 f! J! T" p0 `
' M9 W" ^% b9 y# t2 u
Package(){ 13,
9 w8 |2 x  r' Z* ?9 @& t% r# l125, 0, 0x12, 0}1 w+ [; x' ^2 e( z" o( {
  a0 V8 [, Q4 `" ^2 ^
}( i& R1 p# q. ?9 V: B

5 F  A7 c) _- b% [( d2 I' w* x' o  L7 k$ J: U" s5 F/ i8 [' p
l4 K: I2 x( q5 ]" c
_TPC
4 c/ @' m+ b# Z, b
0 p2 V$ V- y* ]& M' f  a" Y3 Y! _Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
' \. w2 S7 }% E2 I! S: _: l" W% \
& ^+ }7 z* _. t) D7 S2 ]0 b0 V( ~9 Ol
2 Y) P  H; L" Y3 ~/ E+ R  i
_TSD5 A, f7 O% t7 Z# T

, j4 n. h: P5 K" Y' R' R) D8 @+ ]T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code* w5 k/ N1 b' K) g3 n
, D5 O0 |6 R) D6 R8 s5 |# ?! ~3 k
Name (_TSD, Package()
) B2 m) w7 m; c3 L8 }! }8 T6 ?9 f: r- p( l
{ 0 j- d1 X, A$ P, S& B0 B
' Z4 t: ]' N4 w4 X6 Y5 V
Package(){5, 0, 0, 0xFD, 2}* b/ s5 j" a; B- `) u- {
// 5 entries, Revision 0, Domain 0, OSPM ' t5 J5 ~6 Z  L; p6 F8 H0 e/ E1 d  j
Coordinate, 2 Procs
5 ?! S- Q  X# E4 U) H4 i4 p. a3 f- K) a% S9 Z6 r. W$ q2 k1 q! N
# u& p- t0 x, ?
}) // End of _TSD object: ?  [: K( a( j; L. _

9 i5 a: ]0 P$ T5 w# x: [5 g( lREFF:
; K* F3 B( w' A1.; O8 c9 t7 _( z5 }/ y* j
ACPI Spec 3.0
+ n) M" ^1 x; o, O9 N2.8 C: q. ?# H( l0 `
Intel Processor vendor-Specific ACPI4 V( x# P  f$ v
( f' n- p- g* b& y# h" f

% L9 m, K/ J/ n- |$ S& l( PThat’s all!
8 u  z: u1 g1 w( a1 i' f, y) i" C ! O, h) L! _$ h5 V' f% f1 w8 ?
Peter/ _% h3 ]2 P8 _* o
7 j' a* z' F& W7 v8 C( r( v7 }
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 15:27 , Processed in 0.172302 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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