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

[原创]IGD Display Switch

[复制链接]
发表于 2009-12-27 13:52:30 | 显示全部楼层 |阅读模式
IGD Display Switch

! A! v, b) m: ~/ o4 T
- [; G8 k( B; [: U# o; L
1. Introduction
6 o9 A4 I3 E  v! Z7 o! Z/ P+ w& s: }0 m$ b
IGD OpRegionintel为了改善传统的Integrated Graphics DriverBIOS之间的通信机制即SMIINT10存在的缺陷(SMM mode有可能会影响OS的稳定性,Int 10则有可能受限于OS),而引入的一种新的接口。它使用SCI取代传统的SMI机制,取其精华,去其糟粕。
: P  L8 w3 x* p4 [OpRegion被加载时BIOS会透过GMCHASLS register写入OpRegionbase addressOpRegionMemory layout如下图1所示:2 W1 q4 z! \5 i+ g$ N3 C
4 }' h& F, N6 j: _
IGD1.JPG                      " a! b7 I9 _# |9 |4 K$ l  Z4 o. R
                          1* m2 g: ]6 X! {& Y8 k2 o
OpRegionSystem BIOSDriver之间交流信息的重要手段,而且我们也可以在OS下透过ASLS这个register,获取OpRegion空间的信息,进而可以用于Debug Graphics driverSystem BIOS之间co-work的一些问题。
# c+ @( E3 ?3 D/ y& Y7 P) Z& p
- d% ~, j' y. @, N1 x1 t# ~2. Mailbox#1 About Display Switch
( ]( K+ C9 \+ ~0 K' G8 w/ O
3 `! c6 j5 m! {5 K7 p
Mailbox#1被称之为Public ACPI Methods Mailbox,它包括一堆成员变量,这些变量有些是必须实现的有些则是可选的。它的layout如下图2所示:

9 k0 x8 X' X# D0 k
* k$ j. e. H9 g- j* Z

; U0 j, g4 A0 n4 D. k: z* x IGD2.JPG
2 u: t9 ~- q: k" e4 w
2

8 d3 X! b4 E& c+ P5 H
其中与切屏相关的变量有如下几个:
- K5 x% d) K6 C7 K" V: e
0x120h DIDL

6 d, H/ j9 }; g2 @4 {1 f% c. L
0x140h CPDL

; G0 U" Q9 {( ^
0x160h CADL

* Z2 S1 u4 k, ?7 t3 n, F
0x180h NADL

# _* g/ ]( B% s8 V- P# R
0x1A4h TIDX

+ m" h6 n* T$ v; @' P1 j: S
DIDL表示该平台所支持的显示设备列表,最多支持8个设备。Graphics Driver在初始化的会call _DOD method获得所有的支持的设备列表。

1 X' u) w% _' _; W! k6 c7 d' Q
CPDL表示当前接在VGA上的所有设备。Graphics Driverdetect当前连接的设备,每当hotplugremove时,drvier都会重新detect设备,并将detect的结果写入CPDL,而且该位置对BIOS是只读的(RO)。在Hotkey切屏时video driver会使用CPDL中的device列表去call对应device_DGS function用于决定下一轮的显示设备列表。

6 j& T' f8 i8 t' O8 _
CADL表示当前正在使用的设备ID,在启动和模式切换期间driver都会更新这个位置。BIOS也是只能读取该位置(RO)BIOS可以使用这个位置的值去支援
1 E' f4 F: \3 r. c4 k- B
8 k: V: N3 O, O1 W; J9 ]8 H, S
_DCS Function

$ k3 ~7 U, \% J! u0 j
NADL表示当hotkey按下时,driver需要切换到的另一个模式。它的值取决于
% ^3 ?) g( ]0 E& i* w% x
VBIOS中的toggle list table。在HotKey切屏时_DGS function会根据NADL中的device列表决定下一轮的显示顺序。

$ m$ d0 J9 @6 y( g5 i0 c
TIDX 表示VBIOS中的toggle table index,BIOS可以动态的更新该index值。
$ ^& d) }* x8 O, H2 i
Video driver通过该index决定下一组显示设备的列表。该table存放于VBIOS之中,最多支持4组。OEM端可以通过需要VBIOS改变显示的顺序。

* G  \7 a( @; O. J9 O# H. G3. ACPI Extensions For Display Adapters
3 c, E* V0 t+ c4 p' Y
5 u9 K4 {2 P* T- H另外一个与切屏密切相关的部分就是ACPI 中有关显示部分的扩展部分,这个部分主要是一下几个function
( v5 {% I9 t0 G" ]6 @2 O_DOD function Graphics Driver会在初始化时会callfunciton获取该平台所支持的所有的device id。在windows xpDebug发现如果使用hotkey切屏时,每次按下hotkeyGraphics Driver都会call一次该function。该function返回的数据格式如下图所示:* o( U: v& \% E) H( |, i5 W- y9 o( r

/ P. ~1 k4 N2 v2 F
IGD6.JPG

/ C- J. ~" K, ~! E/ T) f9 V/ D6 W3 K6 {

/ c- r. x7 ^2 I3 y% o2 z! ?+ m6 M$ c" v& R: [8 [. k
3
/ E& d* ~7 z+ y7 g5 v7 O$ y* c
_ADR 用于返回设备的唯一的ID; l9 r8 I3 S# `9 ]
_DCS function用于返回当前device的状态,windows xp下面debug发现
8 t- U' V2 `4 d' a  nfunction并不会被call

  B5 E( @4 R' _8 S_DGS function用于在支持hotkey display switch时,查询输出下一轮输出设备的显示状态。所支持的状态有下述两种:# M6 E4 t0 e  j9 ~9 W2 q

' U$ V1 L, l; K5 I; o
IGD3.JPG
3 l: E( I5 b& ^5 `1 ~" [
4
+ p1 w1 k! a0 k! j/ d0 q: g8 \- M3 Q
_DOS function用于决定是否支持输出设备切换。
% @; H9 Z8 d( t. q' A0 G5 u_DSS 当设备的显示状态已经确定之后,OSPMcallfunction。该函数会带一个参数用于决定设备的输出状态,参数的格式如下图4所示:+ }0 P$ y# k0 O$ R9 \5 L! A
; F8 t2 b  s7 |9 O' i9 i$ h
IGD4.JPG

; f- r- a# Q- K! e# f  `8 C
5
+ `; q6 o  `7 D# E  O
( L. i' r4 u2 l/ c* s8 h8 d7 R
4. Hot Key display switch Process
6 Z1 |3 Z3 S% {- P0 ^& {
# G; j1 l2 u! @& t# H有了以上的介绍,我们来看看按下hotkey之后设备显示顺序的完整过程。<<Intel Integrated Graphics Driver OpRegion specification>>display switch有非常完整的流程,我将按照这份流程并结合asl code的实际状况做些说明。$ G: O  h5 G, d7 N! ~+ g3 J
1 X) @$ ^1 E, t: }
IGD5.JPG
7 I# j, ~2 c3 D8 ]' Z" b
2 z( y0 D; P/ k8 T% C, _$ s+ e+ Q; D/ W2 E
6
0 ^; v5 `( _- `" f
当我们按下hotkey时,EC会透过Q_EVENT通知BIOSBIOS收到该Q_EVENT后会call IGD.GHDS() functionGHDScall GNOT function,而GNOT最终会call Notify(VGA,0x00)去扫出所有的显示设备,这时_DOS=0会被调用表示始能切屏的功能;然后再call Notify(VGA,0x80)去做切屏的动作。在win xp & 2k下,_DOS=2将会被调用到,表示暂时禁用掉切屏功能(因为现在正在切屏),接下来是然后BIOS会透过_DOD获得支持的所有device idcall对应CPDL 对应的device _ADR fucntion 获得该device的唯一的ID。然后会call _DOS设置输出设备切换始能,下来会用OpRegion中的NADScall _DGS用于决定下一组显示组合。最后再call _DSS确定显示组合,再后来就是Graphics Driver sets new mode
' A) i2 @) S1 B8 @, Z- K; J以上就是Hotkey display switch的大致过程,希望能够对大家理解IGD Driver Hotkey的处理过程有所帮助。: d# ^8 {- {" |8 L: b
参考资料:
$ U. b% o8 e% F6 E6 s- m& i- @( N1. ACPI SPEC 4.0
- S( Z6 {0 N: t. K" j' f) N- y) V2. Intel IGD OpRegion spec 1.0
2 ]- s2 j. W0 l8 I+ _) |. l( C8 U: Y' q5 r5 _6 u
Peter
2 F* Y2 [6 X, p2009-11-22
发表于 2009-12-27 19:38:09 | 显示全部楼层
看来你在Insyde学到不少啊
回复

使用道具 举报

发表于 2009-12-28 19:07:26 | 显示全部楼层
謝謝分享,學習一下。
回复

使用道具 举报

发表于 2010-2-22 17:37:38 | 显示全部楼层

回复 1# peterhu 的帖子

不错,总结的很好。刚开始接触mailbox的时候也花了很多时间看code去了解每个box有什么用: _9 f7 c! j4 R' o- C0 u5 h% v/ z
但是楼主提到的只是WinXP而已,到Win7就基本用不上那些mailbox了,而且在Win7下还跟regedit上的一个feature扯上关系了,具体也不是很清楚,希望楼主能够研究分享一下
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 15:30 , Processed in 0.153961 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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