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

CPU Power States

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

6 |7 G0 R2 \  N1. Overview3 ~6 j! H8 m  p! m9 z& U' M
9 c; Z/ E3 B3 M" X: K, A
$ K! p0 N7 d3 z% c9 f9 D: y: M
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换0 ^9 q4 r( W' }4 R) z) R! b' t
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
* p( a5 P/ J/ ^1 ]比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。# g+ Q8 w" O( D$ C- a9 z- f$ X& L
, W; |' T( t4 |7 a) w
cstate1.jpg
3 d" }, g3 }4 p% R! p5 T
1
  b" {2 V* d+ w0 g: u1 }! _& L6 X
2. C-state Control; E9 @% a5 c/ w( d4 L

1 U5 T2 a$ r& g1)
* L" g( H, u( q1 I. L/ KDetect & Enable C-state
+ {# {. ^# ?5 M4 C8 l% y/ i$ A$ z" b/ F
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的支持。$ |8 R( M. P* J) m, k
* Z4 R4 c: a  R* z
2)( v- X3 r6 b7 x
C-state Basic Configuration
* U+ [2 c# Y8 f0 E# a通常情况下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)。4 L; B6 u' n5 i' v- r7 Q$ X

% M+ T: G! H6 Y( t3)
% k3 k# J% S# z  LACPI Structure For C-state' D$ \* U' [3 {2 E" Y+ R9 Y

2 F- ]) Z! e! q" U8 Ql4 t' s% y1 ?/ {% l7 Q% S
_OSC & _PDC
: Z8 Z# l! b" F# h& f4 m4 H. r& l/ }_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
3 h+ |+ ^1 ?. }" u- @l* J5 J) u4 S, _# B2 o; m- e: G
_CST
( x3 N  T- P1 ?) c$ K3 \_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
5 E0 h+ H+ x1 D& F" ~2 r2 WCSTPackage : Package ( Count ,
- V: J, y1 e/ I$ f/ CCState ,…,
2 S* U1 z3 x9 OCState )5 }9 S2 l& B  y: W5 }
其中Count表示所支持的C-state的个数6 E$ [, n5 H3 B/ \$ Y3 _
CState: Package ( Register ,. E1 v9 \2 j' A) y2 r# w% R: h
Type ,
8 Y8 I, {3 `2 `: V) o4 F% ]Latency ,
6 c0 D& a% K/ l- fPower )0 J  G9 Y: e3 h- i( e) \0 l& j! Y
0 ~- I  o0 k: e4 ]( R1 J" Z
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
( ]  h  E! B1 t1 l) Q/ E6 ?, v( T; W
Name(_CST, Package()) C9 @/ t8 W( L! j% `: h- \1 g

2 W% Z1 u, M2 G{
9 g$ i; E+ Z) ~4,
6 g) B; E, E& d) I// There are four C-states defined here with three semantics

) S+ l7 |1 n: C5 M
! e, ?; D, g$ u  I7 h9 r, [// The third and fourth C-states defined have the same C3 entry semantics* F3 }& ]; W. _( @1 b5 I! ?7 u
0 j0 N7 L8 o7 G+ T1 I' ?
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},# E0 e! p, c0 v1 D. N4 U0 Y
1,$ |# h- j7 }$ n( D
20, 1000},
3 h+ u: v5 ]3 M  N& {4 z
8 z; f; d" s0 v; d4 V5 G
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
0 o8 [. V% D; A' w: F- z2 U40,9 a( s; V/ F+ l; ]  x
750},
" J8 ~: @% @1 q5 I
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
6 u' p  B0 `: L- ^60,/ b: |" H  B( B7 _
500},

; Y( h( m* ~5 vPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
5 z" a2 O& b0 y( ]250}/ O! d  M7 ?, n* v8 _
% ~( A( h: L$ O% Z& G
})
  o) ?1 w6 H# o% D* T: \
- q- w3 e! n) m5 {0 k: P( Dl
2 F' l* @6 x# b3 n! L
_CSD
% r. I5 W( M  V6 y2 l" m# t1 ^% k( V
, Y& r' g6 [! Q5 v% |  Q! DC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。0 l4 ~5 j. R5 n6 e1 G0 o' I  d& q8 Z
) g) H4 y: l6 W

6 \, N/ f, e* H$ H! _1 }  q; y, d- F, D& m1 @  G8 s2 W

+ Y% k0 C4 ]: i3. P_LVL VS FFH; L9 p: b1 L0 ~
: g$ T1 f( d5 ]# I7 P- |/ O# n5 U5 w
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)) f% k8 R9 b# W5 q. Q% S! l/ l
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所示:
' E8 Z: j7 ~; [, }/ P, G& d8 {/ ^) y  k4 E0 }: \3 ~$ ]
gas2.jpg
; _- i+ c' X+ L/ b
2
% a8 J. k8 G% a1 T2 S: Q' _
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的一个例子:
) t" G! q& A3 j* E- \1 P2 SName(_CST, Package()( a% O0 Q. t4 _6 j% }2 C9 Z+ y3 |
6 J6 w( s5 s( |, A! _6 @
{ ) Y3 S7 D* G- }, c( p, g
2,3 A8 h5 v/ W) A, q  a, k8 s6 z
// There are four C-states defined here with three semantics

4 Q( A! a' J. d+ D( ^6 e6 Y# {& a# k# M; _8 d  F) w
// The third and fourth C-states defined have the same C3 entry semantics2 A8 m0 z: T  j
; T% h7 H( |/ P5 J) N* K
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},% T! U# W( P8 G) i
0x01,
/ f0 R4 z* F% ^* t) n" J* x4 i0x03, 0x000003e8},- ?3 ~2 P/ A8 X; L
. O0 h: Y% C4 |- W: f5 `# J
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},# q1 S) v- J' |8 c% C! s0 r
0x01,
* Q' \( B% W5 ?+ I5 E0xf5, 0x0000015e}

9 `6 s* a5 p+ v& A4 r7 N}) 6 W6 f' C! W8 V4 i0 V3 v
0 k  ^/ v6 |; U- g; M  h

( `( F6 J- K7 r! yREFF:
2 R* c! c5 t# i0 G1 h: {9 f$ k1.3 U, c. f! x' ^7 {
ACPI Spec 3.0
( |4 ^9 U9 e; `" V% f6 y% J2.- m' R4 S. z3 P: a. g1 V
Intel Processor vendor-Specific ACPI
& h( L1 N# {3 _: O% t9 T
# \7 b; ~: C0 h! w$ w7 I1 O% o5 Z" k. W
That’s all!. M. d% }7 k$ @8 X. L
% M' {% j2 [: m8 K) D" T5 f3 C
Peter
  H9 t" v5 p, U" s
0 Z- d, |/ g; A2010/9/20
2 `3 Y$ L' M% {% }4 ?
# V2 g) P/ P) @( A! v8 u[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview5 r: I7 U( W; w, P/ z

; M  a5 U  E- Y* r. y. Z/ C* cCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
7 Y8 O9 q% U: X8 IEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
0 O% x* w( K: q) q + T1 u3 {/ p1 j# K6 h9 r
2. P-state Control
2 N% p8 D- N% G
; v% ]9 V2 e9 \  [: j% J. V1)
4 S# a8 X. ^0 F$ HDetect & Enable P-state- m8 _( L3 G* z
0 u9 h: J0 |8 q4 k9 T- n3 [' ]
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state5 Y1 _) E, U& L) S) V; L
8 |& t/ @6 T) V9 M% {/ G0 h
2)$ \+ H, X% [8 S+ X% c* V7 v
Supported P-states
$ M7 X$ L4 p5 m' [
+ r5 `" k- H; F' k3 ~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固定是100MHZ6 p1 k& Z" m1 a# {; I/ H
& B) W9 p- c3 P' g* N  U
MinRatio = PLATFORM_INFO. W1 ~& D( b  R0 ?
MaxRatio = PLATFORM_INFO
! Q; C( \# c9 W3 kRatioStepSize = 0x01
( `, h* q; b5 _/ x+ hNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1; Q8 _0 N1 M( c; e; ^3 {
" J8 J- y. j( ?  {- ~7 q" \7 x7 a  [
If(NumStates > 0x10)* O% Q' M. y6 ~
{6 Z$ O9 _( A- W- Q$ Y5 {$ w% B
RatioStepSize += 1: f+ h1 q- O1 s' H$ [
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1* ]2 Y0 f9 J3 E1 T
}) \& E  M, H1 I

: o4 g8 H8 n+ X  B9 Z; S6 J0 j3)
3 l" @% v$ v6 w$ e- U& @+ w2 gTurbo Mode
, V' j7 _4 \8 s' `$ e
( O. P9 h" Z( R# X9 MTurbo 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( T2 J. m+ L9 ?* C2 b# W
  v1 K4 Z' v- ?) L& n
4)% `6 z$ j, K9 w. Z
Over Clock
! ?3 L, T/ n9 @- c( y$ s! j" e $ K4 d/ Q- \, W5 C2 h
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
+ Y" R, C6 b. g6 h: {) R & n, N6 H% a0 a2 \' J5 G' H! F
5)! J, n7 E, m3 ?! Q" L% i# r* _
ACPI Structure For P-state8 j# }- ]5 {6 \9 O4 e8 R
/ f* B2 K& i. R8 k% _* ]: u- J* Y1 f
l
* @; Y. @- G5 U# E, G+ f
_OSC & _PDC
( Y9 Z& |: s3 d4 X3 T! F  G2 R : f/ N* K. F, K" {/ Q
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures5 L& g' M; Z2 u) `% p
0 J  R+ W% |& s  n' n0 r
l; K& P. [# Q' k9 r5 p0 w+ R
_PSS5 |: m' S+ J; f( j$ d/ x/ q
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量& @, G1 R2 ]" B' Y( m# c3 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做比较
7 W7 ~5 ]6 b" ?2 `+ S1 F$ o! _5 a9 l, @' @以确定P-state切换是否已经完成。
' ~" V3 d, h: ~
, |% c0 q' V, MName (_PSS, Package()   H: U. O' U4 e7 E+ r
{/ h7 c) f9 k. o# a
// Field Name, s. T3 u) u. o2 L) L
Field Type
9 l5 \) L5 p! x) [  i) a, {3 u9 t

- f$ F3 m' t6 c& K! E5 Y- g% B  m
Package ()3 p, y- c, G$ _1 o
// Performance State 0 Definition – P0 , V0 r7 k4 O, {5 W7 ?3 _9 `0 W

' |! Q, j# t2 l{
6 H2 i; b7 r2 R9 [; g- W6 y5 J2 J; z( B/ c, j  H7 \8 I
' _4 j, u% H& o9 A# v- ]- Y2 d& ^
CoreFreq,9 F3 h8 D: r0 ^  g& i' j! |/ }
// DWordConst & ?8 i) _7 j% ]' o" o
8 F9 u' v- r3 U2 h
7 ?2 X% ?/ \- x, Q, \4 v* Q
Power,/ [, {2 C1 V0 a0 g/ i0 V& Y* Q* h6 m6 w
// DWordConst
& h4 U* I& P3 {' i
* }  [$ a+ n3 MTransitionLatency,' a* \- {6 }& r; B" s( `: E
// DWordConst / Z8 m3 r" L  T

- v" u1 u( Z( U6 C0 {BusMasterLatency,0 J8 U0 G& x" D5 ?5 f" X
// DWordConst
) X& @3 ?* T8 m
5 f0 |$ Y: q% D  G  W# BControl,
4 K% }  B( s" o, e9 `9 Y// DWordConst 5 a2 E6 n7 M0 [8 V+ M& ]

/ V6 |' G" ?+ u0 ~Status
# u& X1 t2 k1 y0 z4 X" W% Y1 Z+ A+ G9 X$ c/ k6 J
// DWordConst   `5 j: x& {- T; G( l

- K. W6 d: G% r4 \& Y& i- t) V" n}, 1 s9 l0 A9 l( H8 l  e# j2 |

1 ?4 j& f+ I3 N. : u- K$ K! j9 p6 N) k7 R

: i7 a, U- p/ [. W6 t( B- p.
  F- ?: u1 W' e- U1 ^8 F$ b' C9 N9 C9 |  d/ [
.
& b& g( S2 ~. D}) // End of _PSS object
1 H$ o* f( W% H+ A6 n  ~前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
3 K3 |/ b1 j6 g5 S: u; J8 l : T" b. m$ F9 ^! u# W  I
Name (_PSS, Package() 0 V3 N) [7 P3 u6 N9 ^

: o8 Z1 |2 u, H{
. w+ b- j( E+ I% v$ V) E* _
( X* r$ @7 H* |! ~Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
6 }. C. H& g6 Z' P! m
- h; z3 d) x" T- I. b% ]/ s+ _Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
5 G( U" g' R! Q& M1 C) [: ]& C2 r! m& \* y( i
Package(){1400, 8200,
6 a2 L/ j" t, N' ~- ]4 A- l4 {; {10, 10, 0x000E, 0x000E}
, @# D- G+ n  d7 v// Performance State two (P2)
9 C5 C7 P& I* U1 D2 A' {Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // " B7 _' `1 p# [' N' t! Z5 o8 H, F- V
Performance State one (P3) 9 J* G1 r: `6 \) j# ?0 A9 K
  k3 V% }7 Y5 }" L, U. A
Package(){1200, 8200,
8 Y3 i2 U/ y; @0 h2 O6 V10, 10, 0x000C, 0x000C}
" Y9 H9 |- n: U& ^! y5 k* W// Performance State two (P4)6 P& Z% C8 ]0 s8 T: d* D; m2 ^) u
7 D8 ~2 s1 H8 m
}) // End of _PSS object
- M( E7 Q! A* I( a . J" r9 w5 u, d2 X
另外当该平台支持Turbo Mode P0将会reportTurbo Mode- u6 V6 u4 Z9 @5 L# T: _7 m# @5 M
8 h1 @  C! ~2 R0 E, r- U7 k6 y
l
5 l; J' J% P7 q- i. t
_PCT" y' z( z# N" L
' g" Z1 {8 F6 m) ~) ?; q9 {. z
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的方式来进行。" R! V0 j4 v6 X2 Z0 ?- _- F4 _8 y
, }3 d) w. l" x+ i
Name(_PCT, Package ()* q/ g) Z2 |2 G9 i# \
// Performance Control object
2 ^* w# o6 G3 ^- v# _  G/ f0 s' F* P' W$ R2 ]  T, x% q
{ 5 W# u$ Q% p* M* L$ f+ W0 @

. K6 V9 b, T5 W  E" DResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# g, j  {) u! w' w6 I6 e$ F; ?, ~// PERF_CTRL " n7 |6 E$ b9 |5 c/ t: w# R
; d, F0 N8 V/ i
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
0 K8 f0 D0 K2 A) ?" J6 T// PERF_STATUS ! I0 U# |+ _+ d  B4 q* v
; F2 E+ C; k7 t0 H& O+ i
}) // End of _PCT object
7 h$ W1 k5 a9 K$ K4 P, N 4 I# S; l% f% Q% t) B: t, G& o
l! t: I7 P) G5 g$ }" G
_PPC/ n" \* b- x( n$ M. l. @

6 `4 a) h4 J9 ?2 OPerformance 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
2 U9 N7 A- ?3 A* g' {' c4 N% A" ~ 2 e) V# a1 u) Y1 J' M- q9 A( D( l8 l
Method (_PPC, 0). M; z) h. Q7 M( u: J
// Performance Present Capabilities method 2 ?8 L$ f+ h* J/ ]0 X7 @

; X1 X; Z1 ?8 U: U{ ' o' z4 d" L6 @
, V/ Z  h% `" s9 y5 y4 X
If (\_SB.DOCK)
( J% a# j; I1 X. B3 @( W6 h1 _! N& T. J. t& [
{ 4 B! Y5 a7 y: y5 T1 b1 w" O

5 J. O0 u% s/ S0 fReturn(0) // All _PSS states available3 Z' {( @) n) P# j- a5 _

3 k' A/ P' m$ y) n
% Y  n; G' U5 u- R1 \3 w: z6 b} , v+ {9 w# A0 Z6 o7 p! T9 ~) m  \

5 y0 w# D4 R: BIf (\_SB.AC)
0 r5 i& P9 D, Z7 L2 c# Z6 I( G4 C7 l! s! E7 g
{
! ?6 `6 U3 }& O' f& e6 x5 @. q: \, y7 N
Return(1), b6 o+ B+ t3 w& [6 N4 t
// States 1 and 2 available
% {. p# s! e/ M
& ]* y; a' u7 O}
& z- H; J# F' F) W" b& [
0 _) t$ f" N; }: EElse
, L6 d3 I; ?& Z" n4 J. |( w: Q, V1 W2 [- z" i( S$ d1 V
{
3 D2 M% s/ ^& V
7 j" {; w- _, A, s4 NReturn(2)+ J& }" t9 R$ M* Q+ K& L
// State 2 available
" S6 V; j' d% r, u5 c4 h: W# C# t' g
* \6 H8 Y; b( a" H6 h$ S}
1 N( @. C! t+ ^8 `
$ O* S9 g1 n5 m} // End of _PPC method2 c9 B6 k& A! d

! g0 k' u' t3 el
- v! `' Y7 N2 `
_PSD! x% K6 |: ~; q" K0 _1 n, u
1 s5 x8 x" f0 e1 s4 }7 ?! S
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。$ [! Q& f7 I) r

4 Z9 U3 V4 P% `6 B  v  H" [# {REFF:
$ V5 B# j  i$ R3 ^1.
& r1 E! v  P! P* ], QACPI Spec 3.0
  x( K2 u$ f) x' j2.
& H' V. n, i5 M6 W$ A# aIntel Processor vendor-Specific ACPI2 j! d' Q! t& \8 y3 k# E# j

# s3 C- @4 }: ]: D 4 V& P# i5 }1 ^3 o2 C- M9 i
That’s all!
6 D; N; \7 |+ a" d2 E% V# t$ }! d
* c$ `6 f2 @0 D( s: _Peter2 k: a. d) C0 J, j$ ~! W6 q
% I( y5 b) L% J6 g& H
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
- F* Y  t; S. N
1 C5 n8 B+ z  ^2 p* I7 }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工作时间的占空比)的方式# I# o8 }$ o! j& z
,影响系统的功耗和温度。
; S4 c. }- s# i/ V5 y3 _ $ `3 D1 m# ?/ U* I' T' w6 O
2. T-state Control
, z2 Y" y7 N5 z3 s
, e- H6 A. |- Q% G1 C1)
0 X; K. }+ V6 l0 D2 t8 g" OMSR Based Control
0 b5 f, Z8 Q% M
) U0 Y5 r+ y5 A- ?$ O8 lBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
) b7 E# }% v4 r& s+ n5 o
% g8 _+ F7 N4 i7 x2)- U2 B: O9 K7 k  V5 p- [
I/O Based Control0 n  p+ }* u8 E8 M  ^/ \
; [! x4 k1 S2 v2 d; U/ L
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。0 X( x5 h# ]) o2 B5 h/ e

) b. e/ G# b5 h5 f- [) {2 Q( g3)
6 z2 o+ F: C* q$ i* SACPI Structure For P-state
0 e' k+ M# G$ z3 U' d1 fl. A  k& N3 Q. S5 q; [
_PTC) s1 |' r. L3 K  Q# K/ t4 f

; x1 T  b) i/ S3 X" |Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
& G' @/ P. M0 o4 o  Y9 Q 6 O- M. Q% m) t+ A; P
Name (_PTC, Package() 4 @5 K+ {4 H3 R; x# m
{
6 a2 q9 V; M+ S5 V
4 N  }4 `+ C  L3 }  `- W$ I) AResourceTemplate(){Throttling_Control_Register},
- q9 E. q5 d+ C- f" }) E$ ]5 O) f//Generic Register Descriptor 1 H. @( U4 D& W0 c

/ b+ H" _5 [4 F  `1 C) I. CResourceTemplate(){Throttling_Status_Register}
! P6 I+ A, |& V% ?0 U- s//Generic Register Descriptor
9 u6 O; s, |# K' a8 h}) // End of _PTC
5 b( U* q5 w7 ~. Z
2 d2 c0 |0 y3 w下述是一个sample code7 [- X, k' V% |0 t3 U  O8 q2 P+ L, Q

8 i" }: R- m/ y% S6 d6 d5 `3 Q- }1 w6 E# O
//4 x1 I" r/ c  W3 V3 o: b* Q0 U9 P

- \, _* y9 `0 K6 D& E- k' @. T// T-State Control/Status interface
$ l. U9 z  |6 `3 X$ M" {: {5 t$ [! f! B& A* o& F
//( Q2 U( a* ^/ j# B, w2 l, p$ g

, t% F/ d, Q% @3 R8 W' V# L  C! PMethod(_PTC, 0)
$ g8 ?9 S) |" F9 ^: U% C, Z7 ^- R. j* p
- N! b0 B# X* v% V7 p% C{
- M7 w$ C2 X* u; o" s8 Y) O% S  i2 \  }! u6 J: W, ?) P
//
; {. o, G( H8 p; x! T% U1 I+ Q: F5 X  E8 L  m+ H/ ?
// IF OSPM is capable of direct access to MSR
* S8 G" H7 x0 }7 K
/ v% O6 h' w8 {7 }9 H//
& n3 ?1 d* R% X% i4 d$ nReport MSR interface
" Q& p) D* Y7 Q. Y, p. p& h0 U1 U/ `5 n: N$ }! M# o
// ELSE' D  r1 K7 |- a9 v, J* `" c) `1 W
' J  J' g1 z: s$ j4 q, `9 Z( o
//
5 M& n8 S7 r# _, k2 f. I1 RReport I/O interface- J6 e( u$ v# e7 S4 B; Q6 L

  ^4 y+ f1 |" {* H% w9 `& l//" A/ P/ O. z  C# \& X
9 g. J# a6 Z+ h) x3 d* L  T
/// l" j+ V" @! u
PDCx[2] = OSPM is capable of direct access to On
( g! o  a- Q( ^) D& e2 R7 c/ q! a
/ ^! C7 C# `6 z" `& j4 u  K//+ ~4 B* P, N% x! w8 B2 b  [0 f* J1 K
Demand throttling MSR% S. W% V7 A3 X1 o6 @1 k

& D6 @$ s( w- H) c6 Y- A' t//
) q. f! r0 h- F0 R6 m5 p' g8 w! v5 b2 }9 {( P
If(And(PDC0, 0x0004)) {
( R4 s/ l7 {* L9 s' W4 C9 P  g5 X' l, |+ B5 x9 F: D
Return(Package() {3 {- Z6 M/ ^& c5 B9 D/ v, P

+ W: o, E/ t2 C% E0 kResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
* L6 a9 G1 C6 }" D
; z; s6 a8 ^6 M9 _& OResourceTemplate(){Register(FFixedHW, 0, 0, 0)}8 I( ^! T0 D# ?( _; M/ T& |

. s) ~+ E% Q5 ^0 _) d& r})
2 J* m/ k- t- d! c
$ ^- I& n1 K+ M+ j6 R- Y}1 S- o! j, R9 {! \6 p

/ p" T7 R" x% m; XReturn(Package() {( O8 C( x" E2 A5 ?1 K
& @" u0 c2 s" A$ f0 ?  t
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},3 ^* `; }5 j5 e) X2 e5 m( r6 e3 B

) m8 |9 N9 w7 ~" A, |" D0 N% Y: t* mResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}2 g8 w' \, A9 }' J! v

/ c1 L1 u3 ^: H; C& w0 _})
  j; x) p5 O1 w+ |2 |
6 g( @9 i$ J& d/ R( q& k}% u6 L! Q8 G1 G* G! Q

# J: F9 B7 }  I
8 _$ N# b* Z% S+ J7 O2 K+ k+ |. R3 P4 y9 a2 E
l! L2 s/ s9 Z- H$ d+ Q' o
_TSS8 _3 t& O9 t0 M4 k* v- u
& y* E0 ?4 c9 v; [: G0 m+ m
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:4 [, J  D" D5 @9 S* n4 l
Name (_TSS, Package() ( \4 N" y! W. l- c1 ^: d
{8 j: H1 h5 f; R3 h2 A+ o- i
// Field Name
. d; Q1 y1 k' s- ?0 X- ^9 `" eField Type $ ~$ c  h% M( R) _) ~7 m& ?5 V  I! w
. t  C6 g) U. H# v/ p

' r  U& j, a0 Z3 p6 j5 W
% y. I0 J3 |( ^- Q3 ~9 j1 p; v2 xPackage ()9 _. H; Q# X7 T3 `+ a6 p/ r4 Y. e+ I
// Throttle State 0 Definition – T0
) o+ }0 B  a5 |. L" d
' I& X& d, _4 p{" A- z1 d6 b; K+ A' L6 [% J) i" s0 S
& o. H* ^  c* [

8 _9 f- d/ k5 Q$ M  v+ y( f, OFreqPercentageOfMaximum,7 Q8 w# r, h8 V& T, S
// DWordConst
6 S' q, D+ _2 ]3 z$ @& S! G: C, h4 r; w
Power,1 Y0 B' N# s. o4 z
// DWordConst , j" a. ^8 x+ J+ X( i$ ^& k" l3 |

8 i' W1 k4 u) T2 [) W5 |# \TransitionLatency,
3 T" `+ R6 L5 h% z8 H0 J// DWordConst
# m' d  O& j* R/ N# t
6 I2 X# `( l0 _" x  XControl,
2 J9 q9 b/ g3 T1 T; R- d// DWordConst 4 `# M% v) n8 \; s
3 Z% }1 J" V8 J# _5 I
Status
2 g5 G, t/ I( ~+ T: X// DWordConst 0 r2 p8 q* @0 T& M5 e0 V; r2 q
},
# `/ k+ L  {+ k9 C7 S, N' }……' I6 V3 M# Z+ @6 ~7 U) S( ^
}
; M5 i0 k: Q3 j, J' l" S4 P
3 l$ Z2 ?/ M3 U7 z9 d: B. }8 QExample code 如下所示:$ V" E. n. M( [# H8 S- B. f

2 s* v* r1 ^3 ~$ z3 DMethod(_TSS, 0). s3 x' R7 A9 t/ k, N
0 ]: k7 n5 y. b; I! l/ f
{
! J! e) g9 f/ |* X. p- Z2 h3 ?8 D0 N1 B) }0 _
Package(){100, 1000, 0, 0x00, 0},
$ Z( y2 h5 x9 k& r0 w$ v: ~7 W: e5 m9 m# U
Package(){ 88,
) l2 V3 x) e7 k1 f" p875, 0, 0x1E, 0},
6 s3 q( I; i" K) M9 P! B! O
$ R: A) B+ @4 W2 [; n6 kPackage(){ 75,8 g" }) q. r* O! V" k5 ^- {4 J1 n
750, 0, 0x1C, 0},; N# }9 K: {% h8 k5 S2 {
% M! K7 W7 {" ]( ^8 L, r
Package(){ 63,
( {( A6 b6 ?% Z$ d# u625, 0, 0x1A, 0},* ^% e- I1 x5 t! c: r, G) o
1 W# `9 J2 K5 a) h2 z# J8 m* O$ y
Package(){ 50,
# R* |' W! m+ o/ Q500, 0, 0x18, 0},% t! b, H4 u5 ]; k4 W3 Q/ e; E
7 U; b1 z2 `. O3 b! u* V
Package(){ 38,
" z' r+ p7 `. B7 l& b# r375, 0, 0x16, 0},
, K1 }6 c; A# G3 x& E) F: k' Z+ T/ n
Package(){ 25,3 {1 z- {# ~- `) @
250, 0, 0x14, 0},
; B/ }5 g! z  k5 e2 r/ N; K0 u, x- _& N. h* M
Package(){ 13,
, _# E9 b; ^/ b125, 0, 0x12, 0}
  c# G$ N: d2 \% @& i% V' p  a  C% J
}
+ Q2 @  P! w5 }. N+ @0 a: y, m+ e+ ]; I0 i
6 B- i4 Z( u: }: m
l; T0 r7 y+ M$ B
_TPC
4 b& \* H/ B( |1 u: Z* l 2 y# H2 W- o: I. o% K
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC/ m$ [0 v' d' t, T5 I5 }4 B
) B1 i) Z# l3 X2 p( u
l
/ C& r2 k! q; U$ D7 h
_TSD3 w# x6 L" M7 s1 a
# Q2 K/ t& n$ P# }& ^/ O8 F  n, h
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code1 ~; P, T4 [& s1 ~' |) }

! i1 d- K# c# ]6 h9 b7 H# B, tName (_TSD, Package()
9 Y! I/ n2 W4 O# F# a, E3 K. J+ s+ s' S$ t/ y* w  h5 V' c
{
. q2 |- {; W  ?  Z# z& q7 X# [# M. u: v6 ~* g4 j
Package(){5, 0, 0, 0xFD, 2}& B1 R& R3 z, j: ~6 N+ W
// 5 entries, Revision 0, Domain 0, OSPM
7 j9 U7 s) L1 K# {! z; v/ YCoordinate, 2 Procs
8 m! o' t7 @& E3 r/ p
4 K& r. h$ w# |% L2 P+ T& e! V5 G; B. i5 b  r0 i
}) // End of _TSD object
5 ^- Y2 S" M- Q$ i & @; c7 Z' \3 }  _* T' X/ D7 O
REFF:
2 o2 @4 w8 w5 `% ^( S1.
+ j6 }& B2 t9 h4 r! AACPI Spec 3.0: U* P# Y# N2 V3 E2 Z1 @/ I
2.
* M9 G: j5 U- Z* p1 A) AIntel Processor vendor-Specific ACPI( \0 m" l" o  M' ]6 R
, `+ e' u: C% y' U5 c; G* W$ B

) M% a* O$ Z5 WThat’s all!
) S9 C% ~8 u- ^8 Y
) d! y4 Z) \3 f7 J! xPeter
* J/ Q. s$ v7 G& i4 l( s 5 Y8 C+ y3 M( I% k# o/ _
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-11 21:15 , Processed in 0.057398 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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