[Armadillo.Tech ~]$

Medakk's SSDT Fix

The following was quoted from meddak’s comment on GitHub. I only posted it here for archival purposes.

OK, so here’s how I got it working on my FX553-VD. I use Ubuntu GNOME 16.04, 4.10.0 kernel and nvidia-375 drivers.

Make a folder to store the SSDT files. Then extract it from the ACPI tables (run this part as root):

1
2
3
4
5
$ mkdir dsdt
$ cd dsdt
# SSDT_FILES=`ls /sys/firmware/acpi/tables/ | grep SSDT`
# for file in $SSDT_FILES ; do cat "/sys/firmware/acpi/tables/$file" > "$file.dat"; done
# cat /sys/firmware/acpi/tables/DSDT > DSDT.dat

Make sure you have IASL installed. On ubuntu, sudo apt install iasl should suffice. I downloaded the source and compiled it myself to get the latest version, but I don’t think thats necessary. There’s a duplicate definition in one SSDT file which won’t let us dissassemble it. Find out which one it is and delete it:

1
2
3
4
$ grep PRT0 *.dat
Binary file DSDT.dat matches
Binary file SSDT1.dat matches
$ mv SSDT1.dat SSDT1.bak

So in my case it is SSDT1. Replace it with whatever you get. Do not touch DSDT.dat

Next, we find the SSDT file with the code we need to change. We look for the file with both “NVID” and “OSYS” are present: (There’s probably a better way to do this in grep)

1
2
3
4
5
6
$ grep NVID *.dat
Binary file SSDT10.dat matches
Binary file SSDT3.dat matches
$ grep OSYS SSDT10.dat
$ grep OSYS SSDT3.dat
Binary file SSDT3.dat matches

So in my case it was SSDT3, if its different you replace all further instances of SSDT3 with whatever you get.

Disassemble!

$ iasl -e *.dat -d SSDT3.dat

Hopefully you don’t see any errors at this point. Replace all instances of OSYS except the declaration with the constant for Windows 7, and bump the definition block number by one:

1
2
$ sed -i '/^ *External/! s/OSYS/0x07D9/g' SSDT3.dsl
$ sed -i '/^ *DefinitionBlock/ s/0x00001000/0x00001001/g' SSDT3.dsl

If you have a different BIOS, the Definition Block number might not be 1000. Just open SSDT3.dsl in a text editor and look for DefinitionBlock. Whatever number you see on that line, increment it by one.

Compile everything and hope there are no errors.

iasl -ve -tc -p SSDT3 SSDT3.dsl

Make an image:

1
2
3
$ mkdir -p kernel/firmware/acpi
$ cp SSDT3.aml kernel/firmware/acpi/ssdt3.aml
$ find kernel | cpio -H newc --create > acpi_gpufix

All the following instructions corresponding to Ubuntu and GRUB2. Copy it to the boot folder:

$ sudo cp acpi_gpufix /boot/

Reboot. In the GRUB boot menu, select Ubuntu and press ‘e’ to edit the boot options. Change the initrd line from initrd /boot/initrd.img-4.10.0-15-generic to initrd /boot/acpi_gpufix /boot/initrd.img-4.10.0-15-generic

Of course, the initrd version might be different for you. Continue boot by pressing F10.

Try switching GPU. If you are using GDM, you’ll have to kill the display server(sudo systemctl restart display-manager) after switching unfortunately. If everything works, you can permanently add it to your GRUB by editing /etc/grub.d/10_linux. I had to change the line initrd ${rel_dirname}/${initrd} to initrd ${rel_dirname}/acpi_gpufix ${rel_dirname}/${initrd}. Then run update-grub2.