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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
; h! @$ F( R' }3 v6 o$ w5 M8 }
1. Overview, v9 b1 T% Q; }. d# s' s1 j5 F' |

* c8 A6 n* m8 D
( }7 x- X8 K  f2 k  [. z" \2 W9 b2 WC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
) P5 A4 r6 `( G: d降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看# ?8 i  `" t: k* M
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。, f8 g- M0 |1 I8 o1 v
- Q$ X. `; r- Y8 Z
cstate1.jpg

0 U3 Y) w. c* k
1

  b- p& v5 G$ V9 t( X2. C-state Control: P2 J. ]0 b4 e- D0 B
& k* b3 I: `$ T6 Y
1)
) `/ T; e5 i' m+ WDetect & Enable C-state
( h0 l* L* d- \  N& x& T6 q+ O6 H2 k7 l$ }) 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的支持。
! p  j- }3 \; b( d! X
) E5 a9 \/ w  ^2)
% |; M5 t3 p/ k9 FC-state Basic Configuration
; D5 c" m' U+ b& m5 B; a通常情况下PPM code会根据MWAIT以及AC/BAT是否存在给出不同的配置方案如:a.MWAIT支持的时候通常的做法是将CPU MWAIT(C1) 映射为ACPI C1,CPU MWAIT(C3)映射为ACPI C2 CPU MWAIT(C7)映射为ACPI C3,当AC存在时为了系统获得更高的性能通常会将MWAIT(C7)不再映射为ACPI C3,也就是支持ACPI C1 C2 两级C-stateb.MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的supportcode)。
- e( {; Q; a5 j) K8 W: W2 U2 U! Y7 J
7 _) W9 b7 d1 m( k" R% [& `5 ^3)
- q) L) N, M/ P  t; SACPI Structure For C-state
' \, N5 _; [0 h" [0 q# m2 d" c0 S5 M+ h5 `$ g9 F! I; W' o
l& }: i) c$ @4 `& D& k( z' c
_OSC & _PDC9 t6 T3 ?( O% w% \4 X
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures$ N/ h/ ^5 l% n4 V: Z" N
l- J( U" E- J; ^! V2 G2 ~: G7 z  ~
_CST2 F  j- D7 m7 D: J& ~0 j- X
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:! `0 K4 m7 `. j! {' r
CSTPackage : Package ( Count ,
. B% L, w% L- r. Z8 j- HCState ,…,
2 t% S" ~( N0 |$ M( DCState )
) e4 k; E5 Q. @8 u其中Count表示所支持的C-state的个数0 x6 ^; X8 Y% m3 e+ u2 R% P
CState: Package ( Register ,* y7 ?, C4 M0 i: J! I
Type ,
7 V/ S/ e' y# [  h" ?Latency ,
% Q$ D: H7 b* Y9 m  h4 i- T# w3 y$ fPower )) }1 f+ w% @$ ]' h( r  r0 F. b

5 a8 A; [( D  _7 hRegister表示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
  o- V  Y8 T; p; c+ Z# W. C. i6 Y0 k2 i2 U3 [) E8 G4 @
Name(_CST, Package()
# C, \2 A; ^8 j! r

5 J4 Q0 D4 {- m( g3 _) _/ W{
5 F* u0 A9 H" w4,. G* z$ ^  R& G* @; O; e/ j
// There are four C-states defined here with three semantics
7 p! A/ G8 f- D" X3 d1 i/ I
2 ~, x# a+ N- T9 r& w8 J: \4 `3 H
// The third and fourth C-states defined have the same C3 entry semantics
& s* G; l# O# b5 {; h4 a
8 k8 q% u( J$ I7 y5 C
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) F) z6 Z7 K% Z9 U. z1 g' m7 Z7 O
1,
# N* ?! u5 G  R4 h: |+ V' O20, 1000},
3 _: S9 k3 j+ }) [# i" H

% o8 M7 }" [# h- Z  _' M9 i# NPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
: m* L, E# r5 N4 v# k( A40,
/ m6 Z% G; @2 q3 W8 q4 V% J- {750},
7 k# B6 |: T5 h: T2 {
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
+ v6 i9 h- C1 q7 s2 P60,+ J/ F- j9 {, f, Z6 b
500},
; B: @6 s7 B! K5 H% k! o7 R9 z
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
% L6 S7 |4 f- Y$ A4 ]: V( [2 [: x+ U250}: N2 G  y, Z% I; Q: a6 D4 B% D
# E/ s. r% f6 E. L5 ^
}) % j" M, `7 o, T# D/ y% ~: i; ]
" O" J2 d9 W2 g% y
l( T) C- t# h! }. u) J/ H+ A% N
_CSD
( z- E) P5 @; l
& o/ k1 o; n4 h5 s/ `  k( FC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。; X  O% d. `1 X. _
  A2 i) ]9 I, N6 M1 I( X: h1 l
& t" {5 c0 [. h8 E

8 G  ?2 @8 I( ]7 h" u  j. R# n  t0 I% H* |, b
3. P_LVL VS FFH, Z- Z; O, `5 S" ^

2 Z3 E2 y# ^( y6 U. Z1 T9 JP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)! B9 g- |, B. i2 c7 ~3 _
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所示:5 w$ G! ?! H& d. A' ^( }. c

; Z# B1 B2 S  T3 o; v
gas2.jpg
' j6 x" y3 z( s9 [' l  w6 q
2
( b' z  K' C  H! y
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的一个例子:/ s0 a8 P0 Q- E0 {
Name(_CST, Package()7 i2 x8 x) `; d5 R; A+ s

8 e" q! w( T4 I$ J. ~! }{ ; v) }% |+ J! z, F5 [6 x
2,
+ w5 _* A2 z' g7 p// There are four C-states defined here with three semantics

4 J# X6 ?" e; m
( {# ]8 C; [! W6 z" K$ b& D4 T// The third and fourth C-states defined have the same C3 entry semantics. t3 i! s" F* L* y" z! f

! s( C, l$ X; P# W/ n+ zPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},2 v# y9 t/ D0 |1 n
0x01,. n8 Z2 q0 r. E5 K2 k
0x03, 0x000003e8},; o, r& `. Y2 P4 J$ v! k

! m& q: ^: D% L6 Y# z% G' ^" Z/ hPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},% M) \  L5 v. ]* w5 N+ I7 ?
0x01,
$ F8 [- N0 l. d. o0xf5, 0x0000015e}

9 }( d1 f, d( X# F}) 5 `. p9 u2 X8 \# S

' T1 R% I0 }0 @1 m4 T% G5 W$ P* ^9 j7 L/ c
REFF:
6 k3 t7 M) p- b. {! ?1.
: P2 y, j. ?# ~ACPI Spec 3.0
/ [* c! _, |1 Q2 \! L2.
' d+ x8 m8 @1 E. FIntel Processor vendor-Specific ACPI
! f" s/ ~& S* h9 k- ~- r0 \
% A; s# Z6 H; S# {1 w/ z0 E0 Z) `: j) f
That’s all!4 b& U! [3 A4 g  G% S5 }
$ h0 a, T: O2 O( y- _( i/ o  H
Peter
) y" [2 \6 H2 t5 `) \( K3 R% A) P
% H2 F% _$ \' }- Y2010/9/20
- x& m; |, e4 Y8 |0 n* l& r; c6 u- j% w5 o! P' o- A; k
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview* ?  L; w" H6 r
" i! N* b0 O: ?' D" W  l& @
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
& {* I4 F. D2 L$ r4 I. DEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
( F1 V9 P* d$ W3 u ; ?+ s0 u8 W8 X/ x
2. P-state Control
1 `5 N  Q- u) Y( ]
7 V' ^3 |6 E8 W3 F7 N) h! ]1), L* i$ E* `" _6 C
Detect & Enable P-state
6 v' k# s$ U* J% t
! k/ K' x; u! L: c( ~, ^  TBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state* [0 e+ r! D/ d% Q* A  [$ s5 S5 V
4 j9 l5 `/ o1 k8 X! K2 {& Q7 l4 {
2)
) m. m# b0 E2 g2 ]$ _Supported P-states  p7 o" u. K3 d  W
( z+ A8 g: ~# H# D5 I/ f$ {
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" D* i& ?& p9 u' A4 W

3 F, a( E+ }; J  S0 zMinRatio = PLATFORM_INFO8 C% W, M; V, }. o
MaxRatio = PLATFORM_INFO
2 z' {0 o" j! s% d# yRatioStepSize = 0x01- ~) M! [4 n' e
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1* G- u4 p9 Q8 D8 B+ x1 h
& M/ R9 {2 v4 V7 b) ~* ?+ ?
If(NumStates > 0x10)
8 C, P( a" }: h! M- j- v  f, a) Q{- [6 u& @# W! T- }- H
RatioStepSize += 1" V( M1 S/ |% E# s6 N4 _  [
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
! [  e/ M5 I4 Z* N4 z3 A( ]' w}
& G, O5 ?' N1 C: Z 4 H6 H* l& L# \- Q9 V2 R. t, s
3)
) ]2 b; u. {3 T( iTurbo Mode! R5 j" f  Q0 l: v7 u) l1 r
9 j- R2 Z# q' ]; k
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  V" k" c4 I, E- \
, {: _/ B/ K1 Q! M
4)) @! h8 B9 i/ ~. E& {$ J
Over Clock
5 D% e! _( [' m; W7 R
7 I4 d9 B8 ?# j5 A$ t0 e# |某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。6 j! n% e# J  H. E
9 @# J2 t$ p. @/ C& U
5)9 x1 R9 v) K0 J% N
ACPI Structure For P-state: ?' ^2 ~! u! {
: p' B* M' P" ~7 E$ ]
l# r) c: I6 Q3 r/ a/ X7 Z: B
_OSC & _PDC4 k& Y% A. [3 {* _, _% D
: v4 S! C2 a' x) I& h0 t+ r
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures' y& w4 g! c" C/ [' ^% R

; C* T* Y! u/ O; m2 \( Tl
' z* u2 m3 \# n' o4 f0 x% X) H
_PSS
, a) j+ i' s( U% }. X, gPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量0 N  `: ]: J' m% N) M" _! ~: W
并且通过一个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做比较
& m. j0 z; t9 c以确定P-state切换是否已经完成。! q3 s" k, \  E3 {
4 }! N+ s, X- d3 W8 N5 F- l( R
Name (_PSS, Package()
; E  |% N7 x& p3 v. I+ O& I0 J{, z* d5 D7 T' h8 D
// Field Name% j8 t1 f; r2 \0 l7 ?% u7 z
Field Type
6 T$ C6 b  {% q6 t- T; h7 Y5 s; _
9 S; @3 u$ t1 Z. B; N6 B6 p7 I# n% p) L/ c# T
8 {& ~5 u; M8 G- g' p, ]
Package ()
; \0 |4 X/ m8 ?  o# i// Performance State 0 Definition – P0
2 C7 j$ Y% u5 ]# E4 s: a# f3 \# {- G5 @, a- P! |
{6 `- R  U; @6 }1 w3 I
$ ~3 p' b# q- s0 W6 N

, o) G6 Z" F6 e% T8 s7 XCoreFreq,  |* i& W9 Q. U7 x
// DWordConst . D; e5 T% v: P! H- Z) @4 u

: u: K: ?5 ^( r0 O! s0 m; p3 Z. e/ V& r
Power,2 c# |: N! \2 o& {
// DWordConst 3 `: x/ V- [& |4 @: ~

; r$ W6 Q: `6 s4 RTransitionLatency,2 n$ f  g! P( K4 L' f" s
// DWordConst
* N0 B  ^: P& Z2 n9 E
$ n, O, r4 S: ]4 gBusMasterLatency,+ H8 P  u& @7 b5 t2 |+ o
// DWordConst , `& u8 ]* J" C; w" x' T

3 a( b9 p8 C6 a* _7 I  hControl,
1 r0 E; y& M$ \// DWordConst & P1 h# _. Q4 H0 h' C

  w% G, I/ V! P5 H; dStatus
- E( r" G5 ~1 g& Z7 l+ F2 ?5 B9 A2 r$ Y, L" {
// DWordConst
; B8 C# `$ r/ `1 A/ d- d$ }% P4 y$ U
},
0 K7 @" Q4 v( z7 b8 [: n3 |: I$ i' I& @2 Z. a) i
. # P2 Y: k5 o. T6 s
. s' d: [+ m0 l
.
8 s7 I0 [/ D- t. o& [6 _# B, A: M2 B8 c# ~/ T
.
+ [0 Q2 m6 G% ~0 Y! C}) // End of _PSS object( y3 @; w; ~: D1 ^  N7 O. c
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 4 L1 Z" x( N; @+ Q

# P0 l7 i* C3 ^7 P" IName (_PSS, Package()
* i' Z* {, R% q& v
& B5 g9 g) a+ S) I* h{
& s  G  Y$ p7 _( A: U( v0 i# c; Q# Q2 t5 ~9 o% Q  @# F" a3 Z, ?
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
4 G5 b' A; ?' J- U* }7 v, g1 Y$ T( [" j! E9 k
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) & ^; ?: D4 O/ D# Z

' E- E/ i' i: v% N/ n/ ?" R1 XPackage(){1400, 8200,0 h* C# v5 V- f4 c
10, 10, 0x000E, 0x000E}
( z: D0 F) f; a/ t* t, O// Performance State two (P2)5 m2 a2 ]( D: \( n- g0 _4 H7 s
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
( q6 |5 f) }9 `Performance State one (P3)
( a( Y6 N; Z- x* b  m' m: d" p$ b, I1 X' C
Package(){1200, 8200,
! X7 Y8 h6 T4 P5 a10, 10, 0x000C, 0x000C}! Z& y, l8 w" ]0 ]" e7 f
// Performance State two (P4)0 b: O' @) a1 `3 ]& m3 V. d6 V

) R- v. q" q% ^: f  f5 |}) // End of _PSS object
) j+ O1 Q5 Y4 _! ~
# U6 g$ m& l  t& i另外当该平台支持Turbo Mode P0将会reportTurbo Mode' ?6 M$ q- e/ O; q( u+ h/ A: {
% I& }2 k/ F. o) V* U
l) S7 W% b# \5 n$ o- z7 L: G% u
_PCT
& `3 B2 u0 S% x* J, R9 N
9 r+ f3 x% i9 X2 zPerformance 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的方式来进行。/ _& e: Y( n. {' F$ F

1 G/ X( [5 k$ b( t5 e/ R$ XName(_PCT, Package ()
3 _3 C, i$ L3 B5 X// Performance Control object
$ c) O' }6 L; m# k* ~- i: }3 q$ K' b5 \( m6 X/ X# A. k: w% m
{
- o: R* d8 c  _4 g5 i2 T4 r6 `# z
1 d: S' Q% X9 E% d! iResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% T  |; c" g  B// PERF_CTRL
# B( e5 @; Z6 Z1 Y' \% r
8 K' q$ {4 c# I( D! @, ^ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}1 ^% u9 L6 K6 R  O2 G
// PERF_STATUS # W" i2 a2 e, q7 ?$ ~
% b' t" L3 d# g1 A0 ~$ A! Z8 [
}) // End of _PCT object
. G  m3 Y0 n" d ! P% p6 ]) m8 P( g- y# n# {" L
l) ?' I$ M! `, M7 X0 ^7 _6 }
_PPC& l$ Z' M3 [8 {. B* J$ w
' n" Z) ?5 x9 j0 q2 @7 t0 q
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
8 d2 M7 e1 q1 z- `$ \  i6 S 1 u- V! G9 X- [  O* y9 e6 S" u
Method (_PPC, 0)4 h8 W, f- l# j
// Performance Present Capabilities method
& J5 {' m1 |; |/ @: W" L& q6 m; p+ f- ~; x+ n2 n
{ / |( h5 q( E9 [0 S  h: g9 {* s! f
- L1 h3 _% g+ ^# z
If (\_SB.DOCK)
* J+ A5 c# o4 f' w) ?$ B
5 B, N# M3 C$ E) z2 a4 y& g7 Y{ : Y: `5 }! B8 i" `: y
, @8 i" t: a* ]
Return(0) // All _PSS states available3 W) t8 w6 ?* M$ C! x$ e5 m  a

4 A! D) E$ T* o* Y2 y! {/ n* g1 z7 f. d# y: m
}
2 F! Q) d: ~: E
- S4 C: `0 f$ |0 N5 O" IIf (\_SB.AC) , o2 K" L/ \$ p
; m( e! H3 A5 H$ A
{ ( Z6 K9 a! _" d# @# J! Y. A: j

% D& k& D: M& S0 Z2 H1 G) mReturn(1)  N/ g- ]5 w* v4 X/ O7 V4 a
// States 1 and 2 available
: W+ g- n9 p/ s" b, r
& \2 ^( @- u: I4 p! C% I# p, Q} / ~) Q( ?" Y" d6 A+ s9 L1 M4 `! S
' S9 @; k( z& l- |. n% i1 [9 r
Else $ d& ^5 ^# G! e# @$ [& y$ b8 X

& _6 N& R8 G& G9 z3 q{ : t2 ~: L+ i0 t/ h' r' k  ]' S

! v1 I* T! A2 m5 E* y5 X: ]1 ?& bReturn(2)" p' z/ }/ F$ \
// State 2 available
: }* A- R, d' D3 c8 Z. `/ y0 z9 h2 L7 T
! i4 _; }: n* B: i8 U/ D' j} 5 ~1 N- E4 u2 `, U0 ]  m. J

: E$ K5 n6 R8 W6 l" j$ w+ W: b} // End of _PPC method+ N, u# D  U9 S0 s7 n) c' r* O

4 q8 R+ h, O7 e, gl; v' P* h& E+ \$ }
_PSD
& ~& |% A- K8 L* h! l- r. j
& F+ h* W$ P& G; ~) GP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。/ A* F5 n/ ~) _+ h4 A% ?

6 v8 z4 n5 `( j- j) S# WREFF:2 I! J! r$ o% H9 k2 C# K6 _
1.2 p% A$ f, }3 S! L- c
ACPI Spec 3.05 ~8 y& F; R  n3 C; h; H
2.2 S1 |" k- K5 z9 w, M+ b- o, q
Intel Processor vendor-Specific ACPI( t: B4 o* C/ n6 |7 t
9 U* l7 a- P! w% P( }
- w" F8 `$ e" o; P6 [5 m6 L1 G
That’s all!* f5 p3 a# m! B4 r$ q) t: a

# e* u- d* [6 L+ a+ hPeter
9 [) \8 ]5 s  ^# T2 z
; X8 V2 Z* t( d% B- g2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
) O3 e/ H1 ?$ V3 _0 x2 v ! `# G  l9 j7 E0 q
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工作时间的占空比)的方式1 {5 k6 i, e# ?0 V
,影响系统的功耗和温度。) D3 X; c; J# B( `

8 C( A, S# F( G" b$ y2 b. U8 f$ {$ z2. T-state Control2 w4 W; `; ?4 W6 g. [
. Z8 [- e% ?% _, B% ?
1)
- b5 h9 {% V3 b7 T* d% L! kMSR Based Control
, {" {( P3 f" R/ p- _
0 B7 p3 p0 \5 M* d! hBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
; W9 E0 k$ n  s5 y' s. I" R9 o8 a; c" p! ~
3 k6 Y2 K- {7 _  N# b: L5 G2)9 N* h7 w  i( W" O  w9 \
I/O Based Control
4 B9 l! `# k  E1 A) ^2 N & j- v7 n0 H5 q1 U6 D# P
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
% ~% f# H! z  e! }4 V
4 \. E( N5 f5 P' N2 y# R2 W; w3)
/ g' [9 F5 j( j0 u$ o% wACPI Structure For P-state
' Y& `- D4 d$ x+ _; V# |l$ Q0 M* J/ C( w9 a
_PTC
! J& _! h  w/ z( T: M! k& k1 C 2 P# {; V' ?  k) d- B( p
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
2 s/ u- i; d5 S! ]0 T$ s 8 A$ S" H& ?- M  g" e1 ?
Name (_PTC, Package()
. z! D" W5 z- g' e. Y4 H{ ) u, x  ^% M* d/ {

7 Y) r' u, o  M5 Z* w* q/ TResourceTemplate(){Throttling_Control_Register},
6 i: g6 A1 d2 y+ \" y+ f//Generic Register Descriptor
6 `- |4 o! b+ ^0 H
; d; |( |" L" U8 a& N4 B; kResourceTemplate(){Throttling_Status_Register}  d" M" ~; r. e2 ]; R
//Generic Register Descriptor
" a" _( U: \. x( i" G}) // End of _PTC
' p9 `+ ?6 A+ j9 x7 `/ ^( G 5 D2 C9 r6 F4 [1 p6 B  \! c! T
下述是一个sample code
- n: x4 n! y& ?! ?: Y " n( l8 }4 d* ?3 r

- Y$ I+ `3 y3 [- J
//
# e; J# j1 ~/ Z$ ~$ P
  Z1 s3 i. h' ~% u$ v// T-State Control/Status interface
: _  s. @/ X6 @# j0 O* E3 l7 V% Z9 H; h
//" m( N3 b  D5 y% O
6 E2 z7 E2 q) `& {  U$ D$ M/ l
Method(_PTC, 0)* y9 D( D* V1 S

9 w; V5 r) E8 p" B4 |7 |{
: T0 F3 S5 E2 K8 m+ o& D5 j5 f2 U3 @$ w* H
//
1 E( N9 ^: {0 w8 s) N, R) S1 B* f: Q
1 I& Q/ P/ [; z, u( }* Q! C4 w// IF OSPM is capable of direct access to MSR
9 z4 q- b- ?- u9 Z& u0 v0 q7 a: K+ U6 x" u$ O7 p' l( f1 v3 L" ?# [
//! p8 E5 M* s9 \: h, Q, v
Report MSR interface
6 ~( Y6 ?9 L7 M- R/ O' a' Y; ]5 S# }6 P) p3 x
// ELSE* m% Y4 z- e% K

- k  n8 \- W6 B: z! q//
* {$ s) `; K' N# j8 B0 H( p+ jReport I/O interface
: z+ M: Y4 a# i- X+ }. }5 F- v4 E+ _, d
/// l' \3 y+ A- l# i
0 Y; h1 R/ `; P* n7 j  D5 ^. q
//
9 p1 H( L( h6 r: U4 T6 v1 GPDCx[2] = OSPM is capable of direct access to On( ?! x% q7 c1 E! Q2 ]
; E% N: W# I% X+ N3 z8 ?4 P) N
//
- y1 E, T, V# i4 `0 f6 q7 L* j/ G7 y6 SDemand throttling MSR
4 }8 f% f% f8 ?4 r( w' h. m  @9 D
( V0 X9 U8 c0 C# @4 c5 Z: I4 b- ?//# g/ [9 _. N  d$ w

4 O4 n9 v  k& Y! NIf(And(PDC0, 0x0004)) {
1 X( z7 O  T. u* ~: L* U7 g) T8 o7 M. ]/ p6 x3 Z
Return(Package() {
- I, U/ a- t" o4 i+ Y; W# L
  ?+ d' m, J) M4 j* r2 _ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
" l; F* d6 ~$ f4 h$ `6 \  l3 K. s; H9 V' w0 Y4 |- {0 d
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
, W9 \5 `4 Z' V, p0 f( e  A# x5 w& G( b" ^, w. e
})
" q& K$ E0 I% ?5 B( e. ?8 T# k6 _( k. ~5 `3 }' L& o) }1 G
}
5 \% ?! @+ a4 u2 d4 s! X
+ g. U* q, C: k  j2 iReturn(Package() {
6 h$ @; q, U# C% S1 r0 f2 H, b2 S6 K/ p- N$ Z2 J) h3 U
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},' T+ s, s  [5 s* ~7 z
$ [' o- i- ~) e: i$ h4 |
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
" f6 W; G7 p9 r; a5 `. w0 P4 ~# N! |1 W+ ]3 Z, q3 u! V
})6 S# A7 G9 a4 e- ?4 c. ~, L% n
/ y8 `! h! w# {5 l2 H
}
: H1 u6 s, R% s7 U& G7 @) P
. [& \$ f! T7 {8 e. ^/ {' s: E1 b  {0 c- }+ j+ Q
1 j* V9 W1 J4 a) P
l$ t) n- y7 |# P
_TSS; @* [. k* B' Q# m* D

# F5 P4 m& C4 ^" yThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
& a2 V3 T+ `; QName (_TSS, Package() " C/ d; p3 \& I4 b
{
# L. q4 W5 ?/ z: P// Field Name
- I( O& u+ |. ~. ?7 }6 QField Type
& A5 L4 l, z$ @: T" _$ ?4 k. ~& ~7 s9 h- ]
: h" E  q* c1 K" }+ ?! v, H
0 ]1 t0 R7 B! F5 s
Package ()
; w* f; y4 k8 }7 T% _/ V// Throttle State 0 Definition – T0 9 w' t' h4 a' ~5 e* \! m
) a: F! @. E5 T" ~& c
{
9 a* ~. w& I+ U) m4 \2 f6 N9 |# L0 S. @  [

6 ]/ I( ^, E! H) G* zFreqPercentageOfMaximum,
3 w# E8 A  j0 n" a// DWordConst
7 I! w$ b" g: h* ]8 `* K5 E& f- {9 c0 W! t! @' U4 ?% R
Power,
- j8 Y" j* n# x; V  ^4 Z) |2 w1 Z// DWordConst
. w3 \8 o+ c( ]! _' P0 N7 S7 v/ s* Z! n5 _" g" u
TransitionLatency,
& d# x: r+ Q& s) ?' O! w// DWordConst
4 S% ?* z5 F: {& o6 @/ `$ `8 g* {+ h$ x
Control,
8 `/ q) P/ X8 N1 w// DWordConst
: I# E) F4 k: W( M$ ?) Q/ l6 l5 C5 Q4 w$ j& L/ _
Status
9 n9 m& Q$ _, q// DWordConst
/ C% W1 M$ _9 z& i' o5 F7 |},
5 m5 J  ]3 ?/ k' j7 f: k……
7 Y  R" C( S$ u}# f5 x5 w' W5 [5 \. z: n# \' k

& T5 t) }" T6 A6 C3 }: O, g! `Example code 如下所示:
! T. b5 B' w  ~9 }9 B' @
  f, y: h3 B. y; h0 n4 uMethod(_TSS, 0)8 o  V- b9 P) r( k; b/ U
0 l% S3 t; D8 y  ]" b' ]
{
" C" H5 G( c3 O6 N" l2 T/ p+ q/ d. X7 c
Package(){100, 1000, 0, 0x00, 0},
4 s/ `& A. b/ s/ o
# V% [$ m, k& P! CPackage(){ 88,8 |4 A# L6 J* ^1 z  ]
875, 0, 0x1E, 0},
/ Z$ O" S% l3 K
1 R4 R4 E  B2 D$ q, ]! kPackage(){ 75,
/ |+ R5 Y% [- H" @7 L; ^750, 0, 0x1C, 0},
# U7 P6 y4 Q) [2 U2 Z1 s$ g5 j+ I& a
Package(){ 63,
) u  K+ s2 x% l# Z9 N' P625, 0, 0x1A, 0},4 K! K) G' Z# V6 v2 e
9 j5 ^$ ^% w# D, L) E" }
Package(){ 50,
0 \# N8 F9 g/ m) ~* {500, 0, 0x18, 0},
. U( P8 }8 k2 N# E' P$ D
; C9 U: r+ T% r: L0 }. `+ mPackage(){ 38,
$ `0 T) Q# L4 O) L375, 0, 0x16, 0},
* o+ n7 V5 @& b( S9 k; A5 ~$ k; L. w* G2 V1 P- Q( u
Package(){ 25,
8 A# h* m5 y" Y9 |8 |  J/ K; @250, 0, 0x14, 0},
1 y4 I' o6 P2 Z1 A7 V2 ^- {8 b3 f& o4 J- M( b, v9 {+ R7 g
Package(){ 13,
: s/ M+ |' `0 R- e& K  t  n125, 0, 0x12, 0}
: B* s# A# z7 i3 g' T' c2 t  t6 K4 Y! f' z7 L3 b5 _2 e7 P
}
9 o9 b- J$ t8 Y4 Y  s' X8 m9 [! e; Z$ Q0 `6 c+ R' r6 ?+ c

& b. s( f; |, Q! M0 Y6 [. ?l
  M( n8 x/ a5 y: b6 V
_TPC" U) m- t; B5 u

0 h6 w/ Q) K* Z) G$ q9 [7 ZThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
; a* q# `$ C& u/ r; E; x; T+ e
! |' |0 ^- f' x' wl9 B. F8 f; P: T- K
_TSD
( h2 P) w  W& n. U$ M. G( G
2 ~( @3 o& h7 i- ^( LT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code8 i: c' `4 m' v% x

" O7 b) h. F/ f# Z" u3 `' {; MName (_TSD, Package() & }0 I9 K4 T3 k- z
$ _. O$ L* m- v1 z0 w7 x
{ ! {( G2 v. }& G0 G4 _" r% I
8 o/ a2 Y& e3 C' S0 `
Package(){5, 0, 0, 0xFD, 2}8 j9 X# k7 t) m0 g$ T
// 5 entries, Revision 0, Domain 0, OSPM
; y% W" y+ z6 |* R: E  E8 fCoordinate, 2 Procs , q- O8 z# {- p! Z$ B' h2 n$ W
, N+ o' H" {% p) ^6 ^
+ j' L! C# ?5 @
}) // End of _TSD object
- b; T* F7 Q# k, W* ?
, x& ]9 a% r9 z# K( {4 mREFF:8 u0 K! ~9 j& W* V* Y
1.+ ^) [7 ^) |9 g# k) `0 P8 a
ACPI Spec 3.0# T8 a) q5 w+ G- j) Q6 g! U0 Y
2.
2 v2 i3 w( |5 W& F' pIntel Processor vendor-Specific ACPI
% {0 }1 W3 x' D+ N* w& S: c 1 B1 P0 \7 `2 |* q1 X; G; V9 z3 Y, |
' ?  V) a& d% y
That’s all!
/ q& d9 M/ s6 b$ ~5 J2 ~
$ I6 X0 l6 ^6 q  vPeter0 @: ]# b* \8 G9 x- v$ l* U
4 Z7 v# _3 ^3 s
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:08 , Processed in 0.048757 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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