Spațiu de configurare PCI - PCI configuration space

Spațiul de configurare PCI este modul de bază în care PCI convențional , PCI-X și PCI Express realizează configurarea automată a cardurilor inserate în magistrala lor.

Prezentare generală

Dispozitivele PCI au un set de registre denumit spațiu de configurare, iar PCI Express introduce spațiu de configurare extins pentru dispozitive. Registrele spațiului de configurare sunt mapate la locațiile de memorie. Driverele de dispozitiv și software-ul de diagnosticare trebuie să aibă acces la spațiul de configurare, iar sistemele de operare utilizează de obicei API-uri pentru a permite accesul la spațiul de configurare a dispozitivului. Atunci când sistemul de operare nu are metode de acces definite sau API-uri pentru solicitările de spațiu de configurare mapate de memorie, driverul sau software-ul de diagnosticare are sarcina de a accesa spațiul de configurare într-un mod care este compatibil cu regulile de acces subiacente ale sistemului de operare. În toate sistemele, driverele de dispozitiv sunt încurajate să utilizeze API-urile furnizate de sistemul de operare pentru a accesa spațiul de configurare al dispozitivului.

Informații tehnice

Una dintre îmbunătățirile majore pe care PCI Local Bus le-a avut față de alte arhitecturi I / O a fost mecanismul său de configurare. În plus față de spațiile de port normal mapate de memorie și I / O, fiecare funcție a dispozitivului de pe magistrală are un spațiu de configurare , care are o lungime de 256 de octeți, care poate fi adresat prin cunoașterea magistralei PCI pe opt biți , a dispozitivului de cinci biți și a celor trei numere de funcții de biți pentru dispozitiv (denumite în mod obișnuit BDF sau B / D / F , abreviate din magistrală / dispozitiv / funcție ). Aceasta permite până la 256 de autobuze, fiecare cu până la 32 de dispozitive, fiecare suportând opt funcții. O singură placă de expansiune PCI poate răspunde ca dispozitiv și trebuie să implementeze cel puțin funcția cu numărul zero. Primii 64 de octeți de spațiu de configurare sunt standardizați; restul sunt disponibile în scopuri definite de furnizor.

Pentru a permite standardizarea mai multor părți ale spațiului de configurare fără a intra în conflict cu utilizările existente, poate exista o listă de capabilități definite în restul de 192 de octeți de spațiu de configurare PCI. Fiecare capacitate are un octet care descrie ce capacitate este și un octet care indică următoarea capacitate. Numărul de octeți suplimentari depinde de ID-ul capacității. Dacă se utilizează capabilități, este setat un pic în registrul de stare și un indicator către primul dintr-o listă legată de capabilități este furnizat în Cap. registrul indicatorului definit în registrele standardizate.

PCI-X 2.0 și PCI Express au introdus un spațiu extins de configurare, până la 4096 octeți. Singura parte standardizată a spațiului de configurare extins este primii patru octeți la 0x100, care reprezintă începutul unei liste de capacități extinse. Capacitățile extinse seamănă foarte mult cu capacitățile normale, cu excepția faptului că se pot referi la orice octet din spațiul de configurare extins (utilizând 12 biți în loc de opt), au un număr de versiune pe patru biți și un ID de capacitate pe 16 biți. ID-urile cu capacitate extinsă se suprapun cu ID-urile cu capacitate normală, dar nu există nicio șansă de confuzie, deoarece sunt în liste separate.

Registre standardizate

Image
Registre standard ale antetului spațiului de configurare PCI tip 0 (non-bridge)

ID - ul dispozitivului (DID) și Vendor ID (VID) registre identifică dispozitivul (cum ar fi un IC ) și sunt numite în mod obișnuit ID - ul PCI . ID-ul furnizorului pe 16 biți este alocat de PCI-SIG . ID-ul dispozitivului pe 16 biți este apoi atribuit de către furnizor. Există un proiect inactiv pentru colectarea tuturor ID-urilor de furnizor și dispozitiv cunoscute. (Vedeți linkurile externe de mai jos.)

Registrul de stare este utilizat pentru a raporta ce funcții sunt acceptate și dacă au apărut anumite tipuri de erori. Registrul de comandă conține o mască de biți de caracteristici care pot fi activate și dezactivate individual. Cele Header Tip valori registru determină diferitelor configurații de a rămâne de 48 biți (64-16) din antet, în funcție de funcția dispozitivului. Adică anteturi de tip 1 pentru Root Complex, switch-uri și poduri. Apoi introduceți 0 pentru puncte finale. Registrul Cache Line Size trebuie să fie programat înainte ca dispozitivul să fie informat că poate utiliza tranzacția de scriere și invalidare a memoriei. Acest lucru ar trebui să se potrivească în mod normal cu dimensiunea liniei cache a procesorului , dar setarea corectă depinde de sistem. Acest registru nu se aplică PCI Express.

Subsistemul ID (SSID) și (SVID) Subsistemul Vendor ID modelul specific diferențiat (cum ar fi un add-in card). În timp ce ID-ul furnizorului este cel al producătorului chipset - ului , ID-ul furnizorului subsistemului este cel al producătorului cardului. ID-ul subsistemului este atribuit de către furnizorul subsistemului din același spațiu numeric ca și ID-ul dispozitivului. De exemplu, în cazul plăcilor de rețea fără fir , producătorul chipset-ului ar putea fi Broadcom sau Atheros , iar producătorul de carduri ar putea fi Netgear sau D-Link . În general, combinația ID furnizor - ID dispozitiv desemnează ce driver ar trebui să încarce gazda pentru a gestiona dispozitivul, deoarece toate cardurile cu aceeași combinație VID: DID pot fi tratate de același driver. Combinația Subsystem Vendor ID - Subsystem ID combinația identifică cardul, care este tipul de informații pe care șoferul le poate folosi pentru a aplica o modificare minoră specifică cardului în funcționarea sa.

Enumerarea autobuzelor

Pentru a adresa un dispozitiv PCI, acesta trebuie activat prin maparea în spațiul de adresă al portului I / O al sistemului sau în spațiul de adrese mapat în memorie. Firmware-ul sistemului, driverele de dispozitiv sau sistemul de operare programează registrele de adrese de bază (denumite în mod obișnuit BAR-uri) pentru a informa dispozitivul despre maparea adreselor sale, scriind comenzi de configurare la controlerul PCI. Deoarece toate dispozitivele PCI sunt într-o stare inactivă la resetarea sistemului, acestea nu vor avea nicio adresă atribuită acestora prin care sistemul de operare sau driverele de dispozitiv pot comunica cu acestea. Fie BIOS - ul, fie sistemul de operare, se adresează geografic sloturilor PCI (de exemplu, primul slot PCI, al doilea slot PCI sau al treilea slot PCI etc. de pe placa de bază ) prin intermediul controlerului PCI folosind IDSEL per slot (Initialization Selectare dispozitiv) semnale.

Biti PCI BAR
Biți Descriere Valori
Pentru toate barurile PCI
0 Tipul de regiune 0 = Memorie
1 = I / O
Pentru bare de memorie
2-1 Localizabil 0 = orice 32 de biți
1 = <1  MB
2 = orice 64 de biți
3 Prefetabil 0 = nu
1 = da
31-4 Adresa de bază aliniat în mod natural pe 16 octeți
Pentru BARURI I / O
1 Rezervat
31-2 Adresa de bază aliniat în mod natural pe 4 octeți

Deoarece nu există o metodă directă pentru BIOS sau sistemul de operare pentru a determina care sloturi PCI au dispozitive instalate (și nici pentru a determina ce funcții implementează dispozitivul) trebuie enumerate magistralele PCI . Enumerarea magistralei se realizează încercând să citească ID-ul furnizorului și registrul ID-ului dispozitivului (VID / DID) pentru fiecare combinație de număr de magistrală și număr de dispozitiv la funcția dispozitivului # 0. Rețineți că numărul dispozitivului, diferit de DID, este doar numărul secvențial al unui dispozitiv pe acea magistrală. Mai mult, după ce se detectează un nou pod, este definit un nou număr de magistrală, iar enumerarea dispozitivului repornește la numărul de dispozitiv zero.

Dacă nu se primește niciun răspuns din funcția dispozitivului # 0, magistrala magistrală efectuează un avort și returnează o valoare pe toate biții ( FFFFFFFF în hexazecimal), care este o valoare VID / DID nevalidă, astfel un driver de dispozitiv poate spune că combinația specificată magistrală / număr_dispozitiv / funcție (B / D / F) nu este prezentă. Deci, atunci când o citire la un ID de funcție zero pentru un anumit autobuz / dispozitiv determină avortul comandantului (inițiatorului), atunci trebuie presupus că nu există niciun dispozitiv de lucru pe acea magistrală, deoarece dispozitivele sunt necesare pentru a implementa funcția cu numărul zero. În acest caz, citirile pentru funcțiile rămase numerele (1-7) nu sunt necesare, deoarece, de asemenea, nu vor exista.

Când o citire la o combinație specificată B / D / F pentru registrul de identificare a furnizorului reușește, un driver de dispozitiv știe că există; scrie toate pe BAR-urile sale și citește înapoi dimensiunea de memorie solicitată de dispozitiv într-o formă codificată. Proiectarea implică faptul că toate dimensiunile spațiului de adresare au o putere de două și sunt aliniate în mod natural.

În acest moment, BIOS-ul sau sistemul de operare vor programa adresele de port mapate de memorie și I / O în registrul de configurare BAR al dispozitivului. Aceste adrese rămân valabile atât timp cât sistemul rămâne pornit. La oprire, toate aceste setări se pierd și procedura se repetă data viitoare când sistemul este repornit. Deoarece întregul proces este complet automatizat, utilizatorul este scutit de sarcina de a configura manual orice hardware nou adăugat prin schimbarea comutatoarelor DIP de pe carduri. Această descoperire automată a dispozitivului și alocarea spațiului de adrese este modul în care este implementat plug and play .

Dacă se găsește o punte PCI-la-PCI, sistemul trebuie să atribuie magistralei PCI secundare dincolo de pod un număr de autobuz diferit de zero și apoi să enumere dispozitivele de pe acea magistrală secundară. Dacă se găsesc mai multe punți PCI, descoperirea continuă recursiv până când toate scanările posibile combinații domeniu / autobuz / dispozitiv sunt scanate.

Fiecare funcție de dispozitiv PCI non-bridge poate implementa până la 6 BAR-uri, fiecare dintre ele putând răspunde la diferite adrese din portul I / O și spațiul de adrese mapate de memorie. Fiecare BAR descrie o regiune care are o dimensiune cuprinsă între 16 octeți și 2 gigaocteți, situată sub limita spațiului de adresă de 4 gigaocteți. Dacă o platformă acceptă opțiunea „Above 4G” în firmware-ul sistemului, pot fi utilizate bare de 64 de biți.

Un dispozitiv PCI poate avea, de asemenea, o opțiune ROM care poate conține cod de driver sau informații de configurare.

Implementare hardware

Atunci când efectuați un acces la spațiul de configurare , un dispozitiv PCI nu decodează adresa pentru a determina dacă ar trebui să răspundă, ci se uită la semnalul de selectare a dispozitivului de inițializare (IDSEL). Există o metodă de activare unică la nivel de sistem pentru fiecare semnal IDSEL. Dispozitivul PCI este obligat să decodeze numai semnalele de adresă / date de ordinul cel mai mic de 11 biți din spațiul de adresă (AD [10] până la AD [0]) și poate ignora decodarea celor 21 de semnale A / D de ordin înalt (AD [31] la AD [11]) deoarece o implementare a accesului la spațiul de configurare are pinul IDSEL al fiecărui slot conectat la o altă adresă / linie de date de comandă înaltă AD [11] prin AD [31]. Semnalul IDSEL este un pin diferit pentru fiecare dispozitiv PCI / slot pentru adaptor.

Pentru a configura cardul în slotul n , podul de magistrală PCI efectuează un ciclu de acces de configurare-spațiu cu registrul dispozitivului PCI care trebuie adresat pe liniile AD [7: 2] (AD [1: 0] sunt întotdeauna zero deoarece registrele sunt cuvinte duble (32 de biți)), precum și numărul funcției PCI specificat pe biții AD [10: 8], cu toate zerourile de biți de ordin superior, cu excepția AD [ n +11] folosite ca semnal IDSEL pe un slot dat.

Pentru a reduce încărcarea electrică a magistralei AD [] critice de sincronizare (și astfel încărcarea electrică sensibilă), semnalul IDSEL de pe conectorul slotului PCI este de obicei conectat la pinul AD [ n +11] atribuit printr-un rezistor. Acest lucru face ca semnalul IDSEL al PCI să ajungă la starea sa activă mai lent decât alte semnale ale magistralei PCI (datorită constantei de timp RC atât a rezistorului, cât și a capacității de intrare a pinului IDSEL). Astfel, accesele la spațiul de configurare sunt efectuate mai lent pentru a permite timp semnalului IDSEL să atingă un nivel valid.

Scanarea pe autobuz se realizează pe platforma Intel prin accesarea a două porturi standardizate definite . Aceste porturi sunt portul I / O Adresă spațiu de configurare ( 0xCF8 ) și portul I / O de date de spațiu de configurare ( 0xCFC ). Valoarea scrisă în portul I / O Adresă spațiu de configurare este creată prin combinarea valorilor B / D / F și valoarea adresei înregistrează într-un cuvânt pe 32 de biți.

Implementarea software-ului

Citirile și scrierile de configurare pot fi inițiate de la CPU în două moduri: o metodă moștenită prin adresele I / O 0xCF8 și 0xCFC și alta numită configurație mapată pe memorie.

Metoda moștenită a fost prezentă în PCI original și se numește Mecanism de acces la configurare (CAM). Permite accesarea indirectă a 256 de octeți din spațiul de adresă al unui dispozitiv prin intermediul a două registre pe 32 de biți numite PCI CONFIG_ADDRESS și PCI CONFIG_DATA. Aceste registre se află la adresele 0xCF8 și 0xCFC în spațiul de adrese I / O x86. De exemplu, un driver de software (firmware, kernel de sistem de operare sau driver de kernel) poate utiliza aceste registre pentru a configura un dispozitiv PCI scriind adresa registrului dispozitivului în CONFIG_ADDRESS și introducând datele care ar trebui să fie scrise pe dispozitiv în CONFIG_DATA. Deoarece acest proces necesită o scriere într-un registru pentru a scrie registrul dispozitivului, acesta este denumit „indirectare”.

Formatul CONFIG_ADDRESS este următorul:

0x80000000 | bus << 16 | device << 11 | function <<  8 | offset

După cum sa explicat anterior, adresarea unui dispozitiv prin magistrală, dispozitiv și funcție (BDF) este denumită și „adresarea geografică a unui dispozitiv”. Vedeți arch/x86/pci/early.cîn codul kernel-ului Linux un exemplu de cod care utilizează adresarea geografică.

Când spațiul de configurare extins este utilizat pe unele procesoare AMD, biții suplimentari 11: 8 ai offset-ului sunt scrise pe biții 27:24 din registrul CONFIG_ADDRESS:

0x80000000 | (offset & 0xf00) << 16 | bus << 16 | device << 11 | function <<  8 | (offset & 0xff)

A doua metodă a fost creată pentru PCI Express. Se numește Enhanced Configuration Access Mechanism (ECAM). Extinde spațiul de configurare al dispozitivului la 4 KB, cu 256 de octeți inferiori care se suprapun peste spațiul de configurare original (vechi) din PCI. Secțiunea spațiului adresabil este „furată”, astfel încât accesele din CPU să nu meargă în memorie, ci să ajungă la un anumit dispozitiv din structura PCI Express. În timpul inițializării sistemului, firmware-ul determină adresa de bază pentru această regiune de adresă „furată” și o comunică complexului rădăcină și sistemului de operare. Această metodă de comunicare este specifică implementării și nu este definită în specificația PCI Express.

Fiecare dispozitiv are propriul spațiu de 4 KB și informațiile fiecărui dispozitiv sunt accesibile printr-o matrice simplă, dev[bus][device][function]astfel încât 256 MB de spațiu contigu fizic sunt „furate” pentru această utilizare (256 de autobuze × 32 dispozitive × 8 funcții × 4 KB = 256 MB). Adresa fizică de bază a acestui tablou nu este specificată. De exemplu, pe sistemele x86 moderne, tabelele ACPI conțin informațiile necesare.

Vezi si

Referințe

linkuri externe