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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
4 ?2 O+ U9 S' L& h9 j
1. Overview
1 P: U- ^, o) ~* f# |
) v* C, B1 W2 I
9 Q. `5 ~+ K5 T3 k' V5 K& w2 HC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换2 a$ u5 K. r- t4 O" j7 I' q) `
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看2 W7 M, ?- m  O4 [
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
* p; A4 b; {( N. V7 l6 U6 X* a3 o* Q. y- t
cstate1.jpg
6 W( r! I( V( D/ s8 ?" d! P
1
7 d( G' ^- e0 L; y, T* ^
2. C-state Control
) t1 O& K7 m7 s
. ]4 x. u9 C7 V3 y' L1)& ~( U* B- W% u# j7 E
Detect & Enable C-state
0 T. A/ e2 B: y3 s6 C5 d$ m$ O! t3 d& L4 ]5 K: h
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的支持。- ^5 L# m' h  r( u' b. \

( G  T3 z& I% d/ u$ M% N0 X; F2)
2 |7 _1 W; q6 `# kC-state Basic Configuration8 _$ E; b& d/ c. A$ x* @2 F
通常情况下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)。
8 a1 q. A, ?2 I
' W5 n  n& A, N  h: y" G) E  K/ B3)$ N- \. }, [5 F8 j9 l; Z
ACPI Structure For C-state
+ q, }0 x; ^$ z, {2 y# j8 K6 W! g( [( F& [
l  @0 y9 @1 }" B; }+ _! I
_OSC & _PDC
4 ?! I& F- J# F# w+ R_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
9 a, K6 K. n2 }' S- V; ^l" U! g! B% h3 O6 q
_CST
8 K# x, n, a! E_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
; q4 I  E& x, }# }. lCSTPackage : Package ( Count ,
* |; T! u9 _5 x" j$ g  ?0 O- ^7 WCState ,…,
, }3 E3 A4 J5 ]- Q% a- nCState )$ ^% z. d+ t  R* [' i* n- x
其中Count表示所支持的C-state的个数
: n& l$ y7 ?' |5 d* oCState: Package ( Register ,
3 V. J0 c, d( b1 m" YType ,) i% G( N' L# _' t; \$ c: h
Latency ,- [4 Z/ \$ @# A3 m) w+ t4 R# \. r
Power )
, ?1 ], f- I% l* q% \* x9 b  {/ F7 M! F+ `$ v  I
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
6 p9 M) _% B2 q, X7 Y. i- @1 w4 U5 H. d: R# Q$ N
Name(_CST, Package()  y7 w) j6 B2 D5 B! Q

6 Y6 x! J' D8 t& D) K4 t; _* q{ / b2 l$ q! \. d9 L
4,
. ]' Z  Z9 R  x: e; V- }% Z// There are four C-states defined here with three semantics

/ K4 Q  g. W1 L8 l' W8 Y# X, R( x9 T4 A" D" K& g
// The third and fourth C-states defined have the same C3 entry semantics
- W4 d) J- H3 C+ l/ z

5 d0 k/ i' R5 k/ C5 \7 z" K/ c# u; qPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},$ d+ Y, r2 ], {: F% {
1,. e5 f: O: Z* R1 l( ]  \# G  q
20, 1000},
0 V6 Z% _, z3 K) i9 s
& T. _5 J* |  a/ G7 b- f1 T
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
6 ~; y2 r4 ?/ U# M' }40,: m1 k+ {, W% L! K! b; I0 U
750},

* P! q2 D; ?+ z, L. b) UPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
! u- @/ t, {$ R0 H5 n" ]4 p; l60,+ ~4 I& g. o! J% |/ a, K( z
500},

5 C! _' ]- H1 z  @9 UPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
% ?. ]) H: n% x! k250}, Q* H& u$ s2 n+ \# f2 y
9 Y4 n) \3 m! d! F9 m
})
( e6 h+ ~. m/ C4 z
6 r, n2 g; ^; L& ml
: |* T% x( X8 ?* O+ h: }3 K1 F
_CSD$ M1 X- ~$ [. y) l3 r, _/ p3 c9 x6 N; s

* [7 {& Y9 ^! [2 S% ZC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
( d8 [: b! q' w4 r5 a% r* X- H5 o/ O! @6 X# |2 r5 |* L# X
6 u9 T$ s6 D- J( ~7 ?
$ l3 P# ^# ]; n5 _
1 r( g0 V4 Z' e* }- Q2 P, X5 e3 F1 i4 v
3. P_LVL VS FFH) f; o7 M3 _0 L7 ?

9 N4 ^5 C! o$ o! R) Z( VP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
4 d. o1 v8 h4 [5 @, {* F: hFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:6 v+ y! L; Z' |4 b1 t
" Z, R6 l! ]0 G
gas2.jpg

2 b" ~" ^  Y1 U$ i- U, c6 e
2
2 O( A5 o2 B0 o- q/ f' E
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的一个例子:: O2 f& h; |$ f
Name(_CST, Package()
9 u1 s# V+ S; e; j+ d
0 w* C! ^* E# h
{
* v, [3 x% J( K1 G' L$ J2,
( |7 `# p, x( ~// There are four C-states defined here with three semantics
& P3 H% }8 `8 b; B0 O
6 G5 h" D9 r( T) `, h& z
// The third and fourth C-states defined have the same C3 entry semantics" R( T9 p4 b4 ?1 k; u0 s

- i3 S* t1 M. v' F- L2 Y% r1 FPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},; w( ~  S# a4 ^  J8 Z8 b
0x01,) P/ ^9 N7 D( C1 d; ]" G
0x03, 0x000003e8},$ [. ^) `) b# U
$ [7 K1 T! u: {* z$ y
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},; l  a, h' P* Y3 u! b7 r" W* L
0x01,
: v3 N1 _: }. b- _8 l: J0xf5, 0x0000015e}

/ p( \2 K) `' r}) 8 w+ Z1 `. T' R$ h! o0 e6 N
$ M" z. X" Q5 t6 \

0 u) G8 J5 w6 |REFF:$ q/ ^- T8 D, v) B
1.
* o6 k% n4 @# m# R. rACPI Spec 3.0
  T6 V8 l" t4 G; l2./ t0 b- ~3 R0 k' H) `/ P8 e
Intel Processor vendor-Specific ACPI+ Z' X  h" B  {1 j" a2 p+ T
2 Y. s% L! \( ]

- Q& c$ F- [0 g6 lThat’s all!, w( T% V6 r8 H5 I. C

: I$ h; A% @; ^1 }. e- `% pPeter
. X9 p- }3 F" f1 |$ n5 K, m  _- \3 x. Y2 \+ }3 W! B  G0 M
2010/9/20% }6 u+ N0 j) l$ [

8 B" W( Y5 a7 ]7 k+ E7 t[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
) u; i& H& _  k& b 3 Y; u$ d. Z7 ?: \1 ]: K
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
7 w9 `0 R& o* S3 Q; bEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。5 g; @+ D+ [) r0 F" I5 v
9 Y8 V0 b, M1 m- F, ^+ p* V7 A
2. P-state Control: c0 a- k& ?- C* o! n8 A: |

8 u+ P. |; }' o; M1)
4 c0 P  j) D' r+ A( DDetect & Enable P-state$ `8 y6 {' f* m- C- [# z

+ X* A# [. T6 s5 w3 u: T0 Y: oBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state) H7 L/ S* h7 b6 M
9 L# Q7 s3 E$ M9 @/ b
2)+ E0 k) `0 R) Y/ c, k! R! m
Supported P-states, M) J  p+ y2 o. O: H  v

; O  y+ |6 F4 h4 sBIOS 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  w1 l, Q8 O! D/ y; |' O* J7 I8 ]
: J0 k+ u& }8 D) v
MinRatio = PLATFORM_INFO
% g, Z$ d, w2 T+ M, ^# xMaxRatio = PLATFORM_INFO- x6 K/ w' ]' a8 C. R" @& ?* q
RatioStepSize = 0x01; X9 R) @2 w) N7 ~
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
9 L6 H1 D4 B$ o% c0 S+ V1 j& s( i% Q
! l4 |* u  o7 N+ ^: cIf(NumStates > 0x10)5 A1 x- Y1 [6 E0 B, E, h
{
% \8 t# {% P; s# J+ G% FRatioStepSize += 1
/ ^+ A) t, i, D4 tNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
3 ]4 j/ w. V5 v}
9 H1 {9 l; y9 d5 z  a ( x& L0 b- Z3 W. c' n( o2 T9 h
3), B1 q2 s8 A% \* w3 n6 w; Q
Turbo Mode7 O& d9 e6 @1 ^5 a$ a
& c% J0 r# V3 ^: `; O& q" B' _, C
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, i2 V* L, Q) J$ X) |$ \1 M1 L

0 C4 f' V) ~7 n( |4)
+ U2 c1 f+ F4 M7 K. i$ ^( V/ bOver Clock! P9 k! R7 Z; z
0 p2 \. g' L* B" ]" R1 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)。6 \* Z6 [) V6 Q1 K4 j% U

4 E% @) g1 a/ @* T$ K" s* w* ^( \5 N5)
- L1 F0 E; u7 \ACPI Structure For P-state
6 P3 {1 r9 t( G6 t9 L
& f) ~- b% F0 O0 m  K, ]. t' tl
0 ?/ z; i9 S& B& B/ @
_OSC & _PDC
) @9 |$ [, D) [7 W8 R ) n5 G* Y9 ^. ]
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
$ N8 ~3 E: @3 H! \2 v + d' E5 e3 M. l  I5 J6 l! c
l" [1 ]4 h! p, M
_PSS
, N' t" k0 b7 |% FPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量' ^- b) W! J8 z9 j9 g
并且通过一个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做比较
  ?* U; s9 j' r6 I以确定P-state切换是否已经完成。& f1 M% i) P9 J  B7 m

$ W  n2 z* x1 N9 K( G7 x* i2 \Name (_PSS, Package()
1 d8 T; r3 N' n, J{
) F, Q  N1 ?7 I* t* m// Field Name
( g4 R: v4 t. c: [! C8 fField Type % x( f8 A3 J, ~
. H. y9 F' B' d6 I, M
1 [4 s0 w8 Q# s9 {; G
1 l6 w" O5 N& [
Package ()
7 ?) o- S2 P# A% n$ L// Performance State 0 Definition – P0   K$ Q9 B0 ], x& h6 e, b

+ ^) N' g0 J* e{' O0 ~! I% J# V8 R
9 S; d5 b/ A* u3 L7 Y! X

. E$ ]/ R, a* I& [& g, w/ ~CoreFreq,/ E1 H2 l: v% [) }' g" _+ ~
// DWordConst
* u8 i. ^4 @9 v  D
: O) J8 o$ J3 o
4 l- }8 Z$ [* V. H; r9 w! _Power,
* i8 l4 U3 d6 X) w9 t// DWordConst 8 Z8 F8 D- t& Y

% F- N0 D0 W+ m! I: o+ |TransitionLatency,
# W/ q, |- r5 @6 `# R// DWordConst
/ h- M, W! [+ U/ C' k$ T/ ~4 B5 l, q( h
BusMasterLatency,0 v- g; C& N' N* E$ i$ ~, W: x3 h! n
// DWordConst $ J9 i: Y; z+ r  R6 h) f$ T
( l) X) f) k% A, t. y& x: a0 O/ E
Control,- l- A  P* Z4 w- g
// DWordConst % T9 ]9 e. [( t

& ]) t' \9 V; }Status
) O" E4 w5 g! `" t. g7 A
; }4 e, ~7 |+ K9 b# G7 x3 B% j// DWordConst
) i. f. B( c+ n1 `; `
7 @- X- A8 p" M6 u+ ~9 e8 C3 ^}, , E; b0 z/ s1 G, j* o# Y2 E

7 R8 J* @& r/ s# O5 j8 U.
# |/ V. y; G  m4 o( Q
+ H: l# S. D0 [' y4 X; m$ i' r.
  g0 P6 h( T) f6 ~" S
& K% \3 c+ [9 P. \. . U1 I2 g- a$ N& ]7 V0 L! l3 K
}) // End of _PSS object: Q7 y) K; D7 w; o
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
* r8 ~7 m! S1 \1 \  s8 x9 P
! D- ], @( z: j( p& nName (_PSS, Package()
6 d2 K" G. D& V# d
" f5 B, K) r% g, j7 N1 _{ " A1 F! ]4 x9 L" S0 k" w. @
: w0 t' @5 @8 r6 H1 V
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
* C8 \: J4 x8 E8 C+ B. v" [1 Z! b
: }% O* q! N1 W9 K/ X% xPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) # l4 _+ A6 a9 y( Q8 C+ T

. B8 Z7 O4 j3 Y( F* _4 n8 fPackage(){1400, 8200,
; D7 Y$ n, T: B0 O# z& J10, 10, 0x000E, 0x000E}& b! D4 t3 Q- N
// Performance State two (P2)
% A2 S& K: M9 b# QPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
+ T: C! Z- |4 v3 d0 S6 u8 s3 A$ APerformance State one (P3)
7 a7 t6 ]' ~! \$ q
# C( Q+ c$ E6 t: g5 l. CPackage(){1200, 8200,
8 n  D# s5 S( V) {" A$ h4 o0 G10, 10, 0x000C, 0x000C}
: [" r; @0 o3 D4 \/ \8 F0 R// Performance State two (P4)
, Q( R4 s4 M0 G' o
8 J7 g( j  y: R6 P}) // End of _PSS object
% z# _: x/ u9 s# r7 H  j$ w' y ; ~+ P3 Z. @. ^. @
另外当该平台支持Turbo Mode P0将会reportTurbo Mode: ]! G! f, v- r/ n: m
  ^4 w3 a/ l; o
l
; G  z! k: S+ h  x* [
_PCT) b( Z* {( @& Y* r  d$ g* c9 H

  _- p* O2 W1 I/ J3 X% H9 O# LPerformance 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的方式来进行。
) S/ t7 S% |, U4 C& m, @3 k% S
, H; x5 r7 _" t& M8 k; qName(_PCT, Package ()* @( s) v' }( h! [
// Performance Control object
/ f, p1 P$ n) |5 }/ A- J3 i' j  v3 m3 x
{
! i# B- m9 J  A8 [$ Q( q, l& R
5 y( K, [' ^" w+ f  @9 Y# YResourceTemplate(){Register(FFixedHW, 0, 0, 0)},6 d! A% q4 @! w2 f) o$ N) ~( N4 T
// PERF_CTRL * C! [4 F2 B  h5 T# M

2 I* `' W6 u+ _/ h% T2 C: V- mResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
. J( Z* b) y- L// PERF_STATUS 3 D; d0 N0 V& E" h- t/ a5 ?
6 Z" n4 N( a5 w) N8 Y
}) // End of _PCT object
0 B+ E) g. n0 l, D
1 R' c( U4 E5 N, tl
0 `. O7 |, I4 d
_PPC
" J. v/ Y9 }6 X  f) @" p
! k" ?; n) ]! j1 ?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 Q& T* w8 i3 y1 o7 g/ r

: V: a, D9 y5 R; AMethod (_PPC, 0)
  [3 E( d8 n* H+ f// Performance Present Capabilities method
/ V; i9 B- x5 k( `0 h# [
, H, ^4 u, Q4 g8 `. `: v/ X$ q3 n{ $ {  u) x7 _8 e( U' l! [( m: B

1 Y3 V1 ~. }' D& q/ u5 q& nIf (\_SB.DOCK)
% H) E; ]& M% R6 I, {& f% _
) G. z) N; X/ Y8 A# i8 ?{ + ]* f& a- `6 Z$ e

  ]  q$ C, f( _* q0 aReturn(0) // All _PSS states available
% X2 H4 I9 c8 b) R  E- S$ ?
5 m, |7 f# |6 s5 V6 }7 i) m6 q' m" |  Y8 A5 W4 |4 w( R" |
}
: U6 A) Y1 D* u/ E
( j* t8 _* \9 cIf (\_SB.AC) 4 `, }, G) K! F9 Y
( P8 P, `9 d1 M4 n( D
{
1 U1 I# X3 G. E) u6 W; N* G2 t$ y  r  d7 \( u( Y0 I, f
Return(1)( J4 |2 w% A7 E/ Y' `+ N
// States 1 and 2 available
2 P. y6 D6 f) E1 ^" @/ J( L0 [) Q( x+ l( n
} 5 {# ^$ ~2 F- }

* M2 p$ L: F; _" D$ zElse ( c% F- F" f+ [$ [3 g  ?

4 m! u: B, f2 Q* D$ f9 J7 W{
% t( j& p% ~4 V: F3 J  y& p  K0 E6 V, P& F0 J' L( ^( U/ b
Return(2)3 @% L. b) [) L7 N3 ~* I( n0 S* a
// State 2 available- s: B" ~- h1 {3 E

2 N7 ~8 p  b& ^! z}
# A$ B& D% N1 R0 i" M. ^$ b$ |4 v
} // End of _PPC method
  k, ^0 K1 q# Q, C9 D# F6 t
7 ]6 }' d! o4 Q' h  [l
& e+ v, }9 ?9 u0 M+ g
_PSD& _6 g* _  V- `- P* `- V* B
# E. [5 X" o8 Y( O8 _
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。$ h8 y9 x4 @" O8 f) D
/ R1 D# m+ m- X
REFF:
  d7 ~/ G2 K+ F* ~- \6 s& N1.
! k' p- T0 c; N* {ACPI Spec 3.0; r9 v5 m) N# ^' M& q9 b
2.
8 X9 S, `7 V* L" M& U8 O4 }  JIntel Processor vendor-Specific ACPI4 r* C4 B# @" s1 v8 P
$ I% e" J; I" i5 g0 M

- p) u3 X* _, E& h7 o. S, k" Z  i# eThat’s all!
' I$ q+ S( S; E 3 V; R# i2 i; e
Peter
: p% S: o7 X* ]
9 N7 M% y% Q9 S$ [2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
+ j4 c1 h) Y5 i/ T( B6 p7 _
9 O# v3 H. Y4 vCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
/ _& c( [) `2 W,影响系统的功耗和温度。0 N1 T, O$ z7 g: p
2 c* F4 {; L  ?
2. T-state Control
; l! S- O$ f2 d* F. ]( k 7 z0 c0 n" g) H8 M; S
1)/ @0 t. q/ h4 B
MSR Based Control, z' F. s$ o& I6 m- t

! s# ]; e  R# o0 @  XBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
; L8 L! c  u2 G+ X3 \( `6 h# W : d* A6 s. A. m% J+ R3 ?/ ]/ o
2)
6 p% I$ K0 U, KI/O Based Control
. J) s% O0 Y1 q8 m3 ^7 ^* P
- N; ~- k  a* x; S6 r除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。; \8 \/ [+ T4 q
, x" A' d5 N3 o; U+ P0 L- G
3)' _2 j3 E/ s) ]% f2 L
ACPI Structure For P-state
4 s( |# h' ~: n( c$ V" ~% Kl# _0 h8 u& V4 O. S
_PTC
4 D$ ~/ r7 n& I- V$ m
9 o0 v+ Q& Q4 f: h& H3 c! p2 J6 mProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
$ @- Q1 T0 W5 ~! [6 S8 w* S
6 K" l$ d8 A0 ~- oName (_PTC, Package()
$ C+ o. D5 |" c% N4 j  g{
+ i% n* S$ ^7 p3 E* F8 T* n" v& b. U/ h! g4 P' O
ResourceTemplate(){Throttling_Control_Register},( q9 k6 U, n) L" t
//Generic Register Descriptor ; j" ^5 @' r5 F6 W

# L! k; Z3 k5 z9 T; gResourceTemplate(){Throttling_Status_Register}
5 e+ h+ v! y8 ^, y  ~" p//Generic Register Descriptor * g2 ^- J* M3 B2 {8 ?
}) // End of _PTC2 c* D3 H8 i: I; f$ I* @

2 N& A1 y- _5 f4 M2 m下述是一个sample code8 c1 g9 c, \' q+ l; A- [
. f/ l0 X& u6 p* @: I  Q1 z
. o% Q+ f7 ?* q$ X  R( o
//
! U+ r6 H8 w$ y+ {+ J% c5 i2 U8 R  p" ]5 `3 l
// T-State Control/Status interface* [9 m. A% S! y7 T3 y2 C* w
4 F8 K$ H4 R) S2 G+ h
//' C3 S* k; T6 N9 J
4 D. D" j0 k0 J: K6 V
Method(_PTC, 0)( Y9 Y7 L1 B6 A. G, {" Y/ ]
- a3 R: X' e3 F+ J
{8 j$ ?$ @9 d" w4 T" k" Y2 E

& k7 T4 i0 ~& C, o//
$ G. b8 O1 a8 L) J5 p+ d$ S) ~2 r+ A
' ?* f$ ?7 w5 u  P& Y: k// IF OSPM is capable of direct access to MSR9 U1 m, O1 {! r6 W* H4 k" f
, R! c! D0 P" p) U9 m; W
//
# W2 b! E0 l6 z; u; p% }Report MSR interface$ S5 s- S" E) @6 H; W! K* Z

( h: E/ z2 j' U$ l3 H  P, R// ELSE
; E, S1 d& V- z8 X$ z/ k! @" K. L7 M( r
# m- x) ?* O% }/ F//- {7 s! L) o& K3 z1 x5 P
Report I/O interface: n6 t6 I% E% f5 {! f

9 `& n* l7 h1 I//& E3 N: W7 x$ c# A
" U# G7 _1 V, v% ~4 l
//" F8 n2 @6 ]3 o9 X0 N
PDCx[2] = OSPM is capable of direct access to On! o) r) H4 u: L0 {. i! Y, s5 n" p
! [  ]0 \0 M- e( D
//
' v/ P5 U: }2 g8 c+ P5 ]) xDemand throttling MSR5 l4 c/ Q6 {  m' v1 u$ F

$ Q8 R+ Z& \6 _2 M7 D; |3 r//
6 W& @; s+ j' `
9 |9 ^6 j" l! Z7 c* K. ]$ j( _$ GIf(And(PDC0, 0x0004)) {; l* n& h/ _( o2 }' e/ F0 p5 S: `! M
/ {  Q. g- ~* ^6 S/ c, j' @
Return(Package() {7 h# ^8 i3 }% j$ D; b

5 E. @5 {4 N% S$ j7 {( S. tResourceTemplate(){Register(FFixedHW, 0, 0, 0)},9 W+ K5 q' T% J& c. \7 o

8 W  y& k1 G% V( r0 t: tResourceTemplate(){Register(FFixedHW, 0, 0, 0)}) N, ?* ]+ I$ H; e, V1 n

% c; T7 Y& S; R4 w% s- u})/ }5 E8 J1 u( x, o7 f( l
$ Z" @1 h8 {1 e  _! w
}9 Z# Q" e& J% f
- o; |6 W  Q. q
Return(Package() {
* M7 h8 B* q& D& n
' Y5 Q5 c9 a* y  [ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
- @) U9 P% p) x2 b
4 Y  g+ h3 {/ H) y- c- X8 TResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
3 @) y  j2 V2 b0 X. k# f
* o: j/ u4 A& _8 Q+ }" f, ]/ z* X})
# i1 c7 v6 ~# r8 v
! r) Q* K7 l; J3 C- a$ Z}" ?/ @% `; X& w6 x3 V! p+ Y

1 l. T* L3 P6 ]1 o) X+ F. s) p0 A! J* j

- `1 @6 n% P) fl
- q0 a' J/ Q2 ?& ?/ F5 J& D+ m
_TSS
- [: I" A# W/ k0 C( E 7 d5 }; [- ^% x6 q1 u# I
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
7 v3 O1 }7 y+ N, G  pName (_TSS, Package() 6 |  a* R8 B# K5 Y7 @
{5 ^- H/ N$ B4 O( e
// Field Name! M! H3 h7 [: f$ ^% t1 I
Field Type . z0 |- R8 z# @6 A: N
+ O! U/ O' Y/ }

' Q6 `+ b3 G3 r8 j
% b$ P& d$ X+ ~9 l$ Q1 kPackage ()
+ @+ c/ x2 z# Y// Throttle State 0 Definition – T0 ' w1 V+ [9 H) E3 H% F
) z  I$ e, t; Q" h8 l
{3 c* |+ m5 {; f9 |3 x( ^. P
6 h' x; g3 Z2 \

6 O  x$ D. I" Q- Z' e  p) a' zFreqPercentageOfMaximum,
* u9 _+ p1 R; G& m6 M" o: X1 M// DWordConst + ^0 g% I) |* \2 f% O- Q
, u+ Q; w5 v) w5 C
Power,
. u$ T  S: t+ @, o) @// DWordConst ' x# O$ n) C- u( V$ U
2 G/ ?- N5 K! y0 D. j
TransitionLatency,4 c5 U- ?, u' W& F% a
// DWordConst
! F5 f0 I$ @0 _5 a; \- A
! f" k' `+ U( p6 K$ |( v5 [4 h5 pControl,1 L8 v  f$ z6 e/ O  T
// DWordConst   W3 Z' Q! Y: m) M1 y! w  z

* ]  v: Q( O/ k3 d% s0 V( fStatus
: @+ I" b6 Q# k# d8 Q& ~// DWordConst
) W% J0 \3 c3 f+ D! e5 {8 O! S% l},8 h5 }3 \- @; P+ Y) W8 F
……' b" a3 p8 V% Q6 X
}
+ I4 ]3 C" a  ~! B7 _- I& ~" c( o9 Y
Example code 如下所示:
% L- n' q3 a. G3 W1 X1 }; \0 t6 P* k+ O7 V; u) M* n& `8 W
Method(_TSS, 0)" s, K! x: |0 M, x1 P. _
' G% _$ G4 Y  N2 O4 v7 m3 k
{
8 x6 r, X8 a2 ]0 l+ y1 n7 C$ g0 S2 \2 p0 b1 \) k
Package(){100, 1000, 0, 0x00, 0},
  t  |% F" `6 @" v3 t
2 }4 X* v: L8 f# L  a' d, x$ j4 v6 BPackage(){ 88,
) g7 S# F# o2 X6 ]875, 0, 0x1E, 0},
! ]* ]$ z$ r# O
3 w! O4 u3 _$ L5 w! m5 hPackage(){ 75,
% z- L5 q' X3 p2 [750, 0, 0x1C, 0},; D$ U+ Y3 ^: F4 M2 ~2 x/ R( g

; j0 K9 v" J" j( IPackage(){ 63,
- U+ n4 U. h) Z3 k625, 0, 0x1A, 0},
7 n; d3 d; L' c$ Q/ l: H- f, a
- a. ~) H' r& JPackage(){ 50,0 \( k/ o' F' O4 ^7 [) M+ G
500, 0, 0x18, 0},
5 N: G1 m) A6 k5 ]; v3 w- F% L3 i/ @2 [
8 |$ ]1 h" W) K& |& FPackage(){ 38,, W% }+ @. y. R& n
375, 0, 0x16, 0},
+ ?3 z9 Q+ ^) k. O. T  N1 q. E* o( A8 l* V
Package(){ 25,
8 c! @0 Q; V4 H250, 0, 0x14, 0},
0 [9 @' |4 s2 k0 @4 ]* g
! h0 _2 L9 k& R, w& jPackage(){ 13,
; @& C, {  p# m5 C125, 0, 0x12, 0}
7 [+ n' u6 @8 A! o  F: r8 |5 c. n6 G, @' m& L) V, p' s9 Q/ S* W5 l5 F
}
& m: e" _& t# ?, @0 V0 T9 C6 c
9 K5 M: X0 L0 ]+ n7 B& S$ C% Q% U7 h
l5 ~+ ?7 `9 p8 h" E* m- p: r- a+ L% p
_TPC
. K+ N" f; `" @* M 5 v) ^( t+ Y3 f4 K" Y  o  K
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC; ?* u2 @/ J/ ~1 e2 C) L

1 Y& r5 ^( {5 @, X. ?3 N+ O1 Yl) A0 L+ e/ \. c; p8 h; f! F. @
_TSD
! p, m$ e5 X! M  ?2 K7 `& v% A
( y+ z3 L% L9 @4 z3 U8 ~* DT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code# @/ H9 M2 S* w! D

* {, E7 N- Z/ J3 g6 pName (_TSD, Package()
$ W9 ^! Y; h# J( f1 X6 Z2 H
) ~  }2 Z! y  [' v' E{ , ?8 ^) N  Q" i9 h2 o! u8 Z
* o6 D5 G2 S) p3 u5 V
Package(){5, 0, 0, 0xFD, 2}2 ?7 M' H% t1 V
// 5 entries, Revision 0, Domain 0, OSPM 9 H, b, f1 `# H/ {1 ^( ]
Coordinate, 2 Procs / O& x" R: W( ]' _( y! E, q  o

; j; y$ T" H- p
. U# n" P* l2 y, Z, V}) // End of _TSD object# W4 P. u" @* b6 N% n
7 `1 c2 y8 M; B! b
REFF:; c( W: |+ r+ O% ~) k$ l4 {. ^
1.
% {! g) |# t/ J8 w2 `3 |ACPI Spec 3.03 O) N, O# L" |8 I% N
2.: O2 B! c+ C* \! N- _* B3 [
Intel Processor vendor-Specific ACPI7 L" A$ V) {8 s1 W7 ?5 e

9 ^2 q! B8 }; v& [
: _' ]4 P& b, S- V, nThat’s all!
' |7 Q- S  t$ W$ }! D9 D7 i 6 j4 L( K6 H+ c# U: h
Peter. S9 F& F1 L& G3 Y

7 p/ D; @* o7 R7 j- @2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 09:34 , Processed in 0.026930 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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