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

CPU Power States

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

2 i" U% C. M# O5 c# |+ A1. Overview
8 N5 P+ J: l- W4 a
( k% I: q( b* Y; b( Z0 d! L9 o2 R/ d/ n3 u* Z; d: Q
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
- M9 w/ A& G- \5 v5 P# g% C" ]* l降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看+ Y3 q( p4 r; r: L- [% `2 E
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
" d& p8 h# x* [& }5 G! ~+ T$ i2 D" ~$ `8 f
cstate1.jpg
& n; W. h$ U  S+ T; ^
1
& M2 d% P& \6 i# }) D- M
2. C-state Control
  w( x  f; u; N8 V( c) j# |  q# n; B- v
1)/ ?% d; c" ?/ A; P: {6 s: n: J. g1 p0 I
Detect & Enable C-state/ P+ Z3 f: E0 P6 H. T( E) T2 n' h! l2 W

+ r- z' y- `* |! S% d" r7 JBIOS可以通过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的支持。
( A% V. h7 J: [0 _8 T" m6 c) ]: i1 j! G: O5 T! B/ A
2)3 f% l" E+ |! z1 U/ W1 ]: o9 n
C-state Basic Configuration
: n, O1 |3 Y+ f& s+ z# ^' g# 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)。* ?/ N" E2 L6 Q

& O% k5 d% x. X2 f6 Z$ s! ?# L3)& i8 O. ~5 ]0 j7 C/ `# T" C. u
ACPI Structure For C-state
/ X! |) Z, ^0 F8 s2 n2 A! k
! K$ J. T- n8 B) B4 el% Y6 \7 n$ u, o
_OSC & _PDC
) m$ [  _0 ?6 P6 {/ @; {/ N) a_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
" z/ v, R' S7 O+ u6 X9 ol
+ t7 R( L) }9 X2 ?+ N- ?. S# F
_CST
4 @- S, X4 `  [. l4 f( L_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
) n# [- g+ e1 W9 \3 J& ?CSTPackage : Package ( Count ,
# {  x# }6 U( Z0 h7 k/ Z3 y0 OCState ,…,
9 ^, K4 J8 R! i5 d) }& h8 ]CState )
' ?+ l7 [& v9 c8 w" x* M4 H其中Count表示所支持的C-state的个数
4 O% e9 q! j( t4 T' @CState: Package ( Register ,4 e- q9 e1 Q: E; |
Type ,8 L% q+ P4 [0 Z
Latency ,& V4 E" Z# p3 d" @
Power )( l" R9 y3 k. h  A2 |1 h& T# _
4 `# Y5 h% i- O
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
/ d; `! D' i0 z' c' b7 c2 E
8 u& Y, \. W# I5 UName(_CST, Package()2 X! r# f" P  n

  ]4 A, h$ Z9 y- R  z( M( y{
" O; m$ ~, G1 }- y4,( V! G2 X$ E% R* i/ c0 K$ K9 E5 \
// There are four C-states defined here with three semantics
9 w7 N: [# H8 w/ W* G! F; Z
# T( u$ P5 C6 M  ?9 U! W
// The third and fourth C-states defined have the same C3 entry semantics
5 e6 b( D7 |* ?) \3 v5 w& l

# G; y+ b9 ~& }/ c/ _Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},7 u8 p4 p' C( m1 O. J% O
1,2 y0 I0 `; r* S! J8 N
20, 1000},) \* Z$ D) T, z" l. [% E
. p* Q2 Z) t" S7 b
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,! e- {! B8 ?& a% k7 O6 R
40,
. `, i2 T+ ^8 Y8 D0 Y3 Z750},
$ ~; E+ P4 F$ Z) ]
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
/ P' b+ W6 A3 g+ C60,# S  |; d  O# ?; U1 T) L/ ^5 _
500},
1 k4 B$ ^$ h/ Z7 u5 G; D
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
8 \( [( {$ I2 t5 S  y/ M% {2 O+ ]250}
4 o. o9 M/ M. N% g4 B

, D' a/ _3 J$ S+ H}) # G2 A- h* w2 [$ N6 p
' k7 g1 R, m2 G. ]& r) C
l
+ n% i4 a' D. _& U4 o. f* l' I
_CSD
7 @  N+ f1 l# m* ]; H" b
8 R9 }5 b" R/ I" ?C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
0 j) i0 b4 u3 Q5 C" y4 @: z  v
& A3 Z1 ?# u; U5 _$ B6 j2 R
$ r+ o) `3 q( b2 G$ F) G8 c
/ B0 X) o6 B1 e3 K8 Q
+ Q0 [* g* U- [3. P_LVL VS FFH
1 U: p7 v$ @5 m3 z3 X2 o6 j  Y" i# @8 H2 r, C5 V
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)1 g  j! M0 z' C" X( }. x. N
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所示:
- T7 \0 U& L2 i  `2 J: B; q& M* @2 i  m; O, D2 _9 \
gas2.jpg

$ T. A  Z1 h! \: S, q, q
2

) J& a: R& O' v) a$ F  ?6 [5 iOSPM解析到该_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的一个例子:
: Z! c6 g& y, X) X2 DName(_CST, Package()* y+ G2 g, B7 _
: G5 P; c+ R+ ]+ n( H2 |
{
, J3 I1 R& \/ d1 X* m3 D2 e: _/ A2,
$ P1 H: O. ?- N# u- D// There are four C-states defined here with three semantics
2 B$ s1 Y; V6 a3 j+ y- Q
) P; w" s0 R' K/ k+ s: _8 r2 A
// The third and fourth C-states defined have the same C3 entry semantics4 a# y; v( R; r
) V4 Q( K: p7 E: ~# T7 u# e3 V
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
$ z. y" ]( ]3 X: m0x01,9 V% C! w  z, B" y
0x03, 0x000003e8},; N7 T, T8 F9 j! P4 `, B, t
6 u0 Z. ?5 T; @$ P
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},2 q! H/ Z; X" X: r3 I- ~8 h
0x01," b, ?5 D+ q8 C8 r
0xf5, 0x0000015e}

6 E' k# \: l* V' Z1 e6 c: L}) 4 S3 L/ n) m" \9 H$ h" ~4 U
; Y6 O- R/ i& Z' }# x# s+ Q# n% D" l
. b* \: R4 m5 h
REFF:7 `( N# l- s: a, D
1.
9 f' n2 y! q1 ~. mACPI Spec 3.0+ w3 a! S) E3 }4 K
2.# i1 h: t1 K9 k% R( e
Intel Processor vendor-Specific ACPI
9 ^0 x0 J7 ~9 h- i( t
' S+ W2 E) o) k: _* Q  Q7 P) ?0 ~, y
That’s all!
9 E/ x( ?0 W, r9 Y1 H
# A0 X' d0 ]* h: dPeter8 C) l- Z$ M4 z8 U4 L2 |

1 x- s- z8 K- x4 f+ J' G2010/9/20
" P$ ]& s1 T4 @" x' g8 X# @/ J: e3 e3 P1 _. w4 ]$ b
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
. `( W$ m& ^. p- B2 n( Y7 q% O5 h
# s( }/ x* ^2 I. Q' C( ^4 J7 GCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
5 k: ]4 Z2 H6 b8 EEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
# L+ a( ]# e; ?9 g# D/ f0 I
" S# m$ u# d2 P: M2 M# {: ~2. P-state Control
- H, Y' @7 P( B1 F: X ' N7 q* M/ G8 G- T' B) S
1)
% j! a8 e3 i+ U! CDetect & Enable P-state
& d% p7 ^' r* L8 \1 _. o8 z % a, g4 {8 ~9 J/ ?( z# D5 B
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
( s  N) k. u5 k" g3 D
1 T7 V$ J3 E; K! a0 O6 M% h8 x2)
. }1 @! a$ j. _0 i7 Q; `. D) X" s  {6 qSupported P-states
5 u; d! N2 R' L5 L7 N
# g8 A- G7 z! y2 H% ]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
2 l; w2 I1 k. K" X) {
' K+ F+ }5 A4 o) EMinRatio = PLATFORM_INFO( `; J# ^9 C( m6 D/ u
MaxRatio = PLATFORM_INFO
. u# W- C7 n6 ]' E% p; u  X5 z( ]RatioStepSize = 0x013 t  H3 k6 ]1 q; p: a+ B
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
) |$ s$ m: J6 M7 `& J0 r ) y/ X4 {5 R9 Z
If(NumStates > 0x10)
5 S/ G- t( L( u( L! u; `{$ \+ v% N% u7 ^/ v; z
RatioStepSize += 16 f! m2 Q7 G; _3 U( x2 @
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1& p' J( G5 I+ V4 M) Q- Y# ?8 z! K7 {
}
/ X! X7 `# ^9 d
+ R; K# I! {  H3)
7 b) x% b$ B4 M9 |Turbo Mode) @$ Z: y$ U5 V" Y

( D6 D) [9 M* S& s3 {0 FTurbo 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' ^, i" _- L$ m

" W1 t: t! l% x! [. ]# L0 v* j$ W4)
7 C3 f5 d  [1 ?) Y! M2 p$ JOver Clock
9 ^9 j/ @8 t, c! O' Y
9 l# G3 R4 g- W2 J某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
% l* U3 g/ C- D+ P9 H% F$ k6 [
* d# W5 ^1 d* W; f5)
- i) K. V6 M  a/ C- B9 x& ]& d# Y" \ACPI Structure For P-state5 M8 `, O+ }' }
8 R, C/ L' J& G7 U
l
# {  W2 t& l( w2 d( N
_OSC & _PDC6 y7 L  {. L/ ]4 [
8 L$ N4 T: W, _, T
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures% l6 @8 O: c5 w; ^2 U
8 d5 Y  Z3 E0 T" T
l2 f5 ?; W6 x2 `2 z: v( B" u2 T
_PSS
+ e- N3 L7 ~0 D3 ^. ^* ^# A8 Y$ MPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
4 ^4 ?, A- o- ]2 j& @. G) p并且通过一个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做比较
$ z4 N3 u/ v6 e+ m. ?以确定P-state切换是否已经完成。* Y, h3 G: P: t# h8 P8 ^
# Y+ o/ r' S$ i3 J+ T' h+ Q) }" X
Name (_PSS, Package() 6 {& ]! O+ E3 Y' l3 Y1 z
{
5 f6 j, s$ O2 }- w: g7 F) ^// Field Name
' P& ~' }: b& }  o$ P7 g  b' R& SField Type 5 p6 v0 y* [7 ^9 v
% h. M2 l2 z0 a8 M6 W: s

' @- n- W$ n, u: ?) u" Y
9 g8 Y. m/ H/ wPackage ()
! s+ ?9 j# p9 E$ L5 A( r. t1 A- ~// Performance State 0 Definition – P0 ) s, T$ [$ A& [3 T7 a
$ Q0 B, m  ?0 s) R
{
8 p! A- m2 s, }5 r) X  V1 e4 W1 D; w

, v$ J. G0 k: w7 X# D0 u2 Y7 VCoreFreq,
+ O- \* @/ A2 S  m. m// DWordConst
# U: p+ ~; l- L% ~5 ]# C- f% J2 b: e. G/ O

* T2 X& B$ T$ e* L# j$ S% QPower,
* H0 u: F/ V" }. M3 E/ `0 Z7 i// DWordConst
; j. |' j5 K7 Y$ `
# }# l: N0 V; Y- ?TransitionLatency,
4 L8 u- }( v; i) o7 ~5 [// DWordConst
" Q1 T9 t8 X2 _, f9 S) R+ \/ y. H% e" m1 z+ u% x/ Y- N) u9 ?5 I; A7 U+ k
BusMasterLatency,) Y: R$ _# g) l  k2 |
// DWordConst
2 t# Q% S2 ]# h
- J8 ?) F# x1 f+ ?! GControl,6 D7 B# Y+ e# q' ?
// DWordConst / Y( x9 P7 c% |
) B# p6 V/ g- N. ^
Status
* [- v' ?6 L& i3 E8 Q; w  Y( y2 u! {; k
// DWordConst
! j% N' k. t5 G, ~# ^" S1 f" j$ z6 V; s  y7 t7 J
},
# c' W' w7 J- _2 f* d
, R; r' R4 |& ?  M/ B1 U) @. % Y0 M% [. F: f% n* }
0 Q# S. L( w# x& ~- |
.
; {# J7 |" C" v2 o$ B2 C4 M- C1 L% G
* X; L& W. d) o9 c) \  J7 c2 S* d( Y0 h. : o' w* I' _0 e; A6 U3 K4 e! s
}) // End of _PSS object
! C) N" l0 {8 t/ l& O前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 ' P2 V6 }$ ]; d
! R. v8 a6 A# F0 t4 K) y
Name (_PSS, Package()
) T6 Y+ f1 X) ^+ v) c# G  @* F% S( ~  p! c
{ & r- b  P- @2 `0 A) j" k

& d/ k( E- M/ L4 n* R* P. ZPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) * A) p3 k2 e2 V7 E
: y/ h4 U3 p  |) Z  y; N
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
3 ^1 e/ N# }$ s1 b6 n- J6 Z% q' Q7 v3 \" |
Package(){1400, 8200,
  h$ Y, Q5 x' u10, 10, 0x000E, 0x000E}
. Z, v2 ~' u- r/ j% l// Performance State two (P2)
  H$ I4 d! r: {+ y- o: PPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 6 i+ j$ u( O, u# N) W9 a# {
Performance State one (P3)
5 K' F9 G3 {: c: k. C% x: V& w" Y# S  i+ q# p
Package(){1200, 8200,. b  x, [/ S6 P' H( J
10, 10, 0x000C, 0x000C}
( f/ S; L- [- m9 H/ e- G2 ~* x// Performance State two (P4): Z5 j) ~7 L% y, g1 B

1 y* T6 A  h7 [4 x, h}) // End of _PSS object9 p; ^" N+ M. X8 x

3 m& N" R+ H& [0 a2 Z另外当该平台支持Turbo Mode P0将会reportTurbo Mode
( \. J1 Y! i1 x$ i, s# D
% q$ s! b; [2 q, I+ z  H4 ll
* J/ |8 K+ s% ^5 |! k% O% m
_PCT
" x, u' z. [6 _/ g 5 v* I5 q% b. s& N9 c
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的方式来进行。
1 ?7 h2 @' Y3 D- [% `( q " ?8 |' V7 P+ W
Name(_PCT, Package ()3 w# M5 |. t+ Y# T, g
// Performance Control object ! z' O8 ^, y" _$ {* d

% m1 R$ Q" P0 z; ?1 Q* ^{
: }, T& W% X9 e% m9 L3 r% D8 H) Y! }: o
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},4 M2 G* U: V( Q: B5 \" m# G
// PERF_CTRL . S" S$ W2 S2 {

" o% Z( t- ~: T* k) f# o2 a/ V4 e9 V  K- bResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
4 Q  [4 _- S( j& Z9 A. v// PERF_STATUS
1 z) |' C/ G3 v
- s; s7 H& v- W8 t}) // End of _PCT object
( x8 a; n! u; J$ [
! v: n  v) D/ P/ z  R- V" al
% z5 B! S! P% A: J1 G
_PPC
9 X1 X7 h6 J. K# x
- `" A6 n# M2 X$ K! zPerformance 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
% d3 a9 b3 p7 @6 h7 V; g' j2 M # [( j# d: b6 }
Method (_PPC, 0), u/ f: [) X! [' G$ T. r. k9 |
// Performance Present Capabilities method
4 X: r3 d* {/ q8 \
) l, Z. o# x# }, I0 Y{
! g" s1 R$ m0 Y0 |6 e: w4 @! k; F; u1 M, O. S1 V
If (\_SB.DOCK)
8 b8 _1 L2 }3 b+ a8 c$ q$ D# b3 C; `7 L( W/ f8 M
{
1 f- ~0 c* j/ x% c
% j. w' D$ ]3 b; D* R/ pReturn(0) // All _PSS states available
/ _! i& Z+ }& x0 G: O, `8 [" |
- A( m1 Y( R1 T* i- I6 n) A' K: z$ F% l) l( _
} - N, M' {- d8 j2 s
$ V( K+ e/ r. |- Q7 Y; I, J* x
If (\_SB.AC)
- i. H3 s$ Z5 ^7 e; C0 U
, S% `! Z8 o# o. ]: D, p- Z, Z{ . c* h' u" a, D

9 u1 o1 H% ?$ `2 f! M, jReturn(1)* V! N2 ?& A+ C% R1 Y: c4 X
// States 1 and 2 available 3 Q8 ~" C$ I) @. j' g/ K7 I2 f

: G7 q1 @/ E7 f) }}
5 t2 H6 g6 \9 m1 G3 e! I* H  N8 ^2 s" C& {7 t
Else $ y1 E! \7 t7 U7 F0 R9 r
2 |5 ?% `5 g( z. `6 W
{ " f6 a7 i0 ^" E0 P9 s& t

: d7 j2 d. l+ z" r$ UReturn(2)
3 X3 _5 }6 p& r// State 2 available$ D5 v" B. K4 Q
/ v- F% x: t% x2 W! v! h7 v
} 8 Y; R/ G0 t% b( [* B* o

; E* o1 E  U& m} // End of _PPC method
. ~/ Y3 j% ]4 H * u2 A: j6 v- o9 ~4 o( j* i
l
8 K' r% Q; _* V! N2 C2 ?) d: E  g; O
_PSD
- c4 V$ i! B0 X1 u8 Y7 w0 S 9 H% k8 i5 d+ N( W
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
' i5 b7 \  w) C
" s( ?$ X: P7 }REFF:) F+ k7 H1 W& O$ O  i2 H
1.
3 }  r  {; X' |% ]! B" u* m7 S0 pACPI Spec 3.0
/ r3 Z; ~  d* |6 u2.
2 o; m; K3 c- d" vIntel Processor vendor-Specific ACPI
- M) q/ P- y* b0 l% X2 U  A
' |5 O) J8 m; G0 ?+ j
4 x! i: j) l9 ]) iThat’s all!  ~) W8 r3 f6 p6 o1 Q  f

% d; L% Q; l8 @" |Peter
) c+ l' v% k) N2 s 5 ~; c* r2 Q8 K, L# A4 k
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
3 l- L) P# z, a
4 r: Q- X- c5 e; h3 z4 uCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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: k' B1 g9 ^9 j,影响系统的功耗和温度。
! q& [2 c; ^2 O  U6 ^" o 6 f+ k% i  j" ~) Q+ M1 r! i
2. T-state Control
9 @1 y& _; H: ^, }- T7 N
2 {: n, k% @5 F  j. n1)
. F( I3 |8 b2 Z; R1 w# l( `  bMSR Based Control, T) ^% M2 X5 u5 d5 W9 Q

' V( U) M  G" jBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
3 k( W$ T  u) c8 E5 }7 S
" T# t6 @5 j" j/ a9 T2)
7 s/ k1 O1 U( |I/O Based Control' x. ?+ p- R  f% X! t8 v

, x) \( W9 p0 n. i1 C" U0 k除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
& {8 w$ C% {8 j: \4 { ! C- C) c$ D0 _2 I5 c
3)
& G" K# h& o  HACPI Structure For P-state% w$ ~% l1 ~8 T$ B: N, T( V2 [
l8 ^8 H, I$ \7 t0 F* _$ E; k& o6 y
_PTC8 Z! L8 i. U8 ^

- l/ ^6 {' N2 \4 L0 i0 T9 d/ X% [' z& \Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
0 Y# L' o+ G) k6 r7 _" P/ w $ \2 D% n( _9 [
Name (_PTC, Package() ! B* Z+ V+ K  K; Y- h
{
* I3 k* H) @2 I- s( L
2 C; ~4 J/ e3 H+ o! wResourceTemplate(){Throttling_Control_Register},
+ Z8 x( d9 y/ L) {//Generic Register Descriptor
; z' Q. b$ {( v1 a7 Q4 M! C3 [) ]" }1 ^$ k* g7 t  I; @6 E2 _
ResourceTemplate(){Throttling_Status_Register}/ @7 C2 r6 \& U* h& J$ x, }& O
//Generic Register Descriptor
2 a2 n; u* [) f& s  @* ~}) // End of _PTC& Q# G' T* c( C! b' m
% w7 K5 [- D8 R. H6 e  I- _7 l
下述是一个sample code
1 \" i; J' z8 k- q 7 w/ j2 h- }- I& ^
+ R9 ^$ g4 u3 ?
//( u! J% f0 y! ?6 ~% Y

& ~" b+ K  j- g' h. q// T-State Control/Status interface0 E7 O; Y; k, W
+ P, t& b6 O% B1 j* l6 P% `4 s& h
//" v' l1 D9 o* g, _4 g, u3 _' S3 E

& t! o; N/ V$ h5 r$ uMethod(_PTC, 0)
* T/ H; _& y8 s9 C5 C8 v) T! e3 K$ S4 {$ {
{7 m, l1 R% n& t

, V6 r4 m( z/ K% E, T5 v! z//
/ T/ n) v. t3 u9 a; A( s6 p0 n2 @* h- |0 Z2 }
// IF OSPM is capable of direct access to MSR! e" J/ H* L6 B$ C! E8 \7 m

4 s( ^6 K) g% `/ A6 w* s' b+ M//
* Q9 @$ V0 o" x, Z- E* j, lReport MSR interface
/ v) E; E' }# s! h
3 b: F" a9 ]1 L  L" T// ELSE
9 v8 h) C3 H9 U) B: a4 Q5 b1 J3 j& Y8 h3 N( U& J" w
//
4 w" X( d  b' QReport I/O interface
& O: ]; Y6 I0 ?% v* o( _- n7 P
+ E) u" \4 N& Q6 |//' I$ U% Z' S- q0 X& S8 K* s( d
5 e/ u' a( g2 O3 C" c9 I7 K+ y
//4 g7 O! i4 z/ c! F
PDCx[2] = OSPM is capable of direct access to On
8 E1 }% _& w2 {) i& T6 [2 ?* G- d
. G" i$ [4 O; O7 `7 B//
: C% i' y# b# t+ h" uDemand throttling MSR( t3 a; @+ d( A* o! @
' D2 [1 T6 I; p( }5 a
//
- _  R9 i4 l' `( f" d8 P; D1 H1 t  r
If(And(PDC0, 0x0004)) {
" {; ]# \: f* `, @( F8 J( o
1 L- m0 T) g, k/ M* |Return(Package() {
9 \" V: F/ Z2 m! H- m  |( c1 n$ {/ ], \, l
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
# c4 V, o7 h; t- N3 B! ]# }+ ~2 j- c) [
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}0 z& ~  f* ]  f4 w+ p8 U8 M2 y/ H! ~

" R8 `# ~3 F( S$ j! d})
1 J8 S1 |6 s4 v5 D( F6 E
8 B. Y+ n# d/ I# [- h}6 S7 U3 b0 s. u% Y0 I
8 N' s. S1 `7 T. Q0 m
Return(Package() {% L$ W. ?. ~. {1 R* }9 U

. F: x% @. h# E' u5 v( WResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},/ p5 P9 V1 d2 c* }; z) y$ @+ J

  [) W' }' Y# z1 o, WResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
/ O5 s- n* |$ d( _% I: u& B  s# [4 Z* `: D
})+ m' M" ]% p& U1 e
  x2 t7 ^9 ?  k1 }0 b1 C
}
' [2 f. x6 i" X5 L
$ |! v* F. O5 w: D
: _+ d6 j7 S9 h/ g
5 [9 Q/ |+ k/ g; L. \2 M% gl
7 O  P6 y$ d: V1 L% {
_TSS' A) n. @, a$ @- Z

" M/ b4 r% C5 ^  FThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:: _( g! G, d% d& |' l
Name (_TSS, Package() + u2 \5 \  P. Z. Q8 O+ K
{
+ F, f3 G$ s5 r4 C4 d& [9 Q. {; r5 M// Field Name. h1 G" y8 Y: F: \6 B! X# |/ c: y
Field Type
& s" K1 H& E; Y1 S; A6 k+ ^
5 _1 c" M% T1 B4 h& v& U! v
: B% D  t2 m" x6 d4 J- I1 `+ {6 V3 n6 I& m2 Y6 t( E: D& @
Package ()( [/ C1 {' I' J! [1 \% g
// Throttle State 0 Definition – T0 6 H: p/ F; x# t, C6 X8 _
. w( F7 q9 s- B5 r
{
) z4 f  e0 _7 e: [: n
/ H5 X$ B, x* b+ j% u
6 {# {5 i0 C8 \* \FreqPercentageOfMaximum,
" U% u1 G7 S  p$ x. F7 m// DWordConst
4 }# G, g. t% |9 I
  y, @9 n8 F2 ]Power,
& L+ A4 ?  p$ {; a5 m) ]// DWordConst
2 Y& }- [! h. W+ u0 f
" ?3 b; t3 w8 a4 nTransitionLatency,) X/ k( u  E+ Q  S; h
// DWordConst
1 n2 Z, h5 C5 D* x% x
2 ^4 Y  G& w  F2 P7 EControl,
: L% C# F1 G. w; _% x: `// DWordConst
. X, l' [/ z9 J+ |
5 D# a: j: a& g! J4 qStatus
/ f: A6 b% A5 n6 }// DWordConst ! u9 f  W& c0 D4 P
},
8 }! @, |4 H; E0 g4 F2 h4 z" D/ q/ e……8 w" A1 D' f  k+ [1 ?! H
}  s2 h8 K& a4 b2 p1 g& y
* O( ^1 j8 b" _7 t$ y  O1 e
Example code 如下所示:
$ c1 p  K! q5 x( s# Z7 ^. J( Y( a! c0 Y* \. U! h- f* F" i# x
Method(_TSS, 0)& O; \1 R+ @5 j7 A

. }6 [1 I5 |1 Y! Z{
" i4 O( R; o9 s3 y! C6 q) m* W. E# f# o% b  z, f
Package(){100, 1000, 0, 0x00, 0},
; l: M! r" D" K5 C& E+ e4 I
- s& ~3 J6 p( @Package(){ 88,
  W2 R& d! {: ]* A875, 0, 0x1E, 0},
( _3 K2 y0 u  o& N8 Y% Y! ^, Z$ Z7 h; n" k, _+ l4 q- u
Package(){ 75,
! B  C/ f. f+ f5 \% j; M- \7 k# C750, 0, 0x1C, 0},
3 @1 [0 T0 O0 {
% c1 P8 c" o% uPackage(){ 63,
8 Q+ m3 q+ l8 K! B625, 0, 0x1A, 0},
, R) n( ~: y% ^  Q% j! Z/ G' Z% i2 x. s3 u% E9 X  B" F7 D
Package(){ 50,8 B6 d5 g  D$ |& y) V  t) Y- C
500, 0, 0x18, 0},! d+ f: e; o2 l# l1 i+ M3 k

8 w0 x+ D$ ]. F& \Package(){ 38,1 d1 q' C# Q9 y+ O: V
375, 0, 0x16, 0},% y+ J7 |& w8 ~& m: p. |) {  X! O

3 \2 x2 z( z, h6 g, qPackage(){ 25,1 k9 S/ T% r7 t/ ]
250, 0, 0x14, 0},2 v( l" M2 P; _: A2 S
9 r- O, b* h2 \3 \4 E
Package(){ 13,( J; O1 w  E! m# N  w2 e+ ]
125, 0, 0x12, 0}
1 J9 c& |- n" M2 N0 H' p, g  G- k' G& J% F* b9 K& _
}  z, w3 T' S5 `5 \
" Y6 b! S, Y# H; j

# ~' O, U7 D5 [7 X7 r. Nl
4 s6 o: E! A5 O! [, a
_TPC
: _( i6 e% O' H; Z1 q / q+ b% c  m, h
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC# ~8 q- S, I: F2 e; K; G

' p# c6 P1 t( o; }2 n+ Q! Yl+ B9 t( P$ v, U. {  S' t
_TSD  Q1 w5 o/ d) m& Q- l. O

& O) k- \: I4 W  }1 YT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
& j7 u/ I1 w" ] & i3 L( X+ X1 R/ Y) x" V! w
Name (_TSD, Package()
& h+ q/ A' A; X# n/ T; \- o& c( ~% _/ @' B! I% `& g# t
{
0 C# ?: H/ W% S* P/ p8 Y4 R: U% J" ?
Package(){5, 0, 0, 0xFD, 2}6 `) u7 h( n, `" H+ A& i9 ^
// 5 entries, Revision 0, Domain 0, OSPM 2 c/ I9 E- d0 J, J
Coordinate, 2 Procs 9 @2 W. c% ~3 p4 ^
& R; K5 n$ N( H$ h3 Z/ C3 q

, F( k# p, J# w! \! M+ C* H}) // End of _TSD object  [$ i, T0 h4 `+ f+ i  U5 L+ U

% J4 l9 G3 j! Q+ E/ ~& I8 P" ^/ zREFF:- r0 X( U) |! V+ f4 a4 |
1.
! |  c  F, E* c9 Y+ p) k* R9 @ACPI Spec 3.0* T& [7 ^0 q/ \, k% Q
2.  N# Z/ r. K, P* S1 [" W8 l; @9 U
Intel Processor vendor-Specific ACPI( F/ e5 u# o0 n$ }9 ~
# E- _6 q; Q) k! G$ |+ ^

+ p. b+ D, I) x6 F9 XThat’s all!
/ t6 P6 K7 A' V  n3 A% m: ~
$ L& o  ^! r( e0 c& @1 rPeter8 A% T/ q+ f' g' |% _
  D9 l% R+ V3 Y8 {, x0 l
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-2 19:23 , Processed in 0.809615 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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