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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
7 Z% e& m+ p3 O& {. Q
1. Overview
9 O3 T; F. U0 P* c$ j8 ^4 u8 Y3 H9 S" c- [- g' |

' ^; m; U- H; l5 LC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换% `7 b) p3 w* E& k
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看* ]+ ^+ V  _5 D: @/ F$ }6 p
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
" N+ \0 k% N2 H5 I+ ]9 w. O% K. A
9 Y% `, L* l) j# ?3 [. T
cstate1.jpg
2 Z9 u3 z  v" s2 L9 b3 G" c
1
4 _0 X8 ?9 t* p$ H3 b: x5 d
2. C-state Control
1 q. I# R4 U9 B1 R9 N( V+ H% Q+ T
+ b9 S- r3 Z- M( `& S. j! k0 J* ]1)  b' _8 g* ^. G( ~
Detect & Enable C-state& }; s* w. O  F+ t* [5 _! w
: }/ z6 W: W" c+ b) r  m% q  r
BIOS可以通过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的支持。( }7 j+ h0 i0 }+ s& k
. r4 {# y6 U" @  w7 x/ B; ?: r# F
2)( V1 E* s- L0 F& y& b
C-state Basic Configuration
; n* K, Y, y# v6 m& ~5 h1 j$ y通常情况下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)。+ j! q! j& w. Q+ t. k3 t
9 y2 s; _( Z: J- x& |. C& A* S4 i0 b
3)( y/ u" y% K( G, H
ACPI Structure For C-state
1 c$ U, i! m" |! @: g' F3 O
8 W- p0 ]# k6 P" Gl8 ^* F7 B7 U. R6 X5 i+ a
_OSC & _PDC
/ p% u/ g4 }% N: F5 W_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
) Z# ~  s6 R$ E/ e: B+ ml
8 z; P( a. u, W1 W
_CST* I2 u+ E) V0 M5 z9 r! i
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:# ]4 f7 A, ^' g3 W1 H
CSTPackage : Package ( Count ,: a4 `2 f) W8 [5 R/ k, e
CState ,…,% }/ W5 m6 S& J/ k0 ]4 S; B* a5 A
CState )" p. s$ m; s# O7 `6 k0 Y% F& C
其中Count表示所支持的C-state的个数* {9 a; `: ~' }( G
CState: Package ( Register ,
3 _+ u8 t, E( F0 ?! d- dType ,# G4 o6 y8 v4 f6 U$ @9 N1 y
Latency ,
9 ]/ x. I+ P8 O  rPower ). Y1 z! Y& _) @6 i. o) ~4 A
. A+ x6 M" s( D
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
3 U/ s# F5 W7 k. |. u4 B* m" l9 m$ F3 D9 [' G4 S
Name(_CST, Package()
# k( T! Q/ v  S8 B3 Q
" b6 h, G* y& k# o: L8 q( f
{ , T* ]' m  U  M
4,
$ [+ E0 `' R2 \, u// There are four C-states defined here with three semantics
$ |3 M+ e. Q- _/ @. _
) s) e' ^( j$ s
// The third and fourth C-states defined have the same C3 entry semantics
7 v1 _: [' X4 x# J- M4 f; P

! j& H3 H4 G& A8 VPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},. [; h0 Y5 I/ v& v: ?
1,
$ o2 y( J! x3 }, {4 n5 h20, 1000},7 Z7 w2 C, |' x9 q. m
1 ~, K9 s7 v2 q7 J- z
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,( [/ K$ ]3 s9 Z7 s
40,, C/ r2 k1 t1 T8 C) ], k
750},

' J0 z$ H. W5 B7 I2 zPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,, R& ]3 d5 ?3 G- f) M" D
60,; b$ [) n. |  |/ o3 `0 Q
500},
: w' {% ]  c& V6 T( g
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
# w( H4 I7 J1 d; D250}
* S8 O5 ^; \( Y% Q

+ G2 a' p9 t/ S" j& M+ O1 x: J8 z})
+ A- Z) Y, y2 y# E9 t2 G4 ?5 [
, o$ [- d7 J. ^/ B" d# C. [7 nl
) C/ M& c+ @9 K: m( W. }
_CSD% G' J3 ~* q- p  u+ R: |/ m: p
6 O* L2 b" X3 d' |  l3 u
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
5 ?6 s6 ~+ k5 f' t$ p4 W6 _- J
& P' b3 \7 ?$ ~9 E
5 |: q1 ~- p. u8 Z7 Y! [2 u" ^. O
* B! U7 d6 D- e/ e. O
3. P_LVL VS FFH7 B; p" b) J: Z6 X  A- |
+ X0 n) z) k, z5 R$ m
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
2 A. @7 [" M! i6 Z. Q8 TFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:- v/ M  x* I% n) I, |
; D8 H  z" Z* X6 d
gas2.jpg
0 v6 M( N' v* f; Y7 \# y
2

. R. T4 N; \9 f' R4 T1 ^) POSPM解析到该_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的一个例子:' F; y1 d9 j) @3 q
Name(_CST, Package(). Z, ^. \' U) j& |$ _7 q
3 ~+ F4 A  R% x* R
{
: x2 }: p* X' q2,! c# o: ?: e$ G
// There are four C-states defined here with three semantics
  l1 Y3 R7 n' A1 [7 w

, N7 k9 p$ \" v0 L: E/ O1 R# ~// The third and fourth C-states defined have the same C3 entry semantics7 r% [, `( C+ R* ]$ H0 }' a
- S. ~( t& E$ y4 I2 f8 m
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
+ ]  P/ ]/ b5 x3 W1 Z; G0 y0x01,+ @7 X, A1 K+ w9 W. j+ m% p- Q
0x03, 0x000003e8},
- A) T5 _" w* Y# i2 l- j

3 J% D0 ^, O0 ?Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},4 [8 ?% C& l: G3 Z3 D
0x01,2 U# S3 v3 A( {* g, ~! }
0xf5, 0x0000015e}

; s- ?( _: }6 c})
1 o5 m/ a6 K, s- K8 _4 t6 U
5 f/ y( ^" n$ A9 e, z) Y0 Z# d" ]1 z: ^
REFF:' ?; ?2 ?9 ^  W
1.
, M$ z/ y5 {4 B$ `4 |' zACPI Spec 3.02 T" v2 U9 }7 v5 W" Q/ {
2.
7 _, O6 c9 y8 {# w- D! yIntel Processor vendor-Specific ACPI1 a0 T0 R! a$ q- Y

7 L. `3 r2 I5 a5 M
* p/ F0 x* o# M! C# {That’s all!0 v& I  n/ |7 s7 q0 A; ^0 |

6 i2 o$ \' u6 B" ]) g/ \Peter
# e6 Z8 J: A/ [4 c
6 z& P) l& N* g% d6 [; F2010/9/20
# z5 a) E2 Z% {1 z0 v3 b: L, `( Y9 }  D* S: y7 h" G
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview2 ]. _+ e$ o: b9 B6 B
$ V& ?" z( O1 f# n2 P+ O) @
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
. d2 ~* f, G4 ^6 k. C4 ZEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。  G. p: f% I3 u# Q' v2 d

4 b  P& e, J6 I+ b8 ^: `, B2. P-state Control% G2 p' T5 F. a$ ]3 J
  A) i% U) p% f- s: |: C/ \
1). G7 W) r2 Z! T2 i; e
Detect & Enable P-state
! t/ l3 z( `- G  @ 7 l9 r* `# A" S# v: j
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state) v. B2 l3 J- y! Y% H+ A6 p

- x+ z- X: }+ X! H: _2 p* T/ Z& q2)
7 S) ^% d' p) v4 Y. M1 a$ }, A! hSupported P-states" J" ]; b7 U1 v3 O! B3 e3 F+ O
& j7 J! R8 J' m: D& j5 q; n; F
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固定是100MHZ0 U+ O  V4 R9 w
$ \0 b; n* L+ f7 {0 l
MinRatio = PLATFORM_INFO
3 E. ?5 {) u, K0 i! ?MaxRatio = PLATFORM_INFO
5 T8 a1 T5 a! z/ P0 h  b% d" IRatioStepSize = 0x01
* Z  }' e( n5 |8 ]( W% D; Z( |; Y/ `NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1; c: p! H$ H, j* z) W% c
2 @+ H0 h) h3 a- O9 }8 d5 Q
If(NumStates > 0x10)
8 `0 F' t+ v% ]  C{
- D; Y- O, E1 z3 s1 K; V1 rRatioStepSize += 1
" @+ v/ [. y0 N. x* b* nNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 17 r( N! J% ]9 c; a
}) M' C2 [% }2 _. F

8 X3 f2 ~* Z& d1 ~4 I8 ?  x( M( `3)) H* x' {' U. I1 V' |' U
Turbo Mode
/ h% p4 Y2 M6 B9 I ( g* d0 P1 |9 F0 ^; V
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
3 q9 _( |+ M& P( K1 Q+ a 2 i) }7 K' q) P. H( A* @
4)
: u: s' f/ q2 o/ q4 [9 HOver Clock
+ E9 f& B3 n1 x! r0 J& C8 Z% J $ n9 G, u; V& w, i& m& }
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
' b2 _0 J6 c+ e) {: J) g
, E% C1 o/ X* B! w0 _6 f( K5)
& u  r+ u$ d! t$ Y7 @6 F, aACPI Structure For P-state' [" d2 |+ t' D6 {+ m, P+ W

4 O9 L. J7 s  P) J6 L3 ~4 F1 P% |l
8 E. @2 k/ M! I7 R* w0 a+ F
_OSC & _PDC. M" W# |; M# A6 E* G" {$ O! ]

* H$ r' b" H0 s4 [& h  x_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures$ _5 e1 L( u, W/ g
8 \5 l6 a7 ?1 C( J
l
6 v1 y1 O; O) z% o3 k1 \% x- u
_PSS7 o% D! [! F+ f9 K9 D/ l  [
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量, T' k* d- j* ?  o
并且通过一个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做比较2 g2 h5 t+ `* T' s; A
以确定P-state切换是否已经完成。$ |  q& o& a, E1 a- w' H
: I5 @& Y# u! P) q
Name (_PSS, Package()
& t% j) Y/ ~7 `' p$ ]. f- @{# ]+ z+ V1 F1 q9 Z' L
// Field Name
: a0 X3 ^  D! wField Type 8 C$ Q8 g7 e  P2 @, C5 B
  k# y7 _4 T! s: @& J: J
# O' n& a' m: T8 N, C
  L6 s, m0 i, n
Package ()- L; W. |. d$ @9 o4 f
// Performance State 0 Definition – P0
5 a7 `( _0 u( \1 v2 ~7 m/ T) z
; i$ l# \  A$ n5 j{/ O. O% z* h2 H3 Z1 d( Q  b& J
' F) W- v& L6 x' R2 c) w8 @* a4 Y
. Q/ H) O6 R% t
CoreFreq,) P) q: M- d2 s" I
// DWordConst . h6 Y2 A4 Y! r6 _) r- C+ T; G
% q4 F% W$ ^. W+ @5 f0 V0 {

( h- [) M  |8 X- E/ z% e" e. [6 Q! E7 DPower,6 c- z3 i3 k! ~
// DWordConst # j+ X1 C! k4 m( h/ f' q( k6 C6 N
4 v; i8 C& A$ u2 Z1 z0 T
TransitionLatency,
2 s0 B0 a! W! d+ }2 k// DWordConst
9 g' [% R& H% c% k5 \+ H. ~# v) x4 n) I4 H
BusMasterLatency,  r  }$ T! W4 N  O  F4 x4 A) F) M: s. r
// DWordConst * f; @+ e5 D6 c2 O

% |( n/ X! j( J! q3 c7 W( ~Control,0 A+ v2 m5 {& B* r* y
// DWordConst
8 r* {0 }2 I& L* Q0 i$ L: P& ~# y( M2 e2 i; d5 e' _
Status2 m2 \( v: T7 C% }

& J! p! c  ?4 I5 t5 o- V0 h% V! n// DWordConst , h( T2 @, Y$ Z  @  B) |

1 d, F3 \$ T: A; v' A},
2 t5 K) y3 T! H$ J0 _" {1 f$ X+ l
. ( q1 n0 }  ~* P5 l. b6 R
# Q9 b. w+ P; t1 [: ]3 K; r
. ( @( s0 P7 Q" i9 j2 ]
  d/ C& m" R' f% B. Q' \
. . ^0 X* \# i: \% y. l
}) // End of _PSS object
) a& G& Y" }$ ?+ |前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 5 z* J. v* z8 c2 I5 t+ |
' s+ J3 E( L/ y5 `' k8 i# [
Name (_PSS, Package()
6 d/ k! z+ @' K, A' p: v7 _! |3 t& x6 D' \
{ 1 ~3 c7 t) r" p) l3 L1 \) F

8 p  }% N8 E* p8 b2 OPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 9 q, b1 ?' t, P  e+ t
& e/ q( N" q) u
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
* y" M* y. H/ d' ?2 r2 V( C# h4 I
Package(){1400, 8200,
  K) D  M# `3 |' g8 E10, 10, 0x000E, 0x000E}
4 d) d# @: Y) a. z6 o- G' R// Performance State two (P2)8 u; T' w. h. I+ M4 i, G) j
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
* A: O4 u# y8 B0 X9 XPerformance State one (P3)
# T2 z8 K: X0 ^: p( _9 Z
% u# z6 b+ f. E$ rPackage(){1200, 8200,
: p- Q& N2 o. R" A" U10, 10, 0x000C, 0x000C}
/ ]0 C  h5 T' I+ S. L// Performance State two (P4). c; ^( s# x; W  f, x
. R7 N+ o8 Y& Y+ g& r
}) // End of _PSS object# g- c' ?! H( b3 ?/ b2 m. x9 v4 t

' D5 J* R1 ], @( R另外当该平台支持Turbo Mode P0将会reportTurbo Mode& I, J% W( ]  A& F, n& |
/ G! l! K* V) R7 r
l3 {& V% u4 f- I" `
_PCT9 @0 l0 h+ Q) j0 x$ x+ p1 C) t+ K

( h2 M4 }/ J6 Z# B1 yPerformance 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的方式来进行。5 d3 q2 @' {0 z# H1 x$ S

; P9 X! g0 ?% e3 @  k6 TName(_PCT, Package ()
' e9 n! B, T& c& n5 b// Performance Control object 8 O/ S! g  ^8 T% Z2 o3 i3 j& ~

  x5 p& B: O# m4 g  J{ , M/ k( Y6 g  I9 k8 E7 I4 M) r. ~

, H1 r& W. b! }, [8 S0 }- {, W  v* \) lResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
& F8 i+ W# R$ C! h' K+ V6 }// PERF_CTRL
4 ?# h7 h, N$ F4 Q
) l4 {; B+ P7 a3 d4 G6 DResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
$ f# U9 {# j" i// PERF_STATUS & |6 p/ A1 o4 ^$ E3 j1 e0 ^
7 V" T+ J0 s# L1 R$ \4 o0 m/ o
}) // End of _PCT object8 K4 e; C7 `* s& u# R1 g9 Q7 q

' s. p6 N7 U8 t2 Cl/ v2 Y0 D' R8 n/ n3 h
_PPC
# ?% O* j; j5 T, w7 k1 K5 c7 s
5 u$ Q1 S3 h& ~  xPerformance 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
: f7 z! U% n5 L ; g1 N. A. P6 a5 C+ T6 e# z' o
Method (_PPC, 0)
5 h4 ^0 B5 x$ w& R0 V// Performance Present Capabilities method 7 z- p/ m$ T/ z9 _

) X4 D# P1 _! |+ v) P9 w! a7 j{
& a; i& Z& l6 d9 v+ z9 [! O3 a& s0 r& c* P( T0 J' j
If (\_SB.DOCK) ' p' O- j" e/ z3 w% O
9 B; O9 f0 M5 _
{
" j/ z: Q; T- |1 y. T: X( H( P1 T) X
( F" N* w# }9 n6 `$ E$ [( u; C4 EReturn(0) // All _PSS states available0 I6 m4 Z6 y+ F$ y- G+ V6 L% R
: I& x' C& h/ j
# U( z) P7 ^* I4 Q
}
0 r% s# L/ a# g1 j
( e% c0 ?, m% R$ t( PIf (\_SB.AC)
, U$ f0 i1 b# L4 T% U6 u- w
$ c  X0 g3 D/ {( f  t{
9 Q3 T3 l. ^. c. Z* S4 y3 l( i- n. g8 l, G8 N
Return(1)
% g- p8 g- z8 [  K6 Y$ R: u// States 1 and 2 available # l; R2 M7 \: w! _* r5 Z7 M9 n
' U1 \1 S" u- p+ j( U
}
6 \. h" a- Q0 k4 k6 V
3 i4 ^  w9 j, ]. k! u: a: w% }4 DElse ' E( D' R6 p5 r9 N  ?8 v) Q
: V' ~4 l% w- E, Q) K5 A( a  [$ e9 v! c
{ & x+ S/ {! M" w1 a! Z# z% M
6 g; x' t6 E4 x$ o6 ^
Return(2)
$ x7 V: a1 E; B! T1 ]// State 2 available
1 H" M! T/ V' N3 u  F) M% Z- p5 i
% C# o2 x& p( T0 O}
6 \( V! T( W+ M% F# \5 i$ |- N$ E) R5 K/ \  Q: m
} // End of _PPC method
) O7 g' ^& [$ n/ F) \7 Y
. c. ~" H2 B4 H+ O# R8 S' d% sl
! b" c6 J) Y* u+ m+ O( f9 N
_PSD
, M; T& P/ A3 J0 z 7 ?: P: D1 Z! @  l4 _
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。, Q- I1 V0 i- a- O/ @8 O% n" f
5 j# @1 I3 C" Q4 }' i: Y
REFF:+ ~: N9 i, z  E' a1 S  h
1.( ^- c4 L2 u2 X9 ~
ACPI Spec 3.01 g9 [; n8 o7 |
2.
$ U: O3 W0 z9 H7 O& A0 u* H( IIntel Processor vendor-Specific ACPI
# e- o  G* k* \4 y ' c& b: X' y: X: a5 J$ Y
+ p/ G8 r  M3 ]
That’s all!
6 u; C1 C" W( j
% I/ ]2 `4 F$ F$ t& P6 ~1 q2 i% lPeter. q# U% H# a5 o7 O/ G) Z0 F
- S3 ?/ S" C, a* u; s! k
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview0 ?/ S- Q) B! ]3 c: H9 ]! g  p
" Z$ f  o  x, W5 F9 \3 P8 t4 ]
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工作时间的占空比)的方式
) b+ D- e0 z2 w* n* n# n/ ]/ j,影响系统的功耗和温度。
4 i" u( T, J' V" R) V . L/ ~" q  s' c0 J/ H( b
2. T-state Control. a, i7 ?7 m$ A; @6 _( v$ I, h

: u4 V) A' F6 {# i$ v6 k' m1)2 N1 P1 c( W8 Q3 ~5 a0 h) O
MSR Based Control
0 [  E7 a5 S: k3 A6 R: w / Y: C, O; |& F0 P; S  W
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
+ O1 D0 a; u, j. @+ O ' G% ~% A% ~: ~- }) ^+ c/ x$ B
2)+ u% R% O8 n0 f5 y8 k
I/O Based Control
# Y8 t+ ^$ l' `: Y+ y4 M( V! Y, v) p
) b% K/ K% e4 Q) p; V6 w除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
) S8 O3 `/ [  ^8 o$ Y1 A - M; Q9 o7 Z4 s8 j3 J6 O% K
3)
- i# n- G0 G( Q/ J% I# IACPI Structure For P-state
/ c. ~3 V* {9 el) H. Z# p/ w7 M5 [6 }! X  E- }
_PTC
+ g6 Y0 d2 l8 g' G9 g. D' D " v. ?) ]0 s; W/ V0 O" d& ]/ D
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
! v/ ]. a0 ~7 T. g! A( U
, ?0 N. N. d3 p+ t( `( G& Y7 N% NName (_PTC, Package()
! @6 h1 L0 }7 H. d{
1 M/ `% e" o2 [- D- z, G2 b; S2 @5 T! l4 y3 ~0 i9 D: j# x& I2 Q
ResourceTemplate(){Throttling_Control_Register},
+ J0 d' m" v# n//Generic Register Descriptor + z. d7 S7 ^* g" f
" m: G5 Z7 R4 V4 M. m9 e& Z
ResourceTemplate(){Throttling_Status_Register}3 k. b  A0 c5 |2 S* M
//Generic Register Descriptor   H. H, N, u& |, A7 d7 J. _
}) // End of _PTC
/ u. c0 i. d) T8 v
. ~6 L0 \0 _: v' W  A" p下述是一个sample code0 k+ E; W) x% n8 b' s

! \9 S7 a; T- N- j# F6 }: I( D0 K) m9 Q, V; u5 }8 M
//
( G+ M- H- n" ~9 {
0 {( d  |2 t5 m// T-State Control/Status interface9 @! j6 Z# @7 M8 c. V0 ^1 r5 `
6 G4 ]( w& K9 W5 ?
//
* f0 ?$ g4 W' G2 x* p3 M6 m5 B; }6 f! n0 F1 m/ j, R7 S
Method(_PTC, 0)5 t8 D2 U  C* K# t% ?) O0 k4 V
& Y5 R* p& m7 @  b& h
{3 g. D  \7 b1 F/ Z2 z9 i8 t6 v

$ h3 r) O& F& {0 O4 _1 _, G//
! [( g& F( c# N9 P7 s2 H2 G
" |4 r- f* f5 @. }/ S// IF OSPM is capable of direct access to MSR
# x6 j  Z: w0 g3 n9 S- `$ R: f6 n- ^4 \: l( H& P
//6 T8 v' ~3 r) S* V- N  v
Report MSR interface1 a6 }. D$ |1 Q$ }2 w

; S% U6 F+ x$ h6 y- z) m, I// ELSE
+ Q8 g: n# M2 {& [: J: x" K/ H0 K
! V2 z* D4 Y3 x6 ]- A7 S2 t//9 V% a5 S6 d% b. I
Report I/O interface
0 N( S8 z: K- R; n% ?. [
  r0 D# A7 L. I9 E, C//
/ ^$ G4 ^* g# I( l" N& O* j
: W+ s" P( o0 L- D//: t7 i1 ], M9 X# ^9 O: O9 d# `
PDCx[2] = OSPM is capable of direct access to On! s8 ^* q1 s. _$ a8 _( E& v+ `' e
( U6 c* E% c$ Z1 F  R) {7 s
//
1 a/ N/ n$ }' z# w% |Demand throttling MSR
; f# h4 z9 v7 @3 ^0 K2 z+ N* a6 K3 j; @/ N  \; {( J$ d
//: Q% o0 l2 X9 P
9 {: S' I5 a$ }6 G
If(And(PDC0, 0x0004)) {
0 l, [* [' c' ^  P* ~% j* c& w2 ?' A, u) P+ e0 G
Return(Package() {
- a0 m1 C# r0 ?
# {# g. Z1 [, L9 x% LResourceTemplate(){Register(FFixedHW, 0, 0, 0)},2 U/ D+ Z4 \1 ]; h4 {
( I1 C. @% T$ E; t
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
1 ^  F& @3 n( d9 z8 ^
2 l8 ^, ]. w6 A$ E+ B# q})7 m1 `% P0 R! w4 f9 S

: J, O" ?" y2 }, w+ O0 l}, C8 r: \& m/ q; p, `  y' C
, {+ k" C  V! k" e( w( M
Return(Package() {4 y1 a! A+ `% K/ W/ H" P! W9 w
4 m  |6 g$ j+ {/ G2 l; n0 K. Q* ?
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}," ^% j  n, C0 H4 d! u9 I( B& ~

4 w' ?2 f! Z% ~8 GResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
1 S. O2 f: e' m8 C# _( V( z$ @" i4 c- U& J
})7 I+ y5 c* A4 Z, K6 v

0 Q- r& |. E5 c- A}
. G  C7 n/ h0 i3 Q& ~
' D5 T& P" a+ h& ~6 R
* \% y7 o* I+ \$ t4 |
, G0 g9 B: `" b& ]l
8 b1 ~; F% C, W4 g+ I' T
_TSS! a7 t- o4 ^" g. W& ^

0 a( y& @8 K% f4 Q4 f8 o* aThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
" k& C0 H& U$ lName (_TSS, Package()
5 L) e' ?, k( i; }, p{
8 A9 s2 b( q& E' O7 @! O* n// Field Name0 p, D6 [" c1 a0 W7 @) \
Field Type $ z8 H6 t8 C- ?# S
+ l' {3 z  J1 q6 I5 p6 w
) @- G5 f% \' |9 O$ \5 b

6 }, l, H9 r) PPackage ()( N& c: U2 x% O3 N
// Throttle State 0 Definition – T0
% p* Z/ R. V* r$ V
0 X$ x4 Z. Z$ D9 c& v9 T' K% A/ B{
& {) U6 i1 J0 w
  g8 f0 \5 u2 l! H4 z- f, ~, W! @: A. h3 h, w9 O
FreqPercentageOfMaximum,+ F0 m2 w" G% l  R/ {; k  T
// DWordConst
  _0 t5 Y! T, L, L" w. \- Z+ W1 f! z  I
Power,6 ]" |8 h) b7 V8 }+ C  b
// DWordConst
& C3 T& P, \+ I; q: K8 H6 }5 ~; }. I
TransitionLatency,5 B4 p/ \* Z! I
// DWordConst
. ]  t/ l& ^( G7 I% {7 i3 `3 k) J& ], o" \$ t1 h$ |. V# `5 z
Control,
" v5 M& P. D5 @7 p( N4 a) s* V// DWordConst
. S* s% h" z/ v( X4 X0 L6 \
) {* I0 a) @( G$ l) \' K. XStatus' U3 @, F- w4 o
// DWordConst
, h) }1 {$ u; H+ x( W},; W$ ?! Z' ~3 t
……
0 O1 |. D( W  k8 E' B3 U2 {}1 h& T/ g% ^9 o9 q. V, n
  V0 V) {( r+ U3 A. j' X% F
Example code 如下所示:1 ]5 {$ I! p/ @9 f
# x+ |2 H. u6 P$ B# {! k
Method(_TSS, 0)" a! b* D) `: |3 m' a
6 H& [4 p1 d. w7 Z
{
/ E; [" ?8 O, p& W* m
0 R* n! j2 R5 E8 ]3 y. K1 KPackage(){100, 1000, 0, 0x00, 0}," u/ }9 O/ ~+ X
, Q% V  }4 Y. _8 t6 T
Package(){ 88,( E+ H4 A9 w$ i* ^) }" Z3 p. K
875, 0, 0x1E, 0},; X2 m& k" M- O) a9 y$ k
" l+ W+ ~; Q' {4 y! B9 t6 x
Package(){ 75,
  G! x/ e- s, \0 T8 t750, 0, 0x1C, 0},
  V* r) p8 a) x" j% r
) B- c5 _8 I) D" g. d  _Package(){ 63,
5 N" J& j2 w6 U* f; f6 o& _625, 0, 0x1A, 0},$ A; s. b3 l: p1 f8 u2 P6 ]
( i% K3 P; s+ w/ O
Package(){ 50,
6 o; q8 R$ k/ o/ |) D. L4 u500, 0, 0x18, 0},
+ _2 B: k5 W" C& A& |6 f) M. r6 l& J/ j" k/ E; v! n
Package(){ 38,: O% Z1 ?6 p/ B0 M
375, 0, 0x16, 0},7 _5 L4 z2 Y! C9 f; m4 F3 X

- X- Q$ F3 `" l' V- Z6 T' p; FPackage(){ 25,$ E  [0 E2 {9 v
250, 0, 0x14, 0},
' h4 @9 X! V8 N+ [0 F2 l' p6 v) q, v0 l- b3 a8 J( p! G
Package(){ 13,8 X9 u- \0 ?0 P4 [0 K
125, 0, 0x12, 0}& O" L/ E& J9 B- s6 I% X

3 o" H( o7 d6 U% b" p* w}
. E6 M' @0 x7 X1 S6 c5 f* t
3 C, _0 Z( [1 i6 b) M
1 [8 N( C; v, v2 P. A+ I- gl
* _7 ?8 y* D9 I9 E% L6 d7 V
_TPC7 c1 A( O+ ^* Q2 M; m& x
3 r) R+ t" y- b3 t
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
% }, O( o9 M: k% l4 I0 l2 {* g
0 }! m, X2 L1 Tl
0 H/ p: K, D1 E& l  p
_TSD
; @2 J* s* M+ [' o9 F& P; P9 |
8 B- _2 ?1 h: n8 }+ Q- [& \T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
- |9 X  g. ^$ [ * g# U& N- ~8 M
Name (_TSD, Package() : y" U. A/ x7 A5 I; `5 G/ R
1 v6 ?5 F' A3 R' d
{ # O6 p4 k' d1 W8 h1 h
8 H( w& ~( E3 K' t8 o
Package(){5, 0, 0, 0xFD, 2}
% U6 M7 D9 r% N" s" u// 5 entries, Revision 0, Domain 0, OSPM
/ O, s( E! Q- G* U  ^$ d5 n4 bCoordinate, 2 Procs
- q2 t7 }3 V; |4 ~& B$ u' M+ j% |3 s+ U- D( s, R4 L
8 F2 A5 R4 G% E( O: p
}) // End of _TSD object
+ @- I+ y' m7 g. \- u  f5 }
/ a2 K% ?- t. r2 D$ {, CREFF:# L, f+ w9 r! t4 X5 }; ^
1.$ w& P# U' \4 n! \1 z3 V
ACPI Spec 3.0" f" W7 r9 g3 }: l4 ]9 z
2.
* F6 z% G. }1 PIntel Processor vendor-Specific ACPI. ^0 q8 B1 H' x# n

6 Y: g3 B% S0 @% @3 Q; { * G* P5 y3 ?5 K& I% t
That’s all!
5 v+ x5 Y/ X5 M$ s
" \+ N' P* W  a  oPeter
$ f" F& E9 r' V" }3 t
' i/ ~+ v1 G  w# Q2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 16:08 , Processed in 0.061771 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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