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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
* f1 O, O, ?" C) X1 k
1. Overview
+ e. O  X, m- L; q/ O
( e9 w" a+ Z1 c- [% J$ s8 X( ]9 A3 ~' D
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换' J- ]6 V, O# V) E* S$ J
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
1 }/ ]6 V, N& v" x比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
, T! p& O/ ]3 t0 j. F
' C: ?7 q" `% Z% p3 ~/ P
cstate1.jpg
! f3 V; L8 T) a, P
1
0 U& I# |9 P% i8 x& y6 }& W
2. C-state Control3 g7 }4 `- f  L- \# e3 B: S. j8 A

9 @; @5 \, ~) d. X, P) ~8 ~% a) s1 K1)
5 d# D& \% y: K5 s: M* ZDetect & Enable C-state3 Y0 j  A, T+ T

  M% m8 B& E% W1 ZBIOS可以通过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的支持。
9 L% f4 Y4 q2 [3 ?0 _7 U
8 Q/ \, E5 i; d- G/ h3 ]& s, Z( p2)$ T3 K$ ~; l1 ]1 ]" L' S1 b
C-state Basic Configuration
4 E6 v( f1 K. E+ ?; w通常情况下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)。% J+ S/ p# d& K( H* I! x

& ?) T6 Z$ ~/ {: i) f& x  N3)( G! }0 r9 H& Y5 q/ ?3 i
ACPI Structure For C-state. [% z. v* Y, j, a! G, o* s& r
! w/ w$ H" f9 c; y: c
l
- O. y8 f# z  b+ a
_OSC & _PDC
' e: a& v. ]1 Q' K1 k% S_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
/ p7 w0 w$ J2 G& t/ e8 y( X) Al: g2 K6 R6 I0 \. y' f7 F
_CST
' D" N- z% B$ |0 I* O_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:# y% _, a! F, U& c4 s
CSTPackage : Package ( Count ,
+ [" w& I6 g4 I2 o$ c# fCState ,…,& n  P! p+ ~' H% t5 l* G3 s& N3 G5 R" p
CState )
2 N! ]+ H( l6 U3 R9 W: _, R# ]其中Count表示所支持的C-state的个数
8 p: A+ z2 H0 u6 u. JCState: Package ( Register ,
7 h2 ]/ V* V+ V, d! I2 cType ,
7 ?) r. z% k- W7 a. MLatency ,
6 M4 S7 s) ^) z' U& [, |Power )2 ^; @1 u: c/ S4 v* N: }4 I0 d
; Q' @/ V, ]% ^, @9 v
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 C33 E3 v; b1 e' M2 T  `/ Z0 c* I; G4 v

5 p: p3 K% D7 t6 k6 ?; hName(_CST, Package()
5 I7 g7 B7 y6 O; k" {/ [

% t8 Y# s7 @0 A8 r" }{ . r7 S' ]' e6 ]7 c0 P4 H
4,
" N( n6 Z' S! L7 H1 Q. l// There are four C-states defined here with three semantics

) y6 }8 u8 ?4 j  J
: Q8 e4 H' p3 W" q" x4 k3 _$ n// The third and fourth C-states defined have the same C3 entry semantics, D5 c$ h6 T1 j5 b

4 x5 r$ H& z6 f% D$ QPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},2 X: t* _$ }, a3 t! A; c
1,7 y& I0 h+ E7 `* D
20, 1000},* X4 f7 }8 s' o

% t& o' \  ?/ jPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
& f8 \9 q4 P, `7 ]( f40,# G' h. i' H  c7 d' d7 z! @* Z
750},
3 j5 B# Y; z+ v* Z" r1 C- `: u  j
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,' c/ I, S8 H6 n" [
60,- t) c/ g1 p8 X! y! i( _% S
500},
& w6 @$ m% b0 a. n, ]8 H) f, s+ @3 G
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,- o' g  x; z6 W. I/ G9 c7 S
250}. S! q( ]% J* s- X: p$ N0 W
  C; S& ]% s- f8 o& B* O
}) ! @( L, y! F3 r  U9 Q8 t" w- L2 y
- g0 L- m! R" E1 Q  x
l1 O; Y' t( F5 v4 e1 V1 f0 {1 {
_CSD
9 _, g; ?0 q# \; o* ^0 U( Y8 ^( i" Q( c9 F' D, D, w/ w
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
; D! i' ?, B! R* I* M# q& t. |5 T6 T- P' O% \2 F9 G) ~

8 U) [" a! @3 T
' X- u+ I7 T5 l1 h4 C9 S  V
0 J( E& R9 E1 M6 m3. P_LVL VS FFH
- t1 ~8 O) f1 j3 r$ b6 z6 Z3 \* p" O8 C
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
2 `8 w2 q- H9 s; s0 X# @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所示:
  G/ [' K. ?8 c
1 r1 `. d0 ~1 e
gas2.jpg
& e/ p: e  G; w1 ~5 L0 @& ~0 I
2

& x( D. P" }  F# L& i% mOSPM解析到该_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的一个例子:
* W; ?0 n$ _# G, l' f: WName(_CST, Package()
/ n8 @! E5 G7 f3 n

  x0 B# Z: E! i{ 6 c1 Z& L- u4 Y2 [5 {
2,' \9 R# h4 p5 M) H$ Q. {$ s3 ^
// There are four C-states defined here with three semantics
- n4 A' Q7 o! g5 c; T

* L6 g9 E% h6 b2 _// The third and fourth C-states defined have the same C3 entry semantics
7 J' ?  f$ s' B. g" T
/ g  p8 a6 g: g5 }! L/ z" K) {, \
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},* ]" ?, b; }* ]1 D) B# P: S  b
0x01,5 B7 |& X2 J- E# c+ p
0x03, 0x000003e8},4 ]7 T% x# n8 _# P
( ~( t+ u7 n+ B" U9 h
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
) w; V- u/ i4 ^2 m0x01,5 S4 o' L7 S$ I) z, J9 N
0xf5, 0x0000015e}
9 t/ S% |& _3 `0 h$ I' |
})
5 [( t* d# W5 l: c9 {
. e# W9 a% J& e. w
* s, Z3 S" f2 q/ H2 \9 |; ?REFF:* o# F! N! l" a/ Q; l! o
1.
; [) n5 H0 A% m3 R1 V. }0 d. PACPI Spec 3.02 X1 E2 ^. b3 R8 m1 ^) @/ X7 v$ P
2.  J. M* D: b! a3 o0 H5 D1 s  Y" f
Intel Processor vendor-Specific ACPI
: k! ]. F0 x, Z  I  x4 a2 P! T7 z2 ]% ]  R' j2 n5 s% V
( I3 I+ U: B& {1 o" g) Z
That’s all!
: g( P5 I, W. O- B% V" p  u2 |9 Z  C5 h- t  Q' y9 M
Peter
; H& B  @, h4 |2 P  Z+ i8 S
' Y- t8 N: }6 v, J+ `. k& F9 U2010/9/20
, n: P- Z+ i* B, n; s% R5 J: H% [& V! ]& \6 r% G2 _7 F- P
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview: ^. V$ m% `; A5 [7 d
  Q2 Y" u/ W; r5 K2 G0 \: D
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
. {7 B9 N( H7 w4 ^2 O2 @# D' ZEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。: v" I) `6 I0 h% l0 z, S2 {
& k4 I. p% g2 t0 }4 M) Q2 f  x
2. P-state Control9 ^* W% r- w  A2 s' z' M

. i5 P/ a; M" i' Q) o1 P1)1 P9 {0 Q0 o' C
Detect & Enable P-state$ {3 f9 }/ @6 |9 M
0 }! p7 ~. u" r! x
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
( ^6 z+ g" v, C/ ]+ c 2 u1 H& q9 r* K6 z1 c
2)
; [. E9 C5 m: `2 t' d( S* l) d. CSupported P-states
" c' c/ o* D, l  P2 `2 @% d
% k/ b# {4 W0 a  \: Q: C2 nBIOS 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固定是100MHZ9 K, K- M8 @# l+ x
4 f, P& g0 X( V: s1 x6 H: l
MinRatio = PLATFORM_INFO
9 \0 y& _$ }$ l8 \MaxRatio = PLATFORM_INFO/ ~$ n: L  a* s6 t7 j  r) ]6 O; ^
RatioStepSize = 0x01
9 ?6 v, ^0 ^! F' V2 U$ t" FNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1; t; {* q# a1 G$ H' X
( Q. G$ x, o5 G% @1 A7 O- I! V. }
If(NumStates > 0x10), u3 G  W. o5 a1 A. _/ x3 w
{( u1 x5 ^8 }  _% Y) r( A( ]
RatioStepSize += 1' O* `' I3 n+ h3 X4 c# C
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 19 f! x6 u4 R( s& a5 e
}) f, ^2 G2 j) P' ~) @% S( a
7 V  T* d+ E) z; m3 o
3)
% }5 i7 ~, f( X" d! jTurbo Mode8 ]. R8 O4 Z( y4 R+ \
; q0 f, k" E$ P% H
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. X2 Y( G! }& u  w8 x

6 ?3 ?5 I% s6 ?6 b3 T  J4)
1 F3 X8 d; \& z, ROver Clock
& {0 S* O1 w3 i9 J2 J 3 F( ^. E% K+ B* H* y. I2 W( S
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
% b4 q5 m2 k0 {: w % s5 K' z6 c9 g8 b4 j
5)" u' m! n2 b9 K4 {
ACPI Structure For P-state
5 I  g7 Y" ~- h) v+ V( O6 g
  Z4 d# {% N; ^* j& p% W7 n" Rl
$ S3 w: ]8 b) K
_OSC & _PDC' n* ~' T1 f! z

" [  e' A$ g" X6 ]. `* }_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
. t6 H& z; U4 i# f$ `2 `/ ` 0 o6 i  V/ A7 W
l
( ~. R  l5 ~$ A& S5 |4 m/ p
_PSS
7 D! G; [" `& F' vPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
1 d5 ~( X! E& L$ u: 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做比较/ f2 U% {0 d' X. g$ y
以确定P-state切换是否已经完成。
! ]  A5 U. ^4 ]- B% x5 s. K9 h 5 h% P8 O0 w# q, A
Name (_PSS, Package()
$ g$ \, Z- N0 Z9 l# h% l) n! g{3 `$ Z, V5 z. @/ K+ K! y
// Field Name* f) U* b; a0 E& `1 X/ Y- ?! A
Field Type . M- O5 w- F. U* u0 C: _
- W$ Q. Z2 ^! [

: S: _* g7 k) k+ G/ t) A& I& c! \/ E+ A- j- g" K* o- k
Package ()
- q+ u/ v* l6 m  P: c. o# t! u// Performance State 0 Definition – P0 ' x  `. A% t. K; u. K% ^+ {! X

  Z$ T; t0 F, r2 v8 Z" R1 t{: D& h0 `' w- K" j) r' \3 }
( E+ X# b: }9 e% q$ n' x

& {9 [; z5 K# y$ O7 |# n: DCoreFreq,  Y- e: d0 i! o+ g3 {# p  ]
// DWordConst
. ]5 e, ?/ z2 G' q2 u" `' D. u8 E9 M+ T9 w* d9 J8 \
: M7 `7 {, l5 @. O4 J7 n6 ~, S
Power,
4 Q/ z8 Q/ z2 \, M7 D// DWordConst
. [$ d. w* \  S
, [$ ~- d7 p6 G0 }) @, K( NTransitionLatency,
1 y: {  P. K2 Y% N// DWordConst
5 {7 K2 T  p2 a5 L, _
5 k' V& Y2 t" I4 u3 [* bBusMasterLatency,9 F- [( s$ |* D, ?, ~0 H
// DWordConst ! n0 @9 Z& V; }) h% B
2 l$ O  N) Q  o$ L) x$ \& H
Control,
. a$ p7 _! d6 q9 H, x2 x$ \. w// DWordConst
; r' ?' m+ b7 m# c, X( P, g. `# f9 f
Status
+ U; B( r4 g  Y8 M
/ s: D; R7 q$ \) g, z9 u# p/ h// DWordConst
* C0 _# z5 q" X5 w: m2 O! w/ W; |
}, 9 |4 H  k2 p* Q5 D  U
  @& Q" y) X3 }) `$ Z! P5 g" U4 L
.
0 q4 ?# M; U8 E6 B
% X, d: O% ^% E' O/ r$ Y: k. $ y. Y. E3 N; O1 `8 D; ^0 a4 n
  L& N0 H1 m* p5 c2 ~, H) h
.   g  ?& {4 D0 b$ K" P; }  v( y& i
}) // End of _PSS object( ^+ k  E# t# Y. Y
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
' g* s3 C1 r! E2 X' b
8 M( y8 C% h2 B0 M; Q/ `/ W* {2 LName (_PSS, Package() ! J. }$ e% d" P& D
; b) J- O4 G# c3 Y, S7 _
{ , J5 ~) Z7 W" V. l

! l; Y: K: U- @4 ~5 I" rPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
/ L. n7 T5 \; s  r, ~) Q$ u5 a5 }$ K& y+ ~: |- q% n. Y( S8 d
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) ; n; j- [$ |1 h: I& N

, O0 o5 \0 `" L" S; CPackage(){1400, 8200,
+ J3 F0 }: f0 _10, 10, 0x000E, 0x000E}
4 i/ Z! `# V6 h! n+ w3 l; `1 P// Performance State two (P2): b6 M$ j5 M' t, D( k5 x
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
6 d) K5 {" T: ]2 W4 c! FPerformance State one (P3) 2 u/ E% J: i8 E* A- e
! J# ^8 X) F' x% `3 u! J
Package(){1200, 8200,
5 B; u3 _. q) ]2 U9 L, h+ s10, 10, 0x000C, 0x000C}
3 L. \! C4 X- j2 `( D/ x9 f8 M4 p// Performance State two (P4)% p% v- O4 k3 m5 A8 u' M7 h0 g( u4 P
& n+ `/ U: W  r) y4 }
}) // End of _PSS object( X. V) ?  h8 C; Q; M) s

2 G# w+ ~: T5 R$ N另外当该平台支持Turbo Mode P0将会reportTurbo Mode! ^( y1 s( q6 r6 n

: ?- n8 v0 O9 o& G, I* x1 gl# Z0 ?1 ~- A8 A6 [% C/ U
_PCT& a, O4 d" H" v
8 R* N9 w  @4 I/ C
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的方式来进行。# ?& l" |2 p1 N; O

* ]3 W& @  k/ f% zName(_PCT, Package ()5 _& T6 F) ^  D( w1 N# y5 M
// Performance Control object
- o: n  N* x7 k! T2 i6 \5 D- n& z7 C) ^
{
: C/ W7 B" d- I" K& R; e
+ E  F( `$ _  m' O( qResourceTemplate(){Register(FFixedHW, 0, 0, 0)},; J% C* N6 w0 I9 s7 q+ ~7 U+ X
// PERF_CTRL 5 p( b4 ]1 V3 i$ L

, K$ n+ G' r5 K1 a) iResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
! s0 T, D( \2 z; i# W// PERF_STATUS
1 L' _: b2 X5 y7 n3 _4 j8 ~: T/ v9 P% M
+ v) V) S) @- m6 ]8 `6 I+ [}) // End of _PCT object' Z5 W, u& n5 a( S' ^2 H) a& A
" L$ L" j" P! o- c5 K
l0 w) [/ i4 D2 k( m! M& ~( _
_PPC
+ b' V# ~5 H1 v( l% ^$ B( }# M6 u
2 B- R- s  B. n4 MPerformance 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
: r3 g% c4 T1 g3 D6 I5 Q% A- F & Q) j7 e- ]$ u4 C% u% v8 V
Method (_PPC, 0)
) h* M- M: g' F# U// Performance Present Capabilities method
3 }7 C* V1 }. A5 @1 t! X0 j/ H7 i, O- o- N5 Q
{
- X+ q0 k/ v" }/ T+ o* c
+ K) j/ F' ^7 m" pIf (\_SB.DOCK) 7 h3 A! r5 a7 V! Y: k( P
# u6 p, l# S  g- X
{ ( ]( a" k5 ^. s$ P8 V
2 B% R, p  b& I) _9 o" B7 P: ~/ h9 C
Return(0) // All _PSS states available
% G/ a' p. a% k# N; N) Y/ D! z. y6 D' L  h

6 R  i- {. m/ S% T% O; h5 [" r} : X$ o3 n+ h/ P5 t+ O  h; U
  D% Z. R# l1 M& I* K( a& Y4 E
If (\_SB.AC) # D0 O4 y; D1 l, e
' K. U3 B2 x; u. ]" {" z
{ 0 p6 T/ Q3 o& {( c" z

/ K7 R- i5 ^* B1 `0 X. gReturn(1)* l$ U/ c. [4 m, q) G9 U
// States 1 and 2 available 2 ^/ k# ^3 y% M+ z- W* w& g
9 q1 b3 n/ u  g  a! j
}
, n- G) \: o( p2 X4 w
5 w& G: c1 P- {% ~  ^8 e9 gElse $ w: h/ j  h6 `7 G. q$ _; N; V) n
9 U. D2 t" p. y( c
{ : [) ?' _# I7 W4 O: N

+ j; i$ a& g5 J8 jReturn(2)/ x  u) Y5 t5 ^2 g8 ~% z* u  n
// State 2 available
" T5 ^+ K1 n6 Z/ s
* }, L4 D% Y" v  m( l}
- Q  Z8 ^% y. Q/ f9 C- \- q7 w# `2 b. q! w5 R% P$ H
} // End of _PPC method  C" n/ _/ C& ~  c* e, H
( L" j3 @) {0 D8 w. R. u9 Q
l  b8 @" {: u" ]9 g+ ^6 K/ ?' j2 A
_PSD
+ s5 p4 S9 m5 G/ ] " R( ?7 i' I: r" }' H
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。1 k2 s$ ^" p8 E9 I- d

! Z( h! C# }: N  d: qREFF:
6 l5 c% n( H9 R4 m0 u5 v( w1.' X5 r* E+ v  S
ACPI Spec 3.0
2 a7 d! y* ~; G0 M2.
2 o0 a/ K6 x( b( h) s' G0 PIntel Processor vendor-Specific ACPI2 E8 h0 W2 B1 A3 [" a- f% ?) F/ ?

1 T( C7 Z9 N) X. d7 G % X* Y5 G- f; p5 S, k3 I1 b
That’s all!2 B9 k/ z0 s& b$ M' g, U- c
5 A' W$ ~# K6 Y) D4 P* U/ y$ s
Peter) l+ ^7 C" v9 F

& J6 I8 l0 a- X6 Q2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview9 q. H8 q2 J5 c& `* k& H* c% X
* G+ n% f1 n1 A' t
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工作时间的占空比)的方式
' W  ~7 a- J. s5 d- y4 W; q0 j,影响系统的功耗和温度。
, b4 O$ w. w8 h+ t 0 u; E0 A% r3 c  A' E
2. T-state Control
) a# [7 \0 R, p9 o/ D8 S) Z
0 c" f& B8 A) n1)
$ G9 F5 U2 _' U) V2 K9 qMSR Based Control2 ^3 d' U+ z- g- M: P
  b6 k8 H9 @+ `& `
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 ( |* e) G/ j! C5 H

. t2 z0 z5 U9 r! {5 U2)" d3 U; ^/ T6 H' v
I/O Based Control2 ?' V% ~! c  n" O, N
0 [. U4 q' s( b  |/ c
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
  y  c9 G" I( s0 t6 r " Z6 @3 t1 W3 Y( O$ O2 P$ N9 S9 s
3)
* z; F, B2 p5 u+ i- n! RACPI Structure For P-state! x3 C5 v; F% h
l9 Y- m% m: L- L+ t! P
_PTC9 f2 h+ ?* d. p1 b  P4 u7 C
$ J0 B2 H- \# p
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:8 }5 F; u* e6 M
5 p+ v( u* m/ [9 _8 c) }
Name (_PTC, Package()   }1 N) B- d4 n8 n2 {2 g: Z
{
$ x* e6 t5 S) \2 [' z2 @0 h6 v6 l5 e0 Z! B% g# d
ResourceTemplate(){Throttling_Control_Register}," I+ q6 J" k0 t/ ~1 b, W) D
//Generic Register Descriptor 3 f6 l5 D2 O9 ^2 Y! m5 T! G0 ^

' O& C" G" N+ i% O3 DResourceTemplate(){Throttling_Status_Register}
8 G. Z, @% I5 L8 m$ E9 P; d9 \//Generic Register Descriptor 1 z5 i) P4 F4 e% `. D# k
}) // End of _PTC. F+ V, o4 M9 t6 ]6 W" s
' ~. I* c% T  ^
下述是一个sample code/ K" }% u( Y6 W2 T
1 ?/ H: b3 H9 }/ f

9 @4 [( N& c( ]& D% u4 F7 N* @' {# x
//5 W  g$ h" Q! X- e2 |+ K
0 g8 J8 b% w5 o
// T-State Control/Status interface5 L* G( e6 j/ y+ D" }) @( ^
9 G3 \* g  y$ r
//4 g+ O4 m, _: i9 N1 W. ~" d
. V, y" z. W- {
Method(_PTC, 0)
9 p$ F( F7 {9 q5 V% a9 P
) h  \  \: H2 _3 i0 }{* g/ N0 M7 Q; y2 p! `; k% l

9 h' N+ \1 R' f2 o2 s0 U//  A! g7 H& I& f) D" K/ D1 Z6 ]

2 V$ P" {0 F1 F2 l2 T! b$ F// IF OSPM is capable of direct access to MSR# H) ]8 ~4 V+ j
. n' w9 m+ W- X
//
# T& W4 W3 L# s8 LReport MSR interface+ p4 k5 D4 x1 Z- ?, n+ [/ p  |. V
. L+ z3 a8 t+ A6 Q- h. G
// ELSE
" v* E3 F/ w( }3 c! ]+ p6 M4 T
# A! M% D6 M/ n  K9 y$ a" b) B//
% j7 s$ J( K# ]. q2 q  U  C0 cReport I/O interface
9 F0 c  I' X1 ~( u
8 M$ l0 f2 T( e/ B5 [) P//; s2 h' s9 K9 q9 H; ?. [4 A

0 k( @6 m; t& O: }% K- i; g//
9 y2 A" I$ ^. x2 e# o! G. m4 Y% FPDCx[2] = OSPM is capable of direct access to On
4 o; n: U' p$ z' Q7 K2 |: L
3 u% P( B4 _# I1 E//4 H/ K2 O$ @% \1 N' s) }, K+ H9 J
Demand throttling MSR
$ M, o( W0 p* b4 W
7 ]6 I0 H5 w: S. V/// ~& m, _. v! q9 u7 E7 m
+ L5 z) ?% h) s8 u9 u0 g
If(And(PDC0, 0x0004)) {! Z" B8 D8 _) H" d
8 k5 A8 t3 D8 T! i, f' Q
Return(Package() {
0 b( _5 E. q( a  r7 P8 U/ w% W( {9 \& `  v0 q
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},$ q, T: w$ I6 s8 [% h
( q+ V! y) z. T7 o1 T/ C
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}7 f) v% C7 P- w8 @9 A. C0 J1 ]
  w1 W, L- s/ w8 o7 d& }) O$ ?
})* z, M9 L7 H5 d5 I- A

. h9 i( p6 A  k0 i/ Z7 B9 ?: i}$ E7 \% m; U4 q
- D* K6 W5 H* T2 o3 W* {3 k
Return(Package() {' A! ]5 i& F" E( a# g; N

5 ?" }7 v0 Z% g4 L5 aResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
' N2 ^& Z! N5 d- y4 L, z4 o, s: l3 q3 l# R5 e  a
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}* x* Q. Q! W& i5 X0 m' u, o  x( H
6 c( k# U# x# q
})
1 Z0 \& s( t' Z2 q
7 {' I/ {  }0 g6 `4 \% z$ s}
4 T% w' [1 G! R1 O  h5 \+ r; r6 [7 A  a  d/ k3 ]" \8 |

9 `2 i5 t9 F  }5 T* Z: {+ Z5 k1 x
6 o' I+ s% A6 E1 g  `" I  nl
& D# I0 x4 i& H, Q* _2 z' F: K1 G# G
_TSS4 w8 E2 P* @* m1 F

5 v8 u, ~) B, A! ~Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
5 t$ Z2 s; i+ m2 x2 bName (_TSS, Package() 8 P. [) u' g* w  Y2 p
{
7 J$ Q: _! Q+ b3 Z; v! P" t// Field Name+ V* D6 w6 u- p
Field Type
0 H: [& k. k( q$ i$ l, I+ _3 X5 e( `# h9 Y9 T

* O3 G* F9 B$ ^2 e" ]" e% G9 }9 r5 B. e( k) Y5 e6 c6 A' z2 ?
Package ()1 J# p1 D! L; }& J, p. x* N" o
// Throttle State 0 Definition – T0 4 m3 a8 g+ C! [$ v6 D5 q$ B- K3 ~7 z, n. `

$ c' C. y7 a1 Z4 H0 E) J  r{& e3 C4 Z8 P# V( v

3 n1 a9 e2 H% C7 ^- L, x. L) o' N' B. L- x# j+ k( j/ c8 w
FreqPercentageOfMaximum,5 M; i5 t! ^" T+ X
// DWordConst
& H$ L8 {" Q' {$ o7 U) E4 N/ r3 k  s3 d8 M
Power,6 ]/ s/ k& W8 x* s( Z, a2 S1 y' d
// DWordConst
. y6 L3 ]* D$ B8 S1 s2 h
4 k& N4 y& K; A% kTransitionLatency,
' i' |7 z8 O/ j  ~2 b' ~, G9 O// DWordConst . j# z3 e+ ^+ Y" r6 R- C

' Q1 G. u2 }3 GControl,9 \4 x1 E; y' Z6 b# m' Y
// DWordConst
/ z* w7 ^. v6 z, v! Q5 `
& E+ X$ ?% Q% A  @# ~. KStatus" Z- J2 n2 C; b) }4 u
// DWordConst & u- j* F' A3 p3 m
},, g; l3 [% F) C) Q$ U- \( m
……
6 _5 {# A. ~, E7 x}& S0 \  L$ }7 u$ G  D4 v/ y! E' \8 g% j
, f: C0 }6 `2 y: m8 t9 R% O. O
Example code 如下所示:
& L- V3 W# b3 r- E$ z% ~9 C7 e, d/ e( \! j6 t  z- _9 ]1 ?: T4 k
Method(_TSS, 0)& r$ h; a# j7 S0 N0 F

2 n! f$ A$ o/ d8 n/ t. N{
( w; W; ~' Z" A# [2 [4 e& M8 q0 c1 j, F1 q5 p6 t2 F
Package(){100, 1000, 0, 0x00, 0},
8 x6 Z% o' X; h
# }) \8 v7 Z/ o7 _5 ZPackage(){ 88,
$ S; p1 X6 \) v1 p8 l& ?/ ^875, 0, 0x1E, 0},1 {5 Q% a6 @* G1 O) t/ @

6 A  q$ C: k9 VPackage(){ 75,0 G. a( E2 g2 _& T8 x9 P8 ~4 v
750, 0, 0x1C, 0},3 ~- w3 b1 j3 o% n( b. D* ^6 Y! u

9 S% C9 v# X! w0 ?- cPackage(){ 63,
) J* Q6 S. \( w0 @2 \- O625, 0, 0x1A, 0},
# h9 S8 b' m+ `& p% `( o0 c4 ?3 b7 ~% y$ @* S( t# ?0 B" k
Package(){ 50,' m+ n! P: h+ V4 L" ^
500, 0, 0x18, 0},( u. x, I0 d/ q4 o
% D5 ]0 X* U; O5 H# q
Package(){ 38,4 S9 M7 c8 }0 s8 `) w$ T& }' K/ i
375, 0, 0x16, 0},
/ n$ M% b" a" m' A
4 q+ [1 p. o  M; HPackage(){ 25,0 k, T: m( l2 y+ ^% t" \
250, 0, 0x14, 0},
# |3 L# N" H( Z1 X# Y! B7 P6 _% H0 v
3 ^7 k4 f& T1 p: J" E" e2 IPackage(){ 13,4 d% z3 U2 G$ S; `2 O5 }: i
125, 0, 0x12, 0}
7 `4 ?# r! s" _/ `, k2 b8 C. A1 g! J9 F" H. g5 v3 x0 g
}
. S( B; r) `1 d: G/ F4 j3 S8 y0 s0 ]+ J. n- M. N3 g

9 u, P2 d  @8 u+ e% C3 q5 Sl
* N( G, Y% t6 U7 ?9 X, g
_TPC
0 o& P! y6 c  g8 ?" h7 `! P9 O3 e, ?$ y+ G
! {7 X( e3 P8 _( `/ hThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
+ j- a$ g+ y! M. L
; T* b- e' F& f5 a! m% hl
3 H5 x6 C4 h. j5 l: b
_TSD5 ~3 `' F6 V  _$ P- J* F. V; ?
2 V, b. w, I0 ^* Q3 W$ X
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code& h) a2 w* y1 B# j/ y5 p

8 J: u) d6 j, B% G3 OName (_TSD, Package()
, J: v) H6 I9 a6 f4 Y/ J
( D4 p8 q; P  m  C! P{
3 h& F6 ^, v0 n. t2 F0 c, g4 {( O! a5 F$ n
Package(){5, 0, 0, 0xFD, 2}' _( ]* n( h* V$ s; C- N: h
// 5 entries, Revision 0, Domain 0, OSPM
) V$ e% Z) |7 Y( D; \  G4 CCoordinate, 2 Procs ; F. v% R" H! l+ ]

2 j7 e) T) D$ O1 ?# P( Z4 S
# g6 ^  S$ F, k/ z% {! u! J}) // End of _TSD object0 I3 N5 ]* ~% `8 ^6 b' B
. R& Q+ L% u& u8 |
REFF:
0 N# _8 V5 V. w9 k8 e( C1.5 X$ i- W- _% U7 r6 _# F' ?+ \
ACPI Spec 3.0
1 f& w2 N7 i# @  ?& C" p2." P; m" ]4 j6 I$ _: ^
Intel Processor vendor-Specific ACPI
% l# v  m) ^# g8 W! G, Y ) x; U' _% ~' Z; q6 v: S7 P8 y/ B
/ t  c  W2 [; [
That’s all!
# n- W  ?; J/ M! k7 G9 U 0 Y2 C& s; ]% w* D6 x( l5 V
Peter0 [# p, W9 _1 s+ x8 |6 z1 U
) ]. M2 s3 S! t$ v
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-24 22:40 , Processed in 0.071696 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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