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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
5 m, o1 e5 g4 [3 N
1. Overview
; |; s0 E( \6 L, B4 E+ I4 A" \1 P7 W7 x" w" Y5 }! s
* }9 {  d6 ^* ~; X; F: ?* Z* T
C-state是ACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换: y6 x7 A  `: C" x/ e' g% g
降低功耗,图1是C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory request,OS就不会进入C3以及之后的state。从信号上来看- A. T# Y5 I* L5 R# q+ W; b. o* s
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
/ q9 |, L/ B* z& b% T3 U: g1 Q9 @
9 D, p; N) o, Q2 t- c
cstate1.jpg

) t( _; @. v9 }5 }; W# O( E
图 1

  Y8 D& a$ u5 s# t: q/ D2. C-state Control
: A6 `( b4 Q* Q- ^  c3 U. C3 t! Y) N1 ?/ q9 U, m, \& ^* b
1)
$ u. r) a* r2 h! ]# [9 z% qDetect & Enable C-state. `2 W2 w5 d( x% _6 [" V  k5 Q, k

- ]1 h7 D& l4 q9 z  k5 s0 I5 F/ `4 ]BIOS可以通过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的支持。
+ H* O1 u! Z" M4 v( @, k( @+ d5 R
2)
* w9 b. D9 h0 t' B+ v( gC-state Basic Configuration! o# b# A  s; u/ s
通常情况下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)。
/ q- d+ I& ]* P$ G* S0 G/ D$ V- b* O+ B( Z
3)
' P3 x7 ~# H2 ~' G" J7 B0 K! H0 nACPI Structure For C-state7 j: U0 ~. o6 Z6 [
2 Y0 O% g7 t9 d1 L& S
l1 b- Q9 [+ B' `: B
_OSC & _PDC
$ J9 F: P* I* `2 u! e9 C_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures。4 O! c( m, j( d' ]! K8 \
l- H8 l. p/ A) D: ~
_CST
$ L6 R4 d& K" J* j2 M_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
% q" ~3 h8 w/ M! p9 p1 a" jCSTPackage : Package ( Count ,
/ R1 ]& Q/ ~$ A/ g: u) qCState ,…,
; t4 }1 |# |) z3 ]% ^) T7 @. w: k' qCState ); F/ n) r/ f5 u: v7 h
其中Count表示所支持的C-state的个数
( @9 B$ ~. }6 A) F  |CState: Package ( Register ,
! K8 x! q) @, ]1 n7 g/ a! X0 lType ,
, B$ B% ?' \, Z4 o7 ]. x! W! bLatency ,8 J) j2 r, t2 ]/ S! `4 \
Power )
) z. E8 `) M$ b, d
$ M1 S7 P2 g8 x& bRegister表示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。6 c( H  A% z+ E4 A: {# Q
( B. }1 c( ]* l4 C
Name(_CST, Package()
: p) a5 J% O7 [; a% Z$ D/ G
! S* |# {5 s* J& X. B# m( n
{ " g/ ?) C1 ?$ v; d6 Z, j
4,) F% T) m* U* W8 h) d$ ?2 l6 O
// There are four C-states defined here with three semantics

8 C, j4 w, u$ i! I$ [; o9 |; H0 k- ?) ^
// The third and fourth C-states defined have the same C3 entry semantics1 E5 E7 F& z* ^
) X0 Q4 A. q; y; U
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}," ~! z# U' i& E! ~$ g* n! h7 m
1,/ h0 Q2 k' _4 Q9 Q1 |, R9 B
20, 1000},
4 ~7 U6 C6 b( j) t/ v, Y$ M. l$ G( I/ N" i

+ L* s* X8 @1 w  G6 F5 f8 |' g  P* |Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,2 i2 w1 S, P4 b+ L' I, L
40,
% |  {- @* y& W/ e7 o750},
3 _6 g# @1 V0 u5 Q8 g2 L0 j
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
5 U" l$ g5 v. I6 ]) s60,1 w9 r% k, H1 z: ~* a0 W1 x+ A% x
500},

, b% K7 K/ n  aPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
/ K$ p$ C' M. ]9 e8 }- A, K250}7 A% t' Y' A- l" B/ M! y" L' f, ?

3 O8 y5 T8 I& O, K! L}) ( {' B; U$ B- e7 E9 u3 o0 P
2 K8 B  _0 J' f) `3 B* g9 Z: @4 \9 J
l$ d8 _( E7 o2 l2 O8 X
_CSD3 i. v" w& B5 b7 `1 Q2 @5 ?

: ~, G( i9 J0 [$ a$ ]' A7 C5 fC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。, _: I$ \0 n2 s
' o$ x5 }' P& N- d
: z+ W) ]; C2 W" z' ]
2 a7 \! N  @' h% t+ |- r

  J! e  A$ v" e, ]" \9 R+ G3. P_LVL VS FFH
. f! H* o1 \- I' y
6 D$ y" a4 G( B' y0 |P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 的power state(C2)。
$ M+ J% X0 L2 y% G. {% c5 wFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS在_CST中的格式如下图2所示:. l, d  g- |- f4 g; ?! o
! c* f) M* d" j/ F) `/ {) J
gas2.jpg

; g0 N, @# @2 N* F% ?
图 2
+ g& b& A0 s) x: d
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的一个例子:
( X+ ~% m" M) |% U$ ~Name(_CST, Package()# x* i# h; H) S/ L9 I. i
& Z- A  \& S, B5 m0 ]9 L. O
{
  \( W% r) K6 I; \& d2 V2,* W$ @+ f' ~* `+ B  A1 f' H
// There are four C-states defined here with three semantics

7 p- Q% a( s# g7 m, @# ~0 n4 E7 k, ^" |0 L( {  q; E: B
// The third and fourth C-states defined have the same C3 entry semantics% z7 @3 n5 K& N$ |1 S8 s- f. d

1 _7 p! w% d* D2 O  o) ePackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},: c1 U3 K( B) ]
0x01,
5 q' x3 N6 n+ k' d  O4 A+ a0x03, 0x000003e8},
, i3 z' R, W4 ?
# [* Z7 M% G  N7 s- T
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},5 h4 B6 P/ p: L; y8 t+ B% }
0x01,
+ }8 g" }3 i) q& p2 V* U0xf5, 0x0000015e}
* i8 @/ R( l- R' ^2 B
}) ' B/ o3 I5 ]5 g* n. N3 @# I
. p& `' G5 r% T+ ^

/ u: i! `6 f7 a2 M& oREFF:
! F2 J! T, h) ^& C9 _3 N1.
, a# C: T# R# J; L7 h' R/ D" PACPI Spec 3.0
0 u! Z; |/ c8 z1 r" {% w2.+ p1 y& u* W/ h; G
Intel Processor vendor-Specific ACPI8 X6 j6 n3 I6 Q- d
4 L* z, c* \1 {

' Y$ ^$ c. \: W( ~0 rThat’s all!
7 m' e+ I6 t  A4 c# M3 [& z$ ]4 a3 j- o/ `" `
Peter- b  W; u, X* k: ^) v7 x2 H0 p
+ G. A, q6 I6 j# K. ?
2010/9/20
0 u( ^( o* u* I6 D" O+ _# ^* {
/ U+ j9 P& b* m* A, z/ [# M; h[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview. v0 b* v. l; W- ~
" ^& K8 s6 O  e2 G) @
CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST
5 y  t$ u! t4 Z* y$ a! u9 ]% {$ g- O(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
" c' X8 ]5 X7 o
2 Z4 _: Y* o7 [) y9 ]: M1 @2. P-state Control2 Z% e. S  ~) b- d

3 F7 h/ Z1 U, ?8 i6 n7 |- Z( u1)
5 M9 E" @. U0 X" ~  `& F6 vDetect & Enable P-state6 K- d- I/ W# X( Y0 C
3 c7 ]3 f4 [+ q) Y
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。
% d9 P: T1 j) p9 D' `
8 n+ A/ |" U4 D2)
2 _# I/ L% Q4 f' nSupported P-states
- E  E+ f. {6 w* `. A& |9 ?& X9 \* G + _& p+ j: F7 c! |; x/ A2 V+ W; y
当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。
& J2 L# H1 S  {+ ] 7 B: q0 ^; C$ T
MinRatio = PLATFORM_INFO! T. U; l# J5 A
MaxRatio = PLATFORM_INFO0 L) J; ]( @% Z7 d$ A% l- K% I. \
RatioStepSize = 0x013 x6 z& e3 E& A0 x! R% Y8 F
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
& m* Y# P: ]0 ]4 [ . c7 v2 r; B% C% |. @. E& A
If(NumStates > 0x10)
3 |5 ^' p' }. q+ y' M; s% G{$ v" q4 g1 d; m: B! h8 \, r
RatioStepSize += 1- N8 j% e) H1 p
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
  }4 k1 Y2 {# \/ u3 c% g. |0 p9 ]* F}
/ }, j: ~+ F+ l 0 @- F. t3 r! ~& }7 A
3)
- S9 D5 f6 d- y4 VTurbo Mode" G  {5 U# T5 T: E) `, f1 V# y

- y* o: K% y6 z! YTurbo 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。- K: @" V2 W1 }+ y, X9 J3 H# d

3 z3 M) }7 W$ i# c4)
$ r% @+ ~7 `' d0 i6 ?# IOver Clock; b, q* f  l( b! [; D

3 t  f. i" D1 w' @4 H某些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)。
+ R$ Y  J: M/ N2 ?& A8 @& s# j + m, `$ f5 X: f* [3 I8 S6 M
5)
' V( R: }% S) m% vACPI Structure For P-state: ]% J3 F2 @! ?( R

. U$ o  v: z, }- x! H- j! R2 \2 v5 dl$ q1 {5 Q( z* @7 g$ p! Q; L
_OSC & _PDC; Q. S! O4 ^* a3 s
; y0 O8 ]" n: W. q2 H
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。
1 G  j+ q% o  G1 t6 r( [
' }9 H# e+ x- o/ pl, z- Y0 \# V; L9 w1 @
_PSS
8 l( C& d5 h# ^/ aPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量% ^# I# L' W% a3 J
并且通过一个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做比较
" I7 H( x9 m$ I( g- ?1 X以确定P-state切换是否已经完成。6 I9 o3 c& P+ R7 u( c* {& e  T% i

: T7 V/ m9 F) FName (_PSS, Package() 4 c0 K) K/ t& o1 N' j
{- h; K* c7 X' [( V) h& C  S
// Field Name
1 J% I  N3 X3 r/ ?/ h$ UField Type 5 Z2 L! b& ?: C$ b* b! ~+ _- ~
3 s$ G7 E$ r+ o  ~( E1 T8 G, T, u
. @1 S4 {  K% O- d6 Z8 X, T

* s$ n; I/ o' Z2 dPackage ()
' \2 r! w" f0 C" s: O* e9 I% ]// Performance State 0 Definition – P0 / R* G5 [! a! \  `( j

  p+ j0 D$ }2 h0 W: u{5 e: P1 \% ]9 k/ [7 @- f4 h! d

0 B2 O$ G; l8 I* ?$ B* e& m1 f( W8 O5 ~" f# A
CoreFreq,) @3 Z0 O6 w; o* w
// DWordConst 9 X, I% m+ _1 j; _& ?
. h0 k9 ]+ p- _( n* x
; u) M( [- W& z7 p0 i! V
Power,+ y# Z! Y9 J* t! D1 K8 r7 W
// DWordConst
# _6 @$ K4 l  j" X% m$ V& {9 T/ V! \8 i1 k1 ^/ q% @2 A
TransitionLatency,. b% L' V% G8 ^% v5 u1 |
// DWordConst
% I- a1 R" z  f' b8 W( q
7 O. ]( O5 |  H$ h! u4 dBusMasterLatency,7 |+ y! v- f5 A
// DWordConst
0 A' e1 T& {, `) D" R2 q$ v/ W1 L: t5 F
Control,: Y8 X+ N& Z1 z3 U
// DWordConst . d3 J& }/ Q- q. q" m6 o

4 p  u& f: }2 ^Status7 c' o6 F9 H% N( o, ~. r8 p+ R

2 x0 D, R# E/ x* f// DWordConst " a# Z2 H. |- L7 Y& ^
/ q6 h1 p- g) R0 L
}, # x* N; G4 B) o# {- @
5 h1 A. _" Y/ m' ]  s$ Q* [+ b$ V
.
) f, G- o' }' [8 H5 U8 S
5 h- n$ O* g" L. 1 s! V: {5 M* B

2 t# ?$ S0 y% E6 t* T! t  K. 3 @) f) s( j% Q; `
}) // End of _PSS object$ g; t, O/ J2 l5 u
前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。 ( r) g/ d+ m" d: Z, F* f% t3 q

; |3 G; L2 m6 K; a7 u$ j) e% mName (_PSS, Package() / D0 x5 u1 M- Z! [+ m

# d% g6 Q' t4 E$ d& y! c{
! q6 q+ S% V) h$ U3 E
% O/ k  \: Q* p2 c. H2 }5 W- v) `( jPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
# R% C1 I( H5 {( @2 [) S. O4 r4 W7 k7 ?5 O
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
1 n' L. [% D+ d8 X% h% U8 I3 E
8 O5 X& Z0 E8 R  IPackage(){1400, 8200,
( h' I3 K; z2 r/ p; K  u# W2 }10, 10, 0x000E, 0x000E}/ L% @! l: g4 K7 R) j; ]# c
// Performance State two (P2), Z; q. x- x6 N5 ?4 V
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // * O( ]# n- y1 E5 M* e6 N2 ]1 b
Performance State one (P3) 9 k& r5 `: P/ W

2 ~+ S, B# }, r$ a$ S/ T. N9 u3 x9 |Package(){1200, 8200,
$ Q& y/ q# T! `3 y10, 10, 0x000C, 0x000C}
' f8 M7 ~+ ]' `' ^, E& u// Performance State two (P4)+ z% d! w4 b  ~5 \" @; r) l
9 Q& I& s: B" {$ v7 H& Q
}) // End of _PSS object
: Z2 y/ M2 |- x" f) k% ^' q
# Y. t. T! l& ?6 N6 x5 Y另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。
* l* l: W/ ~+ i% f) p 9 U0 V. L% ]5 y+ z  q! f9 {
l
3 M& X& L' n( r7 l. a- R5 L/ W+ F
_PCT2 h9 B  R) P' Z' J

4 q7 _0 I8 e+ |) N! JPerformance 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的方式来进行。
2 o2 M1 f5 l2 S) N0 D& R 7 g) \% g6 X/ `
Name(_PCT, Package ()
' i5 C# ], Q. C  z2 r' E// Performance Control object
$ M, }) s7 x& M* U5 l) X! I3 A5 M$ i7 ^- \7 m3 T( G
{
$ q3 K2 l7 A* R% p% g- r6 o, g
0 X! _+ v- y+ Y2 n- Y+ HResourceTemplate(){Register(FFixedHW, 0, 0, 0)},6 e  |! H) N5 t# v4 E3 E" s
// PERF_CTRL 4 I9 |& h8 P7 d( e1 `; p
/ L; @7 i; I( P; t% `7 E
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}' `4 }9 @9 ^; O" G* ~7 F
// PERF_STATUS
' L/ k4 v( f# L5 n6 N$ }# l% g. A8 ?9 ?' V0 @
}) // End of _PCT object
- U. P; \! q0 P) ?' @0 W5 S; w' t
8 B( j( s* o3 L0 {$ m7 Fl
: f$ U/ e2 Z$ a( x; E" P3 a  p. D
_PPC8 C3 ]& `# V3 s3 t9 {8 M0 Y

9 W, u& r' m7 F) o% JPerformance 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。' \. F. F* ^; z2 E' J

1 E# j# C' C( m- t) eMethod (_PPC, 0)
; N% w2 I, G2 l8 Q3 f8 O// Performance Present Capabilities method
' `1 G+ G0 H8 N% Q
; H( X! a2 Z& H3 x1 d3 v, @* Q0 A$ [{ 1 d. \; z8 U/ k  \  c2 F3 V

0 C' ~. j* Y- p; |1 W( yIf (\_SB.DOCK) 8 u  w& X3 I- x( {" Z3 r

( Q- l; X" G# C' S{
8 @+ p5 ~3 x  Y9 }  U' A
: U* m4 L$ y3 I0 L2 K% PReturn(0) // All _PSS states available
4 W" A! k9 F7 D# [* c$ f1 T0 E  l
; m6 E0 f" u( K; r" p4 E) g, D* v
}
' N4 g4 R2 v: `' P2 Y/ v, p/ |' L5 \! C- J3 D6 G- ?- t: o
If (\_SB.AC) 9 w- z" f) E, t: f- [0 K) t" N
* Y  v+ V3 k) y5 x* U
{ - w. P; {# E4 T) p' i0 _

. J& x% C" k1 vReturn(1)
" g) k/ P, f, d0 l& V! D2 y// States 1 and 2 available 4 \. i+ L3 V6 E/ I

& M- |: n. S+ F; L9 ]8 `7 a} . {2 n( g0 q; z# w; b
* l8 @0 C1 K- v) z, w
Else 8 R+ v2 j* D7 f3 C* k, A0 W8 S  U

& e3 M8 R$ d# m{ % q8 U1 C3 s9 M3 N! k; c" I
2 n3 V6 ~" m+ d- D, C
Return(2)
+ q7 {3 |$ v2 _7 X8 i; t' o5 g// State 2 available
' I5 Z: Z4 ~; X9 D  ~- `
9 o* _* e2 g" c}
4 Y$ d# u( S" n. Q5 O% w
( T4 t, j( z* P4 @} // End of _PPC method- N! O2 c( B- o

* n# u/ v! l1 \. cl# p4 M% ~6 e' o" }# Q
_PSD
; L& L2 r- i; P4 s6 r. H
! d$ W* X) }" V) \P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。8 {  o6 [/ h4 _; j5 Y

5 J! j) [8 e3 K* J! D* `0 `/ KREFF:% x8 `3 y8 v5 D6 G) R6 s, W7 d
1.* e% Q3 W  n& D
ACPI Spec 3.0+ w8 b, C6 }* g- z6 f/ M
2.
  }' `( X2 o0 n4 f3 B9 b( y' ~8 JIntel Processor vendor-Specific ACPI
% R5 N1 ^$ I- r/ f : p7 e- b" W* u; b1 r  M% z: [
4 q) x! w9 l# O7 i$ u! O7 B* j
That’s all!
5 y/ ?( M5 {: Z/ p4 {9 _ ' r" Q# r' m- @5 }  t
Peter
* [  F( ?% ]6 e" ?. W: X" x 8 G4 k4 A; l( z, @6 o) T
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
8 v3 J& H" x) V4 F& N! r 1 x8 K) @, i9 Z$ {1 @1 ?( l7 {* ^
CPU在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工作时间的占空比)的方式! m5 G5 y5 O. w
,影响系统的功耗和温度。1 @% _/ s% n3 Q% A
! w( m. c5 L6 W' L- M3 S
2. T-state Control
/ N) V1 o/ P" d- \4 F
+ x: r! C6 X; n; k/ ]; `1)& A0 _- ^" S0 G6 x9 g1 t
MSR Based Control
" Y) H, \9 o8 r6 L, x 5 V) t1 C. k- |2 v" w
BIOS可以通过IA32_CLOCK_MODULATION去Enable/Disable clock modulation,而且也可以通过该register的bit0:3 设置CPU Clock Duty Cycle。当FFH在_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATION做T-state的转换。 0 Q$ H) [4 _' Y

) y2 `1 l% C  o6 w) j+ C% v9 N2)
8 z3 Z$ [$ P+ l' C, ^" s8 a2 oI/O Based Control
3 r: G. K3 |8 m0 Y3 @8 i7 K% t
. u+ \" E/ Y; b( ^除了基于MSR的Clock Modulation,新的CPU也支持IO emulation 的Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock Modulation,OSPM将会通过PROC_CNT register bit4:0做T-state的转换。
: i. q1 U2 C! g 6 F) s/ i8 c2 [$ }8 l2 B
3)3 x+ Z! Y& p3 d
ACPI Structure For P-state9 B; t: A5 u/ ^8 s
l- D7 X9 i$ _9 A, l( P/ b
_PTC
6 G( y6 A3 h/ a5 E
, C, a' `0 B( V: d2 \) \Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:. g3 J. O2 n( E" ~/ f9 z6 Y4 g  z0 j
. ~8 c- w; F2 p, M) Q
Name (_PTC, Package()
5 W$ ~* B0 h6 R8 B{
% M1 R% V8 w  `, u
8 t$ ?. u- |  l# _+ }0 g) W- I: FResourceTemplate(){Throttling_Control_Register},# ]% D4 k: Q/ I8 u8 [
//Generic Register Descriptor ! m6 o$ w! Y8 E

. ]2 \1 L! ~% g* [8 PResourceTemplate(){Throttling_Status_Register}
8 f, D0 Q% _5 x6 R//Generic Register Descriptor ' E' v7 Y6 B- O* F& W
}) // End of _PTC) y( ?8 \' B  J) Q; |  }9 B7 ?$ F
% J; z( m6 B( y# Q" h" g
下述是一个sample code:
: A0 V2 ]8 E* u, U1 i- d + y: D* w, i" S( R) p' t' f2 m$ g) A  C

; w/ D7 v5 k' a+ F% _+ w8 P$ G, m
//0 d2 D6 t) R( c" L* E! }

. V' k! z* e" M/ m/ V' X// T-State Control/Status interface
$ V1 U  T% N: v  a% r$ `6 @4 L# |
+ U! f8 X3 [2 h% O: Q, F//
5 M2 h0 g$ l, [, G, m
* O. |, v1 |# }: S, NMethod(_PTC, 0)
# K  x. [4 X( K% K; e/ I8 G8 M& h( C. S
{
6 a; P6 V& n1 |) M& {: Z+ B; _7 r4 \+ h. J. E0 V
//" E7 C1 H& G0 [$ L% o$ e! p" g

; S3 V9 o: ]9 b3 m// IF OSPM is capable of direct access to MSR
1 u0 A' M  `9 g5 f1 b
, Z# H& y" x4 H& E! H, n  f2 Z8 w- `//
" K7 t4 D& F1 y$ v# hReport MSR interface
: Y$ y3 `) C; Y2 f$ ~+ N1 ~8 r+ l$ e4 j+ d7 I0 {
// ELSE
3 ?$ s' ?# |0 I4 W; A! W) t/ ^+ c0 |3 D; [" j* |" I9 E! z$ F" x
//. i; R! W: g6 W+ f' K( m$ a- \
Report I/O interface9 S* ], H/ W+ U# V4 a; J0 G0 ?
9 n2 |$ S0 r/ \) q/ P0 `+ Y  P
//
6 R0 f6 Q. h1 r2 r: l1 C( o3 _$ b' U9 W
//
1 C: G+ t8 H% f0 F4 QPDCx[2] = OSPM is capable of direct access to On
3 M# H# F* v3 ]+ y& u/ y
4 p- p0 K, a( a& ^& ]//
- |0 V0 O3 z; S+ U% O" |Demand throttling MSR
6 n" j8 k5 D, D
9 g$ V- C  u& m4 L//
% J& d7 q; _2 p6 v) j2 Y
  C% o4 g$ V# S6 O3 \If(And(PDC0, 0x0004)) {
& `' I# W4 n  w/ v$ d+ |* T6 M8 \/ B0 L$ i- h! p
Return(Package() {
' f5 N3 k0 f' H, r
- Q& _  T3 _+ q* T5 zResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
8 ~, J! ~+ R* @7 s+ M
) [) {) Z& m8 |4 J* D4 T' jResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
1 y% O3 D, T& S' H& w! c' w# ^+ {$ x" q) E5 r- M4 k* Z
})
3 R. L9 D6 a: P' v! r, F
# `+ I  n) Y- c5 [3 M8 E# i& s}
! o  g" G! X! M
. j, k* ]$ B9 t" u! RReturn(Package() {( C/ W# N; ]+ a" P. f

3 W2 u/ W% Z8 q8 Y; |/ |ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},3 W7 p* Y9 u% H5 n. n) `
2 y; h9 e3 p! ^9 h" {
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}- W5 B# L) ^" W& m
' q) ~! L( h; I/ ?: `
})& y" P% B% A. S3 Y7 c# Y0 k7 v

) N) T7 L+ f) f}' W) O; |: h( f

4 ]9 [$ A; C3 E5 ?# W8 c; E7 Z1 g
( b9 e0 R- h2 q, J, F; R
l* @' ~! \. n1 D) r; x, T0 c
_TSS
. e9 o* f$ ]. q' T3 K
. n' Q' J& v3 p! l7 Z1 gThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
+ z' {, i  [# q/ d- G0 j- HName (_TSS, Package() 6 j; t  N6 |+ W
{
4 \( D% o; d" E, `// Field Name3 ^2 m- V6 l# v  r
Field Type * L3 u1 B' u0 x+ g. i

4 }3 ]2 `( T5 ], f) l
. X+ \4 n, R6 q$ Q: j# D* K# n
5 u' B  W1 b5 k/ g3 m& `5 S( R, N/ kPackage ()# _% p  ~( w" r$ y. R- _, s
// Throttle State 0 Definition – T0 0 C8 ^- M( |- Z1 J4 i8 r! |

/ m& r, K! R1 i! m+ c{1 R3 Z: L7 _8 k# |
& x: f1 Q) f4 D" y# D0 S

) n1 M) Z+ N0 ?* d. uFreqPercentageOfMaximum,
6 D" z9 K: ^  h1 H// DWordConst
: S7 e. ~9 u, D8 u6 ^+ i. Q7 d( k3 H5 g- @7 r: V
Power,
0 a% Q1 C( G* i, v3 {4 @// DWordConst
. W" _7 B: t/ k; h
5 K+ `- W0 \. [' g- k* V3 O9 oTransitionLatency,
2 i( @# O  {  K& v( g% R// DWordConst
3 x9 K7 u  @$ C* u% T" a* e- u) B2 X6 a3 ?# D
Control,5 s7 G8 V/ }, F% ^8 g6 ~
// DWordConst 7 @+ [% o& V. Z  @, x9 s

" h5 J/ [; G$ J4 E* }* I- T$ DStatus
! b7 l6 ?8 M/ E. {// DWordConst , m3 R! A% T4 H) L, Y6 O& n
},, P. z3 ~2 t/ [  \2 X9 U
……) c! U' P  H3 B# a8 H9 k
}3 V1 ^: @& m5 X2 ?! k1 F. U

" t) ^! I* L- [+ ]% }4 ~, B, z! @Example code 如下所示:0 o" A& {1 X0 {0 U$ T- {
6 m1 S1 `" S) K% _9 B( X4 o
Method(_TSS, 0)' c; _) X: q: U8 r. S
$ o8 y$ O; {" m  Q
{
1 m4 J  K' I8 ]" o7 w
0 y5 U$ J  O9 `. hPackage(){100, 1000, 0, 0x00, 0},
1 P6 W% |  Q( A7 U/ C
  n( _. }% k" d: B/ C6 l, _Package(){ 88,
0 {! x" ^  q, X$ ?875, 0, 0x1E, 0},4 l( R* N5 r8 q/ u/ A) }% i) h

2 S4 m3 B: O4 `: B8 w& fPackage(){ 75,( |0 v& g7 K7 d) F6 a
750, 0, 0x1C, 0},- a$ B# @1 S- U7 Q
9 [' K0 q, n5 a' y* m" W1 ^
Package(){ 63,
# T9 J5 a) S8 o! ?% n4 F625, 0, 0x1A, 0},. `2 Z. i% n6 E( a; {
# V7 V/ |/ X) i8 U
Package(){ 50,1 P9 Y+ B  e. D( q2 a2 e
500, 0, 0x18, 0},
' F# q5 s1 w' W$ V" I, R. P; V- C! p. ?$ `1 Z
Package(){ 38,
* t) P, p1 g0 o7 N3 M1 B; o; b375, 0, 0x16, 0},
3 o/ N1 b8 V: u0 [! X# ~9 O% C' d3 h+ ]* T) Q
Package(){ 25,
/ E+ s5 F* B6 [# p, @) H250, 0, 0x14, 0},
! f$ t& A8 T1 k7 k* Z- m0 `% |% R1 l3 t- @# M& g! b6 Z
Package(){ 13,4 u" C! a2 ?+ _
125, 0, 0x12, 0}8 u9 m! c: M+ C% ~/ i

; b8 c( k+ {) L( Q9 a4 W}6 |6 M8 d5 B- H1 `/ m9 L+ e

" Y. F, g1 Q; z
; H) j/ Q; L" v% O3 l& d/ R1 xl- b8 G8 d1 s0 K$ m  G1 X
_TPC7 P: i5 V% L; M
0 m+ j, l0 w$ c& H$ Q& s9 ^3 x3 Z
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states,0表示支持所有的T-state,1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC。9 v. G7 l- m+ l: z/ G! u( P% ?. c

; ?! B8 J* I. Ml
  @. U; A, i4 E2 H
_TSD
% S6 `; n( j$ t: G+ Z  G
, g  d% T* p2 P8 n6 JT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code:
( }0 O- s$ S# |  B4 m, Y2 D$ f 2 g- }) e" B$ @
Name (_TSD, Package() % M7 D( K, }8 a: |+ w) `8 j

$ I4 k1 n7 M+ r1 C/ c$ @" A{ 0 i. i4 n; Q, N- Z! g) Q

2 r2 [9 t* C" w& z" u2 QPackage(){5, 0, 0, 0xFD, 2}
7 [) d4 j2 o; ?+ \7 Y6 D// 5 entries, Revision 0, Domain 0, OSPM
+ c+ S9 ~: o  i: l6 D2 y- uCoordinate, 2 Procs
" c0 \! J7 d& \* A3 b- V
/ H4 Q0 Z4 L8 Q/ s5 a% x
0 e+ F9 b- r; s' n& o% W% b}) // End of _TSD object
1 s4 U; ]6 `8 W" W, Z6 l
8 _) p6 ?5 a7 R# `; \) v5 S+ {REFF:% I! @6 ^% t2 i  e5 @
1.- M6 b, {, n, Q+ p4 n$ P0 P
ACPI Spec 3.0% B/ i& P% H$ Y
2.
& J* C- q" c1 k8 XIntel Processor vendor-Specific ACPI
* z  o, S5 j1 m9 m
8 K  m8 t- i" C' d+ P+ \
/ d% C/ j0 N, Z/ N/ b8 VThat’s all!
5 N8 ?# u' ]  G5 t" {! p 6 ~! V5 w2 O6 `3 C
Peter7 ?  D- K- o1 y3 n3 R4 Q% M  O9 q
5 o. d* u9 i9 R! |- y; [1 g
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 19:33 , Processed in 0.137700 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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