Oznámení

Sbalit
Aktuálně žádná oznámení.

AmigaOne XE - hadwarové přerušení PCI sběrnice

Sbalit
X
Sbalit
  •  

  • AmigaOne XE - hadwarové přerušení PCI sběrnice

    AmigaOne XE - hadwarové přerušení PCI sběrnice


    článek je volným pokračováním předchozích dvou dílů o AmigaOne XE:
    AmigaOne XE - snadno a rychle,
    AmigaOne XE - grafické karty AGP a PCIe,
    a pojednává o hardwarových přerušeních v této Amize. Tady už bude více teorie a více techniky. Jelikož jsem systému přerušení PCI v XE moc nerozuměla, musela jsem si to vyhledat a to také najdete zde. A musím říci že je to ve srovnání s dnešním PCIe systémem o dost komplikovanější.
    Takže tento článek bude spíše taková malá učebnice pro začátečníky a mírně pokročilé na téma "PCI legacy interrupty". A učebnice bývají nudné, na to se připravte.


    1. Proč to všechno děláme?

    Určitě proto, abychom věděli o kousek víc o své AmizeOne XE ( a nejen o ní, přerušení budou vypadat velmi podobně u všech AmigNG první generace, AmigaOne SE, Micro A1-C, Pegasos 1 a Pegasos 2 ) .
    A také proto, že nám v naší XE leccos nefunguje a poslední oficiální firmware U-Boot 1.1.1 neumí správně inicializovat PCI karty za bridgi.

    A co bych chtěla zkusit, je zprovoznit přerušení u PCIe karet za PCI-PCIe bridgem. Maličkost že?


    2. Dokumentace

    Jelikož jsem této problematice moc nerozuměla, musela jsem si tentokrát přečíst i nějakou dokumentaci, což dělám opravdu nerada.
    Kdo bude chtít mé postupy a úvahy kontrolovat, doporučuji mu tuto literaturu:
    - PCI localbus specification rev. 2.2
    Víme, že arbitr pro PCI sběrnice je northbridge Articia S. Nepodařilo se mi dohledat manuál od Articie S ( pouze datasheet ), ale předpokládám že Articia S má PCI rev. 2.2. Ono se naštěstí nejde moc splést, verzi 2.1 Articia splňuje určitě ( v.2.1 zavedla 66 MHz, což Articia umí ), verzi 2.2 nejspíš ( je to jen drobně upravená v.2.1 ) a verzi 2.3 Articia S již nesplňuje ( v.2.2 totiž zakázala 5V PCI karty ). A navíc southbridge XE je kompatibilní s PCI v.2.2, takže vezmeme za platné PCI v 2.2.
    Dále se budeme zabývat PCI-PCI bridgi ( a PCI-PCIe bridge je také tento případ ), takže potřebujeme:
    -PCI-to-PCI Bridge Architecture Specification rev.1.1
    To je verze která byla platná v době PCI v.2.2.
    -PCI Express-to-PCI/PCI-X Bridge Specification rev.1.0
    Tuto verzi splňují oba naše testované PCI-to-PCIe bridge.
    -PLX Technology: PEX 8112-AA PCI Express-to-PCI Bridge Data Book
    -Pericom: PI7C9X111SL PCI Express-to-PCI Reversible Bridge Datasheet
    A pokud půjdete do dokumentace hlouběji, tak nás zajímá Reverzní bridge ( tedy PCI motherboard a PCIe karta ) a funkce transparentního bridge. Oba naše bridge jsou transparentní, což zjednodušeně znamená že ty příkazy a data která jsou společná pro normy PCI i PCIe bridge neupravuje, ale propouští rovnou.


    3. PCI sběrnice v AmigaOne XE podrobněji

    Tentokrát nás z northbridge Articia S zajímá jen PCI, ale za to podrobněji.

    Klikni pro plné zobrazení obrázku  Jméno: 3.1-AmigaOneXE-PCI-diagram.jpg Počet zobrazení: 0 Velikost: 120,3 KB ID: 159418
    schema 3.1 AmigaOne XE PCI bus diagram



    Takto jsou adresovány PCI sběrnice v AmigaOne XE. Adresa PCI je ve tvaru XX.YY.ZZ a znamená:
    XX = číslo sběrnice (bus nr.)
    YY = číslo zařízení na sběrnici (device nr.). Zařízení je například PCI karta.
    ZZ = funkce zařízení (function nr.), obvykle má zařízení jednu funkci ( .00 ), ale může jich mít více.

    Schema je vytvořeno na základě údajů z programu Ranger a vidíme zde:

    00.00.00 = Host bridge. Tedy něco jako root hub u moderního PCIe. Počáteční bod řadiče ( arbitra PCI ).
    00.01.00 = PCI-to-PCI bridge. Vidíte že PCI bus 1 (AGP+PCI 66) nemá vlastní host bridge (root hub v dnešní terminologii PCIe) ale je připojen na sběrnici PCI bus 0 přes PCI-to-PCI bridge. Tento bridge je tedy prvním (00.01.00) zařízením za Host bridgem na sběrnici PCI bus 0. Sběrnice PCI bus 1 začíná až za tímto bridgem.
    Toto také způsobuje proč nemůžeme použít PCI 66 MHz slot pro PCIe karty. Linka připojení by totiž vypadala takto:
    Host bridge - PCI-to-PCI bridge - PCI-to-PCIe bridge ( = karta ve slotu PCI 66 ) - PCIe grafická karta.
    Tedy za dvěma bridgy. A kartu za dvěma bridgy už U-Boot neumí inicializovat.
    00.06.00 - Ethernet na motherboardu.
    00.07.00 - Southbridge VT82C686B. Vidíte že southbridge je sice jedno PCI zařízení ( .07. ), ale má více funkcí. Najdete zde vlastně většinu interních periferíí XE: IDE, USB1.1, audio, serial.
    00.08.00 - to je adresa zařízení ( karty ) v PCI 33 MHz slotu 1.
    00.09.00 - to je adresa zařízení ( karty ) v PCI 33 MHz slotu 2.
    00.0A.00 - to je adresa zařízení ( karty ) v PCI 33 MHz slotu 3.

    01.00.00 - toto je adresa zařízení ( karty ) v AGP slotu. Všimněte si že je již na jiné PCI sběrnici ( 01.xx.xx = PCI bus 1)
    01.01.00 - to je adresa zařízení ( karty ) v PCI 66 MHz slotu.

    Rébus schema PCI:
    A schválně se zkuste zamyslet, jestli Vám na tomto schematu nepřijde něco divného. Na konci článku se dozvíte co.


    4. Jak vypadá PCI systém přerušení v AmigaOne XE

    V AmigaOne XE má funkci řadiče PCI přerušení náš southbridge VT82C686B.
    Pokud si budete chtít něco dohledat, jedná se o prvotní systém přerušení PCI, nazývaný dnes PCI Legacy a nikoli novější verzi PCI MSI ( Message Signalled Interrupts ).
    Přiřazení linek přerušení dělá firmware. V našem případě tedy U-Boot. Máme poslední oficiální verzi od Hyperionu - tedy U-Boot 1.1.1.

    4.1 základní přiřazení pinů INTx# u PCI zařízení

    Každé PCI zařízení může použít pro signalizaci přerušení až čtyři různá hardwarová přerušení. Na PCI konektoru jsou pro ně vyhrazeny čtyři fyzické piny INTA#, INTB#, INTC# and INTD#.
    ( Pro zajímavost jsou to piny A6, A7, B7, B8 ).
    AGP zařízení má jen dva hardwarové piny INTA#, INTB# ( A6, B6 ).
    Důležité je, že tyto signály jsou fyzicky propojeny s řadičem přerušení.

    Definice: IRQ Pin = údaj, který fyzický pin na kartě PCI funkce využívá.
    Data na PCI sběrnici vedou tedy do northbridge jak je ve schematu 3.1. Ale piny přerušení vedou k řadiči přerušení, tedy southbridgi, kde jsou napojeny na fyzické piny řadiče přerušení takto:

    Klikni pro plné zobrazení obrázku  Jméno: 4.1-AmigaOneXE-PCI-Interrupts-diagram.jpg Počet zobrazení: 0 Velikost: 101,5 KB ID: 159419
    schema 4.1 PCI HW IRQ pins



    Čtverečky A, B, C, D jsou fyzické piny pro přerušení INTA#, INTB#, INTC# and INTD# na PCI kartách.
    PIRQ A#, PIRQ B#, PIRQ C#, PIRQ D# jsou fyzické piny na řadiči přerušení, southbridgi ( ten náš má piny pouze čtyři, obecně jich může být více ).

    K PIRQ A# je připojeno zařízení v PCI 33 MHz slotu 1.
    K PIRQ B# jsou připojena zařízení v PCI 66 MHz slotu a PCI 33 MHz slotu 2.
    K PIRQ C# jsou připojena zařízení v AGP slotu a PCI 33 MHz slotu 3.
    K PIRQ D# není v tomto schematu napojeno nic.

    Tady opět malá odbočka:
    Je rozumné zamyslet se nad osazením PCI karet. Pokud máme třeba AGP kartu ( odhaduji že ta bude mít nejvyšší počet přerušení při provozu ), která je napojena na PIRQ C#, tak asi není úplně optimální dát do PCI 33 MHz slotu 3 ( se kterým sdílí hardwarové přerušení ) druhou grafickou kartu či třeba SATA řadič. A naopak když jsem zkoušela PCIe karty, tak jsem je dala do 33 MHz slotu 3, protože AGP karta nebyla osazena a tudíž nebyl sdílený pin přerušení.

    Ve starší ISA architektuře muselo mít každé zařízení unikátní číslo přerušení. Nevím jestli si vzpomínáte, ale u starých PC XT/AT bylo při použití více karet často třeba nastavit čísla přerušení ručně aby nekolidovala.
    Nicméně u architektury PCI už fyzická hardwarová přerušení sdílena být mohou, konflikty se řeší jejich různou prioritou.
    Řadič přerušení v AmigaOne XE je typu APIC ( Advanced Programmable Interrupt Controller ), obsahuje směrovač přerušení ( interrupt router ) a pomocí něj mapuje U-Boot jednotlivé HW přerušení na IRQ, tj. přiřazuje linky.

    Definice: Interrupt line = konfigurace, určuje jaké číslo IRQ je přiděleno jednotlivé PCI funkci.
    Na schematu vidíte jak jsou v AmigaOne XE vytvořeny linky ( pokud ponecháte defaultní nastavení v U-Boot menu "PCI/AGP") :
    hardwarové PIRQ A# ( v U-Bootu označeno jako PCI Interrupt A) je mapováno na IRQ 9 (0x09)
    hardwarové PIRQ B# ( v U-Bootu označeno jako PCI Interrupt B) je mapováno na IRQ 10 (0x0A)
    hardwarové PIRQ C# ( v U-Bootu označeno jako PCI Interrupt C) je mapováno na IRQ 11 (0x0B)
    hardwarové PIRQ D# ( v U-Bootu označeno jako PCI Interrupt D) je mapováno na IRQ 7 (0x07)

    Přiznám se, že mechanismu APIC úplně nerozumím, nevím jak se dovnitř řadiče podívat z AmigaOS a prohlédnout routovací tabulku a linux kvůli tomu instalovat nebudu. Stejně bych potom neuměla nastavení řadiče v AmigaOS změnit. Pro teď nám stačí vědět, že k takto namapovaným linkám je přičtena hodnota 16 ( 0x10 ) a tato čísla přerušení jsou použita v operačním systému v Interrupt Handleru.
    Moje domněnka je, že to vychází z předchozího ISA modelu, kde prvních 16 přerušení bylo vyhrazeno pro ISA interrupty.

    Definice: Interrupt number = číslo přerušení PCI funkce v operačním systému.

    4.2 malé cvičení v Rangeru



    Klikni pro plné zobrazení obrázku  Jméno: 4.2-PCI-Full-00.0A.00.jpg Počet zobrazení: 0 Velikost: 194,1 KB ID: 159420
    obr. 4.2



    Na obrázku 4.2 vidíme výstup z programu Ranger. Co vidíme:
    - Ethernetová karta má adresu 00.0A.00, tedy je zapojena do PCI 33 MHz slotu 3
    - jedná se o typ RTL8169
    - má přiřazenou linku přerušení 0x0B ( = 11 ), hardwarové přerušení je na pinu A PCI karty a číslo přerušení v AmigaOS je 27 ( 11+16=27 ) .

    Klikni pro plné zobrazení obrázku  Jméno: 4.3-PCI-Full-Int.handler.jpg Počet zobrazení: 0 Velikost: 156,6 KB ID: 159421
    obr. 4.3



    Na obrázku 4.3 vidíme jak vypadá nastavení Interrupt Handleru v AmigaOS:
    - rtl8169.device má číslo přerušení 27 ( 0x1B )
    - priotita přerušení této karty je 5
    - přerušení č. 27 je sdíleno s dalšími třemi zařízeními a nejvyšší prioritu 100 má grafická karta.

    4.3 kompletní přiřazení pinů INTx# u PCI funkcí

    Jenomže, co když daná PCI karta má více funkcí a třeba i více přerušení? Jako třeba southbridge na schematu 3.1. Ale nejen southbridge, i některé běžné karty mají více funkcí. Mohou pak potřebovat více fyzických přerušení.

    Klikni pro plné zobrazení obrázku  Jméno: 4.4-AmigaOneXE-PCI-Interrupts-detail.jpg Počet zobrazení: 0 Velikost: 195,0 KB ID: 159422
    schema 4.4 PCI HW IRQ detailní



    Tady to začíná být komplikovanější. Na obrázku vidíme tři PCI karty:
    - SATA řadič v PCI 33 MHz slotu 1: má jen jednu funkci i jedno HW přerušení ( pin A = INTA# ). To je připojeno fyzicky na PIRQ A# řadiče.
    - USB 2.0 karta v PCI 33 MHz slotu 2: ta má funkce dokonce tři a každá z funkcí má i své vlastní HW přerušení.
    00.09.00 USB OHCI je připojeno k pinu A PCI karty a fyzicky propojeno na PIRQ B# řadiče.
    00.09.01 USB OHCI je připojeno k pinu B PCI karty a fyzicky propojeno na PIRQ C# řadiče.
    00.09.02 USB EHCI je připojeno k pinu C PCI karty a fyzicky propojeno na PIRQ D# řadiče.
    Pin D na této kartě zůstává nevyužitý.
    Vidíte že každá funkce s vlastním přerušením je připojena na jiný fyzický pin karty i řadiče, prostě vždy posunutím o jednu pozici.
    - USB 2.0 karta v PCI 33 MHz slotu 3: je to druhá USB karta na PCI adrese 00.0A.0002 a vidíme že že hardwarové propojky jsou opět o jednu posunuty.
    Úplný přehled hardwarových pinů i mapovaných linek pak máme v tabulce dolní části schematu 4.4.

    4.4 PCI hlavička

    Každá PCI funkce má svůj konfigurační prostor v paměti. Ten základní se nazývá hlavička ( PCI header ). Hlaviček je několik typů. Typ 00h je hlavička standardních PCI funkcí a typ 01h je hlavička bridgů.
    PCIe zařízení má obecně hlavičku trochu jinou, ale to co vidí PCI sběrnice z PCIe karty je právě jen hlavička typu 00h a z PCI-PCIe bridge jen hlavička 01h. Takže pro nás je v tomto případě PCI a PCIe stejné.

    Klikni pro plné zobrazení obrázku  Jméno: 4.5-PCI-Header.jpg Počet zobrazení: 0 Velikost: 57,4 KB ID: 159423
    obr. 4.5 PCI hlavička



    Takto vypadá PCI hlavička, bílá pole jsou společná pro všechny typy hlaviček a budou nás zajímat.

    Klikni pro plné zobrazení obrázku  Jméno: 4.6-PCI-Full-01.00.00.jpg Počet zobrazení: 0 Velikost: 201,8 KB ID: 159424
    obr. 4.6 Ranger - PCI hlavička



    A všimněte si, že Ranger ukazuje právě údaje z PCI hlavičky.


    5. Zkoumáme PCIe grafickou kartu za PCI-PCIe bridgem

    Takže teorii již trochu známe a teď se podíváme podrobněji, co se v naší Amize při inicializaci PCI zařízení děje.

    To že naše grafická karta za PCI-PCIe bridgem není úplně správně inicializovaná to už víme. Jak ale má taková správná inicializace vypadat? No, na to by bylo třeba přečíst specifikace ještě podrobněji než jsem udělala já a zřejmě i hlubší znalosti AmigaOS. Pomůžeme si proto trochu srovnávací metodou.

    Vzala jsem PCI-PCIe bridge a kartu HD7750 a zapojila postupně do AmigaOne XE a Sam440ep-flex.
    To by mělo být více méně ekvivalentní použití bridgů a karet. A víme že v Sam440ep-flex to funguje jak má.

    Údaje se budou určitě lišit v adresách PCI zařízení a v přidělených linkách a číslech přerušení - to vše je závislé na konkrétním designu počítače, ale další vlastnosti by "měly být stejné".
    U Sam440ep-flex je arbitrem pro PCI sběrnici přímo CPU AMCC440. PCI zde splňuje normu 2.2. CPU obsahuje i řadič přerušení a umí již i modernější variantu - MSI. Myslím ale, že v AmigaOS není využita - stačí se podívat na namapovaná čísla přerušení - opět jsou všechna posunuta o 16 a nic sofistikovanějšího tu není.

    5.1 Porovnání bridgů v AmigaOne XE a Sam440ep-flex

    Začneme tím, že se podíváme jak jsou inicializovány bridge.
    Při srovnání stejných PCI-PCIe bridgů na AmigaOne XE a Sam440ep-flex nalezneme toto:

    Klikni pro plné zobrazení obrázku  Jméno: 5.1-XE-Sam-PCI-PCIe-bridge.jpg Počet zobrazení: 0 Velikost: 247,3 KB ID: 159425
    obr. 5.1 srovnání bridge AmigaOne XE - Sam440ep-flex



    Interrupt Line: AmigaOne XE: 0x00, Sam440: 0x19
    Bridge na Sam440ep má namapovaný interrupt line, tedy může generovat přerušení ( vlastní číslo linky zde není důležité, to se zcela jistě u různých typů počítačů liší ).
    AmigaOne XE má interrupt line 0x00. To je sice obecně vzato platná hodnota přerušení, ale v routovací tabulce přerušení southbridge XE je defaultní nastavení pro přerušení 0x00 Disabled. Tabulka se dá sice programovat, ale protože nemám nástroj v AmigaOS jak se do ní podívat, předpokládám že takto nastavený bridge přerušení negeneruje. V interrupt handleru AmigaOS se alespoň žádná hodnota neobjeví.
    Obecně vzato ale není chyba když bridge negeneruje přerušení. Moderní PCIe karta totiž nemá hardwarové piny INTx# a PCI Legacy přerušení negeneruje. Generuje místo toho PCIe zprávy Assert_INTx / Deassert_INTx. Transparentní bridge tyto zprávy přijaté od PCIe karty překládá na PCI Legacy hardwarová přerušení INTx# na PCI sběrnici.
    To jaká je u bridge nastavena hodnota Interrupt Line pouze říká, jaké číslo přerušení bude generovat bridge sám za sebe ( nikoli za kartu ). Přiznám se, že nevím jestli bridge sám vůbec něco generuje. Nejspíš ne, protože v Interrupt handleru v Sam440 také nic není.

    Liší se ještě v Cacheline size: AmigaOne XE 32 B, Sam440 128 B. Je to velikost cache, která se používá když se ukončují transakce Memory Write, Invalidate a Memory Read.
    Pokud bridge tyto transakce sám generuje nebo je přeposílá mezi sběrnicemi, musí tuto cache obsahovat.
    Pokud je cache 0 B, cache se nevyužívá a vše je samozřejmě pomalejší. Rozdíl ve velikosti cache je zřejmě daný různými vlastnosti PCI arbitru. Všechna PCI zařízení v AmigaOne XE, pokud mají cacheline, ji mají jen 32 B.
    Dále vidíme že většina ostatních údajů je stejných. A měla by být. Jsou to stejné bridge.

    Takže bychom chtěli u bridge v XE nastavit linku přerušení. Mám PCI-PCIe bridge v PCI 33 MHz slotu 3, tedy podle obr. 4.1 bychom chtěli hodnotu 11 ( 0x0b ).
    S tím vědomím, že toto je možná zbytečné, ale uškodit by to nemělo když to na Samu funguje.
    Na cacheline sahat nebudeme, pro XE je 32 B v pořádku.

    5.2 Porovnání grafických karet za bridgi v AmigaOne XE a Sam440ep-flex

    Nyní srovnáme údaje grafické karty HD7750 za PCIe bridgem v AmigaOne XE a Sam440ep-flex:

    Klikni pro plné zobrazení obrázku  Jméno: 5.2-XE-Sam-VGA.jpg Počet zobrazení: 0 Velikost: 244,7 KB ID: 159426
    obr. 5.2 srovnání PCIe grafické karty AmigaOne XE - Sam440ep-flex



    Opět se liší v přerušení - Interrupt Line: AmigaOne XE: 0xFF, Sam440 0x19
    A tady už vidíme že je to špatně. Hodnota 0xFF znamená, že linka není nastavena a zařízení interrupt vůbec negeneruje. U AmigyOne XE tedy grafická karta negeneruje přerušení.

    Opět je zde rozdíl ve velikosti cacheline Cacheline size: AmigaOne XE 0 B, Sam440 128 B. A toto nám už také vadí. Toto znamená že XE nepoužívá cache pro čtení a zápisy do paměti.

    A dále v registru Status: Sam440 má navíc RecMasterAbort, to ale pomineme, to je provozní stav na sběrnici.

    Takže bychom chtěli u karty v XE nastavit linku přerušení opět na hodnotu 11 ( 0x0b ). Dle specifikace PCI bus se první zařízení za bridgem mapuje na pin A karty bridge, takže zde opět 11 ( 0x0b ). Ve specifikaci je na to taková hezká velká tabulka, Interrupt Routing. Kdo chce, může si ji dohledat.
    A dále se pokusíme nastavit u XE hodnotu cacheline na 32 B. V hlavičce je tato hodnota uváděna v DWORDS ( 4 Bajty ), takže požadovaná hodnota bude 32/4 = 8 ( 0x08 ).


    6. Stav na PCI sběrnici a co tedy přesně chceme opravit

    Zapojení karet na sběrnici je v našem případě takto:
    PCI 33 MHz slot 1 ( adr 00.08.00): SATA řadič
    PCI 33 MHz slot 2 ( adr 00.09.00): NIC 1 GbE
    PCI 33 MHz slot 3 ( adr 00.0A.00): PCI-to-PCIe bridge
    - za bridgem nám vznikla nová PCI sběrnice 02:
    adresa 02.00.00: PCIe grafická karta

    Již jsem to v textu zmínila, ale teď si to nastavíme explicitně. PCIe bridge samozřejmě můžete dát i jinam, ale když ji budete mít takto, budou platné adresy PCI funkcí jak je uvádím dále v textu. Pokud využijete pro bridge jiný slot, musíte si adresy příslušně změnit.

    Chceme tedy nastavit toto:
    Bridge:
    - adresa 00.0A.00, Interrupt line = ( byte 3Ch v PCI hlavičce, viz obr 4.5 Hlavička) = 0x0b
    Karta:
    - adresa 02.00.00, Interrupt line = ( byte 3Ch v PCI hlavičce ) = 0x0b
    - adresa 02.00.00, Cacheline = ( byte 0Ch v PCI hlavičce ) = 0x08


    7. Oprava nastavení PCI hlaviček

    To se jednoduše řekne, ale jak to uděláme?

    7.1 Příkazy U-Boot

    V U-Bootu XE máme naštěstí pro práci s PCI sběrnicí několik mocných příkazů, kterými můžeme prohlížet a měnit nastavení na PCI sběrnici:
    pci [bus] [long] - short or long list of PCI devices on bus 'bus'
    pci header b.d.f - show header of PCI device 'bus.device.function'
    pci display[.b, .w, .l] b.d.f [address] [# of objects] - display PCI configuration space (CFG)
    pci next[.b, .w, .l] b.d.f address - modify, read and keep CFG address
    pci modify[.b, .w, .l] b.d.f address - modify, auto increment CFG address
    pci write[.b, .w, .l] b.d.f address value - write to CFG address


    7.2. Zkoumáme PCI sběrnici v U-Boot

    Nejprve si v U-Bootu prohlédneme co vlastně budeme dělat. V U-Boot vstoupíme do příkazové řádky.
    Nejdříve si prohlédneme zařízení na sběrnicích bus 0 a bus 2:
    Code:
    ] pci 00
    Scanning PCI devices on bus 0
    BusDevFun VendorId DeviceId Device Class Sub-Class
    __________________________________________________ ___________
    00.00.00 0x10cc 0x0660 Bridge device 0x00
    00.01.00 0x10cc 0x0661 Bridge device 0x04
    00.06.00 0x10b7 0x9200 Network controller 0x00
    00.07.00 0x1106 0x0686 Bridge device 0x01
    00.07.01 0x1106 0x0571 Mass storage controller 0x01
    00.07.02 0x1106 0x3038 Serial bus controller 0x03
    00.07.03 0x1106 0x3038 Serial bus controller 0x03
    00.07.04 0x1106 0x3057 Build before PCI Rev2.0 0x00
    00.07.05 0x1106 0x3058 Multimedia device 0x01
    00.07.06 0x1106 0x3068 Simple comm. controller 0x80
    00.08.00 0x1095 0x3114 Mass storage controller 0x04
    00.09.00 0x1033 0x0035 Serial bus controller 0x03
    00.09.01 0x1033 0x0035 Serial bus controller 0x03
    00.09.02 0x1033 0x00e0 Serial bus controller 0x03
    00.0a.00 0x12d8 0xe111 Bridge device 0x04
    ]
    ] pci 02
    Scanning PCI devices on bus 2
    BusDevFun VendorId DeviceId Device Class Sub-Class
    __________________________________________________ ___________
    02.00.00 0x1002 0x683f Display controller 0x00
    02.00.01 0x1002 0xaab0 Multimedia device 0x03
    Vidíme zde náš bridge ( 00.0a.00 ) i grafickou kartu ( 02.00.00 ). Pokud budete mít karty jinak osazeny než já, tak zde si zkontrolujete správné PCI adresy.
    Teď se podíváme na PCI hlavičku bridge:
    Code:
    ] pci header 00.0a.00
    vendor ID = 0x12d8
    device ID = 0xe111
    command register = 0x0007
    status register = 0x02b0
    revision ID = 0x02
    class code = 0x06 (Bridge device)
    sub class code = 0x04
    programming interface = 0x00
    *** cache line = 0x08 ***
    latency time = 0x20
    header type = 0x01
    BIST = 0x00
    base address 0 = 0x00000000
    base address 1 = 0x00000000
    primary bus number = 0x00
    secondary bus number = 0x02
    subordinate bus number = 0x02
    secondary latency timer = 0x00
    IO base = 0x21
    IO limit = 0x21
    secondary status = 0x2000
    memory base = 0xa000
    memory limit = 0xa000
    prefetch memory base = 0x9001
    prefetch memory limit = 0x9ff1
    prefetch memory base upper = 0x00000000
    prefetch memory limit upper = 0x00000000
    IO base upper 16 bits = 0x0000
    IO limit upper 16 bits = 0x0000
    expansion ROM base address = 0x00000000
    *** interrupt line = 0x00 ***
    interrupt pin = 0x01
    bridge control = 0x0018
    ]
    ] pci display 00.0a.00
    00000000: e11112d8 02b00007 06040002 000120***08***
    00000010: 00000000 00000000 00020200 20002121
    00000020: a000a000 9ff19001 00000000 00000000
    00000030: 00000000 00000080 00000000 001801***00***
    V podrobném i kompaktním výpisu vidíme hodnoty cacheline i interrupt line dodatečně zvýrazněné ***hvězdičkami***.
    Zde je výpis pro grafickou kartu se zvýrazněnými hodnotami:
    Code:
    ] pci header 02.00.00
    vendor ID = 0x1002
    device ID = 0x683f
    command register = 0x0007
    status register = 0x0010
    revision ID = 0x00
    class code = 0x03 (Display controller)
    sub class code = 0x00
    programming interface = 0x00
    *** cache line = 0x00 ***
    latency time = 0x00
    header type = 0x80
    BIST = 0x00
    base address 0 = 0x9000000c
    base address 1 = 0x00000000
    base address 2 = 0xa0000004
    base address 3 = 0x00000000
    base address 4 = 0x00002001
    base address 5 = 0x00000000
    cardBus CIS pointer = 0x00000000
    sub system vendor ID = 0x1043
    sub system ID = 0x0427
    expansion ROM base address = 0x00000000
    *** interrupt line = 0xff ***
    interrupt pin = 0x01
    min Grant = 0x00
    max Latency = 0x00
    ]
    ] pci display 00.0 02.00.00
    00000000: 683f1002 00100007 03000000 008000***00***
    00000010: 9000000c 00000000 a0000004 00000000
    00000020: 00002001 00000000 00000000 04271043
    00000030: 00000000 00000048 00000000 000001***ff***

    7.3. Oprava nastavení PCI hlavičky

    Co tedy neudělal U-Boot, zkusíme opravit my. Pokud to děláte poprvé, zhluboka se nadechněte a můžeme začít se změnou přerušení u bridge:
    Code:
    ] pci write.b 00.0A.00 3c 0b
    ] pci display 00.0a.00
    00000000: e11112d8 02b00007 06040002 00012008
    00000010: 00000000 00000000 00020200 20002121
    00000020: a000a000 9ff19001 00000000 00000000
    00000030: 00000000 00000080 00000000 001801***0b***
    a vidíme, že interrupt PCIe bridge se nám změnil na požadovanou hodnotu. Ufff. Tak pokračujeme s grafickou kartou:
    Code:
    ] pci write.b 02.00.00 3c 0b
    ] pci write.b 02.00.00 0c 08
    ] pci display 02.00.00
    00000000: 683f1002 00100007 03000000 008000***08***
    00000010: 9000000c 00000000 a0000004 00000000
    00000020: 00002001 00000000 00000000 04271043
    00000030: 00000000 00000048 00000000 000001***0b***
    A vidíme že u grafické karty jsme změnili interrupt i cacheline.

    Pak stačí nabootovat do systému a voilá:

    Klikni pro plné zobrazení obrázku  Jméno: 7.1-XE-02.00.00-VGA-UPRAVENO-2.jpg Počet zobrazení: 0 Velikost: 184,1 KB ID: 159427
    obr. 7.1 PCIe grafická karta po opravě




    Klikni pro plné zobrazení obrázku  Jméno: 7.2-XE-InterruptHandler-PCIFix2.jpg Počet zobrazení: 0 Velikost: 146,3 KB ID: 159428
    obr. 7.2 AmigaOS Interrupt Handler



    Takže se povedlo!


    8. Využití U-Boot menu PCI/AGP

    Dále by se nabízelo využít další možnosti U-Bootu, jiné nastavení linek přerušení.

    Klikni pro plné zobrazení obrázku  Jméno: 8.1-UBootAGP-PCI.jpg Počet zobrazení: 0 Velikost: 131,8 KB ID: 159429
    obr. 8.1 U-Boot menu "PCI/AGP"



    V menu "PCI/AGP" můžeme kromě AGP bridge nastavit také "IRQ level" pro PCI přerušení.
    Tedy upravit mapování linek na jiné hodnoty. Pro každý že čtyř fyzických pinů řadiče ( v menu označeno PCI interrupt A = PIRQ A#, atd ) je možno vybrat jednu z hodnot 9, 10, 11, 13, 7.

    Doposud jsme pracovali se defaultním nastavením, tak jako je to na obrázku.
    Pokud nastavení změníte jen posunutím ( třeba PCI int A = 10, B= 11, C=7, D=9), tak se změní linky a čísla přerušení, ale z hlediska uživatele i systému je to jedno. To nám nepomůže.
    Mapovat dvě nebo více fyzických přerušení na stejné linky není rozumné a nedává to moc smysl. Prostě by jen více zařízení mělo shodné číslo přerušení.
    A pokud použijete hodnotu 13 ( 0xD ) u jednoho z interruptů, nic se nestane, na 13 se nic nenamapuje.
    V routovací tabulce řadiče je interrupt 13 označen jako "Reserved" a nevím přesně co dělá. Fakt je, že ani v Iterrupt Handleru AmigaOS se pak žádné přerušení č.29 ( = 13+16 ) neobjevuje.

    A co ještě můžeme v U-Boot menu nastavit je jak bude interrupt generován:
    "Trigerred by level" - přerušení je generováno stále a ukončí jej pouze proces vyřešení přerušení. Za normálních okolností je to správné nastavení. Přerušení se prostě řeší tak dlouho, dokud zařízení přerušení hlásí.
    "Trigerred by edge" - přerušení je vygenerováno jen jednou ( když fyzický signál naroste ). Takže se může někdy stát, že přerušení nikdo nevyřeší.
    Toto nastavení se normálně nepoužívá. Je vhodné jej použít pouze v případě, že při obsluze přerušení tuhne systém - tedy když je zařízení zahlceno požadavky a ovladač není napsán ideálně.

    V našem snažení nám tedy změna linek přerušení na jiná čísla nepomůže. Pokud by někdo chtěl, může se pustit do dalších experimentů s hodnotou linky 13 ( 0xD ). Bylo by zajímavé vědět proč zde tato možnost je a na co ji použít.


    9. Automatizace

    Nastavit správně přerušení na PCIe grafické kartě umíme. Bylo by ale nepraktické při každém bootování znovu zadávat pci write příkazy. To by se nám brzy omrzelo. Naštěstí si to ale můžeme zautomatizovat.
    V AmigaOS si v shellu vytvoříme novou environmentální proměnnou, „pcifix“. Můžete to samozřejmě udělat i z příkazové řádky U-Boot, ale takto je to pohodlnější.
    Code:
    > nvsetvar pcifix "pci write.b 00.0a.00 3c 0b; pci write.b 02.00.00 3c 0b; pci write.b 02.00.00 0c 08"
    A pak to zkontrolujeme:
    Code:
    > nvgetvar pcifix
    pci write.b 00.0a.00 3c 0b; pci write.b 02.00.00 3c 0b; pci write.b 02.00.00 0c 08
    Pak můžeme při každém startu v U-Boot příkazové řádce zadat pouze jeden příkaz:
    Code:
    ] run pcifix
    A máme opraveno bez rizika překlepu.

    A pokud jsme s výsledkem opravy nastavení PCI spokojeni a skončili jsme s testováním, uděláme si úplnou automatizaci. Upravíme ještě proměnnou „menuboot_cmd“ takto:
    Code:
    > nvsetvar menuboot_cmd "run pcifix; boota; boota; boota"
    Tím se nám oprava spustí automaticky před každým bootem do AmigaOS.
    Nezapoměňte ale tuto proměnnou vrátit do původního stavu když PCIe kartu z Amigy odstraníte.


    10. Jiné verze U-Boot

    Všechny testy byly dělány s poslední oficiální verzí U-Boot od Hyperionu, tedy 1.1.1.
    Nicméně betatesteři měli k dispozici i další verze, které ovšem nebyly nikdy oficiálně uvolněny.
    Kromě toho, že by vyšší verze měly umožnit bootovat i z dalších PCI karet ( SiI3114, SiI35121 ) jsou v nich pro nás i další rozdíly:

    Klikni pro plné zobrazení obrázku  Jméno: 10.1-Tabulka-UBoot.jpg Počet zobrazení: 0 Velikost: 80,5 KB ID: 159430
    tabulka 10.1 verze U-Boot



    A ani jediný U-Boot neumí pracovat s PCIe bridgem PEX8111.
    Ale vyšší verze U-Boot 1.1.6 a 1.2.0 již umí správně přiřadit linku přerušení ke grafické kartě za PCI-PCIe bridgem. Cacheline karty zůstává u všech nulová.


    11. Závěr

    Po ručním nastavení přerušení a cacheline rychlost grafické karty stoupla jen úplně nepatrně.
    MPlayer zrychlil o dvě sekundy: z 307.905 s na 305.879 s.
    ioquake3 zrychlil z 21.5 FPS na 21.9 FPS.
    Takže v běžném provozu uživatel nic nepozná. Asi by to chtělo rychlejší CPU než je mých 800 MHz, aby rozdíly byly větší. Můžeme být ale spokojeni že jsme opravili chyby U-Bootu a rozumíme zase více věcem.

    Ale hezké je že před úpravou vypadal serial debug v části RadeonHD takto:
    Code:
    ...
    RadeonHD.chip (0): RadeonHD card successfully opened
    RadeonHD.chip (0): UBoot has not initialized the graphics card's interrupt line. Disabling interrupts.
    RadeonHD.chip (0): Please upgrade your UBoot firmware.
    a1ide.device 53.22 (28.6.2017)
    [a1ide/dev_init] a1ide_timeout : '10', adjusted ata timeout to 10
    ...
    A po naší úpravě vypadá takto:
    Code:
    ...
    RadeonHD.chip (0): RadeonHD card successfully opened
    a1ide.device 53.22 (28.6.2017)
    [a1ide/dev_init] a1ide_timeout : '10', adjusted ata timeout to 10
    ...
    Jako další velký bonus zadarmo jsme získali to, že teď můžeme na naší AmigaOne XE používat i tzv."combo" karty. Jsou to karty, které v sobě obsahují PCI-to-PCI bridge a za ním více zařízení. Například SATA a Firewire, SATA+USB. Pravda je, že většina z nich má ovladače jen v linuxu, ale i tak. Víme teď, jak je zprovoznit.

    Rébus schema PCI z počátku článku:
    Tedy řešení zde nenajdete, jen úvahu.
    Podle PCI specifikace, pokud jsou na jedné sběrnici společně zařízení s rychlostí 33 MHz a 66 MHz, tak celá sběrnice pracuje na 33 MHz. Takže podle toho by PCI-to-PCI bridge 00.01.00, který odděluje PCI bus 1 ( 66 MHz ) pracoval jen na 33 MHz. Takže grafická karta může být rychlá jak chce, ale přenosová rychlost pak může být limitována na rychlost PCI bus 0, 33 MHz.

    Klikni pro plné zobrazení obrázku  Jméno: 11.1-AmigaOneXE-PCI-diagram-northbridge.jpg Počet zobrazení: 0 Velikost: 66,2 KB ID: 159436


    Pokud by Artticia S byla skutečně uvnitř konstruována tak, jak ukazuje Ranger, data z PCI bus 1 66 MHz by nikdy nepsáhla přenosovou rychlost 133 MB/s.
    Být to tak nemusí, jde pouze o schema vzniklé na základě údajů z Rangeru - tedy jak je PCI vidět z firmwaru a operačního systému. Ve skutečnosti jsou Host bridge ( 00.00.00 ) i PCI-to-PCI bridge ( 00.01.00 ) uvnitř northbridge ArticiaS a může to být propojeno jinak. Podrobný manuál Articia S se mi bohužel získat nepodařilo.
    Faktem ovšem je že Pegasos 2 ( s northbridgem Marwell Discovery 2 ) nemá jeden Host bridge a PCI-to-PCI bridge, ale dva nezávislé Host bridge pro 66 MHz a 33 MHz zvlášť.
    Pegasos 2 ( PCI 66 MHz ) dosahuje rychlosti zápisu do VRAM 221 MB/s.
    AmigaOne XE ( AGP x2 / PCI 66 MHz ) dosahuje rychlosti zápisu do VRAM pouze 111 MB/s a to i pro AGP x2.
    Zvláštní ne?

    A nakonec speciální poděkování pro Evillord68 za pomoc.
    Naposledy upravil sailor; 22.11.2022, 09:28:38.

    • sailor
      #1
      sailor komentoval
      Editace komentáře
      doplněn obrázek k rébusu aby to bylo trochu jasnější
    Přidávání komentářů není v této časti diskusního fóra bez přihlášení možné, nebo zde nejsou povoleny.

Nejnovější články

Sbalit

  • AmigaNG – kompatabilita HW s AmigaOS, MorphOS a linux
    vytvořil sailor
    Loni jsem si pořídila Sam460LE. Bude o něm samostatný článek, zde pouze zmíním že je to jeden z pouhých tří PPC počítačů, na kterých můžete provozovat nativně všechny tři mé oblíbené operační systémy, tedy AmigaOS, MorphOS a Debian linux ( pro zajímavost, ty dva další počítače jsou Pegasos 2 a AmigaOne X5000 ). A protože jsem Sama testovala s MorphOSem i AmigaOSem, tak mě to inspirovalo k napsání tohoto článku o úskalích na která můžete narazit.

    Na všech ostatních...
    10.03.2024, 10:26:13

Nové komentáře v článcích

Sbalit

Populární tagy v článcích

Sbalit

a1200 (6) akce (15) amiga (16) amigaos3.2 (4) apple (7) artway (5) cybergraphx (5) demoscena (8) dizzy (9) emulace (8) fastata (9) furia (5) hardware (15) internet (6) iomega (6) mac (6) midi (8) morphos (14) navody (10) pfs3 (8) resetkání (5) rozhovory (4) srazy (11) winuae (10) zip (7)
Zpracovávám...
X