Jump to content

Yosemite 10.10.3 on ASUS X555L does not shut down correctly


vandebergz
 Share

55 posts in this topic

Recommended Posts

Hello.

 

I have a problem with my build, an Asus X555L notebook. Here's some info

 

Processor: Intel i5 4210U

Graphics: Intel HD4400 & NVIDIA GT 840M (optimus)

RAM: 4GB DDR3L

Bootloader: Clover UEFI

 

The problem is it can't shutdown and restart properly after a certain hours of usage(let's say in this case it's 3 hours). So if I use it only for an hour or more but less than 3, the problem doesn't seem to occur and it shuts down or restart properly.

But using it close to 3 hours or even more could lead to the problem of not being able to restart or shutdown. If I choose restart, it seems fine but after the screen goes black it doesn't go to bios screen(logo) and restart, rather it shuts down.

If I choose shutdown, the screen goes black for eternity while and never shutdown(sytem is up because fat is spinning very slow and led indicator for power is on).

Strangely it only happens when I use fixed DSDT I dumped from Clover, decompiled using Rehabman's iASL. I do nothing to it but fixes some error and enable my IGPU.

 

Is there a way to fix this?

Link to comment
Share on other sites

You make this? Find the dedicated GPU’s _INI method, add _OFF ( ) at the end of the method

 

Try find if IGPU/GFX0 are in SSDTs too.

 

Yes, I did that. I also did the scope fix in the said post.

 

Another GFX0 is my Intel, what to do with that?

I have moved it to my DSDT and now turned into IGPU there to enable QE/CI.

Link to comment
Share on other sites

The Nvidia card is in SSDT-10.aml

If you follow the guide, you can disable it.

 

I checked with IOReg and NVIDIA is under RP05

But there is no RP05.PEGP there, so there is no _INI. I think SSDT-10 is for Intel's graphics..

 

And method _OFF is found on SSDT-12, but there is no _INI under SB.PCI0.RP05.PEGP

Link to comment
Share on other sites

I think SSDT-10 is for Intel's graphics..

Correct.

 

And method _OFF is found on SSDT-12, but there is no _INI under SB.PCI0.RP05.PEGP

_SB.PCI0.RP05.PEGP._INI can be found in SSDT-11.

 

Please note that _OFF cannot be called from _INI as it accesses the EC. The EC cannot be accessed until _REG is called (with appropriate params, see ACPI spec).

 

You need to strip _EC related stuff from _OFF, move to _REG.

And call _OFF from SSDT1's _INI.

Link to comment
Share on other sites

_SB.PCI0.RP05.PEGP._INI can be found in SSDT-11.

 

Please note that _OFF cannot be called from _INI as it accesses the EC. The EC cannot be accessed until _REG is called (with appropriate params, see ACPI spec).

 

You need to strip _EC related stuff from _OFF, move to _REG.

And call _OFF from SSDT1's _INI.

 

So, it's right that _SB.PCI0.RP05.PEGP._INI is in SSDT-11. And _OFF method is in SSDT-12?

 

There is only this EC0 related in _OFF method

If (LEqual (CTXT, Zero))
            {
                \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
                If (LNotEqual (GPRF, One))
                {
                    Store (VGAR, VGAB)
                }

                Store (One, CTXT)
            }

But moving it to _REG would cause errors because of nonexisting objects

Link to comment
Share on other sites

So, it's right that _SB.PCI0.RP05.PEGP._INI is in SSDT-11. And _OFF method is in SSDT-12?

Yes. Plain to see.

 

There is only this EC0 related in _OFF method

If (LEqual (CTXT, Zero))
            {
                \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
                If (LNotEqual (GPRF, One))
                {
                    Store (VGAR, VGAB)
                }

                Store (One, CTXT)
            }

But moving it to _REG would cause errors because of nonexisting objects

 

No. You move only the EC related code, and only execute it from _REG when Arg0==3 and Arg1==1.

 

To remove it from _OFF (SSDT12):

into method label _OFF parent_label \_SB.PCI0.RP05.PEGP code_regex .*EC.* removeall_matched;
And to execute it from _REG instead (DSDT):

into method label _REG parent_hid PNP0C09 insert
begin
//added to turn nvidia/radeon off\n
If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))\n
{\n
    \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)\n
}\n
end;
And then to patch _INI (SSDT11):

into method label _INI parent_label \_SB.PCI0.RP05.PEGP insert
begin
//added to turn nvidia/radeon off\n
External(\_SB.PCI0.RP05.PEGP._OFF, MethodObj)\n
_OFF()\n
end;
Of course, you have to then make sure all patched DSDT/SSDT "go together".

 

Make sure no duplicate methods.

Make sure renames are balanced across all files.

Make sure you drop OEM SSDTs with bootloader.

Make sure your patched SSDTs load in the original order (use original names/numbers, specify SortedOrder in config.plist if using Clover)

 

In short, don't make any mistakes.

Link to comment
Share on other sites

 

No. You move only the EC related code, and only execute it from _REG when Arg0==3 and Arg1==1.

 

 

That one I don't quite get it...

 

To remove it from _OFF (SSDT12):

And to execute it from _REG instead (DSDT):

And then to patch _INI (SSDT11):

Of course, you have to then make sure all patched DSDT/SSDT "go together".

 

 

 

 

Done those things. And DSDT, SSDT-11, SSDT-12 are under ACPI/patched/

 

 

Make sure renames are balanced across all files.

Make sure you drop OEM SSDTs with bootloader.

Make sure your patched SSDTs load in the original order (use original names/numbers, specify SortedOrder in config.plist if using Clover)

 

Got these done too.

 

 

 

Make sure no duplicate methods.

 

 

There is this _OFF method in SSDT-11 in \.SB.PCI0.RP05._ON, what to do with it? Should I disable it?

Method (_ON, 0, Serialized)  // _ON_: Power On
            {
                \_SB.PCI0.RP05.PEGP.SGON ()
                Store (0x07, CMDR)
                Store (Zero, D0ST)
                If (LEqual (VEID, 0x10DE))
                {
                    Store (HYSS, NVID)
                }

                If (LEqual (VEID, 0x1002))
                {
                    Store (HYSS, ATID)
                }

                Store (One, _STA)
            }

            Method (_OFF, 0, Serialized)  // _OFF: Power Off
            {
                \_SB.PCI0.RP05.PEGP.SGOF ()
                Store (Zero, _STA)
            }

Link to comment
Share on other sites

...

 

There is this _OFF method in SSDT-11 in \.SB.PCI0.RP05._ON, what to do with it? Should I disable it?

Method (_ON, 0, Serialized)  // _ON_: Power On
            {
                \_SB.PCI0.RP05.PEGP.SGON ()
                Store (0x07, CMDR)
                Store (Zero, D0ST)
                If (LEqual (VEID, 0x10DE))
                {
                    Store (HYSS, NVID)
                }

                If (LEqual (VEID, 0x1002))
                {
                    Store (HYSS, ATID)
                }

                Store (One, _STA)
            }

            Method (_OFF, 0, Serialized)  // _OFF: Power Off
            {
                \_SB.PCI0.RP05.PEGP.SGOF ()
                Store (Zero, _STA)
            }

 

No. These are methods inside a PowerResource. You can leave as-is.

Link to comment
Share on other sites

 Share

×
×
  • Create New...