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

CPU Power States

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

3 b1 B# v# m9 {  a2 S1. Overview* g) C% b0 f, ^  C- L; U
$ [& Z# k5 Z& b* @, J' L( S* ]/ o
2 }' _( _, v4 d- N0 u5 v  W8 L( Q5 P
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
; z, _: b0 v! Z$ H" _2 Z. G降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
1 N' S. h! b2 b3 j- {: ]比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。$ d( I& r: k# b
/ g4 o- F% W' n7 a, W2 f8 X: \( J
cstate1.jpg
% o. r5 t! T6 \8 W9 i: q- j' x
1

3 w3 ]9 m+ Y! F, Q1 ?* @) M& a4 b. t2. C-state Control- H) |% A* Q/ q4 e# |
2 r& n- n" s' r0 c
1)
9 e( z* O- T2 q: r) l. rDetect & Enable C-state; _/ N: M5 o+ }# {6 _. j$ W

& B; ]5 f% I1 vBIOS可以通过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的支持。5 c$ T8 |4 T) C- K6 I7 E) c

8 x5 _8 ~. n" X3 L- j8 d2)
/ h5 Z( `4 d9 c9 QC-state Basic Configuration
( _* w& m% `8 P' J! t8 r2 Q' o通常情况下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)。. |3 K$ P4 L& m8 q8 p, d2 f

9 Q9 }) A* Y# A% O3): h% u- w( K. ~8 M
ACPI Structure For C-state3 C& B) h$ o0 `6 j
  {& P# s$ o" H
l' X. a6 ?! w$ z, o$ R9 Q
_OSC & _PDC9 I" N7 c) k7 a8 }
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
- W8 z2 W* z; u2 W6 N4 E1 [l/ S6 }. t/ C$ \6 ~, z
_CST9 i9 Y$ M9 `' A9 e. t6 g4 m
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
" N  E- A  F0 U1 KCSTPackage : Package ( Count ,, u9 E1 |" F8 n# P& \8 C
CState ,…,: [, E, w6 C& Y6 t+ s; Z. s
CState )2 C0 p, R$ z# {5 Z) e2 o
其中Count表示所支持的C-state的个数
1 T7 a' Q! y* c0 ACState: Package ( Register ,- g# ^9 r' _9 D3 q7 G# |1 Y4 `6 \4 u
Type ,5 ]/ b% w! a' S
Latency ,) _& L8 p$ K% l. V( ^5 V
Power )* F! W$ T/ P# p3 s2 S, w
3 F0 E. n5 l( g2 l
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  {: i: K2 R2 x; f$ \
! ?1 z- @; p& b" w9 r
Name(_CST, Package()" h$ ^9 @" v/ \2 Z

& k% L: g9 v( v  R; e$ H{
9 D+ d/ B: {5 T4,5 ]  p! m% M: z) ~7 k3 Y
// There are four C-states defined here with three semantics
) F& Y+ ^. P2 B% b

! [3 o. S' a0 @" s5 z/ Z- `$ p// The third and fourth C-states defined have the same C3 entry semantics3 ^; p0 f2 y8 N2 w; v* |

+ l( I# y9 g5 j: mPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
0 X# `  z0 M/ b. Q1 ?1,
% ?' Y/ W5 ?7 I# L20, 1000},
0 K. h/ X$ g& ~

- z6 D0 ]9 Z% _$ bPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,1 l% p- R9 H+ M- U: w+ p
40,) f0 l* S& |  V/ X
750},

  t: T, U8 }% q# H$ K: f2 XPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
, w2 l7 H5 g1 F( i$ N/ B! h4 K( f60,
$ o: a4 q+ Y' g" L7 ]& w500},
( T- e' l6 V' K/ i3 Z
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
' C/ E# u8 S0 l0 n$ l250}! V% P7 A! X) B' \- C' u

8 y. p, t& w) R% I& Z+ A7 C# s$ \+ \})
& c4 q; H6 U1 D( R) P9 e4 J* a1 a) t1 Z( i# h
l) N6 H6 u1 C$ b$ B5 X( l
_CSD
; q0 {0 S* L, Y* ~1 ~5 j" T: e+ F, v2 c. x
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
2 k& u6 {7 X. Q- P5 `- {+ K# |( X+ G2 |2 R4 r7 Y, N$ F# ]

( S$ x# Y0 t$ d7 t4 \4 G* {/ M
1 |* p" c' @. I. A2 F+ ]/ Z# V
# M: X6 r1 T. L" r" s3. P_LVL VS FFH4 ?. s% B! d  P$ E0 G" U! U7 N
2 U- J1 Y* t$ I. f
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
! p' S* h& B( s( C% HFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
: j% _% b9 N. ^; y& D
6 v, w6 R  M" {8 u  R0 M
gas2.jpg
: q* `& @! w  y( }1 Y! C
2

+ {) \- {3 k! w+ a: ROSPM解析到该_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的一个例子:( u) @% P, ~9 O  p& Q- D
Name(_CST, Package()
: `4 h; h6 R" d4 t+ O$ O3 g) X
0 e$ ?; ~& M' C2 x3 V
{   s3 ?: T) ^: y
2,
* F0 w3 |6 B: l1 M* S. A9 V- R* b// There are four C-states defined here with three semantics

+ P2 c& o9 M' t5 h( I2 a9 i9 I3 S0 Y- j) `# |$ c& h
// The third and fourth C-states defined have the same C3 entry semantics7 j( J0 o# w. {3 _+ O( V
1 O/ X- ^: @, i4 ?' i) y# c5 e# e
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},6 ~+ @3 U9 `# O( j8 B3 A) n7 P5 x; \2 d3 l
0x01,6 S0 E8 I; u* n( D. s6 P
0x03, 0x000003e8},
& k% D/ U9 n! {* Y9 f
' `* C3 t0 i( R% z  W4 Z2 m
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},2 m6 h) l2 K& y+ T+ t
0x01,
5 h( q3 {8 R% @6 j, s0xf5, 0x0000015e}

1 L' }( q) B$ l9 b  Y" r9 Z2 I/ n: T}) 2 p0 z+ E: [' D& R% [" s

+ g4 Z  v; Z/ M3 n  z* M2 Z5 m+ p: u2 f- \2 z; U
REFF:
0 `2 K" J7 R+ Y3 M; @" u# Z, I1.% s4 I# ^* Z0 P9 s( @( j  P
ACPI Spec 3.0# y" {# g4 F1 t* j
2.
6 x; b9 X. ?- H: pIntel Processor vendor-Specific ACPI
- p5 F" E# R8 o  A+ W
  {7 g- H5 i! I$ y, |" @/ V/ p$ b1 M, t
That’s all!
- f# h/ o! N6 X; t* r: P$ S! S% z- T4 y: Q( D0 j
Peter# A  E/ R4 s& H- C: k( t( P
7 i$ [3 ?/ u  A" |: i6 U, n( e) D+ c
2010/9/20/ Y9 |1 S  i, t5 z

/ p$ N% o; R8 r- f/ Y[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview: ^4 I- @3 V+ `, N4 w$ q3 K" J' @: [
! c3 V: L' {& ^" `* h: \
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
/ Z0 z6 s6 @2 o- G1 x9 J3 ?Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
2 M6 w# J- i6 @0 u* U& r 9 U3 {: f7 z# }
2. P-state Control' g6 {' w0 Q- i# Z7 t& ]1 }
- I5 j0 A, q" m; c$ e
1)
$ i  A, o0 `9 I, K& R, @Detect & Enable P-state
. H8 a4 d5 A( X: E
" n9 X2 c4 f& Y, d% p! U" {2 UBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
9 b# K  r. G7 E/ e ! q( A/ u; N3 L' r& g* a3 W, K& U$ C
2)
5 g/ ^( I6 q" v9 b7 j- [Supported P-states
/ ]6 v- P3 s# S/ p: [
8 h4 y% a" Z( s" I) ?  nBIOS 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- ?+ }6 y; h! q
6 g, m" P4 q5 U% c
MinRatio = PLATFORM_INFO: n7 F: Y" V, [& n0 l( B$ p4 b6 e
MaxRatio = PLATFORM_INFO8 c( r) |2 `' K' ^
RatioStepSize = 0x01  o6 d# r* h% K5 z
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 14 W4 k1 p) m$ s+ e' U  G) D" F- B

2 P" I. ]1 n8 v7 i2 F4 O5 {5 T4 rIf(NumStates > 0x10)
9 M7 }  v& X' j- l3 ^! ~% p{
7 r7 c0 p2 R3 ]RatioStepSize += 1
% O9 @/ g7 [3 K, `8 r1 F" [9 UNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
" R4 I% d/ S/ |- r1 s3 }: J}
: n  o; [" U: ~: g7 A* r8 A2 N
" ?7 i& l( v& b- l3 f0 ?3): b. F: u1 y/ L2 x% E+ M! Q
Turbo Mode! {* G, B& w( W* J, G3 E/ @" F

1 s' `- F  r- T  U0 r8 F* VTurbo 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, c) s# D2 ^: a' c2 r& j

& g+ d: c/ n0 w5 {& \4)+ g$ I' E% ]0 T
Over Clock
( `  p% Q( b! y, I8 F( n& o& \6 r # W! k& G7 ]- X9 t
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
2 n' }! `/ B% B( `   E. M. e2 o( v" I5 ?
5)
) e, i! Z) E0 X1 U$ a, sACPI Structure For P-state6 w, p5 g2 C% A  z
1 b; O& |& F2 O$ D
l
( ]$ _, w$ i( n  Z
_OSC & _PDC
; w3 M# L: P0 P+ n0 } * l$ i% j  {7 Z/ V( K3 C) Y/ n" Q$ t
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures9 d& s6 ?# T( i4 E  w' z0 y1 {
' ]$ H( y+ w+ K1 S* Y5 Q' Z
l1 u$ D% Z" H7 ~
_PSS
; J4 Y' B1 T" G$ VPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量6 D$ Z. o2 @8 g/ S" Z
并且通过一个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做比较
4 n5 K2 G' E7 Q  @4 A# T. p以确定P-state切换是否已经完成。8 E9 W9 H; a$ f. Y" C

$ f0 R/ a' q: x; }5 GName (_PSS, Package()
/ U+ n) \  |. F* |{
* ]4 Z& f3 k5 G  F+ Y4 `// Field Name
0 Z; m9 x+ ^: m0 N6 t1 z; tField Type
# G: ^6 C5 {" a4 V/ A' Q& O5 K
; t4 P; M  w# c* e8 H/ ]% w; v9 s* S8 ~8 b! l9 }5 s
4 E' I/ q9 {  |! v% C- U  v1 b
Package ()
; U8 w# p$ ^; [) e8 X% k4 Z/ N5 [1 A  h// Performance State 0 Definition – P0 $ C. K+ Y+ C! d/ M, C/ Q7 P' O
. B  U* @9 b/ B' a! j8 o& ]: N
{
( a" }" A! m& b2 o  O, h, s
" Q: W7 S! X. ]% F, p3 \5 B' m' j& K# O- ~1 l, g' f* {: p) a$ d
CoreFreq,! |( z* b  g: V7 P1 \
// DWordConst % ~# k1 X; H( U) h. R* @
) n- J- S) c1 h+ W  \2 n5 A
2 G  u% _) j$ J0 j, y1 @% a/ w- W
Power,. }1 h/ ?. e! d# p9 Y* j
// DWordConst
9 A8 ^2 m0 [- _; K8 a# o% C1 i8 |6 l: G: n6 `% W+ x1 U
TransitionLatency,: ^( s( Z2 _0 I( L+ C+ a3 ?
// DWordConst
6 ]. X- n( Z& m) R5 n, X
2 s" e) }' _5 `0 N, v9 v1 PBusMasterLatency,6 d, g& N! q  H  P' M6 e, y8 |
// DWordConst 8 K5 H: p( W, h( w: b; v

4 a+ B+ W6 d* W# O, [% s. PControl,5 E0 w# g2 r6 M
// DWordConst
4 V+ Q5 A, P* q4 {# A, q1 Q2 |" H
, K6 ^& Z* w  B4 v& G* vStatus
# E4 [9 O5 t" C& d. m- h6 N" D6 g: R0 l+ k2 s/ L
// DWordConst % z4 i( N# c- {6 x
+ f  P2 v/ V3 x  F# t5 Z& W& }4 e
},
/ C4 A& o  g! F! V2 `1 I4 w6 y
: }" A2 K: Q7 W1 Q0 |. 0 Y( M6 |/ \+ m  y, @
& l) G6 ?# x0 k' p' R2 w7 q" D* ?
.
6 [0 @- Y, a% g) w0 ]
! a! d+ n9 G$ Q( `6 u6 p.
$ W0 D$ d# p0 U, b! M; y% i$ G& _}) // End of _PSS object  B  u, z4 o9 V
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
$ H/ W7 j" G8 Y4 `1 d6 G4 h4 w , o! ~) K7 Y8 B
Name (_PSS, Package() + r' O  K7 {, \  }) d
3 s, z/ E( f4 k/ S8 k; y: C
{ 9 O/ V" G: u: ?3 Q1 D3 Z, w

% ]1 M$ v- g; X6 t! S5 YPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 5 a5 V' K' j# D6 _$ q# s1 D" t$ Q

/ P- `. V  h; S9 a7 yPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
# q, o1 ]; v. q; u& h! |
( G9 l: i+ j8 `5 R1 z2 I( |Package(){1400, 8200,
( ^/ S6 X- {/ A# g+ T) Y( ]10, 10, 0x000E, 0x000E}- _/ Z. |, X$ P! v* o
// Performance State two (P2)
# q, w- b: P$ x! @7 _- `Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
$ o/ I+ G5 b4 R  ]2 i; X1 s% |5 F" ~" |) GPerformance State one (P3) 5 P5 ?' i' J( t
6 }/ s  \& [/ E5 z  N" Z) Q
Package(){1200, 8200,4 K' n  m% T; z; H5 r7 E- f4 V) y
10, 10, 0x000C, 0x000C}# a9 g. x- j; N4 n
// Performance State two (P4)
7 U6 ^0 ~. I/ x$ F; p/ j, I, @* k9 n: |4 z1 _; P
}) // End of _PSS object  l0 o- m* J& h+ H1 v
# k: K) J. k: Z8 m' r  ?  r: T
另外当该平台支持Turbo Mode P0将会reportTurbo Mode5 j* R4 I3 E4 i* C+ Z3 q, S. H

) o: H! s. d* [" ]3 K4 Fl  Z" U) Q2 X* N; v1 h( V0 ~
_PCT  e2 D8 p* b/ H) w6 l

& G4 S* @7 S8 n; l9 S( m9 e8 i. gPerformance 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的方式来进行。
; }5 H0 t+ G3 `" F% l) s ) [0 o+ c" c+ ?: u, [' Q
Name(_PCT, Package ()
. [$ R6 S. E$ \9 |: A' l0 F1 a// Performance Control object $ l' t" Q! \* Q6 x

9 h) \+ v( e6 y* d# L/ m{ ' ?: v  Z" j2 M# W9 S, l

; _. `8 J. J; B6 n( a; iResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
$ [/ |" O; g$ h" p1 _+ F  _0 o// PERF_CTRL ' a  w5 w8 m# G
8 k$ w5 `" N9 `' c
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
- `' Y. |% r; X- t- _% A// PERF_STATUS 7 n* C: z0 E  V  g

1 h, w2 e) i' \. r3 M9 v}) // End of _PCT object
: N% }8 ~, Z$ Y* }6 b
( x) p% O* }5 }  F: Q: ul5 j; i6 b4 b% P5 k7 c8 f# Y: Z& R5 O
_PPC7 V5 E# a# p0 J

& x: f+ ~- b2 E- p3 I4 ^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
' X$ k* |7 R* m' p/ B6 ` - z( E# V) Y0 N6 {8 W1 u% i& y
Method (_PPC, 0)  K# M1 }* s: h( g
// Performance Present Capabilities method $ _# f: ^) f( D* l8 _
7 W0 W" }! h8 u* k; d8 B+ K% \8 r
{ " A  w1 J+ F8 j; S
" I: J# y4 @8 p1 J9 Z3 B
If (\_SB.DOCK)
; ?2 y& p9 T2 ]  O) n
( K# d: d: N5 a; d{ , g! q# K7 Q' q% g1 {% E1 G
) m3 ]& K. x& g6 ^+ P# T
Return(0) // All _PSS states available( @+ S8 A# v: f6 }

' T! y0 \9 ~% W3 a0 Z3 W0 s
6 s5 b+ I1 T) m7 h" z; I}
. l* q7 Y7 t$ \$ V, R& y
  f  {, a5 c2 J, I- ^; x) \If (\_SB.AC) : A3 @1 x& c- x; J
, s  S) M9 ?& x) U1 ?+ e
{
  {# Q" M0 M; e8 a
8 x/ O; {! a! ~/ A# W4 b2 T  G/ PReturn(1)
- j" c' |3 H5 [. |// States 1 and 2 available # U% B. k0 s% V$ B! H) y( u3 t

& z6 c! ?* _  w4 z7 z" j3 W% h}
8 P8 t. v/ _# \2 }' h' [0 t5 P: L" j7 z9 N; ]; m* R; v
Else
8 I' z# D. p/ a  J/ d0 e% D2 N! r& e7 M* y7 U; t' \9 X6 x0 g' ~1 z
{
% X, `) h/ N- v$ w1 L; v. u+ n* @: Y
Return(2)% k$ N7 e& `  W8 U" T" _
// State 2 available
$ I; u$ A7 M- N' j/ R( z
( a' s6 }0 m( b* l! m$ I} * r6 D, D# p/ b

+ f* O- y6 G3 ?; h# R) j} // End of _PPC method1 a# q- m, d$ r& O, C

' l8 j& J) I/ a+ }3 {+ kl
  P6 D/ l  }7 H6 m* p
_PSD) P9 Q7 v  H1 i( D
. f+ x7 N- m7 X
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。; c0 B. I8 z( t' m

) {& K8 Q; N6 M# n4 k* AREFF:
1 f6 v2 ~6 c1 h* g2 ?5 g) p) H1.# h+ i8 o. g) `6 T1 D
ACPI Spec 3.0! f2 f9 d4 c( R8 c7 @
2.
+ E* J& D2 I* ^2 u$ u! g& BIntel Processor vendor-Specific ACPI
: E# R1 J7 q1 G* P7 W1 S$ u
4 M& w+ \6 Y3 m+ i; m& d4 U3 A# L 4 B. r4 f# x; L
That’s all!0 c2 q+ \) o# T- z; X2 B( Q

/ _. \5 p: U7 i3 n' S- |0 _; PPeter0 N. A9 W! F# m9 i5 s! i
* {3 t; A# D) D% V4 A
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
( H" Y  X: p2 K5 B" ~ % @2 W! x0 e) W& S; z3 C- a0 N4 ^
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工作时间的占空比)的方式9 Q# q2 X5 E/ K& b( d& |
,影响系统的功耗和温度。. u! e) k2 T( c! C( O0 j6 `8 G! T
" \: J! \3 U1 _6 X
2. T-state Control0 C( M7 y, W1 [, ]% y; ^
6 V, q  Z6 U% }0 G
1)
! h0 x- m6 j' y' p% gMSR Based Control6 A( k! u1 ~  ?  Y9 o8 O
7 t- @+ A8 E3 X/ O0 H' X
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
8 F8 b- \, W$ P$ R; |& S: m: T " g! P# ?$ E7 X- b6 ?3 z5 ?; ^, C
2)
( h0 i* d, s$ cI/O Based Control' _- R# ?+ p8 [; p! K1 ]* p
& Y. z, \% i1 x3 m' P5 s9 S# y
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
5 f3 B- r( x4 {  [3 E 7 W: y0 _4 p2 ]
3)# O8 Q  o% s4 ]8 [, I# W" N( H
ACPI Structure For P-state/ x: M+ F1 v- c8 p& m
l
  y  e# b% x: L2 V/ d
_PTC
0 B  C' t3 e, r  x2 [; u( k
! ^  y+ ^# ]* Q! s. F+ qProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:# a8 N4 {& ^$ c6 R. ?) ~' D

/ F/ A3 ^6 Y: {2 s! u( |1 ?+ ~Name (_PTC, Package() : X$ X( C6 @* @6 A+ e% F
{ ; k: |6 R, T$ L/ Y1 f" ~
, i9 [" o" u+ a1 ]
ResourceTemplate(){Throttling_Control_Register},3 v: e6 W4 f& B) l7 k3 X
//Generic Register Descriptor
9 [# N- G3 ~5 s9 }& \
0 W9 z4 D. D# h/ x# a0 KResourceTemplate(){Throttling_Status_Register}
# Z8 w+ i. o, V; d8 ^//Generic Register Descriptor 8 J, z0 B  P# g7 T; w
}) // End of _PTC( I* v7 ?8 ^) w! f4 v+ v

7 S% {+ j3 X1 Q下述是一个sample code8 ]; v- X' [8 B, s
" N* F3 Y% f1 h
: e" ?; k  P' _7 k
//6 _7 J( z4 H. P, x

; L1 t7 E) r' R+ J4 p4 c" @// T-State Control/Status interface
: z3 u* j. x) i! o( S  m8 b) }; L% h/ ?( \+ Z
//
0 l+ D% ?4 {& n1 U
" n( u% a! I3 Z$ ?' v0 eMethod(_PTC, 0)5 ~2 l6 z/ A: [# c9 G! J" u
9 J0 J4 e5 n2 [7 @1 \
{& E6 E3 n- [$ z8 |8 L7 N
* h* a/ B% l9 r. a$ t/ E9 z
//
' x+ K- B( g1 P  r7 U- b" f- Y4 ^- b% M3 p1 n* W1 i
// IF OSPM is capable of direct access to MSR, p( g# f5 W3 V, E/ k6 C. v

4 S1 {* D% G; N* g; q+ M) b//( ~/ q6 j1 E& d6 r
Report MSR interface
. Z5 r- i  C1 g: s% J* ^1 Q
9 H7 m5 n. z4 r1 O* ^7 T. m// ELSE
' M4 x3 O" ^3 N; ^  a! X9 K' W! R5 s
//- O% W  P& Z$ a5 ?; ]# u
Report I/O interface. }1 |- O$ P3 K

  M  {0 T' [! s3 Z//
4 S/ k" f! d$ \5 N9 j. k# t" G1 l/ l* S$ Q/ \- ~
//
9 y& E* v- i4 `% W* P, IPDCx[2] = OSPM is capable of direct access to On
) L; V. T$ y5 M3 J& o3 g3 {! f1 A' R7 X
//
) `& W$ @3 _% L5 ^Demand throttling MSR& M4 o# g1 O! W6 S3 c* Q

$ w! N6 O) }' U( Z- W3 x//1 N/ k( t7 r& P7 @! y$ f
/ O- `; `. E" ~1 \- V
If(And(PDC0, 0x0004)) {% F6 l1 V( t, |; z

6 E3 H( u$ T6 xReturn(Package() {1 x4 \0 u! J: Y  x+ x3 o
# S# w0 J- F7 W3 u6 O7 w
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},% R2 w# a0 `* ^, G; b# H
' Z( I0 k% Q: u  D( w& b! U
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
' J9 s" ~5 E1 O6 {) i) |9 \3 c0 m8 A
})
8 b7 U$ ?' _- h0 T$ d! S6 z
; H0 L) Q5 f1 T0 \& l}
9 P) _; v5 q, @# Q
( Z7 c% r5 J7 QReturn(Package() {
" @3 l) y: G; K; {, Z. A7 _4 T
& y( F% j; X; KResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},2 Q, I0 R' D* {+ {
% z5 P( ^9 W& _
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}5 Q" A  `4 x. M

% e% X1 A. s0 w* d% ?}), t, F$ x) ?7 M9 Y6 J8 Y; ]+ h
/ D+ s( B9 U/ K9 p6 j( b
}, e% @, L; s: p

  |" K5 P9 B& w$ _) \! F( o9 A+ s4 j& U+ v* G0 X3 K
! O+ |9 y, \4 T. }/ f
l
: |8 C2 h! |# o7 Z, C
_TSS
8 x: n' [& f# C+ s7 x; Z ; x; A0 Z8 n; q( M& q/ [' m4 r
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
/ N% c7 z& `8 |$ }- L. u( I+ p) [Name (_TSS, Package()
$ A' {% b3 }; y! e- Q{6 w! R5 P1 q% Q9 a
// Field Name
( E1 w* X- B  G4 Q5 UField Type 8 k) X) X( K$ A7 b0 y* _; C. t! S
$ R; Y. G; Z% P& y8 g. f

- U7 p* f7 b) ?+ Z0 E% D$ k
* F8 X" X; k9 @2 n% B8 bPackage ()# g6 _4 h8 R+ G5 D# ~+ q2 ]
// Throttle State 0 Definition – T0 4 k' h; J+ h. Y8 ^# |/ ^1 `1 K

& c2 K: z0 X0 h* l) k{2 T6 \# t4 q" j; N. W. D7 V

2 z" t$ m3 i7 m6 w6 V! q6 L0 Q% }1 T9 o8 z  s8 Z
FreqPercentageOfMaximum,
& {$ H% t& Q# B- v* l// DWordConst
2 f$ K% ?/ j$ U) R" d0 G0 L7 M) i5 o; I. ~9 U7 x9 A: @
Power,: \( c: A' h' `7 y: N
// DWordConst
. |! u1 X' U' B: i
; S4 [) T: v% i0 g5 @6 UTransitionLatency,) k; M/ m& @( v! r0 K' N
// DWordConst
/ B! K8 m" d/ i7 c% K. |8 d3 C
+ M3 u0 \# u) i4 W6 y2 U4 `Control,
+ j# G% V- W. t* H4 s% a+ L// DWordConst
# c+ U3 r( v; E1 A) K' L: u; z2 N1 H' U- d7 R- X
Status
. U8 m1 H4 N+ z  l) U// DWordConst
  x2 h5 ~5 D8 ~6 I. @},( z6 z" \+ X# g  s8 S5 H& r
……
% l; F! S7 a. E" P1 q5 ~1 e% F, a}7 u) s! x' }+ ]: |  r' S4 R. a/ b+ I
( d, |' Y$ h( v$ p
Example code 如下所示:
+ Z0 R% q6 p3 r4 Q- |! A
1 O1 h+ n6 q& V" v# {. }' I* ?Method(_TSS, 0)
7 a: w+ v0 n+ R+ W/ [
& [# W6 @9 A, _3 ?7 D: J4 {{: C/ x) v) y' z+ w* I0 q

: R" ^6 r  f8 s5 bPackage(){100, 1000, 0, 0x00, 0},3 L' R% e" z2 `* @% w

" m/ p0 a5 p' x& uPackage(){ 88,6 q" W( U% f0 L+ g4 {: d
875, 0, 0x1E, 0},
+ R& ~$ S7 L( L% ?. u) Y
8 {. f$ E6 A; K7 d( [2 O7 R3 `3 lPackage(){ 75,
6 S  k; T- `6 V8 B750, 0, 0x1C, 0},% h# Y9 ]* W4 {4 ^' b% x9 [

$ Q1 w" U/ V; \: t1 C: {; VPackage(){ 63,* q" q5 }0 D1 h
625, 0, 0x1A, 0},1 _  L9 Q9 e; \* L3 e: B. E; a

* ]% x) g' N& W- B0 }" oPackage(){ 50,' s& q9 p' ^/ O+ R( F
500, 0, 0x18, 0},
. F2 a/ E1 Q# j0 R; w0 J* ?: |) I+ Q# U* w6 a; x. r
Package(){ 38,
' ^  j% u8 o+ k( G375, 0, 0x16, 0},4 B7 N7 t: `+ B, Y) D1 B8 h, b

* {3 A7 ]* f7 W2 p" lPackage(){ 25,# `9 t) v) B" C2 f( `
250, 0, 0x14, 0},
- [. i8 e5 `  J/ q, P# \9 ?5 G# y0 D
Package(){ 13,
/ I1 Q4 h- O" E) B- k# N; P125, 0, 0x12, 0}( Q* N0 c& f: h( _

9 g  C9 |- j  [; X" J  n* o4 r+ C! H}# `) A7 V7 A: M0 |6 O0 x+ Y) B
5 k' `$ q5 q# Z8 L$ J# q

7 ]& F" F4 i1 e- a8 ?l" I9 L/ M7 A5 V' |: T2 `2 M, p/ a
_TPC% |1 s$ o! \1 @" V; J! I% A
3 Q: s9 E  g6 I& A2 {/ r7 X
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
& {% P# d  w, I1 W' R  x
/ n8 A1 e, N6 ul+ N8 k* B& N: S
_TSD1 u' U/ l% }, s" J1 a$ x9 A

2 H1 l- S9 p, H2 M2 t+ y9 y6 zT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
, Z" R: k" _" F+ G
' s( ^0 V! A3 E! a+ U9 P$ JName (_TSD, Package() ( @  H3 P- i# B) x
* }: l7 _, B9 c: i9 R" l5 _* F8 }
{ 0 K- @9 G/ y5 b% N9 ~0 P9 x

: i! H6 F8 J( W" i. P' Q" c: T) v" ?) pPackage(){5, 0, 0, 0xFD, 2}
# N/ Q8 h. r0 h- h% L" F5 |  m// 5 entries, Revision 0, Domain 0, OSPM
) E0 E% j' D9 j8 Y2 @7 M. L  l$ A3 jCoordinate, 2 Procs
- p% |9 O! j' L+ C6 j' p
  _9 j. l& ~  s" Q/ `  g7 \4 r- A1 L; Q8 l
}) // End of _TSD object/ d! P7 j; [$ Y

9 _' x1 i- e) g6 E; FREFF:, E: x( b# g4 ?( v  _' V% n
1.
8 x* b$ k0 S: u6 g0 q  `9 tACPI Spec 3.0: d: ?* w- v# R. \+ j8 K
2./ _2 Z5 I0 I  ~4 Z7 z/ T& x3 f! r  W
Intel Processor vendor-Specific ACPI
$ `7 n; k7 y3 _! l, n/ ]* Z* S 3 ?  N2 N! \0 ]$ J' Y1 z$ j
* H# i3 z% }2 ^3 m
That’s all!, \+ C: `3 I& V9 Q  Y+ g6 _1 i" w
  P- d$ l2 q: {& X' R8 U+ o9 Z
Peter
+ }9 s! b2 J- i/ [* Z
" j1 T$ E2 G& c- C2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-19 21:56 , Processed in 4.846922 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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