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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
3 C5 T, F$ t. w, i% T* x' `; M
1. Overview5 U: x+ V8 I* R3 l3 D
: ^& ~( e" p. o1 }( d6 p. A& ?6 k
. z" a9 X9 L9 y
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
* j, B+ U% l% ~1 L降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
$ p. b% ~. Z. p  R比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。* u" ]5 n6 b5 x' @+ Y
7 @. R- k3 Y6 {1 A6 a" q
cstate1.jpg
: o7 c4 {* F6 y! w/ T
1

( _3 ?% k# i3 X7 M2 S! D" H2. C-state Control
! O' C4 O3 S  L' d, R- y) q% }. u; @# d* |7 v: |
1)$ I. \0 l/ Q7 f
Detect & Enable C-state
% n6 |* C  W4 }# p3 ^
. `' X! u" D. B' |3 A5 aBIOS可以通过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的支持。( i' q- ^, O; y7 ~

, K: s6 I  Q. m# h4 b, a. E2)
/ G3 f! z' R9 d9 Y4 d& gC-state Basic Configuration' k% Y" W' ]' {$ h* q7 x
通常情况下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)。
& }4 j/ x/ C* n2 C2 S$ Z3 r+ d, Z5 j0 p& u
3)
8 p7 E3 }! R$ uACPI Structure For C-state+ F; Z3 @2 [$ I" g( @

8 N3 V; F# [# T5 p6 Q4 ]l1 p- r. A2 ?8 K9 L9 |8 P
_OSC & _PDC7 J* ]( c' S6 u- S  a( w8 V6 x8 I
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures% m* V* @4 Z5 y9 K4 c% S8 h( K: \
l
. T6 C, F) P1 X: F5 H
_CST
+ V! p; b; \0 H" J1 s& n0 Q% @3 z: |_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:+ }4 F# a3 V' g  k" m. ]% I
CSTPackage : Package ( Count ,+ s! s. r* f, `7 P
CState ,…,; ]/ W9 L8 ~& P, H, u* l4 B% k
CState )$ B( S& G3 |* b6 U5 d6 R, v
其中Count表示所支持的C-state的个数
1 N+ W# s# n: N& b, XCState: Package ( Register ,8 L9 q3 R5 a9 U  K* @- ]/ B
Type ,8 I) v* v) T' p# }' k
Latency ,3 X8 A& v4 X; j7 ^3 n
Power )
# v2 d  i. o6 S4 B/ K+ f  W2 i4 F/ j" D( f& }3 _, b
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
/ N" R: g+ F1 I9 k! z- r5 A
1 n+ y: G- O3 g7 _& ZName(_CST, Package()- I- U! A* k0 i4 n4 ]8 J

4 z1 V9 d1 \  a' z- S{
- d4 t& s3 y! Z% h: S  D8 U4,
3 L( [7 y( {1 R  D// There are four C-states defined here with three semantics
+ a8 a7 A9 r9 ]
1 @& |: Z* A  t' g+ I- S
// The third and fourth C-states defined have the same C3 entry semantics
" ]% s* k' g: N5 h
# J. C2 F! J- U4 k( h" V
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
' j, _* S2 M6 A( t' M$ O* [1,3 C# Y7 J- A& t! R2 n" T" Q
20, 1000},
1 a" w; B1 Y  J) v5 L6 P
, G4 y8 ?  ?% q
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
; e$ u' E8 f" y40,
0 q+ A' ]' w+ c  Z0 d/ O5 [750},

, j; I% H, P/ n2 y+ W9 u* c/ ^Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,$ o, K7 Q7 W/ P6 f( Q- h5 R0 _
60,
' d( Y# r. g2 N4 r500},
1 i5 S2 i6 D2 g' }
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
" ^! C6 }. W$ ^& ^, ?250}8 z7 y/ Q. D; L3 m/ p" K# c% x

# y6 q: y7 h/ _})   P: a# k+ F2 k) q+ c7 O
% T) T4 O$ g/ a3 J7 p0 I# f
l0 Q: c: u2 S) h, l$ P$ p
_CSD
' K* W- a/ w( y# S8 r5 E1 P9 `
/ P, J3 D! G5 \* J& @C-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
! z# Z# x1 a+ ^- r0 ]1 D0 M& _  ]' L/ ?3 F: p+ i% S

( Y4 e: \) A* j# Z& N' H1 M( u0 i* t7 _- f" n

' f3 i  j$ o3 M. e$ L# F3 F3. P_LVL VS FFH5 K1 B  a6 Q/ I( M# }7 f: H* d- D
# V! U- `9 h! V0 }
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)$ z& N  p* P9 E+ T: c6 I
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所示:
/ @! @: J/ S) @, z7 a$ i7 D/ S6 k
" O- d- ~; F. x5 `
gas2.jpg
! e" ~: n* }9 _% J" g- S
2
- f3 L5 t& E; C; G
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的一个例子:
# k- k0 Q1 p0 V% }) g1 nName(_CST, Package()1 [8 p2 q5 N, f2 {" J" H
  F5 W8 v& `# Z: R6 K' p3 F
{ 1 _! F+ ]9 L  C1 Q$ y3 F0 I" ]
2,& s; j" O" q  i) H% n9 T; R6 e
// There are four C-states defined here with three semantics
; D9 f  U% o  _+ _1 A
; C; ^/ @9 |: R$ o4 j
// The third and fourth C-states defined have the same C3 entry semantics5 r" R4 V( G: U4 N( @: ?0 x7 l

# T" N: ^; w+ mPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
: k/ H" w8 a! F+ u  L0x01,9 \$ r) ?0 Z0 H, B+ h
0x03, 0x000003e8},1 {) o% B2 w! u3 u8 g+ E

- H7 a5 `5 @. APackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},* A2 G+ o9 I' V' x
0x01,
0 l5 M1 A2 x; H' W- K0xf5, 0x0000015e}
3 f0 ?/ Z8 _# U9 T) _, Y
}) . _( ]! n& H  v2 `. t
) V" M! w) y  T- J
: c4 N0 M. t/ i  {; O" x4 z
REFF:% Z  r4 |5 o: @) F2 P( y0 |. `
1.
0 H( g: V3 P. {) k9 K- l2 JACPI Spec 3.0
7 y$ w, w3 A" K% I8 `2.' @+ I/ }$ K8 C8 P
Intel Processor vendor-Specific ACPI* a2 D/ K" l% g; ]+ q6 [

9 B" g0 n5 E& A5 Y$ P4 W! r
' X8 f( C. m6 s* t' M" iThat’s all!
' @  I/ N5 y+ T  N9 T4 G$ a# J7 f- k; z( T3 e3 z+ |
Peter- u+ b6 l, t+ L2 l* l
# X1 x& i2 `  R; b7 O& v3 b- e
2010/9/20
( e2 `6 p$ [1 ]  ]$ F: p# X# Z4 I0 o. \% V
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview5 |" q7 v! m2 [/ z
4 L- s9 c, l% c
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST4 a/ Z0 W' C" ]; d. f
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。5 ^: B2 `4 X% L
- S9 i4 v) d2 E6 k
2. P-state Control4 j" ?5 d0 k5 Q+ ^' H

9 i9 j9 w2 D0 D2 ]) t+ d% |1)! m' s; X6 r$ E  S/ t  e& v
Detect & Enable P-state
8 K1 Y- Q' C. x" ^- i! r / w( \# t" ~9 O+ h1 n; ~
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
9 C0 }- p- d! @3 V7 m
, A1 c0 l6 e  O* p7 N2)5 G1 R$ ^  _6 B" {* G. x1 z" [( U
Supported P-states
) b8 |' O9 x9 M+ V4 T
' W3 P# W" R2 b: d" m- j2 hBIOS 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固定是100MHZ1 ?; f* j6 p& ~  e
8 y' R  n4 L) Q% t8 T+ {# q* B( {
MinRatio = PLATFORM_INFO
! r' d# g# g! y0 ~( n4 }MaxRatio = PLATFORM_INFO
# P0 |3 G5 W3 ^, W/ Y7 @8 I1 DRatioStepSize = 0x01& B* {/ m) o8 k8 F, s  ~
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 13 p6 ^! D. z, O

3 n# Z! l' f1 D, ZIf(NumStates > 0x10)6 @: n, {3 ]/ Z1 w4 a1 U9 j
{, Y0 m, y- E4 p9 P1 e! k; U
RatioStepSize += 18 p2 g  t" m! m( _5 k
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
! j5 ^3 i) m& e' L}5 E2 K) Q2 s2 _" X3 ?) T

9 u# @  J2 R8 Q& l' R  a  {3)
6 |7 f( o  Y: y7 T* UTurbo Mode
$ y2 B9 l, r& F7 P+ ?, n* B 6 k- T8 k5 ~/ f! b) D- S4 p
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
9 D- x0 I3 P4 j: I9 J, Q ' \/ y. _" t8 Q! i5 S
4)- c, `6 C8 O4 f6 U3 o' ~; T
Over Clock
# l' a& r/ `0 g5 I7 O
! x& ^) F! F' e# c6 P7 j某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。+ A# J) j; \1 u0 v0 o9 Z
! H) a& E! n$ u: D& i0 J4 E4 e9 o
5)1 a* U! |; N, L4 ]0 H
ACPI Structure For P-state
8 T+ @  s  D, G. N9 j% t
3 g( m% K5 {6 n  S" nl+ A$ P9 R5 w2 m& r, N3 _0 M+ \  I) z
_OSC & _PDC. ?; ]( ~2 h* X( v. f
* b" Q, m! U/ U3 `' l
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
6 B+ m( z) v& m/ w
, |2 _( V# x0 D- n% nl* i6 d: y& H" B
_PSS
1 l, G* a5 ^3 i, ]* M$ k( t, wPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量0 t+ V' |0 k  r9 x9 {
并且通过一个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做比较
! f7 r! M+ ^& t  V! B6 \) i以确定P-state切换是否已经完成。
' e4 p& r' L& @  B7 v  M
1 L+ [0 r2 k% c+ ]0 i8 kName (_PSS, Package() ' g- M7 m1 H/ Y# ~6 ?* {
{
* L. G* f) M4 A/ g// Field Name
  |8 X5 [5 e  K" sField Type ( T9 |3 r' e, l4 A" N. B! t# ], O# ~
1 m' g9 d: J$ r. W/ j5 x

9 d5 g/ g+ n# K' m: i
0 U3 F4 V: h9 a' q) APackage (); l- D1 p, s3 {( Q( U% t  n
// Performance State 0 Definition – P0
. ]% Q! y, B' _+ @/ E% A) E& k! Q1 p$ \- y
{7 M/ A  y5 `- R$ n' |7 U+ J( V
8 w: ~; _0 K8 ^
! L: d4 r- _8 `* q& o
CoreFreq,9 o! t2 B2 S# W( m
// DWordConst : L. F; n8 U, ]( n! X7 R- S0 u, z

* Z6 C) d& U% Q/ p0 V) ~2 m' S% \( e6 Q$ i% b. K: K
Power,
& R. A0 K, P4 a1 [" W/ r// DWordConst
- M5 Z1 `5 p2 p: w' t# H5 q
5 @8 O7 P. N( L0 l- {- m- mTransitionLatency,
% X5 o3 J) Y+ [, C// DWordConst 8 T7 u, K% R' h- ~4 [! B  x

( B& b) c" `0 c9 g  G! GBusMasterLatency,
8 w+ c! N/ T" g# I+ t" J9 @0 t// DWordConst
; K( N' I0 P) d1 T9 |% J. [* Z9 p$ e2 Y3 T2 N
Control,% s: w+ x: G& @; p' e; S+ ]- i
// DWordConst
) v% l3 F  L3 a4 @- H& e8 r
$ I8 l- @$ A2 P0 D- o; X# S  ?Status% v2 h4 q. V7 Z3 M7 F# V' e* o" \
. v* k3 I( z( ]& N$ S9 i; V
// DWordConst 0 ]& N6 B$ \5 Q7 M5 K

, o6 L3 E( ?$ ^5 n% O},
) j/ h# V4 h1 J! x
4 ~% d  H8 l4 f2 v/ m, m* g.
3 E3 _0 V; o7 _" `" u  B' t# F) \. d! z: X8 q' T
.
8 U1 k! z: L1 ]. v9 c4 X3 {
4 M; i7 Y& K: s* j2 D3 \4 a.
3 z6 v' v& r0 O/ A9 c  l' \1 T}) // End of _PSS object
8 w: d* z$ K& a8 I, B' w4 V, U$ W前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 * T$ ]! v- m2 @0 {

+ F) N9 t' L' OName (_PSS, Package()
; D0 `* G# ^, b  g) J  L8 Q( S8 ^6 |
{ . K) }: V. v7 e+ N/ b5 e
# R2 Q1 Q- a, E2 r' O' W( z
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
* Z9 }0 P/ }  V. S, m. C3 ?- N: X9 Y
) W) h$ V" e" q+ h7 w4 wPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
$ L# L  G+ n6 d, o9 f# X' b& A/ ]) Z( m- G1 d3 t
Package(){1400, 8200,
3 Z5 {: W/ n  ?10, 10, 0x000E, 0x000E}$ d2 U& ]# H  Q" x
// Performance State two (P2)
1 s6 s+ t1 l& I, ~6 X1 n$ ^4 qPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
3 `, w# }. e) @$ m2 A) A& QPerformance State one (P3) " F$ g. g" G/ _/ T0 H

4 T$ k+ r+ G! a9 y+ }# QPackage(){1200, 8200,
3 I$ v& v2 l+ I10, 10, 0x000C, 0x000C}6 z( F1 I1 |! P7 l2 o( k& g
// Performance State two (P4)- L! |, k2 u3 C
, J1 J9 B) K; C0 f6 a0 P7 _; T
}) // End of _PSS object
! K0 W6 [  s- y% @. ^7 b1 i0 K' x % K4 S! e* b9 z, u" X1 E- |
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
; s( c' i& o. S2 I$ m # y8 Y1 i) s5 K" L
l
  R% X3 {7 |3 h# y6 [/ k
_PCT" ^) |1 ^" f5 r; l* I$ S$ @! \

! I* C- Q& v/ q4 P: s! aPerformance 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的方式来进行。# t; w( Z- T1 y) e1 K+ E+ p

! u1 E7 J# V4 ]6 g" e# iName(_PCT, Package ()8 Y; S8 |( y# K3 ]
// Performance Control object 8 B# Z) s/ x3 ?0 ~0 \

" A' e# p  n; g{ 9 ]2 o0 W9 T7 C$ X6 Z. ?

  _3 J* e& y. [4 ~4 u" BResourceTemplate(){Register(FFixedHW, 0, 0, 0)},% R3 ~3 k4 ?7 J. E
// PERF_CTRL
' ^! }( Q8 d% l, u
0 S# b8 x/ |' }; U# i0 s3 G; _& eResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
( u; i1 M. @# g// PERF_STATUS 1 x! j" h  P. x# y; g2 D4 Q

% [- ~5 x2 h- f4 y; E: \; E}) // End of _PCT object+ s* r( N, s( ?3 e% Z, o
6 H9 i" w% f& V5 u) C8 W
l
: _; A3 T4 P6 x/ o
_PPC
" ]/ F; |& I8 R: b* L  S9 E
* ]3 ?1 Z) D0 v& DPerformance 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
" \& e$ p7 Z% k+ H1 W. m6 p: y : M& Z8 B- G+ \# A- _1 v+ I  w
Method (_PPC, 0)
: z0 g: V% X7 K* g! g// Performance Present Capabilities method
* n; m7 [' ^5 F7 I
* |$ X# ]. D: p{
9 b+ ]$ q& V, s
5 J7 L/ v$ P! \! P: zIf (\_SB.DOCK) ( K7 ^) T' F* ^# |$ o$ P
9 B( A+ I6 {2 S$ q4 [8 `
{ 5 d& I  h* l& G& G8 E. ]5 W. ]

& B8 h8 Y$ L1 c" m& c  p& F, k3 @0 dReturn(0) // All _PSS states available
0 n1 Y5 S. z8 e; E+ s* \' r5 D! c. v+ g6 H  a7 J. v

8 U- m+ ~9 @! u" K} 1 q2 \6 j  U# x2 X  I4 }

7 ]/ J3 b6 Y) g/ ?8 ?) c, e: {: qIf (\_SB.AC)
9 \8 P4 {; e6 O: s) _3 r# u7 R; w+ k4 r, z! r1 R7 W
{
- @( R9 [1 _6 q3 R' e: c$ A
! M9 z' R& M0 RReturn(1)
4 U' j' s* V, \" i. w( _4 W/ O// States 1 and 2 available
) Z' [' H( M$ W' Y* l7 E* H* L0 P. i. A
}
% H$ C' r. R$ |7 l7 `- L$ N5 q  T3 T& t: {1 Z
Else ) J1 S( B1 j! u: R, Y6 _

/ J1 c9 ~  t* t; g  O& a1 c{
% q6 j" q' a" ~7 G* {/ m7 G# P4 d4 U- X7 ]  v$ d# W
Return(2)
" Q. _2 ]+ A, D// State 2 available
+ T% e8 X( J$ t6 G5 L" p7 x' G
: H. D1 ?8 g1 J4 K/ C% D" J7 ^} 9 t- S! D; L6 F8 R
* g, G) R5 V) \. }1 U$ X% w
} // End of _PPC method! C# E# X, k: Z: ~" _0 _

$ B' y' I5 ^7 tl3 f2 l# C  ~; f; q2 I
_PSD0 ~! N8 `1 r) F2 U6 i8 p4 j

8 B0 d% T/ f9 @+ C8 FP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。: h6 K0 T: J7 V2 V  \$ }

6 |9 [, ]' t; U! I; w! e; Y  MREFF:
  v& r# k% A8 i& K1.
+ t) T5 [! g9 ~; u8 K1 K! s( eACPI Spec 3.01 F& E! M! G, T: E
2.
$ y, V% C6 ?% n& Y8 [6 jIntel Processor vendor-Specific ACPI
0 x2 \# Y! X1 k   Q7 T8 ~+ u# w/ z* ?

, [8 k$ q! d: w7 A+ w- F- nThat’s all!8 u4 f. o# M) }! @9 K. P# s# M
$ `1 Z+ u: ?6 \& h4 S
Peter& }1 O# Q# \9 n& @: H& d
5 U. S( r9 g. _5 u
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
- ~0 {# i; y& n5 Q# y8 N
7 x/ c: K7 ?. |8 W3 [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工作时间的占空比)的方式
, t) I; ^" T, S: O1 M2 C6 S,影响系统的功耗和温度。
5 `) k& R+ W+ z" q- o; P/ ^8 u1 \
+ r6 ?# J- F. M6 o7 x  j2. T-state Control9 y$ b5 R, f' W( U. A

4 E% j8 K& L. q9 V1)
7 f, r- a% @- O- P1 t! f( f, j+ jMSR Based Control
& A) W2 a$ m4 g1 s8 M! O 9 z% y0 h+ z0 N+ f7 ~+ D" N
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 9 T0 t7 n  `. g" z3 O: V& y/ S
. _0 W8 B) U% @! G% ^
2)
! ^/ B; u6 J. W' x2 e# w: qI/O Based Control# O" Z" ?+ z* m8 T5 [0 D2 Q% }& b
( L3 s& h  T, a# Y6 V# j4 I# Y
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。2 Q7 V2 E- J) q0 y& Z8 Z+ f' q

" f- B+ H! h# g' J5 ~  b* [; ?2 b/ |( ?4 T3)7 O( L% W7 b% F# K# p3 h
ACPI Structure For P-state) K6 P* O( c$ Y
l
8 R* L6 I' W: \& r
_PTC
( ^" h9 t. g4 ]( y 6 [) T* q8 P$ y2 M+ R! p
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:+ v- b" _4 Q1 E8 [
+ k7 _2 ~# \  p$ w8 s, U. ~
Name (_PTC, Package()
& C; g0 A1 {: X- g$ G' n) q( P{
" K5 Q$ ]3 D+ l5 V4 q/ x& k$ q8 `& a4 q8 Y
ResourceTemplate(){Throttling_Control_Register},6 v, i/ l! u0 o5 s& @
//Generic Register Descriptor
+ R8 c( [6 V7 X- v
0 _% R* T' [  N! o. n* I: N1 OResourceTemplate(){Throttling_Status_Register}% ^2 _$ j. {  K* W6 G  h4 E$ m
//Generic Register Descriptor
. b9 y- n; T2 ], @2 r7 t6 `% `}) // End of _PTC
/ e  p* X3 E7 Q1 K ) m5 H! O, v+ Z2 M+ u, @
下述是一个sample code
1 k& d, y' b7 Z' {, ]$ A" \5 z : i. Y  v' G$ L9 ?7 f# X
$ A; V9 T! o" \
/// M# n% m3 g, ^( e: v, t' ~1 t

- l* E7 ^# u( C" n// T-State Control/Status interface+ D# }* n1 t; u; A
1 d9 q/ T( `6 q- j. q5 \+ e, h
//" l: I! Z& k8 S9 `

% g# h6 H) `9 F$ _6 C! O4 Z4 GMethod(_PTC, 0)7 C" F. t+ M" n' t) \
1 N4 Z/ |: b% y0 A$ G0 C
{3 L- A4 Q3 Z# @- a
  }7 \  a8 y4 D
//
& N2 V9 p9 `: n4 [$ ]
2 Z6 f% }7 j" |, g// IF OSPM is capable of direct access to MSR# y- k2 j, }5 `$ b

( a; o4 O- d5 W$ U1 c% W//
5 a8 J# e" E2 L* T2 zReport MSR interface
" Y1 A; v# a1 c7 V# N2 b5 |$ Y" f2 {
// ELSE( X) p7 g( @5 m" `1 [$ Q% g
* T# j. X" z: V1 a4 \
//
; ^/ y. _) P/ \: B; Y: jReport I/O interface
8 a8 E% Z1 }% c3 x5 B9 O* ]2 H: I4 G& S
//
! o$ z) o; v8 p
. R3 A, L" S3 y) s" }//
7 B% ^1 W2 I" k; B7 q# |+ cPDCx[2] = OSPM is capable of direct access to On
+ Z4 m9 S0 l4 T/ b7 E3 {, j6 J" V/ h
//- ?% E! e5 I) ~) [% B# @6 r* U
Demand throttling MSR8 W1 f; E% Q: y( D. \: K

; h- H/ Y9 m# |& G$ t//, h: |$ Y3 c* V3 J

) ^6 Z/ H$ i' ?9 {If(And(PDC0, 0x0004)) {
1 f# a2 b$ R. J) T; F; r3 B1 N4 l
Return(Package() {
7 d8 s' \" L3 C& Q8 B+ P* v2 e7 c: y% m( F9 r# w
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
) \& x$ K# E8 ?" g) e% k1 B4 T7 |* k: Z8 q$ W2 v4 D  o# X9 _8 `
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}. E# p9 y9 Y" a

+ x. z9 [# ~. I9 f. m7 S$ J})
7 W/ E1 D7 H; |- U3 [8 T! f$ q* a
2 x/ |- ^6 Q$ r- @/ E5 O3 K6 K}
5 A- Q& M" ^" ]% N% \% O- M8 ~4 t# L2 k
Return(Package() {+ p0 x; u6 G4 e8 g7 ]/ Y

6 Q* }. E' ~) N8 W# W( o4 [ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},
3 j  E& b% a$ M. N. H! M9 L; p% D0 y9 q+ c, ]& Q$ \
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
& e2 B& m! w! g: D5 M
) u. S3 A# U  W4 f})
# |% v6 [5 _9 P3 C
( G' W* V# L+ g/ W" @! ]: ~}
- g- |2 `* H! d  q: x
! \- o. L8 ?) `3 E$ M# _# {! b% m; K
2 {1 x$ K; y& I. M! ^# A! y" Q( F3 i
$ {8 e7 f% ?& G  H% v9 E; r6 {l4 U( y3 p+ l5 I7 Y$ p( t5 R
_TSS% t% H0 b4 P0 B5 l4 R& i2 S/ V
  Y& O; \! O8 @1 n0 M& D- X
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:5 F% q9 U- w0 o0 ?* h% J$ Q
Name (_TSS, Package() 9 n5 v5 H0 T1 B4 ^/ \7 ?9 _
{8 w. f" w) ~8 S# V
// Field Name
1 g9 [5 w& N; N' m+ |Field Type
6 h/ e' ^4 E4 w$ c: k! m: l3 z2 Y$ u" a; X

  M& J1 C) T! K2 [, y2 x* M* v, T2 s" Z" w: v5 o9 B
Package ()
0 t% u# h$ y$ q) }' ~5 \// Throttle State 0 Definition – T0 8 J$ V- U8 ^- q8 H

$ f2 y7 m9 @, {9 x/ [{
# i; K, G5 @/ W! N2 F" d7 b
* `9 J2 m" i  F6 v$ G
0 f: P- m$ m4 \1 }8 ]" CFreqPercentageOfMaximum," r0 \" {( {4 P3 P0 U0 J. R$ O
// DWordConst + T# J5 N2 b  I

. _# F' g- R+ `Power,
4 @: x5 w- {! i% J7 i4 _. |3 A// DWordConst
9 j3 t6 x8 `2 \6 Z$ [  R/ j  p' H1 x6 w4 {1 E# }
TransitionLatency,) b" t( S# S$ d+ i7 q$ g/ c
// DWordConst ) Y3 P7 P/ t2 O

3 C' F/ ?8 n+ I& a. _# a7 XControl,
6 W# h# ?; z  O) W: D// DWordConst
/ h$ m. b- }! ?% f# c
+ l7 d/ w& f) I# P* hStatus
! ?* f: i4 u$ R- x# t) i// DWordConst
  A5 ]( \6 t2 M3 S. N" G; a, a9 o},' f( B' ?3 ~' A3 f! O% f
……
' u) d' b- B; c+ B$ k3 K: B4 z" M}' B% H& p( I" N8 z
1 S, z: ]" F/ }8 _. p3 |
Example code 如下所示:
0 m- l/ m  [# h! }; B0 w2 P) f  _: E- W4 r3 k! S. E
Method(_TSS, 0)9 G! H3 r+ x) A# A  v( W

" f, d, o3 E! d& S. p. \! s  ?- a{0 i3 W+ R; I, p5 U+ r6 s0 E

' _) H/ H' ^4 _6 Q3 B/ ?/ zPackage(){100, 1000, 0, 0x00, 0},
0 Y+ r0 i" |; w, o& f" h' b) z* T; U! @* {. K  a
Package(){ 88," m5 d" n# L3 F8 t# {+ ^+ q
875, 0, 0x1E, 0},' B0 Y- _/ w4 v( K+ Q, y7 w& [
+ t* k" ~3 j& _
Package(){ 75,. \$ Q/ o6 a' `! Q
750, 0, 0x1C, 0},
" K3 L( `" Y( Z5 y0 t8 d* f8 d5 ^# ^/ I. t- s" _" f' A
Package(){ 63,
8 C$ v" T2 N4 F0 l, x) N625, 0, 0x1A, 0},4 R4 {: ]0 ]. n2 V0 Y! x

7 u& [1 g4 c' }Package(){ 50,
% p# W: y$ O+ i4 D9 S500, 0, 0x18, 0},
( o) I+ \+ u1 C2 c5 G6 q
6 d" r5 e5 [+ X, q8 g$ o0 b( t0 fPackage(){ 38,: O3 O7 q9 `% O. `0 {. [& s+ s- ?
375, 0, 0x16, 0},, y7 a' G5 M7 E
' ]' e& A% ?' i; G! W7 S
Package(){ 25,3 J: h7 @0 @5 g# w
250, 0, 0x14, 0},
6 _4 g; Q' H# P* ^" w2 u' u+ ^. g) c4 O/ M" l
Package(){ 13,, O9 ~& Z3 r4 Z' v6 j
125, 0, 0x12, 0}
  a8 I, C" J1 x5 [! W/ [& M0 x9 k7 t0 E- N
}' a; E# N5 g7 ^. i7 D

" Q0 |$ R, b+ p5 O0 u6 M
3 {6 w1 v! z: y* ol8 S% \3 \$ h. W! D0 {- O
_TPC* s3 X: [: `4 q; _
% \9 R) s7 B, K7 j0 k
Throttling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC+ {) O& [1 y, a  J4 v: E& z

" i* |+ s# G" ^- S9 R. O7 Xl/ y, d  x: d: @. B; P
_TSD
: e# H4 E" ~- N+ C % O4 T; P7 c2 e/ G  I
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code, x! U0 r9 T; p  m3 h* r* R
) L: a4 s5 r( l
Name (_TSD, Package()
+ d, l0 b# R" V7 t+ m/ [: N3 N' u* f, T- ~! w. M
{ 3 W8 b+ D% a) C

4 G% M1 b4 p( `' {Package(){5, 0, 0, 0xFD, 2}
+ K  L, `( Z' S. X! V6 @' ~// 5 entries, Revision 0, Domain 0, OSPM , {0 F2 P4 x3 y7 k" L4 L% j
Coordinate, 2 Procs
$ y% T$ U0 a7 ~" I
3 r* g  u. I; `1 _0 T
6 Q8 i+ T% S5 r9 ~2 U}) // End of _TSD object  T2 ^8 f+ ^' j
; x& ~; V- {$ K; G/ t4 l+ Z( Z
REFF:
7 i9 ^# W: ?& |2 }9 C- ^1., i7 ]* m# k. \  R% U, A
ACPI Spec 3.0
# H# C, ?  K; t( j" V2.5 J, ~$ I7 w2 g7 `7 L5 L% |
Intel Processor vendor-Specific ACPI
& Z9 u8 K, E0 u 1 j3 s6 [5 r+ X6 X3 ~
( @$ @! [! R" l0 i6 p* g
That’s all!" w9 c9 P8 w5 z4 [

: Y7 w0 g' U# cPeter
, x/ h3 }" C2 R
" e% u9 Q0 F5 u* A9 o6 D: b+ e2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 08:31 , Processed in 0.029965 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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