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

CPU Power States

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

0 Q8 E0 r, Y& E0 S4 |1. Overview
8 H4 Z7 q5 ~9 o( O- R. e( B" U( U) b1 v" o
& j/ Z* v: b, w: e1 K$ \8 `8 h
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换
5 S4 Z! c! \$ J' N降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看
( X% t) x# v. m0 k比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
0 U& f: Z1 `8 N& Q& o
& k& \% z2 |- @# t* T2 h
cstate1.jpg

' {5 T0 X# Y# m
1
& ?" k" w) a% ~9 L' v8 E; u' I
2. C-state Control2 [5 R( R; l- P* y

; q! k- g' }$ g) p1)
) `1 B  H/ v! X5 pDetect & Enable C-state
+ M  ?+ o, t9 w+ @# S
$ b8 N$ ~$ R" x( l' TBIOS可以通过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的支持。- x: O7 H- M$ w1 d/ Y7 J

2 X/ _2 A* x4 p  q2)0 a6 q  }  t: Q/ U' }
C-state Basic Configuration
* d" X, j; @. C7 R( j通常情况下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)。3 z: O" }$ X+ t/ e! R
! e/ W( a% e" l
3)
3 J" b+ E9 D1 Q2 QACPI Structure For C-state% b; e+ g9 S; m5 Y1 m7 K1 B4 p6 p

4 E3 }* a, W& \- x7 vl/ r- S+ L/ G3 ]% U9 r5 x5 r
_OSC & _PDC7 M4 ~/ D, n9 ~$ A/ H
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures$ \4 O" ]$ |; F) {+ P$ A" f& G" n* t
l5 z6 }! l# A( E# ]# p
_CST+ O; \. I) J5 G1 ]  N
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
4 |& C5 ^+ A- b  CCSTPackage : Package ( Count ,. K" @" Y2 m4 f; c; s" l- g
CState ,…,
( K( u8 y( w& D- v3 B9 p* yCState )2 H$ G) m) n) n! K
其中Count表示所支持的C-state的个数
4 K) c3 z2 h/ H+ MCState: Package ( Register ,. t6 ]! f0 u1 D+ Z# d! {; Q3 A$ ~; [
Type ,2 t) R' b1 ?  j. k  W" J; J
Latency ,
# S; [' T) o2 R2 E2 g: n' Z1 RPower )
3 s  h7 D* x7 E1 Y) h1 p( K2 w) V, c1 T0 u: k' ^3 ^- 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
7 @: u& ]3 Y- ]: }
3 `( q$ u, p. h9 ~Name(_CST, Package()
' P. ~% y* f2 Y$ G1 Q

8 P) G; r2 v' a" C- l1 X  @0 a1 R{ ( i/ e) G4 }) M: Z
4,
1 z7 j6 Z2 O3 \$ V3 e' A// There are four C-states defined here with three semantics

4 j0 @2 s2 h( g! m3 F
/ y8 ]1 X5 o/ d( m. z( `) _// The third and fourth C-states defined have the same C3 entry semantics
, M" u% V8 j) w7 Z

+ X0 G$ z4 }1 v1 |( x9 B* K/ JPackage(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},- K1 s8 O% W+ M6 H. k
1,/ y9 B& I- X9 j  P# p" |1 g* l5 S
20, 1000},
. m; T9 b+ ^7 A  [* n8 ]+ P* X
! G7 }& {5 a8 m  J+ t2 }- h7 _$ n# Y
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,
! L7 H& H2 @9 {/ n40,
& w( d# P/ K( o4 w. B( P6 [% ^750},

' c; G# U6 S) s6 [7 E4 I/ J, ?/ jPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,
7 n: G  r9 u# n) Q- Z; z; F7 I60,
; S3 n! O) A. Z$ E( ^! v500},
) I3 C* d* z) ?# Y6 b& f9 \
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,/ B8 c' k( ~0 e/ l/ x$ V% V# Q$ L* C
250}
, I0 ~7 ^5 Z$ n$ \  E. s

# ?( m* Q1 K" d( ?}) % x: s; ?- e' g2 ]& m
6 q, w$ v3 N1 y7 o) o7 f1 P/ {
l
( r8 s2 U' g/ }
_CSD! j6 r3 ?" L; Q1 ?; f

, m1 `  [5 W2 a  N) [: E" b% ZC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。" Q- @: _" K8 E+ t8 @! ^
; x; F+ F* {2 G" D7 y
4 S6 b7 y+ C' i

" l9 q2 B8 P8 ?/ g
* f8 X& y/ U7 n  h2 N& H3. P_LVL VS FFH
" u' ]8 {; |+ l- @) \! f' A' Z7 M, N/ J8 Z% X
P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)
6 \  [8 P% x0 G0 a3 x  XFFH全称是Function Fixed Hardware,它是Intel特有的用于CPU power states之间进行切换的一个interface. ACPI中的GAS被用于传递FFH的信息给OSPM,它有一个特定的Address_Space_ID(0x7F),这种GAS主要被用在_PCT _CST这样的ACPI Structure中。GAS_CST中的格式如下图2所示:! c! [7 y9 v; k$ @& c  j
. n/ m1 e' l3 x& l/ j3 e6 z
gas2.jpg

8 ^3 p* s1 o& @% ~! `0 T7 R$ N
2

* v& W- O" G! _3 I! cOSPM解析到该_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 d8 [& a1 {, ?) kName(_CST, Package(), h# w4 Q3 P) |5 P; y' C0 M) b
( F3 k4 X1 f3 {8 Y
{
1 K) o4 `) T% o* ?0 j. x7 S1 E2,  }8 W5 T3 A/ A
// There are four C-states defined here with three semantics

& O9 ?& U3 X7 E. `) ]4 I/ k6 `! n, H
0 F' a. z  L* Y// The third and fourth C-states defined have the same C3 entry semantics- E8 r  B; E2 q; z

  M3 O2 f/ [( Z" d5 a8 R- ?) UPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
1 H) u& v- u, x7 S. T4 s3 a" C0x01,
7 ~6 [7 M; }: m' Y8 _0x03, 0x000003e8},
1 h; B" T5 |6 i3 \4 d
' E# s5 z% ~: _- e( M
Package(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},- Y3 O* s( L) ^2 j1 X
0x01,
- e+ O* ^/ A/ E/ ^  c5 v0xf5, 0x0000015e}
# W8 `9 j7 q& s  @
})
6 y5 X* E0 a" F9 _5 P5 I! z7 _' _1 G* I+ _2 g! l* Y* B

( }0 B  L; C6 A' ZREFF:( l, D9 W" r9 ^8 J  m5 _
1.0 N" j- l" s+ R0 Q7 U+ r8 g
ACPI Spec 3.02 i1 z/ @; J3 g+ g. T& I4 t
2.7 }( o& k! H3 j9 ^# |
Intel Processor vendor-Specific ACPI
0 k! e, @( c2 u0 j! l3 r: L- t* C0 ~7 J& y: h  k, g0 y( }+ V

7 t1 |& E4 h: K7 h' cThat’s all!
/ e" J% W! Z' ]! `
3 W/ B; ?! y" A' I3 V: E2 wPeter
" E+ k& ~& _8 {# c) b- w7 T$ a) U. b. v: ^2 Q- q1 ]% h# s
2010/9/20
) ]9 d9 I8 ^$ A0 J
. G+ Q# O+ A4 K[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview( H: u2 N& U. U0 ?6 [7 b% A

3 N/ ?! N8 N& o4 NCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST
) `0 o" x; |% s: D+ k, tEnhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
4 W4 A) u- w# @2 ^, a4 u; u; P
7 v( @' \' i* f2. P-state Control4 a. `0 A: g- G3 o- A7 l6 N
+ L- i' ]! Y4 n/ E, K
1)
3 J) I1 I# b& JDetect & Enable P-state
7 v& E1 A9 a  X8 B; u+ L+ X9 s* i
5 D+ ~: ?# {. G: zBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state9 `; {! W% d* L' `+ o; _
8 P. Y6 S7 \: M5 ^# B1 A5 |# y
2)
1 k: H% a" ?7 GSupported P-states& |+ k2 s7 E" p( c

; B: q$ i6 S, P4 L+ i- {3 E6 {' PBIOS 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/ I1 _0 W% }; Q6 L/ A

( t* U" f* |5 C" N. [MinRatio = PLATFORM_INFO
/ [8 s9 n. |: S0 h1 DMaxRatio = PLATFORM_INFO: h/ K% ~/ [7 ~& B+ S
RatioStepSize = 0x01) B; @# [% T; L
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
: F$ ^# j2 o, Q' |# p3 Y7 I 5 }7 p: \+ `/ u3 C' q# y" o
If(NumStates > 0x10)& _# Y! z* f) w
{% M; z5 l0 |" U8 h! d) {  X
RatioStepSize += 1
- r$ r7 w$ o" l5 \6 Z4 u1 _NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
1 j+ |& K, [2 a' M; q2 q7 q& n}
% F9 N0 o$ e  }5 f- d
7 C0 P9 _2 J. y, [9 `8 h3)
$ g7 }' `5 \4 T! TTurbo Mode5 R2 G) j$ ~! \1 C; b/ L: k

/ e( T& x' g$ u+ k. KTurbo 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+ J+ H9 J- G# E* E  ` + b- S. |: H! T7 h
4)
7 O( Y+ H- g6 C. q; [, Q( t$ mOver Clock
6 J2 j# Z3 ?( G! d; ?2 m8 Y' T
* r, Y5 B0 a8 y4 Y某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。6 ?* H2 r: h' x1 s( i

7 b9 c. b& [  ^6 Q( \5)% T) P6 @5 c( o' `6 Y5 [8 S
ACPI Structure For P-state" Q0 x7 [# Q# a- D
$ x- _% s2 H/ q/ s- N# G, j# t
l
# l/ J, S1 a& U
_OSC & _PDC
+ d, l0 _" d: c# Q) g
5 o' W" k& N. B/ i_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures7 M& v8 p4 h& T
1 T- h4 G: O2 {: d
l4 T# e7 @% A  t# Z  E$ B* N/ c, N1 P
_PSS
$ X5 A* [' e8 C7 \1 kPerformance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量0 [6 v) V# u0 P: e1 q
并且通过一个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做比较$ Q! \% v5 t3 ^; l  Q) A$ e! A$ y
以确定P-state切换是否已经完成。
6 F/ [8 R" l- g, d2 k- A3 a. r$ J ! {. ?  D, R/ j5 R- y
Name (_PSS, Package() 7 y7 L, P( r! k2 L4 r
{
9 I9 q/ U1 d! I8 @' c. K0 s1 V// Field Name2 \% G) n5 v! K
Field Type
9 ^  t0 v+ t  `) j$ k
; a+ j$ ^) W- a: D2 R9 L* p3 ~' t& o
" f1 l7 [7 X9 V& B9 I
Package ()) R$ ?: K  H5 Z- R  f6 x
// Performance State 0 Definition – P0 3 g- j! y, ?* H. m0 ^* j# i2 G  p

; y: m. J9 m& z* n8 ?& @{6 V0 F* q5 m% B9 B! d% k

- I) y) P8 v2 _& R6 v- f3 U
8 s" F1 X, c, lCoreFreq,
5 u2 u- r9 V2 K: c. R// DWordConst
: o" t. a. w) S6 D  v% D4 s
* r$ `1 N9 F2 e( p
1 v, b* W0 ~5 j% c& QPower,! q5 k) M( Z; v( B
// DWordConst . G9 ?8 R) {" k  V2 U" V# R$ L2 J
* }% J( F& |7 T) F
TransitionLatency,) J6 `8 {: {7 c* G% |5 B; W
// DWordConst ; D" ?; g3 G, k) z& d, j: @, |

9 i9 A, Y7 \* j6 P# SBusMasterLatency,' ?1 X( V5 g4 N4 E+ X" {( B7 [6 t
// DWordConst " l  D" y: L* D3 E4 K# a/ m

" a5 W0 Q) Z7 A5 p5 c$ M1 mControl,; @0 ~* y( \  N' Q& h, s
// DWordConst ; l. ]6 t& r8 B* @7 P/ e" n/ f  C

; Q" j% O% B- p7 z% }, d# ~3 bStatus" e1 V' p% ~! W* A

" e9 j  p; s& }! {& z// DWordConst
! ^2 F; s+ W* o& f) K1 m4 s/ M" K9 c6 s( k" _
}, ' g; f9 G9 i, C+ i5 C" _

; e4 v& K) H4 H+ v/ F. * l0 a3 L& F1 ]; b5 |
6 j1 E; ~- C- U! V3 I
.
) }+ I2 l8 |7 ~# @
. Y- D9 a2 g# C* L- G.
  _" X$ ~/ k, g+ T# G. U}) // End of _PSS object
$ v3 R* _8 v; h' x& T. i前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 / S  B2 o& o% R5 T. C% {" P8 E

( F- D0 {% H: H4 z6 |7 F; c% M8 x  _Name (_PSS, Package()
5 F6 O. D( h1 B. l& ]
$ {6 U) n  y) b! R+ Y{
& T. E+ @3 R0 G8 X
# `0 [' l9 \( i9 h* G* }8 L. YPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) 4 l+ b4 D' A- x" ?

& N" `3 R% E2 _# Y* Y2 R" O( IPackage(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
( I4 e/ Z1 h5 s# i  T
2 V) e( A! j/ Z: D0 ^Package(){1400, 8200,
7 p, I0 v9 d" V! }10, 10, 0x000E, 0x000E}
1 N' Z& m, p# z$ ]* l5 t// Performance State two (P2)9 v& j8 T3 I! O
Package(){1300, 14900, 10, 10, 0x000D, 0x000D}, //
0 s1 @1 n& i, ]2 b; `) _- cPerformance State one (P3)
2 D" k+ y2 R) ~5 H$ I
' r' {! l7 g0 e; ?$ {( ?9 g, RPackage(){1200, 8200,9 \$ K; ?7 D3 f' t
10, 10, 0x000C, 0x000C}9 \; h& g% j; a- m
// Performance State two (P4)
5 s/ \0 s/ k$ y# {/ E! `+ J0 F
- F7 S( C. S; F( I, e+ ]3 L4 D}) // End of _PSS object& _* P1 L5 r# y

1 W5 N6 E; q" F1 p+ {- g另外当该平台支持Turbo Mode P0将会reportTurbo Mode
- {6 F) D4 S- N' Z
2 M( m+ r* q& {, K9 e* q* [l
2 `2 {: k- {, t4 O4 y2 r/ A
_PCT! m& q9 T6 s& A) @; e
. I# a, \$ o; z* s4 v0 v  r
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 v3 N& r) F% {
) e+ @9 Z, \8 |Name(_PCT, Package ()
% {! N; B( Q+ {1 e( p% R) p// Performance Control object
& U2 g' b, M9 l; v, ?1 Q# q* w+ K. H8 G# D" b# A+ R4 P
{ 0 Q5 e0 ]1 [8 [& z2 {3 y( c% Z7 G

# E# O+ \% N' ^  A' z0 F# sResourceTemplate(){Register(FFixedHW, 0, 0, 0)},' P7 K- `# g' t
// PERF_CTRL . j3 L1 B& |( n  X+ J9 \3 Q

# X- m# ]) s( @" u* G% {( YResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
7 B$ O5 L" U; U: @/ I/ u// PERF_STATUS
! Z' O4 i4 j' C9 Z: F0 u& i; ]( b) L
}) // End of _PCT object
  n' O3 X' {' ]8 h
7 S, m8 Z( ^0 q) s! i( Q7 ml5 c' J: V7 i2 \7 ^9 W8 l0 h- }& d
_PPC& _& |5 z# V% g. \8 E1 m

' l6 b+ \: C; {0 b5 c# pPerformance 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/ {8 l9 o! {( l4 Y' f3 z+ ]2 p9 {

6 D. \7 V2 n+ W/ |Method (_PPC, 0)
$ N9 _) M- E9 Y& n. _// Performance Present Capabilities method + Q. s' ^, ~* L& V
' w7 K! S, X9 `
{
  J+ T, o. X+ s. c- x) I  x9 s
" o. }( t+ C9 c" a. j" x* M* IIf (\_SB.DOCK) $ U& p# T- k) b0 y1 ~
0 b" @; u+ D4 w/ Q7 @4 q
{
3 G0 e+ W) c4 m" A. o! g- X. s* e* g% K
Return(0) // All _PSS states available; p0 ]& j4 r' A4 T; C# \

& j1 G2 {$ A& X' m7 h2 U2 E7 R4 n9 m" P3 Q
} 3 j0 `  a- V  i% Y- {
! d! y1 y' W- C" B% J% Q7 O
If (\_SB.AC) 7 I8 M, ~! `3 x- Q6 w0 Z7 j

, X- g8 [5 K5 G' }{ 2 @$ t7 i: U* \/ m
, F8 l$ r0 O# g3 t8 o( K
Return(1)! X. V, q0 H) l2 M$ c
// States 1 and 2 available
2 w7 S1 q, _, E& _* j# F* y2 V, n) _1 I4 S& y! y
}
! D- F3 M+ d. y2 d. F5 U: r* q( {, M' h" y. O) @* C
Else
, w$ A" j: ]7 [8 F2 J9 Q# |& }5 o/ [* y4 {+ g
{
- a$ A$ Q9 \- ?  k/ R9 g$ t! N  |! I+ e% T2 D8 b
Return(2)
) z) J; [* e0 N" t$ n1 ~// State 2 available$ r0 b* @1 \. A# F6 j" t5 V7 `1 I
$ D; {- |5 b& u& |: k' x
}
9 U0 C4 n8 m# F- U& I3 i8 K4 j
0 m% k! y5 A: T4 y$ o} // End of _PPC method
% ?# ?6 l) X* B. D+ U9 _5 X* W 4 i; {, H, k$ w/ K. Z) {& \# q
l
1 z4 f$ N% z; U( R. T
_PSD) a+ R- [4 G9 {& M/ f
) n. f6 F+ O$ e  ^: p
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。/ U2 b0 R/ Y5 ~8 v. C" f

! `' [5 D; m. y% y7 z# J. i! EREFF:
+ N4 z5 z0 n5 K7 v) b1.
; x4 R# `) B  z. L3 eACPI Spec 3.0
; d, w6 d+ |* ]2.
4 k% e$ h' {% r9 L! s( D- z5 C4 {Intel Processor vendor-Specific ACPI
+ ?: R. r: d* r ) x) f% x! _/ G
% z5 N. j8 ?: e( o! C8 ~
That’s all!
% z, V/ M. c4 O' d/ w' e) {% b* r/ A # W# r5 i% X; I; L, ?& h) J
Peter5 C+ S5 m& A0 q

' t0 G( f8 s: n! K! R5 v) g! o2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview3 v# V4 E# v# E/ @2 R
) i$ e! w3 Z( z) H5 s8 R) [! F
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工作时间的占空比)的方式
# c& }8 b! r0 [6 \5 y,影响系统的功耗和温度。
, D  n; g, A6 P- w
' P8 @7 F% e1 A( A* r2. T-state Control9 G9 Z  c  R' u0 J
! N) \. u  s8 w9 C
1)+ G8 U; z3 l/ t% F
MSR Based Control: E) b! ]8 g' c, w: s
# C. B4 w- d+ b, N
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 + |* @( Q3 E6 u3 [) Y& A" d& b0 s7 S: L  n

: ~, h) w$ \% d3 ^$ }, g9 ]% U2)$ `, N/ {5 Q3 w4 X, q
I/O Based Control
1 j# K$ j7 _. t* E' n$ H
# N! ?8 ~/ n: O1 O# W& A8 [除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。- s. [0 Z- t- x% n0 E# X- L

% t4 U/ B1 J- W* e& p/ k( z3): e- y4 f& Y, _$ c9 p3 {) V
ACPI Structure For P-state
! d2 @" `4 g8 V* ll
1 M. S/ `6 i% a' a! t# E, e  S
_PTC
4 t+ G6 B/ I% T$ t$ L
1 p7 X2 m, X/ |Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
* x# w$ C) z! W
/ v) _0 x8 U% y( k5 d0 uName (_PTC, Package()
% Q  H4 A& M6 ?{
4 h7 r# g$ `+ c' O! z" k6 E3 M$ X8 N8 `
ResourceTemplate(){Throttling_Control_Register},
2 @( Z6 d( W. `" h; ?//Generic Register Descriptor 1 F( p9 q. k/ m$ `# D0 O- T& Q
( w; ?" U6 s* I% @
ResourceTemplate(){Throttling_Status_Register}* w1 d$ b! N$ ]; D" }, M, D4 H
//Generic Register Descriptor , B4 {4 `: T, @$ ^  b
}) // End of _PTC
, ?) y5 B9 {0 n1 o' V. D 3 d6 F% p5 ?; D( C8 v, V$ Z0 t
下述是一个sample code
( J0 l& E' f* s1 Z2 u& ]6 V 0 X3 o! E( v; T1 a: Z. c
! m% c- F0 `, B, v6 r% o/ }- b- H
//
0 t$ D* {) K2 }* C+ e+ @  m5 L3 D  l$ F' @+ _1 L  r2 A( o
// T-State Control/Status interface
$ H9 ?3 @# P. h5 D7 E7 a
) A$ C' [: ~3 i; D% p//
* ^8 \* Q( H  I2 G& K* w2 y* ^; m7 E5 S& G
Method(_PTC, 0)2 t8 j+ F1 A, C% S. [; p

- P8 S6 ]) f  j! l; X0 J{; {& ?2 a, w' B" \

5 L+ {. s/ L/ M: u" X/ h//
+ \6 [% E0 Q2 @0 D" A7 G; O5 p! n& F/ H: D, p: O4 ~9 @
// IF OSPM is capable of direct access to MSR
) H% I' _$ q: j+ Z/ W1 J' K
7 ^. c7 g% J6 E( H' f1 v. x2 h//4 H0 k9 |8 c. [0 A6 o- N
Report MSR interface
0 I  z1 L& O7 c9 o9 I+ y% c2 ^- u6 {3 o- Q7 ~
// ELSE
! _8 _6 Q/ ~; y7 t* L! ~1 C
1 L$ L/ l) M! s3 k+ J$ n- L0 Q//  }5 x% L" S/ h' a+ d( J" w
Report I/O interface
! i+ O# P8 [/ M) Q' j, r
  e& _5 ?3 p( U$ O//* }- w- z' v, |! N5 P
% b7 T  [1 \8 q2 r* Y/ b
//+ ~! I/ V+ `+ I4 D
PDCx[2] = OSPM is capable of direct access to On
- W, D0 c8 n' B
; `% T$ V2 C- Z//! m- q3 j( l  h  f
Demand throttling MSR
; f( O6 a8 n* E4 S% Y& }6 N4 x" n# h1 E
//
3 i* m/ G. C: w5 a* v! T3 |/ t8 E+ S0 ]0 ~- }/ l/ T$ K, X
If(And(PDC0, 0x0004)) {5 J# V3 [! Z8 m/ y

# m9 _: G$ O, D# t  ^4 [- ^2 P( nReturn(Package() {# j& g, ?1 L0 u7 l! u) e5 {
/ I* k" E) V$ Y) y' g9 S; G, J
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
  i& c5 |6 g# B5 R, H) }
5 b. |) Y6 y' D% RResourceTemplate(){Register(FFixedHW, 0, 0, 0)}
9 E% J% D' Z% i7 G; }: Y$ n% d
! Q7 y: [1 E$ {* K8 P})
, k; o) r, I5 ?# U
3 k4 m# P% N1 G1 ?& f" k}3 L! d: b6 x. g. T7 m* D6 S! @

! t! {8 y3 t1 Q: m- SReturn(Package() {& h  ?) s  E. }; K, S2 n2 C
+ ^7 L* w) N7 @& ~7 G
ResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},9 b" F. M2 e7 n/ k

  C& L, e' V4 R+ d* f- AResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}
- O1 Q, t# o4 D7 e2 d* I1 B$ ~: F" C7 x
})) N" p# T4 Q% |% [

% y2 Q7 Q5 W2 Y# a}4 L1 y8 i8 b. [$ \0 D' ~% ~6 F
5 H3 v1 `4 r1 a, C" J5 o3 d: a- [
8 x8 R9 g3 S. F5 n
) p5 a+ t$ E* g$ N
l. a* J. T4 I% U" v" |
_TSS: p0 `) y& O7 l2 J0 P' G
6 W1 d; Q: q7 _4 d
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:) N$ r9 O: t' I3 v1 Y6 F
Name (_TSS, Package()
6 s; }& |: k3 E& a/ L' o{9 S' R  E6 Y4 r9 U2 C# o" G2 U
// Field Name, ]. S' _5 L  z" j2 G
Field Type
% L  ~5 T" ]# W' g6 b# Q1 W6 A/ X5 z7 n( |/ x( u
, C4 U% a2 D7 |3 ]0 Q
* s, M7 w& T# z, I( h" [
Package ()6 R, D6 \# n  J) j" N1 c& {
// Throttle State 0 Definition – T0 / x* O, b% z) G1 }
/ K7 m3 g! L9 V' V# k, \
{. s; m$ c9 ]  u+ N" S; g. {
# ?. D( w( P) O
4 r" X' L- v. ]
FreqPercentageOfMaximum,
- b# N, {4 V" P9 r9 |" u: i) y) J// DWordConst 1 @3 z  i7 q9 \5 t+ Y2 ^
+ C/ `+ w& H2 C& R, B  d$ T
Power,8 F+ Z1 T: M& Q6 H- o3 p1 G
// DWordConst 5 W$ g" O% m0 [1 s' z

$ X8 A/ A( M4 ^5 B- P! eTransitionLatency,
) e" J: O5 r' k2 b+ G3 J// DWordConst
3 L0 L4 V" E; l$ p: W% R# A2 I7 t8 ~- A
Control,- U  I7 Y9 m7 [% X. b
// DWordConst ) B+ ]3 O) _# B8 |9 }

0 H; X; Q& R4 Y/ p/ e" B" FStatus
$ Q4 [6 N4 H# d9 s+ _: a- o// DWordConst
2 T2 O' m. V* _* U3 O& L! R% j},( s/ o: e9 Z: d' L( W& q4 a
……" d/ N9 U" ~) @+ }$ W2 E0 {- _
}( h9 H9 M1 J! {4 ~8 {$ T; j) c9 W

; P; Y- g* O8 a+ |' WExample code 如下所示:
2 o6 w4 L) X5 g4 ~9 p- s5 x9 n. n# i* s& V8 V6 }3 D
Method(_TSS, 0)2 F+ b" r- W1 z) E1 Z, v
" i6 f& {# E3 Z. ]  B& `( W/ n7 b
{: Q, \  S- a) Z

% Y+ m1 a  {4 uPackage(){100, 1000, 0, 0x00, 0},
; _2 l6 p) N5 _3 z, {: G! U  p; S$ t& S; |1 G
Package(){ 88,
8 _& I, Y7 q- H9 g. I875, 0, 0x1E, 0},
: [) k4 d* `# C6 x
6 h; `; V; H3 D7 c* v. t' qPackage(){ 75,
3 H* ]1 p, _- f. g% U* v) n! b750, 0, 0x1C, 0},8 i' _; Z) S: x: s" V$ u

/ v# x/ ~% r, l3 W7 |& LPackage(){ 63,% c- z. C3 I) \) R3 g
625, 0, 0x1A, 0},
' R% j" o1 Q1 j0 _+ W/ F9 ]" X) N/ h- p4 V
Package(){ 50,
2 j  _+ P3 a4 ~. c500, 0, 0x18, 0},
. `8 k: X1 E* y
: F" T! x  O$ P" c4 e/ zPackage(){ 38,% ]3 Y3 }8 T, Z+ m) @% r+ @. l# j
375, 0, 0x16, 0},1 x8 L/ A  U. c8 m. i

0 k0 f; e4 u" \8 F, ?" v5 P4 Z, O2 mPackage(){ 25,
9 ]1 U) ?6 L$ r! \, m5 c3 M250, 0, 0x14, 0},
$ X  A" }: B- P; k( J1 n' ]4 X: L( x7 c6 [& ?) `8 J% d# i
Package(){ 13,
2 x1 u8 @3 |' B2 Z" W. K  i125, 0, 0x12, 0}
- ^* U  R$ f6 @% \  X8 n
$ S+ T( o+ f: E* K}) x; ~6 o8 r% n1 ]0 ~
3 G! |2 |8 a) D1 {7 Y

. n! T' `" L9 A* u1 z$ [l0 ]: Z. C+ f% ~8 K( d# g
_TPC) x" T; Y2 ?  P2 B4 |

: W8 }7 }, K& ~$ m: {% H% FThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
5 |2 J) V  G/ c7 W 3 g  |; t7 ^+ H, R' _
l
2 T+ ?* U9 H$ u+ m
_TSD
  v" K7 A3 K# v- b* Q # f; k4 Z+ X( q) ~
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code! q$ [6 g1 R. f( f1 [' V
% w# t4 X% `/ s; z/ u: ?7 L
Name (_TSD, Package()
2 u! N$ G7 H; x9 j+ U2 o
& p. x7 R* |1 c{ ) x2 E+ ^! D" I: K; b# r1 C
( V4 s# k0 d/ |0 t6 E4 l. _$ w
Package(){5, 0, 0, 0xFD, 2}) N  l' n4 s  I0 B: Z
// 5 entries, Revision 0, Domain 0, OSPM
% A# E- @: z( N8 a! C" UCoordinate, 2 Procs / \" q% L8 M7 \: Q$ X7 ^

5 ~" p$ C# F- c+ z& Z4 C/ R  [
. R1 V6 c4 y( V: [}) // End of _TSD object
$ S& L) R( U0 G7 @& Y& f8 u   J( G, h& }7 K' Z
REFF:
0 ~; m; P- l2 d; z1.
9 d( e3 x& r( ?& T7 KACPI Spec 3.07 I" I. T5 J7 k2 E$ J# l
2./ s* _/ ?6 J9 a
Intel Processor vendor-Specific ACPI
3 K- c4 v& v3 C2 B# p! z$ E/ I" R
/ L% l( m7 p0 J  y3 U2 i- V6 } . e4 I( S1 n+ H+ t
That’s all!
! J/ s( w. i) k6 [5 Y# p
0 X: e# T. O) }# T- J: cPeter) L: s% w* u" \; m7 s5 ?
* x6 O9 G) u: d% o
2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-20 09:20 , Processed in 0.214200 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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