Úloha F
Měření na PCI sběrnici
Vypracovali:
Jiří Trávníček
Tomáš Uko
Martin Bruchanov
Miloš Hrdý
Obsah:
Změřte průběhy signálů základních cyklů na PCI sběrnici.
Pomocí programu dumpci zjistěte informace o PCI sběrnici a typy připojených adaptérů.
Měření průběhů proveďte pomocí dvou počítačů PC. Jeden z dvojice počítačů je vybaven měřící kartou PCI sběrnice. Měřící karta je osazena obvodem XILINX, který snímá průběhy jednotlivých signálů a ukládá je do dynamické paměti (DIMM moduly umístěné přímo na měřící kartě). Měřící karta je propojena s druhým počítačem přes paralelní port. Tento počítač je vybaven sběrným softwarem, který zobrazí snímané průběhy.
Postup měření:
Počítač, který je vybaven měřící kartou, restartujte v módu MS-DOS. Přejděte do adresáře e:\testpci, resp. c:\testpci (dle měřícího počítače). V tomto adresáři je umístěn program testpci, který generuje sběrnicové cykly. Na počítači s měřícím programem najděte na ploše ikonu PCI Analyzátor a měřící program spusťte. V hlavní nabídce vyberte Soubor – Nové měření. Ponechejte nastavenou volbu měření „Bez podmínky“. Na druhém počítači spusťte testpci s určitým parametrem. V zápětí na měřícím počítači stiskněte tlačítko Start. Po chvíli můžete zastavit měření tlačítkem Stop nebo vyčkat, až se zaplní paměť vzorků. Aktuální měření uložte do souboru. Obsah obrazovky si můžete uložit také jako obrázek bmp pomocí nabídky Soubor – Uložit jako obrázek (Pozor: Okno s výběrem souboru odsuňte mimo okno s navzorkovanými signály. Pokud okno výběru překrývá hlavní okno, objeví se v místě překryvu díky chybě v programu v uloženém obrázku bílý obdélník).
Program testpci je napsán v assembleru. Zdrojový kód máte k dispozici. Prostudujte jej. Program se spouští vždy s parametrem; podle něj se generují sběrnicové cykly. Parametry programu jsou následující:
mread......čtení jednoho bytu z paměti
mwrite.....zápis jednoho bytu do paměti
ioread.....čtení 8-bitového portu
iowrite....zápis 8-bitového portu
bytemerge..spojování několika 8-bitových zápisů
cfgread....čtení konfiguračního registru
longwrite..zápis několika po sobě následujících dwordů
iack.......potvrzováni přerušení, vyslání vektoru
special....vyvolání speciálního cyklu
Poznámky k měření:
POZN.: Operace čtení a zápis do paměti se provádějí do videopaměti.
Sejměte průběhy všech cyklů, které program umí generovat (mimo iack). Uveďte je do protokolu a patřičně okomentujte.
Smyčka pro tento parametr zapisuje jednu slabiku do videopaměti (na adresu A000h:0000h). Vyzkoušejte různé varianty zápisu, zejména zápis slabiky na lichou adresu, zápis na adresu, která není dělitelná čtyřmi, zápis slova (word), dvojslova (double word). Pozorujte, jak se změny v programu projeví na přenášené adrese a signálech C/BE#.
Zjistěte, pro jaké typy přenosu dat (jaké části kódu) optimalizuje můstek Host-to-PCI zápisy (spojení do blokového přenosu apod.). Zjistěte, co se stane, změníte-li adresy zápisu v případě varianty longwrite (např. posun offsetu všech adres o 1).
Analyzujte kód programu a zjistěte, z kterého zařízení (jaké ID) a jaké konfigurační registry jsou čteny. Z přenášených dat na sběrnici dekódujte obsah těchto registrů.
Zasílaná zpráva během speciálního cyklu je z množiny rezervovaných kódů, tj. bez významu. Popište sled signálů. Upravte kód programu tak, aby byla zasílána zpráva SHUTDOWN. Pozorujte chování počítače.
POZN.: Cykly v jednotlivých podprogramech jsou realizovány instrukcí loop. Jde tedy o cykly s pevným počtem opakování. Program se neukončuje stiskem libovolné klávesy, jak tomu většinou bývá.
2. Zjištění připojených PCI adaptérů
Prostudujte zdrojový kód programu dumppci.c, zejména využití jednotlivých služeb PCI BIOSu. Program spusťte a zjistěte informace o PCI sběrnici a připojených zařízeních. Na základě výpisu uveďte do protokolu tabulku s dekódovanými informacemi: výrobce zařízení a typ výrobku (číselné označení i jméno výrobce – vyhledejte na internetu), třídu zařízení podle přílohy D normy PCI, přidělenou adresu počátku paměťového a V/V prostoru, přerušovací vektor, časování signálu DEVSEL.
Pro zájemce: Konfigurační registr COMMAND obsahuje bit Memory Space. Nastavením tohoto bitu na hodnotu log. 0 zakážeme příslušnému zařízení akceptovat příkazy přistupující k paměťovému prostoru (memory read/write). Upravte smyčku cfgread na zápis tak, aby byl nulován tento bit na VGA kartě (nejprve musíte zjistit její ID z výpisu všech zařízení). Pozorujte její chování.
Sběrnice PCI Local Bus (Peripheral Component Interconnect) je pseudosynchronní 32 nebo 64-bitová sběrnice. Ač se v názvu vyskytuje označení Local Bus, její postavení v architektuře PC neodpovídá lokální sběrnici. Mezi její přednosti patří zejména blokový přenost dat (burst mód) a podpora PnP. Umožňuje (podobně jako u sběrnice ISA) prodloužit sběrnicový cyklus. Na rozdíl od sběrnice ISA je přívlastek označující vlastnost synchronnosti skutečně na místě, neboť všechny události jsou vztaženy k vzestupným hranám synchronizačních (hodinových) pulsů. Přidělování sběrnice je centralizované. Zařízení, kterému je sběrnice přidělena, se nazývá master (iniciátor), „partner“ komunikace s iniciátorem je target (cíl). Základní frekvence hodinového signálu je 33 Mhz, norma definuje i verzi PCI 66 MHz. Špičkově je možné přenést data na každou hranu hodinového signálu.
Na běžných deskách je implementována verze 32bitů/33 MHz, verze 66MHz je základem rozhraní AGP, 64 bitovou sběrnici nalezneme díky vyšší ceně implementace pouze na deskách určených pro serverové aplikace.
Norma PCI definuje 47 (resp. 49 pro zařízení typu Master) povinných signálů, které musejí být implementovány na každém zařízení PCI. Další signály jsou volitelné.
Základní signály, se kterými se pracuje v rámci laboratorního cvičení. (znak # označuje inverzní signál, tj. aktivní v log. 0):
CLK Clock je hodinový (synchronizační) signál
RST# Reset je asynchronní reset
Datové signály:
AD[31::00] Address and Data jsou multiplexované adresové a datové vodiče. Stav sběrnicového cyklu určuje, zda je na těchto vodičích právě přenášena adresa či data.
C/BE[3:0]# Bus Command and Byte Enables jsou opět multiplexované signály. Po těchto vodičích se přenáší příkaz nebo příznak platnosti dat. Význam je opět určen stavem sběrnicového cyklu.
PAR Parity je sudá parita. Zabezpečuje společně signály AD a C/BE.
Signály k řízení sběrnicového cyklu:
FRAME# Cycle Frame řídí transakci (sběrnicový cyklus). Určuje její začátek a konec.
IRDY# Initiator ready oznamuje, že iniciátor je připraven k datovému přenosu. V případě zápisu to znamená, že jsou na datové sběrnici platná data, v případě čtení indikuje, že přečte přenášená data.
TRDY# Target ready oznamuje, že cílové zařízení je připraveno k datovému přenosu.
STOP# Signál Stop je řízen cílem (targetem). Žádá iniciátor o zastavení probíhající transakce.
IDSEL# Initialization Device Select je dvoubodový spoj, vedoucí od řadiče sběrnice ke každému zařízení. Slouží k výběru zařízení (jako chip-select) při konfiguraci zařízení.
DEVSEL# Device Select je výstup adresového dekodéru zařízení. Indikuje aktuálnímu masteru, zda bylo nějaké zařízení vybráno (adresou na sběrnici).
LOCK# Umožňuje zamknout sběrnici pro provedení atomické transakce.
Signály k řízení přidělování sběrnice:
REQ# Signál Request je dvoubodový signál. Pomocí něj žádá zařízení (potenciální master) přidělovač sběrnice o její přidělení.
GNT# Signál Grant je opět dvoubodový. Přidělovač sběrnice oznamuje tímto žádajícímu zařízení, že mu sběrnice byla přidělena (odpověď na signál REQ#).
Hlášení chyb:
PERR# Parity Error se používá k hlášení chyby parity. Řídí jej příjemce dat.
SERR# System Error je generován při chybě parity během speciálního cyklu nebo při jiné chybě, např. přetečení adresy.
Přerušení:
INTA# Signály žádosti o přerušení (nepovinné). Každé konstruované zařízení by mělo primárně využít signál INTA#, pouze u tzv. multifunkčních zařízeních (více zařízení v jednom čipu s jedním rozhraním nebo více zařízení na jednom adaptéru) mohou být zapojeny také signály další.
Řízení sběrnice PCI je určeno příkazem přenášeným k zařízení pomocí vodičů C/BE#.
Seznam příkazů :
C/BE[3::0]# |
Typ příkazu |
0000 |
Potvrzení přerušení (Interrupt Acknowledge) |
0001 |
Speciální cyklus (Special Cycle) |
0010 |
Čtení z portu (I/O Read) |
0011 |
Zápis na port (I/O Write) |
0100 |
Rezervováno (Reserved) |
0101 |
Rezervováno (Reserved) |
0110 |
Čtení z paměti (Memory Read) |
0111 |
Zápis do paměti (Memory Write) |
1000 |
Rezervováno (Reserved) |
1001 |
Rezervováno (Reserved) |
1010 |
Konfigurační čtení (Configuration Read) |
1011 |
Konfigurační zápis (Configuration Write) |
1100 |
Memory Read Multiple |
1101 |
Dual Address Cycle |
1110 |
Memory Read Line |
1111 |
Memory Write and Invalidate |
Memread
– čtení z paměti
Čtení 1B z adresy
B8000h. Na CB BUSu je nejprve příkaz pro čtení
z paměti – 06h, poté maska určující
které data jsou platná – 0Eh, v našem
případě se přečte 20h.
Memwrite
– zápis 1B
Podobné jako memread, pouze je
příkaz pro zápis do paměti – 07h a maska, která
data jsou platná – 0Eh, v našem případě
23h.
Memwrite
– zápis 1B na lichou adresu
Zápis 1B
na adresu B8001h (lichou adresu). Podobné jako na sudou,
jen se změní maska platnosti dat – 0Dh.
Memwrite
– zápis 2B (slova)
Podobné jako memwrite 1B,
akorát maska určuje platné 2B – 0Ch, v našem
případě 2323h.
Memwrite
– zápis 2B (slova) na lichou adresu
Stejné
jako memwrite 1B na licho adresu, s tím, že se zase
změnila maska platnosti dat. – 09h, tedy 420Fh.
Memwrite
– zápis 4B (dvojslova)
Zápis do paměti
s platností všech dat. Maska 00h, tedy
4107410Fh.
Memwrite
– zápis 2B (slova) na lichou adresu
Zde je vidět, že
zápis proběhne nadvakrát. Nejprve se zapíšou
horní tři byty v jednom cyklu (maska 01h), potom teprve
spodní byte v dalším cyklu (maska 0Eh).
Bytemerge
Zapisujeme
postupně 2 bajty. Můstek Host-to-PCI by se tento zápis mel
pokusit optimalizovat (spojit do blokového přenosu). Námi
měřený to však neučinil.
Longwrite
Zde
je znázorněn blokový přenos, kdy na jednu adresovou
fázi připadá několik datových. V tomto případě
dochází k autoinkrementaci adresy (o hodnotu 4). ).
Špičkově je možné přenést blok dat na každou
vzestupnou hranu hodin. V našem případě se tak
neděje kvůli nepřipravenosti cíle(videopaměti).
Cfgread
– čtení konfiguračního registru
Zde jsme měli
číst ze systémového registru aktivovaného
speciálním příkazem na sběrnici. Bohužel toto
měření proběhlo bez jakéhokoliv výsledku, což
se nám nepodařilo vyřešit ani za účasti
cvičícího.
Special
Speciální
cyklus se vyvolá kódem operace $01. Data na adresové
sběrnici jsou v případě speciálního cyklu
bezvýznamná. Speciální cyklu zajistí,
že jsou data rozeslána každému zařízení.
Jde o tzv. broadcast.
2. Zjištění připojených PCI adaptérů:
výpis připojených PCI adaptérů – dumppci.txt
Dev. # |
Vendor ID |
Device ID |
Vendor Name |
Chip Description |
Class Code |
Devsel Timing |
0 |
8086 |
7190 |
Intel Corporation |
440BX/ZX AGPset Host Bridge |
06,00,00 |
1 |
1 |
8086 |
7191 |
Intel Corporation |
440BX/ZX AGPset PCI-to-PCI bridge |
06,04,00 |
1 |
2 |
- |
- |
- |
- |
- |
- |
3 |
- |
- |
- |
- |
- |
- |
4 |
- |
- |
- |
- |
- |
- |
5 |
- |
- |
- |
- |
- |
- |
6 |
- |
- |
- |
- |
- |
- |
7 |
8086 |
7110 |
Intel Corporation |
PIIX4/4E/4M ISA Bridge |
06,01,00 |
1 |
8 |
- |
- |
- |
- |
- |
- |
9 |
- |
- |
- |
- |
- |
- |
10 |
- |
- |
- |
- |
- |
- |
11 |
- |
- |
- |
- |
- |
- |
12 |
- |
- |
- |
- |
- |
- |
13 |
- |
- |
- |
- |
- |
- |
14 |
- |
- |
- |
- |
- |
- |
15 |
- |
- |
- |
- |
- |
- |
16 |
5333 |
8a01 |
S3 Graphics Co., Ltd. |
Virge /DX & /GX |
03,00,00 |
1 |
17 |
- |
- |
- |
- |
- |
- |
18 |
10b7 |
9055 |
3Com Corporation |
Fast Etherlink 10/100 PCI TX NIC |
02,00,00 |
1 |
19 |
- |
- |
- |
- |
- |
- |
20 |
- |
- |
- |
- |
- |
- |
Při tomto měření jsme si vyzkoušeli práci s PCI sběrnicí. Vyzkoušeli jsme si různé druhy zápisu a čtení dat z PCI sběrnice. Jejich průběhy jsou zobrazeny výše. Průběhy vypadají podle teoretických předpokladů, pouze čtení z konfiguračního registru se nám (z neznámých důvodů) nepodařilo.
Také jsme zjistili výrobce a typy připojených zařízení.