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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
0 ~6 D4 s- M4 i" A9 T* ^; u
1. Overview8 u/ y+ \" k9 Z$ w- d% N5 N

/ m/ h: Y4 D! y# {5 |9 _! ~+ X' J' y3 {, l* E. Q& d( C
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
8 G6 S$ \; J6 n' X% `" j降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
# M$ e- L' h7 y/ m7 `, i比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
) ^5 t% R% w8 k, v8 r3 n
0 v; h' ]8 |! l
cstate1.jpg

2 I2 X$ s- A6 ~$ M* S$ L
1
; h7 Y, m4 x( _' I
2. C-state Control
* F# N$ J1 W: H5 ], U8 t
2 P; e# w3 |$ a7 k2 h+ U1 Y5 ]* V1)
$ _- p3 m; G9 l6 `9 E* q7 t( O  T$ MDetect & Enable C-state3 k0 x2 l' U  H5 W9 y# z2 d0 E
3 c6 n( M) F1 B
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的支持。
8 B( R# m: y# o! U& f/ g/ w' G. `# L) \3 w
2)
. u1 O7 w" e" m! r& ]5 QC-state Basic Configuration
* x# a* R, h- |6 C' K# s通常情况下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)。5 J% r3 r* \% _" \  q/ e; Q
& U% }4 _% {) L1 Z
3)7 M' X7 x2 J3 M  X! H4 F6 w6 D
ACPI Structure For C-state
) b/ Q& X( w9 d- a# ^+ w
3 B3 q6 v0 ~6 B2 F0 Cl, H) S. ?9 [9 e; t; h
_OSC & _PDC4 k, I% m* _* G* j
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( V- o# F# I4 O% Z; o0 D: I" t1 Ol
+ G7 Y4 z6 ]' M
_CST4 j# m8 i1 a: M* u) W6 F) _% h
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
  _; r- @  h2 B, b2 f! s/ \CSTPackage : Package ( Count ,, |* h) K% N1 ?/ S- o4 o  B2 L* s
CState ,…,
) b' p! w+ m3 g& ^0 g* gCState )
1 }: x' l  p  l/ R) a  X其中Count表示所支持的C-state的个数
9 v1 C- \4 Y- z% RCState: Package ( Register ,
( K) k6 R- M; K6 T/ b/ UType ,. j8 Q' M( C! Y' J" d
Latency ,
4 `6 \0 w" e' p  J6 Z( N6 L9 APower ); o7 G3 v1 A( X0 L( z

5 F) K# ]+ F/ R! `4 v! o# D, WRegister表示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# n! g+ W* B2 g9 N) |1 t6 a  z

6 h: ~. K. K9 s1 G' b: O4 IName(_CST, Package()  i; i4 v' S' F0 f2 q

- B- x1 M6 ]# ~/ }{
* q# @* N& \" \  n6 g4,+ a3 }8 R" e$ x( c6 Z+ U) z; P
// There are four C-states defined here with three semantics

- H5 d3 a+ v: l  ^1 |( w- A3 F0 ?0 J6 g3 W
// The third and fourth C-states defined have the same C3 entry semantics
0 B0 a5 d3 r4 A; g& F% d- b: f

/ F, R- _1 s4 }' F! i- SPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
) d- |! r6 Y9 [' P( V' }0 K1,
$ m3 d5 r( X* M20, 1000},. P9 g- ?7 Y3 C% _$ ~) P

2 |  r9 a/ |+ V5 `5 zPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
( w% [' {& k' l$ u2 }40,
  K: S' }" a9 x! i3 m4 N750},
5 _' I6 t& W" q7 M' ~
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
8 E% R, O# h! S) h" `60,$ y7 C- n* x# t) B; C
500},

" L- C$ b! z0 Z8 b. ~- }4 APackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
( h0 {! T8 a+ U6 {: s, [250}
) q# T* B% a& s8 ~* L, Y0 Q) t8 v
; y' |7 s: f" S3 N( L' p" g
})
( s1 i1 D3 ?3 J9 R7 X. u3 V: p7 ~7 [; V9 ]
l, T2 x4 W2 P1 L6 G9 S+ c
_CSD
# f$ V$ k2 T  [( |
: |: }1 ^; y4 Z6 MC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
+ M6 q1 v, G6 U0 Z" o! J9 Z7 [: |! X* ~6 K  W$ d, f

! Z6 [2 J4 A/ d# P2 u8 {
& G3 e- U$ F! G. n$ ~
& [. B9 W: I6 [4 f& ?# [. h2 O, O" L3. P_LVL VS FFH
% R* w/ y. _! G
1 u3 N8 {$ S: g/ h- O; g0 rP_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
$ @1 f4 T9 W' p; r: i) Y/ o, AFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:/ d0 _2 r' c' _

" o; ?8 l/ c& X3 Q9 Z0 R
gas2.jpg

4 O2 P: F! s$ h" d& p4 r7 q
2
! e) G, }0 t( ^$ x/ W+ M
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的一个例子:8 u( j# n/ O9 A5 E! M/ q8 A
Name(_CST, Package()6 e4 H, O; y' W
8 v# @; v5 d3 h
{ + y3 C1 G- Q% e! d) c& ?) D
2,
. z+ ]2 j$ q2 k3 H2 W// There are four C-states defined here with three semantics

4 B# x- y1 e  [/ [5 O" W4 f0 R' E
: X# [9 h# b6 P, L// The third and fourth C-states defined have the same C3 entry semantics6 k' m2 g: [' E* I/ Y, Y& a. ]
. e3 N+ r0 f5 b/ s( B. p7 P$ P
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},# z6 J4 }  S$ h2 B2 s
0x01,
% j9 c! N) Z) n0x03, 0x000003e8},* z$ v1 _! j' l5 v& d$ q  r) n; p) [* U2 m

& l! o; e( o) `Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},; Q7 [8 F* |- \, J* b- r
0x01,2 c, o8 P- ^% h( J
0xf5, 0x0000015e}
' ^, C/ F8 l: O- _1 K
})
6 |( b6 ]: m" j$ C0 x% i; X- T! I9 B
' b; C7 n7 U+ }# P9 H9 Q, P
REFF:
. b/ `2 q7 E$ Q9 ~  J- v: L" `1.
6 I! U+ o. ]  D  U# n' b  UACPI Spec 3.0
+ B( p+ `# U9 H  y2." A6 e) h6 _2 j' T7 J" a" `
Intel Processor vendor-Specific ACPI
$ h5 o5 D: t* v( J: s! J, P. ^
6 U% y7 r% s* ]' ?/ D# N. M
( o* ~+ b" P4 f0 d5 T/ J. L# MThat’s all!
- P7 l. z$ `+ k7 D7 w
6 Q& q' Q8 Q9 F1 q: I9 Q9 DPeter
0 R! v, E8 ]0 E$ c: s( P* @2 A$ [/ F5 ?0 t  i2 R$ A" M
2010/9/209 u- M1 H8 f. j6 r

+ {8 Y3 ]! L$ a1 o/ H[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
2 U' N6 x7 ]  F8 t, i2 a" p4 p" | 3 m8 w$ U" w8 F: O. o1 K
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
/ I3 I  p, o% Y$ s+ @' u+ Q1 Z# kEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。* l. c5 y5 h- `  t; f

  f  \" o  A, J6 \. M# \2. P-state Control0 n) B! H; o2 e
3 n. Z1 I5 K* {9 g" d
1)
0 S9 Q9 Y6 `- `6 [8 g# c5 p" IDetect & Enable P-state( c9 }% F& Y' N/ K1 O

9 ?( y! r/ Z5 u- C/ b3 HBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
) j0 Z) e8 r. L  O5 V   F) g; J0 H6 b$ Z5 N" q4 r
2)
% `! r4 w9 ~+ [1 u, b6 gSupported P-states' W9 }. @' x9 b2 b2 d, N. y
0 g% U$ x6 l2 z: T9 D; I
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& f5 C9 W( {, m0 @- k
7 V1 O% b. C- f+ y
MinRatio = PLATFORM_INFO
5 r3 C- r7 ^" FMaxRatio = PLATFORM_INFO
# r) c* C* M& K* g- m; ZRatioStepSize = 0x01, @  n! i+ H% j) s( d9 Z
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
. S0 K- O+ |% {, @* ?9 v
  C- {+ n, |& ]+ a/ w/ q# K: V' pIf(NumStates > 0x10)
1 l; B6 r; ~! H{
4 I# x, f$ V4 a9 P! i2 n! VRatioStepSize += 1
9 v) o* D% T. [NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
( @+ j! A( X. \. D( n, N}! A- K2 A, T2 E& X

  }6 X% q) x* U; E7 R3)
  R4 s" U0 g4 y/ e) ITurbo Mode& N) L! c% W6 [& A  N8 y( f

. y3 `) U" x5 ^1 w' I- xTurbo 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* A* u. A$ q& c9 {3 e: j
9 @& L3 O5 q, _. w6 d
4)# {6 Z+ R4 P+ Q; K
Over Clock
9 v7 A7 S0 |1 \" J: f) ?! @' {/ |% F & s# Y2 Z: ^  M% N" P9 t( I
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
% ^! [/ {! O* S  m0 w) J $ c, x4 c& }' b' L
5)7 o- F. p! u1 O6 G1 h& g
ACPI Structure For P-state8 r- s$ d# t/ n4 P2 o) O2 X

( @! s. _5 }) R( I) f" ml9 [+ a6 L6 P  l. y
_OSC & _PDC
* j2 ^  |) A4 v% C
" {: _1 g. y$ U9 v) u5 s_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
( O7 M7 u6 ~# ~/ M6 f . e; _7 j; E9 Y  }% i* H8 i. g: [
l- W6 {6 D' }! {$ H7 Y
_PSS
9 B7 y' i9 o& ]' A, fPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量) c1 X% ~) U8 n
并且通过一个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做比较) r* c5 I. F4 S) h% U
以确定P-state切换是否已经完成。+ G6 M, ]& ^" l$ k1 R7 I
0 ~$ V4 r8 ^3 \1 [9 I
Name (_PSS, Package()
7 B+ p$ B# i: U: B# k0 J{
4 b/ K6 x/ h( F+ F: R+ @// Field Name6 i/ }) k+ I) j" p' N1 _/ ?
Field Type / i5 i  }; s: t, @8 P3 j- M
/ Z1 J. X% |8 h  T' o* {
. j9 o4 |9 }- H7 C) O8 `
& P; q9 c, u: g' t  `
Package (): u* v' u+ b% h' \! I
// Performance State 0 Definition – P0
& _9 A2 {, L# i9 r) o1 q1 w3 H+ _: l& X9 l; D
{. R3 d/ ^9 ]6 c% R8 ?0 I

6 V, g* ]% b/ \5 d7 }( k, ?3 k* N; a& e' S+ `3 h0 T/ _
CoreFreq,
. E% Y) i6 }( T8 v* E// DWordConst
. k$ h9 p! Q4 o- _0 v1 N7 }9 I4 w! N
* {3 m& B* o2 ~
5 U- e/ M+ \! s7 s6 Q- IPower,: M; g# W' p0 h" h) z, ~6 u
// DWordConst
4 n! g6 ]1 u  o1 ?  }& L0 w
" J' m; u1 i4 zTransitionLatency,& b/ Z" X: ~& @5 m1 A# `2 w
// DWordConst
  n2 v6 Y7 \, h  x
5 Y& q3 M+ r0 m! y7 _BusMasterLatency,
! |& @/ T. B% r8 A// DWordConst 7 P- R- F, D8 U- b. v! @% J
2 E, T0 M" J' @, H: |1 g3 A
Control,
- E4 b$ w1 m; [0 w- C// DWordConst
" Q# X( j  Z$ ?* D0 k4 l
4 t1 Q2 ~9 }3 oStatus, a+ U9 a  p4 P! C. H! e4 [

; ?3 R1 w1 x8 b) v5 e: r// DWordConst
7 u2 W4 m' I4 D
. f7 y6 H" n, r% r( y}, & i$ p( |$ {3 c# u, y6 n9 s0 a2 ~
5 Y+ \: m9 ^) M
. : x0 f1 |) X2 c
4 ^+ {( [( }9 `% T: z+ ]& [
. 9 z  p1 b" k( ^

4 @2 `# X8 d2 [- R8 n( W6 ^* ].
+ x& ?7 ~% R  z, o}) // End of _PSS object( u: m; U: m' E
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 6 l, N1 A8 `, ]8 i
( [& I7 J) S5 b6 y1 T
Name (_PSS, Package()
$ D& P. L' K. p
6 m& m% S0 b0 g. p! C4 y{
, t# ~' t3 a1 B  P* ^
  y3 m6 n7 p2 MPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 9 \( B: u4 Z/ l
/ c: Z% n0 |6 s1 }& ], V
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)   u2 `/ B0 Z. y
5 p. c% B8 i( J) }
Package(){1400, 8200,3 F6 g8 ^' I$ K- ]) A; O1 K% P
10, 10, 0x000E, 0x000E}* w+ y# j2 T% l9 q* Q% U5 L9 G  ^
// Performance State two (P2)
6 {$ A6 G3 [$ Q  c( z( _% MPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // * ^; ^! O0 l4 U
Performance State one (P3) $ s/ a9 A& t( x* D, n8 b
! c6 P0 X9 H0 ?  w' U
Package(){1200, 8200,/ b3 X9 Z, w5 y
10, 10, 0x000C, 0x000C}
  M0 T. v0 J! n: F: r& a// Performance State two (P4)
6 M$ V5 k. Y5 D! Q6 b) m: P! D+ P, U: \& {! a
}) // End of _PSS object
& \+ _$ G4 q: G5 t+ B  n* r, ` 1 b7 }! W6 V8 {
另外当该平台支持Turbo Mode P0将会reportTurbo Mode, _+ _1 \' Z' L  h: w* y
3 V- w9 R, N  ~/ z
l
' Y. b: N/ e5 t1 _. o  v! e7 z
_PCT
+ n0 f9 B6 B- O6 P+ q- A7 e! u8 ?
- p- d" v5 L' I! C4 o1 h4 lPerformance 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的方式来进行。+ m, g' O  F" ]6 y2 s
; B, L5 _# K# d
Name(_PCT, Package ()) Y) @# f3 B7 {4 e% Q, J0 H* v
// Performance Control object
: _& ]) v& `. X9 B" g0 {9 u  b
. O, r9 p% J3 V+ [8 q% I2 U{
' F4 D1 F: e, i1 _/ f* }
6 G, M, i* N3 q1 PResourceTemplate(){Register(FFixedHW, 0, 0, 0)},( V- n/ V( u3 o, V1 L
// PERF_CTRL
4 Z- R. [! k; e7 c" ~
. M  A6 n) p: {& oResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, E5 p* m1 @& n8 _' \
// PERF_STATUS $ m5 d# H" Q- B0 e

8 G, F" W8 n6 M+ \8 Q2 y7 F}) // End of _PCT object
  y- y" q! ^9 p, d& q
- m6 O2 z. O& i5 T7 a$ Rl4 w; Q* _( ?5 V0 e3 K3 a% v! E& _
_PPC
6 i7 Q: C' [# O
1 V. O& O0 C7 S% }/ I+ O  N& f* sPerformance 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
0 x8 N1 E* U' f
( |. l6 d$ T  z/ V& D, x4 qMethod (_PPC, 0)7 F3 Z' |* P" I% X
// Performance Present Capabilities method
1 f% a! {- z( N0 f, O+ g+ ?: t4 I" ~
{
* c* j! ^0 y6 T2 _  j
9 _! l2 B2 P/ m" s  ?" v7 Q5 f, TIf (\_SB.DOCK)
5 t# g# x1 ~" @( n, [9 N  M1 j9 x  b8 J+ a
{
6 F; y) k, [% u# B2 ^
6 m. h9 t/ J9 ]* BReturn(0) // All _PSS states available
; _" Z: ]0 |. W, l1 g( N
# p4 c- C6 V* p: k( f: Z& G3 m  k# g3 F7 r
}
, H1 Y) R$ j2 u; i) D: h  J8 w. h% T! ]: T
If (\_SB.AC)
4 C4 ?9 O; C0 J, a: n- J5 |8 a2 i/ F5 ~' o' T5 P# M7 q5 [$ M
{ 8 D$ X8 m, Z& _  |' h
0 P  S$ J4 z5 H2 s2 `4 h5 _
Return(1)+ l9 v5 @1 @) @- M& w8 F3 y; ^
// States 1 and 2 available ) r* a$ c% \: w! {/ F0 Z

2 K- [- @, l8 z# |  E& V% K}
. C2 M% V  R  G8 d6 R1 M% j, K; F* D
Else 6 R" E. L+ N+ C- h/ T
6 g+ M2 j; D$ g0 s  Z! r# D2 D
{ 1 I4 T+ ~+ J% Q  E% q2 N  A3 I
4 W8 O8 K" z2 M8 V8 }) L  Z8 {# @* U
Return(2)
5 Z2 g! p( x; o4 Z9 ~// State 2 available
3 T5 M$ i5 C% U
9 x, `6 S& O- @1 {. Q/ g- ^}
9 x+ Y" K" P8 p- }; {
! K& X0 @$ I  d4 W2 z} // End of _PPC method) |7 B' r4 H" i- W
6 K. f" ]: f# H" A- U4 S8 N; y
l' U" X. u5 {) p4 h+ Z
_PSD
( e' a* M2 X7 s
$ G2 r4 p& A8 W4 s& o# b: iP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
6 J5 u* I- U$ N7 X: F- e) d* [ 9 w% r7 `& v2 @+ J( s* Y$ Z" w
REFF:
$ m: c+ K8 g: ?- U& N+ e: R/ B1.: G; _- S$ y; T0 J4 c5 h( D
ACPI Spec 3.0
, Q: B8 y8 a! s( W& U2.
7 m* Q% L" }% X3 ^, dIntel Processor vendor-Specific ACPI
1 m! b: `: w  I2 x& }  C   E+ b1 `4 ?8 J, I( b5 [

; P- Z( x/ z* [- e- q8 ?That’s all!
8 _2 `# h8 H3 [ 8 w/ {# C* G. J
Peter
# g) t# Z+ z. x8 E' J8 E 2 y& D! I% O0 e  k4 ^  ~2 }
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview& X4 t  |2 H, B4 \8 s: Q

  m( v' E/ Y5 x3 x0 H& 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工作时间的占空比)的方式, `' p+ \# ~5 }& m" }1 T) b
,影响系统的功耗和温度。
8 D$ N& H* f3 _* ~7 {  N% m # U  w5 _: }' J  `0 W) S
2. T-state Control2 W. J9 c+ p- I
0 V) b/ F! F* v2 \5 U$ f
1)
( T  @8 _5 D5 _/ q, w- nMSR Based Control) z( ~# d/ ~# q

0 b+ s4 p. ?. M7 g/ v+ D& `BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
4 g; J6 {5 X: j! N+ k4 r
+ i. v2 V) b$ Q- O2 R  a" O5 X2)* {7 `+ ?5 S1 K# Y) f4 }9 W5 i
I/O Based Control
: `, h( V! _1 H& h: M" J
9 i, H% `6 q/ Z: I: h+ t$ S$ v除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。: X+ o7 n4 `+ Y' p" d  U

- j4 m8 F( I% Y: i, B" |6 o3)( B7 z% n* v( N0 H* e7 V
ACPI Structure For P-state
  Z! K7 o4 F# X8 ?l
3 d( f0 O4 B1 E+ a9 b1 d
_PTC
; `5 a7 E$ o: J0 U( v" c. l7 @
& b* C* l7 e* k, w, T# B8 }6 JProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:# ]6 H; t* s" L" n6 @+ R9 O8 x
- Y5 i( N, [6 j4 b( i* J1 |
Name (_PTC, Package() 7 {6 K0 N* M# N9 K4 ]3 ?7 ?) d( {% T
{ ) [9 a( ?5 Z2 w4 k6 G2 p3 v( z

$ I* R0 p' W, O- i: Q2 EResourceTemplate(){Throttling_Control_Register},
5 V5 |# _8 M& `" N$ }//Generic Register Descriptor 5 O% ^. X& ~& a0 V2 Y

) C# M/ B* |" ^! Z& c& N2 X% GResourceTemplate(){Throttling_Status_Register}
' s( Q7 o9 ]. u7 e5 `% r//Generic Register Descriptor ; N  O4 K) h2 M% t4 O& N- Z( b* O
}) // End of _PTC0 Q( j, k' A3 z% g

0 }; D( e. \' D下述是一个sample code
1 t/ L" [! V1 F+ k+ b# U8 f ; |: J3 X7 M, x1 J/ N

9 A, ?( Q. s0 q' U( D3 Y
//
/ F& P" ]; D- _) O# n* O
0 e2 d/ n5 }4 Y' p" j6 l// T-State Control/Status interface
. J- H1 M  m6 D* f0 p/ _3 ]- K3 w$ t- ^* n0 s" W
//
$ L' V/ H5 |  g. F0 c6 \
. P1 c& ~2 P9 \Method(_PTC, 0)
( W$ _5 ^; h6 c9 |2 W- L' S# T& A6 `+ b. y
{
5 [) k' T# e$ F) {3 b  p. z/ f# }- m0 Q# V+ x4 \6 q. ~
//! A( v4 S$ i0 M; L
6 H' b9 W8 X* s8 S
// IF OSPM is capable of direct access to MSR7 k$ C0 \3 c' q& j* h

* n" {$ _4 G3 S4 b( {8 ^//
$ V: j- H2 f1 l, \8 mReport MSR interface
& \( W% o: |5 y% T- M, t
' c# Q0 ~; x! h* e. S' k! w// ELSE
2 j3 ?* n& c5 I1 _) v, X! J4 [3 \6 Y- K, p( J; X# W; ]3 d! E8 L
//
2 S7 C; @/ `6 U' E  \Report I/O interface6 ?" H/ }. m9 w* Z$ `3 n
% N* P+ U/ g0 ]- N) B0 U" ?
//
: y2 Z0 m" M7 W, }/ d9 [5 U2 Z9 G4 H. m" p7 m
//
- |% I& d) l, `% J' [. }PDCx[2] = OSPM is capable of direct access to On
: ^3 e& m& x3 N( H1 v' k, Q3 C, y4 a
" T) W7 m, n5 W//
1 Z8 h" G4 K$ r( x  \5 e, cDemand throttling MSR
% O7 g( u% v; t4 T5 ?# x
# a% f" G% }& N5 z//' \6 I7 t7 A) ~. c' z" U* r( }' I
  ?7 H* Q3 S4 J7 Y5 T2 ~" w9 g
If(And(PDC0, 0x0004)) {% F& ?1 t4 ~" B2 \- c3 i2 u1 O5 s! O

! x. `4 I4 y/ t4 M0 h3 }/ jReturn(Package() {: j* o' I2 D* n. }8 k& n
+ `7 y- p* g! g# H5 ]! \1 {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},7 U: ?6 c9 n1 U. ^9 k' _
# m; q9 f3 f4 k/ U# T3 S
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
+ Z1 D7 ~# g2 r/ F  o, s2 f- M, v
& A  n' {  D6 |})
" V' g* e7 S4 T& Z! h  V1 U
8 E, E) C# n0 x. ~8 O3 t/ l' L}' _# P% \8 k2 p& ^. e- y
- }1 @; ^7 Q/ k8 J) F
Return(Package() {
% N+ o9 T; D' H! T" c7 y+ F5 t9 R( V) `9 _, G# Q  }. G
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},7 N$ D) A  `( F5 Q: P! V  r/ s

* G/ i7 _. {  i' A' FResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}+ r5 A* h- e9 a3 T9 P

. V! z# w, s( L* m( N})
0 @& \6 o% k4 O1 e7 A. }2 L" j! ]* I- V
}: p" a% C+ I. w6 W& ^) l

" |- t, t6 u# A' L' a5 ]) b" \/ d) l/ \8 i: ^% z/ v/ Y
( M) U. X$ n# U8 V5 k
l
6 g* r8 m( L5 t8 E; j
_TSS
  A/ j: ^1 ^. x/ o+ d7 v " C0 |5 L* l6 L* y& x
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
1 [0 v' j4 y$ V9 f: M1 q$ MName (_TSS, Package()
' Z- N* @" b8 L# j2 e% x{1 A* U- I5 Y1 E/ o& j6 [
// Field Name
* u2 y$ M. _: M' ?7 hField Type
4 }! ]* D0 B4 L* P+ A8 m; E
; e2 Z: M( y# ^6 E, n: x" C: e2 O: H. s, Z) x

6 b/ l  h+ h/ {9 iPackage ()
  R' r3 f1 I3 k) X// Throttle State 0 Definition – T0 / D7 O8 N1 \$ x8 {
1 o5 u% }9 {# g4 o$ h  I
{
; x! o% |+ d; l
( Y7 f4 O/ T0 t; D  }7 a- h- e9 Z
9 \5 q, M: \9 z9 OFreqPercentageOfMaximum,2 u+ L" \2 z4 D8 a6 M3 `
// DWordConst 2 `* k1 X4 u4 L- M* ^" A: X# K
6 R: _3 P3 |: X: N
Power,7 N. c' P1 q+ Y' K( l
// DWordConst
! O" J' H6 W( T" Y! T
, q( M- b4 {+ @9 D& \TransitionLatency,
  i8 m3 ^8 n, G! p// DWordConst 6 _6 {! N% v6 l* H6 ]
0 Z& D8 {6 c9 F9 }
Control,
- w9 x0 I# M$ D// DWordConst
$ t! Z& ]' e% B0 ?2 }- Q1 h: a& T% g9 w
Status
9 }$ q3 y: [5 O5 X* P$ q// DWordConst
  T' M+ n3 c7 e7 U  _},2 i! A) u& P: f) _1 v
……
/ m: n8 S  u2 J4 @1 w8 k1 f4 I}/ Y* q$ `. _) d" X; W
# ^# P; D, p; ^
Example code 如下所示:9 T4 H: w2 K+ Z+ U; o0 `/ w

/ Y/ X- B' M9 N% [# SMethod(_TSS, 0)
# ~' `: \6 B- D/ W% w8 c$ G& O3 q! h& B3 ?1 w/ D# h2 d  f
{
- ^% K! s- X" {2 `8 C9 O/ p) @' G
Package(){100, 1000, 0, 0x00, 0},! C+ o4 ]1 g* w" l& t( z

+ v9 t& I' z. {) Z) rPackage(){ 88,8 R5 P9 X1 O1 f! f* x8 S
875, 0, 0x1E, 0},
' `# }2 E: F3 w* I; J- y. v6 N  h4 V( K: V0 }% j$ A, }
Package(){ 75,3 Z8 Q  ^* y. F
750, 0, 0x1C, 0},3 S' Y5 H# k( b
+ R" H+ D# C7 u- T
Package(){ 63,
3 i2 L- ^. \! e$ L625, 0, 0x1A, 0},: I$ S/ R9 h7 h' b3 ?: V4 a8 [
" N  z: @- z" l$ K7 m& B
Package(){ 50,4 R( o, G. V# n" [: Z2 p- V# o
500, 0, 0x18, 0},
4 P0 m. S6 E3 l5 h/ \* H7 v4 j
Package(){ 38,: b+ Z4 X( G" z) M
375, 0, 0x16, 0},2 i7 O* |1 z2 r6 [/ R5 c9 [
& N7 l, I% a: }1 l9 S: g, X7 i7 s
Package(){ 25,1 b- R$ z# F2 z" P, k9 S2 _/ h
250, 0, 0x14, 0},* l5 V- l! {# v/ H( A

6 s2 ~. `: E) }! a' R# ePackage(){ 13,
9 F) H  k+ a0 g  J) d3 c9 \& y125, 0, 0x12, 0}
. X  V( s9 H- @+ c
7 \; j3 U8 q4 q1 Y; E% l}& z6 S2 P8 _1 s
5 W. k0 O$ Q- r2 z! }& E
% ?! c7 J; y( x: z/ C8 k, Z
l
+ U/ `. C; w- h  _5 p
_TPC
" w3 ^$ [5 |/ X0 ~ " e& v' v- G& i" ^" Q5 b* j
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC" Y9 b( }6 I& @
, C8 `+ U6 V: J9 x" w: B( A1 u
l
4 P' Z; n/ \0 b9 N; g9 ]: L0 V
_TSD& R$ G" Z+ z- E: d, [7 O9 J6 f3 l& K

: R, t% _7 L2 n6 a  GT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
% [/ ?0 [2 m+ g7 ?- V0 M ! E) ]6 Y- p; u0 C( p
Name (_TSD, Package() ) L; I" V6 Q* [2 L; D" G/ j7 M
5 j4 ~  s) w1 I! e# ^) {% |3 S
{ ; E+ B2 r$ K0 _
' L" a3 C7 D3 O5 K4 C
Package(){5, 0, 0, 0xFD, 2}
% K" K/ V7 @& \+ b- ~) B  Q// 5 entries, Revision 0, Domain 0, OSPM
5 B6 A: @4 n' I8 g1 W' VCoordinate, 2 Procs
) K0 v+ d2 d$ C
/ ?# n; p/ n& |: n2 ?& A4 U) B! d" N0 B# z9 o( h
}) // End of _TSD object
2 s2 @# L( s% i7 y : n+ A7 T- I- X1 @3 P
REFF:
2 {& \: g8 t: L! i6 S1.
; d- ^8 N# e$ ]* J1 h0 M7 ~( aACPI Spec 3.0
0 r$ }! w4 g# p- r! G4 }6 n2 l; |2.1 u6 G* u5 \4 Y7 R. `2 y$ r
Intel Processor vendor-Specific ACPI
+ D' S0 C$ b1 n$ f2 t6 x & p/ f& K& J3 v; v& C

. @! s, ^' L! g4 t  @: ?7 O8 o6 MThat’s all!
9 i+ j% |. `1 Z0 M4 L/ M7 n
% o+ f; f& j# c) v( l  zPeter
: C  G' a0 [) B# t$ H! [ " Y0 R. o# M- f' M9 [# @
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 17:43 , Processed in 0.164208 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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