Jj, pomocí bus-master i pass thru se dají data pomocí DMA přenášet. Jde přesně o to, jaké DMA máte na mysli, jestli to iniciované řadičem PCI nebo iniciované samotnou kartou. V tom druhém případě se jedná přesně o postup popsaný v článku - čip AMCC dokáže blokové přenosy sám "uřídit".
Zvyšuje se tam frekvence z 66/133 až na 266 či dokonce 533 MHz, trošku se upravila specifikace a přenosový protokol, takže se dají od sběrnice "odstavit" vadné karty (pro servery někdy dost podstatná vlastnost) popř. testovat, zda se data přenesla v pořádku (CRC), ale - máte pravdu - zpětná kompatibilita je zachována, přesněji je zachována pro 3,3 V karty.
Toto je článek, který mě potěšil nejen tématem, alel i vysokou kvalitou zpracování. Toto jsou články které tu chybí. Žádná povrchnost pěkně do hloubky a odborně.
1) vYnikajici se pise
2) tentokrat me p. Tisnovsky kvalitou zpracovani trochu zklamal, prijde mi, ze prvni pulka clanku (vysvetleni rozdilu 3.3/5) je popsani jedne veci 4x po sobe ruznymi vetami a vypada to dost neucesane.
Nicmene obsahove jde porad o jedny z nejlepsich clanku na rootu ;)
Pořád mně není úplně jasné, jak na PCI sběrnici proběhne taková typická činnost jako třeba čtení a zápis do portu, které procesor realizuje pomocí instrukcí IN a OUT.
Představme si, že máme PCI kartu - třeba adaptér pro paralelní port, jaké se ještě používají na tiskárnách. Kartu dáme do slotu, pustíme počítač a paralelní port je tam vidět na nějakých adresách portů, normálně s tím pracujeme pomocí IN a OUT, jakoby ty registry byly připojeny přímo k lokální sběrnici procesoru. Kdo toto zařídí ? BIOS nějak ve spolupráci s chipsetem základní desky vyčte z karty na jakých adresách mají být ty porty/registry vidět ? A chipset pak podle toho nějak na lokální sběrnici emuluje pro procesor existenci těch portů ? Jak tohle vlastně funguje ?
Podle meho nazoru je to podobne jako pri ISA sbernici. Pri zapnuti PC BIOS nebo OS nakonfiguruje PCI kartu tak ze jeji adresny dekoder bude reagovat na vybranou hodnotu ktera se objevi na zbernici. Pro tohle je na karte EEPROM kde je ulozena default PCI konfigurace, kterou BIOS a OS precte.
Potom zapis/cteni probiha zhruba nasledovne: na sbernici se objevi adresa, jestli existuje karta ktera spada do nastaveneho adresniho prostoru tak se provede cteni/zapis. Karta muze mit namapomavanou interni pamet a/nebo HW registry nebo do pametoveho prostoru v PC ve dvou modech: v adresnim a v registrovem modu, v prvnim pripade se do karty zapisuji data pres instrukci mov, etc a v druhem pripade pres instrukce procesoru in a out.
Nojo, ale PCI je prece od adresni sbernice procesoru oddelena (!!) Karta, pripojena k PCI prece nemuze detekovat spravnou adresu, ktera se objevi na adresni sbernici procesoru. To by musel nejak delat chipset, ve kterem je zaroven i nejaky "radic PCI" ~ bridge. Chipset by detekoval na sbernici procesoru spravnou adresu a pak by nalezite na PCI vygeneroval cykly pro presun dat - jenze to uz je neco docela jineho nez na sbernici procesoru.
A prave toto me zajima - jak presne to funguje ?
Na ISA sbernici je to predstavitelne docela dobre - ta je totiz ke sbernici procesoru mnohem blize.
Podle me to prave takto funguje, ovsem s tim rozdilem, ze spravna karta je dopredu vybrana svoji pozici v PCI slotu. Prime mapovani instrukci IN a OUT procesoru je tak rozlozeno na dve casti - cesta od mikroprocesoru k north bridge a nasledne cesta od north bridge k PCI karte.
Mimochodem, dnes je ISA prave dal od procesoru nez byla v dobach 88/86/286/386, v podstate je cela emulovana v south bridgi.
Kazda karta ma BAR registry ktere nakonfiguruje OS. Tyhle BAR registry se prave pouzivaji k urceni toho, jake fyzicke I/O porty a memory regiony bude karta pouzivat. Pak je tam jeste PCI configuration space jestli si dobre pamatuji, s fixnimi adresami, ktere se prave pouziva pro zjisteni pevne danych informaci o PCI karte (a taky jake prostredky potrebuje priradit)
Pochopitelně. Měl jsem na mysli ISA v její ryzí podobě. Mimochodem se takto vyskytovala i na základních deskách s 486 - ano, zpočátku se desky pro 486 dělaly pouze s ISA sběrnicí.
Každá PCI karta má přístupné PCI konfigurační registry. Jedním z těchto registrů je i PCI command register neboli PCICMD, v něm se dá nastavit, zda má karta reagovat (a správně dekódovat) paměťové adresy a adresy IO portů (konfigurace jsou nezávislé, možné jsou všechny čtyři kombinace).
Dále jsou zde umístěny v článku popsané registry Base Address Registers neboli BADR (BADR0-BADR5). V těchto registrech jsou po resetu karty umístěny požadované rozsahy adres, například grafická karta bude požadovat dejme tomu v BADR0 rozsah 16 MB. Kromě toho je v nultém bitu flag, zda se jedná o paměťový region nebo o I/O region. To znamená, že nějaká karta může mít například tři paměťové regiony a tři regiony I/O. Kromě toho je prvním bitem nastaveno, zda se má region mapovat pod 1 MB či ne - opět se u grafických karet minimálně jeden region mapuje pod 1 MB do rozsahu a0000-b0000, tj. tam kde očekává video RAM jak BIOS, tak i DOSové programy.
Takže typicky se třeba pro paralelní port na PCI kartě vytvoří I/O region mapovaný pod 1 MB.
Na PCI sběrnici neexistují signály typu memory-read, memory-write, IO-read, IO-write apod. Vše se místo toho - jak je u universálních sběrnic zvykem - řeší příkazy, které jsou posílány po vodičích C/BE0 až C/BE3. Díky tomu je možné rozeznat 16 příkazů, mezi jinými i:
Nás zajímají I/O READ a I/O WRITE. Právě ty slouží k adresování I/O portů. O překlad mezi instrukcí IN a OUT mikroprocesoru a vysláním nějakého příkazu na PCI kartu, se musí postarat north bridge. Ten je z jedné strany připojený na mikroprocesor a zdetekuje vykonávání příslušné instrukce (hlídá si adresovací "nožičky" :-) a provede překlad.
Díky. Docela mě potěšilo, že jsem nebyl ve svých úvahách příliš daleko od pravdy. Už léta jsem občas přemýšlel, jak to vlastně je a že instrukce IN a OUT musí vlastně konvertovat chipset (north bridge).
Na I/O porty můžeš lézt z userspace normálně instrukcemi assembleru in a out (poté, co si povolíš přístup na porty pomocí syscallu iopl --- na to musíš být root). Do paměťově-mapovaných registrů tak, že si namapuješ příslušnou část /dev/mem pomocí syscallu mmap a pak k ní přistupuješ. Co se týče PCI-konfiguračního prostoru, tak buď přes I/O porty --- tam ovšem hrozí, že se popereš s kernelem, který na ty PCI porty bude přistupovat současně (steré Xservery to tak dělaly), nebo přes sysfs (třeba /sys/bus/pci/devices/0000:00:01.0/config).
Asi proto, že dokud nezměníš IOPL pro daný proces, tak opravdu jen z userspace opravdu nejdou. Jinak pozor, iopl() opravdu nastavuje bity IOPL v EFLAGS, což má i jiné vedlejší efekty, např. povolení instrukce "cli".
BTW ví někdo, jak to funguje na jiných architekturách než x86? Co třeba powerpc?
Buď to jde řešit způsobem, jaký naznačili předřečníci, nebo je možné použít nějaký dummy driver, který funkce nějaké karty zpřístupní v user space. Podobná věc, jakýsi universální driver pro PCI zařízení (s podporou pass thru i bus-masteru) v Linuxu, před pár lety řešili v rámci diplomek na VUT v Brně na automatizaci, asi by se dalo zjistit, v jakém je celá věc stavu. Viděl jsem zdrojáky ještě neodladěné verze (ta byla určena pro jednu konkrétní kartu) a bylo to docela čitelné, hlavně v porovnání s funkčně stejnými zdrojáky určenými pro Windows (DDK) :-)
Z článku mi není jasné, zda jde použít 64bit PCI kartu v běžném 32bit PCI slotu?
Vím, asi to není moc typické a čisté, protože část konektorů na kartě tak visí nezapojena "ve vzduchu", ale nebrání-li tomu na boardu nic mechanicky... ?
Pracovat by taková karta měla, v módu kompatibility s 32bitovou PCI. Co se týče adresování, tam 32 bitů dostačuje, datová část přenosu bude probíhat poloviční rychlostí. Ovšem za předpokladu, že se tam 64bitová karta doopravdy vleze, protože těsně za PCI konektory bývají na základní desce další součástky.
Třeba (když bych se měl vrátit k předchozím částem seriálu) mám doma stařičkou funkční 486ku s VESA Local Busem na které je dlouhatááánskááá grafická karta, která buď musí být trošičku ohnutá nebo ne zcela zastrčená do konektoru, zavazí další součástky :-)
Dobry den prosim Vas moc o radu, potrebuju vyrobit USB do PCI slotu dostal jsem to za ukol na dlouhodobou praci ve skole a potrebuju s tim poradit kde sezenu nejake veci k tomu uz jsem se dival a nic jsem nenasel jsem uplne bezradny prosim Vas o pomoc dekuji
na jan.priky@seznam.cz
nebo na ICQ 311695456
kdyby jste vedeli o cemkoliv jak to vyresit tak budu moc rad, prosim Vas vsechny o rady diky