Ho usato per progettare hardware PCI-Express che richiedeva il supporto hot plug completo in hardware e software, ed è certamente possibile, ma è abbastanza coinvolto e richiede un ampio supporto software - l'hardware è in realtà abbastanza semplice. Ho dovuto progettare l'hardware, quindi implementare il supporto BIOS (UEFI) e kernel (Linux) per i dispositivi PCIe arbitrari hot plug su fibra e rame.
Dal punto di vista del software, è necessario ricordare che PCIe continua con il modello software PCI, compresi i concetti di bus, dispositivo e indirizzamento delle funzioni. Quando il bus PCI viene elencato, viene eseguito come una prima ricerca:
L'enumerazione PCIe viene generalmente eseguita due volte. Innanzitutto, il BIOS (UEFI o altro) lo farà, per capire chi è presente e quanta memoria hanno bisogno. Questi dati possono quindi essere passati al sistema operativo host che può prenderli così come sono, ma Linux e Windows spesso eseguono anche la propria procedura di enumerazione. Su Linux, questo viene fatto attraverso il sottosistema PCI principale, che cerca il bus, applica eventuali stranezze in base all'ID del dispositivo, quindi carica un driver con un ID corrispondente nella sua funzione probe. Un dispositivo PCI viene identificato tramite una combinazione dell'ID fornitore (16 bit, ad esempio Intel è 0x8086) e dell'ID dispositivo (un altro 16 bit): la fonte Internet più comune è qui: http://pcidatabase.com / .
La parte del software personalizzata arriva durante questo processo di enumerazione e vale a dire che è necessario riservare in anticipo numeri di bus PCI e segmenti di memoria per potenziali dispositivi futuri - questo a volte viene chiamato " bus padding ". Questo evita la necessità di re-enumerare il bus in futuro, cosa che spesso non può essere eseguita senza interrompere il sistema. Un dispositivo PCI ha BAR ( registri di indirizzi di base)) che richiede all'host quanta e di quale tipo (memoria o spazio I / O) ha bisogno il dispositivo - ecco perché non hai più bisogno di jumper come ISA :) Allo stesso modo, il kernel Linux implementa hot plug PCIe attraverso il pciehp conducente. Windows fa cose diverse in base alla versione: le versioni precedenti (penso XP) ignorano tutto ciò che il BIOS dice e fa il proprio sondaggio. Le versioni più recenti credo siano più rispettose del DSDT ACPI fornito dal firmware host (BIOS / EFI) e includeranno tali informazioni.
Questo può sembrare piuttosto coinvolto ed è così! Ma ricorda che qualsiasi laptop / dispositivo con uno slot ExpressCard (che implementa PCIe in quanto puoi avere ExpressCard solo USB) deve farlo, anche se generalmente il riempimento è piuttosto semplice - solo un bus. Il mio vecchio hardware era uno switch PCIe con altri 8 dispositivi dietro, quindi il riempimento è diventato un po 'più complicato.
Dal punto di vista hardware, è molto più semplice. I pin GND della scheda entrano in contatto per primi, e posizioniamo un IC controller controller hot-swap da LTC o simile sulla scheda per alimentare l'alimentazione una volta stabilita la connessione. A questo punto, l'ASIC o FPGA di bordo inizia la sequenza di accensione e inizia a provare l'addestramento del collegamento PCI Express. Supponendo che l'host supporti hot- plug e PCI Express SLTCAP / SLTCTRLregister (in spec: Registro delle capacità degli slot PCI Express, Registro dei controlli degli slot PCI Express. Esistono anche 1 e 2 - bit sufficienti per suddividere in due registri). poiché quella porta è stata configurata per indicare che la porta è compatibile con hot plug, il software può iniziare a enumerare il nuovo dispositivo. Il registro dello stato degli slot (SLTSTA, PCI Express Slot Status Register) contiene bit che il dispositivo target può impostare indicando guasti di alimentazione, blocco di rilascio meccanico e, naturalmente, rilevamento presenza + presenza modificato.
I suddetti registri si trovano in "Spazio di configurazione PCI (Express)", che è una piccola regione della mappa di memoria (4K per PCIe) allocata a ciascun potenziale bdf (bus: dispositivo: funzione). I registri effettivi generalmente risiedono sul dispositivo periferico.
Sul lato host, possiamo usare PRSNT1 # / PRSNT2 # come semplici segnali DC che alimentano l'abilitazione di un interruttore di accensione IC, o eseguire su GPIO sul chipset / PCH per causare un IRQ e innescare un SW 'hey, qualcosa è stato inserito , vai a cercarlo e configuralo! ' routine.
Queste sono molte informazioni che non rispondono direttamente alla tua domanda (vedi sotto per il breve sommario), ma speriamo che ti dia una migliore conoscenza della procedura. Se hai domande su parti specifiche del processo, fammi sapere in un commento qui o mandami un'e-mail e posso discutere ulteriormente + aggiornare questa risposta con quelle informazioni.
Riassumendo : il dispositivo periferico deve essere stato progettato tenendo presente il supporto hot plug da un POV hardware. Un host / slot progettato correttamente supporta anche hot plug e su una scheda madre di fascia alta mi aspetterei che sia sicuro. Tuttavia, il supporto software per questo è un'altra domanda e sfortunatamente sei legato al BIOS che il tuo OEM ti ha fornito.
In pratica, usi questa tecnologia ogni volta che rimuovi / inserisci una PCIe ExpressCard da un computer. Inoltre, anche i sistemi blade ad alte prestazioni (telecom o altro) utilizzano questa tecnologia regolarmente.
Commento finale: salva il PDF collegato alle specifiche di base, PCI-SIG di solito fa pagare dollari per questo :)