Saya biasa mendesain perangkat keras PCI-Express yang membutuhkan dukungan hot-plug penuh dalam perangkat keras dan perangkat lunak, dan tentu saja itu mungkin, tetapi itu cukup terlibat dan memerlukan dukungan perangkat lunak yang luas - perangkat keras sebenarnya cukup sederhana. Saya harus mendesain perangkat kerasnya, kemudian mengimplementasikan BIOS (UEFI) dan dukungan kernel (Linux) untuk hot-plugging perangkat PCIe yang sewenang-wenang di atas serat dan tembaga.
Dari sudut pandang perangkat lunak, orang harus ingat bahwa PCIe berlanjut dengan model perangkat lunak PCI, termasuk konsep bus, perangkat, pengalamatan fungsi. Ketika bus PCI disebutkan, itu dilakukan sebagai pencarian pertama kali:
Pencacahan PCIe umumnya dilakukan dua kali. Pertama, BIOS Anda (UEFI atau lainnya) akan melakukannya, untuk mengetahui siapa yang hadir dan berapa banyak memori yang mereka butuhkan. Data ini kemudian dapat diteruskan ke OS host yang dapat menerima apa adanya, tetapi Linux dan Windows juga sering melakukan prosedur penghitungan sendiri. Di Linux, ini dilakukan melalui subsistem PCI inti, yang mencari bus, menerapkan kebiasaan apa pun jika perlu berdasarkan ID perangkat, dan kemudian memuat driver yang memiliki ID yang cocok dalam fungsi penyelidikannya. Perangkat PCI diidentifikasikan melalui kombinasi ID Vendornya (16-bit, misal Intel 0x8086) dan Device ID (16-bit lainnya) - sumber internet paling umum ada di sini: http://pcidatabase.com / .
Bagian perangkat lunak khusus masuk selama proses pencacahan ini dan itu adalah Anda harus memesan sebelumnya nomor PCI Bus, dan segmen memori untuk perangkat potensial di masa depan - ini kadang-kadang disebut ' bus padding '. Ini menghindari kebutuhan untuk menghitung ulang bus di masa depan yang seringkali tidak dapat dilakukan tanpa gangguan pada sistem. Perangkat PCI memiliki BAR ( register alamat dasar) yang meminta kepada tuan rumah berapa banyak dan apa jenis (memori atau I / O ruang) memori yang dibutuhkan perangkat - inilah mengapa Anda tidak perlu jumper seperti ISA lagi :) Demikian juga, kernel Linux mengimplementasikan hotplug PCIe melalui pciehp sopir. Windows melakukan hal-hal berbeda berdasarkan versi - versi yang lebih lama (saya pikir XP) mengabaikan apa pun yang dikatakan BIOS dan apakah itu menyelidikinya sendiri. Versi yang lebih baru saya percaya lebih menghormati ACPI DSDT yang disediakan oleh firmware host (BIOS / EFI) dan akan memasukkan informasi itu.
Ini mungkin terlihat sangat terlibat dan memang begitu! Tetapi ingat bahwa setiap laptop / perangkat dengan slot ExpressCard (yang mengimplementasikan PCIe seperti Anda dapat memiliki ExpressCard USB saja) harus melakukan ini, meskipun umumnya paddingnya cukup sederhana - hanya satu bus. Perangkat keras lama saya dulunya adalah saklar PCIe yang memiliki 8 perangkat lain di belakangnya, jadi bantalan menjadi lebih rumit.
Dari sudut pandang perangkat keras, jauh lebih mudah. Pin GND kartu melakukan kontak terlebih dahulu, dan kami akan menempatkan IC hot-swap controller dari LTC atau serupa pada kartu untuk mengurutkan daya setelah koneksi dibuat. Pada titik ini, ASIC on-board atau FPGA on-board memulai urutan penyalaannya, dan mulai mencoba melatih tautan ke pelatihan PCI Express-nya. Dengan asumsi host mendukung hot-plugging dan PCI Express SLTCAP / SLTCTRLregister (dalam spec: Daftar Kemampuan Slot PCI Express, Register Kontrol Slot PCI Express. Ada 1 dan 2 untuk bit ini juga cukup untuk dibagi menjadi dua regs). untuk port yang telah dikonfigurasikan untuk mengindikasikan port tersebut mampu melakukan hot-plug, perangkat lunak dapat mulai menghitung perangkat baru. Register status slot (SLTSTA, PCI Express Slot Status Register) berisi bit yang dapat diatur oleh perangkat target yang mengindikasikan adanya kesalahan daya, kait pelepas mekanis, dan tentu saja deteksi kehadiran + diubah.
Register tersebut terletak di 'Ruang Konfigurasi PCI (Express)', yang merupakan wilayah kecil dari peta memori (4K untuk PCIe) yang dialokasikan untuk setiap potensi bdf (bus: perangkat: fungsi). Register aktual biasanya berada pada perangkat periferal.
Di sisi host, kita dapat menggunakan PRSNT1 # / PRSNT2 # sebagai sinyal DC sederhana yang memberi makan mengaktifkan saklar daya IC, atau lari ke GPIO pada chipset / PCH untuk menyebabkan IRQ dan memicu SW 'hei, sesuatu dimasukkan , cari dan konfigurasikan! ' rutin.
Ini adalah banyak informasi yang tidak langsung menjawab pertanyaan Anda (lihat di bawah untuk ringkasan cepat), tetapi mudah-mudahan ini memberi Anda latar belakang yang lebih baik dalam memahami prosesnya. Jika Anda memiliki pertanyaan tentang bagian-bagian tertentu dari proses, beri tahu saya di komentar di sini atau tembak saya email dan saya bisa mendiskusikan lebih lanjut + memperbarui jawaban ini dengan info itu.
Untuk meringkas - perangkat periferal harus dirancang dengan dukungan hot-plug dalam pikiran dari POV perangkat keras. Sebuah host / slot yang dirancang dengan baik juga mampu plug-panas, dan pada motherboard high-end saya harapkan aman. Namun, dukungan perangkat lunak untuk ini adalah pertanyaan lain seluruhnya dan Anda sayangnya terikat pada BIOS yang diberikan OEM kepada Anda.
Dalam praktiknya, Anda menggunakan teknologi ini kapan saja Anda melepas / memasukkan PCIe ExpressCard dari komputer. Selain itu, sistem blade berkinerja tinggi (telekomunikasi atau lainnya) juga memanfaatkan teknologi ini.
Komentar akhir - simpan PDF yang ditautkan dari Base Spec, PCI-SIG biasanya dikenakan biaya untuk itu :)