|
|
楼主 |
发表于 2010-10-1 20:45:45
|
显示全部楼层
P-state
1. Overview
2 w4 ~# z. I4 m# k& R# k4 s# c' `
9 a% f$ F: c4 Y ^9 ?/ gCPU在C0状态时会执行指令,但是即使在C0状态下OSPM仍然可以通过调整CPU的工作电压和频率的方式,以此降低整个平台的功耗。P-state 在Intel平台上通常指的是EIST' _7 u0 g/ ]- O% \, ?
(Enhanced Intel SpeedStep Technology),EIST允许多个核动态的切换电压和频率,动态的调整系统的功耗。OSPM通过WRMSR指令写IA32_PERF_CTL MSR的方式调整CPU电压和工作频率。
" X' S% p& P" ^5 R# l$ d . ~$ u7 c$ Q, `& }9 o- Z
2. P-state Control+ E p3 S$ o* F6 V% z" m4 S% h ?
& x! M3 [9 U, a; G$ M' S1)
; y4 j! ^2 y( ] K- e0 _3 MDetect & Enable P-state
# N% J. `$ j% P% \! b
" s0 C3 J" H+ sBIOS可以通过CPUID function check CPU是否支持EIST,如果不支持就没什么事了。如果支持的话,后续就要做一大堆乱七八糟的事情去开启P-state的support,其中主要的步骤就是使用WRMSR去写IA32_MISC_ENABLES开启P-state。
. H8 D6 w4 _1 F) l8 G
: s0 G3 M3 f; b# k2 I2). Q- j( X' h( Z! A4 _
Supported P-states
6 {. L5 i: B. w5 F; q- s & v5 o0 W3 \6 v( O
当BIOS Enable CPU EIST以后就需要计算出该CPU支持的MinRatio(MaxEfficiencyRatio) 、MaxRatio、RatioStepSize、NumStates,所有这些信息都可以通过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。) s2 o) d3 T: [$ r J6 Z( y8 @( o
H5 |; U/ F% U2 e
MinRatio = PLATFORM_INFO, E0 u& Z \1 `% u. `- s; N/ B
MaxRatio = PLATFORM_INFO; c: ?1 l) z2 M+ P7 b: s$ Y
RatioStepSize = 0x01# h6 D- U# [, u8 |7 D7 i8 Z; Y
NumStates = (MaxRatio – MinRatio) / RatioStepSize + 1
) V0 E- K, P4 n$ b
% h" o/ x8 b- b( v5 P; H oIf(NumStates > 0x10)9 o8 e& K+ c5 S$ I) o
{
) p( r6 W3 W: d' ?6 i1 x b, B9 vRatioStepSize += 1* G/ y, i( P \; ~, r; q: t
NumStates = floor((MaxRatio – MinRatio) / RatioStepSize) + 1
+ W. u" _' [* _3 i# R3 d& ?}. R/ P. c* w# x
+ C$ `7 }, u3 G+ p$ d0 x
3)
' b) }' C3 ?. L9 Q, T, J5 T3 e5 jTurbo Mode
2 v4 D9 R8 O* S- P( x% O 4 @( R2 ]9 [ g$ G2 B
Turbo Mode是新的CPU架构下引入的一个新的功能,通常被作为IPS的一个sub function。在Turbo Mode模式下 CPU能够访问到与之相关的thermal、current、power的信息从而根据这些信息动态的增大CPU以及IGPU的frequency。CPU可以工作在[Max Non-Turbo,Max Turbo]ratio之间的任意频率。BIOS 可以enable/disable Turbo Mode,当Turbo Mode存在时,它会作为EIST最高的Performance State P0 report给OSPM,另外Turbo Mode的Ratio是通过MSR TURBO_RATIO_LIMIT获得的。Turbo Mode受限于thermal、current、power的门限值,BIOS可以通过设置这些参数影响Turbo Mode的Performance。1 z+ L+ c; h! M- Y& ~
/ x- S3 S/ m- p$ S
4)0 |( \& i# @1 a5 e
Over Clock
0 j* e9 P; q! o, p+ u6 J " f# U) F& \- y& i9 ?" G/ }, j
某些Stepping的CPU具有Over Clock的功能,BIOS Detect并Enable Over Clock的功能以后,Turbo Mode所支持的 Max Turbo Ratio就会取决于FLEX_RATIO,而具有功能OC的CPU则可以通过调整 MSR FLEX_RATIO影响Max Turbo Ratio的值,当然FLEX_RATIO也是会有一些其它的限制(参考相关的spec)。6 @. F! s) t& N) Z {, a$ ^
% Q( p# J+ }9 Q5)
: P7 O0 H- L, X6 _ACPI Structure For P-state: {+ |5 c' L( ~7 T5 ~9 _# L7 H
$ C- n, f! W5 Y* i3 Zl
0 k* c+ s5 c- |2 D$ m_OSC & _PDC
" G' A t; V/ R: O4 ~, G/ L - }/ O. c& b8 W, @$ j/ X( K
_0SC(Operating System Details) & _PDC(Processor Driver Capabilities)在功能上比较接近,基本上供OSPM调用和BIOS传递一些关于P-state是否支持和实现方式的一些设定;另外关于_PSD Coordination Type也是有_PDC提供的,BIOS可以依据OSPM的参数回报相应的ACPI Structures。
9 P- U- V$ b( h" o7 t6 r9 [ 9 C9 ^9 Q* l. M, d% `/ A
l& J) C, g% m* ^+ U2 K. n
_PSS' a5 ^3 k" x: p9 ]4 X3 C4 }0 k
Performance Supported States用于回报OSPM 该平台所支持的Processor Performance States的数量
, s, P( W4 q }5 h) K并且通过一个packaged list的形式回报出该P-State的internal CPU core frequency、typical power dissipation、control register values、status register values。第0个package表示该平台所支持的最高的P-state,第n个package表示最低的P-state。Packaged lists的格式如下所示,其中需要说明的是关于Control和Status这两个参数,其中Control表示要写到 MSR IA32_PERF_CTRL中的值,Status用于当OSPM通过WRMSR 写完IA32_PERF_CTR之后再读取IA32_PERF_STATUS中的值并和Status做比较( [/ V$ d! w8 \4 @) c
以确定P-state切换是否已经完成。
- z% }* ?. P7 m7 u 8 J& l }' {+ H, ]" k6 M
Name (_PSS, Package()
0 Z2 H% y# z$ ^# |9 t{, G0 \6 b3 V8 q
// Field Name5 d* w8 c( i! D: H' o% B
Field Type $ }4 \4 z0 D" _. r" I [* R
2 \5 ]& y/ F9 h% u( \8 a( J3 u
* f! F5 }/ k0 A) u) z
+ k: _ i2 k1 n9 `/ O. pPackage ()
( c( r. |$ h6 ~6 a3 K" B3 t, q// Performance State 0 Definition – P0 # ]- W5 w' N U0 Q* K8 y
1 C2 e# E9 `: E3 F% Z( I
{- a6 }8 ~9 L8 S$ {0 \
4 _3 _, t3 ]2 Z1 @; l+ v
! Y/ ~6 h1 l/ p l. bCoreFreq,/ B. u. g1 g8 _
// DWordConst
+ r8 y* T$ \0 ]( M
9 W' E8 ^3 T% d7 ^" T8 Z3 ]
2 r, d- E5 @- L8 C) z7 hPower, [; G$ A2 d- a0 \6 N$ |7 C7 E7 r) f
// DWordConst p* c6 b. l6 K$ l4 d$ B! K8 _0 Z
2 @# t! o g9 V! s' C/ i
TransitionLatency,! O9 H! J" p) `# H
// DWordConst " S" ?& d) y: D% n) Z0 e# F
. D/ j( }. {7 @; l; z: M* PBusMasterLatency,
3 V7 E1 t$ n! a% \// DWordConst ; ^( z! P( }2 D# f
: {$ S. D0 N' Z. O3 P0 uControl,
( L/ W1 Q: q, p: c" ?# _8 s- }// DWordConst 6 O+ {. o. ]% p! Y: ^
) m0 Y8 a0 ]/ P- O. w+ I+ tStatus: o+ y( G: N$ l
9 [3 h r. l o! y( J9 c// DWordConst : f% z. |5 x. ]$ d
$ j- \( D/ V/ ?! j) q' ^' v},
- b d+ M* ?* ]" l* j3 ~8 D: y0 u& Z1 h6 N6 t8 O3 J
.
; H: o& x. c4 Q! u2 d* k8 T; a5 P
T$ M8 b$ g1 C! G7 N7 |) l% {, k.
# u4 R2 W9 k( s7 C' M7 ?8 H
2 ?/ o$ g; T; } a, F( n4 [3 Q. 1 l* @6 b. O$ M
}) // End of _PSS object4 ~# t; G: F) i9 G
前面Supported P-state中已经提到如何计算MinRatio、MaxRatio、RatioStepSize、NumStates的值了,我们就可以将这些值天道_PSS packaged lists之中了下面是一个_PSS的具体的例子,这个例子中MinRatio = 0x0c、MaxRatio = 0x10、RatioStepSize = 0x01、NumStates = 5。
9 b# D6 s7 v3 |2 x . R5 p: z$ b% l& N$ [8 m
Name (_PSS, Package() # b6 a5 D6 q$ Z; Q+ r: ]+ n
; }* K! s. w- g' s7 w+ F c
{ 7 p9 o$ l: F3 m+ n2 q- {* v
9 A$ W; V# N l- k7 d9 c- hPackage(){1600, 21500, 10, 10, 0x0010, 0x0010}, // Performance State zero (P0) ( j9 S3 g- w: U/ w4 b# M( F1 o2 |1 }
/ ]2 U \. Z5 W5 M# z* O& m1 L9 Z8 l4 ?
Package(){1500, 14900, 10, 10, 0x000F, 0x000F}, // Performance State one (P1)
0 _( G4 w, T* W/ v/ B2 j1 E, K t r2 a5 C& ~( D0 v2 H
Package(){1400, 8200,% W6 V: Q$ `; O+ m' J
10, 10, 0x000E, 0x000E}0 n& \& X1 W+ D! h; q
// Performance State two (P2)
R! F' O7 |1 e; }% ]. L2 oPackage(){1300, 14900, 10, 10, 0x000D, 0x000D}, // ; d8 ]- s( F& b
Performance State one (P3)
1 W5 f2 J* f# g5 h5 @6 a/ |# T/ i% ]; D& m0 q" |
Package(){1200, 8200,
8 g, f; Q9 {! o0 T- {# w8 ~6 e! Q10, 10, 0x000C, 0x000C}
$ G; T8 ^0 B, K: @1 }4 x! ]2 p// Performance State two (P4)
/ Q9 x' ?" }- ]& G/ s- ~; X3 b2 m) r8 B1 c) K( c
}) // End of _PSS object0 @0 e) {( e6 L% q T9 l
2 y0 `# i. e. [ u另外当该平台支持Turbo Mode时 P0将会report为Turbo Mode。
' U$ U1 l" ]; U4 N3 u ! k/ l% }: z( b$ Y
l1 Z- j; u6 o# _( L$ l Q) [
_PCT; w+ h. ]1 X- `% k- ?- Y5 V
& D) T" d! z: v& \ \9 A
Performance Control用于将P-state MSR interface Report给OSPM,OSPM通过_PCT report出来的PERF_CTRL MSR 切换P-state,在新近的CPU架构下_PCT通常report native mode也就是FFH的方式,下述是一个sample code,OSPM透过_PCT得知是native mode,当系统切换P-state时,它应该就会通过MSR IA32_PERF_CTRL和IA32_PERF_STATUS的方式来进行。( ]: r7 l- u8 O9 W
' i e" z# M0 R; [* h, AName(_PCT, Package ()
2 s0 s0 f7 Q J( @' b// Performance Control object : t" P4 _8 L. z0 E, [3 T9 z, ?" H
. N+ P2 ~0 \' B, ?; B{ ' n, _* A( V" w6 G4 }
B; r7 }+ B+ v4 \, m; w
ResourceTemplate(){Register(FFixedHW, 0, 0, 0)},
6 e2 R' ?7 j& B+ \7 H& f4 @# A// PERF_CTRL * z1 H6 A- B. v2 |, j7 |
+ s$ t6 n W' Z4 @3 i3 |9 zResourceTemplate(){Register(FFixedHW, 0, 0, 0)}; F9 B7 b5 e2 }3 k% {; X6 j3 o
// PERF_STATUS ! {0 M0 S& F" H
3 Z" [) z9 f! e* e" K}) // End of _PCT object6 c" T3 s0 Y& y6 C {3 m
4 {0 W% M* ]7 u: Xl* v, }$ W- _/ X% o0 i
_PPC) J# Y5 h8 c1 |! U- |/ b
5 h/ \' r; f; T' _
Performance Present Capabilities用于动态的告知OSPM该平台当前所支持的最高级别的P-state,它返回的值就是_PSS中的Packaged lists中的entry num,如_PPC return 0表示支持_PSS中report的所有的P-state [p0,pn]; return 1就表示支持[p1,pn]之间的P-state。下述是一个sample code。当系统的电源状态发生改变,我们希望支持不同的P-state时,我们只需要Notify(\_PR.CPU0,0x80)的方式通知OSPM重新解析_PPC method,进而获得当前平台所支持的P-states。2 |/ N5 Z l0 f5 ?5 h8 w
. o- A1 Z! k4 l) u+ I2 e9 r3 K* {Method (_PPC, 0) Q. O- x, M- q, H; [7 @9 u
// Performance Present Capabilities method
% Z/ L. c8 H3 ?& T, J3 J; I% F) T8 g6 x5 x1 L4 Q4 y* o$ a
{ ; X- f, s/ ~7 R( [! p
7 f, O6 J$ `6 g' I5 K. M* r
If (\_SB.DOCK)
: q m0 {! G( P2 E# t! \4 {* ~5 u) m5 P h6 C9 h' T; F* N
{
* g6 R ?& V1 H, z% q9 Z; u
2 l6 R0 c; b9 C% k8 q6 {% VReturn(0) // All _PSS states available' Z7 ?- o( G! E( e1 V" F
: |4 i/ |: J' n; m
2 ?1 j- [! r: U7 r* C: k}
8 d1 O5 Z1 t3 o* p4 E
' y$ I( I: _. o* L2 aIf (\_SB.AC)
( f! O8 f2 O5 i# N9 t4 b& p( W. ]
9 ^6 q+ _7 i! O4 c+ B2 B& I0 D{
$ l# l: \$ y% @6 c' `! s
" m. c) B7 r3 u: h4 D0 w9 EReturn(1)# p! j' ~! ~5 }* \
// States 1 and 2 available
3 Q' e4 u7 t5 i7 X0 }$ F8 J
9 I9 P0 p0 `2 N, {& T8 @2 L}
( ^: J7 f4 K7 l& k
G+ l4 O7 E; p( o: m6 xElse
: _, Z" u+ @# \
# u- P1 J0 B/ d: P: V& V( |{
" r+ ]0 Z- h0 Z4 ?) i) T8 n: i5 B! V% u7 {' w1 u( V B+ V
Return(2)+ \, \! \7 U5 X( E+ N k
// State 2 available0 }+ N$ h: o3 |( a# J
$ I6 I' z0 V- H0 g# {) w
} 5 n' C& u1 U0 P( c P, P& y9 v: c
" d X* p# A8 v9 r" Z} // End of _PPC method u8 u; n6 g6 T x0 r: v0 L; J6 |
3 ~2 D5 d( r! C0 H' Z# s- ~& Tl% d, ]; ~) m& [
_PSD3 l. ?6 h1 E P3 s* X ?
* Z8 j; W# M# S" P, ~, l N
P-state Dependency用于告知OSPM 该平台的logical processor之间的依赖信息,简单来讲就是当其中的一个核进入某一级的P-state,其它的核需要进行的动作等。! B/ `0 b1 p& j
& X& S: ~& b S7 {% r R( oREFF:
. H6 S: t, i5 h* T1.
( b" I! d" A6 }9 {9 c0 ~9 {! [ACPI Spec 3.0& A m+ c P& d" H" B Y& Y6 C
2.
: |4 q( ]+ e }! }% N" W3 PIntel Processor vendor-Specific ACPI! m& l7 O+ A3 q9 W# O
# E# Z, q! U, [. o1 W
# {1 E) g2 }+ y2 Z# o& P; n, i+ ?
That’s all!
8 t. e$ v) d! C9 `8 |1 ] 3 Z' R, I( j0 {! l' N: ?
Peter
3 U! _) C- }- a5 \
* \2 D, V# {; ~. f/ [2010/9/24 |
|