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

[原创]AC In/Out OS Slow Response

[复制链接]
发表于 2009-5-19 08:11:52 | 显示全部楼层 |阅读模式
AC In/Out OS Slow Response
8 k  L! D$ T: C; b
  • Phenomenon
    * }8 k) B5 {" \

9 @) ]* o4 K& Z: Q4 t9 {8 |: i* w手上一个超薄NB的案子DQA报了这样一条bug:频繁的插拔ACvista右下角的power icon有时反应很慢,AC插拔过后有时需要等几秒或十几秒才发现power icon有变化。Power icon指的是下图红色圆圈标出的部分:

2 i. ~2 r. v0 X* C6 `9 K1 a9 X$ `
1
  • Why???. y+ C& d( s! N# v; @8 J& w% M

; D! I3 P7 p: m9 E" M( r
. c  D9 w; D9 o9 U, _
刚看到这条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 如下述所示:

) Z  J. h# d% p: N// AC Change event
; Y) i+ A! u- P" Y3 Z; ^' N0 G3 M. J: Q0 `6 P) b" t
Method(_QXX)

/ a' K* j( L9 f- I. s
. S: K5 e1 k. d# l/ P{
" \7 A0 u) h+ C7 r

" q. e$ Z' O8 p2 ~) jStore(0x09, DBG8)

, ~$ K( N4 Y9 |) ?. c$ l0 V% A
/ H# D$ J. n6 t4 wNotify(\_SB. ADP,0x80)
2 `- {7 |, p0 u5 V( J( b//Power Source status changed

! W6 c7 e9 }# N) K6 A& \+ ?5 r$ K
& s: L, O4 W; Q* I+ U$ I, F: Y+ {0 p( TStore(0x0A, DBG8)
: `) X  {, B) y/ @  F

& o1 M& o3 {" A. T  C) Q6 [/ N6 I! z4 F) j2 ?( `
}
" j9 o0 g, s, [; p6 c: W+ s
6 B# D4 E" ~6 I$ O( T. X" k

5 t3 T! {6 S1 G$ P$ P/ d
" e5 k+ W: t# b/ s; U, [( V* N7 OMethod(_PSR,0)3 Y) x8 y  Z7 d% Z' L3 E# ~3 O
3 i5 o! p' z" W! m2 k7 ^- ?

6 N0 B0 U# ]; E* I9 q; I{! }- W) [  `" Z2 L3 U; _2 U$ U
) P" E2 h9 F8 j
  o" h% T/ H$ Q; x9 y; l
Store(0x0B, DBG8)3 m# V7 h/ R! w/ M7 g
* t2 G" L( t% d6 `1 q
; c( o- s8 _1 {+ w8 U
If(ACST)2 J; k! W& g# J4 ]4 K" O; H5 C
//check AC status
. ~$ S+ H* b* K* W0 r

1 q* z, Z2 L/ G/ Q7 _! v# J1 h{
6 B1 r$ s3 M* Y: L( s# N% Q6 B- S
: m9 G  u5 f9 K  a# s

! X, a. j8 B' ]return(One)) j/ D/ g) H8 `+ S
// AC Present

7 L/ b, ^# j1 r
6 V  |- L5 @6 X9 @}

6 ?. D/ g0 R+ j, ]; E' s/ S0 t5 q3 }% g% u6 o
else

' T5 C2 u/ F8 t+ M  p' d5 q* X: o4 z. x) |2 E
{

8 Q) Q& Z" x# m) t- l, d, k5 x1 P* w
return(Zero)5 V* Q( T; j0 K  m$ b$ }
// AC Not Present

2 T/ O& K+ U; O* g
* ]4 @/ _( e. p}

, q, w0 m' y# o! I
2 I# K: @2 \) P6 z. vStore(0x0C, DBG8)
6 S! i8 o+ Z& }$ h- Y" Z1 U
# p# q  j. y2 C5 @! ^# A
}6 W/ P; j! X8 a# f/ M( B$ m
. ?3 w: V1 L# k! c5 w
( V: G$ j$ l& L- f4 V- J
我能猜到的大概的流程应该就是这样了。那我们就从头开始追,先在AC change qevent中抛点,可是发现AC change对应的_Q method反应很快,一旦AC in/out debug card马上就会有显示。那么说明什么呢?跟EC没有关系吗?接着抛,又发现有时停在’0x0A’比较久才会出现,有时’0x0C’比较久。, a5 M! t. p7 \: [
状况不太一致;没感觉就把网撒大点,在几乎所有的ACPI method中都抛上点然后再try,试了几个回合以后有感觉了,我们发现一旦现象出现在Device Battery _BST method中停的久的几率非常高,也就是说AC in/out OS还会更新battery的信息。这段代码最明显的特征就是它会从EC ram中获取非常多的电池信息,sample code如下所示:
. I$ P# l: s! D2 x. qMethod(_BST)
" n' B2 j3 R( P, u{
% x  `2 o- D0 n* C6 H5 _* \
0 b( B- t: r3 U1 Z  T: R+ g3 [Store(BSTS,Local0)
3 P9 s; }/ ]5 d7 M" R" o+ X0 \
8 y) R7 t* R, f9 T0 S: Q, v
2 P1 k, t* ~( O# e7 N, Y
If(LEqual(Local0,1)) //Check Battery Present Bit

0 H' }6 I  D2 g+ r" Y! [
9 Q7 [- U9 j* z: }{' `) u# \# i3 A# S2 }

9 g: m3 c) f0 t+ @/ p4 i5 Q& B: q% X3 h( x
/ i  F& y$ C7 `* g
& k4 C+ n5 m8 t1 \% I) F
1 M% ^% t# e' V2 L, Z
//Read Battery information from EC

  m- ]! H/ ?: p7 W, U; ~
# A% {1 b8 M; }" Z+ ?3 R… …
8 v( o, |; `) P+ ~
8 c/ x# B  L/ b' M2 H/ v

$ _8 a3 u1 l# t* a5 M# F8 I0 t# M}
7 s" W! M6 f9 s8 L% Y# G5 A
: r1 I- O  }: u
Store(0x0D, DBG8)

) g, R0 J; f% V} * ?7 h- E! ~: p6 D# Y( B8 t
那么问题好像是由读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所致。  X* l' P3 p* j5 M& O" X4 C
那么SCI中断机制是怎样的呢?EC SCICFG register通常将SCI IRQ配置成HLHpulse trigger,而且L的时间通常设置成64us,如下图2所示:
1 s' L* ?. d9 V6 t7 ?) t4 i
! O3 A7 l( u* P- x  |

5 D1 a  s) o% m5 K
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.
  K% O; w& S+ a  e) b7 L( N1 J - |- H" u( g5 G0 C% I& G& T- ?8 [
  • Solution
. J6 U, \; z. o# H! C- {
9 `: ?% D8 ]- U4 ^
经过上面的分析,大概的原因已经清楚了。所以解决问题的方法应该是调整SCI IRQ pulse width,将保持低电平的时间调短,这样就可以有效的避免这条bug。通过这条bug我发现在分析问题的过程中需要理清问题的各个环节,并且对各个环节所涉及到的细节也要深入分析。不能够看到现象就轻易的下结论,更不能想当然,正确的态度是不放过任何蛛丝马迹,大胆假设多方求证!" ~: w# E6 W6 A' B* J. U9 [4 W

5 I* e9 C5 w4 ?' `$ f9 B/ P* y+ j) Y# p1 z

( t- k# ^$ Z% x, F% \$ w* M4 ^( g
" B5 `8 D# D* {% K) fThat’s all!; u: w* b, g5 W6 u3 X
9 m) H1 _  ^1 |6 m& \: ^: s
Peter

本帖子中包含更多资源

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

×
发表于 2009-5-19 18:31:57 | 显示全部楼层
原来如此!!!
% u. O( ~( d8 O2 p0 F' t5 ~) k; P, b, o* g# @8 ?% _/ a
谢谢!
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

好贴

感谢分享!真的很有用,以前我也遇到这个问题,还以为是OS的问题呢!真的好贴啊!
& y5 q. l/ t& v! c" M我看了您的分析代码,好像不是EC的代码吧!我现在就是OS-BIOS-EC三者的关系有点迷糊,版主能否指点一下!谢谢
回复

使用道具 举报

 楼主| 发表于 2009-5-22 07:53:35 | 显示全部楼层
hehe...: o) k# W! F4 b' W( r% J% a
很高心这篇文章能够对你有帮助。' y  G+ \- G8 n$ x: p
上述代码是BIOS中的ASL code,理清OS-BIOS-EC之间的关系的最好途径就是
: g! I2 d- l; O& `2 t0 `  c! n1 qACPI 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都是这样处理的.; }5 U2 y+ O5 z7 o( c
简单来讲就是在中断到来时置flag,后续再处理(DPC).
回复

使用道具 举报

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

感谢回复

谢谢了!刚才我又仔细的查看了一下我的代码!终于找到了!EC死掉的原因了,就是我在上电时序那加了一个类似看门狗的小程序!来保证开机的效率。结果硬件始终有一个S电没有上来才导致我EC死在那里。
1 M) ], G% _9 `! V' c8 v1 @对于您的解释我还是有点迷糊!对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 | 显示全部楼层
文章很精采,分析很透彻!
  p# a! @# W. q; P9 M  M
回复

使用道具 举报

 楼主| 发表于 2009-6-5 11:17:59 | 显示全部楼层
conol你也來這里了+ U5 o& q' {. w+ w
呵呵...
回复

使用道具 举报

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

请教一个关于重启的问题

您好!& W# e1 `2 g/ i+ ^; L( k
     不好意思又打扰你了,我现在遇到一个问题就是在重启电脑时EC为什么会几率性的死掉!在重启的时候我们EC都做什么啊!现在真的有点头痛了!!!
回复

使用道具 举报

 楼主| 发表于 2009-6-10 07:53:53 | 显示全部楼层
之前有追过reboot它的大致过程是这样的:5 S; w0 }  t1 O8 `5 G$ T5 k
1.BIOS发FE给KBC,KBC pull low KBRST#一段时间,然后sb会将init# pin pull low 16个pci clock
. T. \+ Z7 T: H4 x+ jchipset reset pci reset系统重启。
: K' p6 _# X7 e8 u" n2.一旦重启后面的动作看上去正常开机没多少差别,对ec来讲无非是keyboard init、进出idle(update escd)9 h: o0 t7 k. r1 Y# i) v
等等一些琐碎的动作。& {6 B$ b4 u/ D* U4 x* n& @+ K
之前碰到问题比较多的地方就在idle这部分了。
6 \1 q2 M9 V, N7 W/ z, k  H$ m你所说的EC死掉指的是所有的function 都失效吗?keyboard能不能用,hot key能用吗,四秒关机呢...
( G) l' _! l( M- i) t+ V还有如果单台fail几率比较高,建议你接串口debug去看EC死在哪里。
& O, _. o7 T. l# H7 d. d5 K, y以上希望对你有所帮助。
回复

使用道具 举报

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

重启死机

谢谢您的答复!  c7 q" _* ^" [. \) y7 ~
    我在做重启的时候EC是死掉的,四秒不能关机。键盘和热键无效!至于死机的原因真的很难找的。因为串口debug调试的功能我还没有弄呢!
  m, Z3 G* t+ ]     对了您说的BIOS发FE给我们EC应该是通过SCI吧!请指教一下!
回复

使用道具 举报

 楼主| 发表于 2009-6-11 08:15:47 | 显示全部楼层
to zhanghmjm:. P6 o4 f& a% V, \' N
BIOS发FE不是通过SCI,而是透过60h,64h port。
5 ^% v4 n1 {. J9 ?BIOS应该没有办法发SCI给EC,而EC是可以发SCI给BIOS的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:06 , Processed in 1.493013 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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