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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
. g1 X3 y+ L& r8 S0 U) f) D
1. Overview1 |9 \3 p; Y3 `4 O1 {

& X' S; ?6 C* N4 `$ C' D5 s7 u1 v6 c, z
C-state是ACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换: I6 r. n' y, [" l, n2 _7 I
降低功耗,图1是C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory request,OS就不会进入C3以及之后的state。从信号上来看2 }$ I; P# p  v9 P* M& ~
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。( x: y& X- m6 @" E
& `9 ^8 Q- w3 a( j2 ?! q4 Q- U
cstate1.jpg
6 Q% E4 c6 m3 M! v+ `
图 1

0 o: F( A' W9 w" t2. C-state Control
9 B2 _: T* s7 P% e. F
6 L8 Y/ d2 _/ g* ~- Y3 k1)4 \: \$ V' E# t. Y1 \0 m4 S" L; r- i
Detect & Enable C-state; T' v' _0 _( v( y

8 f4 X. v) O  t( [+ {BIOS可以通过CPUID function 5 check CPU是否支持C-state,以及支持哪些C-state(C1 C1E C3 C6 C7),支持的最大的C-state也可以通过MSR去设定,默认情况下增强型C-state以及IO MWAIT Redirection是不支持的,BIOS要根据系统的需求决定是否开启支持该功能的register,对于多核的系统就需要对每颗核都要单独去配置它的C-state的支持。: q1 B# e1 H3 n* H8 z7 f/ `. j

$ V( e/ t5 _  p8 G8 v/ B& Q2)
7 f0 r1 c6 n. I+ n, UC-state Basic Configuration
  G$ t" G8 y/ X! E通常情况下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-state。b.当MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的support的code)。7 V) o- u) @; l" x3 S% G

; h. g9 o" ^8 p' i3)
/ k8 U  |& F- `0 |. r$ o6 UACPI Structure For C-state
3 Q  |' f% S# [2 c0 V% O2 u4 ~1 U# t) M/ V% c2 Q! h
l. p9 M7 Z7 D1 i8 F8 C9 T3 {
_OSC & _PDC
* h# v# o, {8 @1 z_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures。- y# g; s$ Z% b: G" Z: Z4 D
l: `: ^. C7 i$ F" h
_CST
# q& y" F- w7 I( N_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
3 p  ^6 E1 ?/ P- WCSTPackage : Package ( Count ,
# ~! F8 E* P' J* J/ F" f9 jCState ,…,
* G6 J/ B, h7 o  gCState )4 }/ N, X0 H; ]( e- G4 D4 ?
其中Count表示所支持的C-state的个数
% b! {& F5 J0 t% o3 X# Z8 @  nCState: Package ( Register ,. E; I5 p& B6 v0 Y
Type ,
7 G- Z/ m4 O' z( y, q* hLatency ,2 Z! j1 ?& X% y  f+ q6 T
Power )
- d' W. X/ a; V0 s0 U
/ F$ S/ e# X* y6 r3 A7 KRegister表示OSPM调整C-state的方式,Type表示C State的类型(1=C1, 2=C2, 3=C3)。Latency表示进入该C-state的最大的延迟, Power表示在该C-state时的功耗(单位是毫瓦)。下述是一个sample code,注释部分已经讲的很明白了CPU0支持4个C-state,其中C1使用FFixedHW的方式访问,其它3个C-state都是通过P_LVL方式切入,第三和第四个Cstate都被映射到ACPI C3。/ D, Q" Y  S  b+ O& `
4 T8 q' D' ?! S7 D/ [1 Y/ p
Name(_CST, Package()
+ _2 x# P0 N. Q) m" K

9 d4 s4 M. c* J7 B" W6 x3 S{
7 z0 e7 u% m, A( u: f4,6 k8 v, W; f1 h3 R& f+ F8 ?* f
// There are four C-states defined here with three semantics
0 f( x$ i/ S5 v3 i( S% y) ^3 L
- w5 C  W' }; H; Q, ]3 X
// The third and fourth C-states defined have the same C3 entry semantics
0 J1 ]! d8 N! w# G

; W) q" }# D9 S* f' y) _Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},; a# O) ?2 N& }! D+ ]0 C/ l1 }
1,
% m8 N" [1 V6 C" A) _' x8 b/ d20, 1000},4 `/ d- V& Q) s2 z

) T4 k8 N- F) o6 @; {5 P' sPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,/ T9 p( ]0 k4 x( j+ y; e+ A
40,) Y& g& U4 o# S. v8 r; Y9 t
750},
4 |! Y* @$ z& i. k9 N, H$ n
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,6 u7 w5 C$ m# f: h: ?7 \
60,0 u: }  H+ V8 ]* l
500},
+ y1 T" h3 x2 V+ u9 P9 O
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,4 z% m1 u# K5 f
250}/ Q. ?: ?  [; f/ \8 T

, o0 a5 g# W" _, n  H# @}) % O9 a4 Z0 V9 ~) T/ |
1 P& H) l  `8 K0 K" v5 v) u
l
2 B5 m' V$ h& e' F7 [7 T& n
_CSD5 h) c8 z4 w/ K9 G

- }$ O- Y: N7 N$ Y4 K7 E8 {; ZC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。/ X1 W. n. M- y2 m! s
$ ^# z2 \; Z4 q9 `, U, ?2 l

, z7 @* l6 R& N2 W$ I: y6 R, J0 j7 \8 K7 j+ W1 b
$ o) N" X+ V/ ]& w* h5 `
3. P_LVL VS FFH0 u" \- M5 J0 Q$ q& V
% L5 B/ P" i/ M9 Y0 n, q
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 的power state(C2)。5 G* q7 N5 C8 k
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所示:
6 F7 h6 x( n7 }- N0 `5 `% _' b% j: T+ _; h$ ^* |# P0 S& c5 g; \7 j
gas2.jpg

; ?8 L" c; V4 R) ^  e, m5 E
图 2

" H3 Z, u7 ^' u, g# pOSPM解析到该_CST structure的ID是0x7F,在切换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的一个例子:7 M+ c) [4 M$ C# m. t
Name(_CST, Package()- V( a3 t" X# u$ i, `' |1 P
; J# f  m3 z3 i/ i5 b' r
{
$ t) w. o% [, p2,% v$ h2 K. z4 N
// There are four C-states defined here with three semantics
: N6 D$ ~6 R2 Y5 c- q

- [% q' R- @) q8 |! a// The third and fourth C-states defined have the same C3 entry semantics
0 ^7 s* U/ P8 [0 Q

$ s, D, ]2 z. K1 K* GPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},+ l: \  [- `- Z' r- e: v; g
0x01,; U- Y' N2 n2 j6 y# a. ?
0x03, 0x000003e8},
# `6 ^* ^. ^  _1 U8 P! J1 J. U

/ I& V# E) n- wPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
; O0 p/ k7 o- B& f3 i0x01,
* }" w" {  H$ A6 A3 U  X7 N0xf5, 0x0000015e}

5 J5 n/ x3 r9 q2 o# B}) " e, j4 t7 Z) C8 U# l$ k
' I0 J$ a9 ^. F+ a1 q

- V4 p# e: z' {6 y9 @' Y( {REFF:( p" g; y- g. U' w7 G8 A
1.9 E. T* h* X8 N; q
ACPI Spec 3.0
+ V) v. W( [) ^2.
# X* [/ \7 d. Q7 F! BIntel Processor vendor-Specific ACPI
* f( M/ x1 X) [! d( {7 g/ x
  |: `* ^5 `7 y2 w2 E! ^" c; s) j, v: E' ~! s: z- G6 V- ]% U; k; [
That’s all!5 R6 T  f! p8 B. S1 s2 t2 x

, k- T( h( n1 I; V5 b+ _Peter  y- l' h" ?* }# L& k, o, X

; e1 T3 M: v# z0 V2 d% v! l2010/9/20
  F! R0 I! o8 j, c, d- Z1 ]# i% a" @
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview/ l0 f- H7 Q) c& F' g, ]) q
( a" v3 z, ?8 I" C1 d4 I. m
CPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST5 S4 w. A$ Y. |4 \% C; e( \
(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
: Y1 W7 W% u) Y: J + J2 ?& {( n; ]3 _8 a9 x& u
2. P-state Control
+ _; X+ q; w, V9 P& Q 5 H8 n! ?7 [- j" [
1)
& E1 A" N) J9 }; E( K% G- Y: PDetect & Enable P-state" Y% ^* z7 I  |8 t5 T9 k0 L
! ~9 @" X0 E; m: A( w
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。
. L8 N7 R& |8 m3 X 9 ~4 @% m" G" R) B9 h
2)
1 z# \% j; d6 x! E& w# |2 rSupported P-states! E6 U2 q8 g% k; [

; q- H) E- e, A" ?7 G5 H0 j" a: ~& |- ?* ]当BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) 、MaxRatio、RatioStepSize、NumStates,所有这些信息都可以通过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 t6 A2 @* b( u( R$ q + a; l( z- m& P8 V
MinRatio = PLATFORM_INFO7 N# l7 o* e1 R
MaxRatio = PLATFORM_INFO3 ^: i" }: M) B
RatioStepSize = 0x01  k# z& X% L! [' o- y0 J* H
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 14 X) c9 Q0 G: ~
+ }. V1 Z) ]. ^- e
If(NumStates > 0x10)9 u: E2 S* O3 @( t* q4 u1 g
{
0 |: I# V) H+ R4 d1 ARatioStepSize += 1& p9 n9 l) D/ H( G6 u
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 13 N( {2 E$ C/ S: P$ I$ B" r7 E/ d6 z
}8 r. j6 Q. M% k( c) z# g
5 b, Q- k% a) D# p, Y5 y- `
3)- q4 E1 U% z6 W7 G/ @
Turbo Mode, \5 D1 ^  x- R3 N
" W+ k8 I: N) |/ h4 P' i# b) j+ [0 F
Turbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermal、current、power的信息从而根据这些信息动态的增大CPU以及IGPU的frequency。CPU可以工作在[Max Non-Turbo,Max Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 report给OSPM,另外Turbo Mode的Ratio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermal、current、power的门限值,BIOS可以通过设置这些参数影响Turbo Mode的Performance。
2 {2 ]/ B" _$ J- C! H) H
3 Y! Y* j! v3 t3 y# s4)
3 e% w. |+ ?, W" |0 `" [2 NOver Clock
& s# \. R# _. i/ i
: j8 W& ]: R! d某些Stepping的CPU具有Over Clock的功能,BIOS Detect并Enable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OC的CPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。! ]' z! n! o6 Z4 f. a
( X) `* a$ ^, t$ w
5)5 O/ n) s8 e! x9 j
ACPI Structure For P-state- R( l' o, ^* M7 g; X5 X

! q/ [3 o3 |3 l% F) F& d& Ll4 G( `. u: b  T& P
_OSC & _PDC8 D) J9 X0 O  A

7 x% _3 K5 z! M_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。
( A0 N, |; `* w! T2 U$ Y: g 4 E% F8 w4 J5 n* w
l
& {0 r5 ~1 r# {! i1 c2 `; l1 v8 o+ w
_PSS
" M% Q; d3 @: D; SPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量" J. m9 [+ H6 D/ n5 v6 z' g, C
并且通过一个packaged list的形式回报出该P-State的internal CPU core frequency、typical power dissipation、control register values、status register values。第0个package表示该平台所支持的最高的P-state,第n个package表示最低的P-state。Packaged lists的格式如下所示,其中需要说明的是关于Control和Status这两个参数,其中Control表示要写到 MSR IA32_PERF_CTRL中的值,Status用于当OSPM通过WRMSR 写完IA32_PERF_CTR之后再读取IA32_PERF_STATUS中的值并和Status做比较# ?# p) h( {4 C. \
以确定P-state切换是否已经完成。
# G5 ?/ R" H  ^$ {/ w$ v & i/ A8 f6 h' r( f" C3 q7 X& l
Name (_PSS, Package() % @4 `' s- Z2 B% D+ W' Q* i9 m
{0 j5 `! h  n' A1 q
// Field Name
. s6 q* V$ X% M; e7 T) j* f8 ?Field Type ' J* P7 C$ ^& {% y" C  S9 B
1 f& E2 }9 o& \, H* [
. C" p6 b. I; R9 ]4 J# b0 S% [( w
, r8 q8 a' Y- D0 n
Package ()
- _. A% `8 U% m// Performance State 0 Definition – P0
* a2 x! S& k& v: a: r% g* a+ j. Q, l: e6 _8 Z" T
{
8 d/ S$ J5 K) V8 Y/ K% A
4 [( w0 X# C( r( F0 f- p, _8 o8 ~
CoreFreq,
4 }* Z* j9 f( h// DWordConst + w2 B  [# f' L* Q0 S7 F* r
/ h  k- w, o, Y% O# K! T0 L$ `

7 d* h# M8 H8 j; HPower,
7 q; B# b; K- f& z" o- U// DWordConst 4 {, L( p& b4 }, H
6 ?5 a7 C  s6 e* b3 V3 Z' D' U
TransitionLatency,+ _* }1 y" ^2 Z- z, ^
// DWordConst 2 A9 N$ X& N4 n- j+ n1 q  V
2 {8 z& P% r: a) j" h) E
BusMasterLatency,& J/ Q. H& R+ ?# W# y9 @9 K; {
// DWordConst
8 u/ A: P& Z) ]2 A& ~0 t! ~  \# b3 E/ Y$ G7 P! d" p& G
Control,
: X! z" F7 K+ _; v( _2 d0 E// DWordConst " y# g+ ^) {/ j) P: I
7 y" m! y3 `0 q. E1 _3 i
Status
6 i: d. u9 M# O; F8 c* C. q
8 h( G# ~( ~2 Z1 O( {// DWordConst
) k1 m& l5 W2 @& s; u1 w0 i
; |1 j# h9 u" }1 ?}, 8 ~" L) H: q' z" o4 E2 U, F
. @* e  _# _6 p. f
.
1 Y6 C% ?3 v# Q# B( ]; L- l+ ?8 P
& T7 C0 g3 P3 \/ A' W. & _  r" a+ m$ q* H! R" F
  s; {+ @$ x7 z7 u& F% ]. P$ {5 ?, v
.
5 s* m4 Q$ h% ^$ J}) // End of _PSS object
  F. F1 ?  R8 W6 F6 W前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。 # |$ C' S1 z$ N" u
& _8 a; ~. F/ M& l
Name (_PSS, Package()
4 A5 h8 ]( z  o  L
- m" z" O. T9 t; I+ Q{ . O" a+ b  Q! h8 C

9 b5 t% e. ^2 }5 V4 s% f4 m7 oPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ( Z; h9 v* y, `% S0 _5 x. [% S" j
; l+ a) d  J7 z% R" f: j" K6 _+ g
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
8 X8 F! G, q, V0 F, f
/ V/ I* g; l6 j3 I* D- rPackage(){1400, 8200,6 i, F& I) I' m. W
10, 10, 0x000E, 0x000E}/ E! {3 g: d# a8 L4 A3 ]
// Performance State two (P2)
" @$ V  Z$ E' Z4 V% ^% BPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
, I( V" C( c; r0 f: l- TPerformance State one (P3)
; a; e9 i' {" Q/ l" M' H4 I$ `# I
3 a! Y" h0 f, ^! ]2 p* \/ M+ o- bPackage(){1200, 8200,+ B  j9 I. Z8 v% h5 F
10, 10, 0x000C, 0x000C}
  \; q1 d  ?# p; s// Performance State two (P4)
! D( d( f. j$ D  G: R0 A
3 Q" u0 [5 v% m9 ^- p: f}) // End of _PSS object
# y) L% I& d5 A
- B4 e3 Q! Z6 I& u( |另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。
2 M: x% W" C2 M0 w* ~$ h % r0 ^1 |% x- T* R8 M6 O8 ~
l* p' u. a: m4 Q! V" V. f! x* E( V
_PCT% }. U+ o' e* s4 [4 ^
# a( G0 a  b' J8 H
Performance Control用于将P-state MSR interface Report给OSPM,OSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample code,OSPM透过_PCT得知是native mode,当系统切换P-state时,它应该就会通过MSR IA32_PERF_CTRL和IA32_PERF_STATUS的方式来进行。! |4 _% ]: o: L) e- L$ }! m
4 \/ {. u. L) U0 a, N) T
Name(_PCT, Package ()
) F) U* v# v" K9 m( U, Y// Performance Control object ) @8 }# G7 z( q
; j$ \3 `. Q0 Y8 w6 J1 q
{
9 n* p1 Q% `" i/ b4 J0 w, S1 B# G! Q5 z" l4 s1 H7 w
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
2 T$ r) X$ h+ W6 L( u8 c+ P// PERF_CTRL 6 p8 F( L- O0 X/ N
/ f# {) k( s, p1 s4 ]! O8 |8 n7 {: o
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}- ^6 S% N9 w7 e+ Z7 g1 p
// PERF_STATUS , v3 r  }7 Q% `+ O
& H/ `' k% U4 d  l1 D
}) // End of _PCT object
5 J. _' F6 m) U% [( V( |
8 S+ H1 ~8 b( V) G0 b& cl
+ j  f; r4 N6 o8 U% a- E
_PPC
3 {4 y  `( j7 g 2 O" o* Y; x/ A- ]7 b( t
Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSS中report的所有的P-state [p0,pn]; return 1就表示支持[p1,pn]之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(\_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states。
' [  K3 T: }' t$ ~9 R+ t! ] + X" Q  R  N4 }+ _
Method (_PPC, 0)7 c) @# J$ G3 j9 @# {) d% A& D' K4 Q
// Performance Present Capabilities method 3 G5 Y& G3 K* n$ n9 D

5 {; ~- c' p  Y! w8 v{ * r  j* _! b5 y* M

: f) }# R: z) \* gIf (\_SB.DOCK)
) H0 l) }; s* i$ A* S8 c# W+ p, `
{ 5 u$ y6 s" G- h' |' Y4 U1 i

2 K6 c" n6 P. z) `+ e9 U' r% ^Return(0) // All _PSS states available
# Z: r, E" f/ E5 d1 r# E" W
1 K2 q9 N# t- [* [
9 A3 H/ U! i, k}
# y; R5 _/ n# A" L  m# P. u! T3 `0 Z
If (\_SB.AC)
/ ]0 b5 `( J6 o% d, @8 @( _. v2 o& \3 O, K; K" @; v9 u
{
" i4 s$ e2 p5 k9 b0 u2 j2 Q
, q* G" E: F, P& }9 ~2 t0 [" C: mReturn(1)
" B5 F" F. @4 v// States 1 and 2 available
9 N1 h# P# i/ I; q+ c; s* t
9 _; e  c, A1 L' m2 D} ' L0 e4 z$ t( N- x
- |! R& k) W8 Z. I, m4 z7 c) C
Else " j# J2 |/ v* M3 N2 z, \# x1 b

3 B; R4 m3 t  g* P{
( a* X! u) |8 [# D" Q7 G% j
* E6 R& Y8 [* A  @$ GReturn(2)
+ l% e5 C) \2 z% {) Z4 Z// State 2 available% v3 X) E( c( o8 e. O4 T/ H
" t. s  T7 c7 K, r' E  Y  y
}
$ X+ F; n0 v9 S8 ]- o) B- x
3 X' I; d4 D* {% A} // End of _PPC method9 Q- a* S, j% ~7 x+ |$ d5 H
2 F$ h6 @( q5 a- S2 l+ Q1 D
l
# P, v$ F" z  t# h$ _
_PSD
" U" C: p9 L7 r; P: x 4 z; O6 O6 c2 S& u% g" ~
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。, {; X, c0 |5 P* y. f/ }

% g. Z- ^- E( q" K; KREFF:8 e/ U( O2 m4 s& J; r) O
1.+ a. z$ k& E3 \' O9 Y2 a2 Q
ACPI Spec 3.0/ w' \) R7 q) w6 s. y
2.# N: f8 ^! z" ]/ Y
Intel Processor vendor-Specific ACPI& a: o+ l6 ?- Q2 c; ^& e

2 t. W# Q$ ~: X5 b # X" Z7 u+ i6 T% L
That’s all!
& J; ^/ m' u5 r: `( f
! s# l3 q3 R8 G: f- {- f3 TPeter3 r6 j; o5 z3 R& S1 d! N

4 a# x( G$ T+ `& W' Z+ N2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
  W/ {" r9 v; Q8 L8 M( W! m
! K, n& l# z  n' Y8 ]CPU在C0状态下有两种手段降低功耗的方法,其一是之前介绍过的P-state,另一个就是T-state。T-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工作时间的占空比)的方式$ o; t+ b% L! {  p9 k
,影响系统的功耗和温度。
5 s' n3 N! X. {* c; t6 B
" ^1 _4 h$ v2 g2. T-state Control6 e! D/ r5 T$ Q5 I
2 n5 O/ Z6 f% B( s5 B1 g8 D& v: ~
1)" _4 d: Y1 ^$ [+ _' L
MSR Based Control
4 s# Q3 ?- M, k: M# u $ P" R! W& c* o6 T2 K; y( k# z
BIOS可以通过IA32_CLOCK_MODULATION去Enable/Disable clock modulation,而且也可以通过该register的bit0:3 设置CPU Clock Duty Cycle。当FFH在_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATION做T-state的转换。 / k7 s, r9 \* A/ Z  }6 |
1 j; C0 h. q. i4 l. B1 t" \
2)
$ J; p) k6 l1 N. e9 v. M! x- t+ gI/O Based Control
8 S# R& G& q  b& i " O2 m9 c* Q! Y$ n. D# w1 y
除了基于MSR的Clock Modulation,新的CPU也支持IO emulation 的Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock Modulation,OSPM将会通过PROC_CNT register bit4:0做T-state的转换。
$ i: l9 B) ^: N; i- A8 D3 @" b6 ]7 v
: |! D2 L6 ^  b. C* _3)
& K; Z% ^- o7 i9 k/ ZACPI Structure For P-state* f+ }1 p' r! s, @5 v0 G
l/ t9 n9 n& p2 c( y
_PTC, N* o0 O! W% s1 |0 Z
4 u8 C- [  t" _+ B, g% S" G
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
) a' V8 p# Y, A
# r0 k& Q: l3 ]& U8 w1 P: gName (_PTC, Package() ! \$ ]# q5 |' ?6 R- p
{ , R: o$ Y4 @& W0 I* e4 T
. S# t$ m* t0 J  ?% _. j3 h
ResourceTemplate(){Throttling_Control_Register},2 C0 U+ \$ t2 x: U
//Generic Register Descriptor
$ ?# i# X2 V9 @# ~7 r  H. H) O
- c/ Q- y  {. B% d& uResourceTemplate(){Throttling_Status_Register}) T0 R+ j% i& U' k8 P; S
//Generic Register Descriptor
" k1 u' d. L/ J}) // End of _PTC+ b, |' N  W3 w2 I  R

: [9 |1 [+ @6 r: p% ^' [下述是一个sample code:
' ^5 x% R% h  G* b; [ 0 x! i  t9 K/ b8 j; ~' r3 v8 W

0 t% j+ z, M& L' f* \
//
* ?0 d9 [1 v  c9 m- \7 I: L* e! E( F) V. V
// T-State Control/Status interface
7 h2 J, W5 b# R7 w: K0 t9 a- U( g) R# x$ f8 m* X$ O! L
//5 K) l# p  W* R
! L. `, I$ J( b1 a4 X' y! O. N
Method(_PTC, 0)
5 O2 {4 n1 T- L, P0 [0 k% b8 f; g+ v+ `8 F
{0 W1 j/ G% k5 ]$ J/ C$ {, q3 w
9 O; k! g- M2 ^+ e( I
//
, v, d$ v$ X1 N) d4 y# t, z; y& @! u+ M% e0 X3 `4 T5 d
// IF OSPM is capable of direct access to MSR
+ t: B! E; i& a- d; C0 \. l5 o5 n# ]# ]  D; |8 `' `  w
//1 m- F9 S$ K  ?" U* L
Report MSR interface
# ^. S; a2 g: O% x- N% ~) O
) C- |3 P  F% J  r+ l// ELSE
1 q+ T0 x+ d7 `& k5 D1 ?% }- q, @9 K% y5 Z/ \
//
" t3 [" z3 y% _& GReport I/O interface
! K( z" J% d5 |8 K$ J5 w1 W& L/ _' Z# x: q
//$ r$ F9 s/ i, U/ d! _6 k
" U: Y# ?# v! ]% n' Z5 O3 t
//& _: G. G7 v' N) A4 i
PDCx[2] = OSPM is capable of direct access to On
0 }+ m  m0 B, a3 o; \9 m8 k, v7 z3 ?5 Z6 ]% H+ e' [5 e' ^- w4 ~0 T
//( K( }; @4 _6 b/ s0 y$ D$ s
Demand throttling MSR/ c8 C: a7 \4 n1 H8 Q& g0 j  x
0 m  z1 p! @/ ~" U; @' S
//
+ b; I: I; {4 Y. j) T
1 U( V& h# Z& x4 YIf(And(PDC0, 0x0004)) {
) @0 F8 c" }8 l( E+ g  H/ y' @* C+ E; p! v9 t" ~% w1 _
Return(Package() {
' |0 k& Y0 y! w" i( @1 m/ H8 ?8 B, |8 N) Y6 {$ r$ V% G) b
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' W0 |2 m- s- i7 ~* X

# p2 Y2 h$ {* q) ?ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
* p! L  D; j# E& ]/ U8 s& `& G$ D3 I# p9 K  t. v6 d. t
})1 j9 g/ t+ v9 m# ^
: W$ a6 G" Y5 h: d+ }5 \
}
, _( s0 k3 \9 g1 r0 o8 z9 c0 I) S4 Q& t' n! ?8 i& {2 n+ ]5 P- B
Return(Package() {
0 |1 c% l# _+ D; |4 y# {- p& b  j! |. T  F3 e5 I
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},$ Z0 Q  _8 _# {1 s8 C8 t9 d

0 _8 k, V6 _' @0 p8 RResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}& D, ]9 F- b# C. m6 D
/ \# Y/ z+ l% T/ j: e  K! P
}), w/ w6 v  L% N2 l
# M! E0 e+ C0 h2 m& K4 ]
}! V" N! o% h+ q0 S& j$ r8 K
) Q" i1 u$ V* R1 Z- j% j- G: N
3 B8 @# c2 U7 U: Y) V
2 H8 ~+ A! B: j9 z5 p5 l: r
l
. Q3 a" d+ C- H
_TSS7 N7 G$ ~2 L. v) x

8 V* y# H) Z# z( `" ]! [Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
: `: _# }! t: AName (_TSS, Package()
, i1 x3 O, c5 N) G& R% F8 D{
+ E, c( W. O/ D2 L! j// Field Name
7 Y; ~5 K, B' ?6 P. \6 e9 B. lField Type ' h/ g# K* s# x& u  x6 Q

, o6 K) U! ?1 \
3 D4 ~5 w# @. R- R- ?9 J
. [' D% D% x; w4 S  f' g+ j) H) d! MPackage ()
8 D: _" B: g* S, c/ _// Throttle State 0 Definition – T0
4 f  M, A' p1 B2 k; g5 h7 N3 t
{! d* k, x+ A/ O5 s- n
. s/ I) _. m. M( H

; `% ^3 ~  X) i' r) V% S$ UFreqPercentageOfMaximum,
0 t% O- Q! {& X' |* B8 x// DWordConst 3 U' _" n) l7 w& i

+ m4 ]% w/ m2 t0 j7 GPower,
# w8 k, ~9 d, H! N9 b2 P3 j3 y/ L// DWordConst - ]: Q% s; k$ N$ ~
. s& l( n+ c2 j. ?
TransitionLatency,* V  R8 Z& [5 T
// DWordConst
6 U* p1 G0 `1 Y9 }: i9 ^$ D$ e1 p/ ]* I+ d+ T  K
Control,
! F& F* D7 ]/ H// DWordConst 5 n/ X4 ^# [4 R: ?7 Y1 g) S0 W
* E, Z$ v% N- s0 x% W$ X( |
Status3 \  ~/ z5 J7 \" m( I; P" B
// DWordConst
, P6 N8 ^" Y3 E- U2 G},- L& S( H$ h2 q
……
1 \4 Z# t% O+ b1 D}% ?) h* {8 w5 C- l

2 ]9 w" Z* L; A+ l; ?+ g6 E' u  z9 MExample code 如下所示:9 f8 Z. |2 p" }. Y- f

5 n$ J. h3 ~7 E4 Q% }3 p5 {Method(_TSS, 0)
! S8 u6 |$ h+ O$ q, I
) p6 o  s; \9 h1 L  {4 a{
7 d% A, u: R5 y; v8 O# \  B# ~1 |, a) D  l) s
Package(){100, 1000, 0, 0x00, 0},4 k0 g7 c0 s+ s8 t

- Y# t- O: u% i' A" UPackage(){ 88,1 f. Y0 t5 S: s8 R8 I0 P
875, 0, 0x1E, 0},6 j0 Y8 t0 u$ n1 F) y# t4 x
9 ^- o, S; S; C! H, V6 u
Package(){ 75,
* k* S' M+ |) q5 B3 O( Y! C7 q750, 0, 0x1C, 0}," D1 E) m* [& H- o+ j, P

4 _; X8 x- ?) y$ b3 z0 l! e9 D2 HPackage(){ 63,
. k! t6 n. o/ Z, E$ R* h625, 0, 0x1A, 0},
* |2 B: Q" K8 N8 u+ r: J4 H2 n9 b0 @7 w. K  Z
Package(){ 50,
! \  G& \4 q+ W# \500, 0, 0x18, 0},8 Q+ z4 m; W( x

5 b% q: A0 O! N- l4 FPackage(){ 38,
, m/ G# T: y6 k  D375, 0, 0x16, 0},
7 A3 \- }0 I/ q* W+ `! Q' f9 c5 l) N  i
Package(){ 25,/ K0 m# Y& S) y6 p, l
250, 0, 0x14, 0},
; I5 }' i* L# ^/ T
3 A0 v% w4 _8 B0 U0 @7 G3 F: q' sPackage(){ 13,$ W4 a  }: W* T, d7 H
125, 0, 0x12, 0}
2 Q$ `6 y1 \+ @6 V8 h' ]; X9 _: U  a4 p, d; n6 A
}
  Z- ]7 O9 i/ S1 M" c' a: J) s
; l% M1 Q. d! y' z$ \2 A$ s- n) q7 p  W# ^' }+ c, R
l
, f' M1 R- l# u6 s' D+ i( ^
_TPC0 q# x6 t% E+ x# q4 O7 Y
( U  H5 j9 Y# V$ Z6 m- `$ o" |* e( p
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states,0表示支持所有的T-state,1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC。8 c" B( J- i; s; R/ s8 p

+ L6 m* E  l9 X/ {8 A4 G8 z, rl6 q  _* Z1 {+ [  K/ V9 y( _
_TSD
0 L1 _4 W2 U% j% W0 n9 j% M % O% {3 w4 Z, b4 E" Y4 _0 w
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code:
8 w' t) P6 ]: |& ^
6 S3 f3 j- Q. Y2 \/ IName (_TSD, Package() 7 F% }" D, s" {
& c7 F; D: P" |* G+ M2 r8 L
{ & X' F5 n5 t- S8 A
1 B  F3 I+ Q; h& ]
Package(){5, 0, 0, 0xFD, 2}4 b; T* @6 ]) ]  W3 h! K
// 5 entries, Revision 0, Domain 0, OSPM ( D8 S9 U: I4 N" _* Y: H& c
Coordinate, 2 Procs 2 M/ T* L# ~& }# n8 o
8 V, D, F. ?' e5 v
; N$ h+ e8 t- h% G+ |9 W& F
}) // End of _TSD object& c- J  G+ d5 b9 s3 ~( @5 A2 z
* U% {% `5 D9 |9 a* C' v9 F
REFF:
" L8 t$ a& _  p/ g6 K' y( F& t& i2 p1.; k; N4 @% G! h
ACPI Spec 3.0/ y3 D6 m2 M) Z) ?& G
2.
  F5 z' j  G" x, u3 OIntel Processor vendor-Specific ACPI
$ H0 o! F0 F: E; W0 _ ' y/ u+ b4 e) ^7 H7 }

  I2 O3 D! J+ F" y& H% ^; bThat’s all!
! u' _, P* r% d4 D( I( t; D) X
7 V3 g3 S6 ]. Z* LPeter- }' D; d4 }8 n' m8 q

  C# q' k/ b* H; |" m! {2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-18 08:57 , Processed in 0.107836 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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