Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: [HOWTO] - Ako rozchodit ACPI  (Přečteno 6998 krát)

luboss

  • Návštěvník
  • Příspěvků: 2
[HOWTO] - Ako rozchodit ACPI
« kdy: 01 Listopadu 2007, 12:24:22 »
Zdravim vsetkych,

uz dlhsie som sa snazil vyriesit problem, ked sa mi ubuntu nechcel nabootovat, ak som mal k notebooku pripojenu mys, alebo nejake USB zariadenie. Doteraz som to riesil bootovanim s parametrom acpi=off, ale v tom pripade nefungovali nejake pokrocile funkcie - frequency scaling, funkcne klavesy, ostavajuca kapacita baterie... Tak som trocha surfoval po nete a za najjednoduchsie riesenie povazujem toto:

1. Kedze je tento problem sposobeny zle nakodenou tabulkou DSDT, treba ju najskor opravit, alebo si ju stiahnut opravenu zo stranky:
http://acpi.sourceforge.net/dsdt/view.php

2. V archive, ktory ste stiahli, by mal byt subor s priponou ".asl" (nazvyme ho DSDT.asl) Ten treba najskor skompilovat a to pomocou kompilatoru "iasl".
Kód: [Vybrat]
sudo apt-get install iasl

3. V terminali prejdite do priecinka, kde je stiahnuty DSDT.asl a zadajte prikaz:
Kód: [Vybrat]
iasl -tc DSDT.asl

4. Ak kompilacia prebehla bez problemov (0 Errors, 0 Warnings), mali by ste mat v priecinku dalsie 2 subory. Nas zaujima iba ten s priponou ".aml". Ten treba skopirovat do priecinka /etc/initramfs-tools/ a nazvat ho DSDT.aml
Kód: [Vybrat]
sudo cp DSDT.aml /etc/initramfs-tools/DSDT.aml

5. Nakoniec treba updatovat initramfs:
Kód: [Vybrat]
sudo update-initramfs -u -k `uname -r`


To by malo byt vsetko, restartujte a dufajte, ze vam system nabehne aj s pripojenou myskou  ;)
Mne tento postup fungoval bez problemov a to som uz skusal hocico (vratane rekompilacie kernela). Ak vam navod nebude fungovat, moc vam asi nepomozem, bo som v ubuntu este len zaciatocnik - mam ho nainstalovaneho asi pol roka. Vsetky dolezite informacie ohladom problemov s ACPI sa docitate na acpi.sourceforge.net, tak sa skuste mrknut tam.

... a este ak to niekoho zaujima, tak mam notebook ASUS A6Km-Q015 s Ubuntu 7.10 GG
« Poslední změna: 08 Prosince 2007, 02:03:28 od Anna Taliánová »

Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: [HOWTO] - Ako rozchodit ACPI
« Odpověď #1 kdy: 15 Srpna 2008, 10:34:34 »
Problém se týká toho že Bios jedné konkrétní desky (Foxconn G33M) podstrkuje Linuxu chybnou DSDT tabulku, narozdíl od Windows.
Řešením je úprava kdy Linux bude dostávat stejnou tabulku jako Windows.
Myslím že je tento postup použitelný ve více případech a zároveň doplňuje první příspěvek v tomto threadu o to kde vzít data pro vlastní úpravu DSDT.

Původní zdroj:
http://ubuntuforums.org/showthread.php?t=869249

Překládám pouze technickou část jak to opravit, politickou část komunikace s výrobcem vynechávám:
Nainstalovat Intelácký BIOS ACPI source compiler:
Kód: [Vybrat]
sudo apt-get install iasl
Vypsat obsah DSDT tabulky svojí desky:
Kód: [Vybrat]
sudo cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
Disassemblovat:
Kód: [Vybrat]
iasl -d dsdt.dat
Otevřít v editoru:
Kód: [Vybrat]
gedit dsdt.dsl
Citace
Fix Foxconn sabotage:

Najdeme sekci začínající:

Kód: [Vybrat]
            If (_OSI ("Windows 2000"))
            {
                Store (0x04, OSVR)
            }
Jdeme dál dokud nenajdeme první výskyt

Code:

        }
        Else
        {

Past that you should see Linux alongside Windows NT, which is above another Else that leads to Windows Me.

Should look like:

Kód: [Vybrat]
            If (MCTH (_OS, "Linux"))

            {
                Store (0x3, OSVR)
            }
Změníme na:
Kód: [Vybrat]
            If (_OSI ("Linux"))
            {
                Store (Zero, OSVR)
            }

Copy the section, and remove it and the other characters (CAREFULLY PRESERVING SYNTAX!!!!)

Pak přesuneme Linux sekci právě pod Windows 2006 sekci.

Bude to vypadat nějak takto:

Kód: [Vybrat]
Name (OSVR, Ones)
    Method (OSFL, 0, NotSerialized)
    {
        If (LNotEqual (OSVR, Ones))
        {
            Return (OSVR)
        }

        If (LEqual (PICM, Zero))
        {
            Store (0xAC, DBG8)
        }

        Store (One, OSVR)
        If (CondRefOf (_OSI, Local1))
        {
            If (_OSI ("Windows 2000"))
            {
                Store (0x04, OSVR)
            }

            If (_OSI ("Windows 2001"))
            {
                Store (Zero, OSVR)
            }

            If (_OSI ("Windows 2001 SP1"))
            {
                Store (Zero, OSVR)
            }

            If (_OSI ("Windows 2001 SP2"))
            {
                Store (Zero, OSVR)
            }

            If (_OSI ("Windows 2001.1"))
            {
                Store (Zero, OSVR)
            }

            If (_OSI ("Windows 2001.1 SP1"))
            {
                Store (Zero, OSVR)
            }

            If (_OSI ("Windows 2006"))
            {
                Store (Zero, OSVR)
            }

            If (_OSI ("Linux"))
            {
                Store (Zero, OSVR)
            }
        }
        Else
        {
            If (MCTH (_OS, "Microsoft Windows NT"))
            {
                Store (0x04, OSVR)
            }
            Else
            {
                If (MCTH (_OS, "Microsoft WindowsME: Millennium Edition"))
                {
                    Store (0x02, OSVR)
                }
            }
        }

        Return (OSVR)
    }
Ještě nekompilovat nebo nastane toto:

Kód: [Vybrat]
dsdt.dsl  6379:             Acquire (MUTE, 0x03E8)
Warning  1103 -                                 ^ Possible operator timeout is ignored

dsdt.dsl  6393:             Acquire (MUTE, 0x03E8)
Warning  1103 -                                 ^ Possible operator timeout is ignored

dsdt.dsl  6408:             Acquire (MUTE, 0x03E8)
Warning  1103 -                                 ^ Possible operator timeout is ignored

dsdt.dsl  6423:             Acquire (MUTE, 0x0FFF)
Warning  1103 -                                 ^ Possible operator timeout is ignored

dsdt.dsl  6437:             Acquire (MUTE, 0x03E8)
Warning  1103 -                                 ^ Possible operator timeout is ignored

dsdt.dsl  6452:             Acquire (MUTE, 0x03E8)
Warning  1103 -                                 ^ Possible operator timeout is ignored

dsdt.dsl  6467:             Acquire (MUTE, 0x03E8)
Warning  1103 -                                 ^ Possible operator timeout is ignored

Compilation complete. 0 Errors, 7 Warnings, 0 Remarks, 77 Optimizations
These are bogus mutes that are harmless to Windows (it ignores them), but crash Linux sporadically, soooo....

Nahradíme všechny výskyty Acquire (MUTE, 0x03E8) tímto: Acquire (MUTE, 0xFFFF), it appears they're trying to crash the kernel by locking a region of memory that shouldn't be locked, but without access to their source code comments, I can only speculate, this tells it to lock a memory address that is always reserved instead. ;)

Možná to vypadá na první pohled složitě, ale vlastně
1) jen měníme tvrdou detekci linuxu pomocí MCTH za standardní volání _OSI,
2) ostatní sekce týkající se námi nepoužitých systémů můžeme klidně vymazat (zde ponecháno vše, ale kdo by dnes používal windows ME)
3) předáváme Linuxu stejnou tabulku jako dostávají Windows
4) Opravujeme miny která tam dle autora původního příspěvku nechal Foxconn schválně aby deska s Linuxem nemohla jet, Dle Foxconnu chyby které vznikly omylem kvůli nezkušenosti jednoho z jejich bios teamů, běžně by se vyskytovat neměly, narozdíl od ostatních bodů..


Zkompilujeme:
Kód: [Vybrat]
iasl -tc dsdt.dsl(Neměli bychom dostat žádná varování ani chyby, jinak je potřeba najít co je špatně)

A nainstalujeme a nakonfigurujeme aby ji používalo jádro:

Kód: [Vybrat]
sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml
sudo update-initramfs -c -k all

Všechna budoucí jádra by teď už měla DSDT automaticky najít a sestavit.
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

lada.pecho

  • Návštěvník
  • Příspěvků: 1
Re: [HOWTO] - Ako rozchodit ACPI
« Odpověď #2 kdy: 04 Října 2008, 16:05:57 »
Zdravím,
velice děkuju za odkaz na původní článek, protože mě to pomohlo nakopnout správným směrem.
Mám taky notebook A6Km-Q011, ale oprava zmíněných výskytů mi nepomohla (USB stále dělalo neplechu). Jakou jste zkoušeli verzi BIOSu?

Já jsem si všiml, že původní BIOS 202 (který na webu ASUSu už není) s USB pracuje správně, ale je tam problém se zatížením CPU, pokud teplota přeroste 83 stupňů, což se mi občas povede - to bylo v novějších BIOSech opraveno a navíc ty nové zobrazují teplotu grafické karty.

Takže jsem porovnal DSDT tabulky ve verzi BIOSu 202 a 210 a povedlo se mi opravit tento problém malinko jinak. Jako bonus opět funguje s2disk (jako ve verzi 202). Byl jsem si tak jistý správností svého řešení, že jsem patchnul originální BIOS a custom DSDT nacpal do něj. Není tedy třeba upravovat jádro. Postup jsem zveřejnil zde, můžete tam můj BIOS také stáhnout (samozřejmě na své vlastní riziko):
http://web.hkfree.org/~lada/asus-dsdt/

Napsal jsem to anglicky, protože se to třeba bude hodit i někomu mimo ČR.
Co na tom ale opravdu nechápu je, co tam vlastně bylo za chybu - v changelogu BIOSu píšou, že opravili vytuhnutí systému Win2k, pokud je při bootu připojené USB zařízení, ale nový opravný kód je spuštěn pouze pokud NEMÁME Win2k. Ten workaround původně zamýšlený pro Win2k zřejmě ostatní systémy od MS přežijou, ale Linux ne.

Moc rád bych věděl, jak se to vlastně na Win2k chová. Podle mě tam ta chyba je pořád, a ještě odstřelili i Linux. Win2k nemám, netestoval jsem. Ale myslím, že je to z toho kódu celkem zřejmé.

P.S. zvažoval jsem použít bios v.300, ale zavrh jsem to, protože po zaklopení displeje a otevření, se sám nerozsvítí. Je to nová feature, kterou nechci. Kdyby měl někdo zájem, tak se mohu pokusit tenhle bios upravit taky.
P.P.S. Jestli v notebooku taky máte ipw2200, který má zakázané kanály 12 a 13, tak se na ten odkaz taky koukněte, našel jsem na to řešení změnou eeprom wifi karty.

Kerim

  • Návštěvník
  • Příspěvků: 73
Re: [HOWTO] - Ako rozchodit ACPI
« Odpověď #3 kdy: 04 Listopadu 2008, 17:21:18 »
To by bylo fajn. Pouzivam prave BIOS 300. Mam A6Km Q0-67. Na tech strankach, kde se daji stahnout jiz opravene DSDT tabulky, muj typ neni a podle predchoziho prispevku mi to moc nejde. Mam krapet jiny udaje v DSDT a bojim se v tom vice experimentovat. 

UfoNet

  • Stálý člen
  • **
  • Příspěvků: 559
  • skill:Ctrl+C & Ctrl+V
Re: [HOWTO] - Ako rozchodit ACPI
« Odpověď #4 kdy: 27 Května 2010, 15:57:21 »
Byl by prosím nějaký update tohoto návodu pro nové kernely a vůbec Ubuntu 10.04? Jak na to když je vlastní přidání dsdt zakázané?
Děkuji moc
Mluvit o Linuxu nestačí, lepší je, když si s Linuxem budou děti hrát. Nebudou se ho bát.

 

Provoz zaštiťuje spolek OpenAlt.