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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
+ D: ~1 C8 n) y" T! P1 U
1. Overview
; C8 Z$ H) l4 C/ g) T, D4 f# G9 r5 ]& g9 @9 D9 X' A
* L$ E) A- U, _. P& P
C-state是ACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
8 t; l  q4 X7 D3 H$ ~0 g! V3 f降低功耗,图1是C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory request,OS就不会进入C3以及之后的state。从信号上来看
4 `  ^" c5 c  d2 f' ]. K6 o比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。1 H/ R+ o2 y( B/ |: g

! d* [8 e8 Q9 W. b
cstate1.jpg

' W% X! L' ]: p. j3 Z
图 1
" y8 c" p6 H8 X+ W
2. C-state Control0 Q% }. e% }) V

0 `% C6 y% o0 `6 b! k, ]! C1)/ ?& ]( D$ E! p
Detect & Enable C-state
0 k! H. V7 o4 \' F$ d$ I$ s4 \
. B4 `$ t: V/ r5 }4 d1 NBIOS可以通过CPUID function 5 check CPU是否支持C-state,以及支持哪些C-state(C1 C1E C3 C6 C7),支持的最大的C-state也可以通过MSR去设定,默认情况下增强型C-state以及IO MWAIT Redirection是不支持的,BIOS要根据系统的需求决定是否开启支持该功能的register,对于多核的系统就需要对每颗核都要单独去配置它的C-state的支持。
. B- J$ O9 _. t* _2 k/ g' }  ?  s. q4 r' Q& T& k& @) d/ @7 q
2)# q# M+ P- \& ^. N, o* q. P
C-state Basic Configuration9 B8 |* l- \$ u5 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-state。b.当MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的support的code)。  T1 Y. Z1 `; f# m
5 S% z6 X# e- i1 \* X, U( T, P9 l3 s8 P
3)! o: Y" M$ N& a, S4 n! e
ACPI Structure For C-state0 b% `# U0 h5 j+ f( b4 I

. f6 u/ P, N2 a# p  u! rl
9 J  Q4 i; C3 B% v2 u  F
_OSC & _PDC2 }9 A6 ^6 x, c, w
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures。
- n) [" v/ E/ G* j5 z0 _8 x% X& x0 Tl
5 M3 ~8 N6 Q, g+ r' v/ ?8 I
_CST+ y9 a% f+ A! N3 `
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
; Z- C6 n6 O/ p, P. {* _1 PCSTPackage : Package ( Count ,& R8 e' ]/ d! G  C; ^' j
CState ,…,
, j1 S) n+ a8 H% Z4 Q# K! l# QCState )7 G; ]8 a7 W( _& W6 C; R- `
其中Count表示所支持的C-state的个数  ?( U+ Z- M$ a. E" ?$ h
CState: Package ( Register ,
' I/ u6 I9 L2 i3 @7 LType ,7 n, M: n% _  R8 q  q* W& Z8 H& z
Latency ,
+ t  Y& a' P0 _Power )
6 r$ {8 K( _3 H. ~# U- g) X5 e+ ?+ J( g$ v
Register表示OSPM调整C-state的方式,Type表示C State的类型(1=C1, 2=C2, 3=C3)。Latency表示进入该C-state的最大的延迟, Power表示在该C-state时的功耗(单位是毫瓦)。下述是一个sample code,注释部分已经讲的很明白了CPU0支持4个C-state,其中C1使用FFixedHW的方式访问,其它3个C-state都是通过P_LVL方式切入,第三和第四个Cstate都被映射到ACPI C3。4 x8 H$ i: z6 a+ p/ {6 X" S. E& q& @' p

0 `4 g7 H! y" C! K- @. p" T- {Name(_CST, Package()
9 `* W" x1 q, k& Y' n9 I

  ^# e2 |! G4 b' d( ~8 z+ n( L{
) q6 J  ~4 w! @6 C4,5 j1 F) K% a  x0 e6 p
// There are four C-states defined here with three semantics
, a7 }2 i0 C& R5 P( Z1 R
( z; O- E3 Z& h# E' B' \6 m( I
// The third and fourth C-states defined have the same C3 entry semantics
8 ?% [1 N. k" c7 |6 @( G
# D9 J+ B( n6 k) v' A9 B5 C
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},  ?8 H/ L$ n8 d/ }, m
1,5 {4 p; y+ o- u5 W1 J% s* _$ G
20, 1000},7 W$ z/ ?$ v4 Y. w$ z

6 C& v2 ?) t3 f& TPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
  t* b; j1 i) h4 @  T: A+ }40,4 q8 M0 r- `0 V/ l8 \* }
750},
' R2 t2 O! E1 h+ n' A, D
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
* `) l' k9 X; g3 L- f  i# \& h60,
% H' T% D3 U7 P3 o6 Q; P, g500},
0 n# s: b7 k! B0 l4 W4 Q  s7 q  y
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
" k1 G6 V( d8 I2 P8 M* _8 @# N250}4 t5 s& D$ j: X+ s3 q* M

" U" f/ {" E! N6 M; l: G  d}) 8 Z1 k8 q$ W. M! P( B. F
3 X5 B8 w4 O5 a' r. g
l6 K# e4 @. L8 L1 I9 h+ N( E
_CSD8 n5 T9 h3 R/ w: m, e) p

, T! L7 v" ?& M2 }  c; r! B8 UC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
# A2 L+ F/ K% j9 Y6 q8 \) C9 c9 a. O2 _1 g+ G2 ]* z& R. t

1 \, z1 o% H' Q' Z$ s0 [- {9 ~: p/ i

- l/ k0 C+ w: v( u, A3. P_LVL VS FFH
0 k; x% t/ |. _9 d* \
/ o1 u) N# W) z+ S+ Y. c; yP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 的power state(C2)。9 g: n3 @, U0 R* i& U+ v
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所示:. S( V  |9 }9 u# S

" H; y' ]9 E" }# N  i% w/ p
gas2.jpg
( K% K3 I/ H" e6 U# Q
图 2
7 H6 t2 l! q/ y4 b; h# m  J
OSPM解析到该_CST structure的ID是0x7F,在切换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的一个例子:  Y% a/ I4 m( k$ i1 U1 g, }  n/ \
Name(_CST, Package()3 F7 q7 r' f( y! }7 J; r+ F
* ]0 U% N# P# \5 T& d5 K8 u# K+ m/ n
{ 5 b) K" J& y& I; `; V: j* j
2,
. l9 K8 ~( y0 ]! m/ N// There are four C-states defined here with three semantics
9 H' U: r* R. ^: E

1 X8 }' b) m4 Z3 G- X4 ?; _' U// The third and fourth C-states defined have the same C3 entry semantics
: n& |3 b3 }4 O0 B5 W
4 Q3 x9 Z7 D. Y7 \5 {
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},+ F3 B2 e! {; O' C: h! f3 W
0x01,$ `0 f3 y  F0 y' v8 E* J
0x03, 0x000003e8},1 e+ Q6 n, l6 Q- V4 d
- s9 z% Y: i* f3 N* c
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
" y7 N* ]% Z: ?+ q* P! [4 N0x01,  ^" ]) O3 O2 m7 v3 [! U
0xf5, 0x0000015e}
" G& Z3 F7 ?6 K, k/ d3 I+ }
}) $ k* i( `, Z% U3 ]' J# U

' N  \8 A& S' x7 I0 m
+ w0 T( X( t' u3 V8 [REFF:& U3 `* W- I. g5 U" x3 c7 D1 z5 l
1.
: s1 K9 C7 z9 z* V& @1 E& KACPI Spec 3.0
  J* `% z% i# e1 W2.
! a# Y2 M. v* zIntel Processor vendor-Specific ACPI) [# ^: z. x  `& M+ u
6 [8 c+ J. L3 P, I* K* @+ G
7 q/ v( m* D& r- J5 V( j
That’s all!9 m! \- p5 F1 T2 T
3 }6 `4 a: m6 @: P; L
Peter
& ~1 B" s/ m1 {* D; G8 z, Q( n2 _6 @  y' `! }4 _1 r
2010/9/204 n1 S' t7 w1 Z- o: C  V

. z3 b1 u7 o5 c" @4 `! n0 D[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview( |( @4 I% M$ h9 D0 {' N

' z5 o6 o! l0 i0 U; l3 v% @CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST  Q; S* b: b& `+ x  f7 Z7 h& [$ S$ v
(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。# F2 C, I! x( q. p- h/ C3 I9 n4 d

- y, v& d0 O- C8 O+ s( r2. P-state Control) ?  q4 @) g7 m, o+ C9 r* g) d/ S

2 L# I. [$ n" W: s! J/ ]! R5 \5 D. N1)) v! d. ^) }# @, A. [3 l
Detect & Enable P-state. @( g* t: G3 a. J

7 z3 X# R" U* Y8 r8 K: R+ X: iBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。
# H- j+ J* R! ]% V# f % Y! o# A( V$ g% d6 ?4 @
2)
( F0 [3 J! o7 h9 l( z) B( N9 ]Supported P-states1 E6 s% p% k+ S2 p8 x: p
2 l, G) Q' a/ _" B, `2 p
当BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) 、MaxRatio、RatioStepSize、NumStates,所有这些信息都可以通过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。
/ u8 w5 E3 W3 S# Y8 _2 K ( }$ n% G6 I8 W
MinRatio = PLATFORM_INFO. F1 N& ]# g+ g( m# s  G
MaxRatio = PLATFORM_INFO
+ F, q$ }3 k; H8 s+ i5 DRatioStepSize = 0x01
$ s! v/ B' c. t  Z0 DNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
3 N$ I8 `0 l: J5 e( c$ Q
' C! c2 {  t- LIf(NumStates > 0x10)  b; L3 F* h' l' Q& I2 s/ Y
{  [- g1 }4 i9 a
RatioStepSize += 1
9 a4 t: D' G: L; q9 s! uNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
8 c2 S: `: k, V- K}) c( G. x3 J2 h) {+ s: G7 i
# ?: c& b) ?, |+ P( G6 X. S" b9 A
3), r- r! F* W; W" K4 E
Turbo Mode
1 M* d- L! z$ q
1 v$ k( [7 x9 m+ z+ u. D$ [9 X+ kTurbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermal、current、power的信息从而根据这些信息动态的增大CPU以及IGPU的frequency。CPU可以工作在[Max Non-Turbo,Max Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 report给OSPM,另外Turbo Mode的Ratio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermal、current、power的门限值,BIOS可以通过设置这些参数影响Turbo Mode的Performance。9 f. l1 C/ n9 J0 T' T
7 M* ]  a1 c6 }) H' X( O8 r1 X5 T
4)( e% `! Z  h' b
Over Clock
# y- c6 X0 s" r0 z& D+ g3 K2 [ ' i9 c  \4 T9 }+ V7 y6 G
某些Stepping的CPU具有Over Clock的功能,BIOS Detect并Enable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OC的CPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
9 t9 B3 H% d5 V# V* ?
* G6 o% e2 I" D5 F5 `. i1 R5)
5 L7 [2 {. g( r, ]* j7 T: B* EACPI Structure For P-state
" _, Q2 V& d/ L! } 3 k% b$ ?' t# j: P- l% Y7 j
l
6 b( _: M5 [( Q7 \
_OSC & _PDC, L9 F( L# O( \- P
7 _& W9 v3 ?3 u4 ~. q5 _, H8 s* }
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。7 j$ m, _2 p# [
6 L  |) J. G" p1 V' c" t
l
2 w  s9 F) Y" g" t! M! u
_PSS
9 O" o  H( Z5 s. }Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
8 q0 `0 R# @9 f! g0 G3 W! u并且通过一个packaged list的形式回报出该P-State的internal CPU core frequency、typical power dissipation、control register values、status register values。第0个package表示该平台所支持的最高的P-state,第n个package表示最低的P-state。Packaged lists的格式如下所示,其中需要说明的是关于Control和Status这两个参数,其中Control表示要写到 MSR IA32_PERF_CTRL中的值,Status用于当OSPM通过WRMSR 写完IA32_PERF_CTR之后再读取IA32_PERF_STATUS中的值并和Status做比较
# P: x# K3 t' D3 e8 K; a' C* h" P$ u+ \5 H以确定P-state切换是否已经完成。
3 T+ D; K% U" R; w% C, u, x 3 g3 J3 h7 H) P
Name (_PSS, Package()
" X# q( Q: g1 G{
) E8 r; U1 o4 n# a- z// Field Name
& y* O3 ]4 t: }4 k% H/ sField Type
8 @' `4 E) i0 P0 X$ c2 S
) O5 t9 o  D& Y- w( D+ ?
2 i$ }3 Z) ?5 F- X$ |" Z' {& Q2 [8 t) m! Z7 Y
Package ()
3 L$ R/ ?+ @; o9 [8 P// Performance State 0 Definition – P0 ; ?, b1 B$ t; F  j" ]' f' V
1 v1 [4 Z" l. S- @
{
7 s6 k8 h$ X- f2 o9 M# k( u
# N1 O, P# y- e( T- z/ }* e$ I9 a. l0 i+ |" M
CoreFreq,  ^/ r9 G+ r. V* j2 N) ~# P& a
// DWordConst % e3 ^- l9 r, @7 I6 R9 m4 R4 W/ s  x6 v

9 E6 a% d; k- g  T/ N2 E2 R2 c
0 F  S" F, P! r. ?& X+ {Power,& [! H* `7 r. b  j: Q) ?, B
// DWordConst . E6 S% B7 U! o6 t% @

, u- j# K5 y5 `6 rTransitionLatency,6 b. \5 l) y: Q5 \! w1 U% V6 j
// DWordConst . |+ i1 M2 l! Y
- W; p7 y, s- u8 [8 c' N
BusMasterLatency,
) U; g6 b0 Y1 K( R" w// DWordConst
  J" A4 D0 [1 @) ]% s3 P6 _7 T6 o
Control,# o  \" @2 }5 D$ ~# f- p
// DWordConst ' i9 E1 `+ t+ s

2 _$ b" \) W. N! RStatus3 Q. R" V8 M. W9 O& l) Q, [$ B' i7 S

( f* {( c  v0 W/ Y: w// DWordConst 5 a; k5 _. r9 x) s
$ H& _* a& a- L
},
5 A, h9 B) j, L7 y% z% B+ N/ \& o7 c& c: }
. 8 A( Z7 k9 v* p& k9 L$ f; ^8 ]% W  n
6 K8 t4 ~. t7 H& U" B2 a; M
. & f; M; s* r% g$ j
+ r) y2 t4 S- g
. * @7 E6 v1 R/ @# t9 }: |
}) // End of _PSS object
$ B, X% d' Q6 K: j前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。 4 w  d; ?1 Q' N
4 k8 H0 L3 O0 f1 x$ ?' n
Name (_PSS, Package()
/ x4 i, |' v) n- i7 ]
: ~3 e# p6 x/ ^2 O' b3 B2 l: z{ . }/ E& E0 U( ]. _

% Y8 p& O$ V3 w5 u/ U- F- n- gPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
9 L+ b* G! P, E2 S" [9 \
: k) Z  I, \+ y% LPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) : u- O; t6 q3 c: y
# B/ k) n* j- r( q5 G
Package(){1400, 8200,7 n6 U+ m; z4 n3 }3 S5 h& ~
10, 10, 0x000E, 0x000E}+ [  S3 N& ~- F8 A( I8 ~$ s6 n5 O; _
// Performance State two (P2)
3 a0 O; p2 I, {2 j- [Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 8 s$ H6 F( S3 R" l; r0 u
Performance State one (P3) ) ?9 S! C" U/ U3 X
% J# W6 D! s+ t8 I: M
Package(){1200, 8200,8 d) s3 `- }: W9 L6 o
10, 10, 0x000C, 0x000C}, P; }$ X' V6 M; `/ p$ n
// Performance State two (P4)
. N: ~# b) K9 F' G. w, c
( {- ]* Y: Q* O9 [}) // End of _PSS object
. z* f% P5 C1 W. S2 Z- A( P 2 Z) X: n  y' w' a0 s5 z& ?
另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。; C( j) c/ X% d
( l% t  A/ [- Y  E& `" }$ G) }7 A
l, J' d0 ^4 c3 S) C7 K8 {/ M; r
_PCT
1 g) T0 A" v& t: ]/ X- ^& u 3 q7 l, K, G/ v2 f7 s+ c1 D
Performance Control用于将P-state MSR interface Report给OSPM,OSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample code,OSPM透过_PCT得知是native mode,当系统切换P-state时,它应该就会通过MSR IA32_PERF_CTRL和IA32_PERF_STATUS的方式来进行。5 {, W0 n( j0 F+ @3 O
8 }1 H2 s' u$ T' P4 M# ^* D9 Y
Name(_PCT, Package ()! _; w1 F1 \0 S+ W3 F0 Z! w( {
// Performance Control object
2 u1 g: Q- S( \" M
5 X0 V, d3 o" o4 y{   }& V. P, E; o2 q" m

; m/ J' y0 x: @* V' v# p6 dResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# ]6 F/ ?2 p. ?! T/ b// PERF_CTRL
) n3 ?4 R; r+ L$ c0 t* e8 |" D% ]/ Y, T6 Y
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}$ Y4 f0 m/ ]" B" `) R- s
// PERF_STATUS , O$ U' R6 z1 j3 s" p

+ I8 _! I$ W) ]}) // End of _PCT object( _9 k" f* c8 Q1 H3 |- @+ J' A! t4 J

5 F% \2 Z- w( K6 W6 S' cl. k7 k& l; V1 k. I, S
_PPC
5 W* N% @' E! E9 o( q0 z0 i % H- V$ M  H6 h1 S) S  `
Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSS中report的所有的P-state [p0,pn]; return 1就表示支持[p1,pn]之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(\_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states。$ W0 r$ g4 W8 d% {
" N0 J6 W% S4 c. V. q* U9 Q
Method (_PPC, 0)& F" n$ n5 _& e- N
// Performance Present Capabilities method
- L8 A4 G/ w2 }- _
3 I. G) J5 b9 q, T! L# n+ L* v{
, o$ l0 V6 Z# J  A
/ r& X" W' }2 ~6 R* DIf (\_SB.DOCK)
$ j% s: K8 _2 `1 T" G- T0 N6 ]' y$ G* ^
{ , I2 j- ^7 [2 U6 U, Y" Z: A

+ X! R- ?3 J' |6 _Return(0) // All _PSS states available3 Y3 J2 }4 ~1 g5 V+ `; W. b
2 o' S$ ?6 q7 m+ V7 D* ^0 C( _8 O

# S, v3 _& c1 A4 A3 m3 \} 5 O( N2 k" Y; d+ K7 z
5 s( G" \7 i, N* s0 {
If (\_SB.AC)
; `/ h. ?" B6 ]* a, r+ C& q, }! B0 i0 q6 ~' J- R$ T# g  Z
{
6 |. Y* s( \7 n+ x# j1 ~5 l
/ M6 K9 k6 w" a9 j( T$ ]  J  hReturn(1). H4 m- P, W# z- r
// States 1 and 2 available ; ?7 W, q. w6 X% R- L) e# D  @6 z
- Q. r- d$ A' X' Y6 n$ y' Z3 O
}
! q* u1 O% I, a. ], i. @4 {. P. C% D  Q; i0 v4 h3 p0 i: L6 V) h  N8 T
Else
: n% h7 U7 |- F$ S/ b7 ?
' Z7 e$ F0 M3 [+ _8 \  F0 k{
+ M1 l* ?, _% S% h) u  v8 ~) z  o* _1 n! n9 R" ?& r: ?" W
Return(2)
( c5 t2 f: u6 s2 ?" u7 m// State 2 available
5 j0 X4 }) b& T7 P2 D. F/ L# N: m& a& W( G3 o
} # a0 g$ b3 M1 I  ]
6 r( i% m2 H+ [5 t
} // End of _PPC method5 h3 M4 ^- G7 G# @4 t2 j0 Y5 K
2 I- Z0 v4 c' v5 [. Z6 y
l
* D. C, [9 Q% u  [) J) M% K
_PSD
" Z6 e0 g% j( v1 T$ x * @+ v" ?* O5 b, k1 e  T
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。1 X  N8 H/ P  B. ?

0 c# I- z( D' HREFF:$ Q9 Z( X$ S4 q6 j
1.
) G, D8 z: X2 nACPI Spec 3.02 N. t, S, Z; R! {
2.! F. ]% ~/ f9 }/ `
Intel Processor vendor-Specific ACPI
9 Y6 b  M0 E% g* }
# ~) H" Z2 O" n* X( J0 g
) u& b) E# B0 ~  {That’s all!) K4 Y. q! |' z, r5 y! f

/ F# P1 z& d" z) k+ C: XPeter
" O8 f/ P6 W/ [( v! P 3 ^" N% B1 Y( |* {' ~2 u: U: U2 {- n6 D
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
: g: B& U- E1 x; N
9 ~3 g4 I- B: N( B7 rCPU在C0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-state。T-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工作时间的占空比)的方式/ x; p% d1 D' w: t* i+ I9 N* v  x8 G
,影响系统的功耗和温度。' j- o8 H& ^. ]: Q; ]
7 x0 ~8 y7 @; s# \! W/ F
2. T-state Control
3 z: _1 l! X; m- D. J
% R5 t3 r9 ?2 P6 P" t$ g: D1)
" A0 e7 G( f4 JMSR Based Control
& k( A$ j. t: H& w- V ; Y6 S1 ?' w& W9 C2 ^
BIOS可以通过IA32_CLOCK_MODULATION去Enable/Disable clock modulation,而且也可以通过该register的bit0:3 设置CPU Clock Duty Cycle。当FFH在_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATION做T-state的转换。 ( I' J5 ?  B  K. K& n+ F
9 k$ U2 U; |4 `7 G! O
2)/ S; z- P4 Y/ s" c: R
I/O Based Control
2 L4 `+ s5 S# I9 D8 R8 ^ . n! F9 Q1 n' f: f
除了基于MSR的Clock Modulation,新的CPU也支持IO emulation 的Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock Modulation,OSPM将会通过PROC_CNT register bit4:0做T-state的转换。0 c1 M& ^0 g6 w& M& \/ Y
3 r8 W! c& j) x( H2 R6 f
3)
: b) e+ W1 Q2 L) V0 CACPI Structure For P-state4 L& q' y+ j& o! a' a
l
' g; `' e/ a* h( m6 L; G
_PTC; a6 p% b/ T6 P* y1 H; J

6 Z" W0 O8 J& k* {4 O& R' SProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:1 J5 }9 r: b* z6 |# O. h8 H; W
, o4 Z  v/ c/ x5 V* Z
Name (_PTC, Package() 7 k( s2 M' t7 @# h
{ 1 k/ @* r1 L0 Z, \+ \

7 y) _& K8 g1 P, z2 I  NResourceTemplate(){Throttling_Control_Register},
$ W& g5 @% D4 K) D4 t$ R" C//Generic Register Descriptor
( \3 O* b1 H- e$ @6 k* {* j& r# b" m' M: _4 J3 _6 e! K* w2 h! a
ResourceTemplate(){Throttling_Status_Register}1 @6 u3 x! f* q& P, i6 w: w
//Generic Register Descriptor
" y; h: }) e. v) Q}) // End of _PTC3 \/ _0 Q4 d! S6 N4 x" }

! L1 w4 }4 R) s9 N3 ~* g下述是一个sample code:
$ |1 u: k  S* V! G! I, A9 S2 R
2 V3 i9 I1 |+ m' y$ u" U5 I! O% u& _% _
//6 P. z- O. L6 G) ?2 ?
6 k! ]# K. C8 G1 n8 L4 C/ s9 N
// T-State Control/Status interface8 g' L) a+ ]) P$ B, f! @: V
* P2 E  a+ _; Z( V1 a, i
//2 [& ~3 i& r/ v. \2 }
( y; ^3 w8 u8 z& u$ e
Method(_PTC, 0)
6 p2 T; b) ?! P1 k9 Y. B. O" t" M0 N% N' H& p+ l4 T, z& k: M. N
{
0 t# ?  V; c$ Y7 b6 Z
5 U8 k7 o( ]' w) X5 Y//
! V; k+ c9 R$ X9 c1 N( X% J* @
: G; Z+ q4 [3 T* G1 `) y, T, e/ o2 S. N& D// IF OSPM is capable of direct access to MSR) r; ]; U" J% S' ~& ]
+ [0 z# i7 N- f2 _! C' @& J$ M
//( a9 b6 J+ C$ t- K
Report MSR interface
* ]' ]' w/ T( Y, _
% }5 ]$ I1 N) \$ `4 V  e9 e1 t// ELSE, t. s# {! R6 i
' S# G$ z& p& V. t7 \
//- I, @" l. \4 N/ g/ [; j. {+ D# ~
Report I/O interface( s+ l- v" b  q8 z& \' M
# j9 ]; `3 I+ Q1 H
//
. _5 i+ {( f# S- S3 a, D, p! w( C! x  i7 E$ Z9 J7 \) ?
//
/ Q$ X! D+ M0 {" L  WPDCx[2] = OSPM is capable of direct access to On
* D* `1 e6 W% E) u' @
/ ?6 O" L) e8 s9 z  F//4 V4 d6 m% p1 J* w& W3 z) X
Demand throttling MSR, l; Z( w5 _/ E* N6 b
" E' H, F' S! O2 R( @
//% K1 X3 U: r7 M0 ^9 }& m1 k6 [
) n: p7 L3 P5 n# b, C0 y) C; _9 C$ X
If(And(PDC0, 0x0004)) {( R. p- N0 {  i& ?* N2 B
: ]" m; C: i+ x2 Q" E
Return(Package() {& j6 [2 o  {) c% s

2 y: b6 U7 ?0 |! O( W" R9 b2 T1 WResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
( Z1 Z; j6 s9 a/ H/ o/ k8 ?9 S" A# o) z3 w" K) h0 T* C* j
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
3 e& P  m+ q+ q. a
, _8 s6 ?2 J8 Y. ]- V" v3 \})
, Z  m3 w! J" B" ?: L+ H# u% v# Z( C6 t9 l
}
1 Z, u5 I/ U; Y- M+ l
* A: j* a8 C- e5 c7 JReturn(Package() {) S) M- p4 Q3 F/ L1 S

2 n; d, N8 z. b! ^ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
! q0 s) J" c, q: ?- H, s
. q  I: a9 [" E- v2 u7 X1 ]ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}6 `  i+ [& M5 g5 f8 m; H& O

, y1 t5 d, ]' y0 b+ |; D})* y4 E2 b5 l4 A5 U5 }

0 F  `# V3 C0 R# A$ x) C. u8 s}
" O+ q% b9 g' J0 j$ t! H
' G' {" ?( Q8 t- ^
8 F7 Z6 q, b9 @* B. l# U2 K+ `& d( g7 Y+ j+ v  _
l% d. A7 ^+ K! \) R$ f3 o
_TSS) S8 g1 V" J# U1 D6 o
" y) E4 [4 M# p' b
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
( @; W( Z1 V7 p# i2 dName (_TSS, Package()
3 X2 o5 s% \* s$ z+ v{
3 n$ J4 n% U3 a8 v( z. q// Field Name$ i/ d3 F' X- y1 \
Field Type
0 A$ \; E: o2 D% f5 {9 Z+ X8 `2 G. J; W. |

+ z7 M+ n" g- d; F
8 C$ N  }, N0 k  v7 \+ gPackage ()! ?. n& p6 S1 W+ t1 G
// Throttle State 0 Definition – T0
% z1 t0 {, }4 q% R. K6 s; @' Q7 D& \/ w0 O
{( k: g; p  ?' b
4 m, |. C+ [) a4 x3 ]. F2 l$ ]

* C4 {/ x% x7 y2 u0 V$ I$ f" NFreqPercentageOfMaximum,. h5 H; r* u/ J5 U5 G3 U) Z
// DWordConst
/ u& F, P. T% G# g) e* f) n2 C# R9 U: P3 ~
Power,
! u9 j$ ]- I! X, A$ P6 v+ J// DWordConst ) d' X  y. a# p9 y4 s& l, F' a
- _$ {/ Z; s9 p
TransitionLatency,2 d2 C' E3 q$ j0 [+ D
// DWordConst - u* X3 K- }! {7 m! N+ q  T- J

+ K8 k4 W& |: M) `. \0 m$ \Control,4 b. M1 d4 I0 o- h4 @
// DWordConst
6 Z* f8 y" u' j
. i6 ?+ g* o8 b# ~" `3 SStatus
, N) p5 V: {' H* Q// DWordConst
3 k) K$ f% ?( H},# |0 E0 z" [& j1 @
……
6 I  r( l* i. W  X7 y) p. _* w}, H5 F  G8 e2 ~( T

- [$ Y: O& K- H6 G7 W7 I  O5 FExample code 如下所示:( ~) P$ c) {: a  O! p5 p# w

, b. o$ k$ l7 n3 gMethod(_TSS, 0)" {; ]- S- Y7 n9 O# R

: A) N( w5 `, K0 T{
* z! H- a; v! f9 f" c) S
. `4 U! h: [! a* l4 U$ D5 A: a" MPackage(){100, 1000, 0, 0x00, 0},
) i# @8 p: w/ x& I$ i( z( A- k9 S5 P6 M" T! [
Package(){ 88,0 A8 Q- J) N; Q1 Q, P3 S
875, 0, 0x1E, 0},
" W8 @: v* j4 ?2 Q; Q
0 P/ `+ m7 ^4 J/ g, VPackage(){ 75,! r% R4 i0 T. c# Y
750, 0, 0x1C, 0},& W; u8 g6 o+ y" ^* p% z

. j2 G* k0 O) c, _' U+ V' l3 ]' GPackage(){ 63,
9 f& x8 v, D. x# r. J/ F625, 0, 0x1A, 0},
5 t$ s$ E9 e3 L
1 `% Z5 `7 B& D6 z  V( VPackage(){ 50,
: Z+ ~1 s6 F( T2 z7 N500, 0, 0x18, 0},
5 b8 w5 Y* Y( {: P, g1 e- p. d" \3 S! Q( u' i4 J1 w4 s- B; E
Package(){ 38,
- u8 w+ _2 w; X& i$ K+ f375, 0, 0x16, 0},) s8 }( j8 |) r1 Q9 I  H6 k

) O& l1 ^  k. x3 w$ T! lPackage(){ 25,
9 i! l3 J! u7 T7 O# J250, 0, 0x14, 0},$ Y1 p. b) A/ }
( \( ]$ q! I8 b& }: i; m. w  z! [
Package(){ 13,$ q2 f; C& j: Y9 l- Z
125, 0, 0x12, 0}. W: @. p4 u  a0 @% N+ Q& }; O+ E: Y" I

( x5 R5 d' Y. J" \4 k}/ R9 I9 r- c% @7 I. _. T

( H% l( J8 i4 i! h9 h8 a1 Q8 t5 D+ l9 y: v% x
l  I) B  e; y1 O% ]) M# D9 g
_TPC( H$ G% B. }- C3 v; L% S8 z! R
0 J+ N8 l% ?0 M1 s* M  s
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states,0表示支持所有的T-state,1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC。
, x  ?! `0 X8 B6 [$ O+ z8 m+ Q- Y5 [ 7 w: H, n  `8 u- s0 P3 s
l
/ N4 e$ M2 P0 {5 V
_TSD5 V% i  ^( B9 f9 a, h. n

) L& R; X$ q, W6 C0 D; m8 ~. @T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code:# ^' E) J! W9 g) A

6 h( C7 i4 H+ a% bName (_TSD, Package()
6 O7 \1 c* c3 Q/ w8 g, H! d4 N6 y+ }. Z$ k6 o
{
$ G, y3 g9 A) H
4 h* d4 X7 e8 PPackage(){5, 0, 0, 0xFD, 2}
& `! s+ J2 g! P& a3 W3 Q! B6 ?// 5 entries, Revision 0, Domain 0, OSPM 7 F- q& ?' e7 A; A. n
Coordinate, 2 Procs % {1 \- c, g3 w& \% R! e4 f0 J

8 A* o/ s' q% G  r( [3 o/ f8 B* f2 U: r- ]- E8 c
}) // End of _TSD object2 E/ `; {. D6 d& [- b. B
$ u; B# U- q0 l/ [# e  x  {
REFF:
! S6 s5 k1 x8 u) G3 d" C1.
+ }, ^# ]) j; V. Z! h6 f8 P: _2 v( }ACPI Spec 3.0
9 J1 c+ W3 ^* @* R% }$ v- p2.2 a4 Z+ ?/ k4 v1 y( M
Intel Processor vendor-Specific ACPI
4 O, A  H* X2 T4 |. ?+ r
4 l* P/ f" g# n4 L5 k6 i , j! J" n; f9 b2 V/ w
That’s all!
- u8 a" {- w2 E4 l, Q% y2 w4 O! x
$ o; W! U3 l2 Y) b4 SPeter
7 `8 C3 m7 n2 ^, T$ t - O( ?4 W7 V) ?0 Y/ [4 y2 \
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-18 08:00 , Processed in 0.190545 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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