- 积分
- 24
- 最后登录
- 2018-8-9
- 精华
- 0
- 阅读权限
- 10
- 主题
- 5
- UID
- 1179079
- 帖子
- 59
- PB币
- 107
- 威望
- 0
- 贡献
- 0
- 技术
- 5
- 活跃
- 84
- UID
- 1179079
- 帖子
- 59
- PB币
- 107
- 贡献
- 0
- 技术
- 5
- 活跃
- 84
|
发表于 2018-4-15 16:55:50
IP属地河南
|显示全部楼层
2018.3.27 补充: 测试了一段时间,分享一下显卡方面的折腾过程,第三步,完善显卡:
扒了大量的帖子,国内的,国外的,按上面的方法,有关EC的,有关_REG的,都尝试过了,但是都不能成功,最后尝试了把有关PEG0的SSDT-4整合到了DSDT中才成功把该死的独显屏蔽掉。虽然目的是屏蔽独显,但是强迫症的我还是选择了保留SSDT-4,放弃屏蔽它了,因为我对比发现,电池的耗电并没那么不可接受。这里我只分享整合SSDT-4到DSDT的过程吧。屏蔽独显的原理是在开机图形初始化时调用有关独显的~~PEG0.PEGP(有的机子名称不一样)下的_OFF方法,直接将独显kill在开机阶段。 整理一下思路,开机会调用显卡,休眠或是睡眠唤醒时也会调用显卡,目标很明确,找到开机时与唤醒时的_INI,将_OFF给它怼进去.因为要合并SSDT-4与DSDT,所以搜索SSDT-4中的\_SB.PCI0.PEG0 将里面有关PEG0的代码- OperationRegion (RPCI, PCI_Config, Zero, 0xF0)
- Field (RPCI, DWordAcc, Lock, Preserve)
- {
- Offset (0xB0),
- ASPM, 2,
- , 2,
- LNKD, 1
- }
- OperationRegion (RPCX, SystemMemory, \_SB.PCI0.PEG0.PEGP.XBAS, 0x8400)
- Field (RPCX, DWordAcc, NoLock, Preserve)
- {
- Offset (0x8214),
- Offset (0x8216),
- LNKS, 4
- }
- OperationRegion (GPIO, SystemIO, 0x0500, 0x60)
- Field (GPIO, ByteAcc, Lock, Preserve)
- {
- Offset (0x0C),
- , 4,
- , 13,
- PI17, 1,
- Offset (0x38),
- , 3,
- PO35, 1,
- PO36, 1,
- PI37, 1,
- , 13,
- PO51, 1,
- PO52, 1,
- PO53, 1,
- PO54, 1
- }
复制代码 复制到DSDT中的PEG0中变成这样- Device (PEG0)
- {
- OperationRegion (RPCI, PCI_Config, Zero, 0xF0)
- Field (RPCI, DWordAcc, Lock, Preserve)
- {
- Offset (0xB0),
- ASPM, 2,
- , 2,
- LNKD, 1
- }
- OperationRegion (RPCX, SystemMemory, PEGP.XBAS, 0x8400)
- Field (RPCX, DWordAcc, NoLock, Preserve)
- {
- Offset (0x8214),
- Offset (0x8216),
- LNKS, 4
- }
- OperationRegion (GPIO, SystemIO, 0x0500, 0x60)
- Field (GPIO, ByteAcc, Lock, Preserve)
- {
- Offset (0x0C),
- , 4,
- , 13,
- PI17, 1,
- Offset (0x38),
- , 3,
- PO35, 1,
- PO36, 1,
- PI37, 1,
- , 13,
- PO51, 1,
- PO52, 1,
- PO53, 1,
- PO54, 1
- }
- Name (_ADR, 0x00010000) // _ADR: Address
- Name (_PRW, Package (0x02) // _PRW: Power Resources for Wake
- {
- 0x09,
- 0x04
- })
- Name (PR0A, Package (0x04)
- {
- Package (0x04)
- {
- 0xFFFF,
- Zero,
- LNKA,
- Zero
- },
- Package (0x04)
- {
- 0xFFFF,
- One,
- LNKB,
- Zero
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x02,
- LNKC,
- Zero
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x03,
- LNKD,
- Zero
- }
- })
- Name (AR0A, Package (0x04)
- {
- Package (0x04)
- {
- 0xFFFF,
- Zero,
- Zero,
- 0x10
- },
- Package (0x04)
- {
- 0xFFFF,
- One,
- Zero,
- 0x11
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x02,
- Zero,
- 0x12
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x03,
- Zero,
- 0x13
- }
- })
- Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
- {
- If (PICM)
- {
- Return (AR0A)
- }
- Return (PR0A)
- }
- }
复制代码 请注意,SSDT-4的路径是Scope (\_SB.PCI0.PEG0),DSDT的路径是Device (PEG0)。
然后在SSDT-4中搜索带有_INI与_OFF方法的 \_SB.PCI0.PEG0.PEGP 将模块里的_INI,_OFF 与PEGP代码- Name (ELCT, Zero)
- Name (HVID, Zero)
- Name (HDID, Zero)
- OperationRegion (PCIS, PCI_Config, Zero, 0x0100)
- Field (PCIS, DWordAcc, Lock, Preserve)
- {
- DVID, 16,
- Offset (0x2C),
- SVID, 16,
- SDID, 16,
- Offset (0x4C),
- WVID, 16,
- WDID, 16
- }
- OperationRegion (GPIO, SystemIO, GBAS, 0x60)
- Field (GPIO, ByteAcc, Lock, Preserve)
- {
- Offset (0x0C),
- LVL0, 32,
- Offset (0x38),
- LVL1, 32,
- Offset (0x48),
- LVL2, 32
- }
- OperationRegion (PCAP, PCI_Config, EECP, 0x14)
- Field (PCAP, DWordAcc, NoLock, Preserve)
- {
- Offset (0x10),
- LCTL, 16
- }
- Method (_INI, 0, NotSerialized) // _INI: Initialize
- {
- Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
- }
- Method (_OFF, 0, Serialized) // _OFF: Power Off
- {
- Store (LCTL, ELCT)
- Store (SVID, HVID)
- Store (SDID, HDID)
- Store (One, LNKD)
- While (LNotEqual (LNKS, Zero))
- {
- Sleep (One)
- }
- Store (Zero, PO35)
- Store (Zero, PO36)
- Notify (\_SB.PCI0.PEG0, Zero)
- Return (Zero)
- }
复制代码 全复制(其它无关的不复制)到DSDT下的Device (PEGP)下,并把SSDT-4里面有关路径的都改成绝对路径,仔细观察代码变化。- Device (PEGP)
- {
- Name (ELCT, Zero)
- Name (HVID, Zero)
- Name (HDID, Zero)
- OperationRegion (SGOP, SystemMemory, 0x9CFBEE18, 0x4B)
- Field (SGOP, AnyAcc, Lock, Preserve)
- {
- EBAS, 32,
- CPSP, 32,
- EECP, 32,
- EVCP, 32,
- XBAS, 32,
- SGMD, 8,
- SGFL, 8,
- PWOK, 8,
- HLRS, 8,
- DSEL, 8,
- ESEL, 8,
- PSEL, 8,
- PWEN, 8,
- PRST, 8,
- MXD1, 32,
- MXD2, 32,
- MXD3, 32,
- MXD4, 32,
- MXD5, 32,
- MXD6, 32,
- MXD7, 32,
- MXD8, 32,
- GBAS, 16,
- APDT, 32,
- AHDT, 32,
- IHDT, 32
- }
- OperationRegion (PCIS, PCI_Config, Zero, 0x0100)
- Field (PCIS, DWordAcc, Lock, Preserve)
- {
- DVID, 16,
- Offset (0x2C),
- SVID, 16,
- SDID, 16,
- Offset (0x4C),
- WVID, 16,
- WDID, 16
- }
- OperationRegion (GPIO, SystemIO, GBAS, 0x60)
- Field (GPIO, ByteAcc, Lock, Preserve)
- {
- Offset (0x0C),
- LVL0, 32,
- Offset (0x38),
- LVL1, 32,
- Offset (0x48),
- LVL2, 32
- }
- OperationRegion (PCAP, PCI_Config, EECP, 0x14)
- Field (PCAP, DWordAcc, NoLock, Preserve)
- {
- Offset (0x10),
- LCTL, 16
- }
- Method (_INI, 0, NotSerialized) // _INI: Initialize
- {
- Store (Zero, _ADR)
- }
- Method (_OFF, 0, Serialized) // _OFF: Power Off
- {
- Store (LCTL, ELCT)
- Store (SVID, HVID)
- Store (SDID, HDID)
- Store (One, LNKD)
- While (LNotEqual (LNKS, Zero))
- {
- Sleep (One)
- }
- Store (Zero, PO35)
- Store (Zero, PO36)
- Notify (PEG0, Zero)
- Return (Zero)
- }
- Name (_ADR, Zero) // _ADR: Address
- Name (_PRW, Package (0x02) // _PRW: Power Resources for Wake
- {
- 0x09,
- 0x04
- })
- }
复制代码 因为SSDT里面 \_SB.PCI0.PEG0.PEGP 可能不止一个,这都是描述PEGP的,都复制到DSDT的 Device (PEG0) 里面。这样SSDT-4与DSDT合并基本差不多了(直到编译不出错为止)。
接下来就是打常规补丁了,在_WAK前面新建个方法POFF这样调用方便多了- Method (POFF, 0, NotSerialized)
- {
- \_SB.PCI0.PEG0.PEGP._OFF ()
- }
复制代码 DSDT中搜_WAK,_INI 在里面加入POFF代码屏蔽独显。_INI可能不止一个,我在PEGP与和_OSI相关的_INI里面调用了POFF。终极结果如下:- Scope (_SB.PCI0)
- {
- Method (_INI, 0, NotSerialized) // _INI: Initialize
- {
- POFF ()
- Store (0x07D0, OSYS)
- If (CondRefOf (\_OSI, Local0))
- {
- If (_OSI ("Linux"))
- {
- Store (0x03E8, OSYS)
- }
- ......
- }
- }
- }
复制代码- Device (PEG0)
- {
- OperationRegion (RPCI, PCI_Config, Zero, 0xF0)
- Field (RPCI, DWordAcc, Lock, Preserve)
- {
- Offset (0xB0),
- ASPM, 2,
- , 2,
- LNKD, 1
- }
- OperationRegion (RPCX, SystemMemory, PEGP.XBAS, 0x8400)
- Field (RPCX, DWordAcc, NoLock, Preserve)
- {
- Offset (0x8214),
- Offset (0x8216),
- LNKS, 4
- }
- OperationRegion (GPIO, SystemIO, 0x0500, 0x60)
- Field (GPIO, ByteAcc, Lock, Preserve)
- {
- Offset (0x0C),
- , 4,
- , 13,
- PI17, 1,
- Offset (0x38),
- , 3,
- PO35, 1,
- PO36, 1,
- PI37, 1,
- , 13,
- PO51, 1,
- PO52, 1,
- PO53, 1,
- PO54, 1
- }
- Name (_ADR, 0x00010000) // _ADR: Address
- Name (_PRW, Package (0x02) // _PRW: Power Resources for Wake
- {
- 0x09,
- 0x04
- })
- Name (PR0A, Package (0x04)
- {
- Package (0x04)
- {
- 0xFFFF,
- Zero,
- LNKA,
- Zero
- },
- Package (0x04)
- {
- 0xFFFF,
- One,
- LNKB,
- Zero
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x02,
- LNKC,
- Zero
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x03,
- LNKD,
- Zero
- }
- })
- Name (AR0A, Package (0x04)
- {
- Package (0x04)
- {
- 0xFFFF,
- Zero,
- Zero,
- 0x10
- },
- Package (0x04)
- {
- 0xFFFF,
- One,
- Zero,
- 0x11
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x02,
- Zero,
- 0x12
- },
- Package (0x04)
- {
- 0xFFFF,
- 0x03,
- Zero,
- 0x13
- }
- })
- Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
- {
- If (PICM)
- {
- Return (AR0A)
- }
- Return (PR0A)
- }
- Device (PEGP)
- {
- Name (ELCT, Zero)
- Name (HVID, Zero)
- Name (HDID, Zero)
- OperationRegion (SGOP, SystemMemory, 0x9CFBEE18, 0x4B)
- Field (SGOP, AnyAcc, Lock, Preserve)
- {
- EBAS, 32,
- CPSP, 32,
- EECP, 32,
- EVCP, 32,
- XBAS, 32,
- SGMD, 8,
- SGFL, 8,
- PWOK, 8,
- HLRS, 8,
- DSEL, 8,
- ESEL, 8,
- PSEL, 8,
- PWEN, 8,
- PRST, 8,
- MXD1, 32,
- MXD2, 32,
- MXD3, 32,
- MXD4, 32,
- MXD5, 32,
- MXD6, 32,
- MXD7, 32,
- MXD8, 32,
- GBAS, 16,
- APDT, 32,
- AHDT, 32,
- IHDT, 32
- }
- OperationRegion (PCIS, PCI_Config, Zero, 0x0100)
- Field (PCIS, DWordAcc, Lock, Preserve)
- {
- DVID, 16,
- Offset (0x2C),
- SVID, 16,
- SDID, 16,
- Offset (0x4C),
- WVID, 16,
- WDID, 16
- }
- OperationRegion (GPIO, SystemIO, GBAS, 0x60)
- Field (GPIO, ByteAcc, Lock, Preserve)
- {
- Offset (0x0C),
- LVL0, 32,
- Offset (0x38),
- LVL1, 32,
- Offset (0x48),
- LVL2, 32
- }
- OperationRegion (PCAP, PCI_Config, EECP, 0x14)
- Field (PCAP, DWordAcc, NoLock, Preserve)
- {
- Offset (0x10),
- LCTL, 16
- }
- Method (_INI, 0, NotSerialized) // _INI: Initialize
- {
- POFF ()
- Store (Zero, _ADR)
- }
- Method (_OFF, 0, Serialized) // _OFF: Power Off
- {
- Store (LCTL, ELCT)
- Store (SVID, HVID)
- Store (SDID, HDID)
- Store (One, LNKD)
- While (LNotEqual (LNKS, Zero))
- {
- Sleep (One)
- }
- Store (Zero, PO35)
- Store (Zero, PO36)
- Notify (PEG0, Zero)
- Return (Zero)
- }
- Name (_ADR, Zero) // _ADR: Address
- Name (_PRW, Package (0x02) // _PRW: Power Resources for Wake
- {
- 0x09,
- 0x04
- })
- }
- }
复制代码 然后找RM现成的亮度补丁、HD3000补丁打上去...... 还有其它的补丁有用的自己选择。
因为篇幅实在有限,我写得也不是教程,只能大致讲下我的一些思路和历程。黑果完善这块没有捷径,都得经过痛苦的学习...... 我会把我的原始DSDT,原始SSDT与合并它们两个做好的DSDT一起上传,DSDT打了我认为该有的补丁,不局限于显卡,还包括了USB,IRQ,AUDIO,无线与有线网卡内建等等,有兴趣的朋友可以研究一下,最好把不足的地方补充出来,我也十分很想再进步。 当然我现在用得不是这套DSDT,有兴趣的可以留言,我再分享我用的这套没有屏蔽独显的DSDT与SSDT。
DSDT文件打包.zip
(48.03 KB, 下载次数: 5)
注:只适用于HP G4 166E主板的笔记本 1233TX。 |
|