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

CPU Power States

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

" _4 b/ i( u& Z. `1 J0 Z: q1. Overview& J( F( F0 \* a4 I) ?

9 G, {: _: V$ Q8 x% S" A+ \) }. K( N$ S# R/ v! w# o  g2 ^/ ]$ ^
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
* s  w6 L- X: r+ L降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
+ G' b- W' |' m; _比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。8 h" L* q& O: b0 F% q5 W
8 S. V9 q1 |" Y, s* |0 p/ h
cstate1.jpg

% H9 b. v% }0 S* v% c
1
; U1 I. l! Y& q, x& r2 _7 K
2. C-state Control
0 b6 A0 F  c/ Y: n7 h+ F
7 t# X, f" F: H' B0 p2 ~1)
" S" i' i( Y8 D+ e" s! l4 K0 J" JDetect & Enable C-state, G) \  o; C* S- V$ S
3 f: g4 O/ \3 S4 T3 _
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的支持。
$ z5 i+ Z/ v+ `4 j6 y0 T% k$ p1 R$ @& v( O! f  c2 N
2)
5 Q# O0 I) Z: h0 K* hC-state Basic Configuration- C4 N7 u: J  t
通常情况下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)。
6 [* |9 f# ?3 v; H. o: r/ X' n- `# m7 m' E" F$ Z. R$ D5 z
3)1 T. i$ k" _9 O9 o# X
ACPI Structure For C-state
& ^: ~/ I3 g* i: R( K
. h! o2 B6 l: s* O" Z0 @l
/ W  ?* M) ?+ r: K' h
_OSC & _PDC% e# j  }' U- T7 T$ q) F8 }
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures4 J( d( _% t1 P" g
l
- X3 b1 q6 W, p& Z# |
_CST' P2 d% v2 g9 a7 r
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:) t0 X; Y) K2 u9 R. H5 O
CSTPackage : Package ( Count ,
. u2 m  v. A6 lCState ,…,
: o1 s, ?( `" i  p1 h  ACState )
( v; i" Z/ f/ P其中Count表示所支持的C-state的个数
$ G6 L# O, i( `9 M6 A* I( fCState: Package ( Register ,6 X3 `1 m% N9 V: n8 D
Type ,
% ?; h! f9 ~% KLatency ,
1 F" j5 s; T) A9 g# h4 g* ?Power )
- C0 I: J3 N& ^4 U3 G, f3 I5 l9 T, E! F- n" s
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
0 M1 Y# P/ C* P+ V
3 j* X3 O: i) t6 A; Y& Z2 [& x6 QName(_CST, Package()
, t4 D& M+ `& q, X# i( E1 s$ f

9 O% D& `4 l' L4 h+ W1 k" G$ ]9 O{
* h7 G  a/ R) \. \4,1 A+ ~; V& h( k: |
// There are four C-states defined here with three semantics

: S+ \% n8 Z: m# }" C; K$ m  Z( C5 q4 t! N  ?
// The third and fourth C-states defined have the same C3 entry semantics# a, J" Z' r, e7 J: s/ H
9 o$ R" v- A% ^+ I6 D2 i7 ?9 F
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
: [( b4 x; e, z1 x  x$ B8 b3 |1,9 X8 a7 r& Q2 R# v
20, 1000},
1 J! x% a# e- ~& [: o( R
/ Y7 u2 P5 }3 G- N6 k- ]
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
! k, y- n3 p0 T6 O* Z40,1 @* c. c1 `% M3 t6 h. y- @9 q
750},
3 a' @$ R$ X; z/ N( T
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
8 s4 m- H/ q  [# Y! e1 R- O4 y+ j60,. z# J8 f' j$ U) T
500},

1 h( i+ f3 b" {5 }8 GPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
) @: N# W4 `# v+ \4 d9 T% @250}+ P2 m( G1 i# j
* n( p, j% Y+ Q8 O5 F
}) " t0 `6 k5 E+ ~/ B$ Z- x5 f

8 s. S# ]9 I4 ll+ }6 R0 K% ?0 P& V! J2 x: |# H: J
_CSD
# E- e. |& ?' L* S" h, k/ b. h# c  [" c7 y) c! e- ]! t
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
+ q1 I7 U7 ~2 I7 r' o$ C8 H- u, V- [5 l2 Q) a: H* n' }% r
$ k, \& S9 p9 l' y' t; S
5 m+ B/ G0 o) g7 Q# k; s  [% J. ]

" m  h$ V  R+ K1 k3. P_LVL VS FFH# y0 `* ~! r. t5 x* q* M- `# M
" ~3 t1 V: R$ E: `( X  b5 U& y
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)  i/ R- V; o, G' ~) V3 U
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所示:1 q1 l' m4 F/ p
( [6 Y5 T- r6 ?# E$ F: i
gas2.jpg
8 T3 k: `6 f  L1 Y) c. ?
2

2 c5 R$ w$ a% H6 GOSPM解析到该_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的一个例子:. C* E2 S8 z! X( Z3 q
Name(_CST, Package()
1 K8 j4 b. V& Q" C8 ^* x) J5 o

! ~  n3 ?9 v) f% ~" x{ 7 m' m# d3 {. o2 z# ^
2,
& e3 R1 o% I* Z7 k* O9 ^; o// There are four C-states defined here with three semantics
" @% q( B5 A- J3 `& n. C/ d
% D# w: L7 a* U' r- Y9 v
// The third and fourth C-states defined have the same C3 entry semantics
- u$ {4 F/ h, h& }; y" n3 I
2 w+ m% B1 k& G; I
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},2 }2 j! k) {# F& T- f3 a
0x01,
8 U5 C+ u( L( {9 Q' X7 [0x03, 0x000003e8},( W0 |) l- l- O' n+ K$ A
& r+ }9 \* N( c5 y
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},+ d7 M, r1 X0 ?6 A) E, {
0x01,; R* a, V$ X- Y1 |2 n
0xf5, 0x0000015e}

" H0 r$ j1 V9 m0 y' e& J2 O' x9 g. H3 r})
/ ]  n1 b6 w  W6 l' `$ l
/ G& W2 w3 ^9 X( L+ b/ ]7 R* S3 x5 R% h  g$ R
REFF:9 ~0 I" h( b! ~8 J3 S. W" b
1.
* @6 F* x6 `. P+ a7 ]ACPI Spec 3.0
2 N5 N" {9 g0 @+ z, e! P. j- j) }2.
/ {4 P/ T. R. w; O8 a  |Intel Processor vendor-Specific ACPI
$ g" O- l& C/ t" V3 v8 ?/ x# U# R* R2 O$ j  _

4 p+ t, j# R* FThat’s all!
7 o: h5 S4 L2 |. ]( ]/ Z& ?
& x8 Q+ _4 H4 G! L1 IPeter# d) l3 h# F. U. J# w5 S2 v
* r- ?' u" K# K6 H( O+ r
2010/9/207 r9 O! s: |5 V$ h' E

6 A* `# ~; x$ m[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview+ c1 _# @! o. B: H
$ E/ l3 `. {5 T/ X9 x# n
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST3 j% m# U  ~3 Y0 X3 f
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。) X2 b$ d0 x. G# c
: |! c& _+ T1 B; y: N
2. P-state Control
, p) x% ^9 F' k# M9 Y$ f$ Y 1 i. {" [/ v0 {+ P
1)7 C) p; [  |+ x+ \/ s) |! b
Detect & Enable P-state
* b& L5 F: \3 e, t' n5 v9 E 1 ^5 F# S4 X# m: P
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state8 s* R$ n& b' {1 |$ q- F

3 C. |# D  n4 T4 J4 Z2)
) P# X/ Q, a) W" {+ oSupported P-states' K7 F  t0 o- f* g8 B. K
) r  Z/ L. ]) y7 Q
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 P$ H# z& D' `( I- f

) J, G/ @/ \4 j4 n0 G# EMinRatio = PLATFORM_INFO
9 ^" S' a- L4 x% d" x) w( ]MaxRatio = PLATFORM_INFO
  E% [( E1 W9 KRatioStepSize = 0x01
3 d# w) H& p. E3 QNumStates = (MaxRatio – MinRatio) / RatioStepSize + 1$ l4 k  g' {9 T$ S; T; O8 f" k* B& H

; P  c1 W5 T+ K: {8 h! Q! B# i, QIf(NumStates > 0x10)2 o& D" `; A2 F3 r9 x  T6 Y' D
{# g0 u1 A1 M) G- i" f; a
RatioStepSize += 14 z% ]8 ^4 c! Y5 S: N# J% _* a, L
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
& R; \1 [% S1 @' ^+ k% C0 O}
" D+ p6 C0 m- |1 Q- J1 r; p& r
4 P, a# Y2 K* E" X7 l3)8 B% e3 k/ u4 m' i4 U* W
Turbo Mode
$ s) l$ n4 I, }- P+ z % w9 P. U5 K6 B. V9 t
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
2 n5 z+ F- U5 E
. k1 a+ B0 b, D8 d, u4)& r9 v* d' T, ^1 w# I# e2 o
Over Clock
" E8 q& i$ O* W6 ?
- f% j6 ]* y' `% `某些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. z4 C: r6 T% [) a
& J; }4 w4 D* q. _1 O5): k+ @. h% x7 b! Z0 c8 U
ACPI Structure For P-state
' k" |2 E. F" q# N8 C
) ]( z# u+ U% l7 Gl
# ~$ c+ Z: {) ^/ P6 E, `! n
_OSC & _PDC
& D5 @% U' ^; {) l/ z
- O- w: {, g. D2 n_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( H: Q8 B4 N+ ~) j! G4 h8 p% O+ ^
$ J8 x3 B# {' p" m; M: \l
+ U  u( \' O4 j' H. T
_PSS% p6 [( H0 }) M8 [
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
+ U' q  l# f7 I1 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 \$ T  {$ M/ @  g
以确定P-state切换是否已经完成。  w5 P. ~# s7 H" n: g* N  Y
. H; M6 J8 m! F" i0 l6 K
Name (_PSS, Package()
) }% X+ s& {8 J. e- g{
7 s" f& I/ M) Y* y// Field Name
1 }  ~6 r6 l/ ?" s% R0 x4 c4 MField Type 5 ]4 W2 W( h; a2 P; }" W

1 N/ P3 y3 C# x' Z% f
) L0 n: ^! U) b; g
' y- \* b# a: V0 XPackage ()
* q4 c  e+ E  T+ Q0 x: E4 @// Performance State 0 Definition – P0 & U7 c( Y2 T) s$ [( |
2 \/ E- L: K% ]3 Z4 ?
{6 A" q) T' s8 q; b& G! H, Z  ~

6 @) p, e0 f8 P% D" }% R+ E% e& y3 X
CoreFreq,. V# M) ]; k1 H2 g
// DWordConst % y6 O( v1 v3 y# W! A- {& m9 z
7 h- t0 M9 X& \& i7 m
" v( f4 H" Q& C6 Z' \$ P, {
Power,3 @" P4 o2 x& J- a4 N/ n' G  z6 [+ w
// DWordConst
+ z: q8 i2 p- u' M* y0 f, ^1 C) i; y/ C& {  U9 T' q& {
TransitionLatency,
" I" N. m) G( W" t// DWordConst % S6 q: ~2 E% P  ~  H/ L
5 }; q5 d: ~! @3 Q1 J
BusMasterLatency,
! Y' q+ G$ D# U* @  p! S: K5 z4 v5 E) [// DWordConst 3 m. r* A, K; v( K+ z2 [) S9 f
- C" M0 W8 O/ D. y: T/ h& f; B
Control,7 j. s  ?( M( G, o% c+ k% Y2 W
// DWordConst
% C  L# @$ B2 Q# S1 P; l7 s7 d' |) s0 @- _9 Y
Status
5 s+ O& i. X' g/ r" l" m/ e8 o$ P* s9 G
// DWordConst % V4 T1 Y4 |5 ^/ l4 Y, y0 F
9 U( ^5 [( E: o" b5 ^
}, & H9 P  z  [* h% A0 E, d
1 V2 j5 E4 H* L, t3 W$ T8 V
. : ^4 @  ?4 y: V

/ S! }  S8 O# _6 p9 F2 B.
$ h; Z1 h7 P4 K# X  o! j7 B2 Y- G0 o% O1 q  n+ A, E
. " P/ |( A+ S7 `# |7 D9 C6 I
}) // End of _PSS object
' y. e' Y8 i( H# i9 |' w前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 ( y. e& v* W6 J7 n6 ]

( u! G( T& E# r: w% D% J* kName (_PSS, Package()
" S: A* Y" r& T8 p7 P2 `  o0 {+ |) c+ }( H8 y. Q* O
{
. k/ y+ L/ I/ z$ U" L: h
) ]% k" z% ~6 R4 L  k5 r% w8 aPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 2 U' i& U9 e- Y

$ ^! x6 l7 y' i4 b5 K* ]. E- GPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
2 m) h7 }8 L' H& X9 M/ [- N7 B0 d' T# {
Package(){1400, 8200,. K6 [! A: `0 d9 d6 N
10, 10, 0x000E, 0x000E}+ X4 E) U/ |' d1 X& `
// Performance State two (P2)0 Y2 W) r) m$ _
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
8 D+ R0 L/ F8 wPerformance State one (P3) ! I( |$ w8 ?) Z# C" i

- v/ o( I$ J' V. \) b- LPackage(){1200, 8200,
/ Z4 R4 w% r8 [' A4 A$ ?" b, C10, 10, 0x000C, 0x000C}+ R; V; r* R; T1 k1 l8 {" W
// Performance State two (P4)
. F& J7 m4 q% I, E' p- d& x; f2 L3 E" u$ k& f9 C; r; B
}) // End of _PSS object9 u  B& ^* Q) D% Y  W

9 t5 W3 o$ X1 k5 I( {4 \另外当该平台支持Turbo Mode P0将会reportTurbo Mode
( f5 z# ^% x( J + ~) u3 K* x) R& f4 t2 j
l
4 b; l5 k) k6 A$ _
_PCT
3 i* e, j% z8 G- w  `3 S
% q% k0 a6 E- U* @7 }, kPerformance 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; T" Q6 n( {: j6 X
0 f2 s) i% X/ @# M( S9 z
Name(_PCT, Package ()
# t( t6 E/ f% ~% d// Performance Control object
& A9 o$ C6 d. _
6 G2 c" Z6 j3 ]9 j! r& ^! |) V{
# @4 r& ]8 ?9 L% C& v$ Z
) ?; B1 x0 w0 c4 }" k" v* Y% OResourceTemplate(){Register(FFixedHW, 0, 0, 0)},+ |) z) h1 g* V
// PERF_CTRL & x- S& W4 v4 `/ [
, B% M# E0 n  F
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}6 r) v1 ]+ \; H2 R( R: C) T
// PERF_STATUS 4 z$ M2 `9 K" b( q/ y

  m: Q& F1 z& G}) // End of _PCT object
' C4 e% b7 E. a+ P/ l% o
% {0 x6 S1 w! c' k. J  A$ z0 sl9 f, w7 c# ~$ U' E8 t+ s' A
_PPC
( H" G7 [# q& l* L3 r
- U$ A* F! 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-states6 G. x5 j" s9 O' w1 S* ]

" s0 ]0 L. h1 V" jMethod (_PPC, 0)
, B/ H0 h% ]2 w( @. b: Y// Performance Present Capabilities method
. H' Q7 p4 n' ^% f, W$ e* w$ C" T4 w% l% L6 X% W: V
{
) o6 l" {8 J6 y: c/ h9 V$ v# t' Y$ n; j8 z$ U$ u
If (\_SB.DOCK) 6 Z# i( w, o3 G
( V  s0 F; j6 j; U9 h7 R% N  H3 E4 I
{ : V7 m* o3 s4 C) N9 o5 m/ ]( m5 T

& T; S4 s) A, O) [Return(0) // All _PSS states available
' X3 o2 {7 R) V( _, I
6 @  a. h( k' z, G7 ~; z: b, K! m% b0 T3 m: j; B
}
4 [$ }' H. L6 b/ ^  d
% a/ m4 O. z& G" V) g" ~. `  qIf (\_SB.AC) ( M! z( Q$ }/ T' Y/ k5 K' s& v5 d
% n0 B; v! w: C' l; ]( L
{ 9 M& C- J0 G% ?- {) Y; n/ _

3 u/ r/ q! _$ \5 j/ W" T( D& fReturn(1)
9 T9 Q% r5 Q* l" n5 a3 k// States 1 and 2 available
. c+ S( {; T+ i" p# K2 `5 q+ f$ y' g) ^2 q! `& ]- L% j
} 8 u9 M" U) T0 D( Z4 H
: ~5 g6 n7 e9 y* C/ m# n
Else
" c* T2 P$ P6 [/ g% f& f2 \
0 A9 M8 S* t1 a, w2 R! q5 d{
; a- G: n" T* G2 Q- H
5 H. @* s! @# o) tReturn(2)
) U7 Y& R( F. S- F// State 2 available2 k8 K& @1 A: |- O

( ~. a% u" G  ^8 p0 w! [6 E}
& M) {- g6 O* v% f4 j2 |' x0 t# t4 I4 \* m6 R$ z% {5 d8 I4 P1 i
} // End of _PPC method; H; L' p4 T4 p
7 r. h) _& O4 Y/ F3 n$ H" ?% h
l& Y* [5 f$ F2 @2 U
_PSD
! C- e1 T" |1 o% |  X8 h$ y8 ?3 q
5 c) e) {; u1 S7 T, wP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。$ y* y* i$ k6 ?( H, Z4 S& a7 ^; `

8 [! \7 b, N- H2 [" D4 d8 oREFF:
* O( f6 {, t3 `" O, C( w9 Y7 x0 n1.5 W1 \( ^7 z0 U' J
ACPI Spec 3.0
( ?: o# u9 q/ g' c/ ?2 y6 I- |, N2.+ O9 P( _  U' {  q5 x
Intel Processor vendor-Specific ACPI8 L% s0 c0 I. e' X

7 B, |9 o# S2 T" G
! e) Y+ k# M- r) ~6 }5 H. jThat’s all!2 d8 [5 c! H9 L7 Z6 S
1 f/ q4 p, i$ P+ M1 `  R7 N
Peter
: v3 s* d$ V& I) z5 k
$ J; h) m. K) _. e2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview0 x+ _# {$ u" ~5 P2 q! e
9 e" n) |3 g& v4 [
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工作时间的占空比)的方式
2 ~" k5 o1 w# b4 G$ U1 ^3 C,影响系统的功耗和温度。
! k/ a* H- q. O3 p" ~ # {/ s; v' x" ?+ o2 M- [
2. T-state Control
  Z: \3 ]) a2 Z! T6 S1 @ ' Z4 A! H( ?( ^
1)+ l1 X( S' \' o0 }9 [! r2 A
MSR Based Control
) ~4 E5 d5 N8 g% N- ]& r " o; P; h1 o- w, r1 U: c, |+ l) Z8 a
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
+ d! j0 `: y* g3 V6 d3 x/ R' V
. ]. I. W+ I2 L2 Q* y5 B: [2); M! e) ~2 k8 j0 ]$ s* z4 I
I/O Based Control! _+ i; }) ~4 z' z
; O( Y- M5 z# `) w
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
  ~# Z$ W' G- ]) _# F2 U: ?4 j
' H5 b) h! g2 S1 h& U. V1 G5 K9 ^3)
  a0 M3 T( c+ m9 _3 O- AACPI Structure For P-state, ]0 o9 z) U+ v7 X& N1 q2 r
l/ y8 Z3 P1 M4 k$ n6 \# U
_PTC
# H. }, S. k5 l$ i. |) X9 ~
8 J6 _; O+ x9 O0 zProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:8 F. I/ k% L0 }/ n/ {, j
: M! A2 Y/ I2 U& I. v' v- l; _6 P2 n
Name (_PTC, Package() + Y9 w: g5 Y, \7 s
{
9 |* {( p) B: h! C* w# B4 @( |9 w# t  _* h/ m/ @* S" N
ResourceTemplate(){Throttling_Control_Register},
4 [" D+ J! A: K0 X//Generic Register Descriptor 9 E) o0 C& u; D0 f6 V5 `& J

$ X$ l! W" g7 G& R, f, {+ RResourceTemplate(){Throttling_Status_Register}
: o+ x* d/ {/ C: }% |: {( u5 G//Generic Register Descriptor
8 V, U& h% E$ ~3 O}) // End of _PTC5 V! l/ p/ e9 O1 p" W1 l

' c! o8 U7 Y1 p: e下述是一个sample code$ d/ Y/ R! q8 F; [
; X, }; X* M4 S! @

7 t! r+ ~3 w1 I* r
//
8 f/ h- R6 X, S; _* h& X9 b& `0 E" V7 W$ e+ t
// T-State Control/Status interface6 x4 H/ M/ [! [* ?) e
" q5 B0 p; k' v) S5 J+ Q! i
//
0 P. {9 c5 c% O; |  X
4 q1 Z2 J! v( Z2 B, AMethod(_PTC, 0)
# ?: x6 z2 Q7 u/ V; R- W
& _5 [( v! L  @4 k, |: N) \$ j{
9 \" Y# z  F$ a8 q+ `0 R- f2 G; I/ c; r+ I6 u
//
9 p6 ?8 H1 ?( o: q, T) }+ w
, ?" a# Y7 R, S. h0 W" T- Y" r// IF OSPM is capable of direct access to MSR
& k8 {0 R2 F# o2 K% u8 y- }- ~) j2 H' [; Q6 T5 ?' L  N# l1 E) K
//
. n7 i7 y& o9 Y; Q; [. zReport MSR interface
/ C! e; j6 I9 F5 \: T
9 E0 ^: @' \+ w6 Z$ B// ELSE
/ D) }8 P3 i7 H% V" J
, E  j9 F" _, k: Z  Q7 i: K3 s//0 t( t2 Z/ X! W0 o9 b$ ~- s# o
Report I/O interface3 f- a6 x' l: _1 M

- B/ l* j! t4 {* L//7 O. j9 N4 n* Q; {7 T! ^) W

3 |& M+ u- F/ F% i/ p2 X7 D//
8 i6 c5 T  J; R) {+ H% }* {! tPDCx[2] = OSPM is capable of direct access to On
2 a3 y8 ?. k" F* {, V' v2 j' E8 n% f7 X$ V( k: u) T
//
- @  x0 v$ u+ Y/ Y9 }1 ODemand throttling MSR* ^4 Q- _* \: ]$ Z% z

$ \# f# Z+ S1 c7 p4 m$ o' v' s/ W3 E- z//  P% C- j+ Q. ~+ f& V

7 w8 T# _# f( \/ xIf(And(PDC0, 0x0004)) {) w9 Y6 J2 E1 C' q, g( t

: X- [  l2 r: e0 EReturn(Package() {
* k' o: a) A; F) B  q$ J# T- Q; E7 ~5 F, K- ?) Q8 B! h0 _
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 e# f2 Z: n2 U& }" g# M5 H8 m$ K2 R6 @
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
, f1 s, ^7 A2 `; I$ X& V( R( `7 `+ _& w3 G) ^+ D. P
})4 R2 K9 o2 H, I/ e* G4 ]

1 {$ J( \  K. E# w3 M}; [! ~( o  h0 J

) [2 N$ h3 H) A; EReturn(Package() {
. Y$ c9 m9 X# }( I
: M  K) H3 l$ Y5 D- d7 K( nResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
2 ^+ ^/ p% f2 D! |  T8 _* t& N$ F5 i# ]6 O' R0 ~* }8 ]
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
) Z8 Q% S( g( \% ]% R) e5 w  a% ?- A, d" y0 j. x1 f8 [7 ^" [
})$ q2 {4 U7 X! @
( F# S# F, y6 b5 a4 [% a. ?
}; F0 P0 i% X" u! c
1 c- x, A  A( i8 x3 j! x
' b8 l" L* B. f

2 o) d* f( x9 K) x7 al. g; F, u5 b. H
_TSS
8 _+ n& I7 H5 K2 x+ _+ M  Z% W5 Z & X( v+ H+ q6 |
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:$ G! K2 f3 a8 e& l2 A1 J
Name (_TSS, Package() ! c7 {) y' S2 D5 Z) w7 M
{
$ i0 ~% J/ Y; N0 t. h+ C// Field Name
* i5 z6 U, ]" Q1 eField Type
3 D- Y, j1 w4 Z" M& [
1 X$ g2 M1 @& |: u2 h" C! {9 @% X9 S) p5 I
" u: B3 q. \4 Y# h; T
Package ()
. k+ U9 `/ y: g// Throttle State 0 Definition – T0
3 }# P6 k; K7 `3 m' S* R& |1 o
5 O2 \; ~. |+ S6 i{, e2 t& J8 L/ c4 T+ Y

& O: @: E- y( F5 A+ E* S" s# n7 ^& V0 Z3 |1 A: F
FreqPercentageOfMaximum,' P+ A* s& \' e! Q0 }8 N$ m
// DWordConst 3 x0 S7 g0 k4 [5 T0 f1 O
1 C( f3 L1 H( n; n
Power,
2 s! B; ]' C9 i7 K3 S& n3 m// DWordConst " i  r/ E- L* A- i1 e9 [+ Y

0 Q; I( }' t  x  bTransitionLatency,
+ o3 }: K/ B5 }- U, V+ ]( |// DWordConst
0 K1 W' l! G% S8 ]1 B7 ~7 J  j6 M
0 S% r  L4 g. [% c; P0 o1 _Control,) x% L/ v6 R: p
// DWordConst
4 U5 C% [; l3 \1 f6 H
5 }" z- c9 b( A0 L, A; XStatus
# Y1 c! P& ^5 I5 x// DWordConst
' w. e0 U/ u7 m. I0 e},
5 K8 Z4 K$ M$ W* K* I……4 b. k# t, X7 o4 [9 ^
}
0 F& b' h  e. ^4 c, m- E7 y  d/ x* o; U
Example code 如下所示:; K) u, d7 Z; s8 \) c2 c1 Z

4 R- Y  m) e% u- lMethod(_TSS, 0)6 k) j6 |( M, M" }" n
& G4 ^2 d2 y5 Y1 e0 x8 g
{; c4 Y- k& |9 v3 M* Z+ Y6 |4 Y/ {. Q
' ^& {: ?, y. T% {8 x5 _0 T  ^
Package(){100, 1000, 0, 0x00, 0},$ \! p  e/ @  a4 ^- J
$ _8 A5 Y* D. t) K4 L5 J) J) h
Package(){ 88,; E3 w: u( Q9 u, w( h: m9 V
875, 0, 0x1E, 0},
2 H$ u  P5 l: w% n8 {  `/ s& s: F. Y. M
Package(){ 75,
. e, X8 X/ y4 L) p0 [. M& S  U750, 0, 0x1C, 0},
3 A" I* b, o8 o& s) J1 L) T9 F0 c; I. Y5 W  u
Package(){ 63,0 C7 L) ~: Z2 k; {4 j; S
625, 0, 0x1A, 0},6 Z3 D) F; D9 [7 {6 o; l6 D

6 W2 r3 z2 `" sPackage(){ 50,* K' f5 A( Q& @3 f0 D& S! e7 o
500, 0, 0x18, 0},7 S9 `* {- f- m
" t% `2 q' O" I
Package(){ 38,
, ~$ p  r: z0 @6 V! a9 o375, 0, 0x16, 0},/ f1 i1 \; O. `  [

* F" S7 H- Y* |! @7 \# L9 mPackage(){ 25,$ U! ]% F1 [" L" Q' t
250, 0, 0x14, 0},
  U, l/ v3 k* Y. |$ Z, `
- d' L! ~$ m9 h; i- cPackage(){ 13,2 j7 n& a; G- d( Q
125, 0, 0x12, 0}7 j3 K* _3 t( G# _; {( l

+ v8 O( ~# Y2 o  y# z4 T}9 u3 i* c$ l0 R& p% T

/ Z  O0 W. |$ G" |: `# Z6 j; v, C' f4 S
l
) L( v, c+ W% i
_TPC9 Y& R% Q% M: v' }! u, f

* ~8 N" x- r# m+ d  e/ k( @6 h' dThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC  w* f, K& f2 W# V

0 E4 R6 Y: }) r- Xl+ y& l6 c0 k/ ]; e, `% H3 m
_TSD7 }% ?  d# z% B2 H/ z, _

9 t( M. r, b9 ~) f4 }T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
6 M* {8 g# j9 m" L% e- X
7 C" m6 c: v/ F& o! u9 CName (_TSD, Package() 9 c# d# \3 p& ]: D  d

# d9 o( ^# l4 q  ?6 Y6 F" P0 Q4 L{
# r" P0 l$ \6 L
' T( f& N. I; JPackage(){5, 0, 0, 0xFD, 2}
- w4 @' g$ l! `0 v+ z2 l// 5 entries, Revision 0, Domain 0, OSPM
1 A0 G" K9 O! J2 e5 A5 TCoordinate, 2 Procs ) Z, d0 v! c% C) k6 v
3 p* S6 `) h& M) I+ ?7 ^

5 T7 w. c1 V" s( z- c9 G}) // End of _TSD object
* R- ]  h4 L- w5 |5 \- e0 d( ]' i
# Z) t; k- c) R/ |+ G5 `1 tREFF:
9 |0 N: t( P/ U/ i1.: V, W+ K# M) I# z3 J/ g
ACPI Spec 3.0
- W1 S8 u6 t- i$ Q1 l2.: L6 x' I1 D# N+ v+ u, g
Intel Processor vendor-Specific ACPI  J) L% P( `) _8 P% v  B  D

( s; B! ^- V2 w9 a4 J; c # ?& f3 o* G1 {' o/ v
That’s all!
9 m- J: I. O& J/ G4 y4 `; e. y
- ]+ C9 v& i5 R# e  K: ^Peter: I- o+ |% \! w( g! K1 g
' R; ~8 N2 v8 u+ `( k6 I9 ~) [
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 02:54 , Processed in 0.232446 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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