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

CPU Power States

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

2 G: H) B2 G- Q; H" W' R: ?9 \1. Overview% F6 r$ J" U- h& d1 M
$ F* u6 K, _; a* M! N

. S7 S- U5 [9 V# W, RC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换* X' Y+ x" E9 X( r
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看4 A: p) E+ ?. u0 d( d+ B3 x* C
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
$ y7 ]5 r8 _7 o3 F
3 @* _+ f1 s1 Y3 x
cstate1.jpg
( D( K3 N" H* L9 S) V- c, X
1
( ~" z. D4 X6 r2 u
2. C-state Control" o/ t5 Q( {+ _0 K2 H

$ J# x8 g2 n8 r+ N' l/ H/ D! }1)
3 k  X( b' N" X, jDetect & Enable C-state/ }! [" `3 {' ^: S& q$ d5 H

  ?# _8 u+ U: x1 yBIOS可以通过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的支持。
. |3 o6 e5 [( u8 C( f
1 i+ Y* d. C* M8 j3 x+ P  m2)' o. a7 I2 ?9 {3 y) l  B( e* e8 P7 B
C-state Basic Configuration
! Q# h3 T+ S' y7 _通常情况下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)。! j2 M) A: U5 y" F2 G) x$ O8 H; G: ]

2 e+ S6 k* ~+ O9 p3)
7 [9 C6 |9 v% E. ]4 G7 pACPI Structure For C-state* v4 m, u( ^5 l5 b/ }
5 G1 u8 t* Z6 A2 G
l
( b2 P' @; u* T. I# j; h
_OSC & _PDC
6 N4 A; z; _$ K3 `1 x8 o_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
8 u) |+ B3 @5 h7 C- t# r: b* Ql& w& `9 f) J: z5 Q" R
_CST$ g5 m. f9 G5 ^
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:) M6 A, v& ?9 j
CSTPackage : Package ( Count ,
7 j$ T; R) ~5 X  aCState ,…,
. _( ?% C# C4 b# F, p0 K0 n+ H) ?" zCState )0 K$ q+ K8 W- K$ l$ B$ o# M/ x: B
其中Count表示所支持的C-state的个数
8 H* @0 a; f8 n) E2 ?/ KCState: Package ( Register ,
. Z3 g+ X) a+ c( Q$ DType ,
7 z5 k3 F- _* I: t( N( J6 NLatency ,
/ a5 G/ s/ X9 ^# u  yPower )
- v! B; \# K9 T" V7 h  E
1 X6 B2 U$ N/ tRegister表示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
7 t4 m) N3 u4 P2 H
  _: s' j3 B; `3 p" H- p9 a1 vName(_CST, Package()
  X2 c/ p' j( I0 g: ~0 V5 G2 j

( {" j' A) c4 R5 ~{ ; u. J6 @! A& Q% D
4,
. [5 w, z5 v7 B, [8 J2 t! t+ l// There are four C-states defined here with three semantics

$ A2 h1 J  C3 |+ s" p  c0 ?/ x8 z+ o8 V6 N; ?: e
// The third and fourth C-states defined have the same C3 entry semantics* k1 k8 G+ q6 o' \

6 t2 O8 A! t: m; u# }Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},7 Q1 g7 L9 Z8 ~- p/ E( T
1,
2 z: D7 O& K8 z' S) W3 P7 N- F3 n20, 1000},
* O. o2 S/ b# _, b! U2 v9 U# X. x. m+ n
' E/ q* x' n! z6 k4 P+ Q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
9 b7 y0 {0 {& _, j: r! b" `40,
  u+ N$ u5 @6 n% [8 J; r' H750},
3 V0 S( m/ T- V9 n& Q1 G
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
+ b8 R" b2 ]' g4 v# [60,
, }3 G5 M- k$ j/ H8 {500},

% i/ t( c. H4 m, `9 ZPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,$ n6 D+ g7 ^& G0 |" E; t
250}
  e& q6 O1 c. x2 n

) @3 r! M. N' ?  o6 }}) $ J/ J/ A6 N! W2 |, z( e
, r/ W% |) B6 e8 a  [% e
l! S6 ]" k; G* l
_CSD: `7 h5 r5 D! o' J7 D

+ y, L8 s# \2 O- H1 sC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
0 s$ n) r' M; N' p1 x( o* }% l. ?4 ~: M- S, J9 o

6 @- m" b9 p8 \$ x5 ?- M- L1 ]
" z  a) z  s5 `% e1 W0 z: k; [+ H
3. P_LVL VS FFH+ Y3 g- N( Q/ _) P3 h5 \% ]/ F

8 n; p: u4 W3 i# ~1 O/ o$ |P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
: p3 o: `" ]+ t1 o4 P+ Q8 h& B& iFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:. u6 v6 \, x! d2 ^# L

3 S0 W! A' }. ~. r
gas2.jpg
: Y, r$ r% ~+ g% ~" L8 k9 \- P
2

, V4 }, W8 ~  G/ BOSPM解析到该_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的一个例子:% R# F  R! J7 n0 _0 P) L
Name(_CST, Package()4 t' v" N6 Z# @7 l; b5 x5 R( k
, ?. \, P4 w) w+ i
{ . n! x# I6 I5 z/ M2 P" Y7 _
2,' ~. u$ [) R0 V3 v" ~5 e( j( P
// There are four C-states defined here with three semantics
9 O8 ^* R4 e. ~3 q2 d
# ~6 F1 g$ O  o
// The third and fourth C-states defined have the same C3 entry semantics* v, v5 U4 d6 N  l! V
0 r: b8 P( e3 I
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},9 W5 o" E; D' ?; Z$ H
0x01,8 Y# ]! O! f4 E- G4 ]0 w
0x03, 0x000003e8},3 i0 n5 v7 }+ n
# d# @! ^: |& X( W
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
1 e: G9 i/ [+ H  ^& d! h0x01,
. Q# ~% C" P* b( b; J. L/ l& P0xf5, 0x0000015e}

. z3 l+ m. _1 f8 z}) ( \7 T+ y4 h7 Q* K% ]2 Q7 m2 z
4 Y7 W- u. `9 j; o

/ |- [  M$ B, k: a; \- RREFF:" I0 k5 _' q6 h+ D; ?/ p8 L5 W
1.4 G- I$ ~! G& B: E" k# q
ACPI Spec 3.0: ]3 z7 }7 Y/ f6 @8 k+ o' j% \% \
2.
; _5 C. `% C. B1 l- ^0 _Intel Processor vendor-Specific ACPI3 V/ V$ s0 \1 P! p
  p" `* N4 Y) p* }  |3 Z$ O
* w/ B" e' ]. a& [; i
That’s all!
/ j4 |4 `8 L& k$ b0 \
6 z2 p: J; B: ~- |$ k- LPeter
8 A0 n# w, X2 W: x, I6 b) x, K
  f! h; F! ~$ [/ a2 ~8 T2010/9/20
, u* Y' a- ~: N# }* E3 t
3 q. z' q4 Z$ u7 L- O[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
+ T5 Y$ t9 Z% t 7 L# [$ f5 k2 F) p) ]* H3 s4 F
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST3 i2 a' b: \$ j
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
- D8 `+ U& z9 k+ D) ^" `% ~
8 s4 {3 G& x  B( v8 T2. P-state Control
% v4 C' g. I+ k' G; b2 d
2 ^' c" P7 F, o. v- P- a1)0 U& f: O/ `& R
Detect & Enable P-state
& w+ M8 Z# v* u; O8 @& t : R3 Y+ s9 ]4 d' _/ M5 u5 J
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state3 T6 E, _/ E9 O2 ]4 T
/ }( V2 j4 f2 {" H; F0 o$ x" c# \
2)1 y( Y" A4 f6 y/ [, B" A, w
Supported P-states
; n3 j2 S0 |* V* Q7 q: i 6 E+ m* n3 B# m$ q
BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) MaxRatioRatioStepSizeNumStates,所有这些信息都可以通过CPU MSR直接或者间接的获得,其中MinRatio MaxRatio都可以从PLATFORM_INFO中获得(不同的bits),NumStates就是二者的差,有一点需要注意的是如果NumStates > 16,RatioStepSize就会加1直至NumStates <= 16为止。CPU的工作频率 = BCLK * Ratio,旧架构的CPU BCLK通常是由clock gen给出的,通常上是100/200 MHZ。新架构下CPU clock gen是内置的,BCLK固定是100MHZ
) _0 S3 U4 ~- w - u, _1 e. a# e3 S1 v) O
MinRatio = PLATFORM_INFO
, v# L7 [( H1 o4 kMaxRatio = PLATFORM_INFO
3 E. W$ f. M7 c9 W, k: O! L2 f4 x& uRatioStepSize = 0x01
  p7 N3 ^) W, j" _7 _% Y$ l; FNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
( u2 Z7 j8 b$ R
% `; N9 p# T# q7 w" HIf(NumStates > 0x10)
! y8 C5 d9 t& J4 Q! t* F1 P{' `6 c+ l/ b: `& e
RatioStepSize += 14 ~4 C2 X2 \3 n( D' C# |  C' S
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
8 P; W8 D+ `* i9 w3 P3 y1 k8 \+ V}0 j2 w0 c! X  Q, g$ I! G
- g- y) n4 w2 j. w: c
3)
+ A. G. P% v. C" ]1 XTurbo Mode
9 ~) ^0 O5 w9 v3 O
1 }& s4 p4 \* M/ c% RTurbo 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
" O- ^' J7 n" [3 ~
8 X& ?/ P' j5 d0 @/ U! U4)9 n1 E/ u" D6 A; J7 q8 f7 u, p
Over Clock( l; X% j" [% N1 G
6 W- s0 n: N* f9 S. N
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。- i/ S6 u; }7 R% F- Z# {$ Y
6 _0 @2 k4 U6 D$ j  D  E. }
5)+ W/ a) T5 h( a( m% S9 g% b
ACPI Structure For P-state; h5 w, H. g, A+ }

1 n3 U9 }4 d$ w) |8 k! }4 il
# X3 _6 C- K) z3 N2 D9 L/ h
_OSC & _PDC
8 R1 {0 ?" W$ Z0 C# Q1 G1 }/ ~) |
8 W5 p4 C1 E$ w/ N" r7 R_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures, C) `0 ~+ {# }& s

, n9 A+ j; j! R3 q/ n0 w' Q, Kl# a: U8 L  _& `; I: N
_PSS. \! Y- k, d0 i$ E
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量1 o8 u9 e# S$ N+ R8 i. _* ~
并且通过一个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做比较* b/ {0 `3 D7 ?2 @; k
以确定P-state切换是否已经完成。: ?4 {4 r( {7 M' V
5 x" j# G1 H) ~, B
Name (_PSS, Package()
% }$ L5 B8 C. c1 G, C5 |{8 K% x5 k% F" O$ ?
// Field Name
5 l1 |# q. x1 F/ F  T( {Field Type
( g$ E8 ]0 G) ?/ ?: X* W
# G6 S5 T" S" W, C3 j+ @' |# X/ i. @% o0 ^" [% x% q$ y5 G3 k% _

, Y3 q$ v$ d6 t* B) @Package ()0 P* ?6 `9 n9 |; l  j+ G. r$ z: H
// Performance State 0 Definition – P0 9 }' `1 m, x% S2 J7 [) B  u2 [

' Y4 T6 a* A2 N- j) i  r: C{
, n& W! G. G0 j2 X5 U- q" y! U7 t6 n# g  a  Y# _0 H9 Z# r

& H+ Q) ], K8 u9 {& ~5 hCoreFreq,. ^" K0 L3 @2 W" q1 i/ U9 X
// DWordConst 0 h: F! y4 a& W# G# f5 X

# l% s0 X8 M* z
" ^$ G: ]. p' P7 e! YPower,% ?# S: I+ ?" |/ W. ~0 R
// DWordConst ! l6 D" J  A9 N( }" _6 R4 [
6 T. H1 A) m  \
TransitionLatency,4 f* p# }$ }6 k( C1 s# H( B7 ], O
// DWordConst
% d9 Z* z" Q9 x: U1 a( @1 E* |2 B$ u+ ]
BusMasterLatency,* L2 u! n) l% x8 {) e! n- G/ I
// DWordConst 0 ?) a$ t4 Q2 l* h. Q/ @) O

6 n% ~0 b  ]' r9 Z: \9 r3 pControl,
0 e6 }& {- i( A' h/ z// DWordConst
, x7 I2 X! ]1 z1 v- P* U0 ~( }! B) E, V+ V" h% d# J
Status
" `# I! o, @: H& j* ~" Y
' T& M8 ~/ w3 a1 R& m+ V6 t// DWordConst
  _& X' E; [) j. G# X* j8 W# |7 M% P
},
% d$ a3 k% |0 f% E# b0 q4 f9 Z: D  N  p& y0 X* w6 d6 }
.
, I: X) n1 s3 {
; ]1 F7 e, q5 r- g( U# e- }.
. V( G& A% {) `
7 i. G, K8 w2 _. / S1 U! F% l9 {, c- x  z
}) // End of _PSS object) _2 @! n' E$ Z/ d5 ]
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
( D4 j: R& ?* S" x0 X! Y9 m
9 J  p% K- h3 M# ?5 bName (_PSS, Package() ( p; L6 p8 {0 ~- x- i6 l
2 _+ H3 Y5 C+ ~
{ 3 h. R4 B! g4 L' v2 }( m/ X2 d( O

+ a6 t. t4 D+ lPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) : \" v- Y% h/ W

  T' ]: T) `! e$ z* yPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
0 W  f* Q" n+ i6 Q  w5 n0 i4 a6 P! q: j7 v, Z. S
Package(){1400, 8200,
* x7 T: }0 |/ _* {10, 10, 0x000E, 0x000E}4 Y/ E7 m& }. C6 }/ \' F4 C
// Performance State two (P2)
- ^0 O4 ^! s# j) e% U6 y2 @3 u! b3 ZPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // ! s: ^  y1 b8 U" w2 b& @0 t
Performance State one (P3)
, q) h9 ?. i& N' `9 S# }9 j  q8 Y
5 c" ~0 _. S! ?6 ~' K& D$ o1 `Package(){1200, 8200,
9 K# T9 v# g1 t' o+ e/ P10, 10, 0x000C, 0x000C}
! U1 A4 p5 U) m1 T// Performance State two (P4)9 A5 }& t0 C8 I) Z' Q

  t  w6 C, U; u* p7 Z0 F}) // End of _PSS object
  }# O5 L% ~; y ( ?# Z* W" p9 k. N0 X
另外当该平台支持Turbo Mode P0将会reportTurbo Mode/ S1 w6 i* a. `3 N, I8 \

. X, l  v% H0 }4 J7 nl
  n3 l2 u/ N, |) Z  P) E
_PCT
' _4 |0 z) b5 j & ~1 q& T1 U- x5 h
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的方式来进行。
! e$ t5 f) z. O: T0 t . v/ M) Y( z8 D* @$ j9 T. z, Z2 q& i
Name(_PCT, Package ()
, H4 q% O. h; G# `% P// Performance Control object + T3 U: I" g" V) r1 L7 y

3 g/ x- a5 u: {' W- ?) F{
7 Y3 E5 F& w( b: T' Y( P
7 K( ~& H6 k. Q& wResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' {( X! D' m# @0 @& Q% K# i
// PERF_CTRL , T9 x% [# O4 P* q& `

7 B4 E7 X/ l2 D* _4 j& ?! R- D# PResourceTemplate(){Register(FFixedHW, 0, 0, 0)}+ h1 s$ d  P" h0 {3 @( D
// PERF_STATUS
+ v; P1 {2 O5 Q5 S  f# c* {: V0 |1 K" K/ K! j
}) // End of _PCT object
' c0 W- O+ U- L( i) B9 Q. \3 D+ L
" [% U2 ?" K. s. g* m2 {+ c& Cl
3 c4 G, v* r& a  }  P* m
_PPC
. ~0 f( y) W0 E; Z$ Y& L ; n$ K! d# f# A! K9 O% A+ d1 g
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
  z+ C$ a' a$ ?! C# ]& ` / m$ ~6 s# \1 ^7 k6 F
Method (_PPC, 0)
/ T! v# U4 {; J3 U  l1 s# t2 s// Performance Present Capabilities method 2 m- s7 c" A: e8 q

' h& U/ U% z1 X% I4 g* c/ F{
. P. j5 Q+ ?* }( r# ~
# K7 u! _; S2 z; BIf (\_SB.DOCK)
! ?9 S- M. v; {
; T9 }- o& _, ?4 h% ?" S' \6 O/ ~{
( U) w" U  ~' V
( H, o% Q4 z' i' r- {( |- A  dReturn(0) // All _PSS states available- y& t. Q" W% k: p$ y' I2 n

2 A) Y; C3 J3 [+ Q+ m! T& F) E5 C, w/ o% ]  U- l# d
} 6 r) M; H; q+ O. U

" U5 ^8 a* G. ^' H* i; }If (\_SB.AC)
5 g- x2 Z2 {/ K, V! A' L& z1 U! u7 \2 ~8 x6 M5 `
{
: p; P% h8 ^$ E8 P5 |8 O# |) [
Return(1)( \, v+ O6 d4 V9 ^
// States 1 and 2 available
. g( {4 M6 Q9 ~; k: K& P
$ a% Y+ y- f4 `: O3 P! }}
; k# W$ F- ]4 i2 H! h/ f5 w9 f& S# O7 h5 t' e
Else
$ H7 T; x+ A7 |; l1 g/ R
  {% _* W' L! J" Q{
  x) |. I& @% [4 c/ Q  T" p9 Y; q: I* ~( j9 `) _9 R
Return(2)
, l3 }2 T! g- s# \5 g9 v* {8 O/ H3 I// State 2 available
/ b3 h% Z. |0 n  ]: Q
2 Z; K. m' z8 X3 j}
, J( @/ s# w" ~; ^" a" i
2 Q1 R4 N$ Z1 u  S$ ~} // End of _PPC method  j& A, r1 Y1 y' g1 j

/ H* h& `- w7 {! kl8 O+ O0 c4 e7 d! P, |
_PSD3 f0 r, H4 Q9 O% U6 E+ N: B

+ m% f0 U+ s- L. m' `* K  iP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
! C8 j% z* ?# V# |# K) q
$ }. v1 ]' ]. Y( L0 qREFF:
1 p6 k4 A6 P; S; F* m" c1.8 c3 ~" ]. Z+ s- @% i! W, ]
ACPI Spec 3.0/ H' T& n/ z: u" ?; y3 _9 Q
2.
+ ^6 F" F2 g; t8 a) z: @2 NIntel Processor vendor-Specific ACPI
; j% e* X4 v9 |/ b, a
# L5 t' z, A/ `7 {) h 7 b/ B- d5 w; k6 `, f
That’s all!
2 m  {& B. k/ [. @1 H 0 h# [4 p, G9 R2 t. [
Peter
3 |" D: ^) e0 @1 A2 m1 `
/ s! g* o3 {9 e8 M2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview& y7 K6 F9 v1 V/ F! e" d

/ h. e# h( z: r6 `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工作时间的占空比)的方式& ?; J, O0 a+ L
,影响系统的功耗和温度。* [# G1 h3 t5 x( L, r# B" U+ D4 C

0 N1 s' z) f; a! l* F1 d- i1 I2. T-state Control
  ?6 E: D3 c1 N3 C3 c
! y2 z% g0 d. H9 r. z9 A: m# W# n2 g1)
7 j! `1 t: }1 Q- V) `( z( k: `MSR Based Control% A4 s. _$ G' b! o
0 g8 j; C% ^$ }% u
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
0 ]9 w# d3 t7 [" B+ c- x  E0 D $ y8 w' d7 u: A% T% B+ Q
2)& `" x$ |# o+ H. s+ z. e' @
I/O Based Control
6 a! W6 A4 g& J7 q0 Z 5 O6 a$ H4 c3 f7 q. Y  Z' j- D$ i
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。0 t% S  f4 u% a8 M1 Y
, [$ H- ]) I4 S8 \& p
3)" @) w7 Y+ g1 d: f1 r/ f2 v3 g0 F7 ^
ACPI Structure For P-state
$ A+ M8 J$ {4 s% I7 cl
" O  ?* N5 P$ A7 o; D
_PTC+ D8 D( G* k( s* G" A" U
: O* c- P+ k. c% z" y4 g( F: Z' i
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
) g8 V: G; N) g( O) T1 j  S2 Z
: J, T3 f: L. P* n+ C& uName (_PTC, Package()
- ?0 G/ `, O5 [! ^2 O( t% e{
' Q) t' {' \: f5 b6 K, }( P
: d+ B; P1 w, H/ ZResourceTemplate(){Throttling_Control_Register},7 c1 h$ B; o4 [
//Generic Register Descriptor
+ Q; a( K- |4 q8 p9 @( C
% v' \$ Z: v6 [: E; k' EResourceTemplate(){Throttling_Status_Register}
  t/ q; s2 D6 A( ^//Generic Register Descriptor
1 x- M* `7 J5 ]  @" C}) // End of _PTC
) _' h3 l- ?- d$ p - ~# E9 S% E/ T, C. V0 {& f$ q
下述是一个sample code
* x- i( F' t# F 5 O4 T9 a" C2 C4 q7 _  G

# z- Z$ b8 h0 B+ g8 }
//  G" g% `. {  b2 d

+ Q% h0 x2 f' }// T-State Control/Status interface
" R! m6 r( p7 o2 K* [/ U
3 w/ I' w: l; L7 d6 [//9 D% S5 `$ Y! C/ k5 ^8 l& b: Q

; ^& \2 ^' e9 ^  }9 j+ iMethod(_PTC, 0)& C! l' b9 Q9 C" L# V% m  G+ S

* i' N' P$ @) G2 n{0 K4 Z9 B# P/ f- E
* u1 D5 i. J, B, |% D1 X
//: q3 l: _! v: _+ H3 n, |
/ |* J& ^8 l3 m9 h- P
// IF OSPM is capable of direct access to MSR; F6 T; p$ o: O, M& b1 K' j6 ~" N1 |! ~

, N6 q) n4 X6 g% A1 j; w5 T( c3 E//
+ E9 |4 f' L1 \! xReport MSR interface* u9 Z( c0 A, B/ n3 l
' y2 p  ^0 g1 z$ f  o3 l% c
// ELSE) _5 Z) l5 Z4 I" x8 h) I/ t
. s; A, j5 u! N% v+ ~7 }
//% T- d$ X! X- v/ H2 p4 F4 F% _
Report I/O interface
0 m, \, }& D3 \; O! I+ a6 y# k. K4 c5 \) I1 |3 \
//* I5 q" g; L2 p* s& U

: P1 G) S* _; T1 T3 g7 q3 ~, I& B//$ v' E$ s2 n. A# Q, t
PDCx[2] = OSPM is capable of direct access to On
6 y' [6 Y6 ^: K  V# p) ?8 k& U6 U0 e8 V" G$ ]9 q
//
- d6 {. E' p5 zDemand throttling MSR
0 h9 R' f: \8 B, ?
3 `+ F- }$ d" h//
# P9 m$ o3 t$ T7 f0 T" K2 S" o8 ?( G/ e; y
If(And(PDC0, 0x0004)) {
! t, @6 Q* C) o& [& |
) u) r/ p' |0 ?, }! DReturn(Package() {3 a7 X) X+ t% S3 R! E- n
4 ^; J3 E0 V' H- A4 a
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},( W9 y: }/ `3 _6 a$ f

9 H6 D0 x7 P/ O6 e: b* g, E) ^ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
) z: J$ @/ |( ~" |& A! T" A* ?% k
2 `/ R3 g; W$ T+ m0 X! A& b( m  u7 f})0 V8 R; E. y% t/ a* {2 y# P8 e* M0 c

5 A3 L2 K' H  Z9 B( {}
4 @4 p1 M- A# J0 P
) g5 z: Z$ x- Z6 ~  W) i% i3 J& \# BReturn(Package() {
! Y7 M, F9 o& Q8 @/ e6 T5 u' r5 W! y2 D1 Q( A, h, ^; k* H$ e
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
3 L& o% }' d* l% p; e9 u( x. H- S) t& a8 Y5 t/ {( ~6 t
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
( h4 l+ A5 o* w3 D# V  r' w6 C& w. P3 ^5 h$ v0 P
}); W' f& H8 J, J. W7 N& V0 B$ H# @& _

5 R5 ?0 x  R, b& p* T4 W9 B}( i6 _) W4 G) A8 `* D
1 ^5 M% [$ g( s" b0 @; d

- i( y  a& t  N
' k' x# o" @1 N% U2 G" El3 H- G2 _- O+ T7 A' K# i
_TSS1 K* \5 T5 P1 i& @  j3 ^( M9 F
: M& I* C% [4 h( P; W
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:8 {7 b2 L% X3 c4 q7 g8 N9 R
Name (_TSS, Package()
; D# N: r6 V' \{
: c7 t3 L1 |* ]// Field Name# l: E7 R. l5 x( Y3 }- g1 F
Field Type 0 ~: m+ F+ v6 u+ @/ [4 c1 M

1 z+ X# G/ e+ q6 h  g6 n
5 m5 u3 |; W4 O7 u" e6 k$ x( w/ r5 U2 j; R
Package ()
; Z3 y" m: o: U// Throttle State 0 Definition – T0 ) |) W' L5 `& ~6 H" v2 p

  u9 p4 ~) J0 K4 ~5 w1 g8 s+ z{0 c# M7 f7 d/ U" U
, Z0 W/ J  M4 n( G2 V! ]4 @' ?

* t2 q8 y) R3 \8 U& J/ ]FreqPercentageOfMaximum,
& |! U; I, X8 N5 |// DWordConst . l" Q9 Z! u9 y* o
/ E  K1 v( J( o
Power,
2 U% H4 g: b/ y9 M" ?/ U8 v// DWordConst
9 k. b1 q' E- }. V1 i+ c0 I( f: A' \5 T& H1 j
TransitionLatency,( C- G8 i6 w& J
// DWordConst
+ q" s, a0 W/ X/ a* b8 T$ K8 b6 }
( M4 w' K" X0 |6 IControl,
( ~$ u- _3 p/ O0 M6 f4 @// DWordConst
3 ^) l0 {1 `+ W9 D- h% ?+ Y& t; o3 T* e) s
Status
1 F1 }* |4 K% N4 ^) i$ R// DWordConst 6 @3 a% `1 d, N- w! X
},
0 g! A* p! M" C4 }4 c6 c……
8 F3 Y& S+ d* Q+ e! m, T* A}, W9 M- X+ G5 q; p- H! y
' v* c0 \8 y) X( o' e
Example code 如下所示:
7 n* W6 w% s  e( M9 e: f& ~6 {" j" P5 q
Method(_TSS, 0)
8 o& Q9 d: Q; h9 k, \- p: ?
$ O( b6 n7 y! o- O{9 G5 J% z% ?4 ]

7 S/ y# v7 B2 D; m% x# ^0 x, @Package(){100, 1000, 0, 0x00, 0},
) G# q' e' k3 _8 V. K
1 O- L" {7 C  r% ~- oPackage(){ 88,
- \+ e. i4 N  g8 e( Y& H875, 0, 0x1E, 0},
8 C, r- f  o* e/ ]: @) R- P$ f+ H( ]* k) p" ?2 p/ [+ |5 m
Package(){ 75,: E. g, e; D4 y3 V" H( ?% v
750, 0, 0x1C, 0},( M' p* V% Y+ T8 t# J
' @* V" l) k2 r& V' @
Package(){ 63,* ^( e# G; c1 [- Y. d
625, 0, 0x1A, 0},8 `0 s0 a- Y7 K. k; l
6 }1 J! c7 h; w* m: i
Package(){ 50,
8 Z8 `$ Z* O% [2 n6 T' W2 b500, 0, 0x18, 0},# l( R- `) ?' K0 u) K
5 g) s7 L1 m" n5 e2 P5 X, C
Package(){ 38,: X8 P+ m# i6 g+ D" X7 \
375, 0, 0x16, 0},
3 p) J8 k- }0 N# d0 D
& M( D# e$ [" V$ ~% FPackage(){ 25,
( T% V) u+ i/ ~250, 0, 0x14, 0},
9 O0 q! F$ `/ q+ V; G3 h  R% ?7 ?: T1 Y$ {  Q5 i3 T5 f
Package(){ 13,
7 B: V, q# o# U125, 0, 0x12, 0}. b$ a& `: \0 G. K( k) |; O7 ^2 k

, z# r( x! @% V}" _  T- ?4 R6 i

5 z% \- i# m) r; T' E+ S
& s! n, a; k+ y( j  W4 g4 G& G* ql- H& H/ K. q+ i# R
_TPC
3 k! _; ]! l, X0 c+ Z9 Z 9 `% W: K7 b- x5 O5 {% W
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
1 H7 X8 R2 w! G : J& S5 |' ^2 B0 K. s5 W
l; J; ]  Q3 p! b
_TSD- d) I) k3 q' v# {6 H/ \
5 n7 p. v% O+ \* T2 |1 L
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code7 k4 K, ?, o7 {- w( ]/ b4 a
( o8 |% o# g8 H5 L, Z# g
Name (_TSD, Package() 8 E. |# E' P2 ^$ A" a. p# `

& D3 J, Q& v+ Y: h; [) U; A6 l. k{
6 ^1 T/ R) r$ d2 w+ ^: n3 k: I  W3 {0 `1 o. {5 t/ K
Package(){5, 0, 0, 0xFD, 2}7 H% I- X8 u: \9 T& q0 [! E
// 5 entries, Revision 0, Domain 0, OSPM . p# F) ~/ R. m' r8 s6 {' \
Coordinate, 2 Procs
: t* G5 R& [" ?1 G9 g4 ?
- Z' u8 n- P) A8 S
% M0 t7 F3 j9 e8 F( N/ {}) // End of _TSD object
, Q7 p  ~! U" e) S6 ~) V - g* Z! G+ ?/ s8 E6 u
REFF:
6 P) e+ S7 k$ Y5 `1.
8 I6 ?1 ?' D3 ]+ RACPI Spec 3.0* z$ t& i' ~  I' Y% U
2.
3 C3 M: {, W- n. m1 L+ EIntel Processor vendor-Specific ACPI; y' \8 O* {' V! N: ]8 X7 r

6 i' o/ ~7 `2 Y
/ i8 o/ L, k9 T5 i1 w0 o/ [  Z8 rThat’s all!
6 G0 _- r" N; n! }; B * B; ]4 A' a, X% Y% Y7 _2 c
Peter% X6 S! V) |. r
  }4 @! Q1 z* H
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 00:03 , Processed in 0.149508 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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