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

CPU Power States

[复制链接]
发表于 2010-10-1 20:42:05 | 显示全部楼层 |阅读模式
C-state
' p) ^3 W8 }- B( {% j- f% j' X- L8 `9 G
1. Overview# |% b4 Q, k' e# j" }5 I, [! _; a* Z
4 J  T, i( n! @' E4 F
( M% I2 S4 y7 Q; P, }
C-stateACPI spec定义的CPU工作在G0时的power states,这些状态包括C0,C1,C2,C3…Cn.其中C0被称为Active状态,也只有C0的时候CPU才会执行指令;其余的状态则被称为sleeping,这时CPU是不执行指令的,也因而会节省更多的功耗。系统在运行时会根据loading状况在各个C-state之间切换3 X/ b# `5 N  p! z/ G* H, d
降低功耗,图1C-state切换的一个简单的当CPU在进出sleeping state时会有一定的延时,通常延迟越大功耗对应的C-state的功耗就越低。APCI规定C0 C1 C2需要保持cache的一致性(要保证CPU cache中的数据一定要是最新的数据),C3以及后续的state就没有这个要求了,也就是说如果系统还要memory requestOS就不会进入C3以及之后的state。从信号上来看5 @" }! d; t: p
比较旧的CPU架构上,C-state的切换是通过STPCLK#,SLP#,DPSLP#这几个信号实现的,在新的架构引入了QPI bus,切换C state的动作都会透过QPI Request Msg达成,上述信号在新的平台上都被remove掉了。
! F, v0 K8 k8 S( V  p( Y3 I$ @# I' Q( W( a6 u5 b
cstate1.jpg

+ R8 D8 y8 _. ]( `0 j; N: ^. T/ B
1
( n, E. G6 r5 Q3 y
2. C-state Control
* s8 w! w1 D8 w0 a/ d( Q  O) r' L) s7 u1 H3 K* i  b* k6 C) F
1)3 Q. b" O2 [$ e9 s0 P2 b
Detect & Enable C-state
. p" {. N0 \9 @( M- ~  {5 o, [# }' t: u# H
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的支持。) H1 O3 x8 I; o4 a% Q4 H5 g* W

" A7 o& a6 _8 I2)
% i* c$ J0 u) TC-state Basic Configuration2 B& Z& m% O+ B# `: T& [* p
通常情况下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)。
, b  K  h7 m7 }4 O3 L, `& K4 ]. k
3)
9 b3 P; F5 J* N# b3 e2 wACPI Structure For C-state
+ R3 S) U, W9 E
7 M8 g7 _# G, E* j( J5 Ll2 i2 J( N- C8 Y& P7 R5 Z* ~: _
_OSC & _PDC
' v8 m* \  ~% x! D6 L# O, t_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于C-state P-state T-state是否支持,以及支持的程度和实现方式的一些设定,BIOS可以依据OSPM的参数回报相应的ACPI Structures
! z; I+ \3 i3 ~1 t9 T4 M( m# Tl, |" V7 ^/ m# N! q% g4 r
_CST2 |2 b  T" Z& x- f
_CST是通过ACPI ASL code 汇报给OSPM的有关该平台CPU所支持的C-state的信息。它的格式如下所示:
) u) G; K* |2 H7 x/ _6 ^, YCSTPackage : Package ( Count ,/ M1 P8 f; R3 r+ I
CState ,…,
) C& e7 }( d0 |CState )
- B& h3 N3 _9 R2 G  _其中Count表示所支持的C-state的个数
; t4 Z' g- E, q% @' BCState: Package ( Register ,
7 G: O  U. {" i& Y9 o% NType ,( T5 K/ ]( @) v2 m/ }- K
Latency ,
8 j0 C  U& o( @9 P3 v8 {Power )
, {* j7 B! R2 c! v. p8 j- y$ |/ s$ I# a  Y3 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" P% q& Y+ |7 _. W) J8 `) i
4 d; N% ~" @' I; e6 J
Name(_CST, Package()
4 U2 C+ x5 _1 M% ^+ f, V. A# Y

; }% |1 d, ]. A3 G0 C{ ( P6 }; N0 C" {" T
4,$ n0 o* t; e  c$ |) v
// There are four C-states defined here with three semantics
. u; j4 A& M! V% M' e8 w
9 v9 U/ @, d! I, W/ d
// The third and fourth C-states defined have the same C3 entry semantics
$ f) k. y5 Z8 \: T' D0 A+ M
3 b. o  E/ M/ W  v: T
Package(){ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},! p' F4 A/ x8 d, @+ I
1,
& X" L8 r" M  z, c3 \. T. u& i* R20, 1000},
# {/ o5 Y7 c1 g

, y. g5 W- k. {, h- hPackage(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x161)}, 2,* g( U* Y; Q5 C5 f
40,  V6 T) U8 V* W+ [' E& W
750},
7 L8 w8 b6 _" }4 m  A
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x162)}, 3,' G# @. G! ]' J
60,0 |; u1 {# D) m/ x+ _
500},
( y! q' D0 N  I% R& d
Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x163)}, 3, 100,
  Q% _$ }' x& E: d; T3 q" ?# M+ r250}
1 E8 l2 N" u  S8 o% h/ g: ]- ^. f2 @

, m' B3 |; N+ E; E5 r})
: G' v  i5 F) @" D5 D# L! q1 X
7 e# U* j7 q4 R0 k0 U* j+ `& Q+ J8 cl9 _" d( k8 g/ q% ^
_CSD
( S, b* J+ y' {0 J
/ O' H9 I0 v8 x; L" f6 AC-State Dependency 用于向OSPM提供多个logic processor之间C-state的依赖关系。比如在一个Dual Core的平台上,每颗核可以独立运行C1但是如果其中一个核切换到C2,另一个也必须要切换到C2,这时就需要在_CSD中提供这部分信息。
2 D; C  y3 r! s% _. }: E
5 Z3 j0 ]* E, V
& R$ n! r1 T9 K8 ?
; l+ i- @' N1 j2 v/ Q, m" s" k# @0 q; z' n, R7 `% Y+ L/ _9 {
3. P_LVL VS FFH
+ e: O- L5 v" r+ @2 k% m" i  J9 P
* Q, B9 U: U( Q& x  T, p5 f; |P_LVL称之为Level register,是在一些比较旧的Intel平台上用做切换C-state的一种方式比如切换到C2,就会去读LV2 然后系统就会进入一个叫做level 2 power state(C2)9 N7 Q) x, Y# U, y
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所示:. {  z2 m+ Q3 U

/ X  X0 g0 _: ^8 Q( `
gas2.jpg

8 b: x2 P7 M1 k2 F1 ^$ j
2
/ o; k8 c# u$ c4 ?; Y7 r
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的一个例子:
4 z$ E0 O- a# ~, Q" j1 j" B. s. sName(_CST, Package()
8 j* a: o  ~& ?# Y0 }3 R
- K4 j  L6 `. `8 f" U
{
, ^4 u& b+ F3 _% H; i2,
- Z' {9 m2 Q+ p  q; {// There are four C-states defined here with three semantics

9 P$ D8 |0 U8 @* `. B$ |
4 |" ?6 `* O4 F// The third and fourth C-states defined have the same C3 entry semantics
8 G7 I: d# U2 Q" l1 \

( }6 ]1 i0 S8 ]& M$ Y! WPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000000,0x01)},
6 @- g' x6 s5 L+ r& C: ?, y3 t' f0x01,
5 h$ C/ m! A1 o& a' a0x03, 0x000003e8},
- T  N6 K" I0 Z4 |* V

- F1 Q0 w2 d7 Z% ^% U7 h% HPackage(){ResourceTemplate(){Register(FFixedHW, 0x01, 0x02, 0x0000000000000010,0x03)},
& U  ~4 c  a7 ?0x01,6 g3 n0 w% f% P9 j0 ^1 [3 t8 L
0xf5, 0x0000015e}
; ~+ f, z1 N" F, f. m: R
})   q8 ?( y0 j2 P# y3 h1 Y! I1 c

' p, I& I6 ]" f# H. F8 ~, G0 z
* V# |2 y/ B' [" m5 ^REFF:# j+ s; {7 P" f7 V# X) k0 p* b
1.- i  f, f2 n- I/ {1 C
ACPI Spec 3.0* `% f/ a) Q" M" f: X
2.
( F; L4 \' a, {& M; q, qIntel Processor vendor-Specific ACPI
# X5 T" b* }) }% l- O( L! O
7 P9 M( t9 Y. \5 S, s9 Q, [
* {3 `/ D1 v0 p/ m9 @That’s all!: n3 b& j( F9 I
8 V) l9 ]1 E0 u5 M2 `& Y2 B
Peter
/ k" {6 ^; X; Q) ^: M" J/ u8 L& j
2 x" N# R6 |, p. |9 |4 [2010/9/20. V- O+ a3 l* O, O: [- o) ~
- ^8 P- ~& [& R- u
[ 本帖最后由 peterhu 于 2010-10-1 20:44 编辑 ]
 楼主| 发表于 2010-10-1 20:45:45 | 显示全部楼层

P-state

1. Overview
- T% C- A5 {5 Q, Y, w9 A0 ~
6 o* J5 |  u( ~. K: E* DCPUC0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state Intel平台上通常指的是EIST7 C" s/ z6 B8 d* L6 Q
Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。2 p6 s# F$ ?8 F4 t3 D# L. h

" q. `7 @5 S8 B) u9 U4 }2. P-state Control
; S5 H) z/ V0 j  F2 G ) x5 {3 C5 ^3 W% u
1)
. ~; j1 Q! u! }+ O! c- h9 [Detect & Enable P-state
, g0 @+ V/ B) `6 A 9 {5 W6 {' ]3 c) _* S
BIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-statesupport,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state9 |/ L5 H# w# z7 o7 K
- J& j0 ~% V5 b$ q% w
2)7 x/ t+ D8 Q* b/ H2 a- B6 a2 _
Supported P-states! R8 c' m$ |+ s# ~$ f, h

) m% }) k2 @5 q, a9 z6 X! mBIOS 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$ f1 z0 v; C' j0 N3 Y  ]8 v0 R
- N( j* ~/ c  X: l
MinRatio = PLATFORM_INFO( T  v6 e0 i+ S
MaxRatio = PLATFORM_INFO
% n8 r% b5 s7 l1 \7 V2 SRatioStepSize = 0x01; o' F" T" s2 n7 A. X% Y
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1$ _& c8 q* p2 T7 C( k  z

  {  n8 C" x6 D$ x& wIf(NumStates > 0x10)$ Z9 E. M" r9 c+ N
{* U& i( [  a% u
RatioStepSize += 1
* Z$ z8 }! D, z( yNumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
; W$ S1 h7 G9 g8 l7 d, e}
8 J* O1 R/ m/ d5 c% U) t
  O; S' ^+ o3 {/ C1 X  [3)
) W/ C5 A2 o2 b+ j) LTurbo Mode* m" \+ h+ G2 J5 y6 Y. \( L% X

# ?  D0 f& N$ D2 x3 z" rTurbo 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) `% [/ J+ d2 U0 c

3 h$ T0 |8 q0 V1 C3 P- S4)
) c2 s# E& C& o2 ZOver Clock
% l3 T% K! P1 y1 o* Z* ?
  z" d" K. U. z某些SteppingCPU具有Over Clock的功能,BIOS DetectEnable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OCCPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。
/ y3 E! s1 q/ y: |5 \ : F6 A" g* j# Q: V* q
5)/ x7 u9 f% G. I- V+ E  b( {
ACPI Structure For P-state
9 g" H3 ~0 H' k, @
8 V. V) v# p' ^" s% W! Nl8 e+ \& q7 y0 w9 f+ E1 ?* d
_OSC & _PDC
. m3 d8 g+ L* ?- x" c ( u# {2 J% h1 }  T2 `
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures
' d- m( I5 g" p8 Y) Z' i5 R6 J, M
' o0 a' a+ W; F# j) Fl( `$ u2 h" b" P, ^- y8 ~  \
_PSS
9 Y: u4 B+ d3 T( ~Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量9 V1 U" t9 Q% V# o# {1 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做比较5 e& E/ A: W% w4 L2 i$ o' Q
以确定P-state切换是否已经完成。
! [' ]2 K& M( Y' G / L, [! H8 J$ f+ `7 L' n" y( c
Name (_PSS, Package()
1 i8 X, U8 U/ a( @. b- r  k{
! I& z5 S' A& h1 o) B* Y// Field Name
, d3 E0 [( n3 i; k6 I6 S  T9 R& LField Type
% l  Q* i; O2 H! k+ ^: A
! Z& O+ R; M( c% m5 E1 v6 M4 W! `7 @2 @3 i& ]

2 m5 e/ A2 j+ [/ j  u: v0 c" r8 ~Package ()
, u  [3 |5 ]1 K! p( i// Performance State 0 Definition – P0
" ~) H$ f! Y- T1 \7 k: K$ m: D6 _6 g
{
- D. K0 K. h0 L$ z( w+ |
; M/ V* s& Z! l8 Y* m, _2 ?7 S' P% q
CoreFreq,# ?" o6 m1 |" v" b7 F
// DWordConst
( k0 D6 ~5 o. A
! v7 d3 k! \6 q* b8 ~# L* l) h! E: O" T/ @; v3 g6 o
Power,$ V1 ?" K; i8 L
// DWordConst
2 m+ S' P5 ]2 a# }
% C  j4 R$ p7 wTransitionLatency,
+ Z0 K& a+ j* U// DWordConst ' v# Y; f5 A9 s* W# _; r+ V( q5 f

0 i5 D5 ]3 j! ^' E! n6 G( hBusMasterLatency,
2 ~  ^2 o* j& L) _" A2 Z3 H// DWordConst
9 \$ ]6 _! G' K/ k7 ?
: T3 F% X9 z/ `& j3 c, aControl,  F" @/ a7 K3 v4 J: s, J
// DWordConst 4 _0 S! ]# M4 K: D" w

, F' ~2 V" l$ n$ Y, F- VStatus* ^+ G4 ~. S- l! a! @# c
- d  U0 S2 N8 w* Y' D
// DWordConst
$ F( o2 j7 _7 ^* Y, w8 ], x3 y- k3 g3 `1 x7 u: F2 I6 k' }' q, @$ B
}, " y$ S$ e! ^6 W
& @( L) \' \2 s5 \$ \) e: T5 v
.
, H+ C2 w$ l1 H% y$ [! X/ m  @* \+ {6 H  L# X8 v
. 1 D8 \$ b) s% j- J9 l

0 w+ a5 K* s7 s, E+ ]/ `, D' R. * [2 S# h4 m, S
}) // End of _PSS object
7 a' x) Q( Z7 s: j' R! s$ M前面Supported P-state中已经提到如何计算MinRatioMaxRatioRatioStepSizeNumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0cMaxRatio = 0x10RatioStepSize = 0x01NumStates = 5 0 ]/ P) w% [: X" N0 }/ v
& n" E1 z5 A8 L9 f- L
Name (_PSS, Package()
' d* y% X, _" \( v2 l0 e# e* H5 {: c. }  i+ h6 z9 l' P0 P0 X
{
$ t" G$ ^5 D1 b3 s; n8 J* m. v3 _( T- V# z6 k; s7 I
Package(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0)
- j( T* o! o. }" \. n9 s8 u
$ n8 B& ~- ?/ }5 w: A& W, V5 ?Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1) & e6 j4 M) f3 _; g2 J: R

. [, l- X- P9 K) O! k8 oPackage(){1400, 8200,
( X0 d* v9 w+ T  ~0 G# Y10, 10, 0x000E, 0x000E}( k4 U( U- T3 |" U4 |: j
// Performance State two (P2)
0 Y! y; ?1 H4 W% m8 ^1 @! e7 CPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // 5 c( k8 ^6 U/ N1 r" S" N
Performance State one (P3)
# q" }2 _* F, \
& _8 S, F. n6 n4 r. z4 EPackage(){1200, 8200,/ S: j* z1 @9 _4 a+ ~. W; z9 L
10, 10, 0x000C, 0x000C}7 m1 k! M* p- o$ g3 A
// Performance State two (P4)& b0 G, W3 K- o' g5 y

/ g5 n$ P$ D$ m}) // End of _PSS object
/ q: m0 X/ P* h, g. T6 r& c / y$ s5 v2 B. M; p( I+ [
另外当该平台支持Turbo Mode P0将会reportTurbo Mode
4 B! C0 J/ ?7 j( P1 F9 u5 `+ z
& L& V  R7 g) [9 b3 w4 q5 L$ kl
1 {! f9 R+ z5 a. L
_PCT+ |; j) l8 e! z* W5 m+ S4 Z$ y4 u

) r" x' |/ D3 D  wPerformance 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的方式来进行。
# y- d: h& L* a$ C# x  e& t# ` 7 k1 x- f+ i2 Q& [3 |5 ~: c) P
Name(_PCT, Package ()
3 v! H% i; m+ X! |// Performance Control object
$ E# R- e/ k+ M1 ]' {! a# i0 R
{ 9 W# D$ E) T' S

6 a# E# z! E* |+ H6 x' uResourceTemplate(){Register(FFixedHW, 0, 0, 0)},6 n& w5 e! T' R1 l% k4 C0 {, c# s
// PERF_CTRL - m1 y' t, c% h! d$ i
# e& f7 V* ?* j# F1 t0 _+ ~
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}0 T) y& `- u" _# [7 E
// PERF_STATUS
: m- N1 a$ _% |& {0 z. F4 r2 i) e( i5 N; U+ ?2 k4 z
}) // End of _PCT object
% W, N/ n9 s0 h
# E) w9 V, i! z3 A: @2 Zl7 _  A. |* }+ Y
_PPC
7 v" ^# e; r) {! @- \ ! r# Q% M# C3 {- ~, u/ p1 M; `
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-states2 c, l9 q$ N4 j& Z

% `. E3 Z/ E: _, @Method (_PPC, 0)
3 j9 x; Z+ c" |0 R" _3 n// Performance Present Capabilities method . U3 q7 T0 F: w9 D

' Q* ~$ v2 q- e{ 9 u6 V: ]& Z% d
# ~; y" g5 O4 b+ h: `7 ]( S" I. J
If (\_SB.DOCK) $ Y  T5 {- A2 M. f  |
2 P$ y4 u3 }: U6 O
{ ) \: a( B/ n5 t1 u% Q5 b9 q- m/ H

# q% b5 i) P# }; ^! q! n% fReturn(0) // All _PSS states available7 L) l+ @7 y5 E# C3 X$ f
1 \3 e; }2 h" u5 _4 t2 @
5 i2 B0 L3 a+ z& K7 h
}
( S! I: Q, n. v- I" @4 m) k$ g4 d
If (\_SB.AC)
' v" {( z! h6 e" i* K; ?5 j2 o  p
. E) h1 t! B/ L6 |  A* Q/ \{ $ V2 k! T1 |8 [& {
# \% t( G* l- `, e
Return(1)0 O- h0 L" e( q
// States 1 and 2 available
" q" h. B$ Z3 X: M& N9 O
! \; b& v3 D3 v$ [' }}
- R3 W4 M  t: M  I- o+ K% E' f' t9 l7 H. _" g; q1 j
Else $ B" P6 k. n4 R2 [0 x
+ |* j# O+ q" o/ K3 l
{ % [" `$ q% B! j( Q0 u

0 Y/ ]( I4 ~# @! v: M" v& a$ M' PReturn(2): z( u- R6 T) u7 E. R
// State 2 available
, m: L( J' S( C# d' [; X; x$ [& M2 W  K, Y* O0 _
}
7 y8 W6 {7 N2 C0 V! H/ {0 K
/ w" v8 o3 h9 R* F( M: P% E. a} // End of _PPC method
% q: @# z( a' e" {6 `
& a+ o  w- i, @3 Ll
8 P  M8 r# ^9 I3 Y9 `
_PSD
  P3 b0 ?! T3 O# `" ?; K / u6 f8 @3 @  `8 [
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。, l8 S3 s. Z" H$ r) `" [7 k
, a/ @- l' K! O# ?
REFF:; O$ V) `& [5 F+ q) N
1.
7 @1 ^/ `9 d) f" X' C$ q. xACPI Spec 3.01 D$ a" P) K4 p( `2 n; ]% V
2.
0 S. |6 V3 v4 l, D( MIntel Processor vendor-Specific ACPI
6 j0 i( {5 l( q( o: I3 c# H* I
. i- d! U) v, y/ y# X! H, e
0 y% F+ \* M7 U: n' zThat’s all!
+ U9 q7 `. W9 Y7 y 6 m! _/ {+ I2 G, V4 K8 p, {
Peter
$ ^% K. [% L5 o$ j4 ^  Z/ Z8 F" @ . u( H  A. |2 G/ ^2 b+ i  K: E
2010/9/24
回复

使用道具 举报

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

T-state

T-state
1. Overview2 ?' t2 u$ y% {! M/ W) j

3 z" {( Q: n" c2 k- C* b8 S  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工作时间的占空比)的方式
; i% _7 S+ p$ q' A) d( y,影响系统的功耗和温度。
5 \5 I$ m3 n* G6 I! F 3 q5 w" c* R% K7 L! ~% V
2. T-state Control+ L$ p* H6 A& U, I$ Q& D
+ n/ T* `- J8 Y( r
1)
, ?6 ^- ^3 i( r. x/ p' `' G$ W" M5 YMSR Based Control
6 c6 b2 g1 e' Y- n& a5 m & e+ _9 h" G& f6 q& h  K
BIOS可以通过IA32_CLOCK_MODULATIONEnable/Disable clock modulation,而且也可以通过该registerbit0:3 设置CPU Clock Duty Cycle。当FFH_PTC中被使用时,OSPM就会使用MSR IA32_CLOCK_MODULATIONT-state的转换。 $ _5 ?+ M+ m8 c) L6 ^7 l0 u* T$ O

) A0 e! K9 U  r2)2 l! o. `* A7 R
I/O Based Control4 o9 ~- p* o% B1 |
2 ]3 B" R: L( ^2 w: ]
除了基于MSRClock Modulation,新的CPU也支持IO emulation Clock Modulation如果系统没有宣告 _PTC,则OSPM将会使用SystemIO 的方式支持Clock ModulationOSPM将会通过PROC_CNT register bit4:0T-state的转换。5 d+ ?# U" g! y+ g2 L5 X- f

: o3 s- `  H4 j5 E, E3)+ }/ a2 n9 ]5 v4 n2 Z2 @: C3 p' e
ACPI Structure For P-state1 w9 {- ~9 S8 @4 |0 f
l
0 _9 C6 N/ F8 s: L2 _
_PTC
# A' W0 m2 N7 {9 ~3 x' B % k  r6 p; `3 _5 ?4 X# ~
Processor Throttling Control,该method用于告知OSPM使SystemIo还是MSR的方式调整 Clock Modulation的方式。它的格式如下所示:
0 e& l6 o. w& \% r& g3 S
* `6 e, }9 o* y6 s7 y8 LName (_PTC, Package() 5 o2 L/ }$ K# d' }5 d3 t
{ ! F7 |9 w5 o1 P# N
6 H# r0 m0 p9 f# M  L. _2 n: H" n) v
ResourceTemplate(){Throttling_Control_Register},
9 h! w# G+ R& K- V& c* U1 W//Generic Register Descriptor # N4 a- s! x7 l8 E: D
6 E* K7 ]( K* g2 _# n2 b0 d
ResourceTemplate(){Throttling_Status_Register}5 {; a& W8 H+ G/ T. R
//Generic Register Descriptor
, u, ]: Q' P+ k7 l" S2 M}) // End of _PTC
: _2 }; V9 ]. J2 A+ j ) K" E% A3 x; B9 d" A- y- z# D1 u0 W
下述是一个sample code9 I/ w2 v; t5 T
( `2 u' f6 [$ z$ i* S7 d1 P
6 W  }3 y" [. _/ i& G' ]: a# M
//
3 ~% E- W' Q, T  _' y! T6 C
: |6 z: q2 ]/ [7 [// T-State Control/Status interface* i) A1 e( Q+ n8 v$ {) z. m5 g
4 T& d, d' ]9 k8 s: e
//2 y/ J5 G+ R+ M( [; ~0 f8 _

1 o8 y3 c1 P6 T: LMethod(_PTC, 0): g; V# x3 u- m* ~/ q

8 e. C- s  G( E9 J$ c{7 d* M3 M- L! S0 ?, k* L
8 |; @# K! {  t
//
5 J1 |/ K* V9 H4 y7 w
; D$ L0 k3 b. n3 ]4 T8 C1 `// IF OSPM is capable of direct access to MSR
, x# u, S9 b: q8 |( [' D
' ~# {+ C- d" F- b//0 O  k% X* d7 O9 o; C* i
Report MSR interface  s; }) Q1 ]/ ?4 ~5 u& ?
  B- u7 \% O6 }! H" v; S& Y
// ELSE8 D1 h( ?8 d: H$ y) [) X( e. C
5 l, j- v- p% O+ x" q$ |! Q# }
//1 d1 t/ M) z. A& U/ Y$ b- |( G" Q
Report I/O interface
! f; N& p( v3 Y7 K# d
4 ?$ F& r# Q8 |2 z7 O3 u//
: _7 O- N( _7 R- t& c
: K$ H( H$ ^& U7 b1 ]$ f. u, \//+ W$ Q6 S' F6 d" ?% y9 Y
PDCx[2] = OSPM is capable of direct access to On/ q. J. P* I  U: I, m- u& _& W: k

& B- x+ e- R4 Y6 x0 V& I- F//
: u, W3 V& z. i  xDemand throttling MSR
, L6 u  I0 W" `& {3 P/ j
. k- C0 A* B  k+ t" \' B8 d. ~//# K$ j, }& B% E2 e2 M' i3 @
- g! f; p' Z4 E9 _2 \/ j
If(And(PDC0, 0x0004)) {
# g2 m0 C4 Y% f  M/ s, E1 B5 k/ L7 d5 T1 ]5 C3 N+ F& E+ @
Return(Package() {
  a+ f+ e0 N% A, b# F7 `$ Z* \% ?8 F& W0 L9 {
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
3 Q0 {: L& m7 I; x9 x
" l5 i6 T0 W0 qResourceTemplate(){Register(FFixedHW, 0, 0, 0)}/ a0 R0 h$ t, t3 H

- V/ W; u+ R8 y})/ r% _! z) @" ]) P6 S& e4 E

4 y4 x% d, R$ X4 W}' g( Q7 R/ Z( L( j! t3 u  d
' h' G' D* P) b9 Q) t4 _+ f
Return(Package() {
8 C- |( v3 b8 ]$ O! C! A
3 u/ g' V3 g; \  X) y3 v9 HResourceTemplate(){Register(SystemIO, 4, 1, 0x410)},& \$ E& t0 M4 R; v! l& s& O7 y8 B

, z7 s" Z: z- s% N3 x) wResourceTemplate(){Register(SystemIO, 4, 1, 0x410)}1 ]3 u) x1 g1 ]7 {/ }5 }, h; V! ?: W

, `2 _9 q) @; z9 \2 A})! G5 N% ?! X+ V, H5 ?3 V+ X

' ?$ W. T3 Z- O% ?/ E}
0 }; v4 a+ X0 O" I4 i0 s/ P* @2 c* l2 j6 ]/ t; Z) U
+ h8 o& K# }' u7 Y

0 @/ A( K$ c9 ]1 zl
  E3 w/ t0 r4 N' t7 H
_TSS) E$ ]0 d. l) y" S
. u7 d# x( T/ ^/ y6 N: W
Throttling Supported States用于告知OSPM该平台所支持的所有的T-sates,格式如下所示:
* ]2 [) G. M! C& B: UName (_TSS, Package() $ P* o6 v! ]7 A
{
/ u! Q9 r* u1 x9 t# _6 q+ B1 P// Field Name3 Y4 i, a3 }, O2 z1 ~
Field Type
3 ?0 X. W9 q  p; B1 B2 `* r9 D0 V4 o6 W/ K: k
% ~! m$ u1 V  v) L: k# R7 o0 A8 t

  L5 V( ~1 L  E' m' t$ @Package (), v( ~( e6 P: T* ]8 t% I) Y
// Throttle State 0 Definition – T0
" l2 B) o8 b% a& j: g  b
7 `  [6 y1 {9 N: x7 y0 m{# w. O& b, q1 D0 ^& m

! Y7 f  z4 }( |; h" V9 r
7 A9 ?! c8 a1 u! T7 e* F, {FreqPercentageOfMaximum,% y: A  `: B2 L# |4 n# |
// DWordConst
' _. S/ ^; B- D, m( C5 R# ~
$ H6 v5 O  M/ @- Y; LPower,/ l+ q" @4 c. ~# R3 M9 i
// DWordConst
) n7 e/ W1 {5 ~; c& P% Z8 B
% p+ I  I: E3 ]& D% MTransitionLatency,
  I7 w  c; l/ V// DWordConst 3 n+ e/ \/ }$ |4 T' c

, S) E3 h3 w6 N! b, Q7 |1 K% W# XControl,/ M4 k. \$ v$ [3 ~* {; I
// DWordConst ( P) Z, q: O- F

$ n' i- l9 G, ^) oStatus5 |+ ]! {3 w5 D7 w/ Y) _+ A
// DWordConst # O8 x% _( d9 U+ r+ F0 @; d- u' R
},$ F7 t$ m2 j2 R7 e$ m2 w' K' O
……
8 }9 Q( P9 c8 I7 p3 a$ e7 m}
5 }6 z3 W( M3 }1 c5 y! Y
- K! |4 V6 b- |1 zExample code 如下所示:5 p6 E+ S4 V( t6 V1 o1 W1 G

0 d% X1 h$ o  D  SMethod(_TSS, 0)8 s) t3 ^4 v9 m+ W$ z/ ~! S
. i. D3 C+ ?/ g4 j# [4 K8 n
{2 |* b; W; E9 J2 ]& q

1 `  S3 \$ C8 o2 ]' W) F: zPackage(){100, 1000, 0, 0x00, 0},' S- [* n: G2 M4 ]& Q+ a, @1 z
" l2 ?) ^: ~0 @# g6 N7 j, R
Package(){ 88,
' [5 p) L0 `  w$ H1 ^! o7 r% ^875, 0, 0x1E, 0},
/ W+ Q( j. W% u0 U% B5 s7 t
' U) c- l, I$ \3 yPackage(){ 75,
! R& S% ~0 @+ d7 B* j750, 0, 0x1C, 0},
1 c% b0 W5 n, z
7 l3 i4 f" y, RPackage(){ 63,5 \6 v6 `% B- e6 L$ |8 F5 C+ c# P. k
625, 0, 0x1A, 0},5 V3 E6 H. ~& t, [. l7 w
- O) J% S, N. `# O
Package(){ 50,( G7 I" ]& i+ x1 {' D  S
500, 0, 0x18, 0},
/ T! \/ x  q7 ?& t2 F9 ~# x( c% f8 K$ h+ l
Package(){ 38,
  J4 I  c) ]5 [$ q$ V375, 0, 0x16, 0},
- |! H: s2 b& |, m3 ^" G9 D; ]- Z" s$ \, X' j* V* |$ Y
Package(){ 25,6 j6 z5 l/ N6 f0 W
250, 0, 0x14, 0},, ~6 ^1 u: x9 \* q( H

- P) K# l7 o: x  f1 P" |Package(){ 13,
) B1 j& ?; N6 P+ ?4 M6 v' ~125, 0, 0x12, 0}* d8 v& i" {* h) X; N

# [' p; c+ g7 m, u1 O}
) b3 k# R6 I. Z! t3 J/ I$ c5 _5 l# S1 N( K

0 U9 D# I2 J3 y; Vl
! S: D& I% K! M" c) F( M0 ^# _) h
_TPC
' E. S7 g2 f3 i- U3 t* H( l7 k4 R8 y2 X
1 ^% l4 ]$ P8 LThrottling Present Capabilities,用于动态的通知OSPM该平台所支持的T-states0表示支持所有的T-state1表示支持[1,n],2表示支持[2,n]依此类推。为支持动态通知OSPM,当某些条件满足时可以通过通知Processor Object 0x82的方式促使OSPM重新评估_TPC
, g* q! V' I* a0 U3 X. H0 {
/ C0 L% M8 n( b% d7 E$ ?6 |& Q, wl0 D( A( O) F9 r! l1 C
_TSD- B' V6 h3 e/ v" k! y
1 x& v/ x2 p( m* t5 a. B8 l; b
T-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的T-state,其它的核需要进行的动作等,下述是sample code
: w- K1 P: Y7 ] 7 V; q  N) D$ T# k0 p1 z3 \
Name (_TSD, Package() 5 G/ A1 t# E* R: H) L0 l: Z2 }) {4 c4 K

3 d6 q) Y3 ?  v* ]6 j{
9 t6 V1 i0 j: ^2 y) b& |. Q! y; U' J5 e) E2 G4 T% c
Package(){5, 0, 0, 0xFD, 2}" J# R3 i8 F: X7 g
// 5 entries, Revision 0, Domain 0, OSPM . ?4 X% I6 |1 P( b4 K# M! T
Coordinate, 2 Procs
  k; ]5 \; F; N+ Q( o8 k4 S: _% J4 H

' j3 T5 k+ k0 L" y8 H2 j# F}) // End of _TSD object
2 H' p# g9 g0 D) R0 I
/ x9 l6 O2 U; |9 S* B/ rREFF:
/ G# }4 H) {" G1.
" N2 O3 V6 v1 @' U4 l5 j1 ]+ u2 UACPI Spec 3.07 x/ K6 g  S0 }# Q$ ~5 K, {; w  d7 U  s
2.) H  I& H' a$ a6 y
Intel Processor vendor-Specific ACPI
8 [/ |3 Z6 |: w$ H5 K! O% A " b( n4 @+ [( i8 R% L
* |6 W! A# P3 C! s, z& r
That’s all!8 E* x8 Z' U3 R: e
7 ?9 t2 k5 C$ W# P, \& u
Peter
0 @' I9 T+ M- I: ^9 U5 {" D
1 f' l$ f5 p; O9 w2010/10/01
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-5 00:19 , Processed in 0.031152 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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