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

CPU Power States

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

/ I. g) g! V) A$ y& F/ J( E& y1. Overview
. c- u0 c' I6 P  D
% @: h- \& p3 a5 a+ Q
0 S# U1 J0 ~7 X$ @C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
, s* s1 [6 S6 o& c4 q降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看( U1 S6 e! k% Y1 \- u
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。) x  t) R4 O  T" B1 U$ u. ^

5 y; W3 M9 T& B7 U: ?
cstate1.jpg

: \7 S) K9 E% h
1

4 A# U4 d5 k* x7 m5 \9 W2. C-state Control9 ?2 l1 A, K8 \( ]
7 z" I, l' K) N: J4 X6 s% X0 u8 e
1)7 X2 l: e% i$ x
Detect & Enable C-state
! d4 B6 w% q# u3 G0 `# r3 k
  [+ t1 O4 ~  c# s& GBIOS可以通过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* U3 L) H5 ?4 w2 s/ r

5 X/ e8 E+ Y  h7 A: Q2)0 |$ H* R: S) ]% V; n8 C
C-state Basic Configuration
! J. B/ W( B0 W- c4 C: B: _通常情况下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)。
9 i$ F% j  [  j4 [  y7 R) e# p$ M) O5 a7 x  f
3)
3 r* s; B) q* _! x1 qACPI Structure For C-state- ?  o$ j- U* U/ n

( O$ I( l3 z# O. G$ m$ g! @l
2 z5 [! l! M) V4 F0 q
_OSC & _PDC% a9 J( o. E. `! l" V
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
1 a$ F% @0 J7 Pl
. o; f3 P$ Z1 u3 h1 h+ D
_CST
9 I! \7 K! |) l" g7 x, W3 M_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
# o2 X; i9 q3 ~, s+ I: ACSTPackage : Package ( Count ,! Z% U1 ^7 n7 |
CState ,…,2 [3 T' a8 K8 U/ f/ I
CState )
5 t$ O$ I! R* F  C其中Count表示所支持的C-state的个数
" K, I5 k9 F6 s: f' O2 N$ W9 pCState: Package ( Register ,
8 h5 i3 n1 y- ?! bType ,
2 v7 s% k2 i' B" yLatency ,
+ Z% ?* {5 [8 i4 s+ Q- _9 CPower )9 n9 |* c- |7 l
* }6 Q. X/ g5 }, v1 _" C
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 C30 x' t% j& A3 ]) n. Z; q! E
& e7 t4 Z" R3 a) I  \" T0 `9 L
Name(_CST, Package()
% m3 ^2 d7 O* Y" W7 V" m7 w
) ]$ V$ z* ^2 Q) W! \9 l0 ~- n
{
# B; N' V+ c! N# h4,3 ?2 d4 g! ]5 E- X9 q- |$ Z  l
// There are four C-states defined here with three semantics

( m- D# w8 B3 B2 Q) y0 c; D% H0 [& Q- o2 a7 e% K, \
// The third and fourth C-states defined have the same C3 entry semantics
9 v- U6 J# U  G5 @
$ Q+ ~) Q3 r3 G9 r
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},  o& v# {, R! B5 l, A5 F
1,
% n9 {+ T+ g# ~4 b. h3 M20, 1000},4 j2 [: L% I; l+ x: A" p5 v% ?

& e: Z1 v+ O4 g7 fPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,9 B/ h# ~8 T9 D
40,
# b  d' t3 m/ ?' Z* B750},

  W* }& i# k; S, e4 yPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,: E* h2 Y- B3 F- Q$ T1 J+ Z  f
60,
" M; [0 j/ |0 n2 u6 _* P& }5 _; f500},
+ F  f2 \8 P) g6 {
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,  x1 b8 D  y" m7 P' ]
250}- j! P% x; l1 g4 V5 D
* F; B) \  \2 Q  F# z/ L5 A% S5 H
}) 4 @: g4 o% ^& v- T' o
5 t7 n9 g1 m& w- a& d. w4 ?
l) k4 C2 v+ u3 l, S& N( V1 _" Z5 R
_CSD% e- r* ]5 h1 I* V6 U4 M* `

: k; j; F  f5 P( HC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
6 |# j% F/ e- ?# u. m
$ s1 T6 D7 f. M$ @3 e* I
9 R8 z! g( v7 p  \2 e: Z2 w. I; f/ ]6 R
+ _. `, N4 L$ E0 ~
3. P_LVL VS FFH5 o+ u; S+ t. A
1 w! M1 M  T7 [( {" K  `
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
1 G& t* L* T% f6 F2 SFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:" B$ H2 z$ f* Q& x. l# S

8 c! m/ Z7 u. M
gas2.jpg
7 q9 x3 S2 `+ J7 G" M- @" p; g
2
; i; t4 T/ e2 d/ h. y& @9 ~
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的一个例子:2 s' k- g( t& V1 }  v5 u  T
Name(_CST, Package()# H( m' R' E# m3 X0 K% w
5 }/ s* |8 l+ a( f: T
{ & o: K; n7 n- A! V" D2 U3 g
2,
# g( P- ?0 J; \* o, X// There are four C-states defined here with three semantics
3 g+ c: e# M. r3 R6 Z  H
0 b% ^  d: B2 r6 o+ i
// The third and fourth C-states defined have the same C3 entry semantics7 |- c$ u: E# _" A8 @3 ~6 f
& h" s% H9 s' N, t  M4 X
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},5 K; `0 g6 p  r2 Q3 q% `& ?) s  j, u
0x01,' }* X( m" m7 J( |9 D' D2 p5 b! Y
0x03, 0x000003e8},: f5 g2 y0 x4 {# M

! J7 [" r' f3 I7 \  jPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
4 K' Y  j' t7 Z+ ^& t* ]- K0x01,4 V  t! t0 p+ X; d7 n# ?" T
0xf5, 0x0000015e}
) ~6 t+ C3 {: V. n3 m/ ~4 ~
})
! c! V( v+ S- w- p$ p- n8 K- e7 G: n; v6 g

; U4 C6 ?. |* u$ dREFF:) R; Z8 _' a' v5 O+ a$ E: m
1.( s' u: s6 K  G# Y* S$ `7 F
ACPI Spec 3.0+ n' R2 d$ f, H. P
2.
% a8 E3 z( Z  E. q% ^6 y; iIntel Processor vendor-Specific ACPI
' `3 c$ `; i' g4 l& [5 O1 F* |6 W9 {* s0 c
  J# H& F+ M7 r' }- ]
That’s all!* g# i8 ^1 D- f1 G# q1 ^! T
4 @& U% h/ p4 q2 f- }$ v9 M
Peter
3 a) ~- Z" G' |0 ~4 M) ]
, {5 ^, C2 X' P4 W1 g) E2010/9/20. w5 x/ w& p9 F: M3 \9 [

' h6 H$ K( F' I1 b" C+ f' A[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
8 D6 z" G! {1 M/ J; b3 S+ O # ]+ q. j, g7 ]8 G2 d
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST2 M1 y) e; J( @, r
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
0 K* h  \" e* ~. t; a  } , M1 X0 a9 m8 ^) u8 v2 j
2. P-state Control; X1 r9 h' _$ X: [7 O

- j9 n" t+ |  ]2 B! h1)
. D4 s) _2 }3 {- b$ b9 h  fDetect & Enable P-state' x" B! K  J# m, C, T
0 c3 F) M9 l2 f% \; S1 {+ }2 t2 a
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state0 M, G8 Q! k3 m% f- f' i5 d4 ~: w
3 u' K, K1 q$ y; J& ]
2)5 T$ D$ n% h' ^7 ~- d. _' c
Supported P-states& J# u* I/ z1 M+ }7 s9 u% @
( M- j4 c$ ^. T) m
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$ }/ x3 e: I% K" p
& J8 c. U, P! m2 l! n" d
MinRatio = PLATFORM_INFO
" \1 \& R: [  O- l% iMaxRatio = PLATFORM_INFO
7 }( u1 ?% L9 R0 c$ {RatioStepSize = 0x01  P7 c. K" c6 V0 @- A! p* R
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
* B! {+ [% l' z
# Q2 U0 ~! v) ^, h3 ~If(NumStates > 0x10)
* y0 _7 M8 k, A% @2 S: u{
! p7 K" x+ D, j0 J7 J; l% P* m) X, ?RatioStepSize += 1- U/ j; D! r8 d6 Q: B
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1/ q7 t1 c2 ~  D! b, H" X! z' r8 M
}
/ H+ x8 ]6 Z. u$ g
, @; t2 B8 _+ W, E. R4 |* E3)
: }. r9 S2 A& S1 \Turbo Mode. `8 o3 u! _0 m2 Q: o! }0 c9 ~

( F5 c# g6 w' n/ QTurbo 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! Z! P2 Q( l9 _. L2 _& r/ @

. d' t" `6 ?) ~* n4)
) \; F  d# m! Z& W& G' N! z+ mOver Clock
& d6 S! l8 u! ?: t6 ~2 y ! L( R! [: Q$ d
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。( B  b! P' ^* n3 i+ d- \8 E" J
- M% [2 O' Q  C% g. K. Y5 X
5)" i% b( F7 K& T! U6 }8 s  D
ACPI Structure For P-state
& @- B; c1 s9 i' {1 q7 H
6 F. e5 m& b; R; ~+ P4 ]l$ {/ s9 x) @8 [; |6 u/ X
_OSC & _PDC, K+ @# h8 C8 e7 u. F# b
( @5 B, |( X! z0 _3 M; J, A; |
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures- X. i; w9 I5 r% X

7 s2 [% c7 b6 X. u4 N2 m, [* v1 |l
3 s4 \, n& I( E/ y- e( [" Z
_PSS6 ?8 u1 E" U. ?" h+ J  v( {
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量" n+ E) @8 v% M  m9 S
并且通过一个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做比较6 y/ d2 i* E* U) Y# b. k2 u
以确定P-state切换是否已经完成。# q# p0 e7 v9 c% w& r0 T# d3 x

: t% t; k4 Q- Z% g2 kName (_PSS, Package() 8 S1 ~7 U% ~: {: w
{6 W+ ^" T* e( E& [; ^
// Field Name8 \) L/ i4 v# v0 ^8 D. p( ~) Q
Field Type 0 T- o  w( j6 Z- f) p: e
! E2 ?7 O& J6 ~& A/ m
- S! \. e& M+ L7 U; L" d7 j# ^

" [( T' }2 a( h' X: LPackage (): T# v% H- I" ~2 v* z4 J
// Performance State 0 Definition – P0 8 m* I! n$ W. u0 ^' ~
& L+ m3 g" H# T
{
6 s! m9 t& R2 m: A, {
4 t* U  p" ?8 h. E5 ~8 C$ q% `1 k, N; D' C0 r7 [( O( X
CoreFreq,( J  i0 q0 E; O6 a) Y4 y7 K* D5 n
// DWordConst ! X5 n& Y, }* X* B# T

0 a  L3 a. A/ t: D+ V' H+ I
0 y# }2 F) l3 n/ QPower,8 d, V- [' l% R, g# `+ c) n, u% U
// DWordConst
4 g1 N; k& m8 q8 Z( q) ^
/ w" l& O( [& i$ @- ATransitionLatency,
2 V. f1 }4 m: {( g2 p: T  [8 W+ i// DWordConst / m/ ^, ?2 L  l% ]4 m' w+ I. b

3 M7 l, g8 e  F# P" P# B) fBusMasterLatency,
/ K6 M# |' W1 J5 }+ D! A// DWordConst
- C# j# f4 L' ?2 a+ A/ m1 b# b" d* x. @- j+ o. m. V: t" f
Control,
4 c3 R4 T( _" Z+ m$ }// DWordConst
  I3 J, S/ |5 E6 g) Q9 `* \  E/ }6 r  s6 |, q' e$ ~, [( \/ H. B8 w
Status' d- T- L0 q5 i, S6 b5 H0 r
2 Y) D- N2 u( F% o& \2 ~
// DWordConst
0 |% O' G% ^  v. L0 R3 k) D) X  W+ M/ z
}, ) w9 ^1 w; H  y) V

: h# R# \8 i4 y7 e: V4 O.
: l$ `0 w# i8 t8 ]" N( H6 W) d% f
: O- [) q- R  |, b.   m7 i0 j# k7 a3 C* l
& o3 z# c( Y( M" Y
.
& U0 b& d5 ]: R1 Y' ^) Z& t0 d# f}) // End of _PSS object, B; b  l- C+ P# Z& S6 c: x8 ?
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
9 p* X2 Q7 r3 C# O ) j# I& e  [4 Y# H" P
Name (_PSS, Package() ; p8 g/ d0 }1 [- C7 s' b$ \
' f; L5 Q, H0 B1 K' D  ]5 c# N
{
9 z8 N: Y3 Y( h0 H+ N2 \/ E! P+ N  y* @: ~, J" s# p; [
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
! d2 J2 Z  M8 F, U9 _, h0 n# z9 T0 ~# J( @  G, D' i& U/ v  a, o/ r
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
, h/ M0 g% f+ D6 m/ q$ `3 m7 k( L8 j) Z" B5 b2 Q  N
Package(){1400, 8200,
  q% F# H5 Q3 e: y5 d10, 10, 0x000E, 0x000E}; S0 @$ r0 m3 y' {
// Performance State two (P2)
/ h4 c2 }  I3 y. m* p3 oPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 2 K# d0 [8 ]. m
Performance State one (P3) 9 y; D7 U/ b7 ^" G1 ]. ]

; h% _' @& z% P( o4 \9 |) `Package(){1200, 8200,5 h9 N  Y- B" m1 V. p; Y; d% X
10, 10, 0x000C, 0x000C}
2 l+ {. K6 f% i1 B) A! P// Performance State two (P4)
) I7 b/ j  S, ]7 U1 x8 U6 m* s* B6 I8 C) D
}) // End of _PSS object
0 f8 m- R2 {4 b7 U0 ^" \
6 h% R2 T6 h8 v另外当该平台支持Turbo Mode P0将会reportTurbo Mode* N  L2 ^( L2 S, ]3 O
  h+ ^3 e+ e' w4 v* r' o0 ~
l; X  O% b% F9 s
_PCT$ j& Q+ l. G/ x2 q) O5 ^

$ d- l1 s, s' B- H- D( i# ^  _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的方式来进行。
, V1 Z' X9 O/ @ ; {- H& X) d; i8 [# j
Name(_PCT, Package ()8 }/ Q0 T9 N* L! n) m  F* J# K
// Performance Control object
# g2 q" Y+ `8 S2 S# J
! ~$ }) R- Y/ m+ e* T) V: B{ " w+ p# b! n- v+ |) d

% _: f8 `; H; R; A, G& z" MResourceTemplate(){Register(FFixedHW, 0, 0, 0)},8 u: ^2 H0 I, Z& b' A
// PERF_CTRL
6 b" T4 ~, g9 F8 i: J4 e/ p; f: p
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
* E! t$ l' }* N) e& a% ?- A( c// PERF_STATUS
$ E3 _8 n$ v7 }: d" D" g  I& m8 L
3 T7 C' O+ r8 k. M3 g}) // End of _PCT object
- |! w+ A/ w0 i8 F  m. z* u 7 w' [7 |: q2 M6 G% z
l, L) X( I* S1 m, G& ]* B" i
_PPC
/ `0 P9 N4 L4 y 6 S) i9 F7 p, @- t5 N4 F
Performance 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 I' T* {; U1 T$ A8 ?8 q5 m" d / H$ ^0 U$ b1 R& J
Method (_PPC, 0)
1 @5 U$ V3 t4 s0 H- Q7 \// Performance Present Capabilities method
: A; Z3 y$ }4 R8 y  {0 K
, Q3 J& N1 ^% R8 v. g{ / u8 [* B* ~9 g  h8 K) N! U5 J% X% x

8 n: {% \5 t9 o( [. N- G" mIf (\_SB.DOCK) , q, S# x% ^, ~/ Q0 s% {# E
% r- v( }' [* j) a8 ~) \( U
{
# j- f# H" s* I) I: e
: B9 `2 H* V1 @3 ^; Y- a- YReturn(0) // All _PSS states available' e. p/ K+ {6 L- G; Q! W/ q

+ U6 C) U9 x8 D% \5 B2 H
) ^0 ~" {; x: \' C} $ r! J5 {# z# v) S2 g8 i2 D

/ e1 |! Q  ~, V4 {% Z; X8 HIf (\_SB.AC)
$ z6 W) T, T, U! q3 I" z8 U7 L7 }8 O' h% Z* c
{ * F5 m/ l2 X% S& {& P. N* y

, G) r- {8 Z: i- Z" h! LReturn(1)2 ^) L8 o3 I- b1 O
// States 1 and 2 available # H1 B1 v' v6 n" ~, p

3 T' _+ O8 _( t* y: w}   o9 H" c0 P- p  z% R8 ?

! P% L' L, o" u# j% \8 zElse ) \5 a1 J6 N1 B5 E0 r: |! z' E8 v' B
7 a5 N4 c: |' _
{ 3 }7 p9 z9 e9 u; a
1 t6 C4 d' d" J
Return(2)
$ D1 \8 [2 J9 g" c# F6 n% U) h// State 2 available
5 [' A- P7 K& g! h* E  }2 S6 c+ ~# ~! G
}
( P5 n7 R( T8 |4 t* v/ ^
, `6 B* Y  d8 `" N6 W1 P+ T} // End of _PPC method
. M* R, L; m1 { ( z: s7 n3 _' G0 j* [
l
" I% z3 I* u1 g! r& m- I. _
_PSD
0 w7 s, H# g  O; M* p 7 m7 j4 R2 ^$ ]4 r
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
/ c6 C; e( l' X6 P) D3 B4 F
3 r# j9 j0 Z6 j: A, xREFF:
8 h1 a9 L2 A9 ^( g( h1., a& H5 G& q& d) q, D8 @& A
ACPI Spec 3.0  E+ Q; w5 M/ X' L! E# j7 _
2.
4 U! _" P5 \: c, _( b/ X; w, DIntel Processor vendor-Specific ACPI
8 d# x. M, J3 t8 t& \. Q
) n; j0 ]6 U6 Q) c7 A# y$ x
  T, s. e  ~7 L+ s3 FThat’s all!
0 S6 d5 G5 k4 V9 {% Y9 l 3 Z. t( K* X2 U" N1 V: ~
Peter
5 p5 I4 b/ f0 p8 j2 l$ u& x ( U; n$ y, R! _0 \5 L# r
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview* i( w( u$ x1 H: p9 \3 f( Q

: g$ O, _! w& F( f) T* wCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
  g7 V4 v( U' [7 ]8 o,影响系统的功耗和温度。
) b" C( k: v+ z+ x; N4 x
( C( N* Y! R4 Q0 X: H  |& x2. T-state Control" T* t( x# T( E" N

; K. q* J- i$ o4 P1 }1)+ c) Z+ \: A  S5 ]
MSR Based Control$ V* N% q0 @% F8 K2 C) W

8 V7 I- j7 E$ f" X9 z: oBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。   J; r$ P) e8 e6 b4 F- y

+ T8 h( B; c% x; j2)
2 y; B9 Q  f6 _I/O Based Control1 U' s8 S7 M* l: r/ Q( j
- {$ f3 E) F/ s
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。% N; X( l3 H: D$ v* b
1 Y6 ~4 ]4 l  y+ D: e% w/ w
3)
3 U2 B+ e% P$ y* iACPI Structure For P-state
7 z' H% @& w* S+ n5 Vl
6 G9 h4 \4 V$ K; ^: l1 ~" \
_PTC
& g$ ~3 L# F& `
; d3 W) C3 Z$ @- C* s* TProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:8 C1 M0 Q# u" Y) p( U$ T  E
) k/ \( {6 d# e9 ^& O, ]8 U
Name (_PTC, Package() " G" W7 {: u9 F. y: E
{
" W# m$ t+ L( m2 c
, N4 p/ X& t" ?& g3 B. lResourceTemplate(){Throttling_Control_Register},
0 c4 i: u2 ~# S# f( w3 a//Generic Register Descriptor
0 l+ u7 S. s* E0 p% i6 ^- ]8 w2 C8 g1 F& \, o, d- H
ResourceTemplate(){Throttling_Status_Register}: @% c8 @( Q! P
//Generic Register Descriptor . K* d& @: P) v( q3 e
}) // End of _PTC' K& X' e+ F% v7 v. |. P6 Q
5 r2 r( a. D+ }% a
下述是一个sample code7 e* F1 I5 ?# E2 w0 ]

! Q  @$ h' L( @+ p% M9 [% A3 k
  b2 x: s9 z& T9 S& h1 h0 H
//
4 @6 O) c8 O$ w* {& I3 W. r; K! m7 ?  _% ^' Q3 i
// T-State Control/Status interface
* B. k& d4 ?( [& [' D# c7 z$ G
. |6 K& }% G2 A' v& A' g% ^- h' ?//
9 s3 z0 F$ j# K! i
" h1 w5 P+ s/ B& nMethod(_PTC, 0)
. y( w. T$ u8 F6 R. }
! A3 i( ~; J( J$ n! l" N% z{) r' x% A8 ?3 ?3 l5 O
; e4 V- q' r2 _! {
//
4 j' W, f/ |) s6 b( V' D1 y8 @# `' v6 t7 u
// IF OSPM is capable of direct access to MSR, p! I. e! N0 y. y" D: i

, j- E  `* Y6 R! I6 u5 V' V//! x8 J6 x5 F+ L
Report MSR interface8 g1 _# T: ]9 m2 C6 z

3 z1 X( B  f# ]- c2 R$ Z2 s// ELSE" O" L, `3 c8 z& `: _  d

1 z# F, E3 j2 A  U//
+ S$ [/ h1 Y! e4 A0 M& S( CReport I/O interface6 o# T& U1 r; ^' @! A% \
8 s. z/ x, d% ]$ k( ?- [
//
( F' f6 a5 e& T2 ]7 \( g) _/ y
2 ]2 q& c5 E& a& O//
; y% b- M& ^; _( ^PDCx[2] = OSPM is capable of direct access to On* C4 v, E1 i6 l4 Z
) X# z* v) ~/ _, Q- v& r
//1 X" G, w! Z4 D2 z5 M. h
Demand throttling MSR
7 o. t; N+ M- c6 O/ @! x! k( x3 V# r# F2 D! T, z7 n% u2 j& a
//
1 C2 @+ a$ N" v" w* v! ~( r8 R
, Y. ]: H1 u$ |3 aIf(And(PDC0, 0x0004)) {
: o7 a4 P' R0 f, J
* i8 g9 Q2 T" s1 W* i& R7 e4 u# r/ cReturn(Package() {+ A- v' Y  [7 W3 H# l9 C
3 k! V* I* f; B* s: {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},, `. n: ]3 p, z& _$ d

2 D5 n* B+ ^0 \0 S1 iResourceTemplate(){Register(FFixedHW, 0, 0, 0)}( p- D! F, w0 R+ i8 H4 a# H; F, t

+ I; }8 M& \% G0 m- r1 M& q})
  o: _! q4 O! C" k( h$ }2 ?! `, ^" b7 Y0 I) O: o3 v
}
7 Y0 c$ ?5 w: u" K8 V. k% M/ a) V& p7 Q# X4 }; T
Return(Package() {
( E# F/ v& e% ]/ }9 P' _; d
3 N  p7 S9 A7 O# m% JResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},% A9 t' w& o9 F" F

4 @4 g' v- R/ Z$ tResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
) U, r9 @" B) ?) y% D" ?* n+ E! D
})
9 b& L; f+ W$ R; m% g( G$ u
' O9 p) x% Y% \}# [2 Y2 g# z" O
7 H" f- z" g2 s9 p. Y' c" y* ^& U

( q% N3 n1 d+ s# q! e5 X& S7 y+ P/ b% J: q4 o9 \& O# s( @7 B& _' ?
l- o' P" S# E' f  Z
_TSS* n4 k$ T5 ^! ~1 q* w6 b
; k5 m; ?/ R9 x
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
( A4 V8 l" _5 w* W" m9 PName (_TSS, Package()
$ |/ o" c4 F- I6 S' n2 C{
) A; D- w9 B, M* S" m. D: A. m// Field Name0 w8 m& ^* K0 |( G3 Y
Field Type
$ c3 e" e5 W( c& u* `
( O# ?0 G- K6 O' w" _( y0 P, g3 s# |8 U# F/ L) {

9 X, E% {1 w5 @1 `. h7 O0 T* XPackage ()/ J$ P5 A; T. t) i
// Throttle State 0 Definition – T0
! l3 O0 Y9 @  Y7 Q/ B7 R3 M: K
1 F9 [0 W# w: X9 f{/ a! G8 e6 `) o- s: B

) K( ]7 m7 W: P5 \3 r3 R, W" L9 N2 C- K% B  r! X& D
FreqPercentageOfMaximum,
2 k. U. w+ |4 `) x// DWordConst
4 \3 y8 u1 z2 q3 K, |; b; Z6 w9 I& d8 ?0 {# @7 C" w- s0 u" v, a" u
Power,
2 P. D- ~* w0 D( e) l4 n// DWordConst
: Y% Y& ~' D8 t2 Z0 d! `& ?9 o8 w
1 [" F& _9 ?: p( S* v1 }TransitionLatency,/ e! J- ~$ F% O' V* C% _
// DWordConst " T' v! d3 q  e, x9 b- p. y2 s

3 H% M' ~" M5 |( K& y3 u3 Q' }Control,
0 j* c& c( R8 Q  U. ^, Z// DWordConst * A- i/ ?9 p! F* l

) X( `$ x9 Y% KStatus) G% {6 i* Y; N- G4 `: A( V
// DWordConst
! Q( b; \* `4 l4 d9 V6 Z0 ?},
' k2 ]/ A# s5 _, S……
1 C6 m& j/ H, I. t/ V}
* j) z: U+ M0 E% p- S' Q% i# y. W: u
Example code 如下所示:
" Q6 m3 q( n1 W. @$ B* S& }
6 q# p  H4 {+ C3 A1 n6 Y5 tMethod(_TSS, 0)* y" G- G# N0 j2 K$ ?
+ z/ X2 ]. t! r/ h
{
& P" o) x, T( D9 `5 p! D& c0 ]" M7 j+ Y
Package(){100, 1000, 0, 0x00, 0},) V% Q$ [3 r4 \! G6 D0 h

, R1 S% Q$ [! U! u0 Y. q! D5 EPackage(){ 88,1 }" Q8 ?5 ?# W7 O0 B4 t2 Z
875, 0, 0x1E, 0},: z5 E* {: }7 d) f
; r9 _2 O* X4 k1 S9 B4 i5 f- P
Package(){ 75,
$ ^# \# e) a+ ^! s6 X) P! u3 w750, 0, 0x1C, 0},9 h- a& ~7 k5 K! c4 T/ Y

. c2 p" ]; M% E. @Package(){ 63,9 h2 V. j/ q, z% ~- `
625, 0, 0x1A, 0},: I9 T7 M" g( |! n! D

( ~7 g/ J  K+ QPackage(){ 50,
1 t; _# Q9 r( z% Z# f1 Q; H500, 0, 0x18, 0},- E. S+ C; l1 R
8 X* T) O6 c) I* F4 c
Package(){ 38,
8 `/ ?% p* T" }4 q" I; G375, 0, 0x16, 0},; W) r2 c" n5 O

& I+ F3 r  K; C2 z" BPackage(){ 25,
! H. U$ P. r0 w+ P7 o5 Z250, 0, 0x14, 0},- l4 B# H" z3 B+ Q0 U# g# z
5 o4 H" @% j/ U" e3 U. i& m  Q
Package(){ 13,
0 j; L. O1 `* W" R4 \+ ?" U6 z125, 0, 0x12, 0}: I* r# y' u& j* x! p

/ A# b) Z" w; }, ?% _! r9 o}
* M" `6 v3 b8 `9 d( J3 n) [4 ?) G
, j1 U( z# j7 Q2 k9 o5 E) p; o
( p0 L  W3 v2 b( B9 b+ Cl' _( \- z$ Y! e( w/ `0 H0 E
_TPC$ O4 Q  w* J0 G, d7 E
8 v/ w7 O) b! V4 @* e' x( _( c. O
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC: p' K4 g- C" W9 ]& _

. w4 s1 Z! o: x8 W5 yl
" H0 {( T2 B$ k4 O8 }4 o
_TSD4 O! B/ Z5 a% N7 b6 t7 x7 [
% a3 m7 B/ q' H( D$ m- r# j
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code& W  I/ k6 H: i
. E6 O; b5 n$ y3 H, D( I! k1 G
Name (_TSD, Package()
* x. z% p& _1 o' z3 O: `7 Y! d8 @7 {6 s2 P
{ 9 n% X0 o' P) ~- \! q6 I. ?: a

* ], Q, J: H9 W; z0 c% U7 m, j6 s4 xPackage(){5, 0, 0, 0xFD, 2}
0 I# |: w+ N' ], o- ], C// 5 entries, Revision 0, Domain 0, OSPM 9 P9 [; s. @  c! \: V. c8 `
Coordinate, 2 Procs , Y) F5 k5 ]" g& s  Z  u# G4 K( f

" o  a. D6 B+ M! D% {& Y4 r* `; C$ G& c% u! T5 ^7 H2 U
}) // End of _TSD object+ m# \) Q  J' N- M$ q1 B
. X! k% A, u, Q9 ~
REFF:  x: R, l7 c; ]4 @2 ^9 x" E
1.
9 A+ v1 J( Z- y/ [8 d, X0 Y4 RACPI Spec 3.0# @: f# ]+ s2 ~7 s5 O
2.
/ [- }# H2 M  l4 H1 ^Intel Processor vendor-Specific ACPI
& a" k* c' X, ~( o' n6 z- `( E
- ~! D% e- f2 A0 P4 e# @9 Q0 f + E2 h8 |# Y8 t
That’s all!6 K  Z2 v+ @9 e# q$ z! ]! M

+ K+ m+ r! `$ K0 @* ^2 |! S( K7 tPeter
4 z. ~) z3 V5 g/ ~0 o
5 z! ]2 I# T' a; L8 e2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 13:17 , Processed in 0.088202 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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