header pcivirt.h
Panduan referensi untuk menggunakan antarmuka yang digunakan untuk mengekspos VF ke Komputer Virtual.
Perangkat yang sesuai dengan spesifikasi PCI Express Single-Root I/O Virtualization (SR-IOV) dapat menyediakan beberapa antarmuka ke perangkat. Antarmuka ini, yang dikenal sebagai Fungsi Virtual (VF), independen dan disediakan melalui antarmuka perangkat awal, yang dikenal sebagai Fungsi Fisik (PF). Misalnya, Ethernet NIC yang mendukung SR-IOV dapat dirancang untuk memiliki sakelar dengan satu port Ethernet fisik (terhubung ke kawat fisik) dan banyak port Ethernet virtual.
Ruang konfigurasi PF memungkinkan driver PF untuk mengelola sumber daya PCI VF, termasuk ruang I/O yang dipetakan memori dan gangguan yang disinyalkan pesan. Karena VF adalah subset dari perangkat lengkap, mereka bisa lebih murah untuk diekspos dalam perangkat keras daripada fungsi tradisional dalam paket multi-fungsi. Ini memungkinkan pembuat perangkat untuk membangun lebih banyak antarmuka, dan mengelola sumber daya bersama secara terpusat.
Ketika Windows berjalan langsung pada perangkat keras komputer, driver perangkat berpartisipasi dalam operasi yang terkait dengan Plug and Play, manajemen daya, manajemen interupsi, dan tugas lainnya. Driver bus Windows tepercaya dan konfigurasi bus Hardware Abstraction Layer (HAL) sendiri dan mengonfigurasi seluruh bus. Driver berjalan dalam tingkat hak istimewa yang sama dan tidak ada batas kepercayaan dalam mode kernel.
Ketika Windows berjalan pada komputer virtual (VM), asumsi tersebut tidak berlaku. VF dapat dikendalikan di bawah kendali VM yang tidak memiliki hak istimewa. Namun, perangkat keras harus diperiksa keamanannya agar keamanan atau performa sistem tidak terpengaruh.
Ketika driver yang berjalan pada VF meminta ruang konfigurasi baca atau tulis, permintaan diterima oleh tumpukan virtualisasi dan dikirim ke driver PF perangkat SR-IOV. Merupakan tanggung jawab driver PF untuk menanggapi permintaan tersebut dan memberikan detail untuk VF. Driver PF terkadang mungkin mengharuskan konfigurasi membaca atau menulis permintaan yang diteruskan ke perangkat keras.
Tumpukan menggunakan I/O MMU untuk membedakan lalu lintas yang berasal dari berbagai antarmuka yang diekspos perangkat, memberlakukan kebijakan tentang wilayah memori mana yang dapat diakses perangkat dan yang mengganggu yang dapat dihasilkannya.
Persyaratan perangkat keras
Sistem yang akan digunakan untuk penetapan perangkat SR-IOV harus memenuhi persyaratan untuk jaringan SR-IOV dan Penugasan Perangkat Langsung. Sistem harus memiliki IOMMU, bahwa IOMMU harus dikonfigurasi untuk memberikan kontrol perangkat ke sistem operasi, dan PCIe ACS (Access Control Services) harus diaktifkan dan dikonfigurasi untuk digunakan oleh sistem operasi. Akhirnya, perangkat yang dimaksud tidak boleh menggunakan interupsi berbasis baris, dan tidak boleh memerlukan ATS (Address Translation Services).
Informasi selengkapnya di sini:
Semua yang ingin Anda ketahui tentang SR-IOV di Hyper-V. Bagian 1
Penetapan Perangkat Diskrit — Deskripsi dan latar belakang
Untuk menentukan apakah sistem mendukung penetapan perangkat, dan apakah perangkat PCI tertentu akan berfungsi untuk penetapan perangkat:
Skrip Penugasan Perangkat Diskrit
Mengkueri untuk perangkat SR-IOV
GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE adalah antarmuka kelas perangkat yang disediakan oleh driver untuk perangkat SR-IOV. GUID ini menyediakan cara untuk mengkueri semua tumpukan perangkat yang mengekspos berbagai tabel fungsi yang digunakan untuk mengelola fitur terkait virtualisasi perangkat. Setelah driver mendaftarkan GUID, kemampuan individual ditemukan dengan mengirim IRP_MN_QUERY_INTERFACE. Driver harus menanggapi permintaan tersebut dengan GUID_SRIOV_DEVICE_INTERFACE_STANDARD. Driver juga harus menangani IOCTL_SRIOV_NOTIFICATION dan IOCTL_SRIOV_EVENT_COMPLETE.
Driver untuk perangkat SR_IOV, yang berjalan dalam VM istimewa adalah OS host. Ini memiliki Plug-and-Play dan manajemen daya untuk seluruh komputer, dan mengekspos Pci Express SR-IOV Virtual Functions di VM non-istimewa, harus menyediakan GUID_SRIOV_DEVICE_INTERFACE_STANDARD (didefinisikan dalam header Pcivirt.h). Driver tersebut mungkin driver PCI Express SR-IOV Physical Function (PF) yang membuat FDO, atau mungkin filter yang lebih rendah pada node perangkat tersebut dalam kasus ketika FDO dikelola oleh driver port.
Antarmuka perangkat diperlukan agar driver dapat mengakses ruang konfigurasi VF.
Dalam implementasi EVT_WDF_DRIVER_DEVICE_ADD driver PF, lakukan tugas-tugas ini:
- Setelah memanggil WdfDeviceCreate untuk membuat objek perangkat fungsi (FDO), panggil WdfDeviceCreateDeviceInterface untuk mendaftar GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE. Ini memungkinkan tumpukan virtualisasi untuk mengambil handel perangkat ke perangkat SR-IOV.
- Mengekspos GUID_SRIOV_DEVICE_INTERFACE_STANDARD.
- Inisialisasi struktur SRIOV_DEVICE_INTERFACE_STANDARD dan atur anggota ke penunjuk fungsi fungsi panggilan balik yang diterapkan oleh driver PF.
- Konfigurasikan struktur dengan memanggil WDF_QUERY_INTERFACE_CONFIG_INIT.
- Daftarkan antarmuka dengan FDO dengan memanggil WdfDeviceAddQueryInterface.
// Make the device visible as an assignable device.
//
status = WdfDeviceCreateDeviceInterface(
fdo,
&GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE,
NULL);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT,
"Failed to create interface: %!STATUS!",
status);
goto Cleanup;
}
//
// Expose SRIOV_DEVICE_INTERFACE_STANDARD
//
RtlZeroMemory(&sriovInterface, sizeof(sriovInterface));
sriovInterface.Size = sizeof(sriovInterface);
sriovInterface.Version = 1;
sriovInterface.Context = deviceContext;
sriovInterface.InterfaceReference = Virtualization_ReferenceInterface;
sriovInterface.InterfaceDereference = Virtualization_DereferenceInterface;
sriovInterface.ReadVfConfig = Virtualization_ReadConfig;
sriovInterface.WriteVfConfig = Virtualization_WriteConfig;
sriovInterface.ReadVfConfigBlock = Virtualization_ReadBlock;
sriovInterface.WriteVfConfigBlock = Virtualization_WriteBlock;
sriovInterface.ResetVf = Virtualization_ResetFunction;
sriovInterface.SetVfPowerState = Virtualization_SetPowerState;
sriovInterface.GetDeviceLocation = Virtualization_GetDeviceLocation;
sriovInterface.GetVendorAndDevice = Virtualization_GetVendorAndDevice;
sriovInterface.QueryProbedBars = Virtualization_QueryProbedBars;
sriovInterface.QueryLuid = Virtualization_QueryLuid;
WDF_QUERY_INTERFACE_CONFIG_INIT(&qiConfig,
(PINTERFACE)&sriovInterface,
&GUID_SRIOV_DEVICE_INTERFACE_STANDARD,
NULL);
status = WdfDeviceAddQueryInterface(fdo, &qiConfig);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT,
"WdfDeviceAddQueryInterface failed: %!STATUS!\n",
status);
goto Cleanup;
}
Menangani peristiwa Plug and Play
Tumpukan virtualisasi bertanggung jawab untuk mengirim pesan yang sesuai ke VM, menunggu balasan (dengan waktu habis) dan dalam kasus VM yang tidak merespons, dan menerapkan tindakan yang tepat seperti mem-veto peristiwa PnP, atau menghapus perangkat dari VM yang tidak memiliki hak istimewa. Driver PF yang menerapkan GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE juga harus menangani permintaan kontrol I/O ini yang memungkinkan tumpukan virtualisasi bereaksi terhadap peristiwa PnP.
Tumpukan virtualisasi pertama kali mengirim IOCTL_SRIOV_ATTACH ke perangkat. Ini memberi tahu perangkat bahwa tumpukan virtualisasi perlu diberi tahu tentang peristiwa PnP tertentu.
Ini berlaku sampai tumpukan virtualisasi mengirim IOCTL_SRIOV_DETACH.
Tumpukan virtualisasi meminta perangkat tentang peristiwa PnP dengan mengirim permintaan IOCTL_SRIOV_NOTIFICATION. Driver PF dapat menginformasikan tumpukan virtualisasi peristiwa PnP dengan menyelesaikan permintaan IOCTL_SRIOV_NOTIFICATION.
Tumpukan virtualisasi membuka blokir peristiwa tersebut dengan mengirim IOCTL_SRIOV_EVENT_COMPLETE.
pcivirt.h berisi antarmuka pemrograman berikut:
IOCTL
IOCTL_SRIOV_ATTACH Permintaan menunjukkan bahwa tumpukan virtualisasi ingin mendaftar untuk peristiwa Plug and Play yang diterima oleh perangkat SR-IOV. |
IOCTL_SRIOV_DETACH Permintaan menunjukkan bahwa tumpukan virtualisasi ingin membatalkan pendaftaran untuk peristiwa Plug and Play (sebelumnya terdaftar melalui permintaan IOCTL_SRIOV_ATTACH). |
IOCTL_SRIOV_EVENT_COMPLETE Permintaan menunjukkan bahwa tumpukan virtualisasi atau perangkat SR-IOV menerima salah satu peristiwa yang tercantum dalam SRIOV_PF_EVENT. |
IOCTL_SRIOV_INVALIDATE_BLOCK Permintaan IOCTL_SRIOV_INVALIDATE_BLOCK menunjukkan bahwa tumpukan virtualisasi ingin mengatur ulang konten blok konfigurasi yang ditentukan. |
IOCTL_SRIOV_MITIGATED_RANGE_UPDATE Permintaan IOCTL_SRIOV_MITIGATED_RANGE_UPDATE menunjukkan bahwa tumpukan virtualisasi ingin diperbarui ke rentang mitigasi. |
IOCTL_SRIOV_NOTIFICATION Permintaan menunjukkan bahwa tumpukan virtualisasi ingin diberi tahu ketika salah satu peristiwa yang tercantum dalam SRIOV_PF_EVENT terjadi. |
IOCTL_SRIOV_PROXY_QUERY_LUID Permintaan ini memasok pengidentifikasi unik lokal perangkat SR_IOV yang mengimplementasikan antarmuka. |
IOCTL_SRIOV_QUERY_MITIGATED_RANGE_COUNT Permintaan menentukan rentang ruang I/O yang dipetakan memori yang harus dimitigasi. |
IOCTL_SRIOV_QUERY_MITIGATED_RANGES Permintaan menentukan rentang tertentu tempat intersepsi harus ditempatkan. |
Fungsi panggilan balik
READ_WRITE_MITIGATED_REGISTER Membaca atau menulis ke ruang alamat yang dimitigasi. |
SRIOV_GET_DEVICE_LOCATION Mengambil informasi tentang lokasi perangkat PCI saat ini di bus, seperti Segmen PCI, Bus, Perangkat, dan nomor Fungsi. |
SRIOV_GET_MMIO_REQUIREMENTS Fungsi panggilan balik ini tidak didukung. |
SRIOV_GET_RESOURCE_FOR_BAR Mendapatkan sumber daya yang diterjemahkan untuk Base Address Register (BAR) tertentu. |
SRIOV_GET_VENDOR_AND_DEVICE_IDS Memasok Vendor dan ID Perangkat untuk Pci Express SR-IOV Virtual Function (VF) yang akan digunakan untuk menghasilkan ID Plug and Play yang lebih umum untuk VF. ID ini tidak dapat dibaca langsung dari ruang konfigurasi VF. |
SRIOV_QUERY_LUID Mendapatkan pengidentifikasi unik lokal perangkat SR-IOV. |
SRIOV_QUERY_LUID_VF Mendapatkan Fungsi Virtual (VF) PCI Express SR-IOV yang diberi pengidentifikasi unik. |
SRIOV_QUERY_PROBED_BARS Mengkueri data yang dibaca dari daftar alamat dasar (PF) fungsi fisik (JAR) jika nilai -1 ditulis terlebih dahulu. |
SRIOV_QUERY_PROBED_BARS_2 Mengkueri data yang dibaca dari daftar alamat dasar (BAR) PCI Express SR-IOV Virtual Function (VF) yang ditentukan jika nilai -1 ditulis terlebih dahulu. |
SRIOV_QUERY_VF_LUID Mendapatkan pengidentifikasi unik lokal dari Fungsi Virtual (VF) PCI Express SR-IOV. |
SRIOV_READ_BLOCK Membaca data dari blok konfigurasi yang ditentukan dari Fungsi Virtual (VF) PCI Express SR-IOV. |
SRIOV_READ_CONFIG Membaca data dari ruang konfigurasi Pci Express SR-IOV Virtual Function (VF) yang ditentukan. |
SRIOV_RESET_FUNCTION Mengatur ulang Fungsi Virtual (VF) PCI Express SR-IOV yang ditentukan. |
SRIOV_SET_POWER_STATE Mengatur status daya PCI Express SR-IOV Virtual Function (VF) yang ditentukan. |
SRIOV_WRITE_BLOCK Menulis data ke blok konfigurasi yang ditentukan dari Fungsi Virtual (VF) PCI Express SR-IOV. |
SRIOV_WRITE_CONFIG Menulis data konfigurasi ke Fungsi Virtual (VF) PCI Express SR-IOV. |
Struktur
MITIGABLE_DEVICE_INTERFACE Menyimpan penunjuk fungsi ke fungsi panggilan balik yang diimplementasikan oleh driver fungsi fisik (PF) untuk antarmuka perangkat yang dapat dimitigasi. |
SRIOV_DEVICE_INTERFACE_STANDARD Menyimpan penunjuk fungsi ke fungsi panggilan balik yang diimplementasikan oleh driver fungsi fisik (PF) di tumpukan perangkat untuk perangkat SR-IOV. |
SRIOV_DEVICE_INTERFACE_STANDARD_2 Menyimpan penunjuk fungsi ke fungsi panggilan balik yang diimplementasikan oleh driver fungsi fisik (PF) di tumpukan perangkat untuk perangkat SR-IOV. Ini adalah versi SRIOV_DEVICE_INTERFACE_STANDARD yang diperluas. |
SRIOV_INVALIDATE_BLOCK Berisi informasi blok konfigurasi. Struktur ini digunakan dalam permintaan IOCTL_SRIOV_INVALIDATE_BLOCK. |
SRIOV_MITIGATED_RANGE_COUNT_INPUT Struktur ini digunakan sebagai buffer input ke permintaan IOCTL_SRIOV_QUERY_MITIGATED_RANGE_COUNT untuk menentukan rentang ruang I/O yang dipetakan memori yang harus dimitigasi. |
SRIOV_MITIGATED_RANGE_COUNT_OUTPUT Struktur ini adalah buffer output yang diterima oleh permintaan IOCTL_SRIOV_QUERY_MITIGATED_RANGE_COUNT yang berisi array rentang ruang I/O yang dipetakan memori yang harus dimitigasi. |
SRIOV_MITIGATED_RANGE_UPDATE_INPUT Struktur ini digunakan sebagai buffer input ke permintaan IOCTL_SRIOV_MITIGATED_RANGE_UPDATE untuk menunjukkan fungsi virtual (VF) yang ruang I/O yang dipetakan memorinya harus dimitigasi. |
SRIOV_MITIGATED_RANGE_UPDATE_OUTPUT Struktur ini adalah buffer output yang diterima oleh permintaan IOCTL_SRIOV_MITIGATED_RANGE_UPDATE yang menunjukkan fungsi virtual (VF) yang ruang I/O yang dipetakan memorinya dimitigasi. |
SRIOV_MITIGATED_RANGES_INPUT Struktur ini adalah buffer input dalam permintaan IOCTL_SRIOV_QUERY_MITIGATED_RANGES untuk mendapatkan rentang tertentu tempat intersepsi harus ditempatkan. |
SRIOV_MITIGATED_RANGES_OUTPUT Struktur ini adalah buffer output yang diterima oleh permintaan IOCTL_SRIOV_QUERY_MITIGATED_RANGES untuk mendapatkan rentang tertentu di mana intersepsi harus ditempatkan. |
SRIOV_PNP_EVENT_COMPLETE Menyimpan status untuk peristiwa yang harus diatur driver Fungsi Fisik (PF) SR-IOV untuk penyelesaian Plug and Play bahkan. Struktur ini digunakan dalam buffer input permintaan IOCTL_SRIOV_EVENT_COMPLETE. |
SRIOV_PROXY_QUERY_LUID_OUTPUT Menyimpan pengidentifikasi unik lokal perangkat SR_IOV yang mengimplementasikan antarmuka. Struktur ini adalah buffer output untuk permintaan IOCTL_SRIOV_PROXY_QUERY_LUID. |
Enumerasi
SRIOV_PF_EVENT Menentukan nilai peristiwa untuk perangkat SR-IOV. |