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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
3 r8 D: b( u, _) X  h: F1 d
1. Overview
. l  o3 u" y" S# J7 N/ {
6 U3 r# S3 Y. H1 i
3 h( k9 ?) @9 R0 ^  ]C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换0 ^3 K( e7 \9 {6 l; i2 g
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看6 j+ a; ^: ~% j% D0 Q+ e  h1 B- S
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。3 X1 L5 ?) A* o6 R; ~/ |& E

" A- W5 c8 a/ f, K
cstate1.jpg
( w$ L* ~. I$ V4 ?/ x
1
2 H  S' _% `- K+ F: O' Q4 Z
2. C-state Control
0 F; r3 u& e: F5 O7 b  c. ~- C! ]! o$ W5 y  K$ k
1)
8 }7 ?0 [# f" r, vDetect & Enable C-state
% i7 N. w; \( i8 }  k$ L$ h7 K5 f8 K4 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的支持。
6 l( @8 q& x3 a! g0 T8 m  z" J, [6 i
2)
& }. Q4 q! `( T) ~3 HC-state Basic Configuration
3 g# M7 t7 S8 q5 o; ^通常情况下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)。
- {( ^2 E# G& I, Y" c7 r8 b" R+ k7 t& s3 T
3)" b- E/ v* y6 P! g
ACPI Structure For C-state
% o0 Q" }) q2 J, n& |: w) x# u
. Z( w& z# o- ]9 M6 Ql
! C) n! |$ ~. L$ h$ R2 }
_OSC & _PDC& W) v3 C! K# A$ G
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures6 o9 C' C( C4 x5 s' ]4 x
l
* a0 u2 ^% G4 S
_CST6 c6 b1 z% x* @! i! a& }
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
/ ]$ n# R$ n. I" X5 F: gCSTPackage : Package ( Count ,
% W) j- l' C, H; X* H  PCState ,…,
4 b% }* N4 ~4 t, VCState )
; J, ^0 m* K$ T5 r" ^2 P1 C! W" f# A其中Count表示所支持的C-state的个数
6 d6 e" I/ K! Y. g/ Y1 l' w- q4 ECState: Package ( Register ,- b) X" Y( b% l" y8 j; ^
Type ,
9 k' j6 Y  X3 h9 ]Latency ,
6 o& A$ G) d. R& zPower )' |6 P4 d- U) y6 Y; P1 ?0 C
: S; {* I3 j7 Z; |' y
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% P  i( N; l) u4 G7 o

/ \8 {% l6 X& o+ }, g+ b/ WName(_CST, Package()8 d$ a/ L8 B' b- I

5 n, ]0 C7 c& a' z9 v* V5 M6 }{
" B! |) `( s; p0 _0 M% P: N4,
% j7 Q, S# r& G5 W' V8 H// There are four C-states defined here with three semantics
8 F3 c# ?& d7 A

2 d0 w! O+ ]! m6 k// The third and fourth C-states defined have the same C3 entry semantics
$ o% {( O; I) e  s5 B
0 S2 g, C" T7 r* |8 q. q4 V
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
& M1 t0 s' c; u& l3 ?( ]# P1,8 A: ^8 `$ Z0 u8 C# N
20, 1000},+ n! h& y- f& P3 j5 z; L+ r0 D
& {8 l# C$ C: |$ I; i
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
. ^! s8 Y& N! H5 b40,
' u" S% N# g# d750},

& E& v- P8 }! B" O7 LPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
; V- w; _% }! z/ J0 V7 {60,) f- d9 G5 |' M. k
500},
' ]& e7 K- q2 w% x
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
) h* V, @- L6 i, Z: u1 ?: P250}
, s. b* @" G( w8 y/ h: G
6 Z$ s) X0 ?! O' B6 r
}) * @/ D" _. B2 f" b- y* h
; Z( ~" O; o2 j% p
l
$ n) X$ {; G( C- U8 f. k' `% E# R
_CSD
8 V$ H1 l. I' @5 \3 A. c0 y
1 ?' j: X  s" w( P; jC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。, P( T5 _4 k, d: l* J
) Z; {2 v3 G/ Q* H: V  a

1 ]; T9 E8 i0 a) x2 ]2 L8 X/ c* @5 H, l
. @% V( c; ~) h/ \1 Z, ~
3. P_LVL VS FFH* F4 Z, B" f$ b8 N( E$ f8 l
5 r4 o) e/ S. v8 G
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)) j3 V' d. \$ D! [5 ^: x
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所示:# u! K' z4 G, N" A" P
5 p& N2 Y' o) r5 j4 ?
gas2.jpg
9 B/ L. f' |+ [1 l/ T
2

2 H& ^: o% u% h  ^  iOSPM解析到该_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的一个例子:. B( u) [; ~' ^' f+ p/ Q) G7 p
Name(_CST, Package()- B$ c! S. k% c/ S( |0 g

( |1 p" e3 W( M; w/ t7 d+ q: j{ 6 Y0 D) w, Z; G! t, g; t
2,# d& T2 A2 C: M* J* U3 n7 d6 X
// There are four C-states defined here with three semantics
# |& D" r2 Q- Z+ y1 h5 l
. D! `6 G! p$ n( y+ {) O' y
// The third and fourth C-states defined have the same C3 entry semantics
, C4 ~. G5 s" Q0 E/ B# Z- r

- a) S) N  J: O4 A7 N$ }+ o! {Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
9 n' v+ s" N$ E! b9 l0x01,
! L- p  U3 q4 [* E: L0x03, 0x000003e8},3 b" _4 S0 _/ {9 c) L
+ m3 `! t4 x6 }& `9 L& i% L3 I
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
$ z) X9 W; h1 o: Q. ~0x01,
  I" u& P* M9 b, M. p% w0xf5, 0x0000015e}

5 W& B" l3 ^# A. g. u+ T% O: W8 g})   k! U+ [& l- D& b2 i) R: I' S

7 B0 o3 U3 e4 n# E" o6 a
- i) n$ f5 k8 I+ O) C2 F& [* NREFF:
4 \, _) g! a: B% N6 X0 K1.
. I$ L# v2 `9 k; z! S3 [; G/ C& R$ OACPI Spec 3.0
8 k6 H4 B) L+ u; @, ~2 X2.
* o3 ?. m$ d9 x# J' XIntel Processor vendor-Specific ACPI( s; m- x& _! {+ P

7 K& {' o4 ^8 m1 s4 o) V! p
( N/ O" f' R9 A6 S% F/ w2 z- ZThat’s all!
2 |& {" q5 _$ \" T* m0 v2 Z3 {# r7 B
Peter: ?) e8 ^3 W, z9 s& X3 ]$ ~

; f- F& i# O1 |, e2010/9/20
* f9 a* Y" I  N( J- q0 B5 j
9 E( I" t: Y0 v1 K$ U[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview  D8 \2 ~! F' m; K" {$ R
$ U8 k  w( z- ?, S; {7 A
CPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
6 W2 f' C9 t7 K2 i' Y  SEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
1 r  J4 ]% _* L6 G5 {4 Y , q4 k0 I7 m$ o7 V
2. P-state Control# c) q9 m9 Z9 ]( l! }" \# f9 K, g

' W1 c8 Y( y: D9 j& k0 |1)# Q( J  F7 U5 b( n9 ?4 ~
Detect & Enable P-state, M% i- X0 ~, G9 Z
) c4 G( P- E8 b: o% Q; W2 [# `9 o" u$ ^
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state
  `2 r# m8 d: k3 x4 Y5 N. s ' v' I9 P( C+ a  o  `
2)
4 P. D3 D& h3 W5 rSupported P-states
9 i& T, B! ~4 y ; y, Z/ S) z% Z9 g9 M+ K
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固定是100MHZ1 F) k& S6 t5 m/ Z' t- B6 L

' |8 K6 a  }, P+ `, P; d; l6 g) qMinRatio = PLATFORM_INFO% R+ [- [( ~" m; H
MaxRatio = PLATFORM_INFO
2 S- b' W8 _4 N( c8 E4 [( j- s& N* pRatioStepSize = 0x01( v8 J4 _" F% d3 N/ L5 X
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
1 @/ V$ @. ?8 V2 e1 f6 ]8 Y5 l ) M( n, _. `/ I, Z: L
If(NumStates > 0x10)0 C) x% l0 w' V4 _! j. @
{7 _1 [$ m" M3 `8 R/ [1 Y; S
RatioStepSize += 1, U0 g6 j" U  \; |
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 13 `; R+ m; A9 `, C$ A* p4 o8 a
}
5 `- P2 \; C# a
4 w! }; S8 Z" N% ~( Y4 |2 e3)
) ]8 S4 d9 T$ K" f% t- OTurbo Mode
  j; S# J1 V5 m1 G4 i) Y' g 4 s: y6 h, R0 D: s3 w, K
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* [8 y, n8 d! ~* `5 [4 G/ F

/ `' m$ N. o3 u, z. ?# W# V, B4)- [0 F0 a( X6 M+ @" Y
Over Clock  p7 v" t* M) h1 J

7 U6 L7 `6 g5 I$ X8 c; o# d某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。; t& {4 H0 k, [4 L  _
" P! c# P' X: h
5)
: i4 V3 h# q' YACPI Structure For P-state
% c! R& E  R/ b4 @ , D7 i9 j* J6 Z2 @2 d$ d, D
l/ c9 z6 `5 X6 O3 g3 k  p9 R, O
_OSC & _PDC3 w" d; }# }4 i( q0 a8 \4 p
" ^* P) h' _8 S+ a
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
3 A# P# Z- c# ?  _" z+ t , D0 v7 J! `+ c- A: y% i# C; }
l7 |% j+ x0 Z! y  ]1 Q# y
_PSS
3 P8 I6 j# c( N  A( n6 ZPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量! ]' @/ p; v7 D& @+ b) w  V
并且通过一个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做比较
5 Z* O" A% Z" r0 b2 m. ]/ Z以确定P-state切换是否已经完成。
! R- j9 B8 }' o8 h2 _ * E( v, g# C* n0 M+ M+ O& U& v
Name (_PSS, Package()
1 X/ I& o6 T" Z/ [& @! N+ @{
" \- S5 c3 X) _// Field Name/ X0 M+ N6 n/ `% r
Field Type 4 g6 z; {, n- O' \+ T' \

4 `# ^8 G# v  T: t- P
4 @; |, {& _# k' q4 r+ P+ ]# ^  f& W2 n* T* b# H5 g8 J  w
Package ()' w( B  o9 w5 v3 K* r2 O0 a
// Performance State 0 Definition – P0 * P9 b& B" g& w, d. b8 V# @6 M4 x

9 A' h% [& g" E* [{
1 O- a2 R( U" o* }0 d; E9 U( U8 ]: b- y( v

  R$ k% T+ H! nCoreFreq,9 U5 R. A! b4 W- E
// DWordConst
" }: ]( E" I) ~, O; f6 h! \% s- w0 |5 m& P7 Y' L; X
2 f5 U* L9 @, ]1 V# ^* R  Q
Power,1 [' z- l$ l; C( u5 i
// DWordConst # k8 g+ E! I2 o. o3 K2 ]' A1 {

" R7 c9 k& `  P+ s, D2 A$ b+ ~TransitionLatency,6 H# w; g! g/ U% _. k9 U
// DWordConst
7 [9 G5 l# y, H8 I: c( L. }( F$ D8 l- G- K  L+ Y1 n) |
BusMasterLatency,
$ s2 q' Q5 a6 Q// DWordConst
7 m. ?4 Y+ W0 p: ?, F/ }
4 J0 I( T* t+ \% gControl,
5 |+ k. ?% u9 L7 }& d# d7 Q4 a: w- U* }// DWordConst " J& M% v2 H- D/ G; Y' |/ I/ |

& U1 y( V  C5 H: x2 t& U" _' q* N2 {Status1 D1 {, x1 W5 b/ i& Y
, U4 Z0 b$ o8 n3 s" R" Y5 ~
// DWordConst
9 t5 V  W$ n5 x' g
# `1 q, N" c! j},
8 b, \. _; ?; e7 V
  a* t1 T+ L0 M  Z( l7 D) @+ {6 p& C. 0 }+ X' e% W+ O

- @& T1 L9 ^$ S& `. * Y! g/ d9 F+ y, J- V+ D+ Z
2 t9 m& l# p9 H0 ~/ i
.
: C) W8 D$ [) }) N, \7 t}) // End of _PSS object
- w  x) s( A" ~4 F1 n( O4 Y前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5
' o8 C% H. ^, i- v; J
$ D! O' K# ^3 n2 }Name (_PSS, Package() , S. t6 h! e# T& ]8 G5 W
( F: r2 B3 V, Y) j5 H
{ 2 }; Y" F; @0 Q* O$ p4 g) i+ {
$ J) U$ _( o; e' i# T- }
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) : e" R# B- K: t* p# e& I6 t1 }
1 g% H7 t% J7 X+ ?( v" `! g6 h0 t
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
, N8 `# U' W8 ?
1 a6 t$ t' @# h! g! OPackage(){1400, 8200,
8 t+ a% G1 d4 \10, 10, 0x000E, 0x000E}
% I! s# G% V7 p- p( M- P  r; H// Performance State two (P2)
, O% x+ d' u& g& sPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
: |) ]9 l: y# o* s; k0 L9 NPerformance State one (P3)
+ Q1 W3 T) o+ W) d
) S6 a1 C( `+ G7 ]; M( g1 APackage(){1200, 8200,
1 X7 c: _2 W, R2 @0 }/ K& {10, 10, 0x000C, 0x000C}
+ m0 P7 g$ A$ q& T: a2 _// Performance State two (P4)/ N, x# G" q. @* N) g

7 d* K  N0 w9 A" j/ K1 K/ c}) // End of _PSS object. {8 c+ e* D/ V  j* K5 a
6 ^* ?$ h$ u. v8 P! X7 _( m! B# Y
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
: _# b# W2 d7 b( ~& c) N( R
: k' L. a* {) K8 d; E6 R' Gl
$ J( T4 _: r- S
_PCT; E- x; E/ o7 L$ ?

! H* e" i. K+ k4 Q, p5 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的方式来进行。" d1 r+ T! N* n  V0 H4 S

  {% d. G, T! {0 Z* B/ L3 i1 nName(_PCT, Package ()
! S% m9 G% N0 |// Performance Control object # j- R) C2 {1 B# n8 v" C

, l( U& I" m( p{
7 ^- d  o5 ?+ L, {) n2 z- J8 s( e: [1 O: q* m& q7 b5 }4 T
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},. `- m* o. n6 ?- N4 J! F
// PERF_CTRL
: [# o: ]& |- ^9 v' U' ?1 [* n1 h2 M! L2 Q
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
4 X) G* V: A- X) i6 _// PERF_STATUS 8 `, D$ F! D( w6 e

1 D8 E6 [2 {0 q7 I% }}) // End of _PCT object  P  M! X7 x9 N; g0 ?% ]- A' u/ Z

& K5 `( C4 o0 wl
) d6 y5 e& @1 x" w3 t* {
_PPC
& A2 n: O# g6 g1 z7 f& n2 L! E " Z3 e- S  ^) M$ `! f
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-states5 n8 e' b2 z. K: x( y* |" L
" E: G6 {* E* J* j2 ^
Method (_PPC, 0)
0 s% {2 U+ _7 L6 i// Performance Present Capabilities method 5 v$ L# B1 G1 n$ d  i3 {) g
3 Q* Y6 k& C; ~& @1 S( `
{
- f2 o! d7 ^+ `  [* r: [0 z, c  h0 s6 p% U  C, N- h
If (\_SB.DOCK)
2 u  C7 @6 q4 `2 ?% V
, f/ ^2 O+ J' K$ ]{
. M- B7 s/ }7 {. W7 Z9 W% n
3 _% Z$ F% y3 A* p8 T# y! [" I5 V4 O4 |Return(0) // All _PSS states available; L2 {% `; A: b% Y

0 [1 ^  u8 B) ?4 J, U
% n4 x7 r( d3 P& T; n}
% q: u7 L; O+ \( I* D
( Y8 Y9 |/ ]' Z& \, ^: qIf (\_SB.AC)
& @; \. J# |) t' ]' E1 A1 J( a0 K. R# w1 B2 E) L5 W& S$ `
{
: a' i6 n0 d1 v3 O
8 x. ?* Q5 x  G! h% ~Return(1)
# c1 M( j, C: B6 e1 g8 J// States 1 and 2 available
0 q* `6 [, c% U* e7 E) H# \$ F1 T: @4 i; @' R+ k) y
} . S8 i9 U; ~0 g/ j1 F9 X

9 K8 p# \. h1 r: G0 PElse . o- o( L: E7 \, t; v7 q
* Z, [( G6 V- T; k  `
{ - q' T% v& p" H1 j$ ]* l
  a9 B" e" s  A$ H( a$ E( k
Return(2)1 Q! k" B  k6 {; w; }+ E: G
// State 2 available! A3 |* O$ P+ O" d
  y( e4 a0 \- w2 f% u4 U
} " T  g& j6 I- G. `  V
6 j6 S2 q) G/ }* [1 P8 [
} // End of _PPC method/ t  y+ N' p* O

4 a. r1 }5 [9 _% |8 o# Wl; H+ b; f4 K0 H# s4 r- f  G- D
_PSD
- d' l* o3 a4 |: d- D; a4 N - T5 c0 X6 i6 \
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
( g  d2 R* ^5 ?+ f2 `
. \% l1 n4 t1 N& `, A5 f; ]- S- RREFF:. i( N/ p4 J' Q
1.
/ m0 X; O: ]" N5 ^! c0 o) [$ jACPI Spec 3.0- ~$ j0 i) A, @  A) ^
2.* p; M! ]# i3 R9 s
Intel Processor vendor-Specific ACPI; u7 |) `& T) O( W8 V7 M

' B: Y- {2 p( P. `0 @9 D! s, ^ $ z+ c  F$ s  o
That’s all!
/ s- X+ M7 x# \9 O5 ?% [% A
# U8 I  a3 D7 e! y' z3 `Peter
2 B. S* T! i; w% `. c
! \* i, @0 ~- A, T2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview
! L/ q# V8 Z9 {/ N* G
& _7 K7 k! ], y: k" v% OCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式
* y! y1 w- ?9 L' I,影响系统的功耗和温度。
( v( E+ o0 d; n( x. Q
% q* T0 ^$ ^( f2 R( O% w0 J8 a2. T-state Control
- f/ B' B$ k4 s, c4 H2 A7 [0 T
- e: _( `; Z) r4 v  }, b# c1)2 d! N2 K1 c# c% Y2 z
MSR Based Control
) A& u* @7 R$ q; M6 \( S' }
: J! x4 ?  [9 |8 j/ g# t: j6 e7 cBIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。
: m+ T  t( l0 A6 s5 w% _# Q' a1 l
4 Z; H4 R" e0 o. W- x/ H: }, i/ F2)9 M; i/ z) x4 z( _8 Q
I/O Based Control
) p5 \* Y  [$ m+ }
8 y& a8 @; |! F& ]除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。
% r" f5 \: S7 k  C
8 O) i. t2 E' B; U3): z( a$ T- [! C$ q2 ^
ACPI Structure For P-state
# w2 \) n, B1 C: o+ c: v/ c3 d! @' wl
$ V3 ~+ m- O- ^
_PTC1 M& Y' `! n0 B. X- @5 R* N) {

' z6 Z) G: }# C6 H/ m: H, iProcessor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
7 g/ A% V  K/ t( ~2 P 1 ]9 D+ |. j: ]) k$ J0 _6 W% ?1 {
Name (_PTC, Package()
& k$ Z' m. d8 ~7 |6 M1 _{ 3 U1 r! ]9 A5 S- s6 N6 w

- n6 g1 d# e6 J" _/ d; g! h9 CResourceTemplate(){Throttling_Control_Register},0 I* }- o, n+ K# L( ~$ }! t/ V% K
//Generic Register Descriptor / x% d; l- x; O

8 Q% P" j- I3 F9 g7 c7 \4 L  l( NResourceTemplate(){Throttling_Status_Register}
  h( C- C: X9 E9 C( K6 q- G4 z//Generic Register Descriptor 5 F/ T- U4 K4 X) {' E5 O
}) // End of _PTC2 G  V2 h7 {. k- B6 a4 x. O) F
4 {, E; [: X3 Q3 a0 U) g" v
下述是一个sample code3 z2 O8 G0 Z. z, ^6 L8 c
- V# l5 X  T: s

4 W6 \  B- a! `1 }6 p
//, [* I. \6 s" w' l/ z8 ?

! p( [# M; {& Y) ?4 G7 M& z0 n8 Z4 A// T-State Control/Status interface
, a4 V3 R2 C; y& ~' W4 s
/ Z( S, n: p' j( m" g- \//  k; e* k  j2 N& J1 v6 G! H
* D9 \1 Y/ E9 z9 ^
Method(_PTC, 0)
1 H3 ]  k6 u- V+ }& R! U8 f- L0 R: N3 @! j( w
{. Y0 A: x6 Y4 L! [. g* z- [: w4 p6 D

) @* d  B/ j% f5 m3 L. m5 U9 |8 i( l//
% X0 v* o4 [2 i
% `7 h/ T" N+ S// IF OSPM is capable of direct access to MSR- A7 s' v: a8 v8 ]

# n- |4 F( O+ I* r; C/ E% B6 t' A//; a7 X4 Z1 p6 E8 `
Report MSR interface/ w+ ?8 F( s$ V0 n& F

- X8 q5 [$ M# L+ S4 H* y// ELSE2 \  ?& h$ i+ y; S/ r+ E
2 H, c- R1 s, Q& P: A: L9 H: R# b
//
: c( p" H) O: a/ X+ E7 fReport I/O interface/ N7 {7 b3 |  E8 G9 g

3 A, `) Y- C1 U6 ^, U4 P//
9 V' ?3 D5 J4 z9 g. g  p& P$ g9 ]3 ^8 F) z( ]
//
+ F, @1 C& ?  e$ \: g& `PDCx[2] = OSPM is capable of direct access to On
+ p& o6 F. R# N, O
9 Y& d# o2 U$ d" @" L//
/ G* s8 ^5 Q" H1 J! G( v& h3 PDemand throttling MSR/ p' O0 P) p1 D2 @& r
# K' E& x, R9 J; U( ?3 |/ |
//
3 s! n5 b3 W" u  a, P/ }9 @* r- a( {
If(And(PDC0, 0x0004)) {
& M$ ~- a0 u5 x# |
4 A% I6 D7 X. A" _! cReturn(Package() {
+ W( p: n3 T" r; X& E8 F4 K+ M% l% D
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},0 j& D5 Q  h/ x' E6 d( k

3 S+ g8 {- R, l, oResourceTemplate(){Register(FFixedHW, 0, 0, 0)}9 c' I: G$ W/ E+ J

' t3 I4 Q' D: F) S2 H9 v})
+ Z" a. Q# Y3 q4 W2 P8 }$ H6 r& y) ^3 t  m* F6 ~
}) H/ d$ ^  [) E: d$ K0 f
! g( ]! L3 J7 ^; {6 a0 L) c) L) v7 v
Return(Package() {" v" P! ]( l6 d0 ?2 y/ o* ?
7 s$ ?5 e7 }' i- p' i
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},' F4 ~& w! o% L8 ~" q
( e0 W* k) g& p" ?6 j. X6 u
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
% S% O4 h  O8 N1 H' _4 L* ~. ^' e) \6 i5 r
})+ ?' {: h8 E. b4 w  A+ c, J2 ?
2 Y: V6 q  {2 [4 b/ d  n' P
}0 V/ y/ X5 l: g+ w* O2 q

7 ~% M6 T8 r$ s$ J9 k
' Q' s% V$ w9 u: {2 r5 U0 `9 \5 f2 ^& P6 k4 ~! L
l
6 \, j. u" d& b4 g$ ?
_TSS7 P& s, T2 A% F

" f1 k) ?2 L' e  XThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:- ~  t* U3 g, j  [6 z
Name (_TSS, Package() 8 Q5 d( q0 ]1 W: s1 h; }; z- J+ p
{; ^+ C: s/ g+ g; _# b
// Field Name
6 [6 g8 w0 u0 o4 Z# u9 GField Type 4 O' W- B  g3 Q7 _

5 h$ t  x  n% }2 I3 s4 |" s. E0 x+ W4 ?  W" [% ]* h8 ]
6 [  q- E8 n" v1 z5 a
Package ()5 @# x) d0 ]2 N! N& z  L# F
// Throttle State 0 Definition – T0
9 x+ Y6 _5 q+ p/ I- |6 @+ ?+ C, E: X' F# O- S$ ]2 |! m
{* `" L% N# y$ z5 [$ k$ H! d
; r7 C7 X. D& Z3 f6 r# S* o
' B4 G1 c( |$ o( w
FreqPercentageOfMaximum,
- d2 f5 g" R* v7 [- @// DWordConst 7 {/ \3 a3 `  ~+ o, G- j" i
4 d0 N9 |+ @7 W4 o  A& X" C7 L
Power,
/ T' }, |; N9 ]7 w// DWordConst 6 f' _/ X; \" ~' V
. u# b) W2 D  w6 H* }) Q8 b
TransitionLatency,+ _& L' K! q9 v5 X! T
// DWordConst
' K) B. ~; H' h3 i! q6 Y, ]+ X& \3 ?. {+ d
Control,, W) l2 A8 J8 u7 e. z
// DWordConst - C3 b' v( A, ]( _7 B+ [- b+ f
; W. c/ F) k& l. J. N0 F
Status8 e& ]2 P4 t/ P8 v: L
// DWordConst
+ ]. m5 V8 o" h, {},
% q% D# P, A: |9 C# ~2 s……
, e, ?0 ~+ w9 e2 q* Q$ F" @& ]}
8 }/ n8 _, _2 Y9 V/ a
! v- ^9 y: m# L, ZExample code 如下所示:
: g, o) y' c0 H1 q% S
) C; F8 S% ?( s; S1 U. o: [Method(_TSS, 0)
; d8 S5 }& j0 Y  o' x# b8 f; }- {, T/ K- E2 T0 \+ @
{" d2 ?" `6 ?, A. V2 P
& ~0 p) O2 J# _* G) t# ^
Package(){100, 1000, 0, 0x00, 0},
; I. t- M" v* j, H  b5 {
: d& m1 [6 n* E4 a' XPackage(){ 88,! T& G% k$ k1 G- K9 ?' |% V8 D
875, 0, 0x1E, 0},/ I' y( U' g( F/ O+ S+ B
7 e7 N* n! |3 W
Package(){ 75,9 E* x4 L! k. l) W! P
750, 0, 0x1C, 0},
# Q+ M0 `2 }4 I" p8 X5 e- F' g6 O4 B& \8 ^" Z  Y
Package(){ 63,* e5 `. j' s4 z0 U4 f
625, 0, 0x1A, 0},
- m( Y# ~* p3 N" k- R1 g4 i1 R7 O0 M& {: L8 T6 z: z  d
Package(){ 50,
8 r8 Y' D$ ^: \( Z  T/ T: c, m2 I500, 0, 0x18, 0},
2 M8 w, N  p. a( o8 s5 z/ |+ L8 o4 y% ?, K/ Y" `. g
Package(){ 38,/ ?) _, o. [0 Z- ^
375, 0, 0x16, 0},
* S. X5 r0 N- O/ `! i% a
, \( D) F, z$ T6 i: H0 f3 EPackage(){ 25,
& ~# g2 k2 E( \/ M250, 0, 0x14, 0},
/ T* @+ J8 D* ~- \; X% j! D
( L& {# T. d+ m$ R3 o- KPackage(){ 13,' a9 ^) ^8 q% L! t+ v% ?
125, 0, 0x12, 0}
" B$ J, g. f3 Y# c! \/ y& A) z& B0 k) h0 O( Y7 \
}9 s. I- D6 N0 w2 s
, f5 _( m0 _; M! N4 `$ l$ D) ^

- t0 ]! h2 F, A+ @) m# jl
4 S( J. o0 S6 Z9 m; P9 u1 ~0 v  x
_TPC. U7 `, o. V0 V1 |8 ~5 o

# ^4 O4 o6 j  Z/ k* oThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC5 _% d' i2 ^3 R2 x/ n
& Y! ]4 ^! }  ]; f4 K! S6 C
l+ I5 i: ]! \5 b) K( ?1 V: Y9 J! R
_TSD
6 l7 N$ U! I1 ?
% |3 }$ L# \7 `( t- mT-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
: H8 b- P0 ?2 h! K. ]
' r. g% P! p) `" v) |" f- @Name (_TSD, Package()
! W1 D* L0 e* y. D! d) O( _8 a* \! y' [* p! G! H
{
0 e1 |$ T4 e* V8 m
0 s: W* X! {% q7 ^: p7 q: o7 nPackage(){5, 0, 0, 0xFD, 2}
: U3 h% ^, I; r3 }// 5 entries, Revision 0, Domain 0, OSPM 9 |, l5 j* l) B( j* Z3 d
Coordinate, 2 Procs
% t7 t) T7 V& X, F+ i& ]! K* A- Q  e5 T: {. V* D  g' W

. c3 z9 V. @) |. [}) // End of _TSD object) c$ c, f' w' m* V) X3 Y

' Q& @" I, p" t6 vREFF:) o: O! p& S- \/ @% ^5 L
1.
3 |+ z/ c; E- H3 u# i$ gACPI Spec 3.0/ r# [% L0 v1 s" Q* a
2.
+ w" ^  D& h. W  c% x$ e0 P( fIntel Processor vendor-Specific ACPI
: Z# H9 P% K% P* g, h6 k0 M
" x3 Q; j( k- Q" O  g. r: v; i
: X/ y6 f2 I* q" PThat’s all!
, |9 U9 W$ }+ [7 _
  ~- B$ g" E! B/ }Peter$ l5 F$ b5 o* v9 Y
! X& _4 C' C+ x- F! D' V. U& a
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-21 17:31 , Processed in 0.051328 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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