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

[原创]AC In/Out OS Slow Response

[复制链接]
发表于 2009-5-19 08:11:52 | 显示全部楼层 |阅读模式
AC In/Out OS Slow Response
  D, J! b) c0 T% w. ~
  • Phenomenon
    2 y) G) S  P5 H

) e! O( c6 L9 @9 L- I" O( }2 p2 q手上一个超薄NB的案子DQA报了这样一条bug:频繁的插拔ACvista右下角的power icon有时反应很慢,AC插拔过后有时需要等几秒或十几秒才发现power icon有变化。Power icon指的是下图红色圆圈标出的部分:
( K/ P1 ~. }6 \( O; L7 L
1
  • Why???
    5 U7 ^( F9 f9 ]/ ~2 F  k! I

+ Y1 U8 t1 F$ }% x: K. K2 D# B! S6 ~( i
刚看到这条bug时,我有点不以为然,因为有些机种也有这样的状况,所以我以为这个有可能是不同的测试人员认知上差异。而且超薄NB为了解决好功耗、导热的问题都使用比较低的配置,我最初还觉得可能跟配置有关。但是他们找了个相同chipset的机器去试,反应很流畅没有这样的现象L!我的猜测站不住脚了,这时我觉得应该是FW有些地方没有处理好导致的了。随后我们开始debug,首先我们要理清AC in/out 过程中ECBIOSOS都做了哪些动作,我所知道的状况是这样:1. EC检测到AC in/out的中断,更新EC ram中的AC状态并引发SCI IRQ通知OS2.OS收到SCI IRQ后调用BIOS中的_Q method并通过Notify function通知OS power source change3.OS调用_PSR function获取AC的状态并据此更新power icon显示。上述過程sample code 如下述所示:

& x. s6 }/ s- K* G7 H' r+ n9 }// AC Change event, \& i+ S, c( N% L& m  d- y. Y) g
8 R$ p7 A+ ?, A5 y
Method(_QXX)
" B1 S6 z7 A0 w- Y/ r4 ?: S
  [2 z3 O8 p2 r, K+ o
{

" L4 f: g8 L* B$ h! z" K) X/ A3 A) p9 z( e  W& Y! S0 \1 }% ?0 ~
Store(0x09, DBG8)

" y4 ]: m) U  g, E! y; C+ n! |% m3 N
: N1 {1 `2 Z8 P. m4 j( V: G3 F3 ?8 YNotify(\_SB. ADP,0x80)
7 I2 o$ Z; ~  m5 `; u" s//Power Source status changed

9 R: U  x* j) ]% D- g: `. w& b* x" D7 ^
Store(0x0A, DBG8)
# F* a5 n2 u8 x
/ c$ z7 S! K5 @1 k" p; }9 M( T& C

5 ?# P/ ], t0 i, V' J1 p7 X}
4 n/ \2 _$ ^$ r

' y: j$ k6 V3 m6 r9 n
2 z% X3 R3 V% S. d) N
+ k+ \/ ^% |) q& K. g9 v# O
Method(_PSR,0)9 s# G& d  P2 S/ I+ g+ m
! _3 _! b; M, `  w" t" N4 {  G8 z

, a! i/ |6 k& {* Z3 E' L8 y2 K{
  r7 |/ A6 K( k) F% Z* q+ m

2 f+ _: F/ c; Z" G; M% I% X) a
. }; B$ L" H7 @8 x2 w2 D- H4 iStore(0x0B, DBG8)* @# i; X% _. w2 i

2 ^3 Y$ @# A7 F8 J- R& A7 d3 B9 j: u& ]% `6 A& q2 c
If(ACST)
6 ^* G! E$ L/ g6 O  p3 T//check AC status
8 H! e8 D1 ]* Y/ A# y
8 ~1 f* w( i. t+ j9 u0 b* o0 G
{
# }$ f* r/ |- l7 g3 ~1 s. w
9 O! r, b- O4 s! V1 I/ g

/ r# z  Y) Q, A2 b) N7 u9 lreturn(One)
( R( V' t$ K; F$ k" c" Q// AC Present

( h- O/ J$ @" H# i: D
  n! W' _* l2 @+ N7 ]% J2 o}
3 ?( C, I4 ~) x2 h7 O
4 k# k) N# k+ I8 ^* H
else

/ q0 ~, S/ @& O  n9 r9 D2 h/ f2 l$ y8 b. Y
{
7 q9 r8 i7 r1 E* S& E
9 J; v) e! |; w" o
return(Zero)$ l( P) H$ M1 k
// AC Not Present
% n2 x0 z0 m( a+ k7 \( F% _* |8 i! n; y
% G0 u" Q  @+ e. P0 Z; Q- j9 y
}
7 N5 F; D, h& y0 \

9 D6 K! {: ?! dStore(0x0C, DBG8)
# q9 m* f# E/ q4 M" s5 O
9 N* e/ D- ~* K/ F9 J  y
}. j3 t& }' y* X: z+ C
* x0 L6 T- [8 \1 D( L5 Q

( X! h( [- R" r( C: \# Q% \7 B我能猜到的大概的流程应该就是这样了。那我们就从头开始追,先在AC change qevent中抛点,可是发现AC change对应的_Q method反应很快,一旦AC in/out debug card马上就会有显示。那么说明什么呢?跟EC没有关系吗?接着抛,又发现有时停在’0x0A’比较久才会出现,有时’0x0C’比较久。
6 E) |$ a$ u3 }2 m( Z4 Z2 \- M状况不太一致;没感觉就把网撒大点,在几乎所有的ACPI method中都抛上点然后再try,试了几个回合以后有感觉了,我们发现一旦现象出现在Device Battery _BST method中停的久的几率非常高,也就是说AC in/out OS还会更新battery的信息。这段代码最明显的特征就是它会从EC ram中获取非常多的电池信息,sample code如下所示:# p. s2 m8 n% I9 S% M0 L4 N
Method(_BST)
- ?1 _' y: p$ \8 s( `: Z* ~4 M{+ n) l' e" d) l0 m- D/ u

3 S% t' g/ }+ Z1 OStore(BSTS,Local0)

' H  E1 m' Y! @( b* W; K$ m( m8 |' v
$ }) z: \8 \2 r; X
6 J6 h& m. \# K& R3 L& A- {If(LEqual(Local0,1)) //Check Battery Present Bit

2 p- x- o1 k4 M* g: U6 o
( E/ q) \1 E" t( g{- \9 M. Q% V. r5 P  S
1 y7 w6 O) }7 c6 b8 K
% Z7 q+ K; j- P' T

9 v) m+ g& S3 n: p
5 W+ ^$ w+ s# R- c9 m  C8 c5 a* e( S
//Read Battery information from EC

1 L8 X) C) C7 M/ J7 B$ {) }% N1 c* j$ v' p* H1 k( Y
… …
: M/ K6 R  D7 F! \7 @

  K& W# n2 t- q6 D' i- L
. a' M7 N- Q4 G- r}

  e) y6 s& a3 S# N) v% ~
! |6 U* o8 G+ h9 T$ w; a7 SStore(0x0D, DBG8)

4 J" S; Q: Y9 A4 O}
( b+ F: Y; y+ s" j那么问题好像是由读EC ram导致的,ACPI中读取EC内容的方式是发0x80 cmdox66 port,随后EC产生一个SCI通知OS,接着OSEC ram index发给0x62 portEC将数据送给0x62 port再产生一个SCI通知0S,接着OS0x62 port就获得了EC ram指定位置的数据了。我在EC 端加入debug信息,发现出现状况时0x80 cmd EC很晚才收到,0x80 cmdOS发的,所以貌似和EC也没什么关系吗?继续思考,EC产生一个SCI的目的应该是产生一个IRQACPI driver获悉前面的指令已经完成,ACPI driver可以继续送指令下来了。如果某一条指令慢则有可能是前一个SCI IRQ通知 ACPI drive driver还没有处理好导致,也有可能ACPI driver已经处理好但是EC没有ready所致。
( s7 m# l$ `1 |$ T那么SCI中断机制是怎样的呢?EC SCICFG register通常将SCI IRQ配置成HLHpulse trigger,而且L的时间通常设置成64us,如下图2所示:

) B- ?- b" P+ ]8 a! @8 @% L: {1 f7 ^  H$ c

' m# E4 Z1 \' i- v: Z. U, D
BIOSSB SCI pin通常配置成low edge trig SCIpulse trig有个优点就是它能够自动复位,产生一个中断后SCI pinpull high。可是因为BIOS是下降沿触发,所以EC SCI保持64us低电平会不会太长呢?会不会导致ACPI driver收到IRQ后下命令给EC,EC SCI pin还没有复位而太久才收到?又或者说EC SCI pin保持低会影响到ACPI driver IRQ latency?有了这个想法以后,我就开始放大它,修改EC SCICFGSCI IRQ配置成128 us pulse trig,然后再做AC in/out的实验,嘿嘿病情加重了,fail率接近了80%之前只有10%;那我再将pulse width调整为16us再试,结果200次竟然没有一次出现症状J.8 J0 w( [1 Z9 ]) v  D* \
/ g7 v0 Q5 p* |4 ~
  • Solution
7 u5 l. X) a5 u/ F
$ A) E& r  c  g
经过上面的分析,大概的原因已经清楚了。所以解决问题的方法应该是调整SCI IRQ pulse width,将保持低电平的时间调短,这样就可以有效的避免这条bug。通过这条bug我发现在分析问题的过程中需要理清问题的各个环节,并且对各个环节所涉及到的细节也要深入分析。不能够看到现象就轻易的下结论,更不能想当然,正确的态度是不放过任何蛛丝马迹,大胆假设多方求证!) ^' v" N2 N* B! W

+ W2 v) F0 `. H6 x. x) C4 S9 U# `2 U. v3 k. [1 y- A( g% D  k
1 @4 }/ A# S! v$ }  j& g6 [0 x0 y

( W, k$ t* w1 x6 RThat’s all!
4 s" k" J% o" U2 X3 @7 H
, n  }% V! c- j0 dPeter

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
发表于 2009-5-19 18:31:57 | 显示全部楼层
原来如此!!!
/ ~7 Z+ `: R- A9 `, E+ {, c  C  X) z6 u" |1 z
谢谢!
回复

使用道具 举报

发表于 2009-5-20 08:52:57 | 显示全部楼层
Bug起因为本
回复

使用道具 举报

发表于 2009-5-21 14:42:55 | 显示全部楼层
好帖,学习了 谢谢!!!!!
回复

使用道具 举报

发表于 2009-5-21 22:48:47 | 显示全部楼层

好贴

感谢分享!真的很有用,以前我也遇到这个问题,还以为是OS的问题呢!真的好贴啊!
6 |+ }! B/ p' I. Q! I- S. q7 ~我看了您的分析代码,好像不是EC的代码吧!我现在就是OS-BIOS-EC三者的关系有点迷糊,版主能否指点一下!谢谢
回复

使用道具 举报

 楼主| 发表于 2009-5-22 07:53:35 | 显示全部楼层
hehe...
( o4 |- o) `. V& F/ F/ R: F很高心这篇文章能够对你有帮助。; A7 D% V5 h7 q/ b, j8 J' n
上述代码是BIOS中的ASL code,理清OS-BIOS-EC之间的关系的最好途径就是0 ~" }% c4 G! d" X+ f) h3 H2 Q
ACPI spec,没事翻翻ACPI spec会有不少收获的。
回复

使用道具 举报

发表于 2009-5-23 09:04:24 | 显示全部楼层

谢谢

感谢指导!谢谢!有时间经常关注你帖子。
回复

使用道具 举报

发表于 2009-5-23 09:18:01 | 显示全部楼层

请教一下,关于oemmain.c中的几毫秒中断问题

您好!我现在手上有一个小本项目!用的是华邦的代码!我发现在oemmain.c中的几毫秒中断中是不是不能添加太多的代码啊!打个比方我就在一毫秒中断里加的代码,而这些代码是执行时间加入超过了一毫秒,是不是会造成EC死掉啊!因为在我修改后的代码发现有时很不稳定!我想了想是不是问题出现在这!请指教一下
回复

使用道具 举报

 楼主| 发表于 2009-5-23 10:43:26 | 显示全部楼层
中断的处理通常分顶半部和底半部,很多driver都是这样处理的.
  q2 V; |: \( X) z4 R简单来讲就是在中断到来时置flag,后续再处理(DPC).
回复

使用道具 举报

发表于 2009-5-23 13:09:50 | 显示全部楼层

感谢回复

谢谢了!刚才我又仔细的查看了一下我的代码!终于找到了!EC死掉的原因了,就是我在上电时序那加了一个类似看门狗的小程序!来保证开机的效率。结果硬件始终有一个S电没有上来才导致我EC死在那里。( U5 U- I9 s; X, s8 P1 Z
对于您的解释我还是有点迷糊!对winbond的EC他的oemmain.c中的1MS,10MS,100MS,500MS,1000MS。它用的是中断还是轮询!!中断和轮询是不是没有什么太大的区别啊!我现在就是担心我在比如1MS的函数里加的代码太多,会不会出现在这段代码执行一半的时候,1MS的中断又来了。那代码不就不能完全执行了吗?
回复

使用道具 举报

发表于 2009-5-23 13:59:00 | 显示全部楼层

回复 10# zhanghmjm 的帖子

oemmain.c的是service,是具体的执行处理过程,而实际的中断呢,是由Timer 来触发的(有定时1ms),只要不在中断的Routine 里加太多东西,在 service 里加,应该没事。个人看法,呵呵
回复

使用道具 举报

发表于 2009-5-24 10:02:18 | 显示全部楼层
谢谢了!明天有时间我做个小的实验!我想就应该清楚了,到时与您分享!呵呵
回复

使用道具 举报

发表于 2009-5-26 18:20:08 | 显示全部楼层
为啥你们的是C,我的是汇编啊,
回复

使用道具 举报

发表于 2009-5-27 13:48:06 | 显示全部楼层

回复 13# amty.wang 的帖子

用汇编写才牛呢,呵呵
回复

使用道具 举报

发表于 2009-6-5 10:35:35 | 显示全部楼层
文章很精采,分析很透彻!
! U% V, K' t5 d8 L- o1 f
回复

使用道具 举报

 楼主| 发表于 2009-6-5 11:17:59 | 显示全部楼层
conol你也來這里了1 a9 q% O/ v- P6 E( M* v7 r5 F
呵呵...
回复

使用道具 举报

发表于 2009-6-9 22:12:26 | 显示全部楼层

请教一个关于重启的问题

您好!- S9 Z3 H- N; l8 m
     不好意思又打扰你了,我现在遇到一个问题就是在重启电脑时EC为什么会几率性的死掉!在重启的时候我们EC都做什么啊!现在真的有点头痛了!!!
回复

使用道具 举报

 楼主| 发表于 2009-6-10 07:53:53 | 显示全部楼层
之前有追过reboot它的大致过程是这样的:. b& P6 J; r/ k! ]1 [
1.BIOS发FE给KBC,KBC pull low KBRST#一段时间,然后sb会将init# pin pull low 16个pci clock
7 G+ J. O6 p3 m  S! xchipset reset pci reset系统重启。/ n3 r$ t+ V0 Y$ z+ V
2.一旦重启后面的动作看上去正常开机没多少差别,对ec来讲无非是keyboard init、进出idle(update escd)
0 x: s2 \# ]1 r) x& S! @3 z等等一些琐碎的动作。
! p0 ?) T/ }; ~6 |之前碰到问题比较多的地方就在idle这部分了。
1 ~! n( c/ G1 J  s  Q/ t4 Y  G2 m& T你所说的EC死掉指的是所有的function 都失效吗?keyboard能不能用,hot key能用吗,四秒关机呢...
- m. `" \. T5 P1 J还有如果单台fail几率比较高,建议你接串口debug去看EC死在哪里。' H! L4 M4 N- k9 v- k
以上希望对你有所帮助。
回复

使用道具 举报

发表于 2009-6-10 21:45:30 | 显示全部楼层

重启死机

谢谢您的答复!6 |% Q( O9 f; _( l8 a* z. l2 z
    我在做重启的时候EC是死掉的,四秒不能关机。键盘和热键无效!至于死机的原因真的很难找的。因为串口debug调试的功能我还没有弄呢!
/ f0 L; d9 T& D6 Q     对了您说的BIOS发FE给我们EC应该是通过SCI吧!请指教一下!
回复

使用道具 举报

 楼主| 发表于 2009-6-11 08:15:47 | 显示全部楼层
to zhanghmjm:
8 w/ p- o& X  U& b( fBIOS发FE不是通过SCI,而是透过60h,64h port。
$ n+ G' V+ Q( D- a) q  ZBIOS应该没有办法发SCI给EC,而EC是可以发SCI给BIOS的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 07:54 , Processed in 6.573830 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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