- 积分
- 611
- 最后登录
- 2023-2-26
- 精华
- 0
- 阅读权限
- 40
- 主题
- 87
- UID
- 4783896
- 帖子
- 1452
- PB币
- 357
- 威望
- 5
- 贡献
- 0
- 技术
- 0
- 活跃
- 1520
- UID
- 4783896
- 帖子
- 1452
- PB币
- 357
- 贡献
- 0
- 技术
- 0
- 活跃
- 1520
|
本帖最后由 13469977015002 于 2020-1-8 22:34 编辑
有人使用SSDT-Disable-Dgpu屏蔽独显失败的可以看看
案例一:(此案例SSDT-Disable-Dgpu屏蔽失败)
首先在SSDT中搜 Method (_PS3 内容如下 - Method (_PS3, 0, NotSerialized) // _PS3: Power State 3
- {
- If (LNotEqual (BRID, 0x06))
- {
- P8XH (Zero, 0xF2)
- If (LEqual (OMPR, 0x03))
- {
- P8XH (Zero, 0xF3)
- OPOF ()
- Store (One, DGOS)
- Store (0x02, OMPR)
- Store (0x03, _PSC)
- }
- }
- }
复制代码 可以看到_ps3()调用了OPOF()函数
搜索OPOF找到以下内容:- Method (OPOF, 0, NotSerialized)
- {
- Store (One, LCRB)
- Store (One, DQDA)
- Store (Zero, LCRB)
- Store (VGAR, VGAB)
- Store (One, SETF)
- Store (One, LNKD)
- While (LGreater (LNKS, Zero))
- {
- Sleep (One)
- }
- Store (Zero, DGRS)
- Sleep (0x64)
- Store (Zero, DGPW)
- Sleep (0x64)
- If (LEqual (DGPG, Zero))
- {
- P8XH (Zero, 0x31)
- }
- }
复制代码 可以看到OPOF()里面没有其他函数调用到这里结束了
再搜Method (_PS0 内容如下:
- Method (_PS0, 0, NotSerialized) // _PS0: Power State 0
- {
- If (LNotEqual (BRID, 0x06))
- {
- P8XH (Zero, 0xF0)
- Store (Zero, _PSC)
- If (DGOS)
- {
- P8XH (Zero, 0xF1)
- OPON ()
- Sleep (0x64)
- PHSR (0xB6)
- Store (Zero, DGOS)
- }
- }
- }
复制代码 这里_PS0()调用了OPON函数
搜OPON同样发现没有其他函数调用了
找到_PS3() _PS0() OPOF() OPON() 这些函数的位置
\_SB_.PCI0.PEG0.PEGP._PS3
\_SB_.PCI0.PEG0.PEGP._PS0
\_SB_.PCI0.PEG0.PEGP.OPOF
\_SB_.PCI0.PEG0.PEGP.OPON
记录:
_PS3>OPOF
_PS0>OPON
人为的定义俩个函数M_OF ()和M_ON ()
这里M_OF从_PS3开始调用
M_ON ()从_PS0开始调用Method (M_ON, 0, NotSerialized)
{
If (CondRefOf (\_SB.PCI0.PEG0.PEGP.OPON))
{
\_SB.PCI0.PEG0.PEGP.OPON ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._PS0))
{
\_SB.PCI0.PEG0.PEGP._PS0 ()
}
}
Method (M_OF, 0, NotSerialized)
{
If (CondRefOf (\_SB.PCI0.PEG0.PEGP.OPOF))
{
\_SB.PCI0.PEG0.PEGP.OPOF ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._PS3))
{
\_SB.PCI0.PEG0.PEGP._PS3 ()
}
}
在DSDT中搜索Method (_PTS 将M_ON和M_OF插入在其前面
在_PTS()里面调用M_ON()
搜Method (_WAK和Method (_INI
在_WAK()和_INI()里面调用M_OF()
最后在DSDT开头的位置加入外部调用
External (\_SB_.PCI0.PEG0.PEGP._PS0, MethodObj) // 0 Arguments (from opcode)
External (\_SB_.PCI0.PEG0.PEGP._PS3, MethodObj) // 0 Arguments (from opcode)
External (\_SB.PCI0.PEG0.PEGP.OPOF, MethodObj)
External (\_SB.PCI0.PEG0.PEGP.OPON, MethodObj)
如下图:
成型所有代码如下:
External (\_SB_.PCI0.PEG0.PEGP._PS0, MethodObj) // 0 Arguments (from opcode)
External (\_SB_.PCI0.PEG0.PEGP._PS3, MethodObj) // 0 Arguments (from opcode)
External (\_SB.PCI0.PEG0.PEGP.OPOF, MethodObj)
External (\_SB.PCI0.PEG0.PEGP.OPON, MethodObj)
Method (M_ON, 0, NotSerialized)
{
If (CondRefOf (\_SB.PCI0.PEG0.PEGP.OPON))
{
\_SB.PCI0.PEG0.PEGP.OPON ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._PS0))
{
\_SB.PCI0.PEG0.PEGP._PS0 ()
}
}
Method (M_OF, 0, NotSerialized)
{
If (CondRefOf (\_SB.PCI0.PEG0.PEGP.OPOF))
{
\_SB.PCI0.PEG0.PEGP.OPOF ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._PS3))
{
\_SB.PCI0.PEG0.PEGP._PS3 ()
}
}
Method (_PTS, 1, NotSerialized) // _PTS: Prepare To Sleep
{
M_ON ()
If (LNotEqual (Arg0, 0x05))
{
Store (Zero, P80D)
P8XH (Zero, Arg0)
Store (One, MY9F)
If (LEqual (Arg0, 0x03))
{
If (LAnd (DTSE, LGreater (TCNT, One)))
{
TRAP (TRTD, 0x1E)
}
}
If (LOr (LEqual (Arg0, 0x03), LEqual (Arg0, 0x04)))
{
If (LEqual (Arg0, 0x04))
{
If (LEqual (OSYS, 0x07D9))
{
Acquire (\_SB.PCI0.LPCB.EC0.MUT0, 0xFFFF)
\_SB.PHSR (0xB2)
Release (\_SB.PCI0.LPCB.EC0.MUT0)
}
}
Store (One, SLPO)
}
}
}
Method (_WAK, 1, Serialized) // _WAK: Wake
{
M_OF ()
Name (_T_0, Zero) // _T_x: Emitted by ASL Compiler
P8XH (One, 0xAB)
省略
Method (_INI, 0, NotSerialized) // _INI: Initialize
{
M_OF ()
附上案例中的DSDT和SSDT文件供参考:
案例二:(此案例中SSDT-Disable-Dgpu可以成功屏蔽独显)
因为此案例很常见这里拿出来写入教程是为了方便大家理解
整理下案例一中的步骤:
①通过查看_PS3()和_PS0()函数的调用定义M_ON()和M_OF()
②在_PTS()下调用M_ON(),在_WAK()和_ini()下调用M_OF()
③添加外部调用函数排错
- Method (_PS3, 0, NotSerialized) // _PS3: Power State 3
- {
复制代码 在SSDT里面搜_PS3往下找发现以上内容:
很明显_PS3()调用_OFF()
_OFF()调用_SGOF()
_PS3()>_OFF()>_SGOF()
同样的查找_PS0不难发现_PS0()>_ON()>_SGON()
M_ON和M_OF定义如下:
Method (M_ON, 0, NotSerialized)
{
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._ON))
{
\_SB.PCI0.PEG0.PEGP._ON ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._PS0))
{
\_SB.PCI0.PEG0.PEGP._PS0 ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP.SGON))
{
\_SB.PCI0.PEG0.PEGP.SGON ()
}
}
Method (M_OF, 0, NotSerialized)
{
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._OFF))
{
\_SB.PCI0.PEG0.PEGP._OFF ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP._PS3))
{
\_SB.PCI0.PEG0.PEGP._PS3 ()
}
If (CondRefOf (\_SB.PCI0.PEG0.PEGP.SGOF))
{
\_SB.PCI0.PEG0.PEGP.SGOF ()
}
}
后面的同案例一种一样操作就行了
留下案例文件:
|
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
-
1
查看全部评分
-
|