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

[原创]AC In/Out OS Slow Response

[复制链接]
发表于 2009-5-19 08:11:52 | 显示全部楼层 |阅读模式
AC In/Out OS Slow Response

/ ^$ Z) L( V' E' O7 {6 A
  • Phenomenon3 p# J. W( Z! _

& r# {- T, X/ C8 s手上一个超薄NB的案子DQA报了这样一条bug:频繁的插拔ACvista右下角的power icon有时反应很慢,AC插拔过后有时需要等几秒或十几秒才发现power icon有变化。Power icon指的是下图红色圆圈标出的部分:
7 [& }( X% D- L0 x' i
1
  • Why???
    , M$ v; d6 u& X' @& v3 g; P

0 {" H: p5 l& b3 B. o- \& [) v  d" W6 z
/ {" D- @' e# {2 Z3 x- E
刚看到这条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 如下述所示:
) `+ G, m$ G' ^1 w# e/ w
// AC Change event
) Y/ K! v* b2 x1 D$ I6 F: B9 D& {  T* M& p, ~
Method(_QXX)
; |7 q  a8 I: z3 P; s

! ]+ o$ @3 f9 ]" F{

; G+ j! Z2 X+ Z. ?0 J
1 g1 m/ V1 r- p3 fStore(0x09, DBG8)

/ a+ X" ~. D0 L3 p1 O7 h
$ l! _6 i( ]# Y, A" j) qNotify(\_SB. ADP,0x80)
0 }* ]2 w4 A( j0 W//Power Source status changed
8 `0 [& A6 w) b" i* e9 W

* ]  P: H# q3 m3 _. xStore(0x0A, DBG8)

" q2 W* g9 C; L  [
8 v, |; |' x; E, ^# Z7 H" P& K4 ]: a5 d7 U! B1 N
}

" w9 I5 B) w& E0 v  r9 n! K( ]3 l  z  F! m" K

$ L* V( Y: y9 O, ^# v9 a6 _7 _4 H* n, D% ^- ?1 z
Method(_PSR,0)( y( Z  u1 V0 g3 [* g0 E
6 B7 R/ p4 a- Y- L9 h: ]
" E2 k# F- }3 j
{
5 ]: D4 O4 Q; {9 }  L, x

, E. Z1 H4 q% a; O4 j0 S* m9 L" z$ s: }
7 b% k* |" \! b  LStore(0x0B, DBG8)
& ]2 m8 X" \3 Y, |$ z) |

+ I. M3 k+ b' ^  A
: k4 N2 N6 i6 u& {0 oIf(ACST)
2 h- k% S  m8 |9 g9 N! D+ V//check AC status
) A: y, Z/ i, E+ k; `

, ?/ I6 O; e' n& W4 U{
( t. e# i: ?) b) l6 m) k
* P4 V. @5 i* W$ m$ i) R) T. K- M
0 ?2 @" c& z* y7 u+ h, m4 ^
return(One)
6 Y: _. ~1 B/ c4 w: i2 Y3 x! s+ t// AC Present

& t: l1 T. H: W- w" f5 j9 p. P- G6 D+ h0 ^/ u4 f3 D3 S
}
, \( L' q+ F4 o6 U! j4 u

. R# U) H; |7 T5 K9 m, {& L, Oelse
% o: g* R5 P2 z$ X+ |

2 Q& u4 U+ w, }. ?  ?: I' T& `{
* J, y# O9 s8 b/ M' Q4 _  @
& Q9 H* b4 ]$ p5 q" ^  d1 b
return(Zero)
: B, @0 t& ~: o1 \// AC Not Present
" c. o) ^5 i6 H1 U( m0 [  I

1 r8 ~9 T2 Y6 a3 ]}
' T2 O3 g7 q' s. u7 I! c; Q& n8 c

2 n2 K" H% c6 R4 I1 S  i) mStore(0x0C, DBG8)

0 a; m. z* e3 a7 v2 j
# ^* b% X) R: I8 B3 q" E0 n}7 b  v9 X, {3 g( {0 R! b2 o
; n$ Q5 @/ N% E5 Q' g8 [4 r

& @2 I: ^$ O. u" j! N! V7 w我能猜到的大概的流程应该就是这样了。那我们就从头开始追,先在AC change qevent中抛点,可是发现AC change对应的_Q method反应很快,一旦AC in/out debug card马上就会有显示。那么说明什么呢?跟EC没有关系吗?接着抛,又发现有时停在’0x0A’比较久才会出现,有时’0x0C’比较久。
7 F& e& P/ {3 |4 F3 A状况不太一致;没感觉就把网撒大点,在几乎所有的ACPI method中都抛上点然后再try,试了几个回合以后有感觉了,我们发现一旦现象出现在Device Battery _BST method中停的久的几率非常高,也就是说AC in/out OS还会更新battery的信息。这段代码最明显的特征就是它会从EC ram中获取非常多的电池信息,sample code如下所示:  @+ P7 O  c: I- e% P
Method(_BST)$ ]4 i' l( Y) n" K# Y5 V7 U1 ^
{
$ z6 V6 I# m3 j. Y
2 s/ Y" B- B, FStore(BSTS,Local0)
# p0 n0 \. s1 f/ _4 H( Z
% j# y, i" `: O! E" F; |( q1 p  B9 ^
9 x; b0 T  m7 c2 ^4 l# |
If(LEqual(Local0,1)) //Check Battery Present Bit
) ?6 _4 p$ _' d1 L. B& T  O
: O# \, Z& D9 C" F  J
{
2 G, }" c* q  ~- p& G& A; h4 d  Y7 _& A) y' o
7 J0 ]' W' W+ w+ e3 _* p

% B1 D5 G& g* v
# k& I, s* c5 X" J- f6 l9 ~8 z4 ~9 d3 G8 G' _
//Read Battery information from EC
$ H! n) @) N, _+ U' I6 A" g

% e5 o! u5 W9 M$ k) w4 S- r+ C… …

2 S! ~6 |: Q- z- @4 {+ d3 n
" j/ v0 J1 S7 h* C; c" w
3 m, M8 j2 u: Z; m}

3 X$ {: M0 @$ T0 m, U5 q
- ]& D8 ]1 M- @- p$ QStore(0x0D, DBG8)

& e# \: B7 [# C  @1 [}
$ Q, E5 }5 Q( b: T" |& _0 e5 l那么问题好像是由读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所致。% L5 V. M# `' A9 e; q
那么SCI中断机制是怎样的呢?EC SCICFG register通常将SCI IRQ配置成HLHpulse trigger,而且L的时间通常设置成64us,如下图2所示:

- _# Z& ?, F, C& a* W! m. w8 L
- Q2 A! S& D$ z$ }) W

0 {* {$ W/ t9 i& M. ]+ ^2 M6 s& 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.3 L* b) H* r  m+ h( ~6 o& v( |

# o* h" ]1 M: q8 R  x: u
  • Solution

0 F% A, S9 {8 I1 ?7 r) D  ^9 |  M7 p
经过上面的分析,大概的原因已经清楚了。所以解决问题的方法应该是调整SCI IRQ pulse width,将保持低电平的时间调短,这样就可以有效的避免这条bug。通过这条bug我发现在分析问题的过程中需要理清问题的各个环节,并且对各个环节所涉及到的细节也要深入分析。不能够看到现象就轻易的下结论,更不能想当然,正确的态度是不放过任何蛛丝马迹,大胆假设多方求证!; a* ~3 d9 |" t5 P9 F

: ^0 x* M) B  p5 h
/ r: f* q0 H$ z! N, Z+ t) o) s

( ^' V# h7 I) E ' @, d2 u" x8 u. b" Y- `( S
That’s all!1 A( @  Z- Q, o  Y( o# O

; k% r3 @* F1 I. a8 wPeter

本帖子中包含更多资源

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

×
发表于 2009-5-19 18:31:57 | 显示全部楼层
原来如此!!!- v- E( y. t9 u3 E' S
) b! |4 u1 H7 R$ f  O
谢谢!
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

好贴

感谢分享!真的很有用,以前我也遇到这个问题,还以为是OS的问题呢!真的好贴啊!. W+ K* L& d' [
我看了您的分析代码,好像不是EC的代码吧!我现在就是OS-BIOS-EC三者的关系有点迷糊,版主能否指点一下!谢谢
回复

使用道具 举报

 楼主| 发表于 2009-5-22 07:53:35 | 显示全部楼层
hehe...) j0 P0 V; f; f: }
很高心这篇文章能够对你有帮助。
* E4 N5 P, A+ W* n# I" f  f: a2 z上述代码是BIOS中的ASL code,理清OS-BIOS-EC之间的关系的最好途径就是: d+ M/ H" C9 g1 _  e) n+ ^
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都是这样处理的.- k+ a+ R2 g1 i# ?8 [
简单来讲就是在中断到来时置flag,后续再处理(DPC).
回复

使用道具 举报

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

感谢回复

谢谢了!刚才我又仔细的查看了一下我的代码!终于找到了!EC死掉的原因了,就是我在上电时序那加了一个类似看门狗的小程序!来保证开机的效率。结果硬件始终有一个S电没有上来才导致我EC死在那里。( M) s2 T3 a4 z: z2 N
对于您的解释我还是有点迷糊!对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 | 显示全部楼层
文章很精采,分析很透彻!# F4 M' X/ u* V, b
回复

使用道具 举报

 楼主| 发表于 2009-6-5 11:17:59 | 显示全部楼层
conol你也來這里了4 [; @; p; z7 Y* [5 x/ `$ y5 O# g1 B
呵呵...
回复

使用道具 举报

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

请教一个关于重启的问题

您好!
  f' f' \% e$ j  n3 E     不好意思又打扰你了,我现在遇到一个问题就是在重启电脑时EC为什么会几率性的死掉!在重启的时候我们EC都做什么啊!现在真的有点头痛了!!!
回复

使用道具 举报

 楼主| 发表于 2009-6-10 07:53:53 | 显示全部楼层
之前有追过reboot它的大致过程是这样的:, f2 r7 H+ E5 _
1.BIOS发FE给KBC,KBC pull low KBRST#一段时间,然后sb会将init# pin pull low 16个pci clock1 d) o! P5 Z% P4 x
chipset reset pci reset系统重启。0 r& ]$ J: V. k. ^$ _- K" O! W# O
2.一旦重启后面的动作看上去正常开机没多少差别,对ec来讲无非是keyboard init、进出idle(update escd)
' l( i; Y- @4 c$ D6 _$ M( \- {; ]等等一些琐碎的动作。& w. _! {/ ~) e+ y
之前碰到问题比较多的地方就在idle这部分了。5 c& z; w, ?% J$ E
你所说的EC死掉指的是所有的function 都失效吗?keyboard能不能用,hot key能用吗,四秒关机呢...: B' u% K6 h9 }. J/ u
还有如果单台fail几率比较高,建议你接串口debug去看EC死在哪里。
* _. ~" C. W4 f: |$ U以上希望对你有所帮助。
回复

使用道具 举报

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

重启死机

谢谢您的答复!) T  G5 c. _/ K! t/ r3 R& S, E' ~8 }
    我在做重启的时候EC是死掉的,四秒不能关机。键盘和热键无效!至于死机的原因真的很难找的。因为串口debug调试的功能我还没有弄呢!8 e- V' l; K; O; w# ^
     对了您说的BIOS发FE给我们EC应该是通过SCI吧!请指教一下!
回复

使用道具 举报

 楼主| 发表于 2009-6-11 08:15:47 | 显示全部楼层
to zhanghmjm:' B: {1 `, B1 E3 \: B
BIOS发FE不是通过SCI,而是透过60h,64h port。& c! s8 c, S6 O! `% j' z" z
BIOS应该没有办法发SCI给EC,而EC是可以发SCI给BIOS的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 04:09 , Processed in 0.068875 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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