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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
% q1 e# V9 c9 n1 j8 M
1. Overview
8 g& V7 v# {. _  N
& C- W9 g) B7 N& u7 x5 q2 y2 l% t* Z) R8 ]
C-state是ACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
; C* x: [/ E1 p4 r, Q降低功耗,图1是C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory request,OS就不会进入C3以及之后的state。从信号上来看
7 y9 t& a. h. d比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
2 y1 r9 A% w. ?1 m3 s4 C* b# o& H
4 U  j! L7 y7 Z! _. x
cstate1.jpg
% q9 \3 |4 {: R) n
图 1

4 c8 A# K( v4 I' @- G2. C-state Control! Y( ^1 ]( o) Y2 l% \1 r
) a6 `% ]# R4 q' y2 d6 k
1)2 R/ `$ l2 _/ M- K* i7 n! _
Detect & Enable C-state
7 ~8 f2 R* S8 d
7 d& a4 J+ L8 \5 e# EBIOS可以通过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的支持。% \* k9 b/ W- T  S# l( M

% Q' T; V$ Z0 A. @) r0 o$ O. E2)
. O  @* K( A! N. D" f2 Z! k; ?C-state Basic Configuration% ?+ N* Y9 v" X. r; c4 _
通常情况下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)。
! H. S/ B4 O/ ^# {' x; D# A. H! l3 ^4 A& Z/ [! p: U
3)
0 q! J& U: c5 f' c6 iACPI Structure For C-state
# c% O7 H' v/ u* v& O/ v8 p
7 p5 W- J( s- q6 Z1 X8 rl
& Q0 A6 s% x1 z1 K4 W, `% x' g
_OSC & _PDC0 Q) ~1 I, S: n3 A  g% h9 E
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures。1 U) ^- F6 a- t! A9 ~, a) c& d
l. T9 P8 o8 G& _
_CST
) _# M  i$ f5 i& L( B& _' s_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
8 e/ W$ w  S" }6 j' LCSTPackage : Package ( Count ,0 q6 u/ d6 `: }
CState ,…,' c0 W/ Z4 l8 P  J% T$ X
CState )
1 F& u( \& A4 X# V- N/ k其中Count表示所支持的C-state的个数7 N* i! b, [' w; K
CState: Package ( Register ," ^: Z  C+ a& }' N$ ^6 _
Type ,4 U( Y. R3 K1 w0 q
Latency ,
; z  Q* p: F4 e7 qPower )
" v5 L+ g& w3 ?! M6 z/ _/ m" C* R; s
1 q. p# G0 Q# WRegister表示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。
1 G" w; t$ k: w& W) A  M2 _, a( O  x
% W8 q) I3 i3 {9 j, |: b! `Name(_CST, Package()
2 G) L% r& S" J  }' {7 t" S

2 o+ b$ d- v/ Q& Q7 A. o/ C{ 2 L- Q+ _. @3 ^$ z4 E
4,
5 u* s, y' f  z) {  {0 |- L// There are four C-states defined here with three semantics

! H3 R  ~# y" H3 k. I  F3 _
. [7 [. ~8 E7 D9 f' Y! r+ l// The third and fourth C-states defined have the same C3 entry semantics$ c( Y2 d6 q+ ~+ ]2 @
, W# \6 `, _5 g) }+ m9 d
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
* F' \+ `3 J  a0 I: z1,
" K8 x6 w' B: v9 t9 U1 q' d20, 1000},
) T" R) q1 ~7 J) |7 p5 J

0 I6 l" }9 O; f" ]6 _Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,; a0 o% ]6 N4 S
40,3 C) A/ i8 `  P: \; Z! b% i4 F
750},
  k2 j3 q( O" M" C6 A5 s: ~  }+ B7 F
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
2 A! T8 ^( p/ |2 \7 x/ d60,
0 [6 x0 J6 N  G; h2 x500},

# p' Z. f/ o! [* I5 M$ bPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,3 T3 T; ?! \3 C- \
250}
% C$ b: S( {3 P% Q+ o4 K' b& H2 I

* e5 n! O/ B' |. m% D: L: P: C}) 1 C/ d7 H. V3 ^6 S: Y

! ^$ m2 J* q& U! W3 b% W) Jl
7 {- f! Z1 @) p' J
_CSD4 U! J* d4 P# e0 B) B

. {- T7 s& t3 E* B/ ~9 BC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
7 Y( ^* W2 Q* j& ^# K, q  [/ h# A& {7 f9 v  A. _. V; P" i
3 F" I0 ]$ r2 A" J! e# A% @

9 `2 r$ y: i# h+ D9 u% H+ q' a. j5 g0 e
3. P_LVL VS FFH
5 D4 m/ x; h  M; K$ O% O2 W1 q: ?! C
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 的power state(C2)。
( d$ C9 X9 j% l# U: r# ^2 OFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS在_CST中的格式如下图2所示:9 b# A+ [; X$ b& G4 F
7 j/ j! |+ z  k
gas2.jpg
8 Z" h4 C" O( k7 b; _
图 2
8 R0 D. g# j! |( e+ Z+ T' k
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的一个例子:
0 ~% Q3 F, T& b$ V8 xName(_CST, Package()
$ P3 a& k% u! k6 @' X( ~7 N! O
- \) Q2 O+ W, @
{ ( _# V! I! c6 P/ r( s
2,
5 [! ?) X* }( P// There are four C-states defined here with three semantics
1 L4 j! o: O8 g3 U
7 s9 H) z* l' d- j
// The third and fourth C-states defined have the same C3 entry semantics
& r. [, \/ q8 g+ t. i2 @  o

; ?2 E; z: P, m+ b, v' h+ \Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},) I. L7 U( G$ y- Q7 |$ B, H
0x01,& S2 k; A" n4 o5 A( J! ?; z# C
0x03, 0x000003e8},
# X$ w+ J5 Q& M! f' d9 s* V6 v

: p9 f2 H/ a( JPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)}," u* s6 Z* k. J  S5 n; ~
0x01,) ^5 J3 b+ D$ P2 r' N) {4 B
0xf5, 0x0000015e}
4 {# {/ ^, y+ c2 t. }( s
})
$ O/ ]: l: c* T
6 o" G* \; \7 m. {% K, J& g9 J0 E( Q/ q# a
REFF:- y5 d8 w& a* d# ~6 m* z3 v' o
1.  \) t6 |4 r  J+ t5 l
ACPI Spec 3.0
! x7 f) x' l$ e. R2.1 K- j# p; ]( {  R: q* a* g( L9 ]2 J+ j
Intel Processor vendor-Specific ACPI; M/ ?0 |) j" v& Q( r

% @2 a& p2 b( ]+ R- D
0 D% [6 S) s; v6 N+ s( F- OThat’s all!: P, D! K+ h1 ?
, f# s1 S9 X' n4 f5 A3 C) P
Peter
- V' N, Q+ @$ H( E2 ]* h" I2 U, w( U& s6 w" T, [
2010/9/20
5 v# _( C7 a' |$ b2 e5 D
3 x* ^  f% M% i8 X* E: _[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview: s" k1 Q( T" d5 V! N/ O7 z
- {6 N, y. q% X2 J, f$ J
CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST; Y0 q6 M, \& E) i/ R
(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。, m9 _2 S6 x* m& a4 _) N" b* [

* [5 b; G' \$ C; e- I# Q2. P-state Control
; I$ P- j) P& p- I+ }$ R' T 0 X. W3 X5 s: }9 e5 N% l
1)  N5 q& t6 ~1 i1 C
Detect & Enable P-state
. J3 }$ ?' D; x0 h- {+ ]
* Z2 Y3 E+ W0 O; |6 H7 PBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。
0 V1 O4 A' K9 h* F* n ! t5 K) c3 c( U! u7 N
2)
# U& i5 k5 Y1 ]) Y8 i6 V9 U$ sSupported P-states
: d( M# T+ q. m! {3 \
/ R8 N4 o2 X; Q" w! c2 y2 z当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。
4 S" m% d* O0 j; D
, f# f- m1 A' H+ y3 KMinRatio = PLATFORM_INFO
1 A" W# `* N6 T$ UMaxRatio = PLATFORM_INFO
% |7 l, i/ j7 R. |4 M- o, Q, S* ~RatioStepSize = 0x01& |# f+ x/ O* u! V' U- Z' T
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1. _. {# j  \9 q* Y* x' P$ y# s! H

4 b/ j6 v6 z4 h$ s- m' K2 QIf(NumStates > 0x10)
6 ~7 P0 }% [3 H& p5 x+ l+ K{3 |7 _  R/ i5 v6 [& ^5 e
RatioStepSize += 1) S! F1 E9 W- [
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 10 T3 I  A8 @4 n
}- y. T# v9 f) q4 j+ F
- n/ h4 m" o$ f; R
3)4 [9 W: Q- O! ~- K! d, `% L
Turbo Mode2 y! i2 F3 H# a9 K( K) s
0 h( U6 H, n9 {4 [4 ^
Turbo 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。' i0 D' w' n. t( Q5 n: ~

! ^- ]9 z4 s* `7 _4)* h& Y. t$ k0 i: T# O
Over Clock
7 [6 t' a8 R- [0 Q- L+ a( Y- i 3 Z% W: c% i, B- X/ O) m
某些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 X4 u( r  \1 w; O" c3 C8 m

6 ^9 [- \% X* Y& b$ D5)
: {4 M/ D6 q' j( oACPI Structure For P-state
* n" [& |- G$ K9 Y
1 [0 v8 O3 f( x3 [l0 v2 V& P* c( f8 R" r
_OSC & _PDC8 E5 T3 H8 ~: T7 b  V" m1 J

, `: |$ g1 N; V_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。  v9 m; [5 e1 R  Q, c1 X6 b* z/ g

+ D' d, h! m5 l# t7 o. dl
% b: M9 a' D7 ]  c& H/ F' V
_PSS: F7 F  T! b  U( ?* Y( o) V
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
3 f8 \! }( L. [2 C9 J+ J6 X并且通过一个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做比较% [# {) D7 d  H
以确定P-state切换是否已经完成。' Q9 x1 C; U* h' Q, J. u

, Q0 P9 U: d0 U) GName (_PSS, Package() % h8 @- J7 u! U$ _. A6 k; R
{' F1 G! c1 U9 e! ?* |3 s
// Field Name
0 `$ F" \+ B7 I8 y* IField Type
! ~% s$ X0 }7 ~, x) I0 ?& p7 ^/ k% H0 ^
# ~- @2 H7 a) c# e, f$ ?/ X& i
% M/ h6 `, d+ Z: w# {
Package ()
% Y  d; Y6 g; c7 c2 ]7 @0 g// Performance State 0 Definition – P0
5 W: b5 Y  r0 I$ a$ b1 h0 P& o: ?* {* C$ X! c4 j( B4 i2 m
{
# X' ]' k: h! t# A2 C0 ^: c8 h. h3 V  T( z9 a( E3 i5 Q; S' J& W

  P$ ~) A$ V8 P. ?3 MCoreFreq,% j$ f0 F3 O% Y1 |* v4 r/ M8 y
// DWordConst
6 m. K( K9 v$ Q/ h) ?
9 d( |( Y  k9 ]
4 c; k% T- z% E, M; ^, }  W, F3 tPower,- F4 p4 i0 Q" i$ j& ]8 R
// DWordConst
$ e+ V  s- M0 b' o% e. s
( o# |" Z' J, L" |6 [& gTransitionLatency,: q& h* e4 ?: B) e3 V
// DWordConst
$ c0 j# w$ n2 `6 W8 y7 x* j. H6 e4 M) V
BusMasterLatency,
; e/ ?2 E2 W# C+ F8 S# s// DWordConst 6 D) v1 o4 ]6 p" a! k
$ b& [7 m. ]* x; q5 E. W
Control,1 h0 W4 Q6 U# Y3 ^/ x: X8 Z( i
// DWordConst 2 E3 B" T" D. X
# }, b4 C4 c6 J6 N3 c- V
Status
. V" N# ^, |6 {' i/ `4 t' k/ m/ i  `" c  Z7 {& B! t
// DWordConst 1 O. S" C$ a( e' J/ R
7 n- y: a% S- }0 e  @; H- n7 b
}, ; m4 m# ^9 O+ o# D0 C; R

7 V# ]8 T. m+ D$ U# m. # @. H# g# A+ O5 ?5 f/ z

* ]' X/ M4 Y5 C: S.
- i. _6 a# n; A, Q
7 R( d2 v/ Q8 T9 H.
# Q1 S8 r" k# c: J% \  k6 y}) // End of _PSS object7 B- T' \! \4 G1 o# i, u$ `+ ?: u! {
前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。   d/ _, D; I9 `4 x% V- O. M

" S" ^# C$ ]5 q8 z% `3 ?1 ZName (_PSS, Package() # w+ ^6 [2 _2 \$ T1 }2 R5 t( n
* r2 f6 Y; b: W
{ / a- ?, Y% w% [/ Z+ }

9 ^; f/ f: `" W, }Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) / v' l" l& R4 a: L7 S1 ^7 n

3 r6 f; b" U3 zPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) $ _0 s3 R: K# ]2 f
; ~/ E& Q0 H' E& s; {; h/ o& r- o3 `
Package(){1400, 8200,
1 c: G: R; L. t10, 10, 0x000E, 0x000E}
( n4 Y( |3 H/ s% E1 a% D// Performance State two (P2)
, P% ^2 B% ^: n1 s! C1 ePackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
/ e* u( V$ E. u" ePerformance State one (P3)
1 O/ i4 Y' L5 S0 i0 J2 D
: U, g5 o! S0 h4 S9 ~2 ?Package(){1200, 8200,
7 `7 P# L# L  L+ {" o  R10, 10, 0x000C, 0x000C}
) n. V1 ]" r) ?) a6 k// Performance State two (P4)) m' ?8 p/ m# t" E4 |# ~$ K

/ z  T% D/ C$ r- v7 T( Y# j& D. Q}) // End of _PSS object% ^6 G! ]6 o" M, a" b3 X

' O7 B- Q8 Y  P  O2 m另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。! r0 C# H+ }& n$ L
* j/ N) K: i2 ^, C' z* j
l
0 }2 y$ _1 h  u
_PCT6 R2 F: u( s+ M/ ]0 z

' E8 l6 l& ^! S$ V# o3 k$ R2 Y% sPerformance 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的方式来进行。
. t9 A# y* M- y6 a 7 k* F& G7 J! Y& B! \
Name(_PCT, Package ()6 K; B! J( P( m" B) p' k" k6 @
// Performance Control object
" Q4 Z$ X0 A/ P% L9 D7 l
  u1 [/ c; Q1 S6 {" Y' n! A{ * Z, ?3 ], m4 [. \

+ ~3 s3 D. L4 ~2 s9 q: q8 U' NResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 ^, V/ }* ^# K) x, p& f( C! }; P// PERF_CTRL & e' G3 H8 u5 `" B
$ U7 Z9 P  m1 Y( W( x
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}' ~3 `( M9 w4 O9 F
// PERF_STATUS
! J% ~6 f7 o5 m! R' H/ Z  Q2 c
5 ^- x4 c* @0 E0 b% m}) // End of _PCT object
, b+ Q* d" [  y0 |. ]$ ]! l8 {$ b2 a 7 i& i1 }: Z  P/ [1 t
l
% N- n7 D$ f" p/ y' C% U
_PPC
% k3 M+ r* K/ _. q$ o
* U& b7 c5 q2 x" rPerformance 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。
) U! t9 {* u& f) x2 w , ?# n7 f) ^' g
Method (_PPC, 0)+ e7 O; I# `9 p) r( K' T
// Performance Present Capabilities method 3 E, m1 [7 X$ q: k
1 P" [. Y5 j. G7 T
{
% `9 x( ?1 O0 R: i6 r* v$ x( m
! |, S" ^) ?. ^9 I7 X' ~If (\_SB.DOCK)
) T, {+ u0 F) @) i9 a# A
7 W0 J4 h$ U2 H6 o{
3 c1 K5 d4 k& J# A9 [7 p* m7 P
" {( H- Y3 \% n+ ], tReturn(0) // All _PSS states available
1 V+ l4 I8 U" m$ ]0 a" M: b- n# _" n( h* R- h- ^9 i

: }! \$ X5 s4 V% H. ?}
1 s# {: L3 j$ P; l; e  u. W, S( X- e& f* y3 c5 @- H
If (\_SB.AC) ; Z+ p4 l* `. `+ j( B5 u
# O# i3 r: r. t# K& i
{ 4 E# d' f4 o0 f/ R  t1 x
- I$ `% c, i6 L- U  H  I
Return(1)
% W6 G! q0 i' m& i) I2 S// States 1 and 2 available 8 ?8 S+ q1 [; N3 Y; q# R# e

% k  }# ?" ]) ?* M( C4 r( }} ! g/ A: D# z+ ]: v; v# q
/ w: x9 f( v, t
Else - L5 e; o% k# e/ ~" O( ]
% K. O1 l- j) t7 B
{ ; ]9 c% d  M. S9 S& M: M* x- F9 Z
9 h+ o9 Q2 D6 N- P% y3 M4 i
Return(2)4 C' _7 A! p" t/ d% E: e( l. ^7 v  E" o
// State 2 available
3 ^7 i, h- r: F( l% K5 E4 g' K8 n) ]$ l& f/ m* y3 A
}
( c: F7 b/ w: R  W
5 O5 u4 M3 u- N1 D3 @5 K} // End of _PPC method6 V. ^6 A( q& Z1 G% n6 H. p: |
  s- {! I; g) C# D6 L
l
1 E5 u% D7 E$ C6 M. _. q
_PSD
; k7 [' ?( G2 Y" _! A, Z% R
: T0 A2 [- \! o$ H3 T, _, QP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
# ^& H+ b' g1 x" F) a+ E / D7 A+ d+ b% |$ U& k" Y7 O
REFF:
; N6 o9 Y) m& }/ ^" ~9 I! v5 x1.- ]7 b: e3 M9 Z+ U) a
ACPI Spec 3.0) \. l1 o" X+ e; P- t! Y, Z
2.+ X3 Q- n1 j8 K/ P- X+ W6 h) D# D
Intel Processor vendor-Specific ACPI
5 X+ t: b( n, W0 Q4 i0 s ! E5 o5 D% q( C

  }6 ~+ I' {3 A8 n4 }8 e( TThat’s all!  K) C* l2 p8 C; u+ V  F0 l7 T
- ^# ^6 t8 j# y+ \- u3 S$ w, Q
Peter
  E3 a; e- m6 g( @5 m  X& g
1 f$ s9 Z$ g7 f8 u2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
4 T9 b1 b- G2 z% w; t
% E8 r3 l2 d* K% y3 n* ~9 }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工作时间的占空比)的方式
& g' J4 _5 u8 E; e. ~. Q* _3 n,影响系统的功耗和温度。
  s' D3 Z+ }+ L# V9 j: ?4 \0 g 6 A" u+ o6 X* }  J
2. T-state Control
6 R; ^) z2 `% s8 p
' d7 n" m, E' K4 `1 s1)
1 Q" \6 Z/ K; k7 p: ], GMSR Based Control
9 S* |% q( a6 z# H
: L1 k; }' z% Q: u: q* o0 J; O1 sBIOS可以通过IA32_CLOCK_MODULATION去Enable/Disable clock modulation,而且也可以通过该register的bit0:3 设置CPU Clock Duty Cycle。当FFH在_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATION做T-state的转换。
) _) Z6 o/ f; O% ^! f
8 L% j! t3 x3 Q" d, w( f2)
8 h% l, m! ~" M* e$ rI/O Based Control
3 M2 o  a1 _) S: U$ l 7 v, r: p5 f* W. F( H6 \
除了基于MSR的Clock Modulation,新的CPU也支持IO emulation 的Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock Modulation,OSPM将会通过PROC_CNT register bit4:0做T-state的转换。" p9 _8 n0 H8 N% k) `) C

0 Z/ ^) O0 O/ N$ h0 M3 Y4 a3)6 X+ m1 l$ ?; H4 {, [
ACPI Structure For P-state: r6 k' _" W. G( I+ C
l6 l/ N0 o. w% {+ O
_PTC
+ O2 h% f) {/ L+ d & y5 g- I  X, X1 d
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
( Y: P; S  R" T3 M/ p( o, A6 B
! F5 b7 C- ]  j+ I" U" WName (_PTC, Package() 3 r. F7 f4 {3 K$ D1 O
{ 3 {* C( Q. o% F9 c9 K2 A2 U
; w  o' j" T# p
ResourceTemplate(){Throttling_Control_Register},
& G' |3 m+ Z+ X3 t: a$ s$ a+ f8 v/ |' h//Generic Register Descriptor
1 }& ~3 v" i# u/ T
3 h$ `9 A8 k# z% vResourceTemplate(){Throttling_Status_Register}$ A! T9 n+ o/ {" P7 N
//Generic Register Descriptor 3 E; P1 U, W4 b+ L1 V$ b; w
}) // End of _PTC* K/ l+ x- r$ r0 @! c

$ h4 C6 N0 g% H0 ?+ m1 {) {" L& a下述是一个sample code:. j# c9 M- P% a" H

# X' p) x& b" L# I8 V: s+ D+ }, [4 Z* _% g' Q2 M5 ]; b
//
4 J! O0 B/ b+ @/ g9 A* R
: h' k1 O! W/ c5 E1 \// T-State Control/Status interface! Q# V3 P5 r0 `/ M
; G6 K3 t/ ^' @; q; w) v0 `6 M, n
//3 [: u& d% I" ?

: ]5 z9 N' C1 [5 G' s0 R$ c; |# BMethod(_PTC, 0)4 D! a7 r2 O# ?
% |# B2 d) ?( G4 R) c
{
; ~( g; _3 ^/ ^8 a% [6 U& V0 B/ f6 U/ l, n8 w0 P2 d$ n( \1 [
//1 k( F: b7 R* j# C' }& ]; y" t

/ T% k$ t. }. J: |// IF OSPM is capable of direct access to MSR) j& I3 |+ g: S9 l9 H
. x/ g- I( H- \7 h* h! V1 p
//
7 {, K3 Q! M' ZReport MSR interface! p0 w% U4 |9 v  h) J

7 I6 u0 P2 B2 d# C+ G  @& t// ELSE7 Z; e" v0 N; V
) G5 H( _/ p" Y7 ]8 q( Q
//
! c5 T1 \3 J# P9 \* t$ U1 ]. DReport I/O interface
$ x' U5 K0 G& E: `4 ?
2 x0 ]9 C' y: g. @3 h' _//- X) ^5 l9 P. ^3 W; T" q
. N7 \9 Q4 ?4 R$ H
//
4 v1 |2 R% W3 m% kPDCx[2] = OSPM is capable of direct access to On
7 }( b0 ]' Z" g( f9 C( Y9 q2 Y- i1 T
//. L( [+ @$ f: v; |+ K& ?3 C6 ~
Demand throttling MSR- b5 V$ h; G( X. g# H2 N6 K
2 l1 S* }9 `4 h, N: A+ _2 n$ j' @
//: |5 ^! Q5 a8 H0 Z6 R8 @/ d9 t7 `
7 ~1 O8 {# M  ?& u- r1 q
If(And(PDC0, 0x0004)) {+ ?) {& [1 b) ?, a: E
( \9 y9 C/ V; U9 B, U
Return(Package() {7 W0 w; d: U' e# S6 U5 y
8 F' P; I+ u  ~& t4 K% W+ f
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},: K' u' n/ s3 F" u/ _
/ R# j- W) @5 g) H0 ?* ^
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
( o' j! x' M4 j/ X: Q: `0 D  w
& s) q" ?" Z+ y})
$ [2 F# W9 ?( A. w0 |. G5 H, F7 u0 l1 O7 I* ?
}" m1 F' y1 o8 p" D7 v1 p0 [( [
' y1 b8 s/ A5 m. i
Return(Package() {8 `6 z: }, z7 x+ r! F( i
# C/ j6 W: ^  {; U0 F+ \+ l
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
0 V% {$ g& F7 @) O( e7 W1 X) {9 [0 Z% Q. D" \. j
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}- F6 ^+ t' O5 s; U1 n

1 n8 f+ ^% j  m}): J% z. r; m, Z4 L

+ U9 q5 z: W- U}
# K* q4 n- |, {2 {. S1 j4 O4 u
4 A( _# I+ V, N6 ]8 K' G* [+ X$ Y
4 B1 o- `9 ]$ f" Z# F5 @$ R
9 k& W( O; s& U. s4 G4 b1 jl
2 c" [. A2 z4 E; E. D( r
_TSS( p) |5 ^: d) k. F( e7 P% A+ n

, J# {# M6 H' L& c. YThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
1 s3 [7 K  E9 ~; gName (_TSS, Package()
+ A) d6 |( `" k; p- ~{
* F: n$ }9 N! Q1 ^// Field Name8 P: ~& b9 _1 n8 U- }
Field Type
. R+ ^# l5 m! ?( z. g9 J( n. @4 k5 Y/ _, O2 f/ _( X2 }

) O7 I: }3 h$ b; D' ~2 n8 p, a+ J% }9 H) }  y, i2 @. N
Package ()
) \/ W, y- p) P5 F& e3 x// Throttle State 0 Definition – T0
, T* g/ |" p) I3 D. u' W
5 c) Y( N+ I5 r. W3 j$ O& D; @{" i' L" t: k+ e. {: U5 ^
1 Y9 a$ D7 O% y) `6 X. I( A: T7 }

+ _0 M. t. \- y# Z  K6 P. `FreqPercentageOfMaximum,  f2 j/ F4 v, `- a! Z
// DWordConst
9 G% m6 u7 B3 w! M" d) v7 b8 Y& Z8 l, C4 ?& e
Power,' }2 s9 K* y- `: E
// DWordConst
; H4 a2 W; R0 P' i5 l) ~# V8 X" e
& S) ^1 a. ]2 D$ ATransitionLatency,- P, n6 D( E: e
// DWordConst
6 B2 O' m1 c; ?0 s8 j3 R. J: d9 G, w: d* \7 I* }& U4 O! W
Control,/ }! `+ O4 E7 R7 K* k
// DWordConst
0 x- F; d3 ^& y! [3 d3 R" O3 j% A' z3 I
Status' m- P& T% `2 J( t7 d
// DWordConst $ Z; F; Q4 q( `& @& r3 O
},8 ?5 c6 @* T6 R' F
……
# K3 V: X, K5 S3 v. f# N}
9 S4 Y. m9 h  S( B, Q
, P4 A& K1 p1 l) f' X& t, C# kExample code 如下所示:* g" I7 r' e3 M/ v$ @
" |/ b0 d- t* Q  _, ^, W
Method(_TSS, 0)
2 \* d: E# `# W  z2 I2 U7 V: a7 e( y3 X
{8 d5 l* w, u1 E/ s

- h0 V. S& Q- @: o- s- UPackage(){100, 1000, 0, 0x00, 0},
5 N* n8 H& U/ V3 ~  p5 V: b
4 ]# }; e3 }8 l5 J5 n# U7 ^Package(){ 88,
, w0 h" p0 z) B( O875, 0, 0x1E, 0},
( h0 i- |6 `2 c2 B
+ \0 h, P& n& S. h( Z: SPackage(){ 75,0 O8 I& X, ^- S) D0 n
750, 0, 0x1C, 0},8 g' A: s: F; q2 H" r
, S! y5 H; W( _1 G0 R  u
Package(){ 63,8 A4 N' q% @+ f" l% f/ X- a
625, 0, 0x1A, 0},
; i8 Q! E0 ]( A& s! ?8 M/ @
8 C. W5 e9 O* R! c4 tPackage(){ 50,
+ P& X0 x* t# j; P7 l500, 0, 0x18, 0},. i+ Z' Q& o+ m
# H( n) U6 @+ U
Package(){ 38,
& g# Z( Q4 V6 q8 K( v375, 0, 0x16, 0},0 C6 }$ a. o: Q. O5 L& C

; h2 n- ^6 N+ K- U3 v0 y; I0 P1 W. qPackage(){ 25,
, w# ?  p8 D: O( `+ [3 F* c3 b' |250, 0, 0x14, 0},( A$ ^7 E% d7 F1 y4 d# [( p
* C' h  F- E. S0 h7 c; ?; i
Package(){ 13,
; b/ _  H5 M2 \. K7 u125, 0, 0x12, 0}7 A8 W5 M; r3 U1 q# Z  ]( \
* t' m/ h* U1 v, P2 j# x$ c5 n
}
6 e4 ]( ^9 q2 N/ {! c" f* O: H9 s! J. s5 U* }1 j  Q% M6 I

8 F, d7 L# R) R8 ?' Wl" f, p1 Z4 ~' H' h
_TPC" D$ v2 R' x# j2 R4 n
; F, y* D. ~* H5 _) G9 F
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states,0表示支持所有的T-state,1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC。  |3 a' f5 ~% P) M, x8 W) i- ~
9 t( N6 y: u6 M% R% H% s
l
2 P: j" u- E' |" y- V
_TSD
, Y$ ~3 G' R& G7 d 5 O5 g* Z; F9 T" g# Z
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code:
9 x7 }* S4 z# k  _9 z# ?, b, @
6 Q$ @7 [7 ^% y' s* tName (_TSD, Package() * t3 d! p1 `, p9 ~8 s2 A% d

* B4 d# P% ]) P% U% _{ / d# ~; j) x! I. Z  C# B/ q
) @4 ^( J7 X1 F; t# R
Package(){5, 0, 0, 0xFD, 2}3 q5 X- S5 w9 r/ N0 E4 \, B
// 5 entries, Revision 0, Domain 0, OSPM   V1 \1 ^: H2 O' p, E" b5 S
Coordinate, 2 Procs
6 J  {/ g& o0 w3 |( D
8 O+ U& D% F) a9 w8 U
4 T4 G3 D) R! s" G; Q- G}) // End of _TSD object
, W' w- Z% M+ _0 y% j. Q( d. b 7 O9 u* Q0 I6 \# t$ |# e8 |6 E: ]
REFF:
7 M, q% v" P/ R! ~0 |4 \9 Y1.
: o+ j$ _6 |/ O8 rACPI Spec 3.0
8 A7 q9 o; Z8 x7 @2.
1 T0 e7 [+ @7 H: BIntel Processor vendor-Specific ACPI: Z. g0 ]6 ]8 I6 i2 w6 V8 c8 \

' M5 x' K# }: x! V' t+ s: Z3 d* T & z; x. S! t# ?6 V% ~( U
That’s all!
3 b: C6 `; d# c  O- [+ c : e: v" K6 x0 w& f  I0 A
Peter
2 ^+ u9 ]  X/ J# y% O& k3 a
0 i5 r2 o+ H* }; [2 X4 M! F2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:43 , Processed in 0.059342 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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