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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
( v% |6 a6 q0 r/ y/ Q5 `; X# `$ \
1. Overview/ x: n1 U& }0 K- k1 ]9 [8 ~

6 m/ F) D8 k4 E/ x9 v; t. q' c* X& x7 t( S' o4 o8 \# G$ G" U! K& `+ w
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
* g" o2 K$ Z- a2 _+ j) }6 f4 R降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
9 f! l5 n8 _: b比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
& @0 J1 c2 `- t) ]6 ^
; ~! {+ u4 S: {8 F: P
cstate1.jpg

2 q* o/ @$ f1 X) C* y; g
1
- G1 L! H& i6 {9 T: B$ c
2. C-state Control9 k& M: y' Q  l( L
) |$ r& C  A7 x
1)
  D/ k: |. S6 ~( |# i9 ?- m0 t' O; JDetect & Enable C-state) r; Q; G1 ], ]: ?7 s% Y/ Y

& K* M/ O6 V3 k4 ~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的支持。0 w/ Y' v; L- {# V4 C

: [( N6 e2 {3 m* `& o+ e2)
  t! S% t3 e8 F/ C! n( s, g" qC-state Basic Configuration
, a- U7 L9 {$ J  c通常情况下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)。" C$ z& m" a0 F/ |

! [' E4 _. y' G' X! ^3)- H& X% H1 m  H/ d2 a
ACPI Structure For C-state$ a( D# u5 `* R/ N* I! b! c
# W: w0 x9 G& C0 ]- E! O
l9 k+ d2 j4 A' X- y& C- V
_OSC & _PDC0 U* J% d5 i$ @% M
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures: g) G& @3 l5 W0 ~' H: a% z) ~
l+ `: S2 f* o* {7 D2 H
_CST: T6 p6 {( w3 ?# W# x
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
1 T: Z+ F- \0 bCSTPackage : Package ( Count ,$ C2 ]1 L# L# b# }" Y* ^
CState ,…,
! E$ R! [& y# i3 B% U* BCState )
9 i3 Q" d- Y$ C' ]0 t8 j其中Count表示所支持的C-state的个数
, }. w# T- E7 H: O+ S# s' }" q0 hCState: Package ( Register ,: D! S$ B2 r+ c' t% T/ o2 _
Type ,) N) `3 y1 y$ M' [
Latency ,  J8 K' g8 ^9 N7 v( P
Power )
) U& }8 I: g0 l  y" e- o
# l$ F+ i* T  S" t3 v+ r  G7 uRegister表示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
* l) ~) J" [! Z8 g& X1 l  x9 @# \! r/ `3 o) a1 g& c
Name(_CST, Package()4 E5 `- A0 \/ p& D

* m" {4 A( X( [7 t{
+ H4 H; F* C/ _8 k" x4,1 h( [5 Q! n7 ~2 K! z* N$ P& @
// There are four C-states defined here with three semantics
( Y, Q6 R4 s' d9 o# Y
) l* x. `1 y* O1 d4 a1 q6 J
// The third and fourth C-states defined have the same C3 entry semantics' d; i3 I% c) n- ?

0 }  }+ x6 t, G3 zPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
. J0 @+ ?0 m/ r5 K& E% v1,; o# \5 {1 _& U. ]
20, 1000},5 n, f! K. ~+ i" T3 s' Q- J" _

1 O; Q" T/ D, U7 F2 G; cPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
) g) E7 |4 t/ [/ s+ G40,
* w& r& p2 ~- t750},

8 V5 ^* J8 L6 S! f- B) @Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
1 l" B8 a7 K# v! N6 H60,0 J9 Z, d$ R2 T. h, ^$ a1 c0 l
500},
3 u7 ^. K1 `. ?, n3 v9 ~( Q: M$ N
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,7 p8 U' G7 {" r. V3 N8 v
250}
6 a6 K5 z3 T. w
5 ^6 f$ u$ S8 b1 z  N& e
})
# i2 G" ]+ {/ w$ \' d! B' Q' z! W0 o) o
l: S0 e4 t  H! P$ q; p# X/ |* C9 W
_CSD: x/ ~; H/ C) S  _5 q& ?
; @; l( G$ C/ ]& g; ?+ N2 @. o" I
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
& q+ y% O2 ^" }0 M% ]  V2 T) Z; D1 z) P1 `

& @: i! ~4 \7 P( j7 M3 {2 h% ]+ D6 A; d: _5 X8 G

6 }% Z- O$ [0 E4 I2 h3. P_LVL VS FFH2 Z* O$ Z8 b% `$ J* Q

- @* `' A1 R3 Q1 @8 n4 QP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)& G4 E: I2 {/ M; o
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所示:
+ X# b7 t8 U  ~% S: e; G4 p
2 E% o$ l  f; e; G
gas2.jpg
, U! O6 Y& i1 ~
2
! a+ @+ C' @* a' Y5 o
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的一个例子:
0 E2 k3 j: h- f+ H3 eName(_CST, Package()  }$ r$ ^" O) ?8 E. c
) A8 Q, E$ Q1 N* A- @
{
0 e  D5 K( `; O+ v, g1 V7 o* t. \2,
, o% z7 P6 Q5 S3 y# p$ V// There are four C-states defined here with three semantics
# C( O, U( h1 d# }8 V

( m5 N' ?* s* o2 v7 t$ s2 J; N7 [// The third and fourth C-states defined have the same C3 entry semantics6 }+ W6 a+ r3 K/ Z' ^% q

2 a( Y# ^% ~2 Z' C% X3 ^* l" q  TPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
7 v, a" `, n5 d- |0x01,8 M& d6 q+ y+ ~9 ?
0x03, 0x000003e8},3 Y* K- ^1 x3 I4 H; N- I

3 o' q! B. M$ R! e6 rPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
2 e  a5 a& ]9 _. t6 Z1 p0 y0x01,6 ~- [+ i# b! ]
0xf5, 0x0000015e}
6 S4 ?/ f/ F  ~+ d% ?
}) * i; `6 J% \5 h1 J, o
* z4 D/ x* `  ^& \+ w

( o, V, i  B5 G0 z5 ~5 vREFF:
% t  Y! K4 @9 v* L1.) _6 R6 p0 r! S7 h$ J: g" _! Z
ACPI Spec 3.0
: \! |, S0 Y, O- Z% o2.! J- V- E, z; H$ Y4 V
Intel Processor vendor-Specific ACPI
$ E* z( x2 `; L. D. N
, t+ p7 s3 I/ H1 c9 {7 S5 A* \' p1 y3 e% b% S8 h% L
That’s all!
4 f$ w# u+ b" T7 T' F2 |0 k* U& ~8 u, M% D+ }4 G
Peter
% [: R4 _: f8 b
) v0 i2 Y8 N( b* h' Q2010/9/207 {, |6 S* n+ |7 Q" ~( T8 N& b* ^

0 U  s4 z, @) i& e- m+ ^[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview, U( l' H) b+ m5 z0 l
1 p# x, t& f: V9 c/ Y0 V! j) O: J
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
6 O: q/ m2 L! y' qEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。- `1 {- t, E/ S0 p. y

4 U# Q: L) I( v. v; H" z# b$ R2. P-state Control
1 e8 k6 Q6 @! @3 ^- M6 o$ j
8 _) v# n& ~  @; Z* o' P, I$ v1)% L' K% A, [5 S' r$ U6 l
Detect & Enable P-state
: E' R' W: m2 Z , v% N* H" ~! q& E$ b: I. P. k
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
2 q5 O; K8 D% G& n/ x4 D6 h
# v7 g/ G* [- O4 h* {( r/ x: @1 {2)
9 c3 b) R6 N6 H+ L" D" n( W+ ~0 ?Supported P-states
) s' \4 ^- f8 B  _ $ Y9 V( m! R& Z4 P
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固定是100MHZ6 L( Y, e& A& [) E

2 q( D8 w1 S2 N& vMinRatio = PLATFORM_INFO; ^$ G" T8 [; f) l5 a  q
MaxRatio = PLATFORM_INFO
  w/ D# I8 }  _1 eRatioStepSize = 0x01
! g: o" A2 B( N! s) R, D, p9 bNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
" v4 B" d+ f, }1 M- p
1 Q" e' O7 |2 l1 g* uIf(NumStates > 0x10)
# @7 V+ k$ N5 A; @' ~% W) e{$ O- i, f  R$ ~, ]" v
RatioStepSize += 1( w4 r" t3 p, x) c2 z5 \" s
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
2 z  R  P' m, m0 V}2 _4 l$ c, b# _" K+ G
9 v7 s& m) ?% I0 j0 I
3)1 Z& {. p8 j: N! U) T
Turbo Mode0 N; L7 t2 [: p  d$ c8 e

# p8 R% F) }; m$ }; B8 bTurbo 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+ v5 D+ @& f# H! s8 }( P3 S
: s/ f2 i  ?, H
4)! A) ^8 X5 N7 ?6 E! B
Over Clock
5 b1 ], `- g" G8 q8 {, o & S8 B( j* ], [, ?/ w+ Z) T! d
某些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 R7 d) x9 w; u: g' o

8 K! X1 C$ e5 d7 G* I7 d5)
% q! Y# M, g$ t2 P* vACPI Structure For P-state
9 [$ x8 e  V+ m* P% z ' H) [/ p7 ^' I. o2 ?
l
* v) C/ {2 O7 T( c; `; U6 x
_OSC & _PDC
7 f! z5 f) C; W6 s. s9 ^ 8 Z% ?: S6 F4 @# H' G
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( C  d! F# [6 h
1 h5 \& g5 n& Q8 f* n6 Ul( v/ u) o7 b) }  c2 @5 f8 U2 H
_PSS
/ l, v9 N4 F. U( Q7 ~/ PPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量  n. i: U/ A9 f- i+ C' n8 Q- K- O
并且通过一个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做比较4 P+ B! n0 g+ `
以确定P-state切换是否已经完成。, n, i6 ?4 y4 M" U/ K
" \/ {. G1 N  }
Name (_PSS, Package() # V9 q7 d, R' s$ R6 f
{
, ~4 V5 S% J% p% b: n8 {; ^7 s// Field Name
$ u6 R# T; T( {  i- ?0 RField Type " F6 e3 q, [3 R( Y4 o: E  d, t

, N7 A. K# W5 L# }  H+ L
/ A3 r* C& X( B' n* X/ m: c! G) R5 {3 a) J/ O) r/ s  Y9 m' \1 \. f
Package ()/ }+ K9 x0 l* v5 V' O1 r
// Performance State 0 Definition – P0
) P  L" j$ X# g+ P+ e) p% ~+ v" v( |0 D! P% X& e$ \  f
{
0 }. i8 H+ o% H6 z8 G9 F- b) f) G( M

, l/ [; u; {: ?$ Y- TCoreFreq,5 j( _6 ~% W, Y5 Q3 n4 K
// DWordConst
& e1 F7 C7 j) ?  R/ w( C: O" C4 Q
5 E% R8 l/ m0 r9 V5 y% S1 a
! c% @' J6 M) E$ x/ C1 g  ?8 xPower,6 u: d1 R1 g. i. [# a6 w
// DWordConst
9 l8 ]; G4 S; L6 w. Y0 p: r% k( V
( J) j6 I0 ~2 x9 _1 k; MTransitionLatency,7 w# X2 E% s; m5 A+ U
// DWordConst 2 N5 C' `  s2 o1 Q0 y6 s
$ |8 g. @  _) s3 I0 L5 ?% o4 L
BusMasterLatency,
# k3 d$ W! N7 z, c8 L) N// DWordConst
2 p# `4 ?& }. X
3 I& }5 S& `, m. {Control,
+ O* c* y1 f  r5 J; B  J! p: }& S// DWordConst 3 b3 t. ]/ f( L
; P- I" u2 X3 p- y1 {6 \8 y  d
Status) S2 y- t- N7 P( r( L9 Y+ U
' @+ i9 f: i6 K  w, ~$ Y! c. p
// DWordConst
$ w+ u" p2 Q/ [) ]
: C9 U! Y0 w/ x3 k1 @9 B9 i$ R7 M},
2 x) ?0 n+ Y) \! i, f2 o9 O' X/ b3 J
. & h% |1 b8 x: ]! E4 t9 x4 ]

. S% M0 r! N8 E7 a.
/ h5 ]2 g& `* h/ m: `3 X2 f4 t7 S. V8 z) j
.
; N: ~# s& L& B}) // End of _PSS object
+ J; E5 g$ Z" v7 T. m8 \' b前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 ! M% \1 A8 {- {; b$ p
! }; E$ O( K$ B2 ~0 T
Name (_PSS, Package()
4 s2 j3 Y+ h+ M4 }  |5 j: i: B
& X. O9 z9 ]2 D: c$ n7 A{
( L& [% l! {* \8 A  ], U8 P7 m; f3 n& Z; u
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
9 T* _( F  A1 D$ M  m/ h+ n
( b$ N$ i$ J; z4 Y( ~: ?0 sPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) : Z* M7 ~* i7 a: |

0 p- V, m, u6 P( \3 dPackage(){1400, 8200,
/ e) T5 k1 J8 o. M10, 10, 0x000E, 0x000E}) v0 m4 e2 E2 Q( }' o( |* W
// Performance State two (P2)' w$ ]5 k8 P2 N1 z! ?
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 5 I" J5 Q% f& K0 |5 Y! i
Performance State one (P3) 3 |+ I( P) x  Q1 X; x
$ @. r" S/ \0 k, Q+ ~' Q0 Y
Package(){1200, 8200,, L: ?( N# O  W* d$ K* h
10, 10, 0x000C, 0x000C}
8 ?% z' m& a" k" u, ?// Performance State two (P4)
: r8 [5 i2 i7 a& }
& X$ T0 D0 W; v/ {0 l2 E% W* D}) // End of _PSS object
9 W6 n: F, ?$ Q! \& q
* ^/ a! `, G, x另外当该平台支持Turbo Mode P0将会reportTurbo Mode% l/ R) i& f. Q

$ [/ \+ ^0 U9 u) e1 s6 hl5 r/ J" B# B" S+ K
_PCT- L1 z4 v; p1 ?# |" E

( l, J5 L( V0 R2 b) BPerformance 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的方式来进行。
: e7 }3 a/ f2 B! _. G
# R7 W! F- G- E/ [( G% qName(_PCT, Package ()
5 a- |3 o3 B, ~' o- Q// Performance Control object 0 E5 G, c; l8 D. [  |

3 M! K/ V/ r5 V{ + u  j) ?9 l  F$ L( }( X
. F; T$ \; b9 E2 Y- M
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},0 n$ |8 c$ w# Z1 O' C: j! w( e
// PERF_CTRL 3 W" T4 N+ @; w) @6 |4 h/ y0 v

, m  L2 l  z; O' V) XResourceTemplate(){Register(FFixedHW, 0, 0, 0)}* o5 ]) f* H  }" |
// PERF_STATUS 5 c! S. c, V! m, M

8 b! `3 {/ y' S, T3 j; z! q5 ~}) // End of _PCT object7 ?1 ~9 i. P: H: m3 `1 p0 C+ Z* a' f

* G" g8 }' R6 K; gl
$ h3 }- `1 s7 N9 a; X2 [# J& k3 k
_PPC
2 r4 x6 N4 T* m) b+ a0 R. ?
0 L* R7 b' [, n9 \; y! z4 ]: oPerformance 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
! n/ I. ^$ |$ X8 q) ^' T6 \ + `. B# E: M& ~4 @6 @
Method (_PPC, 0)
/ i. O& l" B! b* `( V4 g! I// Performance Present Capabilities method
" B& U8 v- p' {, _& c( B% r# Z8 a, y% Q
{ 9 n; \+ E" u" ^
/ m- Y& v6 g8 J5 K: N/ G
If (\_SB.DOCK) / B& P: B. n% F& u, ^

, K  w3 c# V1 O: B& {{
$ t2 U" ]% {6 q0 }5 l1 N
4 Q1 Z! \3 ]/ ^7 Y1 E: WReturn(0) // All _PSS states available9 r4 |* ^8 F$ {! `7 j; Z
5 V; W; }' ?3 w; ?

; T& b5 q1 Q: E} & _2 P/ R4 p6 }  q2 j
2 o4 i1 }0 }. j" }
If (\_SB.AC) - s) b/ X5 j! A' ]

$ K2 g+ W9 L) o3 e1 x{ - V) Z* q7 M* x
& d& E6 M, V: o4 O0 T
Return(1)4 l8 U* H( t7 n/ i, V
// States 1 and 2 available   ~1 t$ _* n8 N* f3 W
$ u& E" N# w& z2 N! E1 I
} ) L* c$ e. w: m: O0 r. w

& ^  f  r) K0 t' W5 @Else
7 U) x3 W: ?# B! O8 v' g( x8 C" ]3 ?: p$ {1 M+ K. G8 j5 ^( ~
{
: b) J% c, h: \+ H2 [0 Z3 l" p# @
& A5 F7 T+ M, h' s1 x5 tReturn(2)0 s2 u: h- O( X, K+ Q# r& k0 X
// State 2 available
* N! J2 c& ^6 I/ Q% `4 p) ^  I& A" x+ y! X
}
2 D- d) y! a0 O
' U( A% f; t" {3 ~} // End of _PPC method  q% _; I, ~. `$ P" t1 G
% ~5 F* C- R5 L5 F  F( g
l
0 j$ K- K) n0 `; t# B7 a$ q
_PSD. f9 j. u- L  L6 _  v. b& H$ V

# q8 M& z+ {8 n& e3 [P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
0 G! h) L; N+ {, ^
/ q+ p8 P. `3 y* `$ g( Q* M6 a4 sREFF:0 B+ D  z4 N" X
1.
% z& }! Y1 U" N( G' q& cACPI Spec 3.0
9 {! ?1 T0 s; R2.
5 l( x8 S. ~& Y+ e, A, ?' YIntel Processor vendor-Specific ACPI
; Z9 L) J3 I; B; A& a/ | : v! V+ ?% T# G8 P# |' G2 s
5 s' d0 D9 \% F$ k6 W
That’s all!
' u- `8 N5 u/ `' m, K. j : F5 M- I5 n9 ]5 }  n/ k2 o/ B
Peter
0 `2 G# ^0 j+ x4 p! V : h# m. d0 W+ s1 P/ T
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
1 \; D4 P7 p$ k# e & T% u- U( o4 t( k# {5 i) B
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工作时间的占空比)的方式7 |& |& C+ l( x1 ?4 c* _0 t
,影响系统的功耗和温度。
& R/ ~8 M* i$ i
$ J" V$ d1 x4 E6 J1 o/ p2. T-state Control
% K! X) ?& n( V; Y9 B+ ~! \ % ~0 P' v# h3 Q: h2 C( R
1)
  Y2 h: g) ]  ^5 v7 KMSR Based Control0 R4 L' L% `2 |! e. r

# _: d8 s9 h4 c9 L& vBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
. g" V' G9 q. u' ?! \9 B* O# P
7 g/ k8 c. C2 B/ u1 x( J5 C  N2 F4 V. k( Y2)& j1 m) f' j# ]6 H
I/O Based Control4 A% b' _9 E( E9 H( |& B: e) B
9 X, h. O/ R/ S- h1 s( y, ]- }
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
0 |5 q- V& x) Y) h& q0 O5 o1 Q+ q3 J ( t2 x9 q- {3 j* N6 v
3)
4 Y/ C4 N+ J  ]2 l: E" gACPI Structure For P-state9 l) F2 I' j1 ^. i
l7 D! [& I* e8 N" z" x( x1 ~: }
_PTC
# c9 x- G3 t* k" w9 v5 O$ C- C& z
7 n$ P* K& v# ]3 U1 `* O8 F$ xProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:! q% y7 }' T$ N: n7 j0 O9 S
% j9 S7 e8 R$ Y7 o$ h
Name (_PTC, Package()
( }! A, i( E& c% F/ @% u* \{ 9 x2 m# i% ]% K2 Q% F/ ^
& L" w1 T& H- M% W' _3 p  ?+ I; _
ResourceTemplate(){Throttling_Control_Register},. e3 z, O9 j# `/ D
//Generic Register Descriptor " L" k# w! \# A: r) F! t

, G6 e& X. D8 P& wResourceTemplate(){Throttling_Status_Register}, a' w6 R+ t, B8 e: v1 B
//Generic Register Descriptor ; X" g0 b! Q1 l+ y# k
}) // End of _PTC
1 A5 x1 g' z- I( Q" W1 a  _2 p4 c 3 r& Z' q- v7 C! x/ T% i% p
下述是一个sample code
5 z+ h1 ?* z' f. t
8 m% s: d( d. Y! G) i4 Y. N! o7 Z
$ i* u: S' t" ~5 a8 i/ c3 t
//5 {+ C' d7 F7 x6 q+ W& N
/ Z2 @% v/ I8 i3 Y8 N
// T-State Control/Status interface5 _, N  R# Y7 [$ d$ w( g2 s# T  h) w
' m; r: `' W4 {0 T" g
//( R% _0 b  C9 X9 m$ s9 X

6 H, k; \8 O) k. WMethod(_PTC, 0)0 f0 ~7 Z4 q; M* R+ K* I
. }- B7 t  M4 w% z' M
{  M+ I1 M* {6 Y, t3 V) n' E

3 V7 Y4 g7 |; l! x//8 I& C2 ?- k4 H% J

# `. N' p4 X( j3 H// IF OSPM is capable of direct access to MSR
2 h2 \9 _# t) X/ C6 B5 g" q3 i
' [2 S) ?* T1 @& C: l3 w//5 ]1 k& w/ @3 d4 n( p& m% u* p
Report MSR interface
( `& f) }" ]  D  ]
1 A' t5 A7 {9 b( q5 r& ?// ELSE
0 g( [# u1 Q+ l) Z  y% g& {! Z7 C' I! ?2 C/ u
//$ v6 d, J$ ~5 f* Y  T5 m  K
Report I/O interface
' O% @" E$ {* }2 Y
, n" m: U0 _7 F2 t//
( y; s8 S* o9 t  c9 }8 J' s1 c: c6 X
//. y/ Q2 N. n6 s6 W% g) Z9 v3 `
PDCx[2] = OSPM is capable of direct access to On
' u4 z$ o) I" a8 ^; a# \+ T! F  [8 U) Y8 C& c* U4 U1 o5 ^
//% Q! g3 U& u/ T: S/ B9 ?
Demand throttling MSR* @5 t6 |# ^$ S; y; V1 a& z
0 S4 A9 h% m: p8 p- _# Q( o
//
0 Q0 W% }" R# m) `5 e, ?9 v
) N$ h$ t+ a* f( h8 T6 l% KIf(And(PDC0, 0x0004)) {
+ J- T2 B* b& Z* A) G# K
# U& N0 K( F9 FReturn(Package() {
) k$ a8 ?, I4 j5 g2 D8 E+ g$ X2 P( f( {- b& v/ W8 s. h
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% B7 O9 d+ _" |- W- ^, Q0 w# A
0 A8 n6 v; i0 m' SResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
! Y6 v6 b8 K, B' V
7 x- A1 N# s' R5 r; x})
% Y0 ?, U+ V3 c7 V1 u% ^
& W8 k% x8 O4 F# H}
+ Q, X) F5 ~7 J( s
4 _9 Y5 a0 J, c, ~0 R8 ZReturn(Package() {/ t  N& h" I1 b7 f+ y
8 Q- L' u, b' k2 I, D( F# w5 Z
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
5 V/ v+ L' G7 z
# Z" d# T, L% `, d) WResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
! K- G! h, I& s' ~; Y/ m! n2 f& V
! s% P( B8 F4 r) A( L+ z* D0 w})0 I' L" e2 r: Z  b5 O/ `& F, G

3 @. x, m/ l2 E  m* [7 V$ ~}
. ~3 G. K; R! f: E1 E  c5 t+ i6 [
4 p8 V: ]  O- r0 d% P  f' t' ~" W1 n1 Y0 F$ ^( H' {( T
& f- S. q4 I4 P" Y, `5 s4 b' i
l: z/ |' P4 R9 K  l3 F3 M
_TSS; G+ C" h; B$ |1 D

# x# U  ?3 E7 A& LThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:5 ?! `/ c* [+ s  f$ G; ~1 H) [
Name (_TSS, Package()
% \. L* O6 P1 F2 [2 s5 w$ T9 a0 V{
" R) {: q' g- y4 b/ {( r( O% W// Field Name
1 D& f! _: T) x: D' {1 WField Type " A0 [, s4 V& k" Q
1 U; y1 t6 n2 Y# Q' v7 r

9 B; l- {. D" C) o2 P- e8 Y0 ?4 m) q; V0 K) ?/ O* c; |
Package ()  I8 |# k3 ?6 z1 x& P3 @7 X
// Throttle State 0 Definition – T0 ) z/ }6 y1 n+ M3 ^6 @% W3 Y* t% G6 @

( X- q5 u1 t3 O" x: Y, M{
2 s7 V, Y8 j! s8 |+ x
4 D- C! L% O" l
% b5 n* U8 K, x  n& A) ~FreqPercentageOfMaximum,8 a: ]( D5 I+ _
// DWordConst 6 A2 I( z+ g5 S0 |- y: E

" W/ M( F$ C1 E4 X) Y2 KPower,* @, i# a7 x2 g) d0 \
// DWordConst
: D2 B' I  |  R/ X" g9 J4 q$ {2 I( `0 A( H& A
TransitionLatency,
& f) x5 Z( G1 y9 G! F// DWordConst
- Y4 S" J; d/ ~2 S7 i+ d$ z5 k) o0 ?; C: ^& E4 Y
Control,
6 z2 F: y3 _! r! @) p// DWordConst " f1 u5 g+ G6 w, r$ h' \/ \
/ E3 I1 \6 P/ f9 H* ?* [3 ]4 w, I
Status
1 i, q/ S+ {' n$ m/ Q$ N/ N. Z// DWordConst
( ^1 ?& w$ o% K3 \6 l& ]},5 p1 Z5 X7 X$ g$ e
……
- d- x1 ]4 o: V/ [& D1 M* ~! a/ `}
- n: ?/ C1 E; k: [
7 d) e3 V9 O, Q4 t% f/ W) f  EExample code 如下所示:
' v6 D) }' I4 B. J
" b% S  r) u/ e8 y" q  v9 J& BMethod(_TSS, 0)
  K" J2 y$ ]; ~( L9 G/ D3 J. F7 X. \2 J0 k# u' [3 Z
{
; p$ K& l4 I+ a/ J1 |- t# \5 l0 o/ n2 j- b- E
Package(){100, 1000, 0, 0x00, 0},
/ j3 ^8 g) d6 p4 r0 I
/ V. c9 j; j9 ~7 ]5 k. L$ [Package(){ 88,
5 O; g0 g/ e2 H* x7 Z. S! p875, 0, 0x1E, 0},
* z6 F2 r/ P9 s3 L. J. d) N" D( x- x' z! y+ `6 t
Package(){ 75,
( Y- e) C2 {8 w" l3 H9 O& c, o! i750, 0, 0x1C, 0},
( ^. p$ u) i7 r/ ]# v
$ b- g$ N% A  {Package(){ 63,
( c& W, x: e; p' E- s6 f  \' V, l3 h625, 0, 0x1A, 0},
' M8 v& D4 V2 p- K$ N3 p1 _, g5 B- ?
Package(){ 50,5 _* \& I/ M6 K$ s; `1 h0 k0 w& `
500, 0, 0x18, 0},
, s* J2 V& c+ W+ p1 z" ~( Y0 l# X4 \# r7 Q  n: k4 d8 h4 j* B7 r0 G8 ?1 x* q
Package(){ 38,
3 [! s7 ?" E7 B- W% R- V375, 0, 0x16, 0},
% E9 H6 _# ]" y7 a, {6 c8 H# X* ?, S
1 s2 T: q; O. T0 P- |# M1 qPackage(){ 25,
- d1 _, o. ^' u2 O250, 0, 0x14, 0},
5 s& u- P5 R2 `% }" M2 \! e- b2 B3 p2 x3 f
Package(){ 13,
5 e* R% f3 ]: @7 t2 b' k. @; a/ o125, 0, 0x12, 0}8 K. A  J0 L% V& p2 k; y

. M6 D* K2 O4 |6 P, ?}
. e+ {0 O: G$ i; k( [  K- h( Q( o' B9 m

, H7 P; R9 r" B4 ^0 s- vl+ x" V+ v: i: ]7 [6 M
_TPC
# B# P* t* L; Y' ?( l. o- `
9 ?- Y1 E3 L, j, J6 cThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC4 S* A% ^2 y) p: [* x5 t

" e6 @0 z1 l" A  ~l) f/ P  C/ p/ `7 W' j  B- T- l
_TSD/ d# G/ \3 ]& B& f) h% q+ J

* K: ]6 \( ?! U3 ^: u: MT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code7 Z* p/ B' y# N+ C" d1 r
) K0 N+ J* J& Q# Q% j
Name (_TSD, Package() 1 I3 i, w% g1 S$ V$ @
4 v6 y" i5 W* L6 s
{
& q& m5 Z1 P) s0 ?- b0 R, s: m5 W- {/ ?0 }& N/ U8 V& V3 D! n& ]( @
Package(){5, 0, 0, 0xFD, 2}
, W% K6 \, ~: p# d# g// 5 entries, Revision 0, Domain 0, OSPM
! R9 k' F. G1 k9 ?Coordinate, 2 Procs % }. u: M; i4 ]$ K  |& t

4 X; n) G% [1 V- H% S$ b. ^. y* j: ~
  ^7 A1 X/ `# O! k3 I% N+ W}) // End of _TSD object. A" L' N* O+ t" s! W# s

0 L' b3 p" E( r  }: L8 C! D2 VREFF:- O; d+ e( R6 {1 X: O
1.
8 U0 r* N7 z! T! ]0 cACPI Spec 3.02 w, z( F4 P# {6 I5 v
2.+ U4 z- R" R+ g# K
Intel Processor vendor-Specific ACPI5 [/ @6 K9 X5 h( B& y
, p4 d& k+ H7 v6 ~. S; D8 n0 ^
9 O" u! Q: J$ D0 [5 Z- e0 ^: V
That’s all!4 d7 N( y' E0 o

6 G8 `3 U% J6 T. B$ M; ^Peter
; I  T( \( v  h7 O : a. ]" l' u# h9 ?, }8 |
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 09:44 , Processed in 0.048334 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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