IGD Display Switch : @7 d) {: d3 ~# A5 O4 z: E
0 Z% M" x' _) r1. Introduction
6 k1 E3 w6 V `" l0 C8 {& S+ t2 t/ H- Z" C
IGD OpRegion是intel为了改善传统的Integrated Graphics Driver和BIOS之间的通信机制即SMI、INT10存在的缺陷(SMM mode有可能会影响OS的稳定性,Int 10则有可能受限于OS),而引入的一种新的接口。它使用SCI取代传统的SMI机制,取其精华,去其糟粕。7 B. K9 m( ?9 j: v
OpRegion被加载时BIOS会透过GMCH的ASLS register写入OpRegion的base address。OpRegion的Memory layout如下图1所示:
! g2 s0 k' B$ V7 e! h: p
0 i C! h. L* W9 k: f2 {
$ j, }# R H# I7 x+ p" O( z% a* `. G
图1
3 T. ~3 N5 ^2 G4 N' x" JOpRegion是System BIOS和Driver之间交流信息的重要手段,而且我们也可以在OS下透过ASLS这个register,获取OpRegion空间的信息,进而可以用于Debug Graphics driver和System BIOS之间co-work的一些问题。
! G+ z6 \8 S, E; W
! R1 X) H9 I4 y2. Mailbox#1 About Display Switch 3 s6 s6 P. W" a* q& [
; A+ i9 L" i0 F) @: oMailbox#1被称之为Public ACPI Methods Mailbox,它包括一堆成员变量,这些变量有些是必须实现的有些则是可选的。它的layout如下图2所示:
% v. t9 f; o5 }# D* c! m5 `' k$ s4 c& i8 c/ a
7 _* L1 [& ~. t
4 M+ i4 E+ O' E, k. F( f图2 $ b: j2 {! ~/ M2 L5 Z k
其中与切屏相关的变量有如下几个:
% X( g. f, y/ E. Z) k- r0x120h DIDL
7 {; W y- k9 p3 U/ h0x140h CPDL
- @! c9 `9 B Q& Z( L4 b0x160h CADL
9 E# N8 ]4 W- }, Y7 t- o- w0 B8 [0x180h NADL
6 ~7 D! t* Z) o/ P6 J2 i+ \7 s0x1A4h TIDX ( C& t" a" r! U9 ]
DIDL表示该平台所支持的显示设备列表,最多支持8个设备。Graphics Driver在初始化的会call _DOD method获得所有的支持的设备列表。
5 Z/ p; @# K5 q9 Y9 M2 a' n0 fCPDL表示当前接在VGA上的所有设备。Graphics Driver会detect当前连接的设备,每当hotplug、remove时,drvier都会重新detect设备,并将detect的结果写入CPDL,而且该位置对BIOS是只读的(RO)。在Hotkey切屏时video driver会使用CPDL中的device列表去call对应device的_DGS function用于决定下一轮的显示设备列表。
: N7 Y) p" U7 o7 O0 s! a2 {CADL表示当前正在使用的设备ID,在启动和模式切换期间driver都会更新这个位置。BIOS也是只能读取该位置(RO)。BIOS可以使用这个位置的值去支援 3 l, M. }7 u, T3 u q8 ?
, f7 g! `; _/ p/ w( x_DCS Function。
- m, W! |3 I/ c/ g4 v3 yNADL表示当hotkey按下时,driver需要切换到的另一个模式。它的值取决于 ) w2 l; J7 _# G
VBIOS中的toggle list table。在HotKey切屏时_DGS function会根据NADL中的device列表决定下一轮的显示顺序。
; f4 Z9 h* n+ W& I, T3 Z1 PTIDX 表示VBIOS中的toggle table index,BIOS可以动态的更新该index值。
" e# E" n9 z" O5 N( oVideo driver通过该index决定下一组显示设备的列表。该table存放于VBIOS之中,最多支持4组。OEM端可以通过需要VBIOS改变显示的顺序。
, y) X$ E/ G8 v9 U" U8 P" B% \3. ACPI Extensions For Display Adapters
* I7 U1 ?2 ~' F& r# [8 y
3 j% c% X5 G0 K" H% M, z另外一个与切屏密切相关的部分就是ACPI 中有关显示部分的扩展部分,这个部分主要是一下几个function:3 C) I( c1 N6 l+ M+ _: h" j
_DOD 该function Graphics Driver会在初始化时会call该funciton获取该平台所支持的所有的device id。在windows xp下Debug发现如果使用hotkey切屏时,每次按下hotkey,Graphics Driver都会call一次该function。该function返回的数据格式如下图所示:
# Y. f4 W/ C+ l: h5 ^' _8 a( _) \3 S- D" F$ q# I
& d" }. s3 k1 `- w2 d0 f4 P
1 |. F/ d2 k3 C% U- V
0 M( H3 A) \7 O- f/ }2 H8 b* d图 3
, ~( o1 C; \, ~3 q U_ADR 用于返回设备的唯一的ID。
. ?6 ?. n% @6 r# {_DCS 该function用于返回当前device的状态,windows xp下面debug发现
" |1 L/ q4 B$ L2 \2 x7 U$ L* l: N该function并不会被call。' u3 K( }0 U2 ~0 h1 C
_DGS 该function用于在支持hotkey display switch时,查询输出下一轮输出设备的显示状态。所支持的状态有下述两种:8 K/ [% V u' w- b) O0 R
T4 H, s4 C/ X$ d) g! Z4 i7 u
6 N& k+ U ?' V7 o+ q+ X" d" v7 E图 4
. \$ h r- ^# K) X+ N6 l_DOS 该function用于决定是否支持输出设备切换。% p- p% s" F# {# e
_DSS 当设备的显示状态已经确定之后,OSPM会call该function。该函数会带一个参数用于决定设备的输出状态,参数的格式如下图4所示:
* S2 [2 E, @. g' J- j
: S, r, f9 ]" `* u+ L0 Q- q$ g
( n7 s, W" h% y$ ~3 I图 5
) u% v- l- ^$ v# e' N4 R# I1 E7 R( x2 [' f& p/ q7 [
4. Hot Key display switch Process4 W& P8 s8 Y9 Q4 ^1 |6 L
3 m6 w/ e% g9 J- b- V& J) O9 P有了以上的介绍,我们来看看按下hotkey之后设备显示顺序的完整过程。<<Intel Integrated Graphics Driver OpRegion specification>>对display switch有非常完整的流程,我将按照这份流程并结合asl code的实际状况做些说明。8 z! s1 L" ]. C8 m
/ Y% y7 |* N! F1 d' ^& ?8 H
5 Z5 Q1 L; Y; F) |$ u
1 X _9 d7 G" b: J: i6 D' K图 6 / U, V( n: w) O* m9 P+ r" _6 X
当我们按下hotkey时,EC会透过Q_EVENT通知BIOS,BIOS收到该Q_EVENT后会call IGD.GHDS() function,GHDS会call GNOT function,而GNOT最终会call Notify(VGA,0x00)去扫出所有的显示设备,这时_DOS=0会被调用表示始能切屏的功能;然后再call Notify(VGA,0x80)去做切屏的动作。在win xp & 2k下,_DOS=2将会被调用到,表示暂时禁用掉切屏功能(因为现在正在切屏),接下来是然后BIOS会透过_DOD获得支持的所有device id,call对应CPDL 对应的device的 _ADR fucntion 获得该device的唯一的ID。然后会call _DOS设置输出设备切换始能,下来会用OpRegion中的NADS去call _DGS用于决定下一组显示组合。最后再call _DSS确定显示组合,再后来就是Graphics Driver sets new mode。
- A4 ~. @3 b/ g& p* O) G以上就是Hotkey display switch的大致过程,希望能够对大家理解IGD Driver Hotkey的处理过程有所帮助。* s/ l' H' g+ X0 t9 S
参考资料:& s9 j7 a( p( Y' W! O, d2 H
1. 《ACPI SPEC 4.0》0 K+ L% l' Z% {5 a
2. 《Intel IGD OpRegion spec 1.0》
5 w$ |# i4 q1 g3 T, m% T
1 N8 k0 f& P- x, s2 X( A& fPeter5 Z$ j4 s2 U* ]
2009-11-22 |