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

CPU Power States

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

" }. c& Y$ \5 q' b5 D  v- I1 U4 Q1. Overview$ l  p2 a: s) X  m7 o( z1 x' ]

) F, C: [, K0 H& i0 S/ z* W6 u. K" z
$ w% v( I; k* b  KC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换2 R2 Y# x( f, t
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看# f) O7 z4 q, H5 K
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
. |+ h# V. r$ C9 u4 ~" J8 R& t
" a8 L: w' i  n3 z  M- {/ r
cstate1.jpg
7 ^8 ]1 X( t: l( H/ L7 d9 n
1

& G+ c4 R, a9 z9 W" j8 d! {3 |2. C-state Control
  v9 ~# E  O4 F' v. X# U
4 t, }% j. j. h7 g1)
# P3 ^3 j8 o% D- u4 J, H! C1 V) sDetect & Enable C-state, j# r$ P/ [! p5 F5 D5 D

6 s3 M0 `7 F1 w9 k7 \: Q& Y+ hBIOS可以通过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的支持。2 ?& e6 W2 d  z
. |9 C2 h" x2 w+ h1 \% g: \  z% m
2)& d5 Q- p6 X6 b% P
C-state Basic Configuration' t$ L* o. z7 B+ C; W: H
通常情况下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)。
, V4 j. M) l- |8 _7 U& x- |# W7 v4 \
- N9 @) S  M8 v% `7 s9 x5 C) U+ C: d$ t3)! i: ]. n' |" Y- b! i1 g8 g
ACPI Structure For C-state
- i  |* }& W7 O1 l1 M5 x- X0 t0 _6 f6 L% d* C3 d1 V' `
l
* j5 ^! P, S# m) p; @
_OSC & _PDC
: y$ d  G' Y2 E; h; ^_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures0 e1 I8 N2 }* {9 a' B0 ]
l) V; P; A. R2 g  b3 Q
_CST
7 h, N6 D8 P' `* ]( R_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:8 I5 v, ^3 e6 X) d
CSTPackage : Package ( Count ,1 K* W( s) O( G/ V: h4 C
CState ,…,
/ g# D& A( r3 @CState )7 n3 C# D1 D7 |6 u' e
其中Count表示所支持的C-state的个数
2 U3 b! n, F* l3 I% d0 k3 [) L9 A4 CCState: Package ( Register ,' M( x0 T" M) B/ W
Type ,
6 @& G0 L7 L; S6 i4 ~1 r$ I& J* nLatency ," V9 N5 ^4 x& S5 X( y4 |. U. S
Power )
' q2 R7 p3 Q& b+ ]+ @$ A% O( @5 z1 Q" @% v5 i, {# _1 b& j# o
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
6 m; D/ f* M. D# W: M% o" C0 j8 G9 u
Name(_CST, Package()
# Q; y8 Z4 U8 o5 g! o
# E; Q0 A" O4 T& |" L: M8 }' l3 ]. K
{ 4 W) Z1 `5 k+ _! s+ n
4,- f  K3 U7 p, e- t$ O! O5 U
// There are four C-states defined here with three semantics

0 X' y5 H% b, J! a
, Q8 j3 Z; ~/ E// The third and fourth C-states defined have the same C3 entry semantics
/ j' t! e9 |' I/ B+ v* n

" |" A, P% P$ ]0 i' RPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},4 C0 b( G  p% u6 V+ s! B  O2 x  A3 B
1,
" o" Q  Q7 ~; y7 g8 Z  I9 o20, 1000},
2 G0 g0 n  c1 a7 N, `/ v8 ^0 {

; l0 j+ {- a8 r) ^- H3 s$ FPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
. e0 }/ }4 u: }40,
( b2 A/ ?; i, w750},

6 O( h) z/ m& l: ^0 n$ F% \! @; ]Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
' b& t& ?1 M5 B- U60,. k& }( M  z* `& @+ U0 W
500},
! S3 U3 l  A3 w3 H( u
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,' S5 S/ I2 t# y7 G# k4 T9 `
250}
! Z) N$ Z9 J# y0 J1 V/ N
; l* }% c& Y2 O, x5 ]' W# r
})
, ^" T6 O! E5 F) }$ i1 ^& H' l, }2 y" f
l% Q1 W+ W+ E  C" x+ q4 n& [& W6 o9 G
_CSD6 u( j7 }" C; t
& b; f! i7 G) O& J6 t9 g
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
# W/ I: d: [, C- L4 z& s& u0 t7 }& f- j9 r

4 k  y$ `' m" \3 V3 k$ u0 T. p4 ?4 L) P: U1 S" G0 T) m
* N. L9 }7 C: x7 M% l9 n
3. P_LVL VS FFH0 v/ r! x9 j6 p8 B& C# k( N: F; P
$ k! X- }# ]9 E1 S% K
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
! `5 @9 V0 I6 I8 d. ~! HFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
' S4 u* a' ~7 w1 }/ n8 a1 T7 k7 h4 R6 `, V8 r
gas2.jpg

7 P4 W5 {8 W* ?" H+ l! S; o6 r6 ]
2

9 {5 e' D* w+ e9 j' x) a* p, q4 H+ mOSPM解析到该_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的一个例子:, P6 o, D1 ~5 A0 j7 F
Name(_CST, Package()- c9 Q" o. \6 i! Z3 v1 b! e
% O7 g. J0 N0 P2 \( m
{
2 Y2 a) U8 m2 u. S! W4 Y) ?2,
+ C0 _5 N' J  X4 o- K// There are four C-states defined here with three semantics
8 E( R# a5 A' E# D
2 Y. H5 d& d  ?. F4 I. P
// The third and fourth C-states defined have the same C3 entry semantics( r% X8 A. _# {5 l, ^; |

5 O1 Y* x; v; mPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
7 p1 v) Z: U$ |. y) N; [1 F0x01,& |; S, ?& ~! U9 m/ g
0x03, 0x000003e8},
7 N6 S# ?/ w9 X  s
1 z* \; M: K: w+ b; d8 g8 `
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
6 ?1 I* }. I1 \, |$ p2 K0x01,
4 _& C2 C2 C$ E0xf5, 0x0000015e}

. |8 x  M( `# A# c5 f# j# @}) " f9 E8 V& J) n( v

2 i, i; ~# M! n* k+ v) m1 ~0 \) j5 j6 S4 @/ a3 o8 _
REFF:' ?7 K' V+ Z6 X0 z! q. F' ?
1.
; k  K7 W% |9 P6 B/ i9 z4 h  r" qACPI Spec 3.0; l; E. n) }/ b; c
2." ~! l- }  o4 e" O8 F8 j- a
Intel Processor vendor-Specific ACPI
  _4 Y: A! b9 b+ M! g8 Y
$ W" `& K* ^6 v. O2 d0 }7 A  R1 _1 d
That’s all!$ {8 O8 V/ E" T! N, F
0 E7 m6 @# u8 R) ]; s7 o7 j
Peter4 \8 N2 [$ a' x& D
3 M8 V) e8 M- m3 w, D7 G0 j1 \
2010/9/20
; M. `. f6 |# @2 ]1 _9 K: @- h
4 p& \$ a+ i$ d. S8 v5 p% n[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
% e: B2 v! Z; O+ E" q' w
4 a8 ]: S5 r4 j* R8 l5 PCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST$ R5 a" l) g7 S7 \" ~
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。5 K2 D# E1 y5 Z; B. e6 q

) Z4 s- h2 }  j; \) N1 ~( C0 }2. P-state Control) E! [' `6 U8 `' P* m+ m. D& V. {

& Z% n. q1 [! s1)
- Q$ m  w- B' N, G# i1 u( \/ @Detect & Enable P-state; V6 h! M  q, D" P0 U9 t
& }! ]- R- U3 v/ ~
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state) ]" k+ J. P% n$ i  x* B$ X0 D  h

1 z! l) R& T* [: U9 s2)
4 o# Z, u- R/ I3 B9 B6 LSupported P-states. P  A! M# D4 P! s

) V4 Y8 e9 t+ qBIOS 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
0 }  K; P4 d7 I, A* X 3 ?( G" Y0 E. ]8 K/ W0 C+ Z
MinRatio = PLATFORM_INFO
. T( L3 o" W% ~5 K$ PMaxRatio = PLATFORM_INFO' O- ~) N- N. O1 Y) D7 g( c
RatioStepSize = 0x01
# r- t7 A% ~" J' j- {& ]5 wNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1$ s, F7 M6 r/ `' Y& h7 V: R8 v
' d$ t: X) A5 r  P+ H# x$ n+ w
If(NumStates > 0x10)5 S/ _8 l; h; N3 e* e" a1 V
{. {' q3 r8 }$ g: Q
RatioStepSize += 1) [) R$ l- y0 l, _; ]8 M
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
1 p* E3 M  g5 H" I" W}
) v3 N% _9 b) @4 G1 X, l : r; L: _$ D- w' n! q; o. F" l
3)( R% Y. \6 b# n/ K3 }' _+ ~7 L
Turbo Mode- s  K2 {1 v! R3 F
3 o, Y, Q- j& z: h* U: W# `9 B
Turbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermalcurrentpower的信息从而根据这些信息动态的增大CPU以及IGPUfrequencyCPU可以工作在[Max Non-TurboMax Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 reportOSPM,另外Turbo ModeRatio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermalcurrentpower的门限值,BIOS可以通过设置这些参数影响Turbo ModePerformance
, x% w: }  v8 [  ?
% T% S# w$ x1 p3 _4 C) u! e4); S2 ]) Z5 [0 C& X- D
Over Clock
0 q+ Q3 D$ [5 Y$ U$ B# p# R
" v' x+ i( Q4 t+ u  B3 r1 {某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
0 [! C! t# w- |2 s9 K* G
- P1 u, A* P3 P7 ^6 k! u5)1 w) X7 S7 a5 M
ACPI Structure For P-state( _' P7 R- m2 I2 d; A6 r

" d2 `' G9 K  v4 b" k( Q! kl: q8 @, a# ?" h2 X' i( f
_OSC & _PDC
" K* j+ T' r3 }6 @( s
" U3 y! o/ Q' o5 F/ i* u$ V% C_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
% M  ^& G" h  c2 t 6 M- i3 f& D% I0 c
l' F# x; w4 ~" _% ^2 k2 `. j
_PSS
3 X: A0 y6 O0 D  T- w* n) \Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量7 Q* z# Y) H  n! p1 N
并且通过一个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做比较8 ^& P+ O$ J: J$ x
以确定P-state切换是否已经完成。/ O/ Z. ^9 m, A0 ~2 Q
( P5 Y8 I  r* O2 w$ R$ J0 B9 x
Name (_PSS, Package() & D* |& l' y( u  H4 F/ g1 |! C1 L
{
2 e. f7 s5 e4 A. ]1 {// Field Name
, ]" f7 F5 E# Y# iField Type ) [6 P/ |1 b% R
6 L: z+ J- v2 X1 F

) ~7 n# n& `2 |1 T7 b# u% o  ^. q+ A" O. z' H" O
Package ()
! h. e: y% \+ ~% p// Performance State 0 Definition – P0
/ I$ o2 U" M4 D- d" p- ~& }8 l- n0 m' ]) P% s8 [" H7 a# }
{/ D& V/ `+ I6 i" K5 H2 g" ~7 [
1 j" }0 S( \; H! w4 \& `! {
* ~  {: S% g5 ]3 T5 W; A% o
CoreFreq,* [. m3 H9 B/ d. ~; Q
// DWordConst
- r, P3 C1 E% ^3 o1 T* e4 g2 m2 T
! h% t/ ?3 n& S' t! u/ R/ T: H0 |5 V' k+ j' D7 l3 i: {* E  f, u
Power,
: b" _7 ]" X5 y+ v+ j9 P2 T' `2 U// DWordConst 2 M2 a9 W1 Z; O

7 [* \( P" {# Q* oTransitionLatency,
: H5 M, e/ n! _0 c4 G, t// DWordConst ' F3 l  w9 C+ B# {* Z
1 ?6 Z2 f( j. ]0 I' P
BusMasterLatency,
  b: d' n' Z' ^" j- c; R// DWordConst
2 q: e7 a" P& y0 {* M/ E
" v1 {5 i5 Y# j/ F% m7 ~2 m& M: zControl,
8 x. A- r4 A2 |, V3 o0 |& b// DWordConst 2 b* g# T  O. h( A, k

, O% i0 E: l& r6 K6 N! DStatus* _, |, D8 i% q5 C

+ x9 M! J& |+ j1 C& I8 B* M// DWordConst $ H, ?1 [# H2 M4 V. O4 T

  X% |7 V& G: [& o/ W* f},
* o+ |( v+ q4 ^! X3 n) a
4 V- d3 T% ?3 t. m2 h- V9 Q9 y6 N.
. T' b3 N% K# V1 B4 R( I2 |; N
) C# S  o6 V5 T* n" c0 c: K( S0 o- {. - y) B) T. D4 }8 |% p$ s  i
3 O2 {- Z& d" Y& C$ A+ |
. , ?2 A1 m$ `* G2 ^, y
}) // End of _PSS object$ T% Y! J5 t" F. `( Y1 u
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
  {: {# n4 i/ {& V7 n  G- e4 x
/ l1 [* L$ Z" JName (_PSS, Package()   P0 d5 C; G7 F
4 ]. E; I' M  E( I9 P
{ / t/ K) V% h" ~" k/ g5 {
9 r6 {  {6 ~. ~% {2 S- V
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
; i+ z: Q, x5 D8 k5 E/ }
, a' t0 e$ E3 ?1 }7 g! h7 J" oPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
' J( a: K. f* P
3 v; @$ g- g5 b: h  k1 Y/ Y( |Package(){1400, 8200,
+ G/ u* W% T2 `- m6 a8 o% c5 s7 Z10, 10, 0x000E, 0x000E}
# j# G, ?5 }- Q8 A( p' ~5 w// Performance State two (P2)4 i" a( b' f$ p) A8 T7 F
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
( V2 i6 ?7 _: J5 P$ G5 SPerformance State one (P3)
* c8 _  u  x  y* x! F) J5 q8 i; K/ f( i
Package(){1200, 8200,' `" V8 z, ^0 K8 e/ m  C
10, 10, 0x000C, 0x000C}3 o! |/ j( x: A8 j# `: f/ Y9 ]
// Performance State two (P4)( w1 y! B) N3 U" x3 u8 d7 s
0 g7 L: ]5 B+ Y9 x: d: Z' D
}) // End of _PSS object, [8 Y7 D5 h. q: p- K5 G
9 M. r9 k! P, T7 N& u
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
; O/ D# m0 A) ^* `% E9 y
( m( _! j7 }( C' il
' P* j: F( Y; H, \$ E, a: d
_PCT
6 X/ ?% x9 w4 P2 r 6 n3 V( J2 O3 ~
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的方式来进行。+ v2 w, w. D& U  I6 z5 }1 j! e

+ y9 i3 [8 M: ^; Q  `# ~Name(_PCT, Package ()8 {! V/ G; w1 }! w( h
// Performance Control object - B: E' B7 a  |  k# O4 x& V

' r' j% b7 s- f9 t0 m2 X6 j{ 5 r9 r% |$ J0 W2 V4 a4 ?+ E( Q0 t

1 m% M+ b2 C) ~; ^8 h- Y% zResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
3 z/ k1 S) X' ^// PERF_CTRL
8 b4 o% b$ W: K, m2 x) A: O
9 Y3 U  U4 S, c. ?& T. T; q$ ?: @ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}( l8 \  w& Z* S. \; A3 c) k
// PERF_STATUS
1 V0 }# D9 m' s$ h/ @" {$ x/ c  c, ?( @3 O
}) // End of _PCT object6 ?& ?# B+ W4 G
: u/ w4 N3 d: g5 _
l7 x, e3 |! b5 r" B5 {8 Q: ^
_PPC
/ o8 x8 Q, s6 t. c5 f& r! v. Q3 X9 l 9 g  h) J: |% Y5 \/ o+ E' e
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
" S8 E; t& ^, E6 G
5 I3 p, B( j( u- ]) C5 u1 a, }/ hMethod (_PPC, 0)
; g% ~0 B% ?+ ?& W* X- ]2 ?// Performance Present Capabilities method . y9 Y4 [/ y$ E" p  V

5 K8 `+ P- M; a; z- S9 ~* D{ ) `0 M! _9 v6 u; @! G& z" g

2 o  f- H+ z1 I4 ]4 s8 m( N3 @If (\_SB.DOCK) 2 }8 n( |# e& z
' h% J2 }; `$ u: ^* J- s
{ ; M5 f7 A+ b! o
( ]( l" k( z: h- x
Return(0) // All _PSS states available2 C& o+ X. M) Y
2 l6 d# s  j6 C' f- @1 d

# L! X8 k" t0 w6 L/ ?& c} 4 a) U- F: L% s  w) A& M) s9 I

! Z  O; Y3 s8 |( w- B+ y" n& ^If (\_SB.AC)
& G; n4 w; v6 R2 ~" f" Y  n0 w( H% O  Z2 h
{ ) r! a% r+ |* v* t$ f, W5 P

6 M5 }1 z0 m6 ^, y7 k! ~/ KReturn(1)
3 m: h* K) Z6 A1 y  q8 D// States 1 and 2 available
8 L& g! i7 y3 y% j  b7 `& B2 z1 p5 L# U
}
: N; t7 w8 o+ n2 D! `0 \
  A' u2 i' V$ ?# d1 A. uElse
* {7 a  C: ~) l4 D# Z+ S: n" }1 n$ k9 F6 M$ F& m" L' f
{ ( K5 l4 N2 P! c! T& Y) s. f

+ H! e* p2 J: P1 i) Y3 H; t$ sReturn(2)8 x, ~; S/ c  \" c) Z# }
// State 2 available
! x' p: j9 A0 ~, j
" A6 l8 I1 N* y4 c% K}
( O/ J  p( k7 e
5 _/ J8 D  T+ X- i} // End of _PPC method
0 W( h, u7 F5 F& H2 m6 B , g" r2 s! s3 M; I7 l8 x  m' q, h
l# S. f$ [) v  e, u2 ^& n
_PSD
5 l* l+ C' d. v/ s* j7 S
4 M7 `* `. z" V3 ?9 @6 }8 E  wP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
* c( V$ C$ e9 E7 G" E5 g * u' ~/ S& d# S% s
REFF:4 v* B+ Y3 ~6 G+ O
1.' Y; M6 D/ _* B/ x
ACPI Spec 3.0
4 ~: |9 a5 U& j5 G. [+ ?: V2.3 @0 ]9 |9 \* t( T2 ?4 X
Intel Processor vendor-Specific ACPI
7 B2 f( ^: e3 r8 d6 F* n; X; H# Y& l8 G: y, h
0 Z+ F- I* P! l8 t! K 9 H! B) Z" g. s
That’s all!" K8 B: W4 Q' G: m" V, r
8 u) F  c: f# O* O
Peter6 ~  `. \( u4 i3 t7 e

# f0 z  Y# |5 y' f+ |2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview3 A; e  Z# O$ n# g4 z0 T  B8 D1 r2 |
1 c2 G* W6 _9 N7 n5 U+ K& C# d0 C  v
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工作时间的占空比)的方式, Y0 q% W6 V- j; F
,影响系统的功耗和温度。1 S# g1 P, X* a; e! e( K3 n
1 [: b0 k% v; O- e0 u: y- ~& ?
2. T-state Control
4 c! [8 X8 |* q; X& B2 H) ?" R
: ^6 b  P6 m5 G8 W7 _$ f. t1)
, O1 u+ s4 |) A, N( O7 l. NMSR Based Control6 d* c; X8 B! t3 s

: ]( ~8 R7 ~, g) M" N6 @BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
3 ?3 g+ Q0 f) F- y$ O # C6 a5 j- {7 B: b: |- `7 Q' v. v
2)
7 J" _, B1 J1 ?" CI/O Based Control4 T; t4 c- H; q# `
" S4 r% K! U5 d% s
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
* C' [% U2 d+ L, L
) D; _* J) g; {6 D/ N$ d; \3)
' w' a% G0 r; o# e; QACPI Structure For P-state
3 o4 j' k; |  `, O' T2 v7 ol5 s% V! J7 J" a. B* P: ]- Y9 I
_PTC$ }) U: ]9 v4 E& B" l% S
% G7 G$ y* D( E
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:- U9 O, _3 A& h
) U% s: ?. _; d7 V+ F% W8 N& [7 u
Name (_PTC, Package() $ T6 g/ C2 \4 u% \" s8 h4 E) g1 U. K
{
. T, e; e# i* _+ |! }5 O$ A% Q) r% K  T9 t6 C
ResourceTemplate(){Throttling_Control_Register},
* _8 w( ~0 Q' Q  p//Generic Register Descriptor 0 ?, p8 a- H2 I2 Z$ p. x
& p# v, W+ P% e& G
ResourceTemplate(){Throttling_Status_Register}& r2 H8 Q7 c3 q! Y' L" y2 Q) C
//Generic Register Descriptor
  ^+ X5 }- H3 @) f}) // End of _PTC2 r: V+ z" u, ~$ _) t
2 W6 z  B8 ?) Y# w- W
下述是一个sample code
" J  [5 B$ d% ~/ R
8 {. }* e& P7 D- L0 C. T1 S
/ L, x' m! W/ V
//* {4 S/ ~3 {( Q" j' L& \
) H+ b) {) L/ Z1 y( A5 {( A
// T-State Control/Status interface+ R- [3 F& L4 s5 h+ P

  U0 L9 [& D* p$ r  \//
( V) J) q2 O. E1 `" C3 P. T
5 R4 q& I% U& p+ r8 O! O# p; P; zMethod(_PTC, 0)
0 E1 n7 |; P" |( S% y6 ]/ t
) Y) Q7 y0 g& Z" k1 h( M{
2 [+ e. E4 O4 r6 J5 s3 l$ {3 M3 B+ M& c2 t: M4 H) _& _' E' F# E1 t1 M: C
//
) c6 f. ^4 Y1 s7 v; w6 L
% i, y' Q9 u" _; P5 c// IF OSPM is capable of direct access to MSR4 T' p7 ?2 S* v
/ d! ]! Y  F: n# n$ e
//5 k8 E! @0 P5 I- w+ k( C5 V4 k0 e- x
Report MSR interface
7 e2 t. Q( U/ L  H# h7 q* [; X5 A* ^, c: ^! w) ~
// ELSE2 r  `; g: `' a6 |. j/ y

6 d; \3 }' a4 w//7 x* Y( k  U  X3 d, l
Report I/O interface
: E. r* m* C! t- y1 q" h2 ^
2 _5 n! h/ r/ K# g+ v6 Q0 X//+ Z* ^) C# M1 f. [
3 P9 V9 _) u8 q* Z( V
//9 v+ w$ H* d3 t; Z7 I# t. f4 m
PDCx[2] = OSPM is capable of direct access to On
( Z( j% f# h5 |  F
2 h2 _" S. ]; G1 K! G//
  |5 D- Z2 o+ {' g1 }& EDemand throttling MSR
5 U* O% c0 I0 l1 n" Q7 x
( H7 V" q  q) T+ A8 m: T//! @& L4 Z# ~0 u5 i% i" Q9 B& i; T

# I  n5 h9 L$ C( C5 }; q( xIf(And(PDC0, 0x0004)) {
; z' o2 T5 V0 E. ?6 h
9 D: O! A: R. X* e. PReturn(Package() {
- z. W1 g6 y3 c0 }5 [* _' ~" q, F- \: s5 f( L. M
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
+ Q. W6 N5 C8 R" t6 j* Y1 K* f2 B9 j- L) j7 T: X
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
& U9 Y; K; K9 j* N1 q5 y
* E% e1 o* L2 e- V})$ I( j+ a( P" g9 x* q. n; e: V7 f
8 D2 b) O2 U2 _, x& P
}
8 r  W# S" [/ x, t- q# _( k- O3 t0 y
8 b7 w6 h$ x# X; s3 S/ FReturn(Package() {* k5 ?/ b2 n6 j' R9 P) R

+ q- @" H- S1 L. H' YResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},  U% j0 y6 e5 k- Z  S* X  [7 q$ z

  B2 q6 V6 a" FResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}( f/ X2 }" I+ K, j) c( I
, h  f1 S7 N# R, A. ?- U
})
6 O% @1 H* M2 e: t8 u- K2 j+ L  l2 Q; j
}
" u6 ]( C1 D. M0 H( i' ~# D! ^3 r: s; K2 w. P: k. A+ K1 N
  P/ F5 v0 ?1 w% |  e2 P0 Y" n
3 E7 g0 R4 \) N
l
7 p, t4 s" o6 U% |" ?0 Y
_TSS
9 y- x# Z# n9 T3 _ + O3 u% E' _" Y7 Y& K/ ~3 ]: o
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:0 @$ `5 V" c- z  X
Name (_TSS, Package() 1 E& T1 K! W* X/ f' A
{% F- v1 V& N3 [6 w9 [" h
// Field Name1 h% ]) d4 Y$ z$ O  \0 q% v
Field Type & ]+ f) Y; q: w: C

4 F6 ?- Z4 [7 f
7 p7 O9 C5 f# _2 a" [. t7 G8 C0 @- }. X: i: z
Package ()8 ?+ O: N; s( ]* \" {% K
// Throttle State 0 Definition – T0 4 w1 z9 N, ~' _2 s( o0 m

$ V# k& w& n. Z- E7 J  E{
  R* ^2 j1 W# l( G( f) A& p
; E- U! m! r- o# Q7 U. T
) y% d" ~, b1 \1 k! S9 R9 dFreqPercentageOfMaximum,
$ J0 ~% x2 Y; F* ?- d5 ]# j/ G! X% _6 m// DWordConst
  \* Y$ ]! }# y4 u
  ?, }, p! R$ |( E9 }% w# J( U; M/ {, wPower,$ H; a2 R2 ~- V; W- z
// DWordConst ( S* ?% p- X/ B3 y! n" N) k- C$ y7 Z

; v0 v& ?) `* y7 n' cTransitionLatency,
$ ?& l! o/ D- h' ?& E// DWordConst : ]! y) L0 `+ h1 n3 S% J  n
" c) ~/ R9 j( Z
Control,& X: E9 X  |$ ^" |# P0 H# B
// DWordConst - r: A2 i6 P+ h1 o* v; D2 i
8 M5 ?9 o! P/ o+ W& d, X
Status
0 C, S! K9 C9 k! r, R" `// DWordConst
( @: J5 o+ Q; }5 W},9 E) ?# p8 X1 v5 D& k; ?
……
6 c1 B  Z5 l0 Q: C0 L) t}& B5 W$ S: ~2 ]) d# X
  G- x7 _8 Y6 b; k
Example code 如下所示:
3 w) K3 b8 Z+ E8 I: _+ c2 }& L
0 x$ \2 X. S' H2 P- d  JMethod(_TSS, 0)
0 l) w2 Y. A2 M+ F+ R, C8 N- n
5 m6 ^9 C/ S! {8 b& u{& R4 S5 g3 B0 t0 g4 d: \3 S

, j2 ?+ G3 ]9 kPackage(){100, 1000, 0, 0x00, 0},/ N+ [  n  o5 n

4 B6 l. K- v( w  {Package(){ 88,' Y/ e  _; s% h% m* S) s9 R3 L
875, 0, 0x1E, 0},
/ _( w0 f  V) l+ M. Y' c0 c+ p) s, D5 b( E1 Z
Package(){ 75,+ l. ~8 h- {! i- D# O
750, 0, 0x1C, 0},/ G; @4 _( C( z9 f
3 \1 z: e" q% O4 Q
Package(){ 63,
: D2 B6 ~5 _  c3 x: g625, 0, 0x1A, 0}," K2 A5 W: N+ r4 z& l' o
( i8 Y! X+ u' H+ b( s9 u
Package(){ 50,
. j; h5 S) m- z/ ?( z- e500, 0, 0x18, 0},& U+ x4 J8 w6 F# k3 M4 m' ]+ }

: R3 i. m; ^' N6 q7 N& |8 R0 sPackage(){ 38,) F7 k2 ]6 z3 @/ J+ V
375, 0, 0x16, 0},
+ V" j- m+ m* B" N( L% c; i) ?( R! ^- a- _
Package(){ 25,5 `; z( [6 y: }* C
250, 0, 0x14, 0},
, a5 s0 W2 \6 W! J, f5 j9 j0 ]( F- I; m8 P) T# h! v2 Z
Package(){ 13,
  _+ B- K& W. X& |125, 0, 0x12, 0}
: d5 s6 \2 E( Z9 c3 b, u
7 j* f7 q# S, {2 u8 C! l! g}6 Y: n% s6 ^  o
- T! @1 I$ c$ I% u! n
& ^) j, i& @% @, [' {9 c: X/ V
l2 W7 S1 \- S. l) ~+ M9 v  K) D
_TPC# o3 x$ c7 q2 A* B- F) Y# S7 w3 Y

# \0 ?3 j( l# c. ~, k* L/ s9 b  xThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
# z/ |$ c; d5 D ( s, }4 A, X6 ^6 o; ~  X* }  p
l. I! r: W, |, U; j' ], L6 Q
_TSD# L" W5 G3 B# A$ l9 @
; ?5 f# E" G$ ?. W2 X
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code4 m+ K8 o# T2 J. [3 O0 h  Q
0 q0 ^( m' a4 q& E% X1 t- ^) R
Name (_TSD, Package()
% @/ j$ U3 w9 T& h' `/ C. l+ {( z9 t+ \
{ 5 {4 D+ k" N$ a+ v2 W$ w; g$ f# Y; o

' D( Z6 Z  j2 V' wPackage(){5, 0, 0, 0xFD, 2}6 n% @1 k, I$ W- P5 ^
// 5 entries, Revision 0, Domain 0, OSPM 9 p( M6 N, @% j, m7 }# p; Q5 R  b7 Y
Coordinate, 2 Procs   q3 t9 s8 X0 ?& s* |9 |8 Z) t+ k

$ s. j4 T- C: K' m% \' S0 p1 t. ]' J3 r  f
}) // End of _TSD object
" E! d$ U5 E4 j) N8 d9 g  g
, }3 [, P- t8 zREFF:
/ D+ ^8 h5 D7 e9 L' K1.
; k+ }" A' c; g  a1 k; B/ TACPI Spec 3.02 e3 h* E3 g& C, X' \+ P
2.. O" m7 v: Q% s6 l& T  z7 i
Intel Processor vendor-Specific ACPI" x2 ]- \0 U- O6 ~( C- B

# G6 M% a& ^# W) U; r0 T: x8 {/ ~8 ` $ e9 J  V3 s# t( H& w
That’s all!
' O' E0 r1 M$ n
* Z6 x2 h- ], D; a( JPeter  R9 M$ o! D0 [+ p1 D# b. J" r
1 j, i3 Y* A0 p
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 00:18 , Processed in 0.797202 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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