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

CPU Power States

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

# N4 [( s/ T9 m3 E8 T5 \1. Overview
' W4 r3 S* s# n: i0 ^8 \4 `
. t9 Y8 M2 b* h
  r5 S2 `; R; p9 c% dC-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换" G) @$ t6 [; {
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看1 U- ^) C' v* D* L4 s2 O
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。3 {! v! b$ g9 M- B/ v9 X
6 J5 \. ]$ c% R& S
cstate1.jpg
1 _  k! k. u+ W( t# u4 h  ?$ h
1
% s, Z8 g' ?4 j  J
2. C-state Control' j, ?% B( C, D) X" S' Z8 r

3 k- L" S# q2 L/ u/ W1)7 O( v; V, n$ D& J$ B3 N
Detect & Enable C-state
( O$ S) J0 B0 n: V4 V2 a
- ]$ x/ i; I7 A3 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的支持。
, Q3 o* r/ v# n1 P1 r* v' U
4 O7 G* z7 n. D. G8 D. r2)- Z* B$ a. C6 D  I5 Q* I+ W# Z
C-state Basic Configuration
; |9 f* v! A8 ~: X! W" k! D2 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)。
9 z& ^6 T6 M7 t" ]3 w/ v2 D; F* d1 A
3)4 y5 O6 Z# m4 z
ACPI Structure For C-state
& D7 ~  c3 T( Q
! u3 ]* @& U+ hl
7 T2 {# S8 `% L* \8 c- E; h
_OSC & _PDC5 M! w, K8 u9 K3 r0 w
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
* B9 ?! w& f& c9 m/ x6 [l
! ?. D, M3 F& L# w
_CST' S" ^/ \4 {$ R) F0 m- h
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:1 |3 {7 |( k2 D3 h  s, V# q
CSTPackage : Package ( Count ,+ k! o4 J9 l; i2 b3 i8 ~
CState ,…,
7 I. U# P0 m5 B  q( H% }5 hCState )$ Y" r  ]% l9 |, Y
其中Count表示所支持的C-state的个数
, y( @( x/ @* L1 s' m. QCState: Package ( Register ,
2 ]" s3 b; s" h. QType ,
, w" g8 I4 f6 {7 gLatency ,
' k2 P' D8 R0 dPower )  I, c! D. b# u* i: D) c4 u
( O$ D1 C# s0 r
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. J/ X$ h' T4 o2 t# u& a. g4 r

! h/ l$ w4 v) D& nName(_CST, Package()( e* X" L8 W: \% O: H

$ W7 X$ Z' P) C$ ]( _) R' j/ E{
$ R3 K% H9 m& O% g- _# C4,
9 ~( C, [0 |4 {& q+ p  ^, Q// There are four C-states defined here with three semantics

% |& Z4 e+ ~, J: W: P! H* T# ^1 h8 L/ \- Y& E. L
// The third and fourth C-states defined have the same C3 entry semantics" `6 z, s0 ]2 p: F0 b+ A

! m/ I9 H( O' ?+ \Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) w" l; {' g( R$ g: b/ w
1,
, T% l. U# w7 C. z' n; K  D( C20, 1000}," G& E( z- z. n* ?
. ?6 `; L0 E& Z+ |' D2 N. q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
: S, }0 ?" M$ L( x& O7 p3 ^/ F40,
: h) G6 T& }9 G& r$ P4 C750},

$ `7 J6 w+ N5 ]) k- _7 z- t1 WPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
/ A( Z  T# _" c& r! T60,4 d. t+ s& {; M6 k% S
500},

6 S7 c8 y9 D  Z4 r7 _2 ~/ sPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,& g# d4 R1 s( t* o- ?0 J& _
250}
& Z7 w( S% w9 z9 B5 c3 M# }( f9 f
6 ?# p2 t8 x* N7 Y
})
; }1 |7 X5 `& ^6 H. X* H
- W* Q# ]* F6 s. Y: ]l
. U4 @. m4 S7 i' H/ h/ I1 M+ u
_CSD' B! n" R  q$ w

% @3 P& O2 T5 l, ]" h$ c, aC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
: C" k: G  m% J/ F# Z* P) m; e: @$ C1 M1 Q7 G8 b5 G$ @
, N) |' z6 ]4 e- b! x
4 G/ Z# d- o* U% K3 E4 u; K

6 A: S' c2 r# }0 L6 G- ]3. P_LVL VS FFH
# f- t7 g' }( N- k) R* b2 Y
; V) ]0 [, S. X0 c! zP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
( i5 G" d1 N: h0 @4 X6 f1 E6 \" p2 rFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
0 t: S4 x6 i5 [: k5 X
& }- y& Q& b1 a% N6 d- L
gas2.jpg

6 m/ R  q( _6 F4 y: u
2

: K$ g/ W0 x4 M$ S& f' `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的一个例子:
# S8 H* r$ {  k$ RName(_CST, Package()
( r% t1 a, j7 U# p/ N. S* i
3 c' c& H) \0 d% i$ [$ W+ G
{
+ `9 S' V/ R& s. J  Z8 D9 A9 ]  L2,
" u- M  ?" c8 z// There are four C-states defined here with three semantics

# U/ M) K+ l/ W/ H$ i
; c6 P9 L* r  ?' R6 j6 `) _3 U// The third and fourth C-states defined have the same C3 entry semantics
" H- {) t1 y3 U% V
" F. v6 i7 Z4 h) T: T, p3 M: j
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
0 V4 [( u  F" q3 R- G0x01,
/ Y) V% g7 U7 M& {% k# ]/ [% B. h0x03, 0x000003e8},
$ O9 n& t- p; _5 o
4 l" o5 n+ a9 }' Y
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
9 T1 `: M: C. P0x01,
5 G( M" j1 o. \% Q$ D0xf5, 0x0000015e}
2 P; R# b. U, u" J5 p
})
( `0 E. F8 b2 [) G* X
/ K- n3 c# ^* Q6 X4 O- a$ y/ U6 @8 _( Y  s1 B9 M  A' L3 S
REFF:; b; ]9 g8 D. t. f! h4 {: g' l
1.7 P5 V2 {/ x$ I& K9 x- A
ACPI Spec 3.0+ p3 i" c% z+ i) f" s1 L# L
2.
5 g3 h9 N2 p4 s1 U3 d) jIntel Processor vendor-Specific ACPI* x- ^! X4 q" ~

7 Q; q& Y2 T$ z, j$ e1 l# ~) c2 S. W3 O: f
That’s all!( Q4 I7 M- }$ p* S( P, b! }! b

% h' ~  Z# U  P9 F" rPeter8 l% Z+ e4 y2 d( r4 k2 I. V" D* ^  n
. d! f. j! ~% Y  U$ O  B
2010/9/201 q, v* N4 i4 x, K' g! _
7 O7 o5 L5 @; I; J$ k/ P9 u
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
$ V8 {0 B. S* o! F/ C7 E+ Y7 S$ X/ v
' I' R! [  W% b) |6 m4 g0 C5 pCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST" J) d8 k& _( W
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
- g9 o% x# ]6 I  j3 N5 V# y- x& E
7 ?2 j/ g4 I/ q5 U. J" M6 N2. P-state Control/ z8 [% \$ m1 i( ?5 Q
+ N* v; }7 l+ k# |/ s
1)  O" H6 E5 l: w4 u! _" ?$ F/ p
Detect & Enable P-state( n" Q% d0 c% I" H. K! @8 l  I6 F

7 L  ^# \- ~" W/ n9 `+ v0 n$ o: OBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state# s6 ?9 R9 p) Q% X/ w$ [- o
2 o3 ~* `! |5 o6 Q" d& L
2)& O7 N9 X* e, i, O8 b
Supported P-states
$ s# Y' C+ s* i1 w! d$ |; j
  S# V8 _- z/ WBIOS 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固定是100MHZ2 V5 y  m" K7 M" D
4 X# K! K+ n0 A. Q- {3 _
MinRatio = PLATFORM_INFO
( X2 ^' U- u$ M8 [MaxRatio = PLATFORM_INFO
6 i8 N$ c% |- {" s2 @' P  ]RatioStepSize = 0x01' I7 D% \' R! [" L
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
. P3 L! E3 A$ J
# `' v% S0 r1 v0 [. OIf(NumStates > 0x10): u/ d7 G. V1 A* h* w
{  q+ Y4 ?1 b% H, M' p5 L
RatioStepSize += 1. m5 s7 ^4 H1 |8 W" k0 u
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1/ s" b. C8 c  X# w8 p& u& H6 L
}
% r7 q; E8 N( t+ C' _$ w7 U
" s$ I" {" s+ `5 b% s5 N3)9 q: `# x9 o; I8 b+ i0 f8 Z/ O
Turbo Mode
/ k# ^) ]. C- j0 F8 p
; z6 i' J5 _8 ?* H3 S; |" LTurbo 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
) |8 [" B+ h0 R# l* S& X* \* H
4 f/ X2 H0 q: a, E4 o  V3 A- x0 l4)
( U# \: J3 N4 Y. u; M0 BOver Clock
0 ~! g1 }9 h6 C# ]" z/ e( T& _( r
/ g# c- Y+ k  ~! t2 F) Q某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
! W  L. z+ s7 v. c( u7 s
- t+ P% T2 W9 w  ]: n5)
+ M% L+ G9 N; j4 K) kACPI Structure For P-state& O* s8 c* D9 ]% s9 y
7 w. R# c/ e: q5 v1 I9 \9 `* G
l
* U8 k! K( L+ Z; y  x8 J1 U
_OSC & _PDC
! T( s* T) s  i0 }4 _% @; f3 n 7 [5 h. {! J. U: B- a
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures4 w, V/ |- r5 ?

4 s- O0 f; f* Z3 f  e9 bl$ |1 c! A/ v' ^
_PSS
- p0 P* b* \0 q& f+ [' ZPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量& g5 y/ w& ^' B! i9 r; o
并且通过一个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做比较
! T5 m$ D( V9 ^# K& O以确定P-state切换是否已经完成。
: L: K- r* H2 n0 c0 R
: T3 J6 t4 P8 u2 qName (_PSS, Package()
# d' |/ a! N4 B1 q- Z{% w. A4 w' z# ]8 X% @8 m
// Field Name% Z4 d% l) s) J$ M2 b! I
Field Type
* S% w) f' m+ Z2 o  N9 f/ p2 I- @3 m% x; w6 }. C% a

/ m5 i5 x- K9 ?7 p& O! @) s+ H- V! @$ u
Package ()
! P( K1 S  l: z/ T// Performance State 0 Definition – P0 0 e8 _9 q/ Q  Q$ |

0 e( p! m. `! ]{
, J+ ~6 [0 I* n" W
" l0 u  _& B$ W7 F# |$ G3 u
- @+ R* Q7 P8 A) wCoreFreq,
4 E0 _7 @) U3 u4 y$ M+ V- t- O// DWordConst
9 T( T& U5 @. v7 n9 a
' a, X) |3 f7 d% @% Y4 f! b5 z9 c* {2 J' d; i
Power,. u% l# c# \- u  `0 x3 T* b
// DWordConst 2 \% q6 B' {/ r
8 u( C4 q0 S% U+ b# Z6 S
TransitionLatency,* s/ q4 W5 x/ j0 C: I' ?2 c: [5 [
// DWordConst
4 ^5 v2 R) O6 h5 I& T8 e# F+ B- G" k" k3 @- N) u7 L4 c
BusMasterLatency,+ X% _" m5 q. R* A# f3 c
// DWordConst & Z, W3 ~; J) G) L! |: R
1 s* S$ {% v* Y: y' j) j
Control,
, G8 N( p) H( K// DWordConst
9 k, Q& N, E8 r+ P* a: c9 J- U6 ?4 U' L) n) T, w
Status
1 i8 i9 U& T8 @( t( k
4 w4 g* U0 q5 Q2 D2 Y3 Z# B. c// DWordConst
+ Y- R# _. a5 p' f+ c: [' B6 @4 g3 e8 @  ~4 y+ K7 w
}, $ U# W) _$ z, U/ ~! P% P

6 n& ?/ E- b$ i8 V0 C. 0 u' V$ i8 ~6 F- ]( W0 d
0 C- P& \1 z9 P: [2 t5 n
. ; v3 v" i5 ~( W  w

4 F: Q+ ^2 J- K3 i( S. : m' n  D5 u2 D  c; w# s
}) // End of _PSS object2 w6 P' S/ ^& [2 K4 ?
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
# O  p, y0 L- e9 L
6 c0 a: r# U( d0 I5 o! @* {! FName (_PSS, Package()
  [0 V9 c8 E; w) t7 E! T& U) w5 z" s) W; f; V6 C. I
{
, M, R4 c& _. H& [+ V: R# g$ a
, }% F4 E; M% o6 O9 A, KPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 6 U$ f) X; ]% D4 a- N
# B5 Y9 n0 H5 t
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
- q- o9 `+ O( J/ n2 Y
4 U0 n7 ?  t2 ~- E; _" x! Q+ YPackage(){1400, 8200," t3 u! l6 U5 U  [8 h
10, 10, 0x000E, 0x000E}
/ e& H* d" f' x: ^& V, m3 z// Performance State two (P2)
8 C0 S' A3 C2 U4 W# X9 cPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
: m" G! Q3 i7 m' J, V" XPerformance State one (P3) 3 N% o1 f$ Y/ c4 h3 e' N% i! g

% T6 O5 a+ r, TPackage(){1200, 8200,
* \( Z8 l  s; O3 w- j4 W, |10, 10, 0x000C, 0x000C}3 O3 q8 _: S, G+ |
// Performance State two (P4)
* P1 Z8 F& _' I% h+ t/ U
, i, m% ~& F* R7 B; \}) // End of _PSS object  ~1 T. [* ]; V
9 N6 S8 W2 z/ Q% v% N/ j
另外当该平台支持Turbo Mode P0将会reportTurbo Mode$ W$ C1 _9 f" I. I
; Z/ _2 l4 i9 \
l4 B" f" r/ S0 E- K0 x5 R8 {
_PCT
1 \0 Z( ?: V$ n # N% ^/ f& ^+ M1 x$ J# b4 h+ }
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的方式来进行。
5 [/ @; d/ S$ R% V' k7 b% @8 E 7 W' s4 ?' k( U" U- }; y% r8 ~
Name(_PCT, Package ()
0 _$ X! T& U7 S( C. x2 a// Performance Control object
1 [, z  s  q6 F; e3 g+ R# f* P0 K
{ , c, j, d3 Q) K, s* M% M$ m

2 p* q7 M6 v, `* eResourceTemplate(){Register(FFixedHW, 0, 0, 0)},( a. A; R% ~' v. S
// PERF_CTRL
, |" }% d& H. I9 I7 ^( K1 q/ F9 Q' h
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
2 g' c* q; g, d( B// PERF_STATUS
7 j( k1 B3 j6 B4 G5 g5 w
8 p3 X; }8 m  z! J. O}) // End of _PCT object2 O. j$ s3 Y  }7 H
0 U! X+ |+ e- i2 a+ K& f  k8 ?
l. R$ @) R; D& d' e
_PPC, D& t: H3 E- D8 l
9 k, L: @4 N6 I7 I
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
; E8 P+ C, c# m2 s" g) Y
4 r9 V# ~' B2 C& a# W% ^Method (_PPC, 0); O, q5 U, G, X' M- U
// Performance Present Capabilities method
! s5 t% A7 m* r/ ?$ U0 c& C* K9 y. E+ z
{ . \( P: S) A7 ?# q& N; R
$ Z: e" _' i5 ?& M% z2 M, N0 q
If (\_SB.DOCK)
# x8 }+ ~& L1 h1 U1 z
! B+ v4 I7 n, U! e1 ?# I7 k& W{
" E8 Y3 c  }1 ^, F" F* a: B3 s8 k8 P  N! e7 A. u0 B
Return(0) // All _PSS states available
8 d1 n5 E* o9 ^7 \6 v+ u! t4 R
+ ~7 u+ u: P* u1 y
& T0 _! q% \3 c5 `}
. F/ T4 ?4 t' I* g
& P1 H& i% |! `4 Z- E' v6 x! y& tIf (\_SB.AC)
* l" ]8 t" z4 c0 ]( p
) z: e* c8 G8 R* T{
, a6 l$ [0 h. b6 C+ \  M/ t* I! L' L2 X- P  n* x9 R
Return(1)0 Z! w5 D* C- k" E
// States 1 and 2 available " r# x; K. P' @5 n" U9 s

2 B! C% o$ v- F: x6 E}
% Q' V# ^! s- X( \" B% c7 z
" G  f1 R; p2 W" o/ W$ nElse 6 O% h9 b; t' o, R6 c5 e' c
6 r9 Q- J* ~  O
{
) p  E3 d5 O& C7 t' Y9 L  l
5 F7 h$ H# h4 H) GReturn(2)  }. P3 S  U- o2 {0 y" |
// State 2 available
( O3 d% i! Q0 @- m& o0 J) s9 U: \3 k  q5 d
}
" I8 ~0 n0 G) {
& y2 v3 k/ ?" M} // End of _PPC method) d& _# ^$ E+ _' t( E
7 ]  B+ h$ S& f8 ^( D
l' I" X' E! s  o. h5 d- H) I6 n
_PSD
0 v3 T  n% X. W- t( j/ \7 m / b5 D9 t% k6 ^0 H3 c9 ?( X
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。( G' h5 M% e9 n7 }

- l2 h7 \0 x, A, P! {REFF:
& q$ M! ~: H* y' @/ I1.
# k) `0 I! o* O$ S+ i! c$ XACPI Spec 3.06 D% H0 f* ]% e7 N
2.5 F# a- {" w8 D0 j# }6 N
Intel Processor vendor-Specific ACPI
9 |; I/ `2 V' O8 ]6 Y5 g
7 M8 Z7 n& \$ m! |9 H, s
- f3 S4 }0 i( K* bThat’s all!$ W1 v$ |! O' T) O8 T$ s% G$ g

) F9 _5 H! P$ j2 ]* X( j3 r- v9 g( ~5 vPeter
9 o* R- H2 l1 u2 l) {
. i. N  G/ O0 Q) H2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview, D$ R; [1 s) z" P2 R! H

( Y& _; ]6 z- F$ T9 F$ k5 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工作时间的占空比)的方式
3 B$ h) F" z% X9 K! F; h+ w* f; F,影响系统的功耗和温度。
, P* w: U' J. t; a1 \
  a0 U1 j9 ~+ [/ R2. T-state Control
5 M2 D: W7 n, m. X1 I6 j ! J( Q. C& i$ P7 l( {5 S
1)
5 F9 r) i8 e: h& }MSR Based Control  ?) x5 l; W( L* j8 l

8 E6 n: O6 L  R$ ]$ f' wBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 1 }2 h  L' q# P  f$ d1 d( N) o
6 ~6 c) q. b3 D5 f
2)- Y3 T" ?0 W0 n* j/ l( m7 O- ~# v: Y
I/O Based Control' O5 c- c3 `( V- H5 R
1 `( q: x5 x- P: ~
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
; c* d; x' u" w5 s) I & h- J3 T- v: z7 |+ s( B
3)
- W4 Z6 b  y. O5 r# HACPI Structure For P-state3 i" m; I- z0 B& g
l' h8 S# J" _  s0 x7 s7 h+ Q
_PTC' T+ c% D) Z# J% B% A3 q
7 n8 w9 [$ R0 T2 e! `2 q" g. W
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
  Y# P+ G1 _9 a) g
7 r' @6 `3 \! ^/ pName (_PTC, Package() 8 q* ~, t- @! T% p1 G/ u
{ ( H0 }6 F  ^$ u

. ]) Q- ]% C0 zResourceTemplate(){Throttling_Control_Register},
/ w" i$ H' {9 L+ @0 @3 Y+ {, m//Generic Register Descriptor
' S$ ]. E$ r, B3 y8 n' e$ z6 f
5 j2 Q" [" M6 yResourceTemplate(){Throttling_Status_Register}
; L; ~+ w8 ~, c//Generic Register Descriptor , D# t3 Q' m! A
}) // End of _PTC
: c$ _4 v2 w. `  H1 j: g* ~ , Q1 D( L. L5 L0 ?# R  I
下述是一个sample code& b& Q/ Z5 l) B& F3 U! Y
  I+ u" A: k/ [4 t

# `! v* y5 k( M
//
3 b! b( B9 P9 O
% `* Q" s# m- R/ j4 I0 U// T-State Control/Status interface
0 ~4 ^$ D% v$ y. R7 [- h. ?6 F9 f' C5 B
//
' k& T# K+ W0 J; D) `
9 U7 u- ]; h: e* G1 _& cMethod(_PTC, 0), \, @9 @' T9 P  l! T

1 o6 k+ A% w: q0 t{5 ^0 N" m! W. S3 w
; J) S1 W/ S+ N% z( Z; |: H! j
//
: h: Q& ]4 U- h( E4 s/ \- Q
0 Z/ T% x, I. |& N2 m// IF OSPM is capable of direct access to MSR3 T# R# S# }* L6 u  ~2 e+ D8 A9 B
0 ~/ {# D2 M) v! H( S
//' {; T4 Z( D7 f8 }3 r: \5 h
Report MSR interface5 B+ u6 v: }, F( ~2 `
0 Y+ W$ D6 o( h: y- K7 m
// ELSE- k& |) z6 w! S& y2 q, W. c3 I' ]% N
5 N$ U2 S% @! f0 W* m
//
/ O7 U' Y, P- W+ T5 M- b3 }/ ], MReport I/O interface( u) l; z! m5 U" A/ d4 Q

1 t# p7 O+ R) h" G4 k//
5 ]# |" E! C& G9 o7 X6 f2 I
# H9 n' L" F' i" Z( c; D4 \+ O//0 e8 [+ T. b5 Y. z# H5 f$ q
PDCx[2] = OSPM is capable of direct access to On3 O" K! @  \$ h, I0 ]5 \9 ~3 K. }

' i% ^% q2 l- W& H: J//
/ W% |9 \& r& \8 w. l" I2 k4 iDemand throttling MSR
& Q# t" C" T0 l7 t8 M7 Z+ c3 q0 ^1 T' y
//8 _7 x  t9 R8 Z( i) ^2 \1 Y
# |: p& `/ K8 ^  x7 K: a6 p
If(And(PDC0, 0x0004)) {' j. B1 Z+ A4 Y3 R; H/ n" q, [% J

* X2 N' x8 u5 z5 X# ZReturn(Package() {  J- U5 U  `( B! f4 R6 \) m/ d

8 S+ V2 I$ U* N& ]8 bResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) s! w6 ^' Y( ?( J  }' Z' R9 M* k
; v1 R$ N& r/ l) a4 W1 _
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
, r/ B9 ?4 S# X7 k" p
# ~" y6 U- ^( L" p})
5 @: @9 x0 m. l' D+ k- T2 Y
! \/ w. o8 C( n( z# z}$ b- E# r" y9 u

! }% v# U5 ]0 G# y  F) I2 ]Return(Package() {
2 I. p: G" r9 q1 |$ h
% Y5 T4 S) I) l$ f! ^" Z/ y. Q( tResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
, w" |% w/ M" W; ]! U& P
! O( i+ f* P2 m6 G5 N" U4 ?ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
" v0 N" n  }; m$ ]% t. o. g% b' @6 {: e1 [" n( a* |
}): I  ^% ]# @( k# X* k

# {4 }; ^6 w9 ^* q}  Y: D  X* p( q: L) L

% |  y2 i$ E, k  Y  D, U& W3 I8 f3 e. P- j( T
( x5 w  m3 G, _. ~8 h- R& @
l* Y8 X  g( u) O7 x
_TSS
2 V4 t8 y0 V; V
! |4 X) i& |- D, `3 U  G' ?Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:, s2 O$ x" O) R/ |' _) s8 |; v
Name (_TSS, Package()
: M  o) r, M- l8 O, Z{
/ W+ v, d0 V# S4 y* X7 t// Field Name
( J& h6 M" f  xField Type ) ?: Y, V5 I7 M: f& m  y

) Q6 i9 [5 I5 w" X! r& z+ c7 x. _  ^7 i% o9 H

& [5 N. ~/ q# u, d4 P9 TPackage ()1 H. e1 u4 L( D$ u. g
// Throttle State 0 Definition – T0 / F3 f3 Z$ F' @  x  R6 d) U9 j
  V7 K+ ]- Z& d: ?  h& z* H
{
( h" m5 k8 ?6 G2 Z, T
6 H9 l9 \- b9 x- A, Z% }. _7 z' J
# W/ h# C3 E$ P+ s/ e# vFreqPercentageOfMaximum,
* d0 h9 x. i9 ^9 G  h9 q8 K; x// DWordConst
  x' M9 @5 G7 N
& G/ Z# q! r! e5 n7 {- `Power,  q* e: O& N* L$ T: P
// DWordConst
3 |( v5 O! |0 t6 a2 ]: B: Z% ?- M; B6 V0 J- A0 W
TransitionLatency,1 G1 d( }! w0 {% r6 c
// DWordConst , g& l+ ~$ ^1 e
0 {+ B  K  Y* ^1 z7 ^6 K5 u
Control,
, U; @; s$ a, L4 _& u# v1 r5 Q( w0 v// DWordConst
' g0 t* {) s. J  q5 y+ R& `* F9 d' n* j! n7 r+ v3 X- b
Status
. x' H+ I5 k/ l5 _, W8 r// DWordConst
8 i+ X5 ]: _" Q  X4 O) H6 y+ y, ^- y},1 Z8 b4 c% Y# I) }; o; H; s6 ?
……
# g2 H$ y6 t) D  p; I! _' A$ Y}
6 @% M1 T0 _6 F* Q: u+ Y# R
& m, ~8 f8 ^1 S  }1 lExample code 如下所示:$ V& p9 g! \" P

" c* B) |7 G* w' K+ ?. N2 OMethod(_TSS, 0)
3 d* }) V( s6 ~/ o' q6 `* Q' {0 w: t' ~* I3 ?' p4 j) Q& z
{2 h) d- K: z7 b) W

3 B- k6 f# U. q$ B' CPackage(){100, 1000, 0, 0x00, 0},+ f" z" e7 s7 z) N- _' c9 D

. S# j9 U' _" W2 _Package(){ 88,0 [2 a6 \' e3 I7 o
875, 0, 0x1E, 0},5 j/ v$ i' ?' S5 N

* n$ u% i/ U7 f. TPackage(){ 75,
: Q  v. Y' @( Y4 r4 A, r750, 0, 0x1C, 0},
+ j- K2 O  |4 D# Y0 X2 R3 J1 X% S' R
Package(){ 63,8 R1 L  Q* G& x1 G1 p4 q, h
625, 0, 0x1A, 0},1 c6 h# a+ i" D* f) a

) g( k% f" v& h3 |" q, ~- tPackage(){ 50,
8 L7 e% t7 K- _/ A1 N500, 0, 0x18, 0},
/ d# ^3 |' T' O$ ]% U" l. f; I( R* T
Package(){ 38,) p# U  O: q+ M3 W7 P& f
375, 0, 0x16, 0},, J. ~" @0 y, A& R  o
) d$ Y: K/ E6 E4 Q( ^4 x. k, l( p
Package(){ 25,0 F2 B1 V; I$ v  j' w6 M: m. `- o
250, 0, 0x14, 0},
1 H. m) e. f$ U- b8 E" _3 T" M, a
9 A& v9 k( A  d) fPackage(){ 13,; r) }* [7 o( @' N* f- M
125, 0, 0x12, 0}
, g/ Y0 A  a* Z1 r/ b; ]2 A+ K1 p! K
}, Z1 u! m& d2 m) B. k7 u

7 E9 \$ q) r4 D
; D( b5 w# O0 l5 ^: k' j& F4 Vl
9 ~$ Z' H7 H5 E) W. k
_TPC; {% A. A; P- L5 d0 ~4 C

8 c4 t# c% s& h' OThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
7 d; e2 Z# o) D" i, ^
# z% k# m/ G" @) Hl
: G# z- R: L% r$ Y* f& Q: w
_TSD
9 \/ A$ @2 E! x1 X! r
2 A3 r* e  l. d5 tT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
) E0 y! Q% ^! t& @3 w ; R# {+ x% G) R: h* [
Name (_TSD, Package() 4 ^+ T! Z! s  f- a4 o0 ?

0 |: E1 F5 K6 r& y3 D5 V{
0 _: K) P4 D- X4 q! z# A
7 [  F' H9 [9 t% LPackage(){5, 0, 0, 0xFD, 2}
4 G0 F/ U  ?% b! M// 5 entries, Revision 0, Domain 0, OSPM
4 X& k/ C8 _. K! ?# gCoordinate, 2 Procs
' c7 [: b* l1 [- ?3 x, m
* a; H  R+ o) s9 q% c
3 o. u4 y; M3 B$ n& X}) // End of _TSD object+ o- }. Q% U' s/ h

- Q  H7 n) ^/ hREFF:
, _  }( U6 z# s4 R- l: d1.
6 g+ o6 g5 D$ j+ v. l6 cACPI Spec 3.02 c' J7 u: f' M- |# {) L, K( j
2.
7 Q+ F0 r6 J" W) W9 D$ O7 }Intel Processor vendor-Specific ACPI
( f0 r7 b. E. K2 Q$ g
1 k: _+ m9 \. V$ F6 Y5 y
4 T( S7 F/ [: w* a. U6 k5 IThat’s all!
4 p, d* ^" [2 z4 s+ y3 W
8 f  |. W2 ?0 A( W1 T* DPeter, N6 W$ }+ V! b% b* `) e

: W5 g& g) A5 C6 q  B2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-13 20:50 , Processed in 0.104416 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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