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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
1 j- a+ p( T0 f9 h* E' p
1. Overview
8 |& @. [' m0 K7 C6 A! f1 h! n* J5 @' I5 ~: t# e
# W* W: E: [8 v
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
) P7 z3 i1 `7 p; |. B降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看  R4 n9 r+ [9 z7 i' |# G& C) p2 ]
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
1 `2 b- n/ }6 d/ U# ~, E- C4 Y8 S) Q( O2 m! E% ?( O  }  ~5 M
cstate1.jpg
4 ~6 g  S; n! t- v2 [" c
1
+ W2 p# {9 [* F& J1 X% W
2. C-state Control
# E* Y9 v7 z" n2 v2 t+ g* U5 D
' ?, l& ~* q/ \  c8 G1)5 W- y. y) x- u0 y- ]4 @
Detect & Enable C-state$ o6 G5 k" n1 s2 M9 m5 H
; o! h6 Q0 s- z5 g
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的支持。
7 V# `5 T) @+ L* V+ O1 w
( m" {7 y) e- G4 V3 ~" i+ c2)- K' a" F& q; @1 u7 T4 O8 w/ \
C-state Basic Configuration6 v# z( i1 _2 J& ~
通常情况下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)。
5 G1 \- L$ f1 ~. A( |( U8 ^# L( ]. u9 K" D5 P
3)
6 M$ B- Q2 ~4 `- _% NACPI Structure For C-state
$ U9 D$ J! Y1 x* e+ q, U) b  A
l8 h/ H7 z+ @8 A5 t8 m( q
_OSC & _PDC3 y6 m) `" ?6 L- R' G8 R8 u- j
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
; L' [  _& b( O; H0 p$ n& Y  J3 jl
. o# E, N* {- w* i  r) K
_CST7 t: W/ i' S. x) W8 o* G, Y
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
9 E( w7 m, d/ `4 {- zCSTPackage : Package ( Count ,/ ]! C; d& |+ Q/ P" r
CState ,…,
0 B, i3 P( T- R# F. A2 ]/ |CState )
) ~" |$ [$ q4 j1 ?其中Count表示所支持的C-state的个数5 _* b; P+ m; \, _% X
CState: Package ( Register ,7 x7 J2 R% n# g* J/ V) W& R" v
Type ,
! U' _. B) G2 ^9 _% C) `* M0 OLatency ,# ]$ O; ?- N% I- A* o' P# X
Power )' u, c; y% C, r2 a& T9 r

$ y8 p) {0 R! u& m& E/ N% YRegister表示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" `5 _  t' _# ^6 U6 a9 v
) w+ V+ U; h$ i( y9 O
Name(_CST, Package()
' x) R5 Z9 n3 p  x

" a7 m* Q+ i+ U( I{
. G. J! `# `$ t) Z4,
4 i0 B* i8 {/ H2 e0 V7 N' s// There are four C-states defined here with three semantics

5 D3 w* U1 d! i2 H+ |/ F3 k4 @/ n5 [0 d5 \3 P' k
// The third and fourth C-states defined have the same C3 entry semantics, Y) J: s; N9 X5 ]! y/ i% x, b7 {

/ }! U9 J' {/ q# |! x% F# BPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},; q/ U4 v2 C- m/ H  Q) u
1,
% _( @. \8 K% F$ |20, 1000},/ L. G) }, _9 \: h4 P
) H4 h2 u/ @( o- T, O, Y$ E
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
9 u$ R+ L* e" q- s2 l40,& a# i' u7 N* Z0 `  ]/ S
750},
3 l- b1 c9 d6 p/ ]
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,: ^' I$ C6 I! o; y
60,
; f# V. W8 g0 Y# q3 x500},

0 K. A% Z4 Q  m- N6 @Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,* Y8 t8 [5 J. z7 h$ W+ `3 r) Z; |
250}
9 S" h' o2 a) s8 i* A
* g  E- w+ b' h( l7 c6 P
})
: Z5 B7 f+ ~" _( l/ h. y8 f: U+ A
l
+ @# l  o& S4 `2 E1 P! G& W
_CSD
  H4 ^  k/ U+ s1 ~- T: f- o5 B: _- A" ~& K- {  A/ J( ?* f
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
# ^6 s* z' P2 q( S( c
: J$ s, a8 g; v$ T3 M' o
8 O5 C' @3 U$ z" l! M) @
+ U+ V. J& v( C4 I- E
. H! Z; ?( @  t0 ]% _4 P) P: h0 N3. P_LVL VS FFH& b, h7 R5 e( \6 N7 }; T
" a& E' j- v# B4 W
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
& P1 ^8 X3 K, w' |4 _8 l2 m4 b3 \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所示:
/ x) i2 ?  m" v  O) L* N/ V
% ?, k4 I' T* z$ `- N
gas2.jpg

: g: d0 \2 @' M3 m+ |/ X
2
( L! V( J9 Y" n1 h" X8 h. U
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的一个例子:' U) e4 P* c/ g
Name(_CST, Package()+ L7 Y  x8 m# g& x( C; O
2 P9 \! ]4 q$ x# p
{
0 \4 b; |6 {2 y4 K5 L2,
& A" Y' q0 d% d! A1 V// There are four C-states defined here with three semantics

+ y+ ^- d9 N+ K4 @# x) D& L# X1 q1 y$ B- T5 K0 f
// The third and fourth C-states defined have the same C3 entry semantics" ~) d" _6 e( z

6 c2 \" `, Z, c! b8 g. EPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
% S, \' N" P' f/ `0x01,
7 D1 R% L& D, f  j% G5 H0x03, 0x000003e8},# R6 a2 u# W$ ]9 t

& Q9 Z2 ?0 v8 n/ e6 XPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},3 a; {8 Q( J0 c% d6 U8 }% G: J
0x01,
  J4 {3 W, o9 N$ Y0 z- A0xf5, 0x0000015e}

8 U* K5 t& E  B& h4 C3 \- m& G) T}) + D. ~  N+ N+ f+ K: D; C( e- X

. u2 v% Z" k+ `; Q' w9 m8 ]# S( s8 g
- J" j: ?) R# T9 _* dREFF:7 j! }' c2 D  B+ Z6 @- M( R% T
1.: i5 i/ j$ E1 ^4 Q
ACPI Spec 3.0
8 N+ M/ ~8 J4 E* @2.. s" x" r5 Z; ]5 F  z# F0 g3 E7 y) K# B
Intel Processor vendor-Specific ACPI
" n1 @4 p; J$ U: ]2 V5 f
8 f' G! v, w. ]3 a) K$ y, z9 M& I, i$ ?+ f9 c
That’s all!2 i4 g4 s3 h# w0 D& l! [5 k2 \; Y
/ R2 c0 b4 U9 n6 I2 ^5 L
Peter
2 @8 n! ~# z2 ^! o. O) u7 k" n# K$ H2 b& \& j# R$ b
2010/9/20: E$ b2 Y2 [+ Z* b( ^- F9 Q1 e' S

2 P# u0 w) Y5 t% _, L6 L, [[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview+ d2 O* p9 m7 E

* S; y; ]( T4 F9 k! dCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
! b6 c+ V. @+ p1 J& lEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。! @# |  I% e# f; A$ e6 ?

. T& z9 S- d. \7 g2. P-state Control1 O) v/ U! l; K) T) d8 s# M
, r. g4 Q7 k( Y  b
1); T; P" @" o- ^  B# I$ K+ J
Detect & Enable P-state9 M  V& j' f- X1 l) h* P: h8 e

( R- a2 L" e, w& d& x, vBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state! ^: W6 a0 {$ s
7 K' p6 f9 y, A: e
2)
5 X* y/ t2 V: ?+ y/ fSupported P-states
' v- V1 I% {0 T
8 J+ b; Z8 }3 I# _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
7 `1 j$ e' X* s. b
1 m1 o5 Y2 O' aMinRatio = PLATFORM_INFO, K4 D" x/ m3 e8 {( g
MaxRatio = PLATFORM_INFO
& i4 m. ~3 {/ \3 U. A0 ]RatioStepSize = 0x01
, E; G: q7 |5 L- \, D+ aNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
' A& I- n6 E* J! E& D6 h
2 n  \! e* H( C9 E" [0 h: W. Q6 e4 cIf(NumStates > 0x10)8 ~6 N$ ~; h# w  C6 w
{
, |% h0 }" M  b3 k' ORatioStepSize += 12 M" C" N4 n! z
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
- S5 i5 ~. D; ?, f  e/ d9 [}
; F7 g0 K4 V: N& J3 U0 c 7 R. }6 G  L& m; e9 c
3)
, }- c$ I, r& z; dTurbo Mode, J' g; ]# Z5 o4 E  B, I$ G. a
( Q, v: T0 q" E  t7 w& s# C
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# }8 R' ^, Y% H/ N6 x$ \+ Q) e

! x8 l0 u0 A: G1 n4)
3 Q; q" y2 b1 O3 c" \8 f3 ^Over Clock
: T6 o* B: ]( g  P
8 G. R, E# y  s0 x1 O, {某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。: C" e# B9 t3 R5 y; E/ Y( a" P' B
+ q) f8 j) J3 H1 n4 O
5)/ [& v6 s7 |: ^
ACPI Structure For P-state
! H- T& i" C0 ~7 ] ( z. s- e5 y' B
l
- G# E8 O. _. t; k& P5 G7 i/ U( @
_OSC & _PDC
4 {9 u4 o6 S, s( ]9 C- p# l' ^% s3 K; B 4 Q* H1 v' N4 i: M: ]$ a; G3 m- G
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures1 p/ }! b4 d2 y, \1 B

6 V2 u7 L% L* B. y* w2 f6 B# u2 Ol( e4 U7 C, D: @5 H& P+ T
_PSS
8 I* V! K& s& z: ]% w9 Y! oPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量) ?2 R( G: b' p2 a  x
并且通过一个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做比较
! U* J- Y- }/ m8 `以确定P-state切换是否已经完成。2 P5 w, M" V! D0 A; \

, J# F, g) L5 J$ u9 bName (_PSS, Package()
8 @: a  ~* |$ f/ \{
- t, }2 ^% ]$ G// Field Name
9 s5 c3 `  y& _; EField Type
. w7 a# q+ H1 d& [: i. C; e2 l. G0 V4 X" j

: S$ T1 ^# |3 t; j7 T" {8 u/ _# C; m9 c+ X4 {# A
Package ()
, ?% u' z" h( O* A2 U// Performance State 0 Definition – P0 % |5 ^- ~% x. r0 |5 Y* {
0 j+ o  L2 e0 ?, J8 V
{
4 r0 b2 L" o6 l- P8 B
& c- ~  @1 H. ]3 s7 ]; U; e7 G$ @& ~2 Z6 `3 V: k. i
CoreFreq,+ F. ~! j( O2 Y. F- \
// DWordConst
6 P  b, P, d6 h* [$ z+ F7 n% i* z: }3 m

- c# n% E$ m- zPower,/ o4 A# ^& V' I* E  ?
// DWordConst # x6 x9 B- [$ N. T. ?6 Q4 B
8 e7 N8 s) M8 U" _3 g! @% a
TransitionLatency,
/ E7 e5 q7 {; Z/ T* ?// DWordConst + P" ?$ ~/ S- X% z0 {
. U4 m: o- \# Y+ u- j
BusMasterLatency,- _3 I2 Y* ~3 R. _
// DWordConst
4 i. L3 F- I* l7 V$ b1 i( i# G
" _3 v  p' w4 CControl,! d$ Z$ d2 t, F1 C. U& k
// DWordConst
1 i3 _6 e" _5 Y/ E6 I- p4 S# E+ |  v0 G! k5 Y' {1 R1 w1 k
Status
: Q% H4 ]. A. j0 a" L( p5 I2 ~. m5 T2 ?5 \, @* E1 h  ~: l
// DWordConst 4 m5 N' Q6 ?3 ?
( K' S; q3 l3 n" U/ \4 K1 N: w
}, $ w$ [  C. u; W1 r( q

/ B/ K) K( e7 |3 y- O+ F% E. * c! P1 s0 k7 o7 z1 R9 X7 p# c

2 N, x7 R; C3 z2 I% _  P5 I' A5 @.
; \& U2 l" f! m/ m2 ~/ D
% a8 ~' U( ]3 f8 c* u$ X4 I.
4 _' I% {: M( v# C& b8 ?+ E- _7 X9 S}) // End of _PSS object
7 j7 P1 r8 H. T" E; y前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
7 J: x8 g/ V4 j+ k
8 n& j7 j$ ~  u: r( e9 j* Y. ZName (_PSS, Package()
5 `+ w" S0 \# K$ i+ P8 ^( \# H! }" U. ~/ s0 M6 k0 n" J
{
8 n, s4 f' R- T0 O% l- w3 w. f1 [: i" a4 @
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
& s9 x: E4 U4 Z; M" @5 c4 x: F& ~/ T- n
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) " s1 `+ M1 Q: i# c7 R
- D( i: T1 A( o3 P, E
Package(){1400, 8200,
# U$ v* P2 z) K; J' l3 @10, 10, 0x000E, 0x000E}
5 L1 ^; T& s/ ]0 T# x8 A// Performance State two (P2)
# C6 p& |8 z" z+ B3 p" VPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
$ M* L. l: P  l8 F& `5 CPerformance State one (P3)
9 a# @4 O7 q% T. s: p1 }$ |/ y; ]
4 \  E. t0 M- [* C- O5 C% KPackage(){1200, 8200,
9 q% M+ I, }0 e+ G- |10, 10, 0x000C, 0x000C}$ B- L  `  K( h0 g5 w* ^6 K! m
// Performance State two (P4)
% {( e6 w9 G# y: q7 w) X
& V6 j* A3 S' |% I4 Y- x+ M1 }1 B: }8 K}) // End of _PSS object% L+ t; ^. \+ }8 a

9 o. h% S$ Z" P: l另外当该平台支持Turbo Mode P0将会reportTurbo Mode' a' k9 u$ R- Z  g5 ?0 I
7 d+ `, |1 r+ c- h" Z* t; S) V
l
8 {% J% L. A+ N3 e& y! N1 {& p
_PCT
2 r9 k% W/ C. L ' ]! U8 r& c0 u0 h2 N
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的方式来进行。( q5 e. ]) L4 i; S

; i, X& O0 F& E6 S. c" j, h, NName(_PCT, Package ()
. E5 M$ S1 }, o# O; {& k- b) }// Performance Control object , A$ L) \/ z4 V# p
3 d, ?/ H/ L* e6 @, V
{ - m2 S' D' a; B* D  E
. \7 _5 a, q/ {( L6 g! ^3 c* H
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
1 g, }4 F7 ~/ K. \// PERF_CTRL
4 [* g- ]7 `  P! _
6 S8 \( l5 q* TResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
6 R2 Q, g' K3 I, i, z, ]3 ?7 Q// PERF_STATUS
- Z3 J) S6 A0 H  U$ J& C# Q
  u, A5 y/ k5 I& M. ?}) // End of _PCT object4 ], _! B( o! G9 Y+ Y$ Z& S  ?

. Z3 t# \# k) t0 @7 `l' T0 B+ y4 h7 k' V5 j/ k4 Q6 m
_PPC2 G$ V, `; j( M4 @- v2 D, t, G* k
3 _0 C4 A' J7 c& Z
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
% w/ ]. W  Z5 S4 j ; @% x% c$ H# x. O  n
Method (_PPC, 0)! G. s, B! h1 h- v6 e
// Performance Present Capabilities method
+ r7 a% H* [! m! O( q, [
, u2 o$ m' J$ J8 U{
1 A: u# _# ]1 d" _
6 u0 V* k# I( L4 DIf (\_SB.DOCK) 8 O% c! g7 A4 K

$ _2 A) [5 R- m4 H3 N+ T{ # t( `0 W5 K- I2 A' M) q) k
# a' l$ O% r# T6 k) Y* P% s
Return(0) // All _PSS states available0 H# |. y( A( f/ a

3 Y! L9 N+ e1 h- x% _7 g9 b' l% N9 _+ c
} + f$ [- i: @8 e, M/ F0 X; Z
  j6 m2 C* @) x, j5 _6 t
If (\_SB.AC)
) K& g) e; n# S5 R4 v
6 O, p, k, C: A0 m9 y7 _{ 1 v* w/ ], R; e* X% {9 d4 k

# e" L/ N0 U1 Q: aReturn(1)
# _2 ]* v5 t2 V// States 1 and 2 available
" p- r$ L5 B, o. U  c: v  o
8 W. l" ~- R+ e- O( J+ w) n- E} : F2 k4 ~* _8 Y9 _' e9 n
! B$ I6 Q, [/ A4 }
Else " v0 ?" ?0 T! N9 D$ [; T
+ Z+ O- r% F+ ~. d6 s  k5 y+ Y" N* _
{ ) L$ s1 ~+ L, l- J. b

; m% }* R/ f) R2 @! \  \Return(2)
/ e& u0 C% a$ U  r. B// State 2 available# ~6 o& n* J0 ]) t6 B/ f" r- l3 q

/ i" m$ r4 R5 b( b$ j} , M, x% J: [( W8 Y& E
3 m1 e+ k0 _  d8 @3 }
} // End of _PPC method
  U! A1 n- a5 A  ^" v) q # M- N* [& g. {. L6 \! \
l
6 r3 ?" m5 ]# Z' @7 ^* r! y6 [
_PSD
5 C% [( e' _; l
; N; x* h1 Z1 \) `) t: B: cP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。3 @3 I. Q/ }( ~" O

" Q, V* O; p! l# k1 R" f! w8 zREFF:
) i- C+ q1 \* `* v8 K. U9 R% L) D1.
2 T& A+ b' P" G3 y! _ACPI Spec 3.0
3 O9 ~# ^! H" C9 Q* O; P' W4 V2.
3 E0 t) `( L  B0 b1 EIntel Processor vendor-Specific ACPI$ d. H+ e9 c8 G+ Q

0 H! N  s6 N) a# K4 w: b+ ~
* r& S2 p# y0 @* N( i. g! dThat’s all!* j- }4 d. f. j+ W- Q8 B$ [8 S
$ ]: u+ H6 @# p
Peter
! @$ d( C; r+ ]# D
, G+ ^5 q( P3 W/ Q' o) n2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
2 |; o$ n/ U' `; h6 D; U 6 L0 r- Z: p% D. k3 T
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工作时间的占空比)的方式. M4 _+ f: X) g4 K
,影响系统的功耗和温度。& Y5 g' H, U! `! G
( G6 j7 ~' _* Z0 p
2. T-state Control
6 W, o4 o% \8 a) }
# f, q* v. U9 r( H3 C& t- e1)
) V, X5 o; O4 V$ QMSR Based Control) `" |' l3 d" ]
: v! f& n& [3 j( r$ o0 w: `" D* ?
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
3 @4 A1 w3 e5 _4 T+ X3 X
( G4 t# T$ x# z( r2 v% r" ?$ k3 K2)
* u8 ]6 h+ s% @I/O Based Control
7 o) y; @8 @* z& U. z
! q5 S( i2 F8 R1 ~5 n# v除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。: i) X. N4 m; C
4 E- d# M3 T5 R$ U
3)
; @6 }3 K( D# D- O  b( L% JACPI Structure For P-state
' \; @* D9 u+ B' e# ?4 d# kl
; }& E- W) f& L1 ]/ [6 j6 K
_PTC! u( u0 M; D  E$ n
# Q. Y0 S5 V6 q0 P3 G
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:7 u1 b' J! b8 w; p) `( K
  c. G, g* @0 ?3 j8 T% F4 q
Name (_PTC, Package() ' x7 k5 X2 W/ h% G( e6 I5 j
{
3 j; n& {1 F3 N. X0 d4 k* o4 f) w9 p- i% l
ResourceTemplate(){Throttling_Control_Register},1 V, P& M8 G3 w5 u& S7 m7 q
//Generic Register Descriptor
: {3 j( y4 C$ ]' k7 n: B7 i
7 i6 h! [  L& H* Z; a, F& O+ a& w- RResourceTemplate(){Throttling_Status_Register}! |6 d& M# y& J  E, j
//Generic Register Descriptor
* S( m6 R: @& H5 n1 F}) // End of _PTC! P5 D, |1 G8 a. G; d2 N7 X
- w( m4 A$ Q# F( ?9 ]: M: ?
下述是一个sample code' V  @" g2 ?8 q5 C9 [2 k- X$ l

+ R" v* ^2 h! C7 ~% f
$ ^# ?( z; O% e* e
//
- w5 s% r8 ~4 B9 ~& Y! Z* d7 N: O' P* H  P1 N" {' _/ S% ^
// T-State Control/Status interface
! T! A6 g8 j7 t" U( B5 z
5 ^3 b" o9 ?9 }* I# I" l7 \" K//
0 A$ b/ [% j. e, j% v$ c- v4 T* s8 R4 Z8 m3 r; h
Method(_PTC, 0)
1 z, D5 x$ e9 G' U( R% u/ I! F5 b  D0 d# x; i
{' u% Y( v# n% J1 w, R4 o

: V( ]5 f( Y' f. V8 b, z/ `+ `3 K//- H5 K( e+ e5 i) q6 _* b

! q5 g# a! p+ a1 q  j// IF OSPM is capable of direct access to MSR
! G1 H* A7 }* `" q$ {  a, _
, d, _* R5 K& \. @$ {) n' J# |% j//
3 ]( @: S& E0 }2 l. uReport MSR interface, E1 g5 g8 Y3 Y; b% \9 R  L
, N* V8 j, H' b7 y/ U
// ELSE
/ Z7 ]1 \( X3 M, N' o  N4 Y6 Q+ Z3 c1 T& F% P$ j- S4 T4 R
//. _' z& D7 {9 R$ F$ D1 I9 n. S
Report I/O interface
" Q" W) t4 _& C3 C( w# `' e, G- j9 `; i( q5 ~" x/ h- E$ m' O
//+ E$ {5 H) I( q3 I, P! l

3 R- e7 I+ U7 A& p3 |//) ~" G* p# ]$ I( U$ L- h
PDCx[2] = OSPM is capable of direct access to On
$ q3 q, v( ?2 e( T/ ]
( ~: l. |& B+ h. e1 I' V//
, _6 u# M' e; l2 P8 IDemand throttling MSR0 K/ P7 \. e3 _: `' B

0 X$ ^& _0 y; h. h# d//1 X# K+ |. N5 `; K! p+ a2 x9 J

9 r% B& F' M( z8 hIf(And(PDC0, 0x0004)) {
# k, h0 `8 U# \! e" I
2 s: Y8 w. L1 S" M% `Return(Package() {
3 r8 q7 d9 Z/ c) `1 y0 u8 ~. ?' W! }/ _5 }( E! D& l( n0 X( @& k6 B* {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},: X7 P  R9 g( O, x1 _. [: v' g

# L+ Y0 B7 o- {: ]: G9 D6 UResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
* S  M# N, S+ u# ~( _- n: n2 i# K8 M2 S2 v# f
})# B9 b* E' l( _. {5 T8 p; L7 s

" _1 C9 `; W4 E: i0 r! F}3 z+ x. y( E& Q# {% s  W4 o

' h: |5 O: D( {8 B. eReturn(Package() {$ K. L$ h- w  Y1 K) O& [- ?* r
  J' }+ g! [! s) Z+ o! x6 v6 _3 G
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
) o/ A6 F5 K7 M3 [0 q4 I  Y. \; U, i9 b0 g) G0 T  S
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}- T: o& C" `/ e' m4 _& u, b

% u" f% P" y! z8 W: b) F})
0 Y! W5 z/ z* q/ K1 |( d; f9 L( Q; i0 \
}1 Z# @# D8 C. X+ a) J$ S

" g% w: ]2 ~  [
/ o5 V1 m. t7 p" J6 |* o: v& z* d: I* Z! ]- e$ e
l8 F( L$ G) a  X* M* P
_TSS
( A$ l4 K5 W9 w5 o& P$ f* F7 a0 [
# |" j& W, ?( @6 i! E+ PThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
; ?+ M/ g* L# x( R& q5 Y2 xName (_TSS, Package() ! ~6 t# j! Z9 \% ^
{( Q; Z# @2 e4 Z5 p
// Field Name3 r7 a. g. \& U4 E+ h- n" n
Field Type 0 p% W' ]$ L' g# }! D
) F, k+ n. h8 y; E
' ^  a- {0 [+ e9 J' Z6 g1 h
0 }0 ^$ S. q$ |
Package ()
8 r6 B5 C3 R9 y: E  A! p// Throttle State 0 Definition – T0
0 g2 Z# M( d/ p! Z7 N: R* J5 z% Z2 W
{+ s) `8 O' m% ~( E" _& ?
  X4 t* t  p( ~! W

; x! Y) j% v7 M: H) L! X1 }6 j' {FreqPercentageOfMaximum,2 T# O$ v5 Z9 {) f
// DWordConst
/ C2 P2 ~6 M5 c9 Z1 O% V! I+ X4 }+ Z0 t7 ~: Q5 p0 X
Power,( s9 K/ m0 g0 A' `1 r7 p0 e
// DWordConst : z$ [0 N& F1 L, S

5 O- J2 k- |) o" ~TransitionLatency,
, F( U8 y- G, d: W7 D// DWordConst
+ s1 U4 ~+ y2 y8 L  o: l$ t5 @3 {& F% c5 d& n/ R: L3 Z9 _
Control,
9 I  l9 p/ a2 }4 _// DWordConst 8 g9 m3 I. N7 E- u; N2 B. t& E

$ z6 ?. F  w7 G8 x/ j$ ]+ sStatus" d6 H1 K8 s* F
// DWordConst . q% k; ^* a# y" b8 }/ h2 X
},
) n6 H+ X- Q8 H9 y  x……1 N# _1 S5 T7 r' d
}; |- H/ }# H7 P. B1 k" J
! g- l1 D" L& c, Z+ M* V
Example code 如下所示:8 D( `$ G% T2 f8 ?" J5 b
( o* R5 t" z; B4 W
Method(_TSS, 0)% `- s7 o# S: k7 ~
$ q8 l8 U( M) G8 D) ^9 {
{
* i# h' Q1 J1 R* z, g' M6 b, E& T* a1 g$ @  M4 w8 Z+ @
Package(){100, 1000, 0, 0x00, 0},3 O% E8 V3 R: g( N7 B8 b

0 e( R5 n" d' j0 ~1 @- gPackage(){ 88,! S, B4 D6 m, |! i* w9 h
875, 0, 0x1E, 0},' Q6 j1 B! ]) u$ b
: ?! R  G/ p/ q) F( Y
Package(){ 75,
5 I# w  ]! W5 x6 g* N5 x750, 0, 0x1C, 0},
% Z- x, O( C/ |6 N/ c1 Q1 z/ {$ K3 z
' ?; i: \3 G# S9 I/ K( y4 o2 g9 A' mPackage(){ 63,7 A  E1 G- j0 q0 c0 T& u; ]8 K3 u& W% Q
625, 0, 0x1A, 0},
1 `3 q4 W& e( [$ [3 O2 C
2 c- D8 W6 K2 ~" }Package(){ 50,
+ a4 y' v! p, y- s/ {# N500, 0, 0x18, 0},8 N# u4 |$ f9 X3 r4 t" n8 P; j
/ v. m* O- q, z, B6 u" e
Package(){ 38,
' U" _: Y  b9 u: y375, 0, 0x16, 0},
% j# S6 H  M8 F8 }$ i1 Y* z2 S2 w' v% j+ b% ?
Package(){ 25,
5 _; ~$ K$ O( D250, 0, 0x14, 0},
% f1 d& |- w) p6 [  [
, q6 `' b- W. S/ _4 I: f/ m4 I4 bPackage(){ 13,
/ \/ V8 Q% d; U( M0 w; Q125, 0, 0x12, 0}
) y! Z/ t( J, {4 e- ?; Z% C8 K& b8 R5 m
}
, ]2 D! p0 g+ X% O! N5 p1 w1 H8 U% ?0 v" y! p0 O
9 y: d& X* u$ i+ Q& Y0 p! ?
l
6 l. e9 s  L0 c; ~, K4 K5 P4 n2 {* S
_TPC9 Z( Y6 Q8 A0 K: V1 D) |3 l
3 d# M- b$ R7 g! T+ J( h( P& s
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC7 ?6 S  _3 A- G4 _  }$ D

7 a: F9 @  o; s/ A9 e1 x: Z! G/ a+ G" il! T; s1 x' i& i/ D! P& I- q
_TSD0 M5 }4 D! d. G4 P
3 [) O2 ~0 }0 a: G1 a/ P
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
8 k: j; o4 ]0 B# F+ F9 |1 D . e2 C. H, l+ Q; J% a
Name (_TSD, Package()
1 N; {$ x* {% v# T. H, N" r/ D. R
2 L: E! s3 g3 E! g/ f2 B{
) _" ~/ c7 v3 M* [4 A* `' O' F2 X% V0 G. i- Y
Package(){5, 0, 0, 0xFD, 2}
: w. E1 i- T. \) k// 5 entries, Revision 0, Domain 0, OSPM
# g& ?! n; W6 ~; JCoordinate, 2 Procs ) @' |' O# Q0 b- ^

& ~2 G( L' X* i
3 O- l1 a, ^9 j$ R2 w; I}) // End of _TSD object& i0 N4 i  _& X2 K# d
6 |. ^$ w( ?! D$ l( q3 {2 M+ ]
REFF:9 E2 X/ k% x# P7 w% A5 _9 d: y
1.
8 C4 O9 c- i" I1 a7 lACPI Spec 3.0
: ~% K9 ]; {6 h! D1 r  r9 e2.
: [2 R" s+ u3 w7 FIntel Processor vendor-Specific ACPI, D6 ?+ p. m; _4 O
5 C9 ]2 R2 S" A$ J
& l9 g( E% }7 G3 o9 u# _
That’s all!
+ @6 C9 a; L) j6 [  O# Z& {
, s; g! s7 |* t5 GPeter
7 B; g2 E7 a7 G3 P. Z: u9 O% F ! i6 C4 K- F; _& B' E# i. K9 h
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 13:40 , Processed in 0.046588 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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