Well, all Toshiba notebooks that belong to serie P100/P105 (or maybe also others), have problems with ACPI interface on Linux platform. Generally, sound is not working and there are problems with fans on GPU and CPU. Toshiba doesn't officialy support Linux OS, so it is pointless to call to support. Fortunately, community has solution. You can install Linux OS, record your (dynamicly generated) DSDT file, correct it, recompile and copy it to directory where Linux can find it when it is loading kernel. All the knowledge and hints here are copy-pasted from various sources (I will try to cover them), so credit goes to community. I will try to make little guide of how to do custom DSDT and add my personal experience. Behold. #### Ubuntu/Debian shared steps This part is for both distributions. First, install neccessary programs: apt-get install iasl Then grab DSDT file from your machine and save it in current directory as dsdt.dat: sudo cat /proc/acpi/dsdt > dsdt.dat Dismantle dsdt.dat to readable dsdt.dsl: iasl -d dsdt.dat Compile dsdt.dsl with this command: iasl -tc dsdt.dsl As you try to compile dsdt.dsl and you have buggy DSDT, you will certainly see multiple errors. And now comes my favourite part - let's get rid of them! Leave terminal window where you compiled dsdt.dsl open, to see the numbers of lines, you're gonna need em. First, backup dsdt.dsl just in case: cp dsdt.dsl dsdt_bak.dsl And open dsdt.dsl for editing: gedit dsdt.dsl {or 'kwrite dsdt.dsl' if you're using KDE, or 'vi dsdt.dsl' if you are feeling funny} Here comes the list of fixes we have to do in dsdt.dsl file: - Search for string "_T_0" and replace it with "T_0". Then replace all "_T_1" with "T_1" and do the same thing with all such variables, there should be 8 of them, last one is "_T_7". - Find string "Method (BTST, 0, NotSerialized)", it should look like this: Method (BTST, 0, NotSerialized) { If (_SB.ECOK) { Acquire (_SB.PCI0.LPCB.EC0.MUT1, 0xFFFF) Store (_SB.PCI0.LPCB.EC0.KSWH, Local0) XOr (Local0, 0x01, Local0) Store (_SB.PCI0.LPCB.EC0.BTHE, Local7) Release (_SB.PCI0.LPCB.EC0.MUT1) If (Local0) { ShiftLeft (Local7, 0x06, Local6) ShiftLeft (Local7, 0x07, Local7) Or (Local7, Local6, Local1) Or (Local0, Local1, Local2) Return (Local2) } Else { Return (Zero) } } }We need to add one more Else statement here, to return zero. This is how it should look: Method (BTST, 0, NotSerialized) { If (_SB.ECOK) { Acquire (_SB.PCI0.LPCB.EC0.MUT1, 0xFFFF) Store (_SB.PCI0.LPCB.EC0.KSWH, Local0) XOr (Local0, 0x01, Local0) Store (_SB.PCI0.LPCB.EC0.BTHE, Local7) Release (_SB.PCI0.LPCB.EC0.MUT1) If (Local0) { ShiftLeft (Local7, 0x06, Local6) ShiftLeft (Local7, 0x07, Local7) Or (Local7, Local6, Local1) Or (Local0, Local1, Local2) Return (Local2) } Else { Return (Zero) } } Else { Return (Zero) } }When you are done, do exactly the same with method called "Method (EVNT, 1, NotSerialized)". - There probable will be errors regarding this part> "Name (_HID, "PNP0C14")". I don't remember exact error, but you have to simply delete asterix sign "" in those names. After editing it should look like "Name (_HID, "PNP0C14")". - We need to hack DSDT, so it will not recognize Linux and it will think we run MS Windows OS, funny, isn't it? Find this block of code (may look differently on your machine): Scope (_SB) { Method (_INI, 0, NotSerialized) { If (DTSE) { TRAP (0x47) } Store (0x07D0, OSYS) If (CondRefOf (_OSI, Local0)) { If (_OSI ("Linux")) { Store (0x03E8, OSYS) } Else { Store (0x07D1, OSYS) If (_OSI ("Windows 2001 SP2")) { Store (0x07D2, OSYS) }If (_OSI ("Windows 2001.1")) { Store (0x07D3, OSYS) }If (_OSI ("Windows 2001.1 SP1")) { Store (0x07D4, OSYS) }If (_OSI ("Windows 2006")) { Store (0x07D6, OSYS) }If (LAnd (MPEN, LEqual (OSYS, 0x07D1))) { TRAP (0x3D) } } } }We need to comment out most of it and return value for MS Windows. Resulting block of code: Scope (_SB) { Method (_INI, 0, NotSerialized) { If (DTSE) { TRAP (0x47) } Store (0x07D0, OSYS) // If (CondRefOf (_OSI, Local0)) // { // If (_OSI ("Linux")) // { // Store (0x03E8, OSYS) // } // Else // { // Store (0x07D1, OSYS) // If (_OSI ("Windows 2001 SP2")) // { // Store (0x07D2, OSYS) // } // // If (_OSI ("Windows 2001.1")) // { // Store (0x07D3, OSYS) // } // // If (_OSI ("Windows 2001.1 SP1")) // { // Store (0x07D4, OSYS) // } // // If (_OSI ("Windows 2006")) // { // Store (0x07D6, OSYS) // } // // If (LAnd (MPEN, LEqual (OSYS, 0x07D1))) // { // TRAP (0x3D) // } // } // } Store (0x07D6, OSYS) } - Almost done, we have to fix problem with nVidia GPU fan at least. Search for string (name of the method) - "Method (_REG, 2, NotSerialized)". Whole method looks like this: Method (_REG, 2, NotSerialized) { If (LEqual (Arg0, 0x03)) { Store (Arg1, Local0) If (Local0) { Store (0x01, ECOK) Acquire (_SB.PCI0.LPCB.EC0.MUT1, 0xFFFF) Store (\TMOD, _SB.PCI0.LPCB.EC0.TMOD) Release (_SB.PCI0.LPCB.EC0.MUT1) } Else { Store (0x00, ECOK) } } If (_SB.ECOK) { Acquire (_SB.PCI0.LPCB.EC0.MUT1, 0xFFFF) If (LEqual (OSYS, 0x07D6)) { Store (One, _SB.PCI0.LPCB.EC0.OSTP) _SB.PHSR (0x0D, 0x00) } Else { Store (Zero, _SB.PCI0.LPCB.EC0.OSTP) }Store (0x03, _SB.PCI0.LPCB.EC0.RG59) Store (_SB.CIRE, _SB.PCI0.LPCB.EC0.CIRE) Store (_SB.PHSR (0x05, 0x00), DOFF) Store (_SB.PCI0.LPCB.EC0.ACDF, \PWRS) Release (_SB.PCI0.LPCB.EC0.MUT1) } }We need to add one line just before last bracket, so resulting block looks like this: Method (_REG, 2, NotSerialized) { If (LEqual (Arg0, 0x03)) { Store (Arg1, Local0) If (Local0) { Store (0x01, ECOK) Acquire (_SB.PCI0.LPCB.EC0.MUT1, 0xFFFF) Store (\TMOD, _SB.PCI0.LPCB.EC0.TMOD) Release (_SB.PCI0.LPCB.EC0.MUT1) } Else { Store (0x00, ECOK) } }If (_SB.ECOK) { Acquire (_SB.PCI0.LPCB.EC0.MUT1, 0xFFFF) If (LEqual (OSYS, 0x07D6)) { Store (One, _SB.PCI0.LPCB.EC0.OSTP) _SB.PHSR (0x0D, 0x00) } Else { Store (Zero, _SB.PCI0.LPCB.EC0.OSTP) }Store (0x03, _SB.PCI0.LPCB.EC0.RG59) Store (_SB.CIRE, _SB.PCI0.LPCB.EC0.CIRE) Store (_SB.PHSR (0x05, 0x00), DOFF) Store (_SB.PCI0.LPCB.EC0.ACDF, \PWRS) Release (_SB.PCI0.LPCB.EC0.MUT1) } // Martin Lorang's hack Store (0x3C, VTMP) // 55°C avec glxgears, 48°C au repos, temp ext 24°C } This is hack from - guess who.. - Martin Lorang, you can also use different numbers for different target temperatures. This is value that I use, here are others, if you feel adventurous: Store (0x30, VTMP) // 72°C avec glxgears, 65°C au repos, temp ext 24°C Store (0x3C, VTMP) // 60°C con glxgears, 52°C en reposo, temp ext 24°C Store (0x46, VTMP) // 55°C con glxgears, 50°C en reposo, temp ext 24°C We are done with editing today, recompile customized dsdt.dsl again: iasl -tc dsdt.dsl And hopefully you don't see errors this time. If so, try to reread list of fixes if you by any chance forget about something, or try to google different solutions. This guide was helpful for me on my Toshiba P100-324. Now copy compiled DSDT file to initramfs: sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml And reconfigure linux image: sudo dpkg-reconfigure linux-image-$(uname -r) Debian users, reboot and you are free to go now. Ubuntu users, read next paragraph -> #### Few steps more for Ubuntu users Download THISTHIS package and run these commands: tar xvf toshiba_dsdt_kernel_fix.2.6.22-14_2007111300.tar.gz cd toshiba_dsdt_kernel_fix.2.6.22-14_2007111300/ dpkg -i *.deb After reboot, you should be ok too. This is needed, since Feisty, something is screwed up there, so Feisty and Gutsy don't load DSDT.aml properly, and this fix is more than handy. Maybe they will sort it out untill next release... Sources: http://ubuntu-utah.ubuntuforums.org/showthread.php?t=349491&page=12 http://ql.homelinux.net/wiki/doku.php?id=ubuntu-7.04:dsdt#le_ventilateur_de_la_gc_nvidia http://ubuntu-ky.ubuntuforums.org/showthread.php?t=580876&page=3 https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/136469
Custom DSDT loading on Toshiba P100/P105 laptops for Ubuntu/Debian
2008-01-12