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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
! R$ }5 c4 }: U# u
1. Overview$ }0 X4 e, l/ V& r3 U

6 q- K& e2 @) a( R. J8 c& W
( |; {- z5 T& u. g$ M: ^C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换8 o+ n! [' h. o9 P( f2 i* E
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
; x6 |- O! \( J$ \4 m比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
- x( O7 |' x: b' ~* D- R
; N; m' w* ^# L1 N1 {1 j" E
cstate1.jpg

# z7 D8 {# Y7 Q  i) m, b
1

$ Y" I4 i3 Z) J1 g2. C-state Control( i7 M. Q: F2 j0 b3 C4 W
2 {: T7 V7 n& b* ?1 y
1)
& h7 w% W' R) E& JDetect & Enable C-state, N6 k* J0 D- r) \4 }

' J8 K6 @6 T9 {( ?( iBIOS可以通过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的支持。0 `# p! J9 w9 }5 ~6 V  a' Q% q. v

# y( T* S# F4 L1 |- P# U7 l8 c2)
3 _9 [# y+ Q' }# D0 YC-state Basic Configuration' {9 a  A6 _/ D* b; l
通常情况下PPM code会根据MWAIT以及AC/BAT是否存在给出不同的配置方案如:a.MWAIT支持的时候通常的做法是将CPU MWAIT(C1) 映射为ACPI C1,CPU MWAIT(C3)映射为ACPI C2 CPU MWAIT(C7)映射为ACPI C3,当AC存在时为了系统获得更高的性能通常会将MWAIT(C7)不再映射为ACPI C3,也就是支持ACPI C1 C2 两级C-stateb.MWAIT不支持的时候就需要使用传统的读P_LVLX的做法,将HLT当做ACPI C1,P_LVL2当做ACPI C2,PL_LV4当做ACPI C3,同样在AC存在的状况下ACPI C3就不会被export出来了(以上做法的假设该CPU支持C6 C7,如果不支持的话就remove相关的supportcode)。
" G" K5 S& d! K/ }; u/ J' ?# h& _
! E. [4 {1 P; J3)
/ }" e+ g1 v/ cACPI Structure For C-state- r- W' K% U* \' H0 \
; l2 T1 p- g! H; U! ?/ ?) p7 t) J" w' o0 r
l/ n7 P  H$ X' p
_OSC & _PDC
! M6 X1 k+ a9 Q/ d8 J! h_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
* S5 q5 D& u5 ~; w& Y) Y7 Q0 tl
# x1 X+ O" T9 [4 m" ^$ l/ \/ j
_CST3 m; T5 ?5 U* k1 D
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
! ?/ D+ i4 x& M  L1 XCSTPackage : Package ( Count ,
! U+ R7 W9 f2 {# rCState ,…,  v# q' S( ?$ h
CState )
. h& I+ H0 R/ }; w其中Count表示所支持的C-state的个数
3 H, M7 `" D, ]CState: Package ( Register ,2 G3 W  m; M' h$ y6 a
Type ,
# x3 s6 g$ W9 c: I  v2 F- DLatency ,  W9 \2 B4 e; q7 Y1 d( I/ C
Power )
8 B" t* J' f' D/ L) S* t% `' B/ d- T: [% ~
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
) s9 M0 L& f9 _/ T! w- h! ^9 _/ M* d5 J7 D0 X
Name(_CST, Package()
) m/ Z: R7 d5 V! V+ n7 ?) g
+ T  N# O- L  K# I- J
{ 0 {! J/ Z4 o2 X# t" I- a  Z- R- b
4,. U- M4 R/ q5 D
// There are four C-states defined here with three semantics

# b! [+ A5 Y2 k
) {. B; m# h! i1 g) ^) W, k5 f3 c$ D// The third and fourth C-states defined have the same C3 entry semantics
! @) A) F3 I% F8 p
2 X" ?+ T+ f: h4 t" k' I" g. U
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
" h2 _4 _0 A0 V1 P% G( n) M, {1,
2 B5 D6 \3 e/ c. O20, 1000},
1 f0 M% k" T! \9 ^
8 J6 a. M' l+ d$ n* N* N- T
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
+ a7 D9 y3 f$ O4 ^( k40,% K$ F& w3 A/ c
750},
1 z+ @, y' i; v5 @* Y$ b
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
/ Q) f. E) ~* G3 X  u60,
4 f; E# n5 K  @' \500},
9 F, |/ ]4 |) T
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
& z- P) @/ p# h$ L250}
8 a7 j; \) q% b1 [
& X) }3 Y) Z" S# o+ q# L! i
}) - ^8 T0 i6 y- d- Z

' T7 \  k/ e6 ]. F1 E' a, o- Fl# z+ j4 W0 w' e: p& p" P
_CSD
2 j1 p) X/ w4 @3 a# s+ q. _# h9 x) t% q& G- R* C
C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。6 W4 S; _/ {2 k6 X
5 G$ o$ l4 N9 n  D) a$ v/ u

& m1 b  r7 f/ ~' ~0 c9 W: @/ P$ p2 b# ^; ?/ N
8 {1 d3 T, Q% O. n! l3 a7 v
3. P_LVL VS FFH
4 X5 [: ^. t7 D
- `1 ~1 ?* N3 L) L6 H' |P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)- @* U; m! w2 X0 F; D; G9 N
FFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:" j2 x: `& r3 m: m. N# D7 N6 \% }
" P# ]- X  M- [- L" E. N5 y
gas2.jpg
# Q9 @/ p) M) v& C0 d
2

% m9 D; `/ T3 Z0 j3 O  F- hOSPM解析到该_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的一个例子:7 H7 ?* A' L. B) F# y4 q1 q% d
Name(_CST, Package()
. |; T% J# b; Y$ S1 A
/ ~6 A% i6 G& g" ^& x
{ 9 n$ I+ @* }: H% ?
2,# B- l. c' W# I1 m3 A4 t1 s7 O7 \
// There are four C-states defined here with three semantics
7 L+ A) j' [9 B+ A" L. A

- O3 v. @' _7 k) \+ K// The third and fourth C-states defined have the same C3 entry semantics
+ A, r2 z8 M) n, y+ f% S, r
, T2 F) ], {$ F6 V* t7 A
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
9 A2 F! g% I' T% x# h0x01,
2 Z$ a) l- x3 F5 ]5 x0x03, 0x000003e8},
7 H# @. z* D9 M7 \* j  U5 n3 x) f+ a

' X* o. q9 O4 R7 @0 j* |& CPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},3 k/ Y9 I" y7 |6 {, m; c/ H
0x01,' u7 u8 j4 u+ H: \" C
0xf5, 0x0000015e}
3 f+ d; N) \/ X, A
}) % b2 E# _' ?7 J5 a5 J+ n) f

7 f0 Q2 d/ ?4 Z0 @
2 N8 P6 |6 A; xREFF:
: r8 Z, R; z# L1.2 y" f1 e/ L* }, {  m
ACPI Spec 3.0/ H: F, A) T" M! n: u
2.; {1 B4 P/ ^" T+ r5 b
Intel Processor vendor-Specific ACPI
+ C( E* ?! a- W' [' g6 k- X3 H1 K) M8 M- B# o
. D5 q' ?8 f7 z1 |" m1 E  D
That’s all!
( E. G$ h$ ^* L$ Z
( a( W# ]* O: z7 k) x- RPeter0 j. s" N( }" a

1 H* T3 i7 @) C+ l- A2010/9/202 u# l" |' t* G: @

+ d: `! S' i6 v' w[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
1 ^2 T  r+ j+ f3 f% C. H
% X9 \! K) r  x( G1 `5 GCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST$ R+ k6 A5 `- d& I% {! a+ ?
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
# u6 W3 ^. a$ J 2 N, E2 r* M( A$ E* z& o
2. P-state Control/ {% Z: ]; U5 ^: w, R1 s. i0 n

& p0 T  W9 C! I1)
/ Z) W8 f5 T" K" c* a" }Detect & Enable P-state
* L; m3 g7 D9 y: k
2 l3 m% j- o, Y/ BBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
0 j9 z/ ^. \  B7 @ 2 y8 o' b# R1 q* T/ Q* h
2)
. s! C, W$ t6 r9 R+ GSupported P-states
( H! }; _) b- a  U0 X9 \  h3 y 2 \, ~# n4 ^4 Y8 X! s7 E
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固定是100MHZ9 V+ S; @- f/ I- F) v9 |( ~" S

; p2 [6 u; z% Y: IMinRatio = PLATFORM_INFO) t7 k! P. ?2 t* a/ N* J' O
MaxRatio = PLATFORM_INFO
( ^) b. b# ?6 ^RatioStepSize = 0x01
0 P/ e: ~. s9 j: U/ }NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
" ^8 z. {# x5 W ( z6 ~1 K; c' X: J
If(NumStates > 0x10)3 v! z9 B' [0 m+ f; V5 S  u
{
4 W' Y, W4 ]+ c# g5 R7 xRatioStepSize += 1. ?  G( ?3 G. q, Z1 y3 P
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
0 B+ m+ t& w1 u6 B/ E2 w0 m2 O$ b}( v0 x3 G% d& F

% t# N0 ~5 k6 Z1 B- H3)# G3 \6 W) }+ T7 h/ |
Turbo Mode) Y  ~4 d6 v: d
; N  v: R! j. o( m) g2 f
Turbo 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
3 T& ~) e. j" y. B
* \, a, x2 ^4 }4 \4)& o, \8 c# ]6 \* T
Over Clock
9 H" q$ B; ]3 Y
% U" q- x* I5 Q7 C( t  P( D3 f某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。7 I6 L7 o7 u+ Z' o# i3 J

2 g0 H: s1 Y  ^+ [- `5)
, O5 @, m; G9 Z9 e/ tACPI Structure For P-state/ C8 c& L  z  n
! G3 D4 L  {' A
l
" C1 w! d7 Z3 M- ?7 E$ F, S
_OSC & _PDC
* q2 t* V1 r: T, T 2 F, w( _$ [( j. p7 h
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
% n5 ?' R% a7 Y% N- r
! q1 s. m1 Z5 n9 Y, l" G! El* p: \+ t+ `, {% [  B2 Z
_PSS
) z+ M2 X5 \( L$ p- |) p5 JPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
7 k7 o3 f$ D! y7 O& g" }: e$ q; r并且通过一个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做比较
% \' S4 p0 G% |8 t* L2 @以确定P-state切换是否已经完成。: D. x; o3 R  p
) C  X/ d7 ~7 ]" }: G% w; a$ ]
Name (_PSS, Package()
9 _5 `+ X1 C5 H% {8 S7 e0 q& D{
4 y( `# d, T1 M; S4 s( f: Z// Field Name
  T, k- r% L( W$ q8 j" v6 a8 k( ~Field Type 1 M) p$ r" n( b( M
9 [" k+ J3 Z$ b( b% x
# a7 ]4 d: I; B1 |+ w
, p' c/ m/ ?% @/ N/ l' i5 I1 g3 y/ A3 m
Package ()
" E3 V& U2 W8 Q8 I! p$ ^% s// Performance State 0 Definition – P0
# v# Z$ F* O4 p9 h, r0 V+ r1 l% v$ r" m# g6 y& d
{6 v/ X) M5 R3 X/ r9 L* D3 B: E8 T' P

) W, ~3 |, b* R) @& P( i
6 T# x( u( }% s, CCoreFreq,9 t* E% V3 o$ S$ E& j# Q
// DWordConst , |( ?8 R% t1 [; X3 Q0 @
9 [  H  {$ F- H9 S. Q7 ^
' v/ t8 k4 c0 y  M  p- ^' n
Power,
! e: p& _) M2 {; e. o" R  p// DWordConst
( |: L! x" p9 H( @5 M% C
- S7 g$ l3 K9 K8 w  N3 zTransitionLatency,
1 i  r- ^  s/ i6 v0 o- q, `- v// DWordConst
7 m& j, ^1 J6 r/ t0 m/ H- B7 C7 {* C; t5 o4 I) T
BusMasterLatency,
! T; F) n) _+ B9 \( w* y// DWordConst
( I# e: C; C) q$ j* I
4 B3 d2 x' [/ n2 {Control,
8 T4 @" Q/ P  r) k// DWordConst
+ \# {1 k7 R* U- g' j1 |- e
) j: u% i  G* Y1 _+ g# i2 N1 `Status
# m" w( O$ y0 C6 V& z; w
; V. C" @* o) \9 [+ ~; j// DWordConst - v9 E6 h8 n$ m' n: ^

! `3 l8 K" g5 t9 _; x0 Q}, 6 l0 H7 X( m7 S

- ~/ |$ ^4 c$ \% m8 j.
! k+ B, U  Q" z* X$ J( \' x# V8 Z& s1 s' u
. 2 k# X% o  Y5 X' y
9 B8 m, R) z' h: k, D
. 0 s8 ?' t% I/ i: M
}) // End of _PSS object) {- C3 D5 X5 X+ {, R
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 % ?3 ]3 f% H# j3 Y7 r$ @3 u
1 Y8 f* u0 z, e
Name (_PSS, Package()
$ I, @+ z4 x2 F8 c& l( {; t) d9 V, G
{
- ^( \- w. I8 q& G- ?6 s) Q1 D
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
3 W2 B: A3 u7 a( I$ L
4 o7 c, n3 }. EPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) 8 A. c" ~1 ~* C9 Q8 m- d) V; ?: W

9 v% X! W* i- Q7 d) h. P$ PPackage(){1400, 8200,3 x+ V4 f( m0 b& I" B: W
10, 10, 0x000E, 0x000E}' x1 @; D9 J! Y3 _. n0 M
// Performance State two (P2)+ u/ M$ f1 K6 T
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // / X# Q$ o1 ]2 U9 e% Y' f1 ?' }
Performance State one (P3) 0 s/ c) G! e: V4 y1 ]/ b, k

* y0 \( h0 i; {/ Y0 `% B8 g9 ~' xPackage(){1200, 8200,0 e! l$ U& O8 Z) L9 A3 z# h
10, 10, 0x000C, 0x000C}9 t! n/ n# E" @
// Performance State two (P4)  A4 |; v& b7 U, j" Q
  L: D5 \, E+ P6 |3 W6 \6 f  f
}) // End of _PSS object% n5 p4 y5 `' X/ n+ I
8 {& I( U: i, f4 h$ c) e. d
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
( ?5 X0 y( r* p
) b3 m4 p0 u! @. Sl
; \5 q9 q( m" j8 U
_PCT; m6 X2 c  v6 p% o& R: R
! c" p" G0 y* U& G2 l
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的方式来进行。
) `9 T+ ~$ U+ a# n( ?3 `" a
" s0 [7 e. L7 ^" B6 aName(_PCT, Package ()
- ~, J( y# R# ?2 o" i  X5 j// Performance Control object & ^5 x( M& F* T$ N5 Q

- B3 K0 w; s& |7 h! e1 d{
$ Q0 _/ u7 v0 a1 ^4 o% m9 j6 m* {  w$ s( F" i& }& g7 a) ]
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
) q( l+ x- p; r3 w8 ]7 ]1 T. r// PERF_CTRL
- ]# O: S, r, h0 J4 g
+ B' f! k: \9 Y1 C- LResourceTemplate(){Register(FFixedHW, 0, 0, 0)}8 w6 y7 k2 t' g" Q7 U
// PERF_STATUS
* p; \' ^! K  ?2 h
9 G; ?. a. V0 H  W$ a+ Y}) // End of _PCT object# y$ P; _7 @0 Y6 g/ Q3 s

7 `) b$ A) q- m0 K: f3 _7 i! }l
; w7 B2 N. G: {
_PPC
4 \( v  L6 b( y8 b. U2 ?; t  h* v% W * x) m; c( b! e6 Q0 [
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
" j  o6 O  y# L' q; _ 4 j9 m, w' z- d; O" U$ T
Method (_PPC, 0)3 x5 [; V! x7 U" `
// Performance Present Capabilities method
" {& Z' a1 }/ l: j& T
7 E. E* c  ], L. S" s' j# \{
  ~8 l' r; \% t* M3 ^. N. X/ U
, J* X6 |( L4 n" Y$ d9 w( mIf (\_SB.DOCK)
, {; k+ S: g1 P: I1 V0 |6 \4 v  v# J' B$ a" t' {) Q5 b8 e
{ 0 H3 B' \1 E* j
1 y1 p( `  `1 p; n$ q( j+ E9 w- e! A
Return(0) // All _PSS states available! a3 W5 g* a# D) x" s, u' q0 g0 q# u

9 r! s4 V+ B4 P' S
! y6 ]! c- A7 k" G! p* D5 H} * q4 u, J$ H( f

4 U4 s$ W2 V" ]% k# U/ aIf (\_SB.AC)
" J, d3 z: z) s/ N3 X. f6 e/ I
6 w- G: ?3 f; W: k# R" [{ * A/ a$ d! {) G: e

( Q" v: k6 n9 e  s% A. N# b' I  ?Return(1)0 `& r2 E4 c( F0 H
// States 1 and 2 available ) m4 i; Q1 ^% h0 Q% _
& C9 P& ]0 x8 u) j  X4 u6 n
}
, B1 I, E$ a# a( J* y$ K( i" x2 ^& V* l2 ^! n6 f
Else
/ [/ J2 L9 i: m2 n9 o. r* d/ ^
{ " u2 y/ T- R- F5 ]

; M) I5 |7 }  u, s- tReturn(2)+ {. Q% K  P- a
// State 2 available
- g7 q3 t9 |/ z! d
7 @& Z: k0 x  w# I* @# z}
* ]  o* ~; Y# F" p8 m5 o' V0 F
; m+ M! H5 ^* E, i+ L: F, {} // End of _PPC method1 G- j- w1 f5 j. F

8 j% t# T: f! E/ ?* ml
8 K( s7 i; D2 B  H2 G" L
_PSD
; X: ]6 M) }7 e  ?0 P& R# Z* s3 L 2 J) Q- z6 \5 H4 x$ w; H- x
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
# z; K4 L# {8 j) F1 d
0 k2 Y% P% F/ L; G  O# oREFF:
: h+ S  A1 _7 ~# e7 ~1.
: g) e* O- ~+ m! ]1 {: CACPI Spec 3.0
  j& D0 @+ Q4 `* x7 L$ x2.- z, m: m+ Q5 ?: n- {3 R
Intel Processor vendor-Specific ACPI$ A: M1 M9 n" n2 H) {

! t- Z9 a& `8 Y  E$ n/ b) f" }
! W" l+ q: M9 G* U0 g' G  e- C+ A8 aThat’s all!( @, X" T! [7 a, Y
! ~2 ?. [6 t# I6 A
Peter4 ?- B' E! {# f8 `8 n- ^
/ M6 C5 X5 S4 Y: ]
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview. s" [9 A, r. Y

- `" i7 u( P9 T" i6 D9 Z+ WCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式" [+ @, C4 g/ W  X/ N- Z3 l
,影响系统的功耗和温度。. {- ?& O- _. Y, u1 |' ^0 U) L

6 J) y* f) @! `. w$ g% _- e' N2. T-state Control2 d" N' l6 ^, ]/ D
5 H  S8 I, V4 B$ ?5 l9 d+ W
1)
' H* p$ W- z" _MSR Based Control  v* n" G8 R+ e* g4 @( O4 T7 M1 ]! e: h

/ ~3 Z( {2 ?1 q- i3 dBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 8 a5 W2 V# A' D" g
$ T) i" N( @0 x7 Z' t4 ?
2)- ]% Y& U# ^$ N7 T9 Z& B8 B
I/O Based Control
$ ]! j7 ~  e+ b+ p  u! u, _
/ ]& z% Q6 p  f' B. C( F+ I2 b除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。) @8 _/ a& U% \& t8 U

1 m, j" q* J& f& m3)
! }% Z4 K/ |" m# k; x& pACPI Structure For P-state6 Y5 A: x& z' L8 r5 P9 y, M9 C  Z
l8 a, j+ i7 {+ k; d
_PTC
& T5 S- i- `  @: `( n
. Y% @! g* {3 k  d6 RProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
0 C5 d! J8 D5 k4 D: h3 ? 9 x/ c3 I& a# o
Name (_PTC, Package() 4 f( J& L' M" o2 b% e4 e6 g6 m0 C
{ & @: P& J+ U/ U) p
! z, x- `/ B- `2 v! m' N
ResourceTemplate(){Throttling_Control_Register},
1 H$ e# E- |7 P( M; B$ P$ E) W//Generic Register Descriptor / c" d3 }* G+ `$ t3 G

# X: U1 x' B# W" u3 jResourceTemplate(){Throttling_Status_Register}# b# K, ]$ S$ y
//Generic Register Descriptor 3 ~3 o2 f2 r8 M6 C& G  ]" M
}) // End of _PTC! S9 J  I  M( I6 k: S2 u/ K8 a  m
4 A0 ~) H0 w2 n- }
下述是一个sample code" g' a- d5 s3 ~# U! s
) R* R* }& Q; d, K& E! M) i$ L
6 D% o6 Q& z9 b+ a
//0 m# E6 `" B9 i5 {1 G& x7 n1 @

6 M. Q) ?6 l' @8 Q, E' S& B& {// T-State Control/Status interface3 \# E  j! B/ o) S, {( O
; `3 X' V( R& U5 z
//
/ c0 b! F  T2 o* m* P$ W
. [3 o7 K4 h/ N- M$ [Method(_PTC, 0)
8 K1 V: L3 [. s) B2 K# `' C& Z4 f9 I* d; x
{) J$ n0 E7 t, h, Q
. Z  `( Z5 C, j; X; E
//
# O5 E( R) ^$ {4 ]+ U6 L: r! R5 K2 t0 Y8 b7 y
// IF OSPM is capable of direct access to MSR
% }2 ~; r  e( ?2 e1 k9 F5 o' J" u3 V
9 a* V: G, W* O/ B3 v' ~+ L* U//7 S. R9 Y0 D/ I# S0 @
Report MSR interface
6 W3 q8 ^( _! `" R
. j( }) n7 I9 ^, q6 E9 V' m// ELSE
. E' T% J  i5 Y  ^
7 I3 `6 o6 }# x0 O- B9 f, ~//
8 Q: ?3 i2 h  G  [' h2 B% S0 CReport I/O interface4 G2 y5 B1 j. @* c6 A1 y

4 j8 ]! I0 v! t8 d0 I6 V//
2 |7 [$ n( M! E- u9 w; H3 U! v6 X3 O9 |$ ]
//
: k8 s6 u0 b" K1 n+ qPDCx[2] = OSPM is capable of direct access to On
5 O/ c% ?0 E* f" {' }/ A6 C6 T/ l: u* k) H: E) W' h2 n5 A! r
//. p+ l5 u& }. L+ H" k
Demand throttling MSR4 w3 ?* l! g, n

  N3 F1 m8 ~% m0 r//
" ]" q/ X6 V( v' Y6 n: F, s9 r
. ~: z4 Y( b* y! D) _" GIf(And(PDC0, 0x0004)) {2 m0 e" j, J7 t, l
! G" Y& ~' g1 s/ D& u, i9 u# r
Return(Package() {& r4 z, G2 m/ j7 g

) p$ P5 ], Q1 w* SResourceTemplate(){Register(FFixedHW, 0, 0, 0)},) q( {7 R# v& h2 E4 f! u5 ^
% L# _* g8 U% g9 v
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
' k4 V6 m" T3 S9 j$ L! Y
$ S  R. {8 ]$ e+ A})$ p$ m8 c9 Z7 `# a! h! l4 x
4 x8 E, R4 r: b2 h! n* {
}( M% t  [7 Z9 Q$ @; _9 y

% j# w0 q1 q/ y% ]- e2 E5 `' |Return(Package() {
+ F; F; t( @: T; O7 G  U  x, Z
$ l9 t/ T3 _* G! m4 u4 JResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},9 r1 l: V! L1 ~- ~3 M1 ^
: B  P/ A5 G3 e: O  s
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
! |9 z, G1 l7 t) t6 K- P: c3 a% R$ _9 F: P
})
: Y/ c3 ^( F- l2 [+ W4 D- U8 j+ Q
}$ D$ Y* w0 v6 G# @

* Y0 c, d  O+ L  D" T# [7 K- G) R. v. z* N
( b4 Q% o+ e& O* C) p. Q
l9 P( g0 s* ~. y
_TSS7 n+ D: U5 j, ?# E( ?& ?5 D
- o* y1 ?$ X7 x% u: I) K# l
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:2 R' A: f3 }$ |8 c3 O. j
Name (_TSS, Package() ) B3 |  \+ I& O. i, C  u# k' l* r' b
{
0 J" R. l" \4 l8 i// Field Name4 @: @6 C, G- {  O" B8 n, u
Field Type
, }- N6 u8 Z. d$ v
/ {: S  e6 D( g0 C! u0 l$ z6 }
& J0 K6 I* T$ s- _' t( R
Package ()
3 ?5 ~$ `8 C* i3 o' @- R" h& C7 U// Throttle State 0 Definition – T0
7 K, c6 b' F. u
* [. v4 W; {! E* W4 V" z5 U{
* C4 O$ c: k8 W3 i, R1 H3 c4 r, d! U
: v; Y# F, O$ T3 U& {8 s- k4 K3 R
FreqPercentageOfMaximum,. B+ r' o' J# ~6 t3 R: p, I
// DWordConst 2 R0 Q6 S; @7 b; ~

! `+ l2 b, y, f, tPower,
# ^: m5 u, b' f$ F+ p// DWordConst 9 {( a8 t. x: l( u) Y
3 m' [: x; L; V( R2 P2 V* T/ z
TransitionLatency,) J2 A4 z) J* R9 O
// DWordConst
  @$ O# @; |( p9 ?" V& f3 [6 \& w  o0 Q- m* i9 g- C
Control,6 M/ D( G# K, D& p* x/ e, Y- n
// DWordConst ! u) J; o) S! T+ o' m  G# D0 N
1 N: h+ i. {2 D
Status
$ }* i, Q" L1 ~& e// DWordConst
9 g8 \5 t3 s+ o9 l0 e4 `},: T3 b" R0 J# T, F& f
……0 q% B' a% X1 q
}
( {# G) j9 D; n8 [2 \! U0 ?* g8 f. Y. {" w3 v0 ]! ?- ^% a' h2 z
Example code 如下所示:
4 \5 ^* o0 D+ y6 \+ g7 l5 V: W  H; t* A8 T: H/ b2 B, a* d
Method(_TSS, 0)2 }$ G9 E& l' s3 o
( c& {3 e' d% h- f% p1 Y$ b/ m3 U
{2 a: S9 H- C$ k, o' j+ t

2 n+ u% Q# |! W; R5 XPackage(){100, 1000, 0, 0x00, 0},
& l; Z1 w/ }$ @1 w. [( V  {, ^2 _+ m4 ~) k
Package(){ 88,
; N% K# V  ?" F" }875, 0, 0x1E, 0},
- O* o7 |  }! p$ e$ ]+ f6 X4 i
* ]( I! Y9 Q0 D: M9 \9 KPackage(){ 75,
4 G7 f+ N# j$ z3 R750, 0, 0x1C, 0},/ u7 q  X0 @3 u) M% O7 l$ Q6 W  G$ ]
8 C7 Q* E" E8 p' x
Package(){ 63,) p8 `: V! D# M4 ~8 [
625, 0, 0x1A, 0},
0 W* N/ {4 E" S* s$ g( y9 [
2 P( o) R6 b, r1 X  o% u6 {5 fPackage(){ 50,
6 h; c5 `. u3 B5 h' L500, 0, 0x18, 0},
3 E  N0 w$ Z5 O" G& P! u5 G: d  Y+ x) w5 z6 h
Package(){ 38,
1 n* X6 h: ]& a- w" L, ?375, 0, 0x16, 0},
( u: O! a5 K: |
4 Y+ G% p# X5 ]4 E: \7 \7 WPackage(){ 25,- B! e2 m/ v/ Q
250, 0, 0x14, 0},
% p7 M* }: ^" V' X4 O+ p7 F/ S! D
. Y0 X( c$ ?$ u) i8 y0 RPackage(){ 13,
' E6 g. T$ ^$ r/ X8 L( r2 h125, 0, 0x12, 0}/ ]2 C: }3 s( m2 N, _
7 l4 [, i8 C) Z/ o( E( @5 u4 [) d
}( e5 w- O/ g8 }7 v( {

0 D9 M! _! c) ~3 F4 V* V6 t& ^+ f  X! d
l
1 X& M3 O* r3 i0 @
_TPC+ {- B6 f: c( X. w* R' Z

8 _- Y+ |3 m) X  g0 `! H& NThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC1 x* q, i5 N6 Z! }$ i( r$ u
& U  g8 P1 [5 k! ]5 ]9 J
l
7 p/ c- U: ~7 {0 E
_TSD* c1 a" B2 X, }) j

/ C: n! ]5 S2 g  p2 l' \/ yT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code9 L% C: `- i! g

5 f9 l' k8 \2 VName (_TSD, Package()
, `. g/ I( k* F1 |' q8 M/ n: p5 j$ ~6 b6 s# s+ {, h
{
) m; V1 g& p* }2 b2 ]1 V, i  ]# }5 T% H) M3 [  n
Package(){5, 0, 0, 0xFD, 2}$ K/ @, f- J' f( \% Y6 W; B/ v$ V( A
// 5 entries, Revision 0, Domain 0, OSPM 2 g2 k) Z! O2 b4 @. p5 [, W
Coordinate, 2 Procs $ C6 x1 e4 u3 n( P: b

( o, R5 n/ l3 h
) o0 k- C8 V( ?}) // End of _TSD object2 K; r7 @: `9 I! u4 z
( U5 z7 ~" t/ G
REFF:6 W+ Z, U. M" B+ b
1.
; Z' J: D1 f/ {/ g, W4 V" y. Z0 eACPI Spec 3.0: y6 e3 }8 B- m
2.& y$ j/ v( [4 a' H4 s4 H$ f& C% j
Intel Processor vendor-Specific ACPI
/ r* H/ @/ B5 b  ^ 2 s# n2 v; B* `6 |3 P/ h, J. s  r$ h
- v- g/ L6 [+ w, I! ?$ U. J
That’s all!
' \$ h$ J( i2 K4 @
9 W, g7 n, w2 c' a. W; g0 BPeter
0 g0 e1 _: ^6 q# ^( b4 D( c
8 z5 T6 s( L5 v9 ~7 H2010/10/01
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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