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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
& a# p# _6 O. N. U
1. Overview
6 s; o' V. N8 `) _6 j
" i, ?' s2 `" F. \
- X$ }7 c# ~9 q8 q$ H7 \! pC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换: |0 y. U* A) B
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看6 a& D2 L0 U4 i# ?# v
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
: L4 I+ N& S, J
1 d' e: l. ?; C  _7 Z+ i# Y+ t: _
cstate1.jpg
1 y" f) ~  m7 S% r4 |! s( E" f; k
1
/ u8 J0 c, e8 k  N2 @
2. C-state Control" z( B4 }  S& d

, k$ w- x5 y8 T1)- `( M- C/ V) R! N: [9 [
Detect & Enable C-state
; W- N& q7 k& z4 y2 I, |, L9 e7 u5 ^% q' c* x
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的支持。
; }; j6 m) y. {# s) Y* V) Z9 p! d/ u1 D  ^
2)
6 e/ k2 N6 ]2 g  n' \7 E6 dC-state Basic Configuration
" E9 y5 m' l. k通常情况下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)。
% o, ]: I/ b" m( q( V4 A0 p! T0 ^1 H' @1 f& }) n
3)1 }$ v1 i* G0 A. C  ^. j- `
ACPI Structure For C-state6 x/ m2 V: E- t. Z8 t9 ^$ s6 h, n2 s

1 `& i3 i% ]  |5 Nl$ s% T4 P" i4 F5 z0 K  V. e1 a% ]
_OSC & _PDC
9 B1 y( m" s0 M_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures; C3 `6 D! G7 o5 V+ a+ z, l5 a
l& y! W1 J( a' L9 d/ O/ p! _
_CST; t7 |% @( \5 X, p" Y, L0 E+ A
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
. {3 ^& O! t! a2 iCSTPackage : Package ( Count ,
8 [% ]! x" c, i% ~CState ,…,8 \0 L9 x5 u7 Z: b) @
CState )
3 D6 b( y0 h. H其中Count表示所支持的C-state的个数( c0 K: }6 _' B0 ^% p* \
CState: Package ( Register ,' i) k" f0 z6 I$ f$ K
Type ,: Q6 n+ N- y9 i/ e4 F
Latency ,7 m$ T' a4 f5 H4 ?- d
Power )/ c% l# h4 J/ y. L+ l
( G( h: F3 N1 `9 z+ V
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
0 h% _/ `0 l+ |. K: q8 R$ N
( N, H5 Z' M/ g2 q1 BName(_CST, Package()9 ], l" a: r# V5 _

* w; c6 r8 j/ z; Q6 Q4 M{ / L* p! [6 T5 p  a8 t, U1 I& X
4,/ N+ U: x. |* G; u5 ^& x, Z% j8 I: d
// There are four C-states defined here with three semantics

* L" V% a' f3 }. ~4 U9 t6 Y
& W: {' ~" ^( ]& c: A& S8 n4 G// The third and fourth C-states defined have the same C3 entry semantics& e2 p6 A: _" r# ~, I" B6 C) h, H5 a

  A; I1 O$ L2 r8 P5 i7 F2 t* I, pPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
. f8 G. }5 H- M- {1,
; d8 t4 ]) s6 ^& Q/ Q! u" r9 i20, 1000},% P5 e4 V( z3 C+ R% l

+ L! i8 x, G4 J# d/ a7 MPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,# ]9 @$ V" x; ?
40,
  Z9 Y" S. e1 j$ ]  K* G! D$ A+ J750},

9 S5 m1 X# m1 Q7 WPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,- T# g1 {; x" t8 i# J1 q+ N
60,: H4 q1 g' V" a7 d9 C
500},

, J# P  h' ~- i% l% UPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
, Y; o0 \% t9 F7 Z) n" C( ]250}0 p, [+ M9 g7 I% v# k

% m  ^+ r6 z8 c: A})
: }$ D8 Q$ u: Z4 h  J, `' C! ?5 n+ m  C, w5 C6 w- O0 b
l
# @* J1 j% L9 l) N) e0 n" ~
_CSD0 K4 \4 n2 V3 O3 S, N. H3 e

. d! h7 Y8 [$ X$ EC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。# M9 ^0 h3 K# p0 f  j1 v: V  i

  b7 ^$ S% A( e5 P4 T) r
% p+ x5 i: v, m5 x7 K
' g* B/ r/ z0 a& x" H+ d8 M) S! E# O3 @2 E
3. P_LVL VS FFH
" d" J0 j: t+ r' K3 k* ~: s2 e0 c+ C6 i/ @
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2): W, s9 n4 E, i# t3 v3 q
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所示:& u4 I% d$ D/ J
9 Y) y* W, D# A2 c+ x$ \! _
gas2.jpg

1 [" B4 u/ I2 T: k
2
& g, P" t3 W5 m/ O; [/ P
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的一个例子:4 x# G2 l& {( s" ?7 U
Name(_CST, Package()3 t) G/ S. y# Z

  T- h' S% O# o4 M& A2 L+ [{ , H1 P8 P8 v4 e9 k5 F$ Q; G6 o
2,
3 t" e8 c9 n3 G, W6 r: u8 U% e// There are four C-states defined here with three semantics
4 K* D% m9 Y9 n+ v" I% i; Q* ^' w
1 {7 @5 j/ r. Z) f* e. G& r
// The third and fourth C-states defined have the same C3 entry semantics/ r& U( }4 @$ M9 V3 E
7 ?, j* P& o  w; S; c) C, @6 `4 e
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},' i6 _1 m2 b8 r4 M- k/ H
0x01,
  k/ Z5 ]0 ]. ^) X1 Y0x03, 0x000003e8},$ L0 x6 {& R" e3 ]& k) v; j6 x
: }8 n2 y& j' }2 v' Z+ l0 j( m5 r. x
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},% c, C0 f! }  D% h/ H
0x01,8 Z/ i) d: t" n( B3 d! n
0xf5, 0x0000015e}
: ^. A# i7 x# Y' ]3 n# O# K
}) ; h  ]& h- F9 M. w' y5 S5 n5 m3 e
6 M( I# h6 i! P4 f

: k4 b" G* Z# W, q% [REFF:
+ j- \  f( k9 D3 T6 @% y7 K1.
+ F0 V0 h  a$ [' t+ P3 _9 QACPI Spec 3.0  k6 N' B3 G3 ]; U5 b" ~
2., g" V* V1 ?- a) A0 {
Intel Processor vendor-Specific ACPI
2 _% D; U+ v, ?$ J& E# \) k( `) z% Q. I8 ]$ y6 |0 u
5 W+ x4 v: E: N' Y* L2 A3 x4 C' T4 I
That’s all!: {+ O: I" r2 Z2 {

  V5 E. S' E( G8 {5 |1 NPeter
4 T4 e4 r9 t) g- i; b  U5 J3 K6 Z$ y# G5 ?; ]. ^+ q0 {7 u$ Q% v
2010/9/20! }8 Y0 W! a6 ?0 U8 b/ L

/ W7 Z. @. ]9 T3 e: ^- }. L5 q[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
$ h3 d9 O' c6 O- K) f. C
$ {  P, W1 e9 O" T* mCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
3 x4 b' W, w) Y: j- U! VEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
0 ]5 E9 }  |3 k4 u6 P * i6 E, l# r& B- `! V' |) D/ a
2. P-state Control
8 l% D1 D9 u$ U
# Z9 Y5 Y6 w0 W1 O5 `5 w' u1)
6 l" R7 g# w. H; MDetect & Enable P-state# h% Z: @) n, m. K8 C: }
3 v1 d+ y5 B% V" i, q' |
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state( t$ U- u7 g! j# O( L" g) b% H

+ o3 h" S3 L* a4 K( {2)* Y- X4 L0 U$ V. d3 ^- q; I
Supported P-states
# Z7 e' w! U  [* z. \9 E- c 4 @7 I4 |& z0 w& Z$ ~$ z9 b
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
& [* s5 ]  [" l" L; U . f, r- u2 b6 C3 B# p
MinRatio = PLATFORM_INFO4 t- z! b1 ?1 @& M9 L4 n
MaxRatio = PLATFORM_INFO, Y# L* ]- _# \8 _
RatioStepSize = 0x01
- A  q% R' V2 N) s  wNumStates = (MaxRatio – MinRatio) / RatioStepSize + 14 x. h8 e* x  ^& F$ J0 f
( j; k/ ^9 C3 P/ _# H  S
If(NumStates > 0x10)
! K7 @; l7 ?4 T2 l1 W& k{- Y6 m: R, T* W
RatioStepSize += 1
. M7 F. o4 b9 n( ]" YNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
! j8 n, k9 V: Z3 c4 V% v4 V}
: W0 |, f& z2 _& z
+ @* S+ h; z; p, G3)
% @8 C0 X0 @( u  u- ~( Q. gTurbo Mode
5 P3 I* m% \3 {% e $ ], w- x$ S7 ]! w6 A
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# F. V8 W0 F  O' W9 i, s" }

1 V' d. e% [4 K5 n2 j% X, }6 M- l" F4)
: I1 Q3 E+ {+ R1 rOver Clock
( g; ~; Y, y3 G: x( n4 o) ?3 c
: j) f, G4 w) W' o/ r某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。; C8 Y$ E5 a" R( w$ `0 D

. ^' k. M1 p. g4 z1 _. f5)
/ Z0 g0 @+ w. K* k# AACPI Structure For P-state
9 o1 S1 S0 L% r9 a& t+ l7 W  d
" D$ [4 M6 c+ o4 M5 M( Y  J* x# Al. i1 A, D* K) Q  O
_OSC & _PDC# `; \. B' [1 l; q

6 c2 y8 d9 W9 j  J_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures! W! z9 o, U4 b5 L' `. B' C

( z; \% ^+ H% ]+ K/ ~l: C1 f; X! Q1 t+ |  V/ W/ c
_PSS
) t* E6 p% Z+ |Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量& d* _0 [  v& ]/ A4 @
并且通过一个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做比较
; f4 J- f( E! m2 R' q2 P1 N9 a以确定P-state切换是否已经完成。' U0 J2 Y8 B* R& a6 c
- f3 Y9 y" @) i7 [# B4 u. d
Name (_PSS, Package() 3 n% A9 g/ ^0 ?- V0 a
{! D+ X1 y$ A6 Z2 H6 J% D) C' B
// Field Name
- c: h; r* u+ [: z+ sField Type
, S! o- F0 W( d4 ^4 Y: S
2 ^2 f' Z3 l4 a% N; Q/ m" a' L& @* q" @8 B
" J5 c: o# ^7 H
Package ()
1 b+ Q2 s) X. @& j5 I8 x6 L/ S: W// Performance State 0 Definition – P0
, u. b  {) V" H' f3 m! B. Q3 [  B$ l5 C" Z, S4 V( P- k
{! P5 Q! E* c( ^
) X1 c% H3 |1 R- m) ?' A
& @' ^" ~. Z" r/ q
CoreFreq,' ]8 q! f* _- K8 x+ B. n
// DWordConst
: l8 g( v! r3 O1 c2 I; d  g7 {/ q& p* U: h% z

8 x+ ?% I1 C9 N+ E8 h- Q' HPower,9 A8 j) T; K5 F+ \4 y0 B* q. A" q
// DWordConst 1 j6 s/ y0 |' Z3 l3 y) F7 E; D$ [. C

  [1 a8 V, [+ r1 V' T. \/ t! s+ LTransitionLatency,
5 q3 l/ g! F3 G/ ]" ?7 v// DWordConst
# O- a  [0 f4 V9 ^$ O. r
$ ^4 k5 {. f4 ]# o! cBusMasterLatency,
2 Q8 [) s' N# I2 M& ]5 b// DWordConst ( H4 W5 K, V4 u. @" B9 q! G) @2 H7 H2 M

4 ~) {! E& x7 F4 k. X( }0 C% HControl," \5 C" Z/ x1 H4 O" d
// DWordConst + s$ d( j3 F% C: l- R3 r
1 a9 C; N% r2 Q# H8 H
Status- O# ~8 C% c* d, g/ X9 F6 U0 F
1 S- n  W1 t- ?; Z) H3 Y) d! y/ q& z
// DWordConst
4 p" `6 I/ S3 A8 S. i# B) F5 o# u! z0 S5 z- z' \4 B
},
& m8 |  t: m1 W1 B( C. K( j$ [
; [8 F- C/ n4 o.
) H6 X0 o. F6 o# j$ T- O' A  _3 m
! I& ?* i7 V& [$ `. 9 j$ X$ e+ j4 i8 t+ L/ c  t& H
( }1 H; M1 N, I! R3 Y9 L
. ' P% z. A' z( ^" ]. p" Y- S
}) // End of _PSS object
* D1 ?* B2 Y3 @前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 / `3 d# a7 u7 E2 k
7 A" y* d6 I2 E+ _( }1 D* [' T
Name (_PSS, Package()
% t. c  ~7 N! N3 E6 E
# \9 m2 d3 p( l& n9 c6 S{ # Q+ u$ N# j* C1 W
& n  W2 v! ~, r# z$ J3 e' n
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
6 e0 w  f( {# b* x! y; D$ |
7 \7 m+ B0 K' S' ?2 n) APackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
) I" ^5 t$ m$ d. n* m7 M$ u* o8 R" }1 ^% E1 _2 F) g' k4 m2 l! j$ R
Package(){1400, 8200,
0 L  K0 p( H! U% _0 ^10, 10, 0x000E, 0x000E}7 F& N8 d6 }) B
// Performance State two (P2)" Q5 q+ F1 X9 d) J; V1 b3 u  }+ c, `
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // $ ]) ~' g1 M7 I. G0 C' ?
Performance State one (P3)
8 _7 c8 M$ w# {1 x  q2 v
: e3 s5 |" q0 ~! k; P! TPackage(){1200, 8200,+ u4 D4 Z# T; ]
10, 10, 0x000C, 0x000C}
! P3 d, `" e! ]  Z// Performance State two (P4)' C% B% `& \+ T( B7 C

# [0 z' X2 m# X1 x9 d+ r5 ^}) // End of _PSS object1 o1 j! F" o3 x  r, t% w8 B9 a) O! P

8 e. |2 ?7 N9 |7 _另外当该平台支持Turbo Mode P0将会reportTurbo Mode
% D$ c, N4 ], t; O& I& Z1 e7 F , b- j5 G8 y$ L1 g, O7 ~
l
7 Y/ e# E: ~+ v. b, Q6 s( Q
_PCT
& w/ \' W6 y: r3 s; u# b% ^
; ^" v3 z' F9 F. e+ }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的方式来进行。6 E! |' T! X3 o; E
' m2 z! \# W6 s
Name(_PCT, Package ()
/ Z# q$ B/ h; W( p' Y) k// Performance Control object ( C: v+ Y$ S4 r8 n7 M/ y) p- [
( R# P) C6 X. d. ?% w( z
{
- h2 x5 |) l1 K$ q  x9 Z
$ y, |3 |" F2 E% V( _% SResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# P. k2 R! R" \% X& x9 w// PERF_CTRL 1 X* R/ d6 z& u$ P$ o

+ J2 v  d9 Q  x8 hResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
* E  V3 \. _: V// PERF_STATUS ! @6 t7 \) t* b. ~" F1 V- I; ^8 n

% C4 h) b+ ]# b0 A" i}) // End of _PCT object3 L3 x7 q2 |4 A  N, u
7 M4 b& n9 }3 O: m3 |
l$ v" v1 \5 q+ I  Q
_PPC7 k1 G2 @: y7 m

  u  u8 P, u3 _4 V5 KPerformance 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
9 z& Z! n7 |( W0 z
8 P# n4 q$ u$ h; NMethod (_PPC, 0), _7 S- T$ X' q& z
// Performance Present Capabilities method
& s- A; y8 A9 S6 V; y$ q% X4 Y8 j- d1 N
{ ( S- s' A; B! J3 R! a4 L3 D

/ w- ]7 f  h$ x6 T, E, n) MIf (\_SB.DOCK) 3 c& [9 X- Z, `2 m' Q/ ?5 K+ i6 U

* U* n* r8 ]0 o: R{ 6 x$ z: k, D8 s! U; t

4 I+ L1 p& B7 M4 HReturn(0) // All _PSS states available, h8 Y- P/ E; T" x2 s
! ?8 X: s3 m) V1 c
' C" z+ p( i* z3 h
}
# J* }6 K0 }. H# e& j2 F- q/ _9 D8 V
If (\_SB.AC)
6 s3 |4 s+ e' T$ o
; B$ ^( j( b; u( f! W  H$ E: @) w1 F{ : z# V5 Z6 g& H/ }5 j) W3 ^
. G0 N8 N$ q* f$ Q
Return(1), T9 P8 n: ]# ?0 W) Q1 l
// States 1 and 2 available # F# m3 d0 k1 P0 N/ ~
( ]% p8 H4 x# N: q6 ]4 t3 f3 W
}
; J: ~# b( m- Q, |* w1 p! p# v7 v. {  u' S
Else ; A: }/ A6 w8 r
' L, C, y* [7 W' p
{
; t: r( t; ?' \. i5 _* g: D' y5 E% b" `& A9 W. e6 j& q1 c
Return(2)/ {" T& o3 @+ L" |2 x$ Q
// State 2 available8 d' |- g: A! D8 t6 \

9 L, D0 }+ U: {: b& g0 d/ y, v} . e+ {7 q+ i5 q- L. O
' c2 p. v- M0 O6 m& K3 h/ }
} // End of _PPC method
# a% \0 y  r5 r
) r/ k+ W* I  B/ hl% j( V1 R6 j8 N  @0 k0 U% q5 h1 i
_PSD+ H6 a3 a  L5 w. p0 f# W9 Q

$ t! |' a( G8 C! E: K/ \* B# m# oP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。5 G9 e  J) f! Q
$ x. U- b! @1 q# m8 l
REFF:
: b1 {  D# G. I2 }1.0 S& u$ m2 P6 I( K9 t" D6 ?
ACPI Spec 3.0
* T/ M. F0 R- _/ K2.' \8 @' ?% i0 T5 Y% {
Intel Processor vendor-Specific ACPI
7 h$ s7 R) b' W) D& i * n" L$ J# e9 [7 g. q
1 a  s' M0 G, i7 O# a$ J
That’s all!8 I5 n  _- h0 l8 _8 a3 d
+ Y. `2 n+ y2 B
Peter
$ G1 P; q2 d' U8 X6 W   }, @( Q7 s9 T% B9 J% x- @
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
# ?/ T1 ^' v# |/ q1 X$ O $ p5 i  o4 t; G# l9 ]$ r& g
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工作时间的占空比)的方式1 d5 k3 P2 c# w; F6 Q3 N; o3 |
,影响系统的功耗和温度。1 y3 f( S3 ^1 o# T  {5 ~+ P
6 J% o, D( M3 u# v: a
2. T-state Control
6 O- s7 ]- I3 _' J; K* q / E/ u  |$ d% _
1)
& W* Q/ r2 U- e2 J7 g9 o1 z/ p: FMSR Based Control  X3 y  P" j5 W4 D6 x0 Z
9 \: B4 m- S% v, Z+ n* F
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 ( I; F" z' f- y. l9 `% ?

* k: @" j( d$ R5 M; B  `2)
# b! V* r, R+ H1 {I/O Based Control
9 w& j$ w9 x9 r5 c9 I. [9 } & f% e- r9 n2 D8 t5 {
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
) O7 Z1 `7 n) R! I  \2 S
' G' \! i7 w! A0 o4 |2 n, A1 {8 E: S3)
% d0 O8 {! l8 I3 H+ |% U1 RACPI Structure For P-state
$ \2 d9 a  k- ~* L* I6 b9 Ul
6 |  h+ }5 {: y% z# e
_PTC
7 |: E0 Q: d* H7 s. J% s- _( g3 v
  m% }$ {0 w- _/ {3 `# e$ h4 RProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
6 s0 P1 h2 {: \
+ L) D( l4 `- _0 n7 f2 V; I/ [Name (_PTC, Package() ( j$ w  \+ S' t
{ 0 b1 {6 _) Q& T2 ^. @9 G
3 G' O" }8 ?6 T
ResourceTemplate(){Throttling_Control_Register},3 p# N  N' _( T5 n4 o/ C, F, u  O
//Generic Register Descriptor
1 d6 x$ b' c' }% F6 I4 q9 \5 x8 _
ResourceTemplate(){Throttling_Status_Register}! g6 c5 P, Z! x( K
//Generic Register Descriptor
: q) _+ H; B- t8 [" a6 B}) // End of _PTC0 s8 O9 G6 Q  w* u* R
0 B8 |; V. `( |- B3 x
下述是一个sample code
: P8 Y# U7 Q7 z0 {5 R * T5 W2 F5 h5 k
: J* S# B* {# d: {1 S# h
//
( B- q, ~( d, _# u
/ o1 @7 u. T+ ^' K9 g, y6 {- v// T-State Control/Status interface
+ w7 [# m. {' p) `5 a" s5 K( Q0 a' @1 U$ I
//
+ M  p& ^( `; E0 v  a6 s1 G
  L8 }2 A( z' M* d1 ~3 c3 W& nMethod(_PTC, 0)- _- v1 C9 C& V6 o2 _4 N8 B

! n" m7 ^% M) m# q8 d* H* ]2 X{4 e6 b$ s+ j2 v6 {5 v2 H
) Z- {: r0 p! Y$ f5 A( r. V1 G  O
//  _$ j; p7 W% A5 Z* ]& v# P

0 t& o0 f" E, m  N- W+ U// IF OSPM is capable of direct access to MSR0 o# B! F+ F: E5 P3 m2 m, K9 Y

+ j4 K+ s& M/ L/ j; b//1 ?0 ^9 O2 ?; D( S* ]. |* E/ b
Report MSR interface* y, [6 I) d9 h$ _/ C
) j! g, h3 [* P( b( [6 C" Q% ~; K
// ELSE
6 x& {$ |6 t4 L5 s0 N' L0 y9 k) a) T  U7 Y
//
  i9 p7 T4 @+ W8 ^Report I/O interface, _- B) O  d& X

8 f* @* r/ X% M: e8 o1 y- V6 E//& `5 e* q/ V$ q/ s& G9 t8 p! T' K+ m

" p* G9 e5 R/ z) O. k; g5 m+ R//7 B# W1 @! b: @2 g$ z
PDCx[2] = OSPM is capable of direct access to On
) {* \1 ]! ]5 a+ K) q/ G8 v
' {0 W4 p0 V/ C' }+ ]& {//
  A% x8 O# m7 C- F2 v2 o' {+ `  cDemand throttling MSR( E% I: D3 B, m" V9 o; r( s% a( k

, W1 x; R- }  B3 E  I  S: X! K//
' l) g& H  [9 D& {# v4 l9 v7 b  u# X1 [6 L* L; D" @  L4 E0 q. }  o
If(And(PDC0, 0x0004)) {
6 v# }, @, b% N( @# g- w2 T& x6 t4 i
Return(Package() {
/ Q$ x. k; Z' J
- e+ s" T. b( |& r/ F" tResourceTemplate(){Register(FFixedHW, 0, 0, 0)},! J9 a% o  c+ H/ B
& W# ~7 A$ y, L" ]! l6 P. Y
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}8 }5 A" d  [7 k8 ^5 b. B  q
3 q# S; q6 M2 f; F( @: J
})
  r+ _9 z! v7 |# y
8 m) B& b' P. h; |1 s9 x% \}( w! H) O; V& X1 {) E8 Z9 c

7 U" M! c" Z) Z8 V% vReturn(Package() {* i9 v1 n5 N4 K% ?0 o; y
5 L9 w: C) j4 I& d
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
% k$ K5 X9 [/ m# ?4 c7 [, W+ q4 K0 I, R% u6 t
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}2 h/ h' E7 b1 {1 m

( s" _5 U9 K2 h' ?5 _5 E})
0 |7 X/ l& ^1 n# W2 N
' t7 P3 c7 R/ x+ T1 L}" m& p+ ?2 p: z. P2 ?- T; r
7 f, Q; h/ S% Z, b) y- s
! q; @# y! e( p0 Z1 y; ^$ U  }
# X; d3 `! C3 s% \7 e( Q" H4 D
l
3 k1 _$ e( @* d- J. V7 t
_TSS
- S" H7 ?& y4 }, j
' r2 \: D# ^, h4 @# ]) O5 AThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
/ O5 {. Q; H+ N5 z* u# b8 CName (_TSS, Package()
9 H. X' T2 A, A: G0 `{
& q0 z* D  z# M/ c6 V& o// Field Name
& k) P9 _: z2 T1 V; wField Type - D3 {9 b3 L# s5 Y3 a

/ Z# H! B5 A5 @$ ]7 t2 v3 R# V" d4 ^0 ~6 H
# l# W$ L& [% j: r% T8 ?8 R0 L- T
Package ()/ O3 V! l( h3 \' f
// Throttle State 0 Definition – T0 6 T7 a7 R# X. S
$ s% e- l0 x) i: i, t
{% n, h. e0 Z; G$ k6 n6 F
2 L: c! V% S7 P* p

# e. U$ r0 V9 q" P' nFreqPercentageOfMaximum,
; D3 r2 n2 p! J+ F! ?0 p// DWordConst
2 z1 d4 l+ h: [4 F( u+ L# O; g. e1 w. {, \2 v$ G1 k
Power,  e3 R, I  P/ K$ J" R# R, p
// DWordConst ' {# X+ S8 `9 M

/ A' M& K3 S8 C  {TransitionLatency,* X+ b% e. g3 v; p3 l) j/ i% {# ~
// DWordConst
2 Z$ q5 b- s- O
/ k1 E8 B/ i& ?' {: }) z1 `, \Control,
" D& W1 @, [3 z// DWordConst ' C& X$ r! a: b* o

9 H! y  v) q" |Status
6 u% ~) _$ \4 |! u$ k- |9 Y// DWordConst
! H9 S" V$ k( C9 d) h/ n0 Z},
8 z+ i% }& T8 N1 |/ {0 s) _+ i……
: ?4 x1 e8 H* C0 X* |}# S% T$ l7 ?. o# j0 a0 M

: g& v# p- Q& t8 R. ^2 ^  mExample code 如下所示:
! g% i0 i8 m6 c, o3 O
; z2 q& k2 r; O  P, c' ]' FMethod(_TSS, 0)' u- j& W1 y/ @7 G( s+ K

7 Z  V& c9 p1 c) W7 c{
# X0 f4 x( M. _  P& o; d, W, d# Q
1 D7 I$ e# Q: H% F5 y2 jPackage(){100, 1000, 0, 0x00, 0},
+ B. T" j, a- {! O: c* H) X/ D, W
2 \( P( F" v8 s8 M7 mPackage(){ 88,
# P0 E( `& |2 c! b/ s875, 0, 0x1E, 0},* }4 B" c/ G# _4 }6 o+ T8 {
" K5 Z9 J0 Y7 Z$ p- s; F
Package(){ 75,
5 O7 H+ @; c# D7 @" q% L750, 0, 0x1C, 0},
" L( S' o: h" f6 e) P/ ~& T
& R) a$ D4 {/ n# R* R& [0 {Package(){ 63,. F$ N/ I, {+ W9 u+ R' V
625, 0, 0x1A, 0},, N% y/ n8 \' H/ G+ ]1 v! g+ T

7 f- R% [; Q" }2 ?. K5 H8 uPackage(){ 50,
3 v0 N! D- i' [. Q4 n" K500, 0, 0x18, 0},
) D: a3 n1 d* S, |% x7 H8 k3 r! c
: K6 z! r, m& R/ |3 PPackage(){ 38,* i4 Z5 A/ A& q  i* m- m8 b3 s9 I
375, 0, 0x16, 0},( V  U+ Q" ?" k
; ^$ L4 f/ C# \* }( F! ?
Package(){ 25,, V- I! X3 x  f" K8 ^
250, 0, 0x14, 0},. ?2 ^6 S" z; Z$ ]" a9 H" b6 i

* x7 I/ z: c% b' HPackage(){ 13,
2 g6 x% ~& [) B# F* c125, 0, 0x12, 0}2 W& a2 u2 B7 K9 e# ?
; N( A% q! Q  t" K
}2 S9 i1 \& {: U: V) p: P

7 z  `8 M6 A" Y6 I3 `. p: y
1 o) S$ V2 {; \: N4 q7 Wl
0 c' h+ D) o" o8 I, H0 k7 H' ?
_TPC4 b8 w' b& W- n% M

* l- c' R4 R7 |' m; ?Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
& N2 Z* n. h; \' M ( `6 \- Y( Q; u4 P# z5 p' {$ O
l6 l6 s/ n: a0 e1 _' L1 x
_TSD
- L7 }# Q. {7 w" b' d5 M) H' X% W3 P9 q: I
: y0 B% C. H% ~, @2 d4 H6 VT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code) c2 ~) }% d% v

% r) L9 @4 g$ C$ t2 m6 VName (_TSD, Package() 4 q  ^7 }" H$ x1 {+ m6 t, j

$ l5 e! b0 w& F+ \2 O) Y{ 0 i& E0 O$ _: R' m3 V% j, w* h

  S- G( p& i- P1 G, c/ x5 v2 WPackage(){5, 0, 0, 0xFD, 2}8 q5 F5 x" {$ W
// 5 entries, Revision 0, Domain 0, OSPM   c3 X3 J; W8 r. q) B, w" a
Coordinate, 2 Procs
- M- J& ^! i' [, T7 B" f/ D; \7 Q/ s3 ~5 c# s" ~
* V+ w7 A2 Q, ]' ~5 {3 F
}) // End of _TSD object) R( S! {" G8 H; C: @- A

( |( G7 K' [7 yREFF:% c8 Q1 h) ^5 E! X2 j% X: q
1.8 ~% E% H; _; p3 N
ACPI Spec 3.09 [' T7 W& ^; h3 ?  ~1 c5 L
2.: X6 S1 |: x( {
Intel Processor vendor-Specific ACPI/ X' y+ R' Y+ @* A

! |( [" @: a$ D7 {% _: h
" n% q! N' b5 F! ^# c; s  |That’s all!4 F' p$ N+ y8 @4 i) t- e" O

! V; H" T5 ^3 C) q9 VPeter0 s, ^$ M8 u3 G9 j# X

$ G% a! R3 ~/ e: d$ {2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:34 , Processed in 0.050306 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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