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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
0 M, m: v9 C+ p3 L, ?
1. Overview/ F0 ?8 [9 w4 ?) _. Z0 r) ]

$ D3 X% N8 g/ z( y% L
9 b& a* ?( }* z  y4 `% c9 ZC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
0 c2 N0 p/ b. [0 x2 E+ Z降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
1 o9 ?6 Q7 }7 h. E比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。# x" G8 h' R$ I1 Z! j

: q5 h  l* i. M
cstate1.jpg
, `" U3 `. m- {3 }+ I
1
. \' j, y9 b6 O' l8 e, F* i/ c2 t
2. C-state Control
8 {) y+ i. N. [2 G$ s. n
& Y; ]/ U' x' f7 s5 c/ `; ^1)
/ w9 \! B: K' B/ D3 RDetect & Enable C-state
4 U" R+ ~! Z; E+ r. p
' n8 m) ~+ U* R8 ABIOS可以通过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的支持。
( U# l; M7 ]& E- N( i+ D6 G* \6 P. n+ M. h9 K/ H, \
2)' `. \6 z& [  g* S1 F8 B
C-state Basic Configuration+ C( A1 N+ A7 G8 C$ f5 s) s
通常情况下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 S5 s. r5 \! I- i+ n4 z! i, E# `& p3 J* _" ~
3)
" R. X. l8 J! L; H$ n4 U0 Y$ M8 gACPI Structure For C-state  u  V# c9 f/ U1 ?
  W% ?6 {+ |# V2 j+ b. f
l2 R4 `' W! Z  P0 J3 }" O
_OSC & _PDC
/ U! S3 l" D1 n& o' u/ d8 ?_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures+ s/ I1 L* J. Z2 V0 m
l
. K% _. `; ]3 @" v4 S6 L' d" ~
_CST. [0 m* d9 }' s; G/ h
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
; ~1 B2 C5 i3 A( z% [% ECSTPackage : Package ( Count ,1 A0 ?+ q8 I8 a! w: ^
CState ,…,
* f4 e: T! F% [" I; L; KCState )# ~3 Z$ e3 x/ W+ a- b4 `
其中Count表示所支持的C-state的个数
9 v- ]* l" B; X+ F( sCState: Package ( Register ,* y" D# N' m) o# N2 X0 r
Type ,4 N* n2 g8 A6 p5 b+ X( {
Latency ,
& c: b) ?+ g, aPower )
( t/ V* [2 w( E* t; s
; s" c$ c) E3 w4 H! C$ S1 uRegister表示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
2 _* W2 k% W8 n, [# y& a
9 ]/ c8 j; `: q5 x1 `; fName(_CST, Package()- c3 L# ?) I9 x( ?- n8 P0 v2 B4 W9 n

; C  H; l0 v+ r- }$ a{
9 J' z3 u6 t" d% W, Q6 U! r- A( D! @4,
  c& X& r( U4 K// There are four C-states defined here with three semantics
7 X! P" G! `; E* I8 @( B

! I- B# ^" f, X( m2 {2 n// The third and fourth C-states defined have the same C3 entry semantics
( b5 ?- p; c$ G3 v6 [' U9 Z
2 H7 c+ m" b4 J
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},+ Z" }2 Z" W8 O- s. `4 ]8 {
1,
. T9 q2 ]3 R; o! R' h3 R20, 1000},6 Y  @* m5 c% k6 M, Q) t2 N
6 C1 S3 [/ Y# k- j: w  Q  D
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
/ v1 k0 l- A4 k, m7 Q- t40,- X; Z/ d- N  v) f/ S! Z* I7 h$ e/ T* w; ^
750},
7 \* g3 u* v4 @, R( L) q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
, `# g( r' ~0 T0 S7 `- @% N9 q+ m8 r60,0 S) B  a; M2 e4 a8 w" U
500},
8 d" }7 H4 w1 V
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
  A: X, E8 m6 V# c250}: m. v! \* F( U9 B, j& g

1 r% Y$ ^3 g8 s! N) H' _1 T1 G})
( S3 s4 ?$ F' N+ l% \: X1 v' w
9 V' o7 c7 _6 l$ zl  F& H+ f' |) V0 o. P
_CSD
$ e( z. f. e  R2 w8 u9 d( ^, Z/ H4 j: {+ L$ s: z: o0 w; a
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
* F! g" I! ?2 b( G( P
6 v1 W" x2 k, Y' W
; k; i7 w6 X, R$ l$ h$ h) A6 r5 y; t7 J4 A9 c* a% x

4 Z) j  ~! K; h# H3. P_LVL VS FFH$ I$ }0 [% d5 R8 {$ i6 P
, [$ ^) ~" K! E
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)$ E' q! K- A  X; x( \
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所示:
; h8 d( n. v' l
1 ^2 _- b$ ?) `# r3 ^8 K; C0 G
gas2.jpg
! D. ?9 o8 P/ D% V3 V1 I' P
2
# d4 u( A. P* R" z3 m1 a
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的一个例子:3 w. g+ D7 N. `/ ?
Name(_CST, Package()( k- {+ i( q3 Q. E3 D+ h" i  i, ~0 s
" z/ g* w0 Q4 o1 _
{ 5 ]& c; v. y# [8 O) |  f
2,
8 c, Z8 X- G/ u/ L& a// There are four C-states defined here with three semantics
! s, v/ e. a, A0 @0 [4 ]% b# o

. g: F* @* c2 M' h1 C- D, E) G1 ^' X// The third and fourth C-states defined have the same C3 entry semantics3 k" O/ q5 x1 C' V+ E
" u4 l2 J9 l% I4 }
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},1 S" r; s' W, l0 O- x7 X
0x01,
/ Q+ C" {, F% _( s5 \) P0x03, 0x000003e8},1 M6 C& g: P* V) @" p  I

, i' Z1 v3 t# @Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
8 e7 t$ {9 R2 E* t0x01,
/ D. B7 G* d3 t% n$ Q0xf5, 0x0000015e}

/ k. n0 U0 f" v" ]4 b) }& i})
; K% ^' M6 Z  o0 G0 t/ a/ N- I8 G; a% N

8 h# h+ @% ]% Q& l- S, J0 pREFF:' Z% h/ G+ y, p  H8 ?# M4 b1 J6 X9 p
1.
, e) R5 A0 f3 K, w7 |" X# {8 H3 IACPI Spec 3.0* J! T: g! m. h/ K6 x5 R
2.
  K' i! |3 M6 S+ eIntel Processor vendor-Specific ACPI
/ {% Y! `5 \9 I, f1 f3 _* G
8 l# I0 y0 L+ w$ d0 k% @" Z& q% ]; B( G
That’s all!
) y9 n1 [2 ?5 R/ H
( z  r( f' Q0 j! d  ^Peter" @- |' m/ P. L; P% s/ S

7 _1 {) e8 E$ `7 r- ?  m; R' F2010/9/20/ n0 q5 p. C- [' Z2 ]
1 j4 P1 `+ A, y7 U& f9 U+ X
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
4 H$ C8 l6 \- H! @. q
0 \- i8 l9 F. M4 u) q# }  hCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
& c9 z, _# ?( w- X: n1 n8 `2 IEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。) S& n8 U7 ^, t- [) s+ O/ e, B; Q

$ q6 r  l* h5 w! A2. P-state Control
' r) L+ q5 s7 w8 b# @5 Q* d * A2 \7 E. I' W( D; _8 c
1)
9 w3 ^  u2 ]. LDetect & Enable P-state2 U9 T6 G5 G, o1 E2 H0 M8 H0 C% c

" p4 l' `! G3 P/ d% l) cBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
. e, w& `# p7 T
! |$ O9 n* Z/ Q7 v7 G- R' ~2)! v4 l: m8 W- d+ g! `' x4 L+ E
Supported P-states
1 g2 w2 v( }+ P8 y( g. U2 U/ x ) R! \+ k8 G; x- X
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- u, w+ O1 k0 L5 ?

  f: m! _1 s% {. p7 ?5 q: z) ^* NMinRatio = PLATFORM_INFO
& V, |$ E% `4 FMaxRatio = PLATFORM_INFO
7 D" ?3 C# Z/ B, |  ]RatioStepSize = 0x01- H& u* q7 m$ V8 k7 B
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1+ G1 p6 W/ G7 m  n$ e' N5 E7 Z
3 f8 R8 @0 e& k# B6 s
If(NumStates > 0x10): Q# V9 H. c& l' _% {3 c
{1 C/ ?; z' P2 g5 v0 m# j' E9 p( @
RatioStepSize += 11 O' ~* n! W# C4 {& ~, d
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 17 `+ P1 F+ k6 ]" [
}/ P4 x$ P( f- I/ z
% ^3 K0 d$ f2 f4 k; \
3)3 _1 |6 N% J3 A, p0 [- {
Turbo Mode
2 \7 f7 ?0 j! [4 c( `
& b$ r8 D) A5 R7 ^  W( s  Z' B8 z- ZTurbo 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
: ?" I! E9 O8 g; @( h
7 g7 g, ]" f" v' t  u. T1 }4)5 p. t$ e, E- g  Q1 ?' x$ ]) b
Over Clock7 Y$ @$ [! L8 m, V  v
7 r( F/ i& z( K, k) A
某些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 Z8 U$ w0 L3 L" Z
' R& |% X' H* L% J2 |5)
' F9 k7 A) i3 O2 [7 c, ZACPI Structure For P-state
4 ?3 K0 v3 W& h# \# y" g % Z3 I  l5 o1 m0 m7 f
l  s+ s* L9 w' s
_OSC & _PDC
- d! M, [2 P! `# S7 G5 [" d0 y / \( _/ v$ G+ I$ Z& u& E) Z  S
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures/ i8 m* x% p" ^

/ E/ t' B! I' |+ [2 x' l$ p5 x* ul
% p) [& C- W! p* b  d% z
_PSS
9 }: U/ c5 l* g  uPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
' @2 O" X: x( f! i5 g$ z3 q* h并且通过一个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做比较
) Q) j! J4 t/ L5 ^以确定P-state切换是否已经完成。" F* @9 C/ ?5 J4 r* Y) q

/ Y0 U# s4 V/ M0 S, tName (_PSS, Package() ( R. A, x  m) Y+ M; I% e9 H
{
1 ^( ~: f3 v) P$ Z5 `& C; c# ?// Field Name0 j9 V$ C% c% s- X0 o' p
Field Type
' C2 S3 `2 E. _* z3 o/ {+ Q& \9 e9 [3 \
! N* ]' q' {, c* Q
+ F& H2 i' w, x9 W3 l) G& M9 K  [, G. E' s! e
Package ()9 W* g0 l5 g$ m- |7 Z
// Performance State 0 Definition – P0
  Z' J$ r1 p5 {5 C6 e& J# [7 P/ l
1 l' z, A, _2 F{
% y  H+ t0 [1 a' y8 i5 d) g6 q! r; I% k* `: s, b; W$ b

8 X) V0 ~) `* iCoreFreq,4 X- J0 Z) b% I) k
// DWordConst ! w& n& s& v9 C: H3 [0 J) W
  i# L9 U' L. R' Y

4 I2 h9 n+ B" T+ G6 BPower,2 H4 C" K& y0 T* J6 x1 a
// DWordConst   m7 V  L. H! s5 p7 a4 G  n

9 o  p5 c2 G) J/ JTransitionLatency,4 c! ~$ Q$ t  h$ \/ C
// DWordConst & u$ {" ~* c# y6 B9 }/ m$ k

& k9 P8 D  {# ~4 s3 l, q& x4 t! WBusMasterLatency,  C+ o$ p& G- k. g1 t# v1 A
// DWordConst
  @% M2 y  Y- l% w5 X7 H  c6 R( g* P1 t5 }  [2 X- I6 g
Control,3 ~2 F3 T; y4 q4 i# @: V8 k
// DWordConst
4 J: c# L: h$ V2 d$ ]0 M! F+ d/ X- C  K% |. ]) ?  R
Status: ?" _% L/ q0 ]8 Y1 ]# h2 }- y

% O0 ]* q$ m/ g; }// DWordConst . t. u! g) d8 z% h! H# y' T, J: W

' e" S2 F# H) g$ r2 k}, 0 P/ }. T) o/ f* i) x" }2 |

* E9 Y6 F* A4 d4 P* J8 e/ f.
. ^2 k$ q! ]+ D( {4 X9 @. M( \8 ], Q
.
7 J% |) G' |1 B* N4 f1 t8 l* Y2 b& j& m/ q7 y" n
.
" \% o3 O: _0 |" }}) // End of _PSS object  C4 U* O# h' _# C
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
8 r7 T; e/ o. P. w
; Y' T. J/ N; `Name (_PSS, Package() 2 h1 D% g0 O, V( j) I8 d
4 ^2 Q0 h2 ~) J& k! j" S
{
5 A$ f* w% V. ?6 U& r- r' _' {4 D. _. v
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)   R, a. q. |3 e7 c% j0 z& O
) ?$ T$ }5 J/ T& T1 c) U2 }
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) ! u4 I: K  W$ U- p" l

5 L8 {" ~3 `" t' GPackage(){1400, 8200,
: ]# w) y" N7 x$ N4 n) P( k  K4 ?10, 10, 0x000E, 0x000E}1 {8 |2 G0 j! z& y+ O
// Performance State two (P2)$ E% `' x) U$ C# D( f: {
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
8 q" E  g6 b) V0 y% b; XPerformance State one (P3) + z5 }; G9 W1 ~0 `" G; D

& v3 K, |# y6 aPackage(){1200, 8200,0 E; i( _/ n% M2 x
10, 10, 0x000C, 0x000C}
/ G' r5 f" D" h. v8 ]5 w; v// Performance State two (P4)
$ C( s1 l9 r. k9 ?
& H4 a1 S5 e- @0 f. S4 s  V8 w}) // End of _PSS object
# n' |; u7 f; X( k4 z, y. R % r" C# Z* K, ^0 f: C) O3 c
另外当该平台支持Turbo Mode P0将会reportTurbo Mode3 m9 @- @2 V3 q
* r9 B3 @4 m" S& |" g8 G6 h
l& T) }; L  I, K4 |
_PCT
7 U% K1 x8 {/ D0 Z/ Y
2 L4 x! c1 W: k0 ]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的方式来进行。3 G9 L" K' @0 c

: I6 U& @3 t( l( N$ B  JName(_PCT, Package ()
* J/ u: U) p8 Q4 @' Z! ^// Performance Control object % Q$ F% y+ J$ S
3 N  J5 N7 n  T6 B7 t) i' }
{
/ a* g$ R) z! ~" m5 K5 x9 [( T; c* M9 [6 i) z9 K( @
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
3 Y+ Z5 Y2 S5 [// PERF_CTRL
! k* B/ |5 K% U! C5 R5 [1 R5 b2 U4 @7 j
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
* V* ^  u- ]/ w- ]8 f6 g' B// PERF_STATUS 4 P; x5 }# C# q, A7 g# @
& R! o9 @! j4 w5 G& z. L
}) // End of _PCT object/ x' L, s# X7 U8 p4 |

; h( s# m+ I' Wl
0 V2 \! b( h+ y5 l; E+ ^
_PPC. @+ u; h' J4 k% u& o4 N

* p1 Z9 Z4 ^$ \; B- VPerformance 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- L8 w4 P/ n( i3 M2 T! Z! O' l

1 N) Y# g# c& ^. JMethod (_PPC, 0)
# U+ J" [$ t$ L1 t7 z1 v; Q, s( v// Performance Present Capabilities method   w( G! w$ L/ @8 Z3 e9 x- n" v
% b" G6 E9 G" N+ d$ b, m9 f! f
{
" Z7 o8 d/ b9 Q) u  q. L
1 H7 `4 V1 P4 j: PIf (\_SB.DOCK)
- i) W# Z0 U* \4 \/ p5 n  r$ N2 ^: ~, I2 Z) ]$ L$ i. s* e
{ . h4 J" l+ q& W! Q5 m9 n9 ^

  v0 D( A  e, V) \/ v+ L4 mReturn(0) // All _PSS states available; v- D( V7 ^; V* A
& J, z3 h$ n% l# `/ B- R
4 J6 N  [1 f" ~/ V% G. v+ h
} ! S, a' f6 J- i4 @( B* T
1 L& q4 ?; @9 G6 N
If (\_SB.AC) % c+ T; B* p  g' a
5 I- H; J9 n- x$ |
{ 9 g0 Z/ |: [2 m" X5 u' i

4 G0 {0 o/ v% nReturn(1)# L; S( }3 j( B& |8 \. J. m
// States 1 and 2 available
1 g- h  C7 R/ k+ }' f
7 ?/ ]* `1 ~! w! L: X7 k* z  X}   y) A3 B6 M1 Q# m

1 l6 t3 o9 V* U* [9 rElse . [# a& ]1 H  _' \' `7 Z8 @4 F

& z2 i, f8 ]1 m9 \! b& r6 J3 T{ - Y/ X+ R/ X  z; G: T6 [
5 P1 U! I( f8 ?# _
Return(2)
. D/ g1 D' |: j4 E& p' U; w// State 2 available: e/ a$ d. V- z9 w0 |
8 E0 h% y, j! c+ o+ D7 l" e
} * q( ?' _  o7 h( i1 m: j

* q4 o% p: o; [, A* \+ Z} // End of _PPC method
; `6 S; {( B6 h
' U$ m+ |5 J1 m, F/ g- a! ol+ i% B- Z8 C  g9 j
_PSD
0 n6 E: B. l2 h1 K. G
) T: J1 a* V0 l3 DP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。2 y. `3 h( D. H/ @& X0 D

6 M1 @! C2 z/ v6 q' kREFF:: k; M( f3 R! ?6 p8 [" T7 O! m
1.
& k5 C3 F9 s  G6 p' t+ m6 s4 TACPI Spec 3.0- V/ q. i% L2 m0 a
2.9 c& X4 z1 B( o) J4 d" q
Intel Processor vendor-Specific ACPI, ?+ C4 T& a" X5 @5 f
5 U9 V+ H+ a4 q$ n( F* K7 t" {

2 j# i* f4 b5 |; |# e3 ~% k, xThat’s all!2 V. j! Z8 J/ `" b

. r3 W2 ?7 x) u) q4 I' ]Peter. _2 {: p/ G! F1 w: `+ x$ |

8 s! Z" l, F! j5 ?" X% r& u# m2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview( N6 d1 Z5 v4 L

+ P1 G! ]) S: @2 a; a: jCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
% e2 O0 e5 `$ l; e,影响系统的功耗和温度。
7 `5 s0 ~, h- L9 ]7 S
6 J- {* d; ]: Z+ A$ g& u8 |0 D- E4 E2. T-state Control
7 r7 c/ h3 Y" E' l2 r
! u9 v4 A2 `0 j" ?( h# \3 X1)
' F2 _( V- l7 `5 O  G4 d; b% C: ]MSR Based Control
2 l) P& b( \" G1 y+ e5 f; s # F9 i) d1 V, x& B
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 " N& a9 T6 N( V* A8 _

3 @5 H/ l: n+ g1 M: f- I2)
1 ^$ X9 I0 o/ z6 H4 H% MI/O Based Control* i5 `; N& ]$ O/ X

7 G9 }2 `# S/ p8 v) W8 Q3 G/ r除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
. s# ^5 E5 |6 m( ?1 F) t6 y! {
4 U/ A# ?6 p' I- U& w3)
, g7 i& R- G. }- t/ K2 T; Z+ gACPI Structure For P-state: s* Y' y( `  k8 a- |& ]
l
) O8 h3 g& @' w( c2 v: [# E
_PTC# g6 ^2 j3 Q( N. y- L# Q
$ s4 |2 I' _, ^! v0 T+ f8 z
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
8 _# l! p" t& d/ i! ?( ^- j * S7 ^8 D6 g1 y3 {
Name (_PTC, Package() 2 ?" _8 V+ U& T
{ / Y( ^5 N  }# I7 S# U. w

; }" f5 a# g7 h) eResourceTemplate(){Throttling_Control_Register},
; e7 @5 D! v* M//Generic Register Descriptor 0 a* p1 q) b% t* Z4 B

% @6 I2 K+ P+ @ResourceTemplate(){Throttling_Status_Register}
4 n( f" k+ g" ~//Generic Register Descriptor
6 Y: z1 p6 F' H, G% n. |4 \}) // End of _PTC. ~+ X8 q9 K) _. o- g
/ ?# ?) l1 E" d% t9 |1 ~$ t
下述是一个sample code. s; U1 \8 ?; w2 N( e- N5 I
9 G% h  h( m# U* V4 R
6 G' i5 B7 S3 \% r- p9 Q
//. L; a9 h; l2 N8 X

( n  T% r* K# v9 M, j2 ~// T-State Control/Status interface: y* c! Z8 _7 l& Y  y6 k# L' ~

* W1 ^/ k" l& M6 c//1 i4 v* U4 ^7 c7 K' X
* q! B4 N3 o" {* {3 W2 ?# t8 z$ V
Method(_PTC, 0)! j6 L( {: L9 T$ c/ T% D

$ v/ K  k0 G. p! _& `( w{
3 D: y! b5 P) |& W8 q: _  }2 F+ P6 c+ ^9 J
//% ]1 @5 P2 d( v" c7 q8 u- d0 _# o

1 b* U! N7 Z' v// IF OSPM is capable of direct access to MSR7 f' v- w5 E, O/ c& P5 ?

- a6 S4 ]7 A, N& z//- F3 L7 H9 y2 A7 Q! W
Report MSR interface; B" w  h' K6 @1 D( h

! s' }3 k" [. j$ e$ U: S// ELSE' ^2 j4 l$ V% j+ \( O9 H% q
: ^4 n, W$ n$ k% M6 d- r
//) Y  n7 M5 D$ ]+ [2 p
Report I/O interface, n! W3 X4 B9 c5 g5 r7 u
6 @" p+ Z9 }) @. E) z) w
//
- X1 J+ a" @% _2 O! J& |" U6 g2 W" t  p3 V$ T, y" I
//! E0 t6 v" n/ \6 }7 e. A4 U
PDCx[2] = OSPM is capable of direct access to On
; m# P+ @3 |9 z* r% Q
9 ?6 [( ^$ A/ B! z# i" N//
% ^* i! l4 p% b* g$ ^% ]Demand throttling MSR1 k/ C( _9 t! z$ Y; J0 \

* o9 b9 y1 H# f, H//5 C5 [1 h4 N! D: u8 G

2 Z  i  t4 \7 J8 X6 DIf(And(PDC0, 0x0004)) {6 E; A! D& j$ Z* k. j, V0 u) t
: a$ \8 z* A( m
Return(Package() {
  e+ x: U8 s8 d+ c  J# h% v# E
# W! ?; F8 I2 p7 fResourceTemplate(){Register(FFixedHW, 0, 0, 0)}," V0 j. _7 u+ y; J/ Z; L

" V5 H' i7 v" t  t6 V  z( IResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
- h6 {* i6 l1 [, t- Z3 J: @! N& I% ]% }
})
; K, E6 }, B* l$ M7 o7 [
4 j' l) p9 p. D9 a' B/ i* G}* q# G/ }7 M; I8 V% T4 `# E% H
: G" z% ~  @% _; X+ @
Return(Package() {
) e3 e7 B- o. D1 u; R# t6 I
  d! N# `5 R$ v( r; rResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},5 `) Y! _! q; C% H
/ q- n. x1 O# z( f, i" X1 r
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}% s3 w7 e. r- A/ [
8 h4 }9 t" {8 A+ t: j( v8 L
})
5 s" M! r6 \# i+ m' d( F, o. J% e" Q1 _6 h$ @$ h
}
+ V5 Y; u# x9 I0 p# U+ @6 ]2 E3 U
/ g- {: T( T6 d
, ?) e/ s- o6 q$ x
l0 Y( y" h3 j3 E& c
_TSS" \+ S, g- m1 M8 d; H* M  K
8 ~+ ]0 N: g+ Q; b1 I. O
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:) G  f4 K9 c8 g6 ^5 \1 p9 c+ m
Name (_TSS, Package() ! r4 L1 T9 Y" N- F
{+ t$ m8 S! E4 P% L: l( }
// Field Name
" T, |1 x  R$ G" f+ W( OField Type ! n" q/ p+ j/ i/ d, s3 G

2 Y* n  p3 y# e2 r0 Z' I( [- v1 E; y2 I
6 T0 m, `0 \( a: M% q' K! ?9 Q% G
Package ()
; T2 ?2 e0 q) b8 w// Throttle State 0 Definition – T0   X: c2 v- }( ?! l1 u
) E7 D4 D( ?1 p: l' F
{
& L# f3 ]5 k3 e) c7 E1 \3 F4 x- N  ^
2 N! B3 N% B. s/ _& O8 Q
FreqPercentageOfMaximum,
) Z: m1 i( O" V$ p6 q! ~: W  x# W// DWordConst - \& n  |9 K/ m5 s7 e3 Z( |6 o2 q1 c

2 p7 E6 C5 L9 f9 }% H% vPower,( b0 e/ r- T2 b4 G% u( M, `! Y
// DWordConst / \9 i& B! E6 H
1 \; _) Q# Z- C% }6 Q
TransitionLatency,
! o7 h; M' |0 O, ]: R' {, o& @// DWordConst + X0 T" v) V1 H" \
* G6 [2 d3 j5 C# U+ w1 t# w4 j
Control,
4 E  e* o7 J6 D  N+ n// DWordConst 9 n) ~* R: B# e0 p

8 ?! A6 G4 @7 x; }% l/ sStatus
9 Z& V) f+ w6 z% }/ L+ \// DWordConst 3 D% j; E  ^4 d: p# r  d; t" f
},
; J& B; O/ Q, I……
8 a' j3 G# \2 f/ u& q+ D1 `}
1 s4 e/ l3 ?; }( j; T/ A
6 g9 [8 C& H8 d- L9 A  p5 aExample code 如下所示:1 q, C7 ?) Y, B( a2 e# A
4 [9 o1 y& u5 R' C- [
Method(_TSS, 0)
+ a* F5 S5 i7 t$ y8 h+ X- Y3 f9 X' s& K( n7 r# {; V  Q6 o7 k
{& b& Y6 H2 A0 s* q9 ^! F- U

" b9 [. U% v) A$ h3 bPackage(){100, 1000, 0, 0x00, 0},
, u7 t. F& `" ?7 B+ P; \( S/ I7 X& X+ f7 [! q
Package(){ 88,
- x  v' _2 n. |+ F. @875, 0, 0x1E, 0},
! D+ m, ]& x9 ^2 W5 }1 ]
+ A4 W; o6 ^1 n1 ?; {% lPackage(){ 75,5 U% m2 z( _0 A) G5 b
750, 0, 0x1C, 0},
. j/ v4 A$ f% O/ y  z5 y( {" @' N$ U, W  j( x
Package(){ 63,6 a3 j9 ?) z1 M) n6 X) \. |/ g
625, 0, 0x1A, 0},
2 l5 R* p8 x* E9 _" J: @' `: l3 l8 e8 ?$ S
Package(){ 50,
# x0 u% L1 M+ M) u500, 0, 0x18, 0},
- c- {1 E3 |( h# h; f
3 x0 R4 J& |( C0 k9 a& g1 FPackage(){ 38,
$ Y4 n) q/ X( n8 q2 t: Y% h375, 0, 0x16, 0},
4 q" j3 h# d) _5 k0 f4 ?( {/ [/ S% _5 @: P4 W3 Y+ r
Package(){ 25,
; X1 M3 G/ o% P# W9 A1 |250, 0, 0x14, 0},2 s8 j' H; I5 H$ }  p
1 r# R% q' c& O# v
Package(){ 13,# u3 s+ v7 T* }( ^4 X
125, 0, 0x12, 0}: _. f1 v0 F! v: [% D

7 L5 p) r4 S! S2 P0 v}! t7 P' ^1 k4 k& P, e$ V
4 r/ O4 O  p* U, m, z8 w: D' V5 k
! n/ O# y3 h' k5 H  p3 s
l) f; o- l3 s' ^1 r$ B
_TPC! t" |0 z' y8 W1 W8 \& T* x/ J

6 Y+ W) F; z: GThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
0 f3 J. n3 ]( `9 ~0 P
8 _3 J4 p% I6 W9 L& R  gl6 a- B  m# o/ x3 u1 d8 {9 a
_TSD5 R& _3 d9 Y# s0 r' P0 k
: o4 O9 @9 Z1 D$ p6 ?/ d# }# O6 s
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code; V4 c3 e  \' k
( n/ f5 n/ n. D
Name (_TSD, Package() 2 ?6 b, Z3 @& u0 k+ \9 o* Z0 p! P8 ^
8 v7 ]+ I8 f3 o
{
7 L/ V' q$ o% Q! e4 _$ K% N$ J. n4 I+ m9 y
Package(){5, 0, 0, 0xFD, 2}
3 n0 m* [6 b9 P  ?; f) X" S// 5 entries, Revision 0, Domain 0, OSPM
9 `( o  H9 C; ?Coordinate, 2 Procs
% m- t& D1 X7 z$ I* K- n/ Z% ^0 X+ A# F/ m- Z2 E
7 R/ S# A9 d' [) }; b& Q
}) // End of _TSD object
2 V; `& ?6 i2 h/ ?# n# q% s . G) l& d: V! P6 M- C& R9 b' t7 j
REFF:
+ L+ v/ Z: K( K0 t& j, O' t1.
- a" N5 u) P9 ?' `ACPI Spec 3.03 [& f3 @5 E1 J% `3 q. k3 w, c
2.* l# K" p$ ~1 f" `# D: }
Intel Processor vendor-Specific ACPI/ |( i  ^$ c* e1 z1 ?# c) b
& s! v2 L0 x: ]. Q- L/ l
2 B* \" H8 b: N8 k: N
That’s all!1 v- T7 k* A' r2 i$ E. c" W: Q
" D* `1 v0 G; b
Peter- N! H% t% A/ c2 Y  v1 ]
+ S' p) {3 i( M1 w6 i# P
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 14:20 , Processed in 3.366700 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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