IGD Display Switch
1 Q; H' }2 C M
) X4 g# S6 r; q4 E c& q: O7 ]1. Introduction
4 o) `8 l' q" u9 g& D: I7 X" {6 _9 d$ ?3 i, K
IGD OpRegion是intel为了改善传统的Integrated Graphics Driver和BIOS之间的通信机制即SMI、INT10存在的缺陷(SMM mode有可能会影响OS的稳定性,Int 10则有可能受限于OS),而引入的一种新的接口。它使用SCI取代传统的SMI机制,取其精华,去其糟粕。" n, [; r8 n' I K
OpRegion被加载时BIOS会透过GMCH的ASLS register写入OpRegion的base address。OpRegion的Memory layout如下图1所示:5 m% ]; S7 Z, f7 {" |5 R
% W( X1 T3 Z+ S! A" q( `' D: D, p# X
* S3 ^7 w# D1 k& Q$ F
图1" j$ q3 D" @* E$ C2 b
OpRegion是System BIOS和Driver之间交流信息的重要手段,而且我们也可以在OS下透过ASLS这个register,获取OpRegion空间的信息,进而可以用于Debug Graphics driver和System BIOS之间co-work的一些问题。: s) H$ \7 |( v& M3 O
6 ?- [& ^- g- Z, {8 t
2. Mailbox#1 About Display Switch
# R5 s, D& q" h& `& a& K" J1 C. a5 D6 {9 V& m* l- `
Mailbox#1被称之为Public ACPI Methods Mailbox,它包括一堆成员变量,这些变量有些是必须实现的有些则是可选的。它的layout如下图2所示:- z( x& S! Y; Y7 c3 D) S8 ~0 \( w
& x+ ~; i1 ^# u0 W- N( }8 _
$ a+ Q7 Y9 \! d$ F2 V. X: n
+ Q6 y; n6 N. t% W& `" @* K4 H
图2 : }9 m) \! e% g" H& [
其中与切屏相关的变量有如下几个: 6 m- w% F: S: K) f" d; _. G' ?
0x120h DIDL . E- M' `* @- A
0x140h CPDL 7 y* v0 f( Y5 A# a
0x160h CADL
. |* e* I, L' p& ^$ \5 V0x180h NADL ( x; h% ^9 o# ]- [7 Z
0x1A4h TIDX 8 Z* W' U2 D0 C2 K% M1 {/ j @
DIDL表示该平台所支持的显示设备列表,最多支持8个设备。Graphics Driver在初始化的会call _DOD method获得所有的支持的设备列表。 1 E1 B% ]4 J! B: Q5 P
CPDL表示当前接在VGA上的所有设备。Graphics Driver会detect当前连接的设备,每当hotplug、remove时,drvier都会重新detect设备,并将detect的结果写入CPDL,而且该位置对BIOS是只读的(RO)。在Hotkey切屏时video driver会使用CPDL中的device列表去call对应device的_DGS function用于决定下一轮的显示设备列表。 0 |4 B$ t3 h. Z0 @) q& J
CADL表示当前正在使用的设备ID,在启动和模式切换期间driver都会更新这个位置。BIOS也是只能读取该位置(RO)。BIOS可以使用这个位置的值去支援
) H3 Y4 {% u1 d3 g$ s$ d# n. l h' N: u% t- I
_DCS Function。 + z- f, ~" F8 I5 d3 O, T
NADL表示当hotkey按下时,driver需要切换到的另一个模式。它的值取决于
2 `# e9 g9 d$ YVBIOS中的toggle list table。在HotKey切屏时_DGS function会根据NADL中的device列表决定下一轮的显示顺序。
: f$ |( ?* I! c2 N& B7 i. ?TIDX 表示VBIOS中的toggle table index,BIOS可以动态的更新该index值。
8 b" r3 h |/ k0 R( n% pVideo driver通过该index决定下一组显示设备的列表。该table存放于VBIOS之中,最多支持4组。OEM端可以通过需要VBIOS改变显示的顺序。
P$ b9 O& o4 |6 C" Y) N3. ACPI Extensions For Display Adapters
/ z2 f* d; r- d' X5 s
1 ]/ Q# N3 d9 S9 d' ?另外一个与切屏密切相关的部分就是ACPI 中有关显示部分的扩展部分,这个部分主要是一下几个function:
( U' X& }$ w) a2 e0 s3 S; k; a. I9 r_DOD 该function Graphics Driver会在初始化时会call该funciton获取该平台所支持的所有的device id。在windows xp下Debug发现如果使用hotkey切屏时,每次按下hotkey,Graphics Driver都会call一次该function。该function返回的数据格式如下图所示:, X/ X9 V" _8 d' l4 L4 S" L- |
% U/ Q7 k, |/ Q8 E. }5 `
" q; |8 O& T) x5 P8 N* q4 O! T, e! U, Y) U$ v9 z
! ^1 H* \" P0 [/ M
图 3 : |* S) N4 W) X/ _% m) L8 o
_ADR 用于返回设备的唯一的ID。
; j1 Z2 a, e6 L% z* N4 a; K_DCS 该function用于返回当前device的状态,windows xp下面debug发现
3 o, i' c; }: j# p该function并不会被call。
k O7 t( N; N" Y- c) c$ Z_DGS 该function用于在支持hotkey display switch时,查询输出下一轮输出设备的显示状态。所支持的状态有下述两种:
3 w8 f+ f, K& i% G; W4 X8 u) E3 s* k( V8 a( ]6 ?( v
" i* q( Z/ Y% }; v' X9 k/ s$ S% _图 4 ; u, V/ D( a& S9 t' E
_DOS 该function用于决定是否支持输出设备切换。
, ~$ o" f1 {- R& ^( {; S2 T_DSS 当设备的显示状态已经确定之后,OSPM会call该function。该函数会带一个参数用于决定设备的输出状态,参数的格式如下图4所示:
8 G! y! _, [# A6 Q0 m/ F
8 J* q2 G$ E% F9 P% z. |5 H5 ]) V* A r6 V$ U4 j5 P( s
图 5
, V# ?" o0 S6 m# ]7 ~" x9 w9 d- L
4. Hot Key display switch Process# A5 n! g* ^# O" Y+ U# Y% \1 x
( | i$ b4 |1 o: j6 X! C' z* D有了以上的介绍,我们来看看按下hotkey之后设备显示顺序的完整过程。<<Intel Integrated Graphics Driver OpRegion specification>>对display switch有非常完整的流程,我将按照这份流程并结合asl code的实际状况做些说明。! }# Z! t2 m( u2 \6 N+ s
* C8 j9 Y/ O+ p! b) [& h: Q
7 o% R5 [ M' D1 K
* Y6 r* W9 z f$ ~2 r9 Y( q& V5 w; i
图 6
( e& c( v& g5 ?, b当我们按下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。
3 M4 g/ A r+ A5 B以上就是Hotkey display switch的大致过程,希望能够对大家理解IGD Driver Hotkey的处理过程有所帮助。
% X1 E2 l* o& i参考资料:
" e" @4 p1 D( F- \/ H0 w0 [1. 《ACPI SPEC 4.0》
0 [- ^, {7 N) k1 L% \2. 《Intel IGD OpRegion spec 1.0》
0 E% f: a: n. H( w. a$ W2 ` V; |" v6 y# e! d) Q4 R( Z: u
Peter
5 B+ i7 G- l2 ?" T2009-11-22 |