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

CPU Power States

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

0 W( Z$ N, P0 f1. Overview
5 b3 }2 A4 b1 ~) t. t0 Y# R( c4 X8 b+ t* ]$ O

; N1 S% b7 k8 G. ~+ fC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
7 h$ N% A, _; {6 z% l) d降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
  W  s* t" q5 [比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
8 E( ~4 y/ j4 Z2 q% H5 Y/ s4 X1 r# T: L* E7 ?5 [
cstate1.jpg
9 Q- |* g& A9 Z( g# I
1
7 m3 e+ ^. l% z! J
2. C-state Control
! ]/ y6 j. }9 f0 m8 R9 r
+ ^5 O: Y1 h8 E2 C% W6 Z  j4 P4 y1)' L3 s# j. v  ~5 q( Q1 _8 `; k
Detect & Enable C-state
: b" d$ v8 z9 `, a4 c$ L( W, l
+ [9 j' B; u/ u" ^! Y& K! t8 U; lBIOS可以通过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的支持。
1 M2 c- ?$ W9 r/ p0 W3 W/ M* N: q" l) ^/ W' D
2)
; W9 y# [) l# e2 o# k" d7 V2 \C-state Basic Configuration
  ^) v6 {) ]4 E; P) ?- {. g通常情况下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)。
- g+ `3 {, u0 t, W4 u# }
  c: `7 k0 C$ F$ F, t3)
. ~* O" K$ p0 ^- C0 L3 O. DACPI Structure For C-state2 s2 j: r' }# g; @0 f1 G
7 ?, E6 b% m4 V( a
l
+ ]# P7 D% e6 H% l4 e5 O
_OSC & _PDC0 z( o: D) x. u+ N7 n8 S' ?& s
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures1 K& B- ~" t! m4 }" f
l
( e; d9 m& ^* u9 I; n8 K8 P
_CST. x# p1 J, N9 M- h  Y& B/ w  x
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
% q- a8 s' O6 r1 S6 G/ y' o& PCSTPackage : Package ( Count ,
% t! [$ K$ B# N# t9 RCState ,…,- M+ k$ V* l8 q8 T6 H* B( Y& A
CState )! s% v! C" s6 c# H5 |& ]
其中Count表示所支持的C-state的个数
6 g1 N7 w6 W& h4 hCState: Package ( Register ," ?- K7 q6 N/ _
Type ,
3 `9 \/ U& x& F. K5 y" R  y4 mLatency ,
, S1 g+ |2 z/ @  A9 iPower )
6 H0 Q# w2 \/ g- V
1 h6 z6 Z( o" _8 a  ^1 S" e$ RRegister表示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
; t: m/ }6 }& F- O2 u$ Z" D$ D. b: W7 i6 o- O0 ~- H  B9 g& Q
Name(_CST, Package()6 J/ M( f  e7 Z! t& M7 u
, w) P# A" H6 @/ n( U2 v- u
{ 4 o" m$ ]4 o- u: a/ G
4,
) p7 ?9 ~* P  d5 e, H% @0 o1 Q. j) j// There are four C-states defined here with three semantics

5 D, M1 ?9 c" Y5 n+ ~- d- z1 Q' E6 a
// The third and fourth C-states defined have the same C3 entry semantics
* C" B( r0 M! c
: B8 f& a6 Y1 I8 M# F, V
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},* Q% f/ x4 J! n% I
1,: l1 I  z/ t( M2 {3 w
20, 1000},7 Z0 e- R9 J. f
' y+ r+ t& V6 i1 f8 U
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,4 t5 k8 b, ?$ `& {' V
40,
' J  \1 [5 J' k9 ]  W750},
& R/ V& s/ u4 _+ I: a/ k8 H7 e
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,, W( U1 Z+ p/ v0 _, ^' C1 d0 ~! y
60,7 b' c& V+ @! d% G
500},

# X/ c3 A3 k* e) G  HPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,  q/ v& b% @2 N# u# S: z
250}+ l) z3 M2 }. t
% }) Y5 N, `- \7 ?. A
})
( M" ]1 F' X5 A( n( A7 S" b. C) |& Q) q* J& a
l
# j; B3 U# {& i: S* N. m
_CSD
1 e' [, c& Z6 F% x1 F# g
1 f9 I  N0 d6 d9 O7 k! X( B: qC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。  U* H* N) ^* n2 y( A

9 ?3 R: ^5 o1 T4 ]- [9 p; m& V0 l& c2 D; O) }8 m+ M
0 P+ z2 w% W5 n1 Z, T
8 i$ a3 v( X3 S; z" q* g
3. P_LVL VS FFH5 f# K" I- m) _! O* C8 C
) x' L) x) Y! Q2 V" t. i% B9 ~
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)- s. E; [9 m: M7 z. [# y
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所示:* e8 j- {; H3 @
3 N. G" E5 U" o8 L- z% a: `
gas2.jpg
1 ]) Y, E: \/ {
2

9 u/ S- E7 e' S, D$ R4 OOSPM解析到该_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的一个例子:
6 W. r  t* R+ \! t) m: IName(_CST, Package()
& u/ E1 |* p2 v9 w
2 s/ x2 r2 Q9 G1 t* k$ U: f
{
* G8 h9 N) [8 g! M2,$ ]9 D; W/ ^% l' Y7 m: i
// There are four C-states defined here with three semantics
1 k% h+ D' i& I& W5 @

# ~3 {% K4 T- ~// The third and fourth C-states defined have the same C3 entry semantics
8 T( i( \1 D4 y9 @! g- P& x6 W: L

/ k9 C- X+ S5 H8 A, @# ~  jPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
- [8 k# R, |) f, `; y! l, @, N0x01,8 L* ^9 A+ A5 y( n" ^( D; T
0x03, 0x000003e8}," D' e; \) ?9 d% _

% ~* k) L7 ^! z+ n$ q& N8 r/ q, GPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
" e" z. A0 ^) u2 J0x01,2 t* J' B4 Q$ g- C8 M& y# N: u
0xf5, 0x0000015e}
5 W1 ]) a! l( \% |5 `9 n/ x
})
2 x& B. P/ d- f- s: Q
& |4 [% y6 S2 L' S+ a! E
/ T- Y1 R" W, t( h* y1 R3 pREFF:( |. n, M  ?6 ^! o7 P7 W( F+ o2 p
1.
$ O! ?0 G: y9 P! j/ }' EACPI Spec 3.0
' u/ z0 }) c- P* O) Q' x/ s2.0 G6 t5 r" y# [- l5 t
Intel Processor vendor-Specific ACPI) x+ _* |0 b- K
# N( A1 W3 B+ T

! R+ _3 X/ _# k  A" NThat’s all!
0 }6 D( G& B! I* z* O7 `* T7 Z$ S8 ~% l
Peter
2 n; L4 I3 F# W; ]8 z; C4 a+ l, |* e& O3 n9 _
2010/9/205 U# f$ N  [5 B
) i2 V! i9 n5 C) j5 Z" M4 G6 n
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview: C$ X: `* ]" R/ c: j* J

' y0 h4 u# z1 o5 k. l9 hCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST$ \7 ]1 m' w2 z  i0 J
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。5 d  b& y. W1 W' ~' U

7 {" X8 E: _% c1 A  K: C7 b2. P-state Control7 D: d( F2 N, y( o6 c+ d
5 Z& l8 F7 q( Z2 ~
1)
6 s0 P0 z+ r" l6 ~1 G8 vDetect & Enable P-state4 J6 t6 h0 R, P" z9 T% @5 W, e

  k7 o0 u8 H, h. Y  |5 S) bBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state/ |1 F" _+ u9 ]( P0 a+ V& u
% z, G! ]/ f/ k" _
2)" P" L% H* z% W. r9 y6 X
Supported P-states
2 H! t7 {! U8 j( a7 y: O+ k* K
+ M. r' Y* \# n! U1 jBIOS 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  ]; @, K3 G. `7 H3 z4 s

- Y! t$ K8 @# `9 nMinRatio = PLATFORM_INFO: R6 S( a# S0 p0 z
MaxRatio = PLATFORM_INFO' @* ]9 B- A# U. f+ Z1 U1 }
RatioStepSize = 0x01; y+ C/ r% R; L8 Z' R
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
6 r& h8 I2 L6 }4 K' I( u" e. s4 d 3 Z" }1 b7 Z3 e. e1 ~
If(NumStates > 0x10)
1 z* k  T/ H+ C+ ]2 b{5 @/ w8 ^6 |  \6 O* F, c- ^/ @3 G
RatioStepSize += 1
9 C( q7 W: b( A0 n! JNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
8 _* B7 V, E8 e  z( W7 F}
0 k! J  k) t5 D6 Q0 t 7 e6 c$ ]8 C4 x( s/ g1 K
3)
$ U. b' H! ^3 ETurbo Mode
; p0 f8 B$ r# a5 S) H% X
! A; F1 n- ]% J+ A  c; TTurbo 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 ModePerformance4 e5 Z6 b- j. E  M
4 R" k% I$ h8 ^& h8 S
4)3 i7 v( r) e# |1 d3 G# X
Over Clock7 z$ }% |! V2 ~7 G3 J5 F4 ^. D

# J5 _7 m4 ?/ I3 Z; P$ p某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
. I0 m6 l! W% v" Y- f: P6 C8 k; ]' i / {, {1 Z2 y. t# k# X( n
5)0 E0 o( ~7 f2 B8 r* {! [/ \
ACPI Structure For P-state
2 k- C* D$ h) \5 N 5 q$ A# i/ m2 n
l& r$ D% Z3 Y' u% P" R( X& D* O
_OSC & _PDC; S5 n8 r* x% z  a6 ~' v8 G
% E5 C1 K/ b7 k
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures9 I; E- P0 I4 f6 \" E

3 a6 @5 i4 u+ r* K0 O3 _' cl
( y  x2 N3 z( n. _3 y; ?, r& O
_PSS
1 b: I2 O: d5 Q7 _- I( t2 {8 APerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
; O: E( a5 b7 e; A! g, j并且通过一个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 W" |" U- K# V8 J3 V以确定P-state切换是否已经完成。' c9 r8 A( d5 I; P4 s

0 M6 b" i' K2 O8 q& h7 }+ mName (_PSS, Package()
5 U! L5 N1 g8 f2 m" @8 Z* z8 R; w{( q8 t" I( R: U5 O
// Field Name8 m7 S6 n+ a! W. m' B  v
Field Type
7 Y" R) N# l1 r+ ^. ]. p9 g( Q# U9 g; ~: c( }
" ^' x# ^2 u; V% `
7 N! g" Y0 `, B) n* y( ^
Package ()
) X* v6 o  B" L& x& s2 N8 K// Performance State 0 Definition – P0 4 o& H: z2 D' e6 O
! b1 w& A+ j: d
{* B0 u5 f! y/ M4 G
& y; |! D3 ]) j! p' A+ M& p8 C

- D+ Q% g+ T6 ^/ g7 \" ^. C2 @CoreFreq,
0 n/ i! \  E$ k4 [// DWordConst ( b1 _, ?- o; ]2 e. u& m

4 A" y# @; F4 o( B5 b% h
1 W" I8 S& E  x# [+ ~) cPower,1 J! c% ^9 h; z! O/ R
// DWordConst
9 Q& o& w4 o3 ?; K. Y1 }7 ^
7 y) y$ U8 p9 KTransitionLatency,! B% Z! e2 t( T5 a* M
// DWordConst
) [9 H" }  r0 x# j
5 L8 E. S! H, eBusMasterLatency,
4 O# L+ R1 G& N7 Y// DWordConst " W" L, t+ m5 r6 A0 t6 J/ ?, ]
% A: Q% c! q. E3 F6 p! P
Control,9 O' ^! Q# ]1 V& G
// DWordConst
$ Y. B% S' @0 R/ }9 a
* W$ e; c( v4 p3 s0 PStatus7 m+ Q9 ~' |, C) S/ [
+ p3 I) N! g" {! c; [, [5 b3 {
// DWordConst
! L7 @# d. |: \; t
9 c1 C/ U% l( U  P" g" S},
1 ^, \7 G, U  n
1 J3 s9 I$ ~4 t4 f! }* Q* k. 1 D6 Y& M5 U8 x% x6 S/ S
4 z. l7 ^  `' \' |, J( U1 @
.
+ w# B0 S3 d8 I; d( V- j% H+ U" C: ~. b+ f* @3 o+ V: D* z
.
6 c: G! c0 f6 a( @+ j/ e+ m}) // End of _PSS object! q/ B4 z/ r. l; [5 @
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 " L6 |! a( o( ]" F3 j& e
  P  g* {% f0 {* d' S
Name (_PSS, Package()
4 K! T) Z3 h3 F2 |. E
) P+ e7 h3 }9 v4 A{
7 @9 I& i9 E# x. M! n7 b- y* n' Z- S, c" M( ]
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
6 k& Z. _5 s& x5 v! d' [
! L  B% Y# c2 Q9 [; ePackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) : b5 y( e- w, r9 j
+ g0 |0 H# e8 m. H" V0 z4 Q
Package(){1400, 8200,) C9 o1 U& F. W# n2 \4 S7 x+ ]
10, 10, 0x000E, 0x000E}
; S: i8 H  L. ^8 Y// Performance State two (P2), ]$ i- _4 T8 m
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
/ y' K$ \/ @: g6 ^* UPerformance State one (P3)
! N5 C$ B: o; d/ x5 I* G5 y
4 P% I6 k3 k3 C9 ?) FPackage(){1200, 8200,
: c2 Q  R- @" B) o10, 10, 0x000C, 0x000C}
' O* L: q: x$ O: b$ u// Performance State two (P4)
& t$ p! P7 q4 q6 n- e" t5 B- Z7 b" Q  a  {/ S0 ], _7 A4 J* f
}) // End of _PSS object
5 S* i3 `; r& v( A* B% |! M
9 o5 j% p" }3 ]) ^% ?, m* {另外当该平台支持Turbo Mode P0将会reportTurbo Mode
9 F( a5 _% D) f; p5 J0 C! k0 g + p" j8 V. Z. S: ]1 W/ I; @9 ^
l/ R+ x8 |- }- k7 l) a. _* m# \$ n
_PCT2 G* c, P( D# m; t

+ t( c( o* F( CPerformance 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的方式来进行。- u* [9 C. r% n' x# ~& c3 ]

* @+ i* J; X+ y* dName(_PCT, Package ()3 U; b. }, Y" e/ v3 Z0 w9 }# d3 Y
// Performance Control object % U% q0 f1 f# S/ e

7 o5 e; @9 U" _# |! `{
( G+ _+ u) n4 T2 v5 l$ h( B  S+ Y# p) d
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},9 O2 E9 [& _5 t% M5 j1 y
// PERF_CTRL
+ }% C% P- Z  j& t. H/ j" r' u3 }+ [7 H. N+ [3 i0 W
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}$ E0 y6 i5 w# U  r+ f; f
// PERF_STATUS
; Q( R( L! Z( c3 `# c- \2 F! L2 v8 G0 ^6 a! L. _) h+ q
}) // End of _PCT object
8 c; ~: k! h6 x : S* W3 o' I7 n* h
l' S! t7 p! X" f7 z" r; k; O
_PPC! d. ?' K9 y" U/ V; Z  C
7 v  F5 s9 E4 i$ l* a. r
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
  n0 U; d/ x, X1 k5 h% H / k; ~( r* k* N' A4 W8 y
Method (_PPC, 0)
0 J2 S/ @0 B7 [$ C! G// Performance Present Capabilities method
1 ^$ @  V. R/ c' N( G- Z, P8 i! z" }
! T# F' v% Q5 }2 h3 B5 t. r{
& i6 A/ d% K9 T2 w7 \9 f" d" g* [! l. ]1 r) Y
If (\_SB.DOCK) 6 m( E5 I+ I0 V1 u% I
- J2 p& ?; U3 Y! q3 q0 M
{
' q+ U& I5 q  o" d) Q+ F9 z8 r2 J# m: @9 ]1 [# X
Return(0) // All _PSS states available/ Z2 K* y+ X  T1 T/ M: F' i6 p. n& J

: @/ v* d. S. |5 Y9 p  b6 R9 C6 L4 [/ y: u1 k7 s
} ! v: S+ ^  X" D4 }4 E' E

& d- ?4 \* Y3 s' p6 oIf (\_SB.AC) + V9 ^. Q9 D$ W  Y& p
2 t, W* s( N5 }0 X  e
{
0 Q- f3 ^( w& N& p* n) g# e! s3 T" j
Return(1)
8 ~9 F( u; k1 T// States 1 and 2 available
4 J, M0 j8 Q; U0 E' T! w( E! o9 I/ ~% f- ?# R
}
3 S; p' O# U- t/ W6 _/ I( ]$ m% [8 r; W
Else $ i1 L4 x. s! b  }

( H$ y- z4 u7 a: U* l{ ! s) t+ y2 @" C. ~& [/ G, D% Q
  X  @, O8 S% z- i
Return(2)! t3 e, L: K, U3 i# y  Q
// State 2 available
6 v$ n; c* U7 d) M2 ?. S# N0 Z$ r4 a% N; Z$ [) ?# Q
} ' b( P- [( j. b  a. Y+ n

) Y  o% V% L. Z2 P6 c& H} // End of _PPC method
* ]3 }9 Z; i# \, O- N3 k1 a4 S4 F# X
) y  p1 ~9 d& k" w8 F$ I* j$ |$ s& gl2 ^" [4 A7 [5 C: V0 n
_PSD/ K4 |3 V, |2 O! O- k
8 e& F4 r5 k( z) t5 M/ _3 b7 r# Y* a
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
' O/ ^0 s5 {5 d: ` # A+ ?' P8 u% d" Z
REFF:
9 ~9 K0 x) }, j2 J& v1.
7 N0 j1 g$ @" X; _ACPI Spec 3.0
: ]% B1 M7 L! N; @/ w6 N2.
9 L$ i# U7 G4 UIntel Processor vendor-Specific ACPI  q* M6 s9 J0 N9 R: D' C
# l/ D% I( U$ A) r0 Y+ v' W5 o
! H5 B8 s' l& h5 l0 C2 ?
That’s all!  N) U, d1 f# t  k: m

" n7 P6 i/ j5 z# ZPeter
# Q5 ]$ D4 L2 u2 @2 ` 9 Z8 l& ]% i: _: x
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview. K, P5 o4 j. S) r6 m+ f
5 ]3 [8 L/ T$ g6 h9 {7 k# R4 l
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 T) a& Y& R" `& x: n& Y" F,影响系统的功耗和温度。
! I, x% L9 G3 O: o  N
: D6 M% H, B9 {6 {& H4 M2. T-state Control- {2 a. b! V2 j0 G( R7 a

. n' t1 K0 L& J! F1 I1)7 n8 L0 @2 t+ ]
MSR Based Control
7 C% n) x7 a% q3 H 5 R4 E# S! ]/ U7 @, }
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 6 D* w; f* I3 S; g

$ A, e' ?* w, i* s9 a2)" }2 |9 [6 V# B5 a/ W
I/O Based Control" z. i  r' |7 O0 f8 q/ G
" s* U2 m- j7 {
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
5 i6 k# u9 k3 L+ q- R % n7 R# }+ t! f/ T+ Y
3)8 ^/ j' d0 ^' X7 f
ACPI Structure For P-state6 }8 W* r$ O% G! A; T- P, D! d
l; W1 E" Z1 i: N4 q
_PTC
' [7 f& M" _6 ~" x6 P2 b5 h
: d( ]6 g, ]9 M4 u0 I  ?Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:& ~6 C; f* I% I7 [* ~: ]; x
4 A# u! t  F$ _7 l
Name (_PTC, Package()
1 O4 |0 X) v; p% H{ 7 Z( L! @# h* c* o  T

/ V9 W/ h3 B/ AResourceTemplate(){Throttling_Control_Register},; k5 G- c' D+ q3 H# y
//Generic Register Descriptor 8 I' w7 E; ^. Y* ~3 S

7 B" Q0 _/ H, i" {3 V9 wResourceTemplate(){Throttling_Status_Register}
  _+ d: w9 Q- L0 ^+ F: i7 @3 [* G//Generic Register Descriptor 1 ?  Y. _% `& j7 s
}) // End of _PTC3 o% C6 F4 h) |7 ?

0 W1 L5 ?$ l% B/ g% K下述是一个sample code+ ?3 b3 R1 f7 o  G, t- ^! y2 x

7 a- ?% y0 P3 j' h3 Q( p# F
* P5 Z7 e5 ?4 u6 ]) o8 t
//
$ G* d* R& d# h/ v
; z- {% i1 a" T& f, Y3 i6 U- m// T-State Control/Status interface
  u3 H0 V: y: _  |% `; c6 W# H
6 I! B6 }( |; q# H% |2 e//
$ I3 h3 A3 B$ `* `6 E( S0 g/ d1 u! b/ R: B3 a: Z
Method(_PTC, 0)* C8 A, [4 R( Q
7 Y, u2 V6 X# e5 u1 `! J3 J% ?
{
' U/ T) M0 I: t- A, X( y  u- b. r4 n8 u4 Z- Z3 ^' y) W. ?
//
3 s) G2 d+ ]' S1 C; o1 h( y" S, o4 X4 J: _
// IF OSPM is capable of direct access to MSR
& A/ Y) G# ~! c
$ B) S: _% e  k+ {1 }: E3 T( d; Q* |! Z//# o9 k  ~7 f- [" e
Report MSR interface4 m& H! a+ p% v0 W8 T' s' U- F

& a0 `- @! M2 A1 Y8 n- e// ELSE
* K! K. S  i, \0 G$ |
, T5 h! B% @4 r* Q0 x//( @/ R  Q+ k2 M7 p$ |7 F
Report I/O interface
5 M; B# ]* T; d6 I) {" |& T9 l
. j7 ?, {1 F! n( ^//
) e4 `8 k1 Q, w" L. i& y: F/ i: G/ K. D2 L
//' T! ~. b! a6 A; D9 P1 Q2 n, g2 F
PDCx[2] = OSPM is capable of direct access to On
. i9 Z" k0 @% p7 ^) b, H1 h6 N5 B% j8 Y; F# e
//
0 y3 f' W# r  I  ^Demand throttling MSR: Y2 e  Q6 L! D. z' E3 a) {% Z7 w

+ r8 B8 |: A* i' M$ X- p//
2 {' v7 o4 R6 `3 w; ?! f( i
/ Z, L# b7 x$ C1 u: o5 C6 ~If(And(PDC0, 0x0004)) {
* m- \/ J+ B) S+ H3 }6 j
+ l4 _% P6 X, E9 ]Return(Package() {
% _$ I7 X# M7 L6 n: b$ i, s3 @
' ~/ X  E0 K0 P) S0 E3 o2 Q' A& l: _ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},# x" A- ^5 d! z& F, p6 R

8 s. @/ R+ {' n+ k% Q4 f6 ?ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}+ h( r- W9 }- b4 S& Q, r5 y
9 [$ X. X0 n% l. U
})" `% [$ c6 i7 j4 P) \! G

( y) `6 A7 `6 }9 ?" N3 q}
; B5 _# {% \1 |6 }5 e" Z
% q3 ^) T$ m4 R. M0 q1 k. VReturn(Package() {* ^( K" P/ }* K: _* u8 o
/ ?% I3 V1 p8 ^+ n' G; ?
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},5 T; p! }8 u; s* I/ X
0 W) z6 z) r/ E4 W- O% K8 I
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}, {* q- _% T; p9 D8 m( ^4 n  r

8 O) p- u% Q; a})) R* p% O' y5 |9 Z) M- t9 r9 G7 ]

& d0 G) F$ M8 H) l1 f% m3 E; d}
1 R% S9 O4 ?4 x$ S9 }/ a9 G+ a7 O5 S) u" O3 o) _
' @2 v& |3 ]" B, ?% E" {1 n
, U3 U( G# k4 b( ~
l
* L  S/ ~) O6 v6 I# p- m5 m8 q3 W
_TSS  G: M; {8 t6 i9 D' F

! K1 [" Y# k& y9 ]1 {/ Y% QThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:& z4 v- t) ?! v' k( f8 W
Name (_TSS, Package()
" y7 F# W5 C2 b4 q# k. _{4 T2 M6 @1 i* k% C1 V
// Field Name
  Q0 m8 M$ a, D) WField Type
; D) A7 P  ]7 t" V) m0 Q0 ~) m7 e4 w# @1 I3 x3 l9 A

+ J. w: C! G; r$ Z) M3 N
" x+ A6 J. Q( G& Q  k9 GPackage ()
) c9 C% v' t+ }9 a7 N// Throttle State 0 Definition – T0
  x' T9 }, A( v( W: Y: p1 I$ H
- A* p/ p7 d/ ~) b{9 W: B' J4 l5 g! ~' V( U3 c& m
- G6 n, e* h6 X  t1 |3 O
& K* P0 `' S: G# Y" I
FreqPercentageOfMaximum,; k" O8 F2 w3 t: B# D4 a1 h
// DWordConst
2 T) Q6 ~$ a7 C) _8 ]" w' J5 g% g9 }9 m3 z
Power,
8 u: X+ M% Y5 V+ [8 G1 l# l, U- w// DWordConst . Z# S* U4 ]7 ?& f# X% U
; a: W6 w1 m) a. {
TransitionLatency,
, X* U; X' {2 @' l6 [// DWordConst ( o( G# i: _+ {: O& U# J) Z* C

2 @0 B) f* h: O/ Z% l- vControl,6 y. F; \- O) f  e9 s" E, V
// DWordConst
' P6 T1 x- D, n4 ?( u. i& I' y3 z1 ~7 n
Status5 f  c1 Y. J8 K3 G0 W7 L  T* Y
// DWordConst
3 d0 t+ A, o$ m5 ~},
7 }, c" x, |% ~+ t7 U! W+ g……
3 F+ n* B- ?) t6 {7 I7 V, w$ w+ }}
! r2 G' J6 c1 U; T# s8 Y  y3 e+ L, Y+ O4 _5 m2 ]4 A
Example code 如下所示:
1 m2 l. m% W' e
+ t& i5 _9 D+ BMethod(_TSS, 0)) k, g5 F+ c: K; F, ~

4 W( v& x: K/ _, d{  Z$ r5 S% b  {' l% p

" p: m( t, `3 }  JPackage(){100, 1000, 0, 0x00, 0},. i$ [" i3 t7 Z' @, i" I' r& l1 b3 T

' r( ~! \2 m4 r0 @3 ~Package(){ 88,  ^0 b7 o% z* K
875, 0, 0x1E, 0},6 K$ V8 I. D% i4 @

  w% Y3 a5 ^! T+ sPackage(){ 75,
# g' W$ t9 d% |/ T( D9 ]* T7 u750, 0, 0x1C, 0},4 w( z3 }, ^5 {0 Q

/ \- ~5 T0 ^" p! `. d7 g2 G% M4 O  }Package(){ 63,
- h, b8 U$ R- p9 o0 x; |7 m625, 0, 0x1A, 0},
. O1 ~/ ?0 m. t& t: R2 o- n
1 R0 P) v* D+ C5 A, mPackage(){ 50,( q# q* ~7 X4 f" P; ^" P
500, 0, 0x18, 0},
! W' B9 _& w0 J" A& Z- ?
* p3 f3 H3 K, b* \) f( {' ePackage(){ 38,/ T- h0 O. p2 A! S; S: J
375, 0, 0x16, 0},
1 S% p4 _% _( x% ^. c/ h  `
3 |7 r4 S. t7 O# d5 LPackage(){ 25,
* Y+ s8 ~1 ]+ j3 H9 ]  a250, 0, 0x14, 0},
: \% B" Q: T" M% h: t* b3 m5 o. M! i
Package(){ 13,. D$ b. \% j' J
125, 0, 0x12, 0}, D& e# I8 J9 T) P5 ?9 p

# L" U) k3 Y. i4 s. B. n}
* u4 c# p) Y  l9 q' t
8 Y8 p9 `1 h, U4 m) h( s$ E% |' Y: t" A: n
l
7 H( [, K# S  X& G
_TPC
8 l3 T9 V6 [; C9 l* s7 H
0 M% k1 R; i5 C1 {9 tThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
" X- s" m: c7 W3 p1 X& x$ C . ]& [% Z4 M# r9 H: B* E
l
* m( v8 ?# r) ]8 M) [$ A
_TSD
1 C, D! C+ p4 ]. X) a
) L, \9 q5 Q) k1 {* kT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
# s( C8 \; [$ }
2 h6 W0 \, P- A0 t  s* \& kName (_TSD, Package()
/ V: H! n5 n  t# }5 D; d6 s8 n9 _, o
{
& [9 C8 S, _$ R* w( ~7 ~
/ j. M+ m6 Y2 T: J3 i7 ~0 a7 c% qPackage(){5, 0, 0, 0xFD, 2}
, V, ?! l; \3 G( }0 H" i4 k// 5 entries, Revision 0, Domain 0, OSPM   o5 l) @3 |/ y. O
Coordinate, 2 Procs
  }% B0 q" _: B$ \2 |' [
1 p& K% O% Y+ x' x* b
# D, `; V  J) w1 t}) // End of _TSD object; @9 w, ?2 R  v! g5 h5 S

- t+ E, L+ U) ]$ g. s' T* E4 IREFF:/ J4 ^# j" f+ b! Z1 k
1.
8 Z4 e: K  G4 {, i6 L! h2 SACPI Spec 3.0
9 E- W& s1 k# o7 N" t2.
* b- S* r+ Y% [7 fIntel Processor vendor-Specific ACPI
; F5 X7 `- U3 h6 r& T6 X! ^
' U1 v2 \# q* t1 |3 W! }! l : U6 [0 ~1 J& U3 N5 |$ ^
That’s all!
4 |' N: G" r* d( j0 c& _" | ( `' K  s, L3 C( L4 J! M1 V
Peter
+ D! ~* A$ N4 n. B
0 i- Y1 g! y* k4 A% i2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 04:14 , Processed in 0.074614 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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