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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
- R; ~4 u  Z3 D$ U
1. Overview, v% j2 ^- I$ ]6 L8 E% H) q

/ e: v9 A4 r# x2 B% |; @1 p3 w- U
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换: N5 _* |8 p1 G  v
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看# Q! r2 d6 w. y' s  K6 X. \
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。8 t( V' q) i: s: ^7 _* x1 j

2 ]3 \5 C) k. z) ?, a1 @# \. _5 c
cstate1.jpg
% n6 E! C9 g, H& A
1

- d! I  C$ l) |6 O0 l& M/ K2. C-state Control/ A' J8 X# n. j  |8 z/ c+ O
" S& y2 P7 f( U4 @2 h
1)' R( `. w- J, ^  t! G# N
Detect & Enable C-state
. o7 A# o5 g) o( q3 s
( z8 f: R2 h2 V. E) zBIOS可以通过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的支持。. }4 o  _0 s6 _" h8 ~, g) {% K
9 _; w0 X7 M5 _4 E; F) D0 ?# U
2)1 b, I) K' P+ A& I; F7 s
C-state Basic Configuration
# f  Q; e2 `7 \! 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)。
1 P/ i$ t/ e- h9 R1 T5 Y" z& ?: x" p0 n( ~+ L' l
3)
9 J$ z3 R" O/ s/ P+ N! IACPI Structure For C-state5 Q- ?6 e4 k; W+ p( x% n; G  m
" t, m$ I' R) _
l
; o0 _. m/ [" F1 a+ Y
_OSC & _PDC( W! A& R* F/ [  f( U+ ^; F3 E8 W; [
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
6 r, s$ E& Q8 e  n0 c+ @l
) [/ x* E& i5 `: y5 K: B: i2 d
_CST
4 K3 R2 R. B* n  j; p2 h3 }_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:: Z5 t6 z$ [$ e
CSTPackage : Package ( Count ,- u# j  H6 @/ b2 f- C/ i/ T0 _
CState ,…,8 S! C' |' L9 x, L  q9 J' }: e
CState )2 V4 S+ m& f$ H+ g" R- Z
其中Count表示所支持的C-state的个数% Y1 {( M  H5 D$ u; n7 L
CState: Package ( Register ,6 ~. C" C/ b$ f( w
Type ," [6 B' ]! _  ]
Latency ,
! |1 _7 e$ a* E! NPower )
; q  t1 e5 `9 }9 x2 z" D6 a" p
, [4 U. d) |& s5 y; L: w  ^/ G: A# H  ]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
9 N. j3 I* V! k, b- h; T/ a3 U& Y5 I  ~- x
Name(_CST, Package(); F: E  o6 ?9 }7 ?) C5 f
, a' B8 n, G) d: g6 s5 \; F: R8 T
{ . [& U8 n/ p/ U/ y, E2 h
4,
/ J- I: h( v- f% k4 L// There are four C-states defined here with three semantics

: J0 w( r  ^4 W: N/ o! f+ x, F+ r& ?' h1 G6 Z; Q( s" O4 m' @& m
// The third and fourth C-states defined have the same C3 entry semantics% q: v& E3 E2 C/ N+ y; R

3 j* r5 q! e2 B2 ?  kPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},7 V, ]  _8 z8 ]
1,
& ~, H3 T) o& x, z4 v" ]20, 1000},2 t) K7 x/ t- J6 e* u

; ?+ M2 n8 w. M* HPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,# L8 C% f* ?' j& L: J  ?
40,
' A& w# c, I0 Z/ D750},
) T0 B, P) k2 h) s; S% }. d% s& r% V
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,8 }( T' o1 {1 \1 B0 `+ D! H
60,0 d2 A6 A8 \1 R
500},
6 d& y9 P) F2 L2 h& a4 X, B$ S
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,) O. d3 v4 e% [% t
250}
( m2 L5 D% u; W' {1 ~8 Y0 p

( N2 c0 h2 ~# z! v) o})
9 t8 K$ f( \4 `+ h" K2 N1 }+ h! Y# p( I. k$ t2 W  @6 G; L- q+ R
l
" f' q( `0 C2 H
_CSD/ h* {* t$ ^: \) o, c
& i7 W$ _: C+ R. p: f
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。5 }# E0 v& l: M
: L" A/ V7 g$ B4 ?$ ~* m  G( z! z
- T( T  Q0 q& a. k

5 Y3 w: N% u% L+ E# f( G+ P
9 m* _7 ^4 U  Q% e: o3. P_LVL VS FFH# I: l. H! a* r- _0 A. a$ S
' V: D7 S# N1 T7 I9 P  e& L
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
' o" x4 C7 ^0 S  I  g9 y( gFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:
5 X3 z7 y) _, U/ T  Q% y5 ]" q/ |/ n6 M/ w6 k) o4 F4 Z+ V2 R
gas2.jpg

) Q( d# V. n9 t& i1 E! B
2
6 Q3 E. }9 }5 R+ B$ F5 r9 R
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的一个例子:* X  S0 B2 U0 R1 v- X0 d
Name(_CST, Package()# B9 z/ |; m% b/ ?& ~  J+ ^
& M# k3 s! |. m' `! [" s, U/ w
{ # E; Z2 F$ ]& G* ?
2,* i( M& N2 A; h5 z
// There are four C-states defined here with three semantics
3 \2 {$ T( |. I

: D# k. z: W0 ]$ x4 l; P9 B// The third and fourth C-states defined have the same C3 entry semantics
4 E% {+ c  ^4 G1 i5 e7 A- A. O
/ h- m" M1 j1 l* T- T
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)}," c6 M! z7 g. O
0x01,
: E3 x! a1 A3 ?. C# E5 O0x03, 0x000003e8},- w, I- D* C3 |* L4 \
/ B* g3 \0 G& L7 [! ~
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
8 r( }0 P  i1 `4 p$ \5 \2 m# H0x01,
3 f+ J% a$ W5 E" K0xf5, 0x0000015e}
( a3 p( z$ f! S" ^) X6 K
})
6 ?0 m% v* [) F5 f8 ?0 Z* F
* n& r( i( Q! F
: D: e* D4 m8 m& A, ]% R5 p3 UREFF:5 C2 o" J% T6 p4 _# e
1.
% E, p6 Y2 a1 i3 KACPI Spec 3.0$ N! ?/ ~. A4 ]9 P
2.1 _) `& l* G9 E
Intel Processor vendor-Specific ACPI
7 Z& V9 W9 ^+ R& M, p. g% ~4 j7 o, k4 l5 Q1 Z% m" \5 M
! Z; Q8 n& ]) t7 l: K* |, b
That’s all!
! y1 @8 o, e& d' }8 l+ }& E" N& f6 ]! {
Peter# {! q8 a! |! L$ F0 b" ^) d# j6 _5 q6 J: ]

, t0 P/ O' J0 z8 D$ p$ G7 v2010/9/20
3 V8 k& n; M+ z' y3 g
6 u, ]+ g+ L/ T5 n9 N9 N[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
1 f7 E* e! M6 U- |4 @3 G
$ }8 j) p, }5 h" O* b$ m& PCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST9 ?% f0 e: P2 S
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
/ c4 m& h" a5 H0 \& x ' r% C2 t; x8 F
2. P-state Control
$ E- O! Z  ~' v6 W# I/ { 5 H: y$ k2 U# |( v! g- j
1)+ i0 X: v  ^3 R7 N( |. c
Detect & Enable P-state
9 P" w2 ~0 L6 u8 w+ b 8 m) l  e* _5 b3 i4 {
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
' c) O( p% U" H
2 Y) C  q9 G3 v  P( j2)
' C4 [/ M' W8 a% \' Z, b; v; _Supported P-states
  a2 e" k4 N! i4 a 7 g6 a! P; E9 b4 F+ g( B
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; {) ~* V7 ]2 e$ }

! Q! _$ g! x0 @3 [MinRatio = PLATFORM_INFO
$ e: z- U9 z# d2 u2 Y+ YMaxRatio = PLATFORM_INFO
' [9 N3 M) I- n' s& q7 mRatioStepSize = 0x01: ~# M$ h" Q7 P# t7 ?6 {! `, u
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
8 z7 R' M5 }! n" `
$ R' P0 |# h$ P9 wIf(NumStates > 0x10)3 r1 |' [1 u0 I4 t) N# G
{- |8 z2 h$ [) g4 [
RatioStepSize += 16 g7 F3 `9 q' g4 E- i- b# l
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
# b. P; R4 D; U" u3 E- R4 q! U}
! l4 p  E2 V0 _' z1 |, C
! x/ C; T, U# o- ^1 R' z, y3)% D* y+ s: X7 Z* s$ ]0 A" N: R' Q
Turbo Mode
. |% p' d# L" `8 o
5 S( o  k( ?3 r  O) p3 N) uTurbo 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* G8 ?8 x4 V$ o
; l  F5 s7 M* C
4)/ e) S6 Y  t, h: W
Over Clock: n! E' Q1 f! `

6 @7 V' m. [3 n7 C4 v) {. M某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。6 ]) W5 P2 u1 f, Q
6 u9 l) f( ?8 ^# {2 l4 W! w
5)& E6 v* T; i( n# |8 x, W$ W
ACPI Structure For P-state/ P; a4 S; I* F( I6 p! R: ~

0 z; R- P% ]: Dl, N( l8 T, x. |( d" P. W
_OSC & _PDC; @4 `. K$ V/ d  z* B8 d

" f& ]2 |, r; ]$ V6 U5 H& V2 k% v_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
5 s# x  R/ o/ n/ c$ } " z( \) G! J: O; ]% b3 }6 d
l
/ n# f( W! }: D# r
_PSS
; u/ X  w' i) }" ], h" aPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量/ B% d; D8 D  D% L5 T; y
并且通过一个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做比较) Y/ [8 `! v4 |" V- r- X4 O
以确定P-state切换是否已经完成。
$ V# K5 t4 H" H0 n9 J . x* a$ j) q1 ]5 d) P& R
Name (_PSS, Package() : U' E5 i; @# _& v
{
" q5 q$ |4 f; B  b1 n( G// Field Name
, @/ _0 R* M9 f8 vField Type 9 L4 z+ A, P7 h' H! k
7 K+ K8 b& e% l- y9 _9 M
# `3 T5 j, R6 j0 V$ K
/ @$ C' [, z% Y7 w% c
Package ()0 y& F( c& M/ q5 z" |
// Performance State 0 Definition – P0   c+ I% I, y2 ?6 t" ^

3 C! G4 i2 a! O{
" ^4 j6 s% b1 p. @- f+ c3 Q* X5 y$ L

: u- u5 ]; a3 J, w; a  ]6 A0 v# t$ PCoreFreq,
9 L6 L5 c( V: F/ k  X// DWordConst # b$ Q) K! |# F  ]$ ~8 W

. b0 E' i$ O! D) L! @0 h
. Z6 A9 j% V) L( @: H4 A4 M; Y1 d8 JPower,) Y' A  C7 q7 @
// DWordConst ' \* ^' p5 d$ l/ C! F
" [" b( I# c5 r7 u& X- ]9 }
TransitionLatency,
: _( e7 {# `# p: S7 U8 q// DWordConst
: l. D1 E$ R- z6 y) s, `) d( s) {# `& r! J
BusMasterLatency,- v# R' r) r/ X+ i( w0 s( a/ S
// DWordConst , U" l0 o$ \2 e0 [  q( v, I$ P
& L3 T7 Y. h& l" O
Control,9 d5 G$ v- w6 q
// DWordConst : [9 z: K/ D) s6 u" y4 U6 g7 Y

7 I, a( h1 I2 d; T' K# wStatus; s, b& P* W. J. ^  B0 z3 u

; [% z0 s* t2 @, |. s- J// DWordConst
# z' B: n! Y' c. Y' r/ p4 Z; R2 C7 o* f" m5 C
},
2 x0 |4 Q9 Q$ l
" `- H$ G; o1 ?1 j: M! [. ! ]8 A& m' A$ z6 g3 W
- P0 F1 ^: B; `# Q$ b
. / [6 d& G) }/ @+ z% L) w

5 ?1 M# ~$ i# N! o.
+ T/ d3 }9 R! @8 d- t}) // End of _PSS object
1 w7 D/ ?! G' T2 ?3 P4 K/ a前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 2 \  b1 ^' [9 F3 D5 J/ O& k
/ E# v  z( R* S" |
Name (_PSS, Package()
* I2 x1 \* u, W7 E) \7 x1 r7 I: @
( _' a- S( Q9 W" d3 M2 D- c{ " D! L) z7 n$ Z' R. `9 Q) p

5 [- s: o  Z4 b$ p2 o/ GPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 7 X& m1 n/ E) S% x) ]) @

# S- U# }& j, _3 aPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
) X) j' m3 Y8 _* g
/ H. W/ |/ y. ^* g% P/ aPackage(){1400, 8200,& }" J: Q! b' r$ P) ~
10, 10, 0x000E, 0x000E}. h3 j( P4 n$ R
// Performance State two (P2)
2 _( |( G6 [8 @7 Q2 ]' @Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 6 d4 L8 K. `! R' h% g
Performance State one (P3)
$ N. S% o) C9 E3 m4 v0 S: s& a+ n, W0 M( z. R! u% E% _& s
Package(){1200, 8200,
/ a' x2 j% G4 g5 s6 X# k4 Q10, 10, 0x000C, 0x000C}
+ }) j. f# _% g// Performance State two (P4)
" i. x( }) `  E( Y9 j6 x! _: K, q4 [7 x+ v0 M, {
}) // End of _PSS object
- [9 a" L7 N. ^  A# t$ o; _ & q  D  ]& G# }# p) G
另外当该平台支持Turbo Mode P0将会reportTurbo Mode% }: c) n1 x1 k4 p- ]! A4 }
& S  ^3 ~: @' {- [2 p) N4 ?
l
9 O8 y1 r, `) n3 b% w
_PCT8 O$ l1 A& t% F3 D: o3 q3 l

5 s! J: F& r  n0 IPerformance 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的方式来进行。
/ S5 _8 s* k0 [* V0 o8 D$ \* X
8 Y& x3 i& e, Q4 x7 j3 J0 o* `: Y% ~Name(_PCT, Package ()
- v! z/ v! A) G$ w: }  Y// Performance Control object 4 V1 C! V* E7 s# J! E! I

* ]$ i6 P9 B, a6 O. m7 T{ # `7 G# D2 I. n
8 v* m1 c. [) f1 Q
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
% T7 P4 A! `) h6 C, H; g// PERF_CTRL
& u) G, D" Z- d7 I+ G
$ K" F- K: j$ g& X1 u7 \" T" p% [' ?ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, {0 Y6 ^4 \# T" [4 q5 \
// PERF_STATUS ( B' e( Q  @; k0 _( k& I  f
6 Q8 d! j/ d2 E& n9 U
}) // End of _PCT object
- i) V5 O" Z6 W# N+ C( e
' Q7 v0 D* r5 u( I4 n0 C3 xl* O5 T: \8 F) M! c- X# S% Y8 U
_PPC
& s. J8 s; A  Q; \8 y 0 Y- _) O) x0 w5 {
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; S$ a; M( w% k" `

$ D9 U9 f5 s3 K6 v, n) [Method (_PPC, 0)( @1 _$ V( _; O3 ?8 w8 P9 J$ t
// Performance Present Capabilities method + `* J7 K* P3 Q0 `

5 S5 x' m3 B: i{ , K+ ?6 O9 ]/ \9 B  N1 G3 p7 J

1 X* L' |& j$ c8 y2 vIf (\_SB.DOCK) 6 P/ J5 `6 _" ~9 ?
5 o1 U3 \/ I7 b3 P
{
; L& I# v7 R; A) a/ e' x# C3 C" `$ h8 d$ F9 p' Z
Return(0) // All _PSS states available' y& r9 L& V; J5 l9 W% m

- ]% W. g, Z$ x0 n$ j( M! b8 n& K
} ( X( z% \' K9 E5 l; q3 E5 t- @
0 H# T" r8 _  u
If (\_SB.AC) ! I- m) p9 q8 o$ o

- g  X6 i9 u+ m5 w7 B1 r{ + B1 P0 d) w) K/ G. x) `
4 _  Q4 X% |5 p, h5 ~
Return(1)
3 h3 X. _1 o4 L7 I6 M7 H// States 1 and 2 available # B6 q& O8 ?5 \0 n

; \8 x/ M  Z/ Y} ( O5 j; S9 L* p1 R( A2 A) f
+ R$ @$ Y8 s! `  T0 l
Else 8 m% Z! D9 Q3 H' T6 ]7 L0 d. I3 J% p

5 ]4 g8 K: t* D4 Y  o{ 3 _7 j& g5 L3 X+ ^" c9 M! z+ e
. x) I- V& t4 b0 z
Return(2)
3 ?1 O% z8 q% m// State 2 available
% n( s9 p9 c( w5 T
) `5 _' I9 h" i) M4 a9 m, ~6 A} ) ?9 Y$ g1 H3 d  ?3 p: v2 S5 Z# f+ O7 Z
! S* k/ |& @  @
} // End of _PPC method1 e" F5 J2 C/ z! ^- P+ H
/ ?% n, n- O& M# j
l
( y+ T' i0 q& W8 ~" F
_PSD/ R1 W" {1 ~. o1 z# ]
& j" Z2 v4 Z6 Y5 ^* y
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。# v6 o' M! m4 f. ]  Z3 W
' O  U3 {2 o) @. Y, H( [" i& ?4 |
REFF:
+ k$ l. ?( L4 H) o1.5 e. s# z: V9 I9 P! Q
ACPI Spec 3.0
4 P( r$ w7 _! J5 Q' r4 T2., z# b6 s( S$ A4 K# }
Intel Processor vendor-Specific ACPI
* [% s9 E+ G/ t8 P, W4 m) ]& a
7 @8 f( B$ U0 J% j" i / g% s% ^7 `/ S# P
That’s all!2 o4 n5 R; t1 q. ^3 q5 T9 Z
3 O, @' E0 E2 _& l
Peter
% G* i) R' s* k5 i* J1 \: x
! x( U5 L( @( E* u0 W% Y: q2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
2 F3 t) }4 p' j# ?5 o8 u
* v7 X* ^5 `" P; k$ g; @. \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工作时间的占空比)的方式
; O# R; o2 k  Y+ x, }& w6 c) Y,影响系统的功耗和温度。. H7 X8 t7 Q$ [; E% z) j1 n
- c, U3 A/ A/ m& d$ B
2. T-state Control
' \* \0 r# M9 h, o
( p4 J  |* p" h; ]; z" X' j5 O: }1)
# U- @* J4 A+ a1 C: xMSR Based Control
" V$ a7 N7 Y# N2 I" B( s$ f+ { 3 Z# {9 A9 s$ K1 n1 _
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 - y) e" ~0 O# c+ U; D
0 P/ O9 Q# l% J. @
2)
* Q% y9 j' E& i* s6 d- n: m/ p! uI/O Based Control
. P! o% o# ]0 s: y   i- M4 L9 D5 j" H* N" h; m1 o$ D
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。3 F- c8 A- f! _' J# g" U
+ M* Z, b" X# ?* l
3)0 r/ g  B3 ~" E; \7 t9 X
ACPI Structure For P-state5 ?% O( ~7 ~3 `1 L  l$ Q5 u
l3 `( _4 A) @* |6 P
_PTC3 ]% ~9 d, u1 z8 x6 X* P

8 y4 Z% c# n6 P  e1 }; `Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:" h. p4 I3 S  N; A
/ e- |; a# H- T  F
Name (_PTC, Package()
7 I0 o9 J% u: g9 Z& h) u0 p' Z{
& V' t9 t: W1 W2 @9 q& y
0 S' n! n* J* z% M$ iResourceTemplate(){Throttling_Control_Register},8 S9 P7 E$ I0 U# N7 N! y4 N1 L* ~
//Generic Register Descriptor ; M3 E8 x! I& q' d$ \, q! f1 i; ]: _

; Q1 a( E# A  x* z# n8 |3 X/ @ResourceTemplate(){Throttling_Status_Register}
7 U& e! i: \. b/ X6 j//Generic Register Descriptor
4 ^' ?  n. A& L/ X8 Q}) // End of _PTC
" E1 r* @! f$ \) L 1 }# c; d% n- g8 p: o  F  y) `# |' s: m
下述是一个sample code
# t/ \1 t( m4 M! p4 \ & [- T: F5 B- i

! q. M0 C; e2 l+ a8 K8 }
//8 M( ?5 F0 E5 ?: G9 Q2 }

4 K3 H7 h0 f% P" u. x// T-State Control/Status interface, p/ P' l6 a% h9 V) `

7 U' g6 B5 l& O& {( j4 ?7 n//# {, M  i- o* h3 E# u" J! W- \
7 J: w( `5 J; f7 v9 P# T! V
Method(_PTC, 0)+ a( M- N- A8 ~

8 K9 M/ H. u" g. M: Z2 W{
9 s# G6 ?0 J+ _  }4 l
1 Z3 `8 k. E- z4 G) V/ b% m; v2 W( u//
/ [+ k' k/ p+ F, \
5 z0 u% e( ~# x/ d% {/ u// IF OSPM is capable of direct access to MSR
$ V3 S1 k6 F1 u: G% v- b
1 R+ U) ~% D0 I) X( b% Y  N: ?//
, y% R. w$ X% g. |. jReport MSR interface! l% F9 H! `* D6 O" ?! }5 D! g' S

1 y8 c  Y; `# l8 l// ELSE* @4 r* G7 T0 g# w+ \/ U+ w

" @  X6 n3 o% ?+ s$ w//, d+ {1 x" g  q2 F9 Q( a) F7 W5 O
Report I/O interface' N* P( F, X* P2 q7 E0 P
/ J) c$ X! K+ U
//% B, s7 `7 c  U) z% c

0 y) F) P& y6 m4 {; B" y. J% q//
% m& o- J$ I5 K8 Y. S& MPDCx[2] = OSPM is capable of direct access to On6 o2 E+ O! l4 R, {' b, G0 @' h
5 t1 O3 P8 K2 f$ Q3 W% z' o% \' W
//5 O& J: ?& r3 z: H$ d0 m5 h& B
Demand throttling MSR
% `* o; ]) F. H5 ]# i& P2 l
. [, y- n6 q0 j5 `* E//
4 }) q( m- M4 [! j3 n
: C8 J0 Z2 q8 P& [) \, YIf(And(PDC0, 0x0004)) {8 T: U. E5 m& T! z
/ f1 P0 C- w# Y, w
Return(Package() {
4 p) J% Y. n* v0 h  D
- _3 y; w- r5 M4 h# mResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
7 [0 [8 \$ W2 L& r: G$ E
& @# |, U: V/ Z1 W& {! F( UResourceTemplate(){Register(FFixedHW, 0, 0, 0)}8 f; I& P1 `' C& m2 i' A

  v+ ]) m; r2 f/ C})  C, H; @, H+ `: z3 T1 a% D
! e. i+ t( `# B) B$ {
}5 ~5 C2 o1 _* Q. k. C

/ Z2 ^/ P' S7 tReturn(Package() {
' t" N  y2 {/ E0 \4 B& y+ U5 N# X) R  @$ z+ v/ Q- i- l9 u# ]. K; D
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
- Y8 T, T0 V& k' e; G4 b  E, i" S
# c- S; a% L- }9 DResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}# Z$ T+ l4 T( w/ s9 B; e: j, M
2 }0 D  s1 ^! ]
})" A; M# @; U9 n% v" n$ ?$ p2 F

! U7 Y9 c" m2 G. L}- v% ?/ c; F) l. f% Q) |
& _; o0 L. a; [* v  t* s. u. k

2 _4 L6 r. D  J! n
: n" j7 d1 z" _l
: Q& u+ T1 }; k4 i0 ^% r
_TSS- I7 A; @9 B6 o8 A0 E
/ _# X& ]# O7 ^
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
$ @  U5 O! J2 u; @0 pName (_TSS, Package() + ]% ?+ k7 `# V1 s) U$ P& c( S% _
{
# T3 y% v! ?! F& x: _// Field Name
# e3 B9 h7 Q2 s+ eField Type
( t. ^. Y8 t& {1 X" ~
! M9 j2 R2 E: ^
- U  B- ^5 j: |' z
4 n. P/ }8 V9 l1 t, VPackage ()2 }+ n9 i+ T( d! _' x( N2 G
// Throttle State 0 Definition – T0
+ N- |) k+ o' j! \
, x) E2 R+ o8 O  ?" U{
! _8 R4 M! J3 ]' d; L0 z: j& u# M, ]* C2 v

! x" k$ z5 m" _4 z* d6 x- RFreqPercentageOfMaximum,& s" N0 Q" p/ Q
// DWordConst ; |  o6 S) b/ N+ t

" P( g% _4 L+ g. e# t9 m- o5 C# c# KPower,# Y- Y1 q# ^! g' z! I/ p
// DWordConst
" `8 B& }) T" [$ F% y
. Q: B( t+ U' x( lTransitionLatency,! C% t. }6 n4 `2 m
// DWordConst
: V) `) E7 r$ ~( _" W$ y5 T2 C" L
Control,
3 y: @! n, a9 [( b// DWordConst ' b! c. ^' H. F8 r

9 V! a) \0 |& O! L4 J' L( vStatus
* E  Y+ @! B& {& L1 T// DWordConst ; c; S5 X) H7 j5 l: b/ `
},8 U  t% J# z" k" K# A" u
……
: t7 N; |5 `# S( H}
* y2 ]0 _6 Y  p" Y+ z$ [  f9 J% F4 |) H
Example code 如下所示:
& p2 j. y; @3 d3 j- o. e" |' m; m( j8 ~1 ]1 e1 d3 b1 F
Method(_TSS, 0)
- K" k/ ^+ X+ M) ]. D, Z( q6 t- t  g1 E) d% f8 d7 _
{9 F) ^/ d  k% d, d
& r8 k2 p$ U; B2 N/ J
Package(){100, 1000, 0, 0x00, 0},
' b$ s( A, t' ]; s) _, U" J" m* _4 e1 a4 g
Package(){ 88,
( t4 O9 ?. }- g/ F5 y875, 0, 0x1E, 0},
% G% W3 r) P$ l1 R2 Z* ?% N
3 _, }. Z. b4 P) wPackage(){ 75,& n. s- C9 \2 ~
750, 0, 0x1C, 0},
! C' N+ ^- F3 w: f5 Z& L- f! G" u8 J
Package(){ 63,
% Z( x* J% m( |  |* w625, 0, 0x1A, 0},
) v  `) |5 x4 j' q( ]1 k
' R! x) i% m( L, g) o. TPackage(){ 50,
) N) Z+ K- J+ @" r. Q+ O' a$ R- O500, 0, 0x18, 0},
  V4 j: ]$ v8 _" n4 }
' U0 s& z  ]- @* y0 W6 i2 Y- OPackage(){ 38,
) C" Z9 \% V" B3 j1 x) q& B& Z375, 0, 0x16, 0},
0 {& V2 r1 v* \
) D% j" h7 g( d5 _' d! U4 ^Package(){ 25,
: F& r3 E* ?% x; }# L2 p250, 0, 0x14, 0},! W" j# T- w; \( V2 C8 t
" p: O  g( T& F, ?
Package(){ 13,
' k# S1 F' l2 Q$ u/ {6 a125, 0, 0x12, 0}  q8 S4 o. @0 {: I0 q

' k9 ~8 W) w+ s' c8 H) j}5 V' y" E; e, c( |+ I+ H

" @$ c" c+ g: |- m, k& z3 e5 K, `6 A2 F+ J9 D3 V
l4 G% p( a* K0 e2 A9 F) C
_TPC% v& b2 j7 D8 s* w. W9 j0 F

( t' L7 ]. z5 ]# Z+ A' |. CThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
1 L* f  ?! }& l5 R 3 x* a6 f" I, }
l
: f4 s4 ]8 [( z+ b1 a
_TSD  `; e& r1 ]3 c$ f5 [9 o
* F8 W- K7 k* D" j0 J9 G# V
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code5 |4 F/ b% O) t9 ]9 s6 \9 g0 H

, W3 M' u2 K5 yName (_TSD, Package() . z0 \% w0 M! G8 \# j& a/ O

7 Q% ?( a" I: l2 v; v0 _8 X{
. {0 L! G+ B3 M" _7 E( H) n8 R$ G* z3 G4 A# F
Package(){5, 0, 0, 0xFD, 2}
( M9 h- z0 E+ I3 B: J5 P// 5 entries, Revision 0, Domain 0, OSPM 8 x8 y1 l" Z* @' @6 _
Coordinate, 2 Procs
8 Q0 L1 n/ C7 _4 U- B, c! w" Q- m5 `6 \% ?# b4 N" p

+ ^4 W- N: u! V7 {4 l}) // End of _TSD object
2 l' \6 r% z3 J' z7 v  O- ~
' |8 k' |" K- V: _, UREFF:
) G, B! e5 X3 E9 i* v* a9 Q" j9 e1.( [% b9 C" O/ I* j4 L0 D# T) [
ACPI Spec 3.0
* |. B( }, w  k0 W0 z& C2.- d4 _6 T6 u. E+ _, \& g( @  f8 W" ~2 M
Intel Processor vendor-Specific ACPI
  l7 L! e% q1 W8 a
  w2 d$ z" I. l! C 1 D. `1 T# A7 S0 Y7 r
That’s all!3 J! L$ x0 ?- T$ \- m

* g. x4 n; j+ K4 ~. D9 w( F" Y1 TPeter
9 J% D# ?' C# d% q$ s
% S! B5 R) e9 W. @& K0 z' O( r2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 18:06 , Processed in 0.079606 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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