- 积分
- 7611
- 最后登录
- 2019-10-18
- 精华
- 1
- 阅读权限
- 205
- 主题
- 389
- UID
- 2881599
- 帖子
- 18654
- PB币
- 94497
- 威望
- 24
- 贡献
- 1
- 技术
- 23564
- 活跃
- 2824
求71狐狸尾巴当抱枕......外出南极洲旅游至今未归
- UID
- 2881599
- 帖子
- 18654
- PB币
- 94497
- 贡献
- 1
- 技术
- 23564
- 活跃
- 2824
|
24F
发表于 2016-3-8 18:30:49
IP属地加拿大
|只看该作者
本帖最后由 neycwby09 于 2016-3-8 18:33 编辑
翻了翻以前的旧帖:https://bbs.pcbeta.com/viewthread-1489194-1-1.html 有了点想法:
主要我的dsdt比较奇葩,大家基本都是GFX0而我必须是VGA(而且我的dsdt中也有GFX,用IORegistryExplorer看如果显卡驱动起来就是GFX,没有驱动起来就是VGA),不知道怎么解决,还是用回了aty_init.kext。
我回想起了当年显卡位置在 DSDT 的问题,现在我搞清楚了。所以写了写自己的想法和结论,也算是了却一个一直放不下的疑问。
你的独显 545v 一直都在 Device (P0P2) >> Device (VGA) 下面。
DSDT 里的 Device (GFX0) 是核显,因为你的笔记本跟我的一样都是出厂屏蔽了,所以这个设备不用理会。
DSDT 里也能看出这个名为 GFX0 的设备里不包含任何显示设备。当然这个很正常,因为内屏(LVDS)、VGA 和 DP 接口都直接连接到了独显上,这个也可以从 Device (VGA) 下面有若干 Device (LCD) Device (CRT) Device (HDMI) 设备看出。(LCD 是内屏;CRT 属于模拟输出,在这就属于 VGA 输出;HDMI 属于数字输出,在这就属于 DP 输出)。
关于当时我们第一反应觉得 GFX0 应该是独显,其实这个判断是错误的,属于思维定式了。
设备名只是个名字,真正判断到底是什么设备还是要看所在地址。
DSDT里可以看出 Device (GFX0) 的地址是 0x00020000。- Device (GFX0)
- {
- Name (_ADR, 0x00020000)
- Name (_SUN, One)
- ......
- }
复制代码 而 Device (VGA) 的父级设备或上级设备 Device (P0P2) 的地址是 0x00010000。- Device (P0P2)
- {
- Name (_ADR, 0x00010000)
- ......
- }
复制代码 我查了下 ACPI 规范以及参阅了一些 DSDT,一般地,0x00010000 下接的都是独显,0x00020000 接的都是核显。
除此之外,从你笔记本的 IOReg 里也能看到:
ACPI-Path 即 ACPI 路径处的值为 IOACPIPlane:/_SB/PCI0@0/P0P2@10000/VGA@0
(其中 P0P2@10000 对应的是 P0P2 的地址 0x00010000;VGA@0 对应的是 VGA 的地址 0x0)
- Device (VGA)
- {
- Name (_ADR, Zero) // 地址
- ......
- }
复制代码 综上,通过这些能100%确定独显在并且一直都在 Device (P0P2) >> Device (VGA) 。
那么问题就来了,为什么(上图) IOReg 里显示显卡为 P0P2 下的 GFX@0。
(而且我的dsdt中也有GFX,用IORegistryExplorer看如果显卡驱动起来就是GFX,没有驱动起来就是VGA)
这个 GFX@0 不是 DSDT 里的 Device (GFX0)。这个 GFX 名称是因为 ATY_init.kext 搞的。
我逆向了 ATY_init,发现在驱动加载后的检测硬件过程,有一处逻辑:如果没找到对应的型号,那么就指定默认的 GFX 为名称。当然具体 ATY_init 这段检测逻辑是什么也没细看,但是目测十有八九 IOReg 里显示 GFX 是因为 ATY_init.kext。
所以我稍微调整了 DSDT 的架构。
改动如下:
1. 删除 Device (GFX0) 下的 Method (_DSM, 4, NotSerialized) 函数,因为这个设备是核显,所以给它注入A卡的信息也没什么用。
2. 把 Device (VGA) 从 Scope (_SB.PCI0.P0P2) 这个作用域中移走。直接把这个 VGA 设备放到 Device (PCI0) >> Device (P0P2) 下面。
3. 重命名 Device (VGA) 为 Device (PEGP) 并同时修改其他调用 VGA 设备的地方为 PEGP。
4. 移动 Device (HDAU) 到 Device (P0P2) 下。Device (HDAU) 的位置在层级上永远与对应显卡设备并列。以前的位置(即在 Device (PCI0) 下)是错误的,这也就说明 https://bbs.pcbeta.com/viewthread-1489194-1-1.html 上次搞DSDT HDMI音频输出的时候一直没出来,最后依靠 ATY_init 注入属性了。
以上修改主要是为了规范下 DSDT 的架构,然后规范下命名。
修改后的架构就是这样:- _SB.PCI0.P0P2.HDAU
- _SB.PCI0.P0P2.PEGP
复制代码
至此当年的疑问就解决了。
用这个新的 DSDT,可以考虑搭配 Clover 的 InjectATI=True,FBName=Shrike,LoadVBIOS=True,InjectEDID=True 外加 Clover 自定义 Framebuffer 就可以摆脱 ATY_init.kext 了。还可以试试用 Clover 的 FakeID 功能,把你的显卡仿冒成苹果用的 ATI Mobility Radeon HD 4670(设备ID:0x9490)这样以后就不用再改 AMD4600Controller.kext 了。
(当然仿冒之后预计也无法完美驱动 545v。毕竟 545v 属于 ATI 4500 系列的显卡,苹果在4系上只支持 4600 和 4800 系。硬件所属系列的正确驱动可能不同于苹果本身提供的 4600 系驱动。所以仿冒只是为了摆脱下每次改驱动。)
那么这个唤醒黑屏问题,我不知道你是唤醒死机还是唤醒黑屏但机器还在工作。如果只是唤醒后黑屏,试试接 DP/VGA 看看外屏有无输出。
既然换完 SMBIOS 还没解决,我估计问题可能出在 Framebuffer 上了。
https://bbs.pcbeta.com/viewthread-1489194-1-1.html 当时把内屏的 enc 从 04 改成 00 了。
所以我猜是不是跟这个改动有关系。
首先把 SMBIOS 调成 MacBookPro6,2 ,试试我刚才提到的 Clover 方法看看能否摆脱 ATY_init 来驱动 545v。
然后你可以试试先把 DP 和 VGA 那两行的 FB 全用 00 来屏蔽,这样只剩 LVDS 内屏这一个接口。先试原来的 enc 看看唤醒会不会点亮内屏。如果还黑,试试把内屏的 enc 改成 01(苹果原版 4600 FB 里的 LVDS 就是这样的)然后再改成你后来成功的 00 试试。
根据目前的信息来看,A卡在 OS X 10.11+ 下唤醒黑屏问题主要出现在 6系以及以上的显卡上。5系的目前我没遇到有人说唤醒黑屏的,4系的我觉得更不应该。(虽然我有个最坏的预想是因为你的核显,因为你 DSDT 出现核显设备,有点奇怪。)
所以,如果可以的话,麻烦你上传你原始的 DSDT 和 所有 SSDT。(可以在 Clover 引导界面按 F4 自动提取,提取后的所有原版 ACPI 表在 EFI 分区下的 /EFI/Clover/ACPI/origin/ 下。)
如果条件允许的话,唤醒黑屏后外接有亮的话,麻烦保存唤醒后的 IOREG 和 日志(在控制台>>所有信息 然后菜单另存为)
我找时间再去找找 A卡FB相关的信息,看看有没有类似的案例。
新的 DSDT:
对了,忘了件事,你的 Clover config.plist 里启动参数加了 npci=0x2000 这个是必须要加的吗?如果不是的话,最好去掉,这个参数有时候很耽误事。
|
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
|