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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state

( s5 l# P+ {; l% F4 W3 B# ]" r1. Overview2 i; Z0 e' c) w
- J; D! I# M! D/ U
% n  w5 Y9 j- s! _3 s
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换7 Z& H) u0 g- e2 G4 G/ Q8 V6 B
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
* [& y4 E: ^% p1 X9 A7 k7 F9 N比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
* v& X  ^8 W1 N& t# {9 l1 }! }* Y$ A: ^. }# C; N/ P7 X
cstate1.jpg
8 F3 R$ _7 c: O3 i/ \0 n# }9 S: M
1
) R: i$ X( R- F
2. C-state Control
3 t8 o  N3 S* \
9 N+ e6 w0 R( X# l1)
6 U9 X1 m, U% p; nDetect & Enable C-state0 u+ M/ b' ~( z: {3 u: i7 g

7 v- C0 l8 K$ g+ ~0 ~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的支持。
1 O  g1 D8 b# C: {8 G) t& c+ ~8 z. V6 L0 Y% o. \, S
2)
8 }; D! f* ^1 v1 W/ @5 [C-state Basic Configuration3 b; G& B; M- M; M  ]
通常情况下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)。* e; w3 H: f6 {( J+ x# o9 p9 k
; I+ b+ q( h7 r, Y7 C# f6 u" P
3)
/ i5 R9 H) ^9 P- B, H1 MACPI Structure For C-state
( l( Q0 R4 T$ V( {1 T' x" j4 S" H, w, D6 ^- c- h$ t- @2 y' ]) W
l2 }& X7 k; O4 B
_OSC & _PDC
' N# {) j+ Y$ l0 x. [_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
' }. ~7 ^; t. H2 N1 {: A. ll
' U/ d; ~( z6 x
_CST. A& ~1 q. y2 r$ m7 e
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
; ]; B* `1 Y& t# yCSTPackage : Package ( Count ,
( T" E2 C& R7 ECState ,…,
5 ^  o) `1 z# H: R- i" Q4 o2 jCState )
: ^; L5 O- e+ d; d& O' n! N4 E9 |其中Count表示所支持的C-state的个数% {6 [! p' B# o1 H0 \
CState: Package ( Register ,' |# }1 x; Z! W' J3 R* R2 v2 ~
Type ,# A$ {0 h% M( {& S) b
Latency ,: @8 p* _! q  _5 U' v
Power )
2 s" S" |( S$ m1 `. [
' M  Q1 J  n7 b! J: z5 u, jRegister表示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
& U6 \. g/ A2 \  a" ]% j; r
% ^, l7 g- |1 NName(_CST, Package()- x; d) c  ~/ |/ `3 k7 Y$ S: h
, [2 @: b  l3 V% ]3 e$ T- D
{
0 H. s* o; e6 e3 E: [3 h! u4,# a$ u4 i- ~( |8 T  U
// There are four C-states defined here with three semantics

; f2 I& t, w( K' s4 t3 b* {. B
  j1 y& n! G3 ^0 K! y* @2 q// The third and fourth C-states defined have the same C3 entry semantics9 W: B0 S/ r7 r/ |; ^+ S" Y# Q% r* w
3 Y2 g+ L/ C, S2 ?" E( n% S% ?3 ?
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
& t) E0 }, _/ ^1,
# J8 v! x) f/ ?. o2 \, ?20, 1000},) w5 A" h  u- o: Q" c+ ]
- m9 H$ P, N3 q/ `- J
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
5 X6 }9 Y+ _8 c* i& n7 r40,
9 \6 g* ]8 j: o5 n! ?9 Z  t750},

0 D+ f1 @; Y* ?, m* i  rPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,+ r/ \2 l4 f6 g3 m7 m
60,
! r  L; R4 G5 |2 I" X; F500},

0 U& d9 T* k' Z$ |2 m5 V9 ~Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,- a2 V# }" [* f' b) I% J& ~3 [
250}
9 _5 Z% B6 o! A1 g
8 r9 s# Z4 z/ _
})
- e3 P! Y& i: x  D5 J; ~& T( O' Z& g: q. w5 Z
l
8 g; n- r4 ^3 u8 l. r* _* L
_CSD* q2 G% P1 \% ^: d# t7 h

: \) ?# d% ?' z# e. I, ~' KC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
( p4 k6 x+ [- r( ?! C. b
& M! F: S: r# h" }. n$ A
7 o. |* I  l. D1 g7 i" \3 z: W0 j8 m0 J1 P

/ D4 t9 d# Q$ H: c4 ?* y3. P_LVL VS FFH, d3 N6 d; z, \+ H; `4 R
. E* J" {  A8 H( n8 I
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)( X! o1 j" G' d/ e0 U" \
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所示:
8 g; V, v5 E+ N- v$ k. t' K. Q$ o% _, }& B4 |
gas2.jpg
2 J' X! e8 m8 `! ?2 ^: j
2
5 r1 c/ Z0 F0 i$ U
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的一个例子:
5 x# f7 h# U; `2 M8 m9 B& O; ZName(_CST, Package()
1 R# S2 [% v/ q' L$ b/ r3 ?" F! P
1 `) J' _6 A' F; r4 H) s
{
& R7 n  M2 k: ^4 K2,9 ?) O6 w# P0 {, z- l9 R( p/ K
// There are four C-states defined here with three semantics

  L) E2 S& \( o% F; \& j$ {4 s
7 t& _5 P  B* [0 m/ W// The third and fourth C-states defined have the same C3 entry semantics
* E4 T, D' |& p0 F4 ~2 y2 T$ Z
) d- N' N6 h: H+ O
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},6 p2 {3 x( E$ `2 k$ t: f) \; D
0x01,  N) u$ ^  K% K/ c+ C* B
0x03, 0x000003e8},4 z0 ~8 I2 G+ P  k1 ^3 f+ q

  g$ {: ], e" N0 P, R; LPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
0 c& d, E3 ?7 p- }1 \1 \8 w9 M0x01,
# y) a5 D  L3 P0 l3 |8 }6 }0xf5, 0x0000015e}
% T/ k! @# Q- [# L
}) . T9 {8 f0 ^8 p' `3 w

! u! c) Q3 v- {$ W% E7 N( C- ^1 E8 x4 i/ W( i% }' N. p" a; k
REFF:
5 s: `3 m9 M4 S7 S7 i; x$ A' ?1.# m! f$ `: c  A8 V
ACPI Spec 3.0
( e8 Z: P: {$ b, a7 O% \% V2.7 u& {1 n! e7 j7 m3 q
Intel Processor vendor-Specific ACPI
, h9 U  G% E$ I. U5 A
: \8 Q2 a/ S7 U+ t& D( _7 y! O* @6 _& v* T: E
That’s all!/ ^; B8 K, z  J( |4 Q

( R$ O$ `2 z, DPeter
( q" h5 \, b! r/ ~5 w
8 u3 R: n) `7 q1 X; P2010/9/20
; l' o( T; O- v4 i- J6 s6 U8 ]2 F
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
( u$ p' b  |5 V7 _
& o  u7 z! `: Z0 ICPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST: W, }  ]6 L* Y: Q* M
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。6 \5 g& P5 `7 ?) r: u2 o' O5 Z9 C

; E: i4 h  Y2 F' E2. P-state Control
, a' a: z" R7 S4 N: n7 p2 x8 C + P% o3 e$ R# D3 U
1)
' S1 o$ @. N+ R* [  j; P$ X# \Detect & Enable P-state
- Z6 B; L: c$ N: w- P
/ T8 `3 U0 _1 m2 \3 d2 hBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state' N8 M1 E0 k8 N" z0 J

! C& O0 ?) ^# `; ~. J2)% ~& s9 o5 H- s1 x& A
Supported P-states
1 r- g- ^$ Z* L& X " i+ B: B7 J; ]
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
( U$ d" K$ `! P! J1 \% W
! _9 O1 z* g( F9 ]- X8 VMinRatio = PLATFORM_INFO9 X) R. T& V& s5 U
MaxRatio = PLATFORM_INFO
/ P# i! n& a8 I( B1 G; q7 CRatioStepSize = 0x016 Q6 a5 v- W1 Q7 a5 l
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
7 c6 x7 s" L8 q5 M' N2 i8 o
; }% s" P5 z* H' r; i* `) o! l' C! WIf(NumStates > 0x10)* f6 _/ ]$ G7 Z1 R
{0 C/ T, Z% M& A, p/ p2 a/ s% a; w' V
RatioStepSize += 18 f8 Z: ?$ C" ~. M- l+ b+ z- }$ ~0 T
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1! P% Q+ X! o0 J0 u% `' A
}
1 o& g6 Y9 v8 p4 g2 p & A& y6 V+ L% {: L/ ^# i2 \
3)
, f9 U1 O: a$ P( B0 Y' p8 {1 h$ y" _Turbo Mode
) O" s* s1 F$ U4 V- p& a- V/ E 4 U& y# i- D7 ~7 v; \9 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; A; Q2 b& {) b

3 [7 W2 k$ M# H& S6 F4)
0 o! I. }0 I8 pOver Clock$ ~' o) Y. A( }4 u
* N) e$ j/ _- R( F- o# J  L( N
某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
) _$ p" m- t) d" m 1 u$ P0 s% q6 E6 h- {  v
5)6 W. Y: H/ u5 R. |5 k1 |! j) F' u
ACPI Structure For P-state1 R( b9 Q% |/ l- X4 ]8 z
- K# c- o; B' \" e2 `5 D+ r: @
l& F# z1 J+ O& R! q
_OSC & _PDC
3 N7 [+ d' U6 V3 t: U6 [ ; n+ j/ N6 ?9 s4 F& P4 ^! A" p; v
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures- t0 ~; C' x1 u/ Y

1 w- Z9 r" r$ @" s# M' \l
# U0 s% h9 p- x7 r' B! A2 k
_PSS& ?/ |" y0 \8 C9 N: w
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量; V9 e% n$ O& u
并且通过一个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做比较
/ X6 _8 ^) a- p: Q+ g# J以确定P-state切换是否已经完成。& W0 [# [0 m4 `3 D& l

( I* F; [' V* K; o& @Name (_PSS, Package() 8 q) @, `9 }7 H' r/ `& z: Z
{0 @6 P  a  D: g5 W, p1 c2 C
// Field Name
6 e$ G) e/ I  s8 {2 i" D, nField Type
: n: L/ \9 F8 k' u6 |# ~) P8 i. {" Q) \0 p

1 A1 D9 Y6 Q& N! y! N) f7 ]$ {/ G8 l3 t; n
Package ()
! t! {6 j4 I5 t, g! q9 `1 ?// Performance State 0 Definition – P0
( }! O# D( H& h5 d! A- S/ L" L$ Y7 p- @8 S- V* [: [
{( Y9 u" A/ h/ p8 F& z

1 ?4 m. d2 B: E( F4 S) U; M/ j+ F6 m( x8 A7 h8 N
CoreFreq,
% I' o8 o, C3 k  o8 Q// DWordConst 5 {; l3 X0 L* i% S9 ~3 s7 o2 ^0 e

3 E1 @' X7 u$ t" |7 z5 p
( B  X" t, w/ \5 Q2 \, n7 g' C6 [) f9 OPower,- v% J' G# [# |
// DWordConst 8 d. s" X$ a) r; t% n2 a
3 J) n, s" T& i
TransitionLatency,: a4 @1 O' ~0 |4 L1 ]: m/ z. B
// DWordConst : y/ j% w7 ?: V+ r
; V9 I3 u1 G2 `- J7 A3 f  u
BusMasterLatency,  Y5 O9 Q  ^& R0 I$ s5 M5 ^
// DWordConst
$ j1 n+ m( P+ Z* F/ b3 ^* Q8 V, |7 |% `# X
Control,
5 T( j3 J: F- d( p8 v// DWordConst : h" f' e2 s' Q2 i8 u$ o  L

4 F2 I6 ^3 U) }4 U: |. p& w! I, `Status
9 V1 ]' @0 \8 s1 b# Q& {! a! O9 d9 \/ K* T/ D% }, e
// DWordConst
# m% I" [( C2 k! C0 ^- {& b6 c6 A8 ~
},   a' E% Z, C1 F8 r. p9 \

" D2 y9 C# f. }: \. 7 p5 j, H1 [0 T6 h5 U
. p/ [( @" e1 l, i
.
9 M" A5 f/ e& |% J/ D5 Z
( L' L) \" }, f1 x$ i. + b, w- f! A! l
}) // End of _PSS object* ~: P; J" P* f, c0 k& b
前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 ) Z- K5 T6 @! i. P" W/ T+ m
1 e7 q; o/ [# N- V$ P5 y
Name (_PSS, Package() : @' h4 r& `0 `' L& s; n4 F$ k2 S8 H

% F: j, [, b/ K2 E0 p% q{
' j) H3 U5 B% Y5 J/ n" b2 F- E
& j6 r- e$ ~" G( UPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
' W' f* _4 i% @1 z( ~% X) q2 y8 z" }1 E% N! n$ i% a( o
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
7 j& ]9 y! E6 ^2 X- K9 C9 h; d
% z) g/ {, H9 W* b  hPackage(){1400, 8200,# ]( a. V" O/ N$ x
10, 10, 0x000E, 0x000E}
" ?$ j* p/ m) e6 D5 D' I# N, K// Performance State two (P2)) U* {( b1 h/ z/ w  r0 _, M
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, // ! @& ^* }7 E5 G+ ~8 s- x/ a
Performance State one (P3) . K) ?' h( y5 D8 `* l
# T* N- s6 P8 Y& t; f2 L! V+ }
Package(){1200, 8200,9 O4 r  R0 n# B' J# v& U, R
10, 10, 0x000C, 0x000C}3 u9 u3 ?  |7 G' K: q4 n
// Performance State two (P4)
& O6 Q  h) _) J/ {7 d) P* m' {) g# }) e$ T0 B( m6 A
}) // End of _PSS object9 W: w4 K- I6 }9 ]
2 N2 j7 \; S8 ?. {; r4 Y
另外当该平台支持Turbo Mode P0将会reportTurbo Mode- O3 d1 q! A. D, b+ i) [

: V& B, u# r1 A/ |! Yl2 u4 T( v/ S" R, S, Y7 U
_PCT6 Q2 R; d# E! Y" [" w1 ?4 ~2 \
; c/ Y: U8 V" I3 d% m
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的方式来进行。
& e5 L2 O9 V- h7 w+ d
8 e7 L9 S$ ~0 ^0 F2 sName(_PCT, Package ()
( e. ]  Z& p+ @  T  R3 [7 j0 h8 J// Performance Control object + \$ o0 W. z, d( x& V9 \; T4 k
' C" F) `" Y# C
{ ' ?) q4 d% [  w/ z) V& C& Q. R1 }

; N$ m1 v$ M$ w2 D9 |ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
2 d8 I6 j  I3 ?) _// PERF_CTRL + N5 D; {- T0 J. z1 g2 _
4 O( z/ A/ g/ R7 z4 T5 e
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}3 Y' ]& `4 P; k. `, @: R5 ^" O. n, Y
// PERF_STATUS 7 v( d4 |6 d8 e, z2 L) `

7 ^( c! r, f8 D+ H. x* D}) // End of _PCT object
& @8 }- @% i6 i: g9 ` 8 k- T4 c4 i7 c" R% e( \6 ^
l
7 S" R2 p4 q3 r" W* T
_PPC) X8 {- v5 X0 m. ^/ B- l* f/ m- S2 F
) o. |8 L, K  h2 N  T" }. Y- r
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$ \' u+ ^3 L& W+ o

6 _% i: _. H$ NMethod (_PPC, 0)' _* H5 P* ^' v0 ~2 _4 p" S
// Performance Present Capabilities method
* z$ I! J6 y$ q: `6 Z4 u$ r
, P" F# p; j/ {5 y0 a3 @1 |8 Y{ 2 R$ f1 V, _1 n! q- V' F+ ~
, V$ B: Y& Z3 {0 Y" n' X* \6 z2 a
If (\_SB.DOCK) # J- b1 L) _* ~( g! ]* L1 z- B- }

5 J- [7 `% t! W9 i# E) Z{
- m* ^! X6 k- m7 j& Y3 w6 c' B5 N3 ?& B8 N
Return(0) // All _PSS states available
7 }2 \7 l3 A- j5 k' n  y5 U$ L' O: `# I7 \2 y, [  @
4 `1 K* m  |5 b2 u! [0 k
}
8 o: h. s' x8 o) N" z: Y; t' l$ G; y( I- v/ [7 s0 L
If (\_SB.AC)
) q1 d$ W" w" p8 m- V
# ^. C/ y& d6 t, `{
6 h4 u% E0 w6 J$ H' s
/ E0 y3 F( I, m% W2 _6 f6 d. AReturn(1)
2 a, z$ t) \! M* y7 c- q3 D4 Z' [( f// States 1 and 2 available - k, r6 T0 W/ I# a8 p

0 @) v2 \2 @7 F, f, j  w} ! V- M5 h7 t) |5 A- d
" o& Z0 D( Z6 O0 b
Else
) K2 L% a8 c3 ]  K' D
% T( q1 t( I6 `{ $ j+ K' V# @6 [( z# I; H" A3 F

- f% I5 X! g; Z" qReturn(2)
' O. Q. a) B4 o/ O) U  N( ?* l// State 2 available, V4 ~& C& w& {7 U- k! s1 d
7 c6 g( k/ F- [# I9 r! l, ?7 X
}
) t  {" s% D" z8 H4 ?: `6 Y! \& @( y" U* W, k1 H
} // End of _PPC method; P: ?; C) M6 p6 J$ H
, d0 g& l  u' a# ~3 r! |
l8 [7 O6 H' O% V2 p' _' f! `, E
_PSD4 U" P! J# C) l/ D4 q* x& I

8 i1 |5 [0 y( g- y4 a2 sP-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。
* J6 ^2 W2 C8 R8 r
) J+ L1 Z2 S2 p7 {REFF:
# Y, H2 n) N: f) Y: U1.- A6 Y, C+ D5 M6 d1 s5 I
ACPI Spec 3.0- z* o6 F, `9 G
2.9 g6 j( h- w# k  X& Z' I7 w
Intel Processor vendor-Specific ACPI
8 a9 r4 ~9 }) r& O6 e
% E* _) R/ [* {4 z8 C; C
; ^2 H5 k' ~- O3 n: fThat’s all!
; Q7 z8 }2 o$ `: A! k- b5 K" g
; D3 [9 W+ k; I) b, Q5 t; aPeter
/ t: G/ L  n" V9 R# k2 W # t% n8 [: v' }8 e& ^
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview1 R; D0 P9 r2 I; ^8 T& g

) j4 F6 C8 ~# t' \1 pCPUC0状态下有两种手段降低功耗的方法,其一是之前介绍过的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工作时间的占空比)的方式2 u5 G# s, _% x1 C: X- @
,影响系统的功耗和温度。
5 y. V2 F( [: U . m# |: h% k* d  g- E
2. T-state Control6 p2 V1 Y. i/ R& ]9 z. ?

3 R! Q0 A, X! I$ l1)
3 f. |1 z: @4 l. S) I# [MSR Based Control8 O* b" _  ~) I* U2 d" M* a9 b+ g
+ D% i' |2 `9 q6 Y0 N- `
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 9 C3 l+ O' W# V# a

9 [8 H& \- y1 L. V( s2)
, p- }7 c9 C; v5 {# j& WI/O Based Control) J3 b% a- Q$ |) j# \. l8 {

7 T" u+ a. T& P6 Z除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。7 B- }. T6 L- X  ^6 k

  i# W6 s; V+ B$ B' @8 }0 ^& }3)
  R# |: _8 @, V( o- LACPI Structure For P-state
9 [2 c5 `0 ^; B6 x0 \% Rl
2 Q" l. y8 w* m; g. J
_PTC
, {8 s( C0 g* M; H- `* | $ p* l. G, n' }; S
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:* p& Y6 H# S" q1 C8 |' [' O  I

7 Y+ R+ {& B$ G! J( ], @Name (_PTC, Package() * C6 s( I( v( n5 p
{
! s2 C9 J% N) X9 t7 J* d7 ?" b/ e
ResourceTemplate(){Throttling_Control_Register},
4 W4 C' E5 d" A% U+ ?5 |2 m$ d2 `//Generic Register Descriptor
- O5 b- f2 F  D: i* s2 M% @6 d  V2 V1 p" \& F- [
ResourceTemplate(){Throttling_Status_Register}& p7 S- f9 u1 Z: D
//Generic Register Descriptor $ a0 v: ?" l3 e3 F$ n3 M# i
}) // End of _PTC" S  p( k( j% \

4 n' L( Q6 g. r7 p% p3 f下述是一个sample code
' }. H3 q1 G. i! t" p7 Z# L
0 D+ r' k; e+ h
& g% u+ Z! }1 `5 D- d- J+ {5 S
//
# {" b! j; R2 H3 x
# d. f5 d1 E; }; N* ^// T-State Control/Status interface
" `- d# s* b2 y& M
- E9 b. Q2 h! z& w% Y- h  i- ^//7 R6 d8 R# m; h$ \7 \

* Y/ E, o" d; D  h- uMethod(_PTC, 0)
; r! ~( n4 Y, J. O. m/ k! s% {% j2 Y
{/ v! B/ ~# d- \* S$ ~- H
3 @( l! @& F# D4 U
//% T/ k8 Q7 G. w( S. Y  f( H- _5 ^/ y
; l/ N+ p/ E! q* |0 u! E: |
// IF OSPM is capable of direct access to MSR
3 T& _$ Q9 p8 i# y8 k1 j1 g2 W) W, o3 D6 p
//& b' J% H. Q% F7 _0 @; M
Report MSR interface3 ]7 ?: F) j1 H4 P3 _

. g6 K, s8 N/ L8 Y4 T8 j# Q8 W// ELSE9 ?: T; \3 l2 y% Y8 T0 `2 n4 H& i

- L7 x# N4 f& z: G7 i+ a% _. j! a//
: R( g5 S$ O, iReport I/O interface# c- U, z5 j1 S7 w

5 c, d- X( b% J7 K, j" [5 g//
) \. M; N: B- X* [
0 o2 {; m" r5 F6 w$ t$ |$ K( q6 }8 [4 E//
1 Q8 V. z( r' _# o# KPDCx[2] = OSPM is capable of direct access to On
4 Y* s/ s7 Z  X8 Y) ~2 z0 q: d) r- k7 T! ^) o
//
7 ^8 C6 U+ c0 p$ r! G4 kDemand throttling MSR
, o% H' K, U1 z- m- p4 x7 R) r/ c) t! j/ a& D/ `/ ~
//! F0 z/ @/ s) H
- V. F, L; x$ V* K. P- f
If(And(PDC0, 0x0004)) {
6 p9 y5 M( S7 p1 A* v4 I0 H1 `$ T1 D; n: [  x+ c3 c6 k' O8 x# N5 [
Return(Package() {
0 r2 m# G  A. o$ W4 Z, }1 L3 L
# L) {, [0 I1 p$ }- a8 UResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
9 i' b" `" o3 [7 D/ P- A4 n6 t' \+ Q4 q: P2 h# l4 }( h+ k
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
5 j. |( p& O/ b3 G
3 I6 x" q' `. F5 P})  |+ V& I% c+ [* P- \

- L5 ?5 y3 p- t4 X' z  `* z# m! V}
% ^6 p% s  T: {/ N. j0 u0 |1 t: ~9 o6 k- O
Return(Package() {
( k) w9 y* }& S1 ?! ?0 \$ h! d* C5 [0 P8 S3 O- M
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},$ _' R& g7 C1 r$ L- B/ j: l

" V0 b. b9 l- c' v0 p- p7 q& }& r! @ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}' o! E1 M) S+ T" A' T$ Q

9 ]5 E, U, L1 Y6 R' v' O})  x7 X; _& P# d9 N- X) G

  h+ w" Q/ t3 C; c2 P6 M}
' `+ E5 W! D' q8 P$ @5 J- I1 @
4 Z( Z: J  i3 m6 B2 K
) \2 j( {9 m& p
, c& s6 q: R# f: U6 [; Ol
; }  F% i5 n+ h2 I2 _  v' [& P! e
_TSS
8 T' U% ?. u- W# p
, N8 l3 W( Y' w$ l- X+ m5 vThrottling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
) m2 T. r5 T! [6 ]" dName (_TSS, Package()
, `4 m. h5 K2 R& h. N$ d6 B- d{
1 [& x# Y. N1 v' ~2 ^6 j// Field Name2 z& K- [, |& i' a! F3 u
Field Type 0 x  }* V; P' f7 B

6 k1 I0 \  F4 k0 J8 b
1 T; k1 H5 S  p" @; `8 s3 d& ?" {+ p6 a5 h" P4 u9 |
Package ()
4 U# |8 F- [' p; y3 b' h% X// Throttle State 0 Definition – T0 " a4 \, R  \! |; K- n* r
# |/ Q* q9 t0 D1 @# o% g+ x
{4 ?. B- m5 Y; E1 \

1 Q7 f1 k9 h% J+ A9 v5 u* Y6 Q% G  U  |- @# K" J1 M3 H
FreqPercentageOfMaximum,
2 p" @! P7 H/ g& I* z3 @// DWordConst
; P* V1 y/ V; O) T, \6 E$ @3 i; o+ }" C( h: b
Power,
8 P& ~5 ~6 t1 C/ [. X' L: L// DWordConst
2 v  ?+ l% S9 ]/ C; {
7 ?; p3 o/ w. x" I2 B& iTransitionLatency,
% ~; O8 t* [; k$ ]! f// DWordConst
" U* {" I  u% A: W
" F$ r5 P) m7 Z8 k  q! `Control,( s( `7 w0 i, T# t' _. \
// DWordConst
& s  u' Z4 I$ w3 z; Y3 g: U7 Q, E0 ]; [+ `/ C- L9 v
Status
. ]$ z. O+ ]* f2 v+ e7 a// DWordConst
7 E' d' |# Z' ?7 z' B! p- z- P- i% U},
. e7 G: {. V9 K3 `2 e……
5 y" K# {3 U/ y& }7 a5 y5 F8 _}
1 s# ?: y1 q8 P. z" ?6 }4 m+ k  {" {' |" D. u7 O% g
Example code 如下所示:
1 y; ?* a7 W2 v9 N/ z( y* ?* X
7 k' C9 F) U% X7 g5 \/ h, RMethod(_TSS, 0)
( O" }; N/ \; g- v$ d) I
9 k; E0 M  Y9 t8 u) ~7 u{4 q1 L6 D3 o5 t" v3 ?
6 D* U9 D5 ?; F4 @: p: \
Package(){100, 1000, 0, 0x00, 0},
0 U( M$ w7 w4 ]% U$ r- J7 D4 C2 ~) s1 \% T2 R; y
Package(){ 88,
, P! T1 p+ S6 n9 D4 ~% e$ r% }875, 0, 0x1E, 0},
0 e* r2 H  u+ k$ w
7 V% ~" |+ [) U& Z6 h* X; f( \8 MPackage(){ 75,
$ L. S: G0 }: v7 a, Q# l+ \750, 0, 0x1C, 0},
9 u6 r4 x, j( V- H. w: c& L' w" U( q1 X! H
Package(){ 63,
# i% ?2 I1 h  K" c625, 0, 0x1A, 0},
5 A- V9 l: y  z3 M& o- N  }5 ~/ x7 E* T! p" D) w5 f/ M2 z
Package(){ 50,
" z- W6 }1 {) l500, 0, 0x18, 0},
- a1 f+ b: `7 O
7 p# b; ]1 f: C8 J/ M2 {Package(){ 38,' p6 [/ p' i. u3 \# v
375, 0, 0x16, 0},
: A. k& O3 U& L9 h8 ]4 i- T' U
! I1 y4 r" u  ~% H- zPackage(){ 25,8 m( K- ?# ?+ y; a
250, 0, 0x14, 0},& m, y) o5 b- z

" Z- T8 S3 G# T, Y5 OPackage(){ 13,7 U, u2 l: |) p
125, 0, 0x12, 0}. L5 B7 k( l2 ?  F9 ~1 h6 v$ i

$ j7 I4 P+ R% p# W7 m9 p}, u/ Z- ~% G0 o9 i

1 v% c/ s$ d$ \/ r  O/ _/ a1 L6 u; H$ u, w5 a4 S- \
l  A4 N% V9 }5 ?4 u
_TPC
/ A0 J$ f/ F! Q0 d+ n: N8 ^: ~2 [9 G
/ N9 U3 R% j! j2 U9 mThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
  a2 h2 A% B) b+ ?( n9 \
$ q7 p7 }4 R7 ?4 y1 ]7 z- K) ?l- ~" R" X+ b5 Z: _: I
_TSD
1 A4 f- t- G  T2 j8 @ * y, c! K' v, Z- d: n1 [* e( W
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code9 Z# e8 D* M1 b9 z
3 D# O; E0 [6 x* ], D' o
Name (_TSD, Package() / b( Y( Q4 f6 ^% ~! ^% D$ ^
+ p5 \0 f4 P, X9 F5 o  f
{
, s- Y* h1 V8 b+ |& x) L5 o. D( m# z7 T" P% X( s
Package(){5, 0, 0, 0xFD, 2}  V, e( ~2 J* p
// 5 entries, Revision 0, Domain 0, OSPM
! X6 d5 Z4 ]6 ZCoordinate, 2 Procs
+ e/ I+ d7 B0 c/ E( C
- P1 {; `& n) d2 t, z/ v2 e
5 f& g1 _( D9 k2 X4 B}) // End of _TSD object
3 n" k- r; }0 m& R- S" e7 Q4 Q; N
9 L9 L" m+ w' U- j: iREFF:
7 M9 Y. {. j- F$ {  l0 Z9 e" E5 N1.% c" g8 ~0 V/ i2 D# f
ACPI Spec 3.0
; K8 ~! E; I& k+ y; u  `2.- P- [+ o8 t0 _( t4 u+ l! }, o
Intel Processor vendor-Specific ACPI' R% j3 Z8 L- E

" ]9 F% x  b/ S& M* A; a, Z
0 k- u( f7 |. R% H  MThat’s all!
# }7 |* w9 j. q# R+ D
4 C" ?9 ~; C5 w. I3 ?8 qPeter3 z7 t2 n6 N. S1 [& M; k

# M1 Z7 c" R4 T" @2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 15:51 , Processed in 0.029453 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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