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

CPU Power States

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

# {# w- l) d/ G3 E2 d1. Overview
# f1 |* c6 l& y7 O4 o0 C+ T4 t& D8 P1 P

; E  w0 ^: e  K& lC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换& ?  `. k& @3 N* m" A
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看( [: `7 A) ]) ?9 l# }: Q' x
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。+ A3 D4 S& z# R: ^

( ]# i. i1 _0 t; x
cstate1.jpg

! m* ]/ B% E- o9 }
1

% V1 Z0 u) G% I  w$ S# H3 y5 z  x6 k, F2. C-state Control
- S* m) E# Y; r: y6 o2 l. V5 x: O5 L
1)% y  A4 n6 S$ m1 w
Detect & Enable C-state# K1 l0 _- A7 [3 D) G

$ Y1 b4 z# L! ~+ t7 jBIOS可以通过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的支持。5 C6 `& d# d# f3 w. ~$ h2 H

1 K1 g( O, _" ^" a* F  }2)
' x/ I7 ^2 d4 R& [" A: ~( l( dC-state Basic Configuration
, j9 q0 O( K, q+ R3 \6 p通常情况下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)。( V: ^! t9 M( ?* s7 q1 b

( O1 I% L% e0 L3 z8 i1 c3)8 T5 u6 Q2 _5 n, y+ h0 h4 U  w
ACPI Structure For C-state+ h9 B# r+ ~0 H' B' ~. t& [8 O3 @

2 r+ J; R2 w; |6 |' r$ _l
$ d4 l) K6 Y6 l4 `4 m$ d9 k* G
_OSC & _PDC
; ?# ?! k- r5 ~* y: b_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( z* @& k3 K' I2 L& H- t% t& Gl
# m# `& w4 {2 |- s# r) x
_CST
" @6 }! K1 r. S/ D6 \_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:0 ?* M7 U# s2 E/ j
CSTPackage : Package ( Count ,1 F+ \) v, X' ]3 K# s1 q- Z- I
CState ,…,
9 b2 G$ J# i. U' ]4 h  e' vCState )
3 g1 F& e0 ?3 L# Q其中Count表示所支持的C-state的个数
/ W, q5 r2 G, c! jCState: Package ( Register ,
" ]  Q& Y8 {0 e  NType ,: S3 `0 t" g) p- N% |1 F: U
Latency ,% i: |0 s6 l: S3 t* n" F+ a
Power )/ p9 u0 d5 L8 p3 l, K1 h  w. @- J
+ |0 n; V; a2 g4 u. w
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
$ F4 B) I* K# e- j
! s; `8 Z9 I2 x8 C" o* X; _Name(_CST, Package()
+ ^* X5 y% R( F' j# ~
# d1 e; \" z  z5 W
{
# B* ]) N' `! _  H/ |; U+ ~' E% [4,/ M1 q) b6 P3 e4 H$ P6 r
// There are four C-states defined here with three semantics
, R$ p. D4 v4 T( T
, Q. ?+ g  l4 t+ Q
// The third and fourth C-states defined have the same C3 entry semantics
) n! t1 J1 K; ]: {9 G
! ?7 p  W9 X7 g+ m! S
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
* Q" A( m6 _8 |9 v1 C' \: f1,% U+ ^4 ^& {' h. C
20, 1000},+ y1 L8 A- Y6 ~2 J! C
4 a  I3 q5 C! L& u9 ]1 v! @. x5 H& W
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,& C3 X2 a1 X- `' R, R3 D2 M
40,
" J5 Q  D7 a9 Q. J1 i8 a1 n750},
& k/ k, j" }1 J& }) ?- f
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
# W! ]1 U( P( k3 s; o  v60,# Q  x, h% G3 D) h
500},
  I! ~! r% m* j! ?
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
: L: E# Q5 G7 G  Z250}
( `6 W4 h- \' M9 @) @, c

4 x- d- v2 i3 ~, Q6 S( a})
3 c7 i8 V, I0 C+ u3 u1 r9 }1 L4 f9 G: Q$ e3 `1 V; W% X; u+ v
l
4 |* p. j8 U# M) J6 S7 v
_CSD7 A# @$ U) v+ H. u( H7 }; B  T
" R' O/ R1 U: u
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
! _8 p! x) `# N5 W; }! b$ ]& }6 Y! [- B0 z

; V9 c. P/ g; t) ?+ E* E  J
( ]% T3 n5 l/ F* O- P
! n) ^9 g1 D# E3. P_LVL VS FFH" d; q. b' Y) k+ o6 z& Y+ H
7 U# l: c% k& A- \: X0 d' e
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
( A, I+ E4 F, P. j/ R/ nFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:7 q0 U( u* i$ e+ P0 S) E5 ]% e
8 ?. G$ ]- ^. o0 e! h
gas2.jpg
# ~* x, ~* L* n
2

  `  i# f7 A  D7 t6 y" KOSPM解析到该_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的一个例子:) G+ P3 G" R: b9 t; g
Name(_CST, Package()  U, I2 Z& h9 D- M

- {, \5 k. r! R{
9 d  v, U4 F8 B8 c2,% T& T6 e4 @( D9 H+ n9 D) \3 H
// There are four C-states defined here with three semantics
& q4 W6 N7 d( b4 ?( p" N, Y

5 |3 o0 L3 L6 c6 b, c( K4 _+ E) h// The third and fourth C-states defined have the same C3 entry semantics
9 N3 X% ], {& j/ V- n) n& h4 R

4 E- d0 c0 ?  j: Q' C  {  \8 MPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
1 O) U6 _; P, ?3 B% @0x01,: f+ W* H8 d1 B; n6 e" T1 \0 d
0x03, 0x000003e8},( J) L8 P9 D6 U9 i- k. y4 X
% m' k$ v( M0 O# W9 r+ d% O
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
- s( g. \. a9 {0 w" O0 `  M1 f$ c0x01,' e3 |3 c# d' e0 h/ b
0xf5, 0x0000015e}

) Y$ q7 a/ R4 ]+ c/ }* f! c}) . ]1 P$ C8 ]- v
6 P( Q8 d  m- |( g7 p
* R, |; o$ d$ n# h1 S) B
REFF:
( l0 z9 R$ |6 \/ }1.) V: H, Z( [! M
ACPI Spec 3.06 Y, R: A/ H5 O- [0 r* f% j
2.
7 V( n/ {- V0 M2 @  b- Q0 XIntel Processor vendor-Specific ACPI
! q7 S5 C( R" S0 ?& W  [- T. x8 B/ i- d. {( e
3 B% B7 \7 F8 i( V$ [% C
That’s all!3 d. v( w* h) y( v) S3 X0 q. f
# \7 t( x1 e1 [$ Z
Peter
9 s6 h% C, ?+ M  j1 |' r* O2 G8 N8 z$ S# c, n2 o  e6 J/ M9 ^  J
2010/9/20
/ D5 }8 M# v$ `( [4 W( \* m' R
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
! K: ]. X) S; u+ a 2 m* p" S  Z4 g
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
- D# r3 X$ c, K- ?% \' @5 }Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
: I, V8 k" V; I, X0 s% z
$ d7 b% i8 a; K; x' }2. P-state Control  p3 u  }/ L& ]& D9 D6 @! v2 r, ^
  }3 b6 Z7 s, D4 n1 L
1), n, ]" f; i) i+ k3 ^# F2 O
Detect & Enable P-state" E! u4 p0 {5 m# G( q

7 n/ K, K3 G' h* g6 WBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state" m4 P& {" N! s- \* z
+ J) u/ H4 Y2 \7 R' ?5 x) i1 O: m
2)) }* O; J* S5 O. {; o% K
Supported P-states
3 E) ]" G# E! H; B) B3 C 4 ?  y. u8 }$ }" o# p
BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) MaxRatioRatioStepSizeNumStates,所有这些信息都可以通过CPU MSR直接或者间接的获得,其中MinRatio MaxRatio都可以从PLATFORM_INFO中获得(不同的bits),NumStates就是二者的差,有一点需要注意的是如果NumStates > 16,RatioStepSize就会加1直至NumStates <= 16为止。CPU的工作频率 = BCLK * Ratio,旧架构的CPU BCLK通常是由clock gen给出的,通常上是100/200 MHZ。新架构下CPU clock gen是内置的,BCLK固定是100MHZ
5 R/ y- ]& U" L& ?8 ? " _0 r" ^) q0 g* l" J! p; A
MinRatio = PLATFORM_INFO" z" P& R0 E7 F' R
MaxRatio = PLATFORM_INFO7 v' Z0 ]( C) O" J/ h6 ^+ k
RatioStepSize = 0x019 l( O5 W8 B+ Y. ]' I% n6 C
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
0 S; B- T( w  ~, u 7 Y; R' z( \5 _8 m1 r7 j
If(NumStates > 0x10)- t* O; ~3 o7 {7 i  T1 e
{
( y; f% z# w. Q  _4 `5 FRatioStepSize += 12 P2 u# Y( T, w, ^9 v- o
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
- y( j" U* I6 a4 M6 U0 u; B+ K}
6 ]9 r' @* Y4 j+ C' e2 l
' Z, V8 I& G* S6 a* q! k3)  u# K3 p: U5 r) g) g5 m4 M7 \
Turbo Mode
$ s4 a9 V  u, w% u + Y5 d$ y4 b, `
Turbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermalcurrentpower的信息从而根据这些信息动态的增大CPU以及IGPUfrequencyCPU可以工作在[Max Non-TurboMax Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 reportOSPM,另外Turbo ModeRatio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermalcurrentpower的门限值,BIOS可以通过设置这些参数影响Turbo ModePerformance! R1 \) H9 b4 `6 Z+ @- E+ N
9 R  j  ~( k0 o$ E+ A' \0 y
4)% d( @: f/ n8 d9 W+ l: N
Over Clock0 r# {3 e2 c9 x! P
( V: x2 m: |, F) k
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
9 g# U6 f: `9 _7 q 2 r" K; Q6 ~/ c2 h; D9 b
5)7 f5 {6 A7 c# d6 B* i
ACPI Structure For P-state
1 W+ j* T; j  B  y
! N. D- S! b+ ul2 b6 F5 F/ `& _. s1 G
_OSC & _PDC
5 \% m) }  c1 C' ]( H8 S
5 h& t7 [6 V4 v1 K- A_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures# _1 l6 ?) _0 ]6 p0 h0 g, c
: D& K+ h/ m3 E( U' u& V! U
l
, c$ T* l: a. W4 i6 A0 b0 M& w
_PSS% k" M! g8 j2 @+ ~6 C* ?& S% d
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量$ ^2 E, j( C% g3 G/ N" 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做比较
7 ~' c& M5 c3 Z* X以确定P-state切换是否已经完成。
  b- F# \, R( s* ~; m
, m4 ~' R/ `% ]% M1 ], X: wName (_PSS, Package() : Q$ r0 I7 Z9 d: Z; {+ S' [
{
& F2 v$ K  y. U9 |// Field Name* ]" i' Y* T" b1 m
Field Type ' B2 V6 o! |# m- V/ [& J  Z+ k
4 W" g% r8 h; Y
- \6 g* m/ d* Q9 |

# c% J8 F$ R: M# R$ O+ M  UPackage ()
6 B6 B1 g# v' n% a/ ]// Performance State 0 Definition – P0 3 c+ B7 A0 h8 ^" H
6 c2 G# I/ A1 g# P% G3 I( F
{1 |( V7 c6 b: b' u

3 {1 g. |4 \+ U* w0 t8 z
0 \6 @# S0 s% _% C3 q& j* `) t" X3 ?CoreFreq,) E3 J7 h4 z& J  s; L6 l' \
// DWordConst
/ K8 Y% j/ X* y8 D$ f1 Y
+ l* i- T1 F+ s! q1 l; }6 D* e2 Z+ Q4 M% o& l; a
Power,- J7 B$ U6 y9 T  l% f7 T: D. M
// DWordConst
" K! Z5 ]/ I' k; ^6 L4 M5 F' s/ F+ ?8 p* K
TransitionLatency,
0 c$ ?, s5 }# E9 x% d// DWordConst
6 R3 ~+ y7 X7 W" X* s5 E0 T
# m) I# r( d! mBusMasterLatency,
: ~1 L0 K& p& V$ j  B4 O( S// DWordConst
4 f6 A& x2 n9 L
* S# |- q8 Q6 u; R& X. Y( RControl,' ^1 l9 t" N& g/ F$ B& E% A
// DWordConst ( ?# R$ i; L$ t. L5 X5 h2 X

' \! m* b$ |$ tStatus
7 W( D" c2 f0 c- q" f0 p  v0 l9 W& ?: m( r3 Q5 q
// DWordConst 8 k; X" k8 x( S" }0 ^
+ \/ ?! W6 l8 w2 C/ S7 @
},
; Y* `' a5 d* `: [  H- p$ M4 v$ }/ k# p6 J
. 4 ]% t6 [" A% h; U

) X+ V* `* T% U7 l. 1 E7 s" b% A" M5 d% ~2 O9 x
/ y4 e* b# S5 O
.
: q6 Y# u+ [4 l4 t}) // End of _PSS object
0 ]5 @* A: C& z" W0 z前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 ; E: ~6 v4 Y9 U( r5 z; X7 l+ h0 E9 `/ }

$ i2 T, H7 e$ t0 c. P8 b; \" i& rName (_PSS, Package() ( U0 z5 R: u6 u

' @. o0 S4 v9 v0 N& H{ 8 d4 h( }; [: K' L
9 H# D, b7 a! j! n5 e1 t, C; r( t( V
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 0 l3 R; N7 Z* w5 c0 s% |( \- w
* Z( r0 X3 s/ y9 X" I9 S+ ~
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
6 k1 O9 D2 U& ?/ Z9 w+ R
2 f' c* `6 h+ s( M  PPackage(){1400, 8200,
2 L) l  U/ P7 _$ d" x10, 10, 0x000E, 0x000E}& m+ e% A3 n' G* K3 V, [
// Performance State two (P2)* |8 D% }7 s* O/ B7 S4 t
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
* F# g6 P. M, k& `+ YPerformance State one (P3)
0 g* G- n5 y! A+ {& i+ X* Z$ T& W! r- v1 N+ b- ]. _
Package(){1200, 8200,, J& l+ n" f8 l' r
10, 10, 0x000C, 0x000C}
& b! o7 e& p  _  K// Performance State two (P4)
8 m+ u3 ?9 D. g( h6 B9 p: \8 ^: T$ \! r; \. g
}) // End of _PSS object
" o% q  O4 ?; b7 b
, N. ~# O  U: |" @  c, O( _另外当该平台支持Turbo Mode P0将会reportTurbo Mode
% @( g/ n. i: \9 \5 ` ) x' K2 J* X( t8 J5 [
l0 U" |. H& X2 O) d/ i
_PCT+ [2 H  ?: q) s* c6 L

0 q% ~  D5 J) ^5 ?% f. @Performance 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的方式来进行。( i7 }# ], l3 R! F% L1 w3 y7 p# t
/ x/ R7 Q1 h( o! v( {' ?7 o. S
Name(_PCT, Package ()& L. ]: Q& h( P
// Performance Control object , u8 \7 b, W8 l# M* U

8 F- `/ c6 ]$ S3 i{ 3 L" O5 Q$ f; p2 U4 K/ |6 c
+ V  ?6 _$ v7 X/ y: [
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},0 d# d3 m" ?3 C. z$ _( z/ Y
// PERF_CTRL
) p7 E+ M* U# c# l) |5 ~' t; w, {# b# i8 X* e4 H1 o1 z% }; @7 {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
5 c1 h5 U! E4 h5 c2 r8 |" }// PERF_STATUS
# o6 i4 A" \3 h
2 J* y) F% E% u" [4 l}) // End of _PCT object$ i' Y$ g- c, U' C0 M8 b# e

/ G9 B$ N3 a! d& T6 v$ El
- d- F( }  \3 Q1 l0 a; P1 a
_PPC
: x9 N, @$ r! B
* T) b5 z7 x6 Z; `) oPerformance 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' J( V3 d0 _+ B% M: v# Z
% T9 G8 w" b! ^; ?+ A4 q8 P# g1 m
Method (_PPC, 0)
2 ?4 I- r" {. Q) b& o$ c// Performance Present Capabilities method 9 h  h7 u3 O; K" B$ |

9 j. e, q3 z0 H0 a) F{ / w( p( a: C) c
4 y  V5 H6 Q, d9 k1 m5 d
If (\_SB.DOCK)
- [- z$ M4 f! P" K$ b- j4 o0 R; h, _
{   T6 R0 U  B4 K

; G: \+ N' i! |- j7 N' f/ kReturn(0) // All _PSS states available' @5 W' Y( m; |, r
2 Y3 ^8 L) e+ c+ n
7 R$ e  I/ d6 h0 v6 p5 V; L  u, c
} 1 l- s; V( o4 a
" ]' k3 _. C5 l* ?6 a$ \
If (\_SB.AC)
' s4 M) k4 O/ R& k5 Y
) K2 P& O" p) G# r1 w{
' |2 B# p7 y+ b+ `- |2 c# C# q
8 `$ T4 |+ n8 J" K- [' X1 gReturn(1)
0 D& C, P1 C8 g. R' F6 C// States 1 and 2 available
, O% ]7 w* h& _$ v2 w& S, s3 ?4 f& o" D
}
: b( Z) M- ^0 H" ^( Q
, I$ e0 \2 j  i* u* u8 S- }Else 2 W6 M+ a% T  w- t$ S

$ z& _' Y9 ?6 F- n{ ; w5 D+ h+ I0 R6 k. A7 j8 ^
5 y0 L$ N, A! L( d
Return(2)9 g9 ~7 P6 n# b% M' I3 k* }" T
// State 2 available
+ s/ D$ @- B" E$ ?, s; M6 B6 T/ f
} 0 b" O$ o" I6 j4 e
+ _: P* d! Z+ U' f: l" ]
} // End of _PPC method8 |9 f% G! }* P/ R5 d' i

7 r4 t0 |' E# q1 Yl; p  y( c( a. `- r) e) o
_PSD
' g. N$ }4 b' b* S' g; Y# Q4 f3 z
- U6 {9 u- j$ hP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
7 w/ _6 `2 w+ U" C- e$ e
6 L) K$ v* H( x/ o; }# \, H' s1 xREFF:
  |. U& j2 H9 m; `4 p. _1.% Y7 u  _% E. Z/ G
ACPI Spec 3.0- U. Y* W1 R. I7 a( C9 D
2.
) z7 t7 a* v7 i+ m7 ~; Z" {3 }8 e0 X# nIntel Processor vendor-Specific ACPI
$ {7 d7 J% a+ t; z7 k: q
6 J* N+ g2 m( `) ~- M 6 N. b+ ^- ^: V  B3 S2 ^( C' H
That’s all!
3 K0 W: J' u/ s5 u; C1 v
1 F" z* v5 P) R4 q" h0 zPeter
. `: S8 _2 L6 j
" y; @3 p5 t) S2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview8 P. m* A% A: E' g! _( [5 c

- J1 C( }9 n- {; K2 FCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式# q- V2 i& d7 H7 `& v
,影响系统的功耗和温度。
  l1 e9 h' f/ C6 c* a( T( D! A
/ ^( i$ j) d% T1 |6 n2. T-state Control2 U0 \2 c- H7 W6 }- W  u
6 P  C. N1 F+ R
1)
; R+ }$ v& p# P2 sMSR Based Control
- x  F! B2 ?0 z! Z
2 \6 v- c- g4 h' R6 p% S4 e, nBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
0 O# e" D' u# d* }
& w# O% |* D- v2 V: U7 v; \2)
! O/ ~( z& _) r1 UI/O Based Control
6 S0 }) i, v) i
, U- n# A( m) F# v, Y- r- u/ T5 N除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。* k. Q* `: X6 ^2 h; j
1 A% e9 e6 z) S3 n! P3 V
3)
7 v# j& x% e5 V# G. }/ KACPI Structure For P-state6 Q0 d( n4 t! H6 R0 K
l1 ?% B0 R# ~( L" T6 o; ?, n
_PTC
$ @! M/ s6 {+ N# {- V
. p9 r7 {! Q+ X( h  h! CProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:- h5 u1 f' l. x& s
6 F) e8 i# @$ r$ f" P
Name (_PTC, Package()
0 s! y( I( T; d" X5 S. Y{ " f9 l/ X7 ]2 r$ G- q
( M9 d- [  A6 Q! ~
ResourceTemplate(){Throttling_Control_Register},
  R8 W9 b7 \9 y0 Z//Generic Register Descriptor * H& ^7 I. s' ]  ?( G

2 r7 x2 M8 F% A! hResourceTemplate(){Throttling_Status_Register}
9 T( d# p- w2 {) |# Q- L//Generic Register Descriptor . P+ ~) U+ c1 Q! `7 o
}) // End of _PTC  }- b; g( K( F* R& D
) m2 n- A# ], F3 q0 S4 Y
下述是一个sample code
0 F" K% y# H- f
4 N* W9 b2 a3 f) S
; r' G, _* A7 d' w) G8 Q% I
//
  {% n) x- t: S; N* z$ ]& \2 D/ T7 C. J
// T-State Control/Status interface& z! A& }/ k* v, K

2 B6 q6 T6 q6 {, M, u. p//
+ ]) D" E0 g5 z: g8 h3 G+ N7 f% |3 T5 B  B; y
Method(_PTC, 0)5 P5 ?. q/ a$ E& ?; O  p
' d! @5 x2 p6 ?" p+ o: r, T
{, ?; T& A* Y# D6 e% M
5 d9 `  Q- _, |8 r% P6 U
//
% r0 L( i4 J9 d8 u' y- n& ~% B2 `$ t# W2 U0 s, C7 i0 g2 D
// IF OSPM is capable of direct access to MSR
9 w, u" c; n( Z, b3 I/ F% }- E" v( j; H$ y* Z" K- @: L
//
& u: I' s1 H; L1 t! y8 ~Report MSR interface5 A) d7 c* ^4 z3 B3 i% F! e

, @% P. _9 h' ?$ [% W// ELSE
$ b1 {2 E; f$ S# m, l; `. C/ a* S5 t' F' d) G/ j
//
- r% U' F/ I; Z5 K6 L1 P& K' B2 rReport I/O interface
  S) V# H/ B5 f4 g4 t: s2 v+ k$ X1 ^6 \3 A7 P& d
//
2 R+ p" ]3 K5 j5 c* r1 ^, _2 o/ p# |1 U4 C4 ?, H
//
, G/ f7 c% S; V4 ?) |PDCx[2] = OSPM is capable of direct access to On" M) A  h& H- b9 B
8 f  ]/ O0 w+ r" t
//
. O9 I4 U9 ~$ M. G3 h' U  gDemand throttling MSR/ P3 n" D# l) _& m2 [3 p) M$ v3 |

$ r( f+ M6 L& L" Y! A) x//% ]/ P4 U) I- b3 p; A. ~8 J

$ G$ N7 X, P* d, u! ?4 ~If(And(PDC0, 0x0004)) {; U8 @1 r2 ~  m+ m; T* Y4 k# i

; c5 J  Q; C$ [) T# y* V; O: zReturn(Package() {
# d  P- w* d8 @( b  e/ ?! ~% k3 Z9 e1 c& L) G
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
! `* t8 N7 V5 m) c$ G* K
% O4 T, {" A' _9 a* C" {4 N; V9 O" WResourceTemplate(){Register(FFixedHW, 0, 0, 0)}6 J% U! @3 R) b. T4 p. h

, n$ _) m+ l; _+ \})4 H2 \% ~* I. `; d+ U
2 b2 K3 m6 Q5 p4 v# @! L5 s. \1 n
}
/ R/ X% x+ K  k0 G8 D8 s3 W$ Z0 G- @. `5 @
Return(Package() {
7 b: i& Z, }6 k3 L, C7 ~5 X" Q8 C+ F0 g$ k2 P& G
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
4 ~9 X6 |) \- b" _* y
; O$ y5 p: {  ZResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
. t5 ~! k5 x5 u) k
" Z7 K: C' ]) o% o8 c! a% n7 Z})+ {5 l  |  U4 u( E

/ p2 B# \  P& {" M0 H}
- n; e' f: l7 t4 f
+ Z# j" o% G4 \% c. Y! R: W5 c2 H
( v. A; C# b" a# e9 |; Y$ C: E* v% i/ s" B2 T! @! j0 `' f
l
! e! U+ `, z) C9 B$ J% T
_TSS: ~; f7 i* |- J8 {7 P& [; E1 Y2 C- t
! M$ W  N4 \( o! `
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
- X0 {- x/ d8 \. a8 l: DName (_TSS, Package()
+ L, ~7 E* p* g{
; ]" V( O% I; [// Field Name
0 [4 L. Y# u6 o+ u% @# z" QField Type % y# M$ k- G7 c) ~# ?; ^* P) L1 g
& `  q7 h1 u- P/ e
3 z/ Z% c  b  q& b& @: ]. N! a1 ?0 y) r
& ~; p9 Q- ~# `+ ?
Package ()
1 e* `: O1 S! v  m7 X) P! V7 P// Throttle State 0 Definition – T0 $ A, ^: S5 g; `& E0 O- c

2 a4 ?( l7 y1 \' o/ f  S  a{: N' h  x5 ?4 O7 F8 R) ^% H

! ?1 [) |+ l  o. H" R8 [
; q( k3 k) R- B5 I% q/ ZFreqPercentageOfMaximum,
/ F: ^% E7 F) `1 I  O* a- r4 N// DWordConst 9 ?7 ]2 V9 D; Y2 }: N
5 c1 `* x( G2 M
Power,
6 [* _9 v' J; c7 }8 v9 e// DWordConst ( k9 H, o+ S  f* z0 p2 r
* ^/ Z- ~5 Q3 K' Q
TransitionLatency,
5 q6 T0 B/ r4 F# v- \// DWordConst
& W/ ]* t2 V# S( e8 e% q3 E+ u. P. M2 p( |; S
Control,
, @( I2 P3 I8 D" u0 w// DWordConst ! `* Y* l2 k! s# S
5 q$ j% R$ g' ^" \- }
Status
( p! w5 `8 K1 o2 x// DWordConst ' [& z. c+ P! O' A0 v0 E6 s5 ]- k) p
},0 c1 ]% i# V7 m5 g
……6 s$ [, F  ^" r
}. ~4 B: p0 o' M. s9 W; V/ V7 A! r! v
3 m( d/ o( V: I3 V  W1 c% y
Example code 如下所示:( V1 v7 [7 ]! Y* v: Z

! P) M) F- Y* G$ B- PMethod(_TSS, 0)0 @" T3 }% E$ ]

# v' ~  [2 E9 r! q{
6 R$ ]) j+ {* @) C, L
8 s0 m, u8 d2 n# @% WPackage(){100, 1000, 0, 0x00, 0},
( ^5 z# x9 b9 H: X
- c3 q; t3 ]1 sPackage(){ 88,; v. E  ^  P( s7 B
875, 0, 0x1E, 0},3 l0 ?+ x8 r7 Q1 c  F
4 e5 g+ Q* w& q- L+ {# I  _: F
Package(){ 75,, w: m4 g5 J' G" W: H9 K2 w
750, 0, 0x1C, 0},+ x3 D0 l- @5 V+ M! R6 }5 v2 q+ q

) d) t) s6 @) ?9 nPackage(){ 63,, T( }* o$ A8 \1 \( N" Z
625, 0, 0x1A, 0},
- K- @; b6 k- y% S2 o$ ~" O( [- O
  c4 Y5 I* |7 O0 A' t- o/ r3 E+ ~& Q6 @Package(){ 50,; ^4 @! R3 c+ g/ g& M( d
500, 0, 0x18, 0},
+ R  a' |- }# Y& a% p7 d8 o
% t6 R" |( _' P& ]: a+ ^" }/ MPackage(){ 38,. H3 ~% E( L3 W4 L, K% n
375, 0, 0x16, 0},
# E+ |3 H  ^7 T* H! ^& l* Q$ ]5 x7 M. F; H
Package(){ 25,
# X4 |  d* e- k4 [250, 0, 0x14, 0},
+ X0 m* ?# w# S% S1 t# \
2 y6 }7 t8 h1 U" T( B0 g* d, `Package(){ 13,
4 F' z# }5 R* B% a4 w6 J125, 0, 0x12, 0}
0 J+ s# B! f, D: Q7 I9 F/ b; J
6 Y7 e  _* }/ G0 |8 P}' K; {  I# f  [* y5 _. e

. F3 ?' c1 Z9 }
5 X5 Y% Z  Z( c/ ?* }  b! }5 El
, G* d! n& q* N" l% @$ G% R
_TPC
' @; D8 T% E8 s0 e& U, w
+ |, P% U) {* X+ @  q6 I' VThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC& V( g" {( ?& L. N
, p7 g- @. f9 Y# H3 |& @
l. D, U4 r1 ^/ w
_TSD0 Q3 _1 e2 u7 U0 _6 L& E

1 t" g& a$ }5 ]" d9 p( bT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
4 `) |9 c* @- l& R4 v8 o
: t5 B' E% {* t0 g* YName (_TSD, Package()
2 D3 ?  l. D6 W
+ Y$ w- L$ z& Q. N8 N{
" a. k$ _# ^, o! e; L/ Q2 R5 Q1 {) x( V( ^
Package(){5, 0, 0, 0xFD, 2}
' }6 ~6 `6 r" Y- Z// 5 entries, Revision 0, Domain 0, OSPM
( `; q0 Y9 V  o8 V) _  H$ ]" KCoordinate, 2 Procs
7 j6 _. }7 [: n# ^' h' @/ g0 w- g' n! K$ k6 o3 Y' n( [

$ O: T4 x# D3 J* u; ?}) // End of _TSD object) T. S1 ^  ^* S7 d, z
/ ~' K4 A: s: r' k6 n/ R: v
REFF:! i1 W7 d/ _7 f9 H. Q. G
1.
3 a% S: F* ^2 n# aACPI Spec 3.0
' T* I7 U9 x+ J; c2.& w5 h0 X1 B: w. {3 e# y  |
Intel Processor vendor-Specific ACPI
# c; h3 k5 g  P
6 [, c, _8 V8 h! _1 [
# z. ]6 g3 [" L/ q3 A4 [That’s all!- x1 @+ C+ a& e1 s

8 i* J' R2 h! g5 r+ @Peter; H' k0 m( k# n9 p

$ \3 }0 T% d1 E; G/ z9 m  x2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 12:49 , Processed in 0.075762 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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