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

CPU Power States

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

* Y. n( m( @% [1. Overview3 N. M9 o9 M' A8 i9 [
# P# \* J" l5 [8 S  }

9 f3 i1 ~* E* JC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换, j" B9 L/ W3 f' E8 l/ K' |
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
; B! N: i& e# J0 a' S% T# l比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
4 r: k: W- R5 @8 r( a, i& V" E6 R0 ^/ k. j
cstate1.jpg

* W3 }% s% M5 W, L& z$ P
1

, X. B) h% F' m% F2. C-state Control0 w% x$ {5 B7 @9 X
) p: G7 X4 U, `; A7 x, ?) Y: S: u
1)
4 ~1 |; k$ a+ {4 Y" z+ e, n! o2 WDetect & Enable C-state2 N3 f  ]8 I) }' `* W# Y
: M; p) O0 A3 h0 y6 w2 R5 |
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 {! s* I+ `$ s1 g
, v# V4 g( a, x% z- q$ K. P
2)8 u* W4 v; m7 v9 z
C-state Basic Configuration
+ z+ ^5 ?( {4 _8 W4 V/ P通常情况下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)。
, R1 C8 Q8 {7 c* C3 y2 X$ m
+ _( a; n. D/ a4 q5 \3)/ G5 ~  l( V, [* K/ \' ^% j
ACPI Structure For C-state
% O8 l5 U/ u' L6 A, c, K+ L8 W7 f/ I4 W) H+ u" [
l
! g1 t# F+ E5 E, P9 k
_OSC & _PDC
. C! ?. d& C8 @( C* f" j5 u2 p_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
# K  }- b$ _! M; o2 xl
6 ~8 \- B" m) m# B% I% a
_CST# K2 i0 o4 |1 H' a7 _7 V
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:* ?1 L: W9 s& ]0 y% H1 F6 d: R& u
CSTPackage : Package ( Count ,
' {) |" H& l" J4 zCState ,…,( Y: j4 R  `6 g( J# h7 [0 J  \
CState )
% L) n$ ?8 l1 p  O' j/ F4 t; f其中Count表示所支持的C-state的个数
/ p4 L  K1 j; ]6 rCState: Package ( Register ,% I$ S' _8 |: r5 _0 W
Type ,- {; Y9 _1 m5 Y9 w6 f' _! N
Latency ,+ f0 X/ d  c+ `& F' C- }
Power )
+ {, c5 E2 c) B7 s, n5 j5 F5 v' {; A! ?) R2 z$ T1 {+ a2 V
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
& e! H7 j: p& F2 k
/ C( k( I% X8 E. i7 r1 t5 o: gName(_CST, Package()$ A+ M8 }/ X9 H. O& s: }; O

+ g5 Y* u7 [1 G, n7 K2 x{ 4 \# K/ k5 R5 F- k, {" Y
4,
" V# o9 f/ B/ H1 B// There are four C-states defined here with three semantics
5 e2 Z, v( J* r" t- ]1 f" o

. R. `0 s! I2 p! A, W0 P% [, U1 [# o// The third and fourth C-states defined have the same C3 entry semantics
' G' K, I: ^/ m. R, m

% A! O* e# ^/ F# y1 n8 A9 K4 tPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},  d: F' I& B# [; i
1,; |7 E! P2 K$ ?" V# {
20, 1000},$ W, H  C" q  \6 I  q0 L
; ^5 w0 d$ z5 j& Y% X. S4 ]
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
% S  K1 ?( ?! H# Y40,
) C1 [0 G  G* h9 N750},
% [# n  E4 R- a  s
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
* l, b9 o) T! j/ H9 L, h; C60,
: k/ l2 T* ?4 g1 W. T4 @% ]500},
" \+ e' q8 f' L2 b, N* a2 M
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,1 N4 ]8 O% \6 v
250}
, N. F. u3 R' f  b; Q

* r- d5 Z8 Z1 j}) ' o9 K$ J, P, D+ Y' n5 W2 S2 u- l% A

" u! L0 B3 s- \7 L, ql* v# S; @/ ^; W* b! f
_CSD
" \) a. p6 ^1 x4 s9 |
  }# ]; O: ]5 }% @# dC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。0 M; Z& ]/ P/ Z2 ]

3 O8 s  D/ p1 v2 b: R
5 p! n8 P$ V% @% l# {9 R
( ?3 ]- D+ p; }. H0 y& Z* ~4 T
, b4 M6 x7 n! R" o. d- d: k3. P_LVL VS FFH7 [3 v5 e0 K) K4 x4 W5 N: F
% Z$ V* O+ [6 q; e' r# V3 d. q" y
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
" S! @/ C" X# m) e0 `4 Y; qFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:7 N- t' B5 K) K+ K, o0 _: [0 E* w8 I
/ U8 N! J2 _- r# E. {
gas2.jpg

5 W/ B4 @" j$ i/ d0 K
2

5 h7 O0 g  ?0 m4 l8 ?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的一个例子:* Y* s7 {; Q# K6 T
Name(_CST, Package()
1 ~" l9 @6 X; S) t

; y8 l8 x' W: b+ y( W$ {* I{
1 E% Q) a6 J- e2,
  g4 x6 P4 ]9 b5 e// There are four C-states defined here with three semantics
8 p$ j' D8 h. N. [3 y$ D# }4 q3 U

5 w/ k2 L. P' f7 s// The third and fourth C-states defined have the same C3 entry semantics
- j3 T- G# L+ [1 h2 h9 q
0 A: K9 Y, v9 ]# n3 S
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
" t- E- {0 [/ M/ T+ P& K# C0x01,
3 R3 |+ d7 G1 F( s0 Y! A6 l0x03, 0x000003e8},; J/ u4 R* W! p: X

$ A( n) W* Q" \1 A6 ?& sPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},5 |8 Y7 P( [. a6 M+ k
0x01,' o" B. o, B# |2 a
0xf5, 0x0000015e}
9 A3 e5 ]$ V1 G& x- ~' d
})
, O3 B1 x0 y% B% \5 i0 z0 y% i: Y) O( M3 b
( L6 h, q% @; h; v5 G: t" F7 E
REFF:! o3 z1 h: m5 b* C/ R! X6 t! ^
1.
' |5 k) ~  R( M6 e/ mACPI Spec 3.0# M* S# l* m! Q7 C# ~' i
2.1 S. d. I  n: p) t( B9 C
Intel Processor vendor-Specific ACPI4 Z, {4 |' ~. I/ c

; k! \3 J! D1 {
, _8 [5 n+ ]! J' P0 p) }  ^4 aThat’s all!
$ J# G, \5 K/ l, h6 z: y" E( x4 ?& e. t  v  t
Peter& b* b2 R. _  a1 X1 _3 u

0 c2 L4 P/ l+ M3 e2010/9/20
& o, C1 `( f9 v  K! `' w) J
* O4 T2 ~- \6 s* o5 r0 V& n; {0 {7 h[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
* i* L. R! S# C. B- d$ J
# \& J0 B7 ~/ N2 ?CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
/ |: L. }. ~1 D8 f& d, G" [, ~Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。1 y' _0 e1 V) e9 p, C8 e
% j2 p& _1 s% P6 ?
2. P-state Control8 |& u8 C% c: |$ m7 c1 @
0 j0 ?# r. |4 ?: D4 ]+ A( g
1)+ O& E5 N! A4 H. x& W5 t
Detect & Enable P-state3 O: I! D0 j5 L8 ?

  M3 D. ^7 M% t) k* q) a; |! @BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
2 j  C1 W1 _9 ]0 }
) |" f; V. G# {2)# C, Y6 T: K1 w$ R. P( J
Supported P-states
- B- u3 `7 d& V7 V- G+ s& J
, K& D& }7 L/ R) Z, }0 U, y6 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
* z1 u, d, V+ F. R# }' B : d7 `2 k3 a/ K6 T( R2 i9 ~- Y/ h
MinRatio = PLATFORM_INFO
* j4 u8 k$ o6 }MaxRatio = PLATFORM_INFO9 t# m8 d4 s, R2 C4 j, k% e
RatioStepSize = 0x01
. O) r$ N1 Z; y* D: ]' T. KNumStates = (MaxRatio – MinRatio) / RatioStepSize + 18 R$ i' I5 T6 Q1 w8 O' V# s6 w  Y
( ?- w, D/ g$ t, Y: y5 R, Z+ c9 }
If(NumStates > 0x10)- l' s( J3 w/ w) i
{
6 a$ ]" \+ q5 H+ B2 nRatioStepSize += 1
- r; u, ]( f. k7 ]0 V1 ~, FNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1" B- q( R* S4 A& E
}4 g1 p4 y/ A% n# C8 j/ b3 ]9 Y

% ~2 b! m/ h1 C& n3)
5 ^* \8 z! Q5 w( KTurbo Mode
: g3 `1 C: P" Y1 v2 T, h8 J# t ! u3 o8 r9 t8 }, E0 O3 s
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
% @* D% }6 S- B$ L ( X/ a! ^$ N3 ?/ k7 Z2 M
4)
, z5 e+ y, ?( a4 [! `7 J& H6 @Over Clock, x+ r1 D- K3 Z5 N. x, k; m

! j/ C, O1 F! y  Q0 l某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。) F. Y0 x- x) ~* Z& B- f

/ L$ C3 ^6 W5 J* ?3 P5)' F' }1 m' U  u" j+ \
ACPI Structure For P-state
$ ^: s! x% p: t ) s' c# q- X- d8 O/ [
l
* n2 g3 f5 z1 m7 q
_OSC & _PDC
+ y+ K1 X* a( j$ y 2 p' d2 X! H% E; y& k* W
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
% M& E$ \6 X0 I+ L) K 9 z6 q0 Y7 \6 q$ P/ f3 Z
l
5 `7 ~3 _1 [$ `
_PSS( V& I  K) f# ?) |( ^
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量+ b( d8 z: j6 i- _
并且通过一个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做比较
/ y. z. {' l8 I3 x+ P' I以确定P-state切换是否已经完成。7 r4 R9 F4 d# ~" l
$ G& y, C- Q; F, A5 U
Name (_PSS, Package() 9 x' W  Z9 ^% l1 z1 r- O
{
: L: e' Q, q  w, M// Field Name5 z& G. [% b; r) d! N
Field Type * O9 w* y3 n3 m% {
( t+ _$ H! }9 {$ Z; H* I' S
) g8 V8 ^( }3 C" Y3 d7 m) A+ h

, E, `* j5 V# O  a" lPackage ()$ h: p& P# c1 e' }  Q4 z) C/ Y9 E5 z
// Performance State 0 Definition – P0
7 ]1 {2 n' [: _
* X. \% |9 x* J0 s+ q{
# O% c! H% ?9 l$ \5 i& m/ c
1 ?7 e% ~- B" _( q
; A/ S" O" P& r- V: ]: fCoreFreq,1 ^/ N4 r- W7 h" o1 B4 [
// DWordConst 6 k7 @/ d( c% g6 Q& f' C: J1 T

. B( N2 j2 i/ `$ A8 N6 y9 y
9 h% o% W( m9 A2 ^Power,7 t+ j& I8 c, T
// DWordConst
7 ]; f* i* F5 ~2 H: Z6 t8 X' L2 b3 m) L" u8 H' d9 H+ q- t6 h& z
TransitionLatency,
8 T. D. j& n) k! x. ?// DWordConst   T  `1 t# _1 [9 G" p; x0 ?5 _9 W

2 T% S8 l& k: Z1 q- LBusMasterLatency,) m4 @$ V' n' }  v9 x+ |& z* L% U, W
// DWordConst 8 ^! u3 l4 r" k0 }  N; ?! o8 I
+ W4 m9 V% b9 P& K! j7 \6 A" \
Control,) U6 C& r% j/ _* K
// DWordConst
4 y  P1 Q8 o! v$ n; o1 y& m/ h* b  L% f" f; u  k* O/ n0 L+ q
Status
& G2 `8 E6 a$ h0 ~! s- q/ m6 `8 h: S1 w3 P9 i% r' c8 k1 }
// DWordConst / e. n+ f/ S. H' k' J
/ ]: Z# p; Z# v
},
, z& m  i1 r8 q5 P- {5 l- G8 Q: g7 l( D$ }2 i; S' e" Y
. 7 r. s# s/ P  O, T6 @

' Y9 F  x9 U, I! m7 S+ r.
# l5 H2 }* A/ a! k$ K
2 t0 o4 r* L; s. % e, X; e3 o8 h! j- U
}) // End of _PSS object
1 N# j2 }; Y- ~, a5 @4 T3 J前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 " I) a& i6 c- ]$ [8 h1 w. ]
% ~- d) t* Q& @, M( M8 Y, ?
Name (_PSS, Package() ! W, G) A9 e6 F9 W/ f! p: R$ i

  i! I, ~0 S1 m9 O, v{
& K% a9 e1 z6 \+ D
& K8 L. C1 `5 S$ sPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
: K2 z3 i, r* D% t% _  r/ W% ]! p  L$ S5 o
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) - h* J2 P5 v) D+ ]7 F9 N. Q

$ \$ z0 u6 a8 `' I0 yPackage(){1400, 8200,9 ^$ G; [9 H: B. c
10, 10, 0x000E, 0x000E}6 B: O# T2 Q* y! Y2 F2 H
// Performance State two (P2)
* {1 W. O! @2 O/ f" R6 L- tPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
. \% G" M5 c, ?3 C+ t; W+ oPerformance State one (P3) 1 b% p# d/ E# ]0 M
' X/ r+ D8 q7 M7 Y' ?) v: K
Package(){1200, 8200,* D' \* o8 e- j
10, 10, 0x000C, 0x000C}
2 n1 ]( ~3 e8 W& q  n5 Z4 z// Performance State two (P4)' g1 n. N4 s+ i, U7 k2 {

1 [$ A5 O, @: C! a, f, P2 r4 Z0 v* y/ A}) // End of _PSS object
5 j, m7 C& y  b ' A5 H. m8 i( U* `
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
+ T9 K4 }2 q& a' d
* O, C) O+ W+ h. \" {6 dl" z' G. \  s2 O" e$ I* D8 z% ^0 N
_PCT: ?7 w9 l  z, e5 \0 b
" I' h! o) p+ V. \
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的方式来进行。5 r/ P) J- V* N7 l6 r
' ^" p' c. ?3 {" m
Name(_PCT, Package (). h: E& @1 p4 W9 @0 K
// Performance Control object
1 j& m9 |/ `' |% w3 z" G
0 S# U( |$ m  F- {{
8 d: {" z7 U" [5 _, y8 z5 C& R( `8 @. |3 e! n1 f% D. ]1 r
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
) r  y1 J' C% c+ @. }' x// PERF_CTRL 7 F( h; `% @* q" h3 _3 R

6 T- ~& `. j+ g+ eResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
: T- Q( g5 A8 T+ E// PERF_STATUS . p  X) e7 d3 f+ Y
* ^' F( g+ i* l
}) // End of _PCT object& ^  p* ^& V8 b, S6 `

% f  o1 d3 M' H8 {/ m: n; `* pl
* g9 P8 H% q9 i) R
_PPC, }0 m& Y- M8 z- i2 j% C

0 C9 I  {5 r( u7 V  M* mPerformance 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% ^: ?+ V" }+ p, U7 K( E. p5 g

9 m& h4 c" C. v* T! V( I" d* {Method (_PPC, 0)# X1 x/ c, j3 u- \. y
// Performance Present Capabilities method & K' p# d- S) H) V. i
3 C- C9 p; U2 n$ {$ G8 B
{
+ O2 m! c4 B4 t  w8 H1 d% Q2 c5 k/ X& w# N( w" ?- t1 a8 C* s
If (\_SB.DOCK) : a( Z* A/ o- Z4 B/ Y
& p. C8 L' S& k1 @* ^
{
/ }' ~; v: a2 o7 |
8 P4 F0 w8 }* e3 b- ]: tReturn(0) // All _PSS states available
  y$ T9 Z& ?$ o2 \' g
+ Z7 L/ @1 o0 a* x6 x0 j3 Z
! W) P4 S! E/ \- u/ |}
/ A" n4 a5 Y' P
5 \8 ^$ ]; U' ^& k3 c+ ^- gIf (\_SB.AC)
! z) k! B% O' ~, `5 e" W
! k9 a, v8 n1 K7 m5 p6 q% W. {{
6 a3 |3 w& p1 l" n8 N
" O/ l. @4 [+ N$ `2 X' s' n8 p/ y' nReturn(1)
. @% k0 z$ ?* n// States 1 and 2 available $ q# g; k2 u% m6 V* m
+ V/ q  D% \/ `
}
1 n& C9 V/ Z& \8 o5 c$ m* z; y
! {" y8 t3 }) \: v0 z: uElse
  ]9 H; z  }  r4 I  {. b+ G  A4 \  b2 @* Z
{
. f. i1 }+ U! _: X! L$ v% Z4 W: ~5 B0 ?: E, C
Return(2). S& h+ {, i2 r7 L7 H1 ~- M
// State 2 available2 j, b7 q& t; j; V6 n6 m( A+ p

" L, \9 T! s9 I& {} , g# h7 p% P& r; u; K1 l+ S: y+ O; ]

: ]+ ^# q; A7 Y5 j  N* M# n} // End of _PPC method
$ P( }& }7 c" Q9 q) W$ i
* @( f; a) a' D- T% ]+ T! O3 }& pl8 w8 b& y: [' M& H
_PSD
+ t, }9 s" T: o+ C/ ]' r/ X
4 V% Y2 V0 s( a2 p9 B2 O4 R& A: ]: t. qP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。9 _% C$ u& O- \/ P
- t5 @( q+ o- h/ K1 j& n
REFF:
& N# y* J. L7 M6 @/ s1.
8 `  n4 P4 A4 K( qACPI Spec 3.0
6 u0 J1 V. B) i- b3 y- l2.
. O# P1 h' T4 pIntel Processor vendor-Specific ACPI* J8 ~2 D. O4 e9 c+ c5 }
+ ^: Y! P* B) _* F( M. \

0 Q3 i7 B! i+ M& a+ HThat’s all!
1 N8 N( ^( O8 U# M- K( @1 H ' W: p9 |7 e1 n" |
Peter
4 n% H) T& V7 g$ e, [1 Q$ l ( I5 ~  z/ q+ x" r; C0 u4 p; L
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview: e) d: R+ u# x: A, z! E  e

" b6 s& k9 Y' B$ V6 c+ n' cCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
$ s( e* U! k/ Y' K,影响系统的功耗和温度。- q' V4 j  y5 d. k# |1 B

6 g4 t0 C/ G' y$ |& ]/ [( W2 c2. T-state Control
7 A8 E/ e- E8 a1 d/ G9 P& j 5 R  \( b, d3 ^8 |  Y
1)
- [3 v( \: R2 u! rMSR Based Control( Q3 V$ N2 c# A; q

4 L6 J1 d! L2 s/ XBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
3 o2 j2 }/ {6 Y  B. c8 t) m% a
* _! ?6 K. ~9 F, [& q$ @2)4 x8 z6 q+ E. F6 g
I/O Based Control
, I- m3 o4 d5 L/ F. @2 |
2 F& L( Q* Y' ]9 o8 |3 n除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。1 L4 d& e7 _; h* R4 u

4 b! s8 ]6 c# Q% w2 _/ \1 x3)( W' H# _" E. o; y- M6 A& o8 F
ACPI Structure For P-state6 k. _& D! O- f7 l% \
l
8 H* c# J5 ^  s& I; J) t% `
_PTC
# M) N0 u3 P5 t7 H 3 x7 c9 `; T8 ^9 ^9 o7 L) r
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
+ Q& @: a6 N9 A 1 l: c9 t+ h( q% h! z8 o# x
Name (_PTC, Package()
/ h7 S9 E% h: I" |& a4 ?- b  V{
% k$ [2 F. Y: C1 h
3 x/ a0 m; ^$ k# S1 j+ v& \ResourceTemplate(){Throttling_Control_Register},
( K3 @/ L; R) x$ d* l0 o& h: a5 [//Generic Register Descriptor ; |, r' A$ [; u7 }
  P# G2 o2 o' v" i5 H* _7 o) J8 T2 |
ResourceTemplate(){Throttling_Status_Register}- k5 [7 M7 ?$ e/ @! C2 I
//Generic Register Descriptor
. b  j9 y, U* y0 J1 c, x}) // End of _PTC
/ u2 x: g- @: W
; U- u8 T% S" P0 A0 S* K' c# P下述是一个sample code( p7 L0 @7 m' y, A) N; t$ [
" l+ V2 e& A: q

6 _/ l; R( I6 i  m+ Z
//
% f4 e4 W9 d  O
8 M5 C1 c, y; I7 h# N! r// T-State Control/Status interface
- C/ S8 i2 W; t+ }& y* w% [
. Z( A' B# z# J# c8 m//# H) u. W$ |/ ~! T8 Q+ N# h2 E  c
+ ?! S; V* y1 G2 V# }! K
Method(_PTC, 0)
1 z/ t3 ^8 W% L7 d2 ?& N- o
: N; _9 Y' ]1 \8 H% A3 Q{
- |2 k7 ]5 E: K  V+ f; ~
6 v! ^; A( {. d7 w//
6 @9 K; J: p' N; m" D' v" U7 B- j( T" M- A
// IF OSPM is capable of direct access to MSR8 H% B* Q8 v! P- ^2 ^
) L, C  E$ g2 V& w( X7 S; x
//5 l+ q1 J3 R' y/ |+ h  u
Report MSR interface' m5 r/ v# o/ Z
3 n. a* b$ V+ Y' }% e2 H( n
// ELSE
+ n% ^' s/ o# g5 x2 E5 w; ^
5 W' W3 {$ Q% w3 l//5 n7 H* M# a4 n# A- k% m. V5 N
Report I/O interface
5 G$ l1 x7 [0 t) C( `) ~7 L( M- \8 j; Z0 q. N% Z4 R
//" u8 f6 [+ b/ C

  ]7 J( y3 g8 d6 d//0 A$ _  m- L2 d! d' c; L: L
PDCx[2] = OSPM is capable of direct access to On, L% R/ h! h; W! m! ~
4 }+ P2 o# S0 S! {
/// r$ M1 z* k8 O( l0 T
Demand throttling MSR
" H  B8 [" S) O6 K+ d  Z  l( o" Y' e  z# M1 f9 `+ d+ o. {! ~! w. y
//5 ?/ {5 |# E1 d. a! D' P2 U2 K9 j

/ Q5 m5 x9 b& b' F/ l- k+ k, IIf(And(PDC0, 0x0004)) {
; W) m( Q) B! T/ i% `5 H
8 W/ I- [2 ?. N3 b0 l9 V8 hReturn(Package() {
+ K" K1 v: Y) y4 }, j& T- z: V& X
7 F5 ~8 ?  A$ GResourceTemplate(){Register(FFixedHW, 0, 0, 0)},( K+ |, A' `8 S. `) _
2 v/ g& m# q' T1 e4 c, H
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}( _' s8 K- J7 z  @# Q
7 o/ i6 V+ Y" `* i* O, P" L
})
2 b. G& ~$ a; l( C% e5 i8 ~, G' Q$ W% ]2 S0 t# k0 q* S4 {
}( C" B) b7 G) t+ v+ p/ m+ G
3 `: C( w5 `5 _
Return(Package() {
' j, n( g7 h8 \# Z* E" E5 t. Q
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},% P) e0 t" ~, y6 B5 B
; s; O* c) i2 S
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
# y) l. O0 |* Q" I3 [
8 e+ ^+ |/ X! [9 s' ?})" @! ~+ E+ \; |9 W- \
1 I2 u0 m& G* S0 \. p) r6 {+ I
}
  y+ ^! L3 f% ~" Y% B( H  K5 m2 R; T2 a
/ G" }; l6 J4 F9 ^5 H& m! ~

8 r# S* f. T1 @) ?$ wl* G: ?' ]& z' x/ ~$ i0 B
_TSS. }0 e/ w: F8 n, G7 R# J# C

8 ?3 E% H% c4 t/ j2 KThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:& f+ n7 W1 t$ ]8 `, x
Name (_TSS, Package()
" F2 G" h/ s4 f1 Q8 z{/ U& \: ?: Y9 |* X" A. u: t
// Field Name
, ~5 P# H* `9 rField Type
! `+ p2 `( W) [! p  M( M; Y2 g# D
9 A5 {7 _1 w* r0 S7 s) z
9 ]* S- u/ _, q8 j+ d2 L+ B" l
4 T, V: G/ S# a9 [' QPackage ()4 _1 |! o; Q" e/ u& z& h/ o
// Throttle State 0 Definition – T0 & W  E# }1 ^& k$ F+ e$ L

% j! B. I- L9 [) }" }{
( i4 W. R) F/ t" w
% t( E9 a9 z- _2 c  j) o0 g
3 S) L; t4 V6 d( V+ X. _1 NFreqPercentageOfMaximum,
# M- W& J5 V' v, O0 z, a! [4 R5 H; |// DWordConst
6 O& q) [  H* H' {& [3 {+ f: s$ W$ e; k& B& F) v+ x+ G
Power,0 l# q3 c2 T  s9 h2 ?' f
// DWordConst ' E5 Z) D/ K0 `

! T/ y6 N" Y8 w8 b1 ?) MTransitionLatency,  B; R( p2 z$ P  E9 h8 G" m
// DWordConst
) {+ B0 W7 i/ n9 I" m% t: q  r0 T8 \# I/ s$ f
Control,2 a% P4 s/ n, p" T- b. Q7 [9 ~8 C( n
// DWordConst 0 F6 O% j% v0 h  z$ C' m: i
& `1 q+ \, d+ }2 F
Status
; h$ ?& a! ~4 L+ g5 j* X4 T// DWordConst
+ k1 j* z+ D* d& {},
' R9 F4 @3 k$ V8 M* D……
, W0 c) o% Y( L0 Q: I}
$ f# M5 d( I$ v5 m+ t% [2 x3 T5 y4 V7 S/ O/ z2 ~
Example code 如下所示:
+ T" R, y; m, ~$ H7 X& i! Z' Z8 G# M3 a" e: S' @- p9 _
Method(_TSS, 0)( b2 K- o( i7 ^* Z- \( U
. H( r7 X- l, I- ]" B
{! k+ {( X7 Q" o$ N

! Z% I* t: W3 D1 {Package(){100, 1000, 0, 0x00, 0},# h) y9 Z4 A/ [0 J2 v

/ Y( H2 s0 c: u- H1 U, Q! iPackage(){ 88,) L/ }: ^1 `6 E8 t# G& [
875, 0, 0x1E, 0},
& m! q) F" `& A8 @7 U' \- `# Z# P% k, {7 [
Package(){ 75,
1 l5 t: V2 S# H% F) O8 J750, 0, 0x1C, 0},( h+ H+ V, r0 g- d( a- e' R% P
3 }1 S4 o% `( ^( m9 S
Package(){ 63,
6 J. R/ j2 e9 t8 w625, 0, 0x1A, 0}," s+ K8 Y" y" q: W) J
* i2 p  m* y: O* B) P
Package(){ 50,
3 {$ n" o: u2 _: r500, 0, 0x18, 0},+ C$ j$ \0 N+ c4 ^* O, ^. {
) p9 |, d$ S3 N1 L" g  [) H2 @
Package(){ 38,3 l* U7 m8 [- {0 i# o- L: ~
375, 0, 0x16, 0},
4 B) x5 J  g7 G* ~' Z. r6 w  S4 @* P; \+ F! u3 s5 Z/ m4 B
Package(){ 25,$ X8 ~/ j3 A! g. k  L3 S8 W4 B
250, 0, 0x14, 0},
; r* i; U- ~* O# D1 ?7 s5 q% U3 _% h7 _9 O0 b; L
Package(){ 13,
0 q  Y1 ~" W! I# n5 t; c) Z125, 0, 0x12, 0}3 o% y6 @) P2 E5 R
; d; p1 v8 {- L' {; B) i$ g
}
; H& z5 H: D) S9 @7 K4 n/ Z$ R( X- X8 o2 r3 @2 z- M
9 ~9 [7 w5 @3 |" K8 l+ A  i: }
l
% S1 l0 a% A6 s4 X+ p
_TPC
* g! g& Q' @, h8 Y" }* Z7 u1 q# ]
" w, t0 Y* w' P- @$ U7 M3 sThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
& x2 ~3 y9 O/ O6 n ( \3 ]7 w1 Z, t' c: N6 t
l
7 r6 S0 o/ \1 u2 A# i2 \6 `. z
_TSD
5 u: ?0 a* n) k
3 H# b  ~, z- NT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
# X1 h* n2 j# B2 s- C( X % T/ |) {% m/ C& z0 H7 Z5 E
Name (_TSD, Package()
3 ]; {2 D. y! d/ |
9 N! [& g0 l2 F! k6 Z{
  w/ \4 ~. I7 d# Y% Y$ y7 R6 C$ e5 v* a
Package(){5, 0, 0, 0xFD, 2}2 f- s- c% G! u; ?7 Y/ y
// 5 entries, Revision 0, Domain 0, OSPM ) H( r, p) Z" a! [& V
Coordinate, 2 Procs
1 p' C4 E* V; Z9 B& ^" c$ \+ A
6 \7 G' i! v0 \0 Q- @* i0 i# ~# n. K! |) `- `
}) // End of _TSD object  _: `% a1 }$ L7 v
* q! j) u) i+ V. }) s& E
REFF:
; t, H. C/ k% R1 b7 t6 Q1.* d. y- p! p7 [! `& }
ACPI Spec 3.0
, r# g3 S, R( B/ J: l2.  \& h+ k7 `1 l' `5 O. r: A
Intel Processor vendor-Specific ACPI
. ]# q3 I# p; \+ ?4 G$ _+ S2 K
4 j) t7 E4 {2 n, C2 U+ J " d* v  C- {% F. y; y) E; x2 A6 J
That’s all!7 g: e! Q5 a' \7 U

( O* P: e* c+ v; n: y4 h0 JPeter
9 O- E9 ^7 ]# V) @
4 T- F2 a( F7 o2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:19 , Processed in 0.170444 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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