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

CPU Power States

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

! h1 R, d6 X1 w4 I* I8 c, L7 q1. Overview
1 G& R* T( ^$ Z8 `" j0 h2 W. X9 K
- y. U! `) t2 R9 Z$ H9 e9 n% Y& X3 I
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
+ u) [4 O6 j5 F! i; {- \* D9 S9 \降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看1 F( B, r; A* e& F4 e; t' `
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。8 e9 z3 s. P4 p& G3 W

" p1 p' r  }5 L9 Z* N9 ~0 y
cstate1.jpg

; m5 G% P& X8 a( n) }- E( b* p8 \
1

& U4 r# U! t/ q. ^$ A* n2. C-state Control- z# F7 O. m& A: z

8 e' B  g; O2 M' N1)* T7 v( b5 R* s/ f2 y; b
Detect & Enable C-state0 x( X, _: v1 e/ H! }9 }) @" J# `

0 L0 [9 C* b( x  A+ tBIOS可以通过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 s6 X2 {+ _8 L4 h# [8 M
+ i! V0 B3 c* u: h$ M+ R( z2 _
2), @2 L9 W" g% ]: l: P
C-state Basic Configuration
- F- g4 ]; t* ~. B/ X5 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)。
! Q& W0 P- A7 ?. g/ w! P1 t3 b' V4 @3 Q; n
3)/ d3 ~; O! ?( x1 `) ]! W9 R$ S; T# C
ACPI Structure For C-state) R: h4 z# I5 u3 L# }

$ n2 }2 j0 w( H6 i+ {8 ^  ]l% j4 S& ]' H3 z3 B( W5 }
_OSC & _PDC
2 ]. m0 v0 G7 R3 Z, J_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures/ l$ D( u0 a/ m
l/ n) A- w, f  y3 J* k
_CST- v5 m8 u1 e/ K6 F
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
7 z. |- h$ K4 H0 n- C7 fCSTPackage : Package ( Count ,2 f" H6 m9 k/ x( a0 F* a- U3 p
CState ,…,
4 O" J6 K! G* c5 ?3 BCState ), z$ J4 L0 Y$ W7 A
其中Count表示所支持的C-state的个数
9 E, W7 y! y$ R: c" J' zCState: Package ( Register ,
# I9 p3 O4 V3 G0 ~) I! }! @Type ,0 O6 c( H2 {3 \4 [; G
Latency ,
, D4 |4 B6 d1 z8 qPower )
( V4 L& c- P( B7 C
; V9 K8 G  d! O2 ?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
8 L% ~# D8 ~7 w# ]- _$ ?& O$ J/ T/ y% [8 X8 ?9 O
Name(_CST, Package(). s" R) t' Q# q* Z+ P: r9 d9 Z2 H

1 C4 \: R. Z5 `8 H8 p{
' Y0 ?9 H+ G1 J& U4," v$ i* m# |& j* B
// There are four C-states defined here with three semantics
( s/ R$ g. \& c& ?& M
+ P1 X# @1 n7 M( J+ [
// The third and fourth C-states defined have the same C3 entry semantics' N/ L) ^  X6 G1 h
$ _, z1 @  N; s1 L+ g% a9 N' x
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},7 m) z. g( P! l
1,/ d0 l) x+ l* V3 n% |' C0 a
20, 1000},; E) t& q% R9 D; q! v8 }

! @6 P) W$ O$ c2 a) P5 ~Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
3 e6 I$ P3 |1 u2 x5 S40,
. o4 x; v. a) O& i  i. \750},
7 p& q5 {7 b0 H9 g/ N
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,' q/ z9 Q6 ^8 q8 d5 g
60,
2 `* c" Q( _$ E3 W  O: T500},
8 [8 \& L2 y/ H# g% I" I9 o/ w  Z4 G: v
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,9 |+ E! C& q& R5 k) \) ~! L9 d
250}
7 ^3 L: y: G7 x. o4 w

& Q' G" P% T1 G; g3 M  v}) * R9 n$ S* J  f

, W. ]: H/ l8 l1 ?l& E& {% n& R" J# A
_CSD/ G9 i$ V  v7 @  G9 c( ?2 |
: s' D& u2 O3 C, |5 L: ?" \
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
8 v# j" v: J: _, A* n8 ?  c. T: V0 D. N, O5 q
$ e+ j, o) F% {  A* _( d8 _. L! S

7 g3 X% E/ j+ w, {# y+ {. w8 z/ V% `2 i) ~( I
3. P_LVL VS FFH
' ]4 T: r! y( P$ z' ?' `4 ~' `, S5 d3 l6 I
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)4 {' N- X6 ^8 G8 ^% f. \
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所示:
+ Y7 g$ J. S* Z! M$ S  X+ ]& R0 D$ x; A# |6 A, p+ F) L5 h4 N
gas2.jpg

" E' \" [: g7 Z
2
' _& l+ O  i; {, A
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的一个例子:4 v$ j. T  a( C0 d8 ~9 \" M
Name(_CST, Package(). ?7 z$ E1 T2 H9 f

4 Y  R- K0 ~, B  E) U' b{
: o/ o/ h& H, x  D% }  K2,
# w- X8 ]. r) c* n0 d( z% s; r  K// There are four C-states defined here with three semantics

" k( ~5 |+ |7 V- R, C" G" J
( k% c! l; u; R  g  C// The third and fourth C-states defined have the same C3 entry semantics
" w4 L+ r& V$ ^* |& F5 P
; u/ r1 q  W2 h. R6 o
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},% Y. D# S6 K- g* k
0x01," d- F. w" }1 S7 K8 W
0x03, 0x000003e8},4 D4 i6 R2 `. \* j

, k5 _$ Q3 T! q  rPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
2 O; w  }+ u5 O, B  f* G+ n0x01,; L# t/ _, J# p8 Y- F1 x
0xf5, 0x0000015e}
. ~- U1 S4 [4 h
})
$ F5 g  D, v- g% W& c" c+ h8 y$ q& Z  x1 Y: K0 |1 N
. K$ K- I  [/ g% c% e3 e! R
REFF:
3 x  M" Z' E8 n/ \4 _1.
8 T8 l- M8 m- n. lACPI Spec 3.02 |/ O4 H, b! |9 q2 E6 ~7 L
2." l" e. h. U  o4 G* _
Intel Processor vendor-Specific ACPI) z1 T. N7 V, w& D( q

4 i( }3 j  e6 ?- t, m5 g) o" {: V0 S1 T+ F) X. e: f5 O$ \. C
That’s all!7 m8 _' D- E3 ^7 o. ~% {  {) e

- m, L! k* u# S! p0 U/ sPeter$ W" c# m0 j2 ~  d
% K9 l9 s) x( ]8 g
2010/9/201 ]6 @2 J$ k4 }5 ?; B
2 G* `% l7 O$ ]
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
! z$ I: ^0 r! l' Y1 q6 E
* L7 X7 b" g5 O9 e0 pCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST( j2 O- w) s" u8 P$ h
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。  z5 m% d0 V4 F4 t

% Q& h. e8 Z: Z- d- ~4 f! u# y2. P-state Control/ n5 h3 X# D& f1 Y
6 h  N: |3 F- g* J
1)
1 Y, P; j" `- L3 P& b7 B) PDetect & Enable P-state; n6 h2 M3 i) q: ]. s! b- n) J; ~. \

7 T$ w8 |( F% d' |BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state& y  I- \5 p% n1 x: u4 p. K
% \9 ?  \4 i5 z6 L/ k& r
2)7 q. M1 L- r( s
Supported P-states
- f3 ~+ ^4 F4 n# A9 E' m& l9 Y 1 b* j, E) y) R/ `6 |7 H0 Y
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; L0 C3 ?, k1 i5 |

1 A- M+ G) n7 I6 N0 ?MinRatio = PLATFORM_INFO! s* ]2 t3 A% t( x3 v
MaxRatio = PLATFORM_INFO
% i5 M4 @& }( dRatioStepSize = 0x01
8 k) d: \0 J' k3 `4 T  aNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
7 W5 B! s+ |* N- C. \* k8 k
& c6 C6 s) U* j$ h; e8 C' [If(NumStates > 0x10)
0 Y; N1 W4 s: H& w6 W{
7 T; Z- _% w, cRatioStepSize += 1
3 {) B: o6 e5 }5 D6 rNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1  D, A8 [1 [& |' `4 A0 d
}" L8 u+ s# L% T( j: O

9 P6 i$ [# u  U. e8 r3)
; ~+ L- v& D/ ], D. ZTurbo Mode# D6 ]% }0 F! m3 T+ t
+ p  K* U9 C- a9 _/ S+ z) I8 A
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+ ^: G4 z4 M9 e9 M, j
( |/ Q6 S* q) G5 @  C8 z5 e9 V
4)
3 x: l. E4 J8 H+ L5 L0 U" zOver Clock
; `$ A" }. J& B% P9 o) }# B
: ^$ k3 \1 |5 X. _  B' E" h某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。1 ~# y/ q4 T7 w' p2 Q! n/ I# p

. F; }+ _0 i! `0 I( P2 j; S5)- v% n0 n2 c8 A3 E9 E
ACPI Structure For P-state: H2 f4 |& W% f% K/ K5 b
# x3 ~4 [' _  G# x- G/ E% ?8 X8 X
l* }9 I  j& H/ ^6 K9 z. e$ m: K5 O
_OSC & _PDC
8 C8 H" F& N- [9 u ) j7 C- {3 J( q. p. n, t
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures" N2 r8 f! J. ~0 g: b& c5 M

6 F0 z6 O$ k2 S; k4 }1 r) {0 C* xl
0 e# h6 ]7 p/ ?# x+ D/ i' V! t
_PSS& t/ y8 u3 {% y# n0 g  o- U& v# l% t
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量. \6 Y" d9 Z$ r* `. W
并且通过一个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做比较& F9 K2 L2 R/ R  k. l* ]
以确定P-state切换是否已经完成。
6 k# k5 j  |6 R% k8 T3 @ # u9 g* T% ~* A5 K/ j- ?* b
Name (_PSS, Package()
3 n2 g/ |% p6 l& B/ g{
# Q$ q5 D8 c) w  Q" v// Field Name7 i  T7 c. U2 r$ k! n8 s; u7 k& n
Field Type
& L3 e* d1 ?# G) X# p
+ }% D& T' q4 z3 u6 T8 Q1 ?
, I  s3 F9 n( k: o8 E% s% c: E: f. `0 M; v! a
Package ()
* }. q% m& o4 T6 B// Performance State 0 Definition – P0 . `& }$ ]$ }# b. ~) I. P

; `" o* j1 A8 k+ Y: s{
$ F5 d' I. F. S8 l( i) _
% E/ o! ^3 U" o" ]3 ~$ |8 M# j0 U' U7 R. Q2 R6 ~
CoreFreq,
9 f) J9 u  N! |5 R7 x) T// DWordConst 0 s7 g6 |8 ^6 e$ u4 W
' i  J% @4 h" a
. b% k+ d: c& k+ q
Power,8 A$ N  y# I2 M' ~
// DWordConst
7 b) |6 h/ A- L
. p, f; P" H) o6 L! n  f& e  OTransitionLatency,
7 @/ a4 q6 }0 B1 n7 a4 \; l" u' _// DWordConst ) z9 J+ X: M* \$ @9 P  K
* {$ [3 s  F, a( s0 m! V6 g! h
BusMasterLatency,. R& ?9 f- |, F5 a  p8 W5 Y
// DWordConst
3 X' W& t: u, N% n% P- b8 f; B- q) s5 M# @
Control,3 A; ^/ c3 T7 e6 q
// DWordConst
) K! L; F3 o4 C/ A- Z. q
' Q) t. M* I: rStatus4 N! l& E2 c' T: [0 r

5 }$ o: y* M) A) c3 S7 v; V$ w0 z) n* ~// DWordConst 0 h) x9 L+ a2 Z& e4 P+ t% s3 H

8 {( ^2 }$ X9 F3 u}, 0 I4 x& O* t+ t+ f6 S- U% q

' n- K* O3 n: u  o/ i  G2 {, o. & f! W. `' P6 T# a& ^

% W5 E. k% e" a5 H* M9 M$ V! W1 q.
! I5 p* _- {" ^. I3 n" h
' r8 i3 ~- g& u& A3 h0 r. q1 l.
% X1 w( F' p/ B6 N3 y" |8 A' S}) // End of _PSS object
) P  j+ p3 e& ^- J) q6 V- [9 M前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
: Y1 b7 N+ b: d% K* h! d9 Y( _
; U  K1 G0 N( Q! s7 `. _1 _$ t9 EName (_PSS, Package()
/ `: S, G7 a+ w, {" K  r/ @
: b8 E' _( q4 c- d# W3 P{ * w5 C7 d4 v9 X$ v3 n' y- ]7 Y
" n! ^8 A& E. C% p- z/ T
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
! F6 \8 N/ W) t+ y3 X% ]9 a3 A7 |  c2 f
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) 1 @! A2 n) h' b3 b
; z* a1 ^% _1 |3 m
Package(){1400, 8200," M5 H1 \( n4 D- t
10, 10, 0x000E, 0x000E}
& g$ N% \* R# ^$ v" O// Performance State two (P2)" r- ~% q" M1 y' [1 K
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 0 A4 r8 _* ?, }+ e; B
Performance State one (P3) ( v) ?" P* R5 O' O; d$ L! d: X+ }, ]
+ o) r$ W) s3 N: U! D- H0 C: ?) [  `
Package(){1200, 8200,+ A8 z+ r* M, d1 v4 W
10, 10, 0x000C, 0x000C}
) g5 I. |4 r+ y5 j  ^3 A1 i// Performance State two (P4)$ A- Z" ?7 M( _' w

$ z* T  i. ]5 t/ ]- C- }9 k7 D}) // End of _PSS object' j2 L% t- ?$ l! O. K& h, c

5 Y: H' g! ~! X- B* v9 B另外当该平台支持Turbo Mode P0将会reportTurbo Mode
" b0 z  `6 X. c% U& o - k3 i) `2 f1 T3 I
l
! l* ^& _! v& O" {- W/ J/ p3 d% ^$ Y
_PCT& R" H& H( H9 K3 q1 A" t7 Y+ t2 B

* f# P7 {: c% }6 ?2 _/ k& Z1 B. kPerformance Control用于将P-state MSR interface ReportOSPMOSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample codeOSPM透过_PCT得知是native mode,当系统切换P-state,它应该就会通过MSR IA32_PERF_CTRLIA32_PERF_STATUS的方式来进行。0 p8 a5 l1 _: N5 \

1 G% f5 c+ P! B( MName(_PCT, Package ()! o  m5 ?+ ]& x+ W
// Performance Control object
: z1 q: v6 {$ s5 ~$ T' k( d, ]8 D& h) J3 v$ `% Q. e
{
8 }% F; d7 g6 u! M" f
4 X/ g# Z: n( g( F7 g( D8 Y! l0 ZResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
5 F6 a5 T( c' g* h9 R// PERF_CTRL 9 J& q. v. I- ~( n9 W% l7 |
% \( x( ^# P1 z. Z8 \8 f# i! `) u
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
8 h+ J9 P4 t  l, ?3 L// PERF_STATUS 2 v2 o: E8 N: }4 K
# b: m# U& x% [$ u2 h1 U; n
}) // End of _PCT object" _* j$ Y% I; F1 o
0 r  g3 |; _9 z& S' c
l& ^. z5 W" b7 d) L, O& x  r+ h
_PPC
9 M1 ?8 P7 f0 F, ~ 6 r% D! D! O9 k6 z% \' T) f
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  }' [# C* g+ R, U
( Q7 _* c4 K% }+ ~+ W
Method (_PPC, 0)
; u7 y$ ?+ b! \// Performance Present Capabilities method ) M% E' T0 ?; y/ ~9 Q! M8 x  t

3 J. f) |$ {" s/ P4 G' ?; ?{ 1 R2 U2 y6 W8 F7 p' r

! K( {6 }. }  s; o4 |- R' nIf (\_SB.DOCK) 5 |$ i$ b4 h) _
9 r% a9 }+ h" N: q5 c
{ ( V% R# d3 M& }

! T7 X) c' z  ]* v0 g: w' s) JReturn(0) // All _PSS states available
. G- J4 \% x5 I, {$ U5 |+ |( H; ]
1 V1 X* k  o3 K9 ~  b+ x3 @8 p1 K$ X+ k) P& `! Q+ v# |
} ) ~8 G. ~. Y5 m# P; F# K
. u/ @4 b0 C- D2 A' b; J- K
If (\_SB.AC)
$ q: J+ V/ ~' o1 s3 A! ?, c  n- C/ V" t  `8 p  [# U  c
{
6 B. F# \: {) A4 u( S* i. l7 L; G; Q3 P9 @# W$ K
Return(1)) {4 W7 r! K5 A$ Y* ?1 E
// States 1 and 2 available 6 |  ]+ ^- t9 s! h) N- k1 U, |
% t: N4 O4 d1 G$ P
}
9 v2 w1 m' K3 [' m3 t1 @
, d; ?2 C6 g0 u' z- u6 X: rElse + N9 q) L7 n4 n! H; K$ f
$ A' y: l8 ~7 H4 Z5 T
{
/ ~4 A/ R1 f! z( L0 F
" {) E* H( a. ]Return(2)0 U8 V5 q9 k- \% z+ w- e
// State 2 available, e- G$ A0 u! U  B/ ~4 G

5 ]3 Z+ }% |, z; n8 ]  j}
4 f3 z: F/ O2 W! i, k, O& A2 Q* R+ o* M1 y# l. X  x- i: h9 p
} // End of _PPC method% l4 P1 ~9 `$ F7 `  T/ }2 D; Z; c4 `

+ b& u0 x1 ^) n" {l6 X- p. R. t8 G8 [' r
_PSD/ z( X3 `: [. P, L8 t
6 g' |6 W2 Q1 t( j& ~' N
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。9 _+ ?+ X. o8 T1 j9 V& n: o
% O* C" ?/ X0 P4 ^
REFF:
% Z" ?* m4 M) A4 e' E- Y8 r1.
: @* G3 C5 J8 F0 I4 H" B7 z0 }ACPI Spec 3.0/ O. l+ m& w) F( j% }/ C) L/ y
2.
" ~) f) ]# B* {0 Z. OIntel Processor vendor-Specific ACPI# e( @& d' {  H) h$ y4 T3 h

) Y9 V9 s9 T9 w! n
: U  ^- C0 q& Z* U1 YThat’s all!5 @: u' V9 o$ Z4 Y* `$ `! E4 B
- n' s+ t8 V  I4 a+ ^1 o
Peter
8 C9 }0 K: S2 v
! N- g9 a0 F9 r5 {2 {& j' o# X+ x2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
0 E5 e( K7 c" n+ C* l! T
4 N9 l# \: ?1 DCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
3 T/ H( j) r( U6 w9 h) m% p,影响系统的功耗和温度。. Z. c6 ~, _( J3 t

, z, p/ K1 p" I2 s2. T-state Control* Y9 _* A1 `! N! H5 C7 _  g
% I1 k0 E: P6 J$ b6 J/ ^
1)# j& P, ^8 \% f
MSR Based Control1 j* I: X1 N3 \3 x. N# m

8 z0 N# L* W3 GBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 2 G- n. }) I  p% Y+ C8 C
. W9 Q4 a& R& A
2)' A- g2 U2 h: C7 z
I/O Based Control  [8 H" d5 U! }2 j

0 G$ T" R- r+ [除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。. q9 D6 [$ u8 p7 o2 S( V3 F

! Y# {  E( ?8 W2 z) n5 w) z: J6 @( L3 z# q3)
# Q; }- V) v2 m# TACPI Structure For P-state
& v  ]& F6 N  e3 `l
/ t7 L- d" j, e' b! a4 D7 j
_PTC. Q5 b( ^( g7 D/ X# Y  Z

- W1 t4 p  K# u6 s- t- [Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
" a1 N9 G0 a+ ^) _* N- a9 w ) R; z! H4 L" Z
Name (_PTC, Package() ; _& P& M% [- G3 O
{ . U2 A4 K! J7 M8 _* y

. g/ k7 e3 C# ?! d6 t+ E  e0 B2 @4 K6 V0 qResourceTemplate(){Throttling_Control_Register},: |6 ?. D, }1 R% y5 Q
//Generic Register Descriptor - p- [" [" n0 J. j9 H) i
. H& b4 n) E6 G2 P' u) c6 u
ResourceTemplate(){Throttling_Status_Register}
* o8 V! n2 k' ?/ l: G//Generic Register Descriptor # u: P9 w7 v# M, n
}) // End of _PTC" l2 r; U0 v# |* I! }6 B
! b& i) T3 v" ]5 k- F7 X% g2 c
下述是一个sample code( P* w' ^2 q  ^) s9 r! u7 v5 G
0 R  R% P8 r0 Y' m

/ `. u* [" V8 k
//4 A0 g/ r% ?9 N5 y% f5 g& }5 y

4 ~- I+ ~5 j- \6 M// T-State Control/Status interface  }+ a/ y6 L( m  `
$ y3 O4 N+ U% H
//" e+ O7 P0 m) t

( ~3 _7 s$ @2 s) |5 J2 mMethod(_PTC, 0)
1 U  e( [. S5 h( n7 n
/ ]' y( j4 C! r! e4 S  H$ g+ v{
1 H* _: a0 x( Y9 o* L$ ~
/ J7 L6 o" k2 D//
$ ?  ]7 v9 J( N3 I8 ~4 k7 l3 b' d3 S) S1 p8 v; u+ o
// IF OSPM is capable of direct access to MSR( X9 n( M6 E* g6 P+ H) C- L" c
1 l6 {1 G) l9 }* b. B) e9 }: b
//
% Q. _* \# I* f+ f* O8 I5 }Report MSR interface
# v% W; Y) ?3 h1 ]7 N
7 _* U6 Z! S* l( D1 |: G// ELSE2 `6 l0 t8 \; R! h. g
6 `, e/ u5 ]" S# M1 A3 y
//4 a7 S, U' [5 O
Report I/O interface. h* C& z6 x" ^5 B4 e! W$ ~

8 h  |! f, A4 \: m5 h2 S//  E7 d7 }% r- ]5 `3 O. R, a, n

* U+ r# `# Z  u; U& F//4 f4 D, N, B% b
PDCx[2] = OSPM is capable of direct access to On$ V( z7 _: n  f! j( V' K, T7 V

8 z# X4 A, O2 j6 w//
8 U. |2 R+ d0 a5 ~: x6 l# |Demand throttling MSR
: i5 o. H, J7 D1 u
' D# `" H3 s0 ]//: E. M+ C  h! w+ Z8 c( K
: P: N9 g5 z& K0 I! j! O% W
If(And(PDC0, 0x0004)) {
( F3 r8 u" U; B7 I, U( ~4 `
# ^2 X9 ?1 ?/ Y' c" I- [4 }4 QReturn(Package() {
$ ^; V& j6 c0 ^, m* b- ?3 P& y) R8 C& C8 ]5 A
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},0 ~8 t/ R2 Z. u* k. E

$ F1 N9 P  o. a: AResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
$ a6 B$ k$ |$ |3 B, n" \
$ K5 ?% W7 D2 k7 y3 {9 o4 I% u})
" X$ V# `1 [' u- U
1 k7 G4 Z# A, p6 u  D/ `}' n6 x+ U1 I6 f

2 ~$ W& `- c* i7 u8 g& x3 k, |; h$ q9 AReturn(Package() {
2 ?5 s: S: S! m# i4 M- A; J# W2 q* K! ~9 b$ {# I4 z1 d: u$ M* c: b
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
2 `2 [6 W! D6 }* H* @2 M9 h
, `6 j; g/ Z3 F: p. i' u- uResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}. [' v" v$ u3 J

. @( R+ M% w4 o" K0 E$ l+ S4 f})
. @, z3 u  b& H: J( u2 q$ c$ q  K) ~% `7 R  I. `+ a4 r
}
; _0 U, _6 e7 E7 R0 K- a7 R
, N3 g( V' z" Y  }7 t$ n) |
! z& f' B; z& v, T2 Z& @: t, }: P$ o& U
l
3 _. _! D; ^3 }3 J9 W, j; N7 R8 e% f0 }
_TSS# u* u# S# V+ H4 R$ A8 U- s
" \3 P2 R" m7 ?/ l# k; U, \) }
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
& k( ^7 j; G4 ^  n9 B: u0 ^% ZName (_TSS, Package() & I9 c% F, h" J% B" \% J& G; B
{& U6 D% z0 ^( B  [( {/ ?4 P
// Field Name2 q: u" J7 C% `' j
Field Type + k/ d1 [" |8 N+ F: u9 V  S

" m! H  j9 W2 p7 J9 K
3 f7 V: ?* {2 R4 H+ ?# O8 F1 x3 A
. T: C' u( C# V2 `Package ()
' E; N$ `  k# s4 y1 `7 l// Throttle State 0 Definition – T0 3 A8 H- z- w( E. H) F
8 L" l5 j( ?! V4 u" D9 `/ `
{
3 B" u" b5 n8 T% N1 q
+ Z* }2 Q/ g' W2 X
5 w5 E6 a: f# |: o7 R6 ?. zFreqPercentageOfMaximum,
0 l  B7 K( r1 H9 K! L// DWordConst
( B; e0 f, A' G' V1 m- U( q( v9 i& b; N
Power,
% x. Z+ l1 Z+ Y4 p1 f// DWordConst ! N- b$ Q1 [- P$ n. @3 ]

: T6 N" @" v4 m* j" ZTransitionLatency,* e# l) _9 q2 R8 j' i" E3 w, }9 |
// DWordConst
0 J. ^4 K# {4 k# H, E' i6 R" S8 u! e3 R' `6 _! ~
Control,8 L# v& a# Y. K: \
// DWordConst 8 O9 \, `8 R* f7 ~7 c
. x- d5 h) G3 Y8 M2 \9 P1 P
Status# D  q, t1 z& o2 J2 L/ g: Q
// DWordConst
& ?3 p0 z& k7 W. a1 [},
; c6 U( o/ d# Y0 u3 g: ], j0 \……6 n- I  Y1 G" O( @. h9 S; E# s
}8 l! b+ @# B, q! K& _7 l
! H9 G5 [! e* ^" }( v! z: P0 g
Example code 如下所示:
. l! M* ^) U4 L! j- ?
& p5 p: h& e6 s& q$ s% [7 A& n6 nMethod(_TSS, 0)
7 @0 \# m5 d  a) ]; m/ v" Y3 N
( I! c# H4 O2 t) p8 x{0 B$ E& G5 S; R; w
. }9 b% t+ I" h1 G* F9 `
Package(){100, 1000, 0, 0x00, 0},- P! R# ~0 k: r, h6 D% g  T

. m# C% ]6 T  s5 [; UPackage(){ 88,
$ }$ E, \3 k0 f3 L875, 0, 0x1E, 0},/ f/ {6 W- W; T9 n6 t- A

/ j/ o0 W& L0 p$ E* U, x2 H6 G5 gPackage(){ 75,# c# C' q# _1 R# G- l/ v* D8 v
750, 0, 0x1C, 0},( m5 r# q. ?. [1 T* N) n

1 v) R+ S; ]6 rPackage(){ 63,* K: I  X8 E, g* `: `1 R& E6 |7 G1 ~
625, 0, 0x1A, 0},
( W. Q1 @# G( ?* d; l( R1 H
, L' V4 Q# [; bPackage(){ 50,  G; Y9 C7 R/ r( m
500, 0, 0x18, 0},$ {8 p$ H4 ^+ k9 [& U( T! V: Q
& H7 `& D/ U1 \% p4 z* W$ S' m2 @& D
Package(){ 38,2 Z+ Z. _' ^! a; ^& h
375, 0, 0x16, 0},
- L) `( a7 C9 {5 C9 T: A0 y
# ?+ F# \% O5 k( Y9 R) N) Z6 nPackage(){ 25,
; o& B& y* x" e250, 0, 0x14, 0},
( N0 J9 e2 X' O) ~+ Y
- e2 W/ T. e7 NPackage(){ 13,
  S, |  ]4 d# c& p/ }9 S% n125, 0, 0x12, 0}
. L/ j& R3 i) c. e: r7 Q
( ^1 s+ }& P) w4 C+ }6 d  T4 ]9 m$ k) z}" F4 m: r* R1 C: V' d

, `- p9 j- g  u3 F  }2 E
# `$ n/ Y" i5 ?# q* Zl9 g) S  f7 t: G; D
_TPC
; y8 F  a# v1 A$ l: x- B5 j + j, A- u( h2 f! J& r
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC0 V  s) q. J$ c. h

0 _6 Z7 F# u3 t2 D; Cl
# Z) D: c, l# ^; p3 ~/ v' E% e+ B
_TSD& F! E( g$ t, h/ i" N+ ~
) u7 x+ q. s! J2 L* x3 N
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
) E4 Q* R" u' r3 p$ B. e& a, l
5 L: `& G: l  g- Y; v3 R. T/ b" T6 TName (_TSD, Package() + l2 _$ q& E3 T
% V& g: x. _7 M/ w+ f0 y) s6 a
{
+ N0 \- {0 H' j/ `
& Z, k, E" [) i6 UPackage(){5, 0, 0, 0xFD, 2}/ Y# p8 A! m" R* i8 J* v/ I
// 5 entries, Revision 0, Domain 0, OSPM   U- T" V; W& _; e% j" N9 y7 J7 H
Coordinate, 2 Procs
2 s2 B! Q4 {" T5 Q% x
: x+ S; v$ e/ G8 {% P8 I( i
" }! c5 c6 N+ Y. W- F- ]: a}) // End of _TSD object
3 I' a0 |) u, j3 d* f+ E% H1 o/ X) i ( y8 s4 h4 \( |$ g- T- k5 v+ T* B
REFF:! H' U( N. T, t$ E
1." F$ j# F% W; H0 ~0 H
ACPI Spec 3.0
8 J. A# l0 K2 ^3 W5 t2., K* ~/ j: Q* J& n  w7 Q1 ~8 U
Intel Processor vendor-Specific ACPI
; g1 j2 {8 }, Z: \* d* U  Q 7 i" ]" y3 J. e1 H8 r  p7 T( k/ f- J5 z
) E! T% i, N  y; C
That’s all!- n4 k. T0 [; \: t+ r
3 T2 _" L% L  v0 r. \$ L
Peter. D. v3 J! U. d7 {+ U

4 z2 D! @' C5 j& L$ H5 K- A* Q2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 14:24 , Processed in 0.083531 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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