|
|
|
我所知道的EC====>KBSMI&KBSCI 5 h7 m- f3 U& p
& `# d4 V. _0 z0 R6 ?- B
1. Introduction
% D& Q6 n' E- s _$ d9 a+ U4 H8 {. P, E/ `" |; u
SCI是指系统控制中断, 为支持ACPI的操作系统提供系统管理,客制化功能。SMI是指系统管理中断,由设备或者软件需要呼叫SMM功能产生,使CPU进入SMM mode。基本上进入ACPI mode以后SMI就很少用到了,对于EC来讲SCI和SMI则是互斥的,一旦进入ACPI mode EC 就只会发SCI。通常EC会有两根pin KBSMI&KBSCI连接到SB,EC可以配置这两根pin的属性,决定使用何种方式产生中断,比如level trig,edge trig,pulse trig,我做的案子常常配置成64us低电平的pulse trig。
2 ^5 E7 P; d* S1 N6 h
. o0 ]1 p: H. k" Y2 c* T8 Q9 ]5 J! U- w3 x2. KBSMI#
/ r ?. g" |1 h( D6 X' E9 e8 e$ D其实EC很少用到SMI,除了少数测试项比如DOS下 Fn+F2下切屏等。不过KBSMI#的实现原理还是很有趣的。它的原理是这样的:EC将一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具有SMI/SCI的功能。BIOS code在初始化时将这个信息宣告给SMI Table。一旦EC发了一个SMI,EC接在SB上面这根pin的( v9 r: I: T* s: T' d
status就会被置位,SB检测到以后通过拉接在cpu上SMI pin产生一个SMI,cpu切换到SMM mode然后就会通过之前宣告的那些pin的status identify smi Owner,这时就可以认出是EC的SMI,随后通过下command给EC读取SMI event id,并通过该id去调用相关的method。
6 x% l# \" J+ e3 G7 n5 J4 z9 A6 ]2 ~- u" H
3. KBSCI# - d t9 X6 V1 J/ c D* ?0 F8 L
ØQ_EVENT
! y% @, M4 ~. l% w3 ?2 w所谓Q_EVENT指的是OS收到EC的SCI后,OS通过发84hcommand 给EC读取EC Ram中的值,这个值被称为Q_EVENT id。这也是Q_EVENT得名的原因(Q是Query的缩写,而84h就是Query Embedded Controller)。然后OS中的asl code会根据该id去调用_QXX()如下面的code所示,这里的XX指的就是EVENT id。那么EC什么时候会发Q_EVENT呢?当AC、Battery in/out,LID open/close ...2 c+ T2 A+ d; n8 n
: ?( Q/ U/ L) T: q// AC Status Changed
: e! c9 L) j, h7 ~; A$ @# Q9 N, x' s. S+ P
Method(_Q83)
# u" @9 [; ?+ d+ m3 a5 O* k2 K6 F9 I0 n# \
{3 ]$ e- ^' f: D# q0 |7 z8 |+ J
6 R+ K9 A) b/ F4 h- s3 TStore(0x83, DBG8)
m0 y) a( p- A e5 K6 O
' ?, X8 _' \( j. ]. R5 ]% l% k& N, l' V& H/ O4 a
Store(0x00, Local0)
7 v7 H# C: F; y! s2 T5 c6 _
, C( I1 t, O; H4 L/ O3 ZStore(POWS, Local0)
' F3 p+ k( N% a8 m6 F2 a' }3 \3 f" v3 M5 m5 `* G9 W
If(LEqual(Local0,1))4 S/ B# |- O5 ~
6 P$ L r7 N. a: J
( L6 z) H7 f$ [: ~ Q% N3 T
{
$ B+ v; H m: j' R, T5 w: Z, b5 y$ r# M, J, Y2 Y# |* E+ f
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
: p3 U4 N" F, D @" n+ W% ]7 L5 S8 h! t1 Y2 ^6 P$ p1 ~ L
}
, P- b6 c0 A3 I4 A
" b" y8 f9 S" a5 Belse
/ }5 d! n( D, w/ _' f/ ^( n& H( k
{' U4 l% m# k- E, N" o5 n
; v C1 m) Y. [7 | t$ VStore(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
! n7 ]; Q; N' o) a% L$ \+ S) L0 G2 `/ }
}
9 z. g4 V( F- D9 L! d" q6 M9 [
* e. d) ^ r4 |1 |Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
8 g$ h, U' |5 F0 \, [9 ?' k4 F5 C# r- `; j
Notify(\_PR.P001,0x80)* {7 V9 I- m, }" d( @% m
3 B; s; w, b( a: v6 C# B
Notify(\_PR.P002,0x80) w4 T* U2 h9 W; M" L: A" w
1 m: z4 U; C! `6 I$ |. z3 ^}2 K8 \ Y2 X- e
那么又有一个问题,那就是OS怎么知道这个SCI是EC的呢?请看下面的asl code你就会明白了J: O' ?3 G: m4 E" L2 j! I
Device(EC)+ `* |7 l9 X* \; Q% w! t
{! d2 W2 t8 n7 C3 Y l
* s* Z$ G8 M# ?. A+ s$ s
Name(_HID,EISAID("PNP0C09"))
. f, y" ?* m/ r. N8 `! e; s/ z, x; C }' K5 L6 O* Q
Name(_GPE,0x06)! F$ L6 p% Y7 Q% O
// KB_SCI # n) {! A7 n0 |5 t! U8 S' A
2 H% Y, E9 W2 R+ b. b( j) ^5 g
...8 t7 W# \; c" C6 W: N( Q! a) o
}
$ c1 X# x# C. ^在Device EC里面宣告了EC的KB_SCI接在了SB的哪个pin上,这样OS识别EC SCI的过程就和前面的SMI异曲同工了。最后一个问题OS如何检测到SCI产生了呢?前面SMI已经说过SB有一根SMI pin接到CPU,可以让CPU产生SMI,可是SCI并没有这样的pin,那么CPU怎么知道SCI产生的呢?我想到了两种可能: d* S+ z# a0 K+ C; h
a.OS polling GPE register status bit。
7 R& @' f; |% ~& U# sb.SCI通过8259或者APIC,产生IRQ。
) @9 Z, t- \; W2 D/ D$ HChipset spec印证了我的想法,SCI可以配置成通过8259/APIC的方式产生中断,而且中断向量也是可配置的如下图1所示:" a- ^. }' ^( w9 b
/ l. N+ @2 n1 S. o! r! H2 u* h4 o! d' Q A6 r
* p) F( {6 B# |0 H( f
$ z! |) J; V& [2 I1 @
' Y. Y6 Q; s4 ]$ S. r: E4 o
A4 P$ c( s. N; X9 |% D6 C
- `5 u* W; A6 w4 q8 U9 o图 1
" x1 c. s7 {, R0 }* b/ \$ e% dBIOS在设置好该寄存器后会将SCI INT信息存入ACPI FADT中,这样OS就可以通过FADT获得SCI使用的中断号码,从而能够在SCI产生时处理该中断,这部分请参考ACPI SPEC FADT部分。下图2是使用ACPIVIEW看到我的工作机的FADT dump,如图2所示我的机器ACPI使用APIC INT 9。7 O9 M( y, q( _
/ J4 I- G" W' r ]; e. b& k/ _
9 _2 Z+ {- B% w/ H z2 N5 K0 u$ v' B8 I
# o- v, R; L% N. ^图 2 3 N4 v2 _/ I5 c
) v) `8 I0 o9 g' ?1 z
Ø
! b3 Q5 h0 {& u0 r6 W* o# EGPE
1 {' U9 J* a# t [3 lGPE其实是属于BIOS的范畴了(当然Q_EVENT也是GPE的一种),其他部分跟EC并没有多少关系,不过既然讲了SCI,就顺便提提GPE。所谓GPE指的是ACPI定义的一个general-purpose event namespace 与SB中的GP registers相对应。GPE register 包括GPE_STS和GPE_EN两个部分对应该GPIO的status和enable Event的触发分Level和edge两种,分别对应ACPI Method _LXX(),_EXX(),XX分别代表具体的GPIO pin。所以当系统在S0一旦相关的GPIO status有变化并且SCI enable了,那么就触发SCI,于是形如_LXX(),_EXX(),就会被调用了。
) p# o- q4 q: n' G
' l! \2 _& d. C" m$ c) M# m7 }That’s all!
1 d( ]: Z2 S! f4 Y6 s8 T
8 w5 n" Q! U. pPeter |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|