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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
( m% K& ]8 w9 f- B3 U% y
1. Overview
. O! B% r- ~7 ^% k
; X( Z) {$ `+ `" l' }& W9 {! n
$ @1 A9 l4 \- y1 eC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
) _$ ]% ^* h3 V' ]0 ]8 n降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
! \. s2 j9 i7 N3 \; C; N' x7 r5 B比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。- i3 Z, I% ?+ v# i
  B$ U, C3 q* K' z
cstate1.jpg
- X5 B8 B0 E* \2 h
1
& j) U" ?0 |" O+ R4 [6 j: Z5 A9 A' n
2. C-state Control
  ]8 s+ q" ?3 l" Z% V
) Y2 _. Y+ W4 I- f/ x$ K/ l& F1)4 `/ k2 x0 ^7 x2 i. W; m$ E
Detect & Enable C-state
% q3 F+ A: m0 T+ V
2 ?* H6 C3 X& ]1 dBIOS可以通过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的支持。% x: D+ P; Q- p
, {: k( g' I* V: p
2)
  @& ^  T1 l8 y' |7 T- gC-state Basic Configuration* e9 i( x; G0 P6 \; P- i
通常情况下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)。
0 u) W: c, y! c5 j: S0 }
: B# q3 b1 s3 N3 V+ ~/ i. \% W3). M* ]' S3 q: ~. F5 b! \  g6 w# X9 N
ACPI Structure For C-state
7 u4 i+ h$ i; r8 ]  x2 @5 m7 u
7 \2 u) i" p. X. wl
& `7 ?) j+ R; N1 v
_OSC & _PDC
$ t1 Y* y  F5 {4 d$ X_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures$ a  w  o/ U' m/ e; v
l
; f( n$ i9 H/ N$ Q1 I
_CST
3 i( W4 C4 V* q_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
% a. i6 U; b; k7 z2 UCSTPackage : Package ( Count ,
' H& C& a$ c+ P9 U  ?CState ,…,0 M( W1 x6 T0 J1 J$ G$ n! [  H* {7 O
CState )- B3 S8 e6 ~# \, C) _! L4 N
其中Count表示所支持的C-state的个数/ P" P9 H% l9 D1 W6 j& [8 {
CState: Package ( Register ,
( v1 m+ @/ _* R& G( NType ,
6 }+ F3 {) d2 A5 Q' F0 C; ULatency ,
7 ~+ C& p2 t+ v* NPower )
# x& g8 B: f7 G. \/ P9 @3 _7 `& |% t- w) z- E/ _# n' [
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
! i! T: [9 m' \; R
) v& X9 R- i! t+ e8 WName(_CST, Package()' \5 _5 s& h/ f& D% u- t5 e
. ~+ `9 U/ N0 k5 o1 I8 ~4 h
{
7 b) m! H% k$ H" d4,0 M3 @: @" R2 p
// There are four C-states defined here with three semantics
* ]+ i' U) q9 A( g2 F1 k
; l7 y8 ]" M) X8 W/ M' @5 g
// The third and fourth C-states defined have the same C3 entry semantics
7 V  k1 `2 c, G; D
8 M# A& K+ c4 U9 C+ |8 [
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
0 k- B* C1 j* \. n# a( _1,1 T! @* ~/ t+ ?
20, 1000},
; _7 [6 l/ Q$ X; d$ c9 I& P

3 D3 b* U5 t' D! M; ~: E( v, TPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
. C5 l! O5 c' ?* C8 f40,* r8 z. I4 [/ L% ~# K- p! L" V( }- u
750},

0 z* p" M/ B# B/ F/ mPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,+ c) a, X$ a7 c9 i0 Y  |" U; ]% w+ Y
60,  `: E3 L; z- ?; z
500},

+ F/ T! ^9 C7 _2 p3 r& CPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,* l3 I, \& M8 T4 ?8 t0 [
250}
* C; J: H" H5 k: o( R

" s" V: N+ J. B' }  [% B- k& Q9 k}) % G! b, E9 g) l: Q

1 Q" Y  e* n3 f& Xl
* I& K( e1 o8 v! R
_CSD4 |9 S7 r+ O( k2 `1 j1 j/ Z
# M  e4 H2 {% g$ _
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
/ ^6 X% j; n6 L( s" ]) x8 ~: Q( C# I* P( t; N6 e2 T1 i
; z- M/ o+ A( j8 Z" O
5 x. D! t& r& i% L4 Q  {: Y

0 E8 B3 g- ?2 z% s9 J8 [4 _3. P_LVL VS FFH
1 t; i+ q6 b; B$ ?# o7 G1 V# n
/ ~- H6 k& N) @, ], G" U. ?P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
; x+ ~" W" u2 |! n. `. ~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所示:
) B4 ?$ }8 E: h+ r& n6 p: c- f& D5 j% l
gas2.jpg

: C3 s1 a/ Q* }& C: x* i1 G
2
5 k" T, v9 I5 F' x. `# U; n3 ~
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的一个例子:- @7 [9 v2 Z1 ~/ t& g  T
Name(_CST, Package()0 Q" E9 t! G! s0 B& D( k' l
3 V' n( G4 V. }) r; Z: A
{
8 e* M: P2 }9 }  r0 l; y2,6 {7 A  }$ R( ?' J
// There are four C-states defined here with three semantics
) o0 ?2 G4 F# p. [8 i; \. A; u: d; ~

0 W/ J- X3 c' S" a; [6 Z- `% R// The third and fourth C-states defined have the same C3 entry semantics
8 _2 M. o  O: B; B/ N
( T" J0 v- m( Z' ]
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},# X& F4 I6 b4 v
0x01,, f( t" P/ t7 I5 {
0x03, 0x000003e8},
1 \. D; w: v; i0 w- k& `/ `

/ [! q3 S3 D5 r5 ^Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},7 [$ B$ u3 M4 h2 D# I8 u
0x01,
0 v8 L* M' l6 c- ]: k) q8 B" ?3 r2 u0 D0xf5, 0x0000015e}
; g- {. B& W7 z# n; \& n
}) 7 K6 f6 C( O% K: i. V: x
; t6 O1 X/ J2 ~+ J

. F' t# [7 ^* n$ @0 _REFF:
: s5 f' N5 l3 ]9 l9 @8 ?1.& c; @$ L2 A/ f8 {8 t; R! c
ACPI Spec 3.0
; b+ C% O- j& h% w2.
  l3 p# U9 S8 o! LIntel Processor vendor-Specific ACPI3 ^0 D% p% k# l8 ~8 I
! a3 p1 |' s) j
, w$ m1 }; S: r" ]
That’s all!2 v" M/ {/ q" I6 U* h6 i, I2 r/ Y
) ?4 t& x$ z( Q. r; y
Peter( `3 w1 P, P1 `# A2 i

: k; x  @0 k$ W: u2010/9/20' P6 m5 s2 y& a1 W

# j  k% C* G* J& e/ J9 r4 L[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview  i" k" L; t2 [7 J/ Y" L) [7 v
4 c# D8 W/ f+ `5 s+ `
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
, y) ^7 I- \( N: i' m* @% sEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
) i9 s" |7 N9 X! O3 B8 b2 ~" N. v/ I$ O
; s7 t  W, Z( A3 p) s2. P-state Control" O  O" _& w, S4 G) ~% Q: O6 X$ f
  N2 p; Y4 l# s  B, `
1)1 s9 R; h6 S2 l5 r, k9 F
Detect & Enable P-state
5 L, a$ A: h- `# [! c : m8 J- b7 _3 R0 a# b% B
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
( r3 i" A3 o0 L% m " S- M- I" S! d  V% Z0 M
2)  k# ?" @: S% _5 A
Supported P-states
0 x' r; }  x# b/ Z/ X- o + ^* A  G/ ]7 `+ @) t7 ]
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固定是100MHZ2 {  g5 ]0 y9 W2 r( q! F- [
3 C: T9 X* q( j! Z) ^( Y  G' `
MinRatio = PLATFORM_INFO
& P2 v7 ]* x9 p$ R! xMaxRatio = PLATFORM_INFO
7 A+ U5 H* C7 c; v5 y0 dRatioStepSize = 0x01
- o0 C8 W0 P0 {1 u" v- wNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1' `7 C0 S0 p& [4 b0 o

% E3 ~, v" `  h4 PIf(NumStates > 0x10)) ?: I% C' v' J: y( `# Q
{+ U/ e( {$ B: B0 G1 b  `( d
RatioStepSize += 1
2 u" G  _+ p7 Q) F, `" YNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1/ K2 E/ D( D/ ^% z7 S9 R3 ?" w3 E3 k
}
, m  [9 Y% t& Z% ]7 P ) d5 ~+ c; j2 m* z. L: y1 K" q
3)
* [1 n7 n9 Q- `! K( {- L; uTurbo Mode5 \$ e$ C5 a/ ]6 N  v

7 s5 y& a8 u5 j% l  K0 |: NTurbo 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+ n- `7 z5 Z' T3 s* y# j7 p
5 s, o. ?: J$ b( P1 y6 L7 ?
4)$ j1 ]( h9 G: h6 N2 b$ E# g+ n, v: b
Over Clock. a; J. N+ ~, ?, `2 Z* f$ b

& H9 K: W0 s3 W. ?/ M/ u: }某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。) y0 F* I8 f, S4 \) V& w$ J
# `  \  o& E- P: x+ L
5)4 ?, K  O/ d1 q4 N/ X
ACPI Structure For P-state
. K: k' B1 o+ e) s% D( s& E & ?+ h& C1 Z8 t2 C- I% Y
l; R) f, H. K, R: J# ]6 a
_OSC & _PDC
- T, c9 E) w  S+ p2 @
  ~$ x. o/ l2 S7 J2 |1 M# l_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures" X: n4 k* I3 z% _6 c- t+ ?4 L

2 m! e( [) Y) u: I( O, el
* z/ Q( e9 g& y' v* d: P
_PSS
  Z) J: t- K- y  E3 G# O9 EPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量( y# T! P- _2 \, A# W* a
并且通过一个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做比较
/ S, Z: d# H. E% T4 p+ G以确定P-state切换是否已经完成。
/ w+ r" i: [$ S! o! x8 M* ?
" x+ {0 b: b  l# K, W; R* HName (_PSS, Package()
. |3 e: M: D+ Q1 i& E$ y{9 e1 d" z9 i! M
// Field Name' E% g7 L" t( ]0 a0 v
Field Type * c! b! s9 Y* i1 v  \

5 i7 ?! _* `6 F$ T
" {: Z5 B2 k' M) c* k, V; x1 J" O; Y$ i/ d; X  y  }6 I
Package ()
6 S; j% `1 Y& [# D' O// Performance State 0 Definition – P0 3 T! R% t+ R! g& ]; a

& R0 j+ A( j2 A  S3 t8 j- S8 {{4 C+ x$ Z9 W+ K& S6 Y2 G
& [( m) l2 z2 |6 A- T3 Q
6 e, D( h& Y* C' F. [7 }
CoreFreq,7 l+ M* R& L! K9 U  o, B8 k
// DWordConst
3 T( M$ [2 c3 W+ U7 z9 N8 [. |3 [6 _
) `: D; D  Q1 r" @
Power,, w& c3 j% }4 ~9 c3 g
// DWordConst % k3 E& ?  \# K, X
" F1 A6 q: X/ w. W' }5 O7 P
TransitionLatency,
8 \$ c' ^3 q5 Z8 M  H* j// DWordConst 0 X$ T1 o' d, K! U
  U3 }5 p! o9 i: k/ N+ W
BusMasterLatency,4 A( G- j$ t$ R! j
// DWordConst
- q9 \5 d( L: r- E/ I0 g% P! T0 V1 N0 \0 Y7 ^
Control,
- h( X5 L3 I! M// DWordConst
" K: f# Q3 ^4 q1 |$ R8 ]; K7 q( Z
, |( A( P7 w/ J1 |. {6 [& SStatus
% f9 W1 O0 s' _, t, c
0 C9 W( `1 A" S! M// DWordConst
  w- t; J% E0 U. ~/ f$ ]: L) Y+ O' v/ x
},
9 O6 n4 Q; X  Q4 U! ]/ [& k$ N/ m3 t3 a- W
. * M" E3 x2 f  x" J5 l5 K

6 @* I* P+ e" p/ H2 U; ~% ]- x.
. J7 ~3 F) g% ?  s' l, K  |
2 p$ k% D& }$ S( E. ' k7 z7 k' S; |+ w: S0 Y
}) // End of _PSS object/ E, h' k* O- E' O
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
6 I% i. v- U, B0 l3 M$ x
4 ]# u7 E. \- J3 _2 l# G5 j& ^Name (_PSS, Package()
; k; @2 ]' W( l- D: z# a: }4 Y" G) s
* D6 ]: a. f5 v- D/ b: v{
! ~' o/ [8 s! s; O' n: e$ w- u  e4 ?6 D# ?; ?" [5 f
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
7 j+ `" p* F, {0 n: Y2 c- x0 w. o( V! b, |# x
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) $ U, u" j- e0 k8 G0 T4 K
4 |- j4 u, B9 v& P
Package(){1400, 8200,& v% E* ^1 _8 }
10, 10, 0x000E, 0x000E}) h( u1 Q7 w$ X0 J' p8 n2 G
// Performance State two (P2)
# ]* Q% r8 T( L# b. C  UPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
- j' c" d  D4 gPerformance State one (P3) 5 y7 {1 Q3 L8 U% C1 m' i
+ ^6 P& b8 g# x( M0 e
Package(){1200, 8200,3 p8 v1 Z0 ]! O9 k0 U
10, 10, 0x000C, 0x000C}. M0 a2 r( _2 c) e7 O$ `" [. W
// Performance State two (P4)2 B0 E1 G, w$ Z5 m, d( Y1 U

8 F: @$ U  M' G8 E% G3 B7 v}) // End of _PSS object! K2 \2 t4 U+ T" b" k+ D8 D
; @" J4 E/ l% Z, e2 _5 Z: n
另外当该平台支持Turbo Mode P0将会reportTurbo Mode# ?& T( O/ ?+ X7 z8 Q7 y
" L$ U9 n" v: ~; S# Y5 _
l
/ n0 e. ]. }4 ~, X+ R  }
_PCT
2 }9 f# j9 N- u2 C! K9 M
" ]+ u& |; x7 w! GPerformance 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的方式来进行。1 k$ M' Y* r3 p4 L0 M

( u: m# n' z1 E! {+ HName(_PCT, Package ()
( O  i6 E+ r3 k" |' k// Performance Control object & T8 A3 y) Z% L* Y

" \+ P5 f! c2 L{ ) g" B% i0 v8 W
. m  o$ n0 s3 ?  \
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},+ q0 K/ E" E8 z. U& p6 b
// PERF_CTRL 0 A; v# E: i$ Y  l! k8 N

* G! S5 Y) E9 _, Q1 m; X4 q- A6 wResourceTemplate(){Register(FFixedHW, 0, 0, 0)}/ b  t; F5 s$ o( w8 a
// PERF_STATUS ( C# _: q; E7 H

# v. T4 a- O" y8 D) F}) // End of _PCT object" Y2 f  p- V! H6 P" F' G. ~4 |5 ]

1 h* G5 i3 c5 h4 G: `9 S& r! X& El2 L' a2 d' P% U! w4 w- n& ?
_PPC
( s8 P6 k+ q; P8 C
3 A+ n2 _( n4 rPerformance 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
( o, F1 j* o- c1 T+ f4 V# ] * h2 _* M- u, L; V
Method (_PPC, 0)
' z2 i  w% |9 f# m! |* C8 ^/ h2 ]// Performance Present Capabilities method
4 j. X8 R2 i: ^% N/ l+ J
4 n5 N, X; Y  x0 m( ?9 P{
9 g/ S4 v: F( C7 E4 ]2 g" J
0 N7 ]6 A) O( E& PIf (\_SB.DOCK)
. Y1 m  R4 v7 t- ^- F) h$ g" I+ e. {8 x5 {( n" j  Z
{
7 i1 p2 a" V' ~8 Z0 K
3 k$ R5 s0 c3 \& t2 l, p7 bReturn(0) // All _PSS states available
8 w% `- t& e6 a. H; S5 p, y2 d' h) p: \
$ m0 w( T5 ?9 f
}
  }/ R* U9 a* _! I" l
; P) Y/ N9 y5 d" N4 ?. EIf (\_SB.AC) / [4 k- b: O* g1 Q; [1 N8 Y

- e/ Z: i+ K: h6 l" a{
$ _% [# O6 X. B$ r' t  g, p. s
4 P* f3 C8 t; I8 E2 SReturn(1)6 G8 v3 h8 }# M7 ^& f- I; J: f
// States 1 and 2 available 8 M, j* O7 h: Q; Y/ l. ]- q% o6 P
; @7 I$ a+ i( `- K0 p0 W' N
} " U7 h  t) e$ e5 `1 B; t& h

9 B5 V8 W9 n. v1 K# OElse
8 m  K2 T7 e1 p3 E5 n6 i- U
+ m$ W4 n6 ]  A% L) x{
3 ]2 @3 E) A4 q5 g+ [6 Y
0 X" T4 P4 Q. s4 TReturn(2)
, F" H/ l: p% I! z7 d# s" @// State 2 available
8 v8 b& R1 M' w* |, b$ e1 S* ~& N8 D6 o
}
, m+ P) W- f+ Q
# `, ?* V  ^0 l5 X5 x8 _' C/ d4 C} // End of _PPC method
) k5 O- e: O' y+ r/ p3 o
- C: J6 D' A: A0 tl" [8 ]. ]$ u% K1 \8 u5 ?2 G) G3 ?
_PSD" T9 M8 R6 s1 X- g
( F- R2 E. D% {( i' }
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
) E4 `8 [$ `% p# P3 q+ M, M 8 R. s9 p! U* j( R
REFF:
' E- x+ I8 D* Q( i9 i( I, V1.
7 o5 @+ l& u8 ]4 l4 pACPI Spec 3.00 |0 v1 c. S* ^* ?& X5 w
2.. d" Q' h4 Y" z9 ?0 l* G& Z
Intel Processor vendor-Specific ACPI# _1 |- N$ Q4 |0 C: E
8 }$ N7 h1 {1 w. s
/ m8 p" J# Q8 y$ @& u0 u
That’s all!+ s# O2 \# c! L0 V6 n6 T1 B# \
/ x# f2 V* t7 ~) E2 f
Peter
( Z. q+ s" E, y5 ~ / ]% H- p0 M7 Q
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview5 e& H. q' }( }" v1 D
! P, P( c" a# _
CPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-stateT-sate全称就是Processor Throttling States,它为OSPM提供了一种通过降低Processor Performance进而降低系统负载和温度的能力,听上去可能和P-state很像,其实是有区别的,P-state通过调整CPU VID电压进而影响CPU的工作频率的方式调整系统系能,而T-state则是通过调整单位时间内CPU Clock On /Clock On + Clock Off)的时间(也即Clock On工作占整个CPU工作时间的占空比)的方式
# z  D( ]6 M% q& m; V& r( l* @,影响系统的功耗和温度。. Q* B8 Z' L. L7 A2 G* Z

6 }6 Z* J2 d/ P2. T-state Control1 L: _  j" `1 {: m1 U$ q
6 H4 E$ j9 k5 n& q8 {
1)2 u9 o( ]1 o% r2 |! Q6 G5 `9 [
MSR Based Control
( e7 L5 q# C) L( a/ \' s1 B
, C0 G+ _* T( m5 m' C5 [BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 1 g( l* p  Q7 x( Q; [3 O

8 W, ?# \9 z+ u& _. \2)
& c2 c6 G& A5 a  N, x# kI/O Based Control
& J, Q( c( u8 \6 [4 B0 l1 b
3 ?" x$ ]8 U6 b* R9 U/ B除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。: L$ ]8 U( x4 o7 s8 j+ W  X* V2 h

# n2 D% s5 W) E7 Q) C3)  [% U3 B( m, W, @. h6 F: D0 L
ACPI Structure For P-state
7 M8 G& b# M8 Y( L+ Fl" F4 P! n' p1 ~2 A* q
_PTC! @0 c9 z7 L5 w  L4 Z, f
1 w& `: L. ]; E
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
! N  g4 Z3 m2 D5 g; w$ j7 I9 {
  \7 `% \8 v# G8 ~( B3 BName (_PTC, Package() " m- J' W' K0 q8 s7 l# X) {% A& ~
{ , e8 a8 t7 o" P$ H

9 M0 _: p$ Y, v3 hResourceTemplate(){Throttling_Control_Register},
) e0 D7 s: p! g) w7 Z% q+ X//Generic Register Descriptor ' C5 {: H. z2 j9 `' p" H  ~& G  X. N- e
5 A% E$ t/ |( z/ \0 C
ResourceTemplate(){Throttling_Status_Register}
; R  |6 G2 }/ U- ?$ d+ L* n//Generic Register Descriptor
8 W* U9 F& W3 T9 l5 a) c}) // End of _PTC5 Q9 f! Q, v: P  |
" {% @  Q" n  ^9 ~) @" }3 }, r' ]
下述是一个sample code8 H: i9 C% @$ `& D2 T
- _9 Z' r- c" r) J

+ X5 g3 L# u$ s6 r  |
//
4 h# ?1 N) z2 ^! \
) M. Z) D+ F9 Y" i// T-State Control/Status interface
3 ^: Y0 g( u' S( T! i; p
# ?4 @. s' e& h( ~$ ~6 x' C0 a//" a* X  g% ?; g1 u
/ S/ ?* s$ _3 I1 h9 C: ~
Method(_PTC, 0)1 B& v* @- B5 ?0 }& W4 m
( p0 X( r) X! f0 L) ^$ O$ K
{
: F. z* F  v2 ~# m5 c. K  `& ^4 ~( W* I& b" T
//
* h# s2 j+ ^( R4 o+ k
3 w, w8 g8 S( N0 B0 {4 A+ c8 ]/ c// IF OSPM is capable of direct access to MSR$ u: j+ b% I: l, U* r

( e; b* P3 J9 v; l% t" y0 M& K//7 H" i4 d6 t( w9 m3 O8 x
Report MSR interface8 h6 h9 S! `  p) g& N
' a# n" y2 D" _
// ELSE
0 ^/ \- p& a/ F  b  Z* t) _+ {1 a4 k" b1 C
//
0 C8 _( C3 Z1 vReport I/O interface9 g2 L( z7 @( S3 N8 @
3 b0 Z  e" @' K/ \' b' f
//& J2 A, E$ E+ q! [

9 B( o) r: S. q$ p- z& r) Z' F2 H//* ~7 ?8 t3 B9 Z1 H
PDCx[2] = OSPM is capable of direct access to On6 J# Q' B! j& I* Y, M% k7 }9 Q$ ?

( i( i0 X9 ~# M, @9 z) V# |//1 W0 h6 P' n8 X6 ]. ^4 X
Demand throttling MSR  n2 s7 p  G  u$ g! o5 o5 ]/ ~
. x7 X7 R6 P1 r9 [4 ^' j' D$ m
//
4 w4 i$ C" S* o. V) U$ ^0 t8 f6 D3 R, _  D
If(And(PDC0, 0x0004)) {
6 @9 p/ T0 d& }4 w
6 Z* Z7 f- A( v3 p( BReturn(Package() {
3 ~& i+ e2 z/ l7 v
) @8 D/ c- A) T/ i. HResourceTemplate(){Register(FFixedHW, 0, 0, 0)},4 M5 `4 s1 ~" W; q0 H/ a
. q. D. }; G9 s/ ~) m
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}0 I4 g% v  O6 k

: X% x. y) i, y: |3 b1 U})
. m, w) \+ k/ ~- x4 C( ?# `. y: O  ^6 l% Q2 D% V
}! }, m3 ?0 A/ r6 b6 ^
& @' y6 {; `0 W2 r: t
Return(Package() {6 A0 V/ _! n2 \- L0 t  r
7 V7 {" o( Z  [
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
; o3 I7 X& s) |: R$ S* `4 V" U' t' ^$ I% z& G
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
. G7 w9 b; r: y( @
0 c3 E# l' [3 I' S$ K0 M}): Q2 K  k+ g. V. p7 W( ?1 }

) G& u0 ~' x& f4 Q5 f% k}# t8 v$ [) B3 ^, V5 M6 F. `3 p
9 ]/ Q/ B) G1 Z+ ~1 E5 o

1 p- ?" h" o- X  f, C$ ^3 y+ Z" e) Z' O; E
l
+ G9 ?+ u* @. j6 w" j
_TSS
8 C; c3 P$ j; y  h! O# @: l % P3 p4 g8 b! P/ m
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
0 T' j3 J7 d5 r  V& NName (_TSS, Package()
1 ^) r" K* w& [# @- o/ l{
. N8 D* {. Y3 z// Field Name$ F, w; {  G" X8 N0 E8 d" T3 d' W
Field Type - R! z, w$ f( w, _

* g' s& D/ h7 a  a: D8 c4 v& Q
  e+ E# a" l- ~! Y7 G! I  A! m# z' L' n% U. v" o1 E) W
Package ()0 `3 C2 y4 ~; Z; @! G! ~2 s; P, W
// Throttle State 0 Definition – T0 / K7 S% u! A1 h3 x
; V. R+ ]5 h) N% O6 Z
{
* J" |* d. O  p8 g& n2 x4 ?1 t1 c( @, r- j4 N
! S% F; u" Z0 ]( I* j
FreqPercentageOfMaximum,3 v; L) |+ U2 A8 Q
// DWordConst   S# q4 p* C2 a! d/ E. ?9 ?; [! Y
0 t! X9 _4 E2 Z; E) k4 V' D0 }. o8 v
Power,
  r9 X. o$ s# q5 r* p// DWordConst . Z+ Y  @7 s. b) X8 e) F/ @& B
1 x/ u# d9 y7 X3 z" B
TransitionLatency,/ L7 b# N% Z" e- j5 x( E1 I
// DWordConst 2 }1 i5 W0 r! l* i/ G% M- m4 v) R9 u

7 M0 k, h$ M( E- r8 f8 |- IControl,: r7 Z) T- J; c: p! F
// DWordConst # j' l- y4 V2 i
3 X" z. p$ d& Y! ^6 q. h- K4 A
Status8 |0 ^9 d* m6 K( R2 e& s0 g+ m
// DWordConst
+ e7 Y- F. D! ]5 B. C},
0 D. n+ i  c* p& n$ J……, v, x) W: B  K+ f8 Q
}
; K, z8 V. @6 w
: L) l/ V+ t' H" s$ ^Example code 如下所示:3 O6 q, Z; |# G- F
( M5 I, r5 q$ \9 J) t8 Y6 j
Method(_TSS, 0)( Q+ B1 K" G' F  H& j1 h  n$ R

6 h3 p0 f9 z# j- T{$ q- h" M4 ~" w" `" T+ j

: z5 B$ O# {; Z6 s5 t% UPackage(){100, 1000, 0, 0x00, 0},
0 z4 S/ _2 P) S; y6 C
9 e6 y! I* F) |+ H' l/ D* L' ]Package(){ 88,/ J: B4 H; Y. n8 m
875, 0, 0x1E, 0},  D/ J+ F8 V  w& x- p
' Y# G$ V/ q6 z
Package(){ 75,# k# }8 x- A, T) l
750, 0, 0x1C, 0},9 u# S* ]& @9 X" |
$ k/ Q3 M( \  y6 Z
Package(){ 63,
  w, W1 d: N# T4 l% n625, 0, 0x1A, 0},% K  ]$ k2 r6 a6 r# j0 }* ]
$ g" F  ~; ^1 e0 b' X
Package(){ 50,
) O! F' J, a; _/ w8 y- a1 B500, 0, 0x18, 0},
) t; o8 i' `9 Y: s" U: S' w  }2 {: b8 S9 k( }* J
Package(){ 38,
/ L/ c+ s9 @) ?7 c3 Y375, 0, 0x16, 0},
9 J0 d2 i; F# X0 b
& ]/ r" m" C- H9 @: uPackage(){ 25,' S; g; h& |. P: g: U
250, 0, 0x14, 0},
$ p& ~5 P3 d' V& a% ^1 f( S7 r8 x0 q: J
Package(){ 13,0 u" ^9 Z1 a# w4 K9 f5 _
125, 0, 0x12, 0}
7 ^6 g; z& k8 I" ^  k) V3 W; G6 f& k6 t# t( l- X; G# S) q: b! s' j
}7 K# S) n# ]: j/ c( l' O) s/ I3 N1 A
6 [% A% M! a/ O7 B. O

2 |3 K' `1 C$ W3 X3 El
  l7 e, ]; ~- t3 g& i2 t
_TPC, D5 H8 a5 R8 v/ S! l

3 d# P1 _9 Q# L8 v! Y8 |Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
+ p- D  ~& I  e+ ~
6 [+ T0 J. i4 m3 K; u: U* ^: yl9 s0 U4 d" s8 K, O
_TSD2 O( T$ J- b, M% K+ h+ M5 j
2 s7 e% ^7 \0 H5 V
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
, U; e: w& q1 s8 P* D$ ]# k2 J
  h2 I8 ~- I# t2 d( d. ~. tName (_TSD, Package() * c2 X  V" }5 ^1 x/ V/ W1 O
/ Q5 F* E' U7 w; _( b5 t
{ / \# m+ l( q6 t1 A2 ^
# K' K9 V$ N1 V6 Z9 L$ p
Package(){5, 0, 0, 0xFD, 2}
5 e# Z4 l3 \+ ?$ k! d: f// 5 entries, Revision 0, Domain 0, OSPM
8 M4 t+ A$ l* G! s7 V1 ]Coordinate, 2 Procs
6 P* `: C3 W+ S% H: L/ f+ _! f$ }8 Z
' c. ^0 W4 U- b1 d' [# {, |/ K3 ?0 H6 W6 `: V+ G) `9 o
}) // End of _TSD object. G& m% T( ?/ S$ Q

& [+ _" l4 @$ z& T8 f9 ?; LREFF:
. e& Q$ l4 y( ]1.
2 j# i0 j8 D. h, U' `1 M2 wACPI Spec 3.08 J: p. ^) J: h" ^4 O
2.
3 C/ `3 _0 g" m$ hIntel Processor vendor-Specific ACPI
. r) h; m$ s. ^8 Y2 O8 R
" j- S  j8 b: k4 H, m. i6 j8 \
- z% J& |( Z( k* f8 _That’s all!/ M& ^2 k0 ^" G; f, z3 f
, q2 l6 f% }; C
Peter
6 n; ]7 P. z7 }. n+ s, d( h5 i: w1 J
1 o+ L9 t( _. N. U. R/ [2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-4 21:02 , Processed in 0.042171 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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