Arsitektur Driver Perangkat Linux intel OPAE FPGA
Arsitektur Driver Perangkat Intel FPGA Linux OPAE
Driver Intel FPGA OPAE menyediakan antarmuka untuk aplikasi ruang pengguna untuk mengonfigurasi, menghitung, membuka, dan mengakses akselerator FPGA pada platform yang dilengkapi dengan solusi Intel FPGA dan mengaktifkan fungsi manajemen tingkat sistem seperti konfigurasi ulang FPGA, manajemen daya, dan virtualisasi.
Arsitektur Perangkat Keras
Dari sudut pandang OS view, perangkat keras FPGA muncul sebagai perangkat PCIe biasa. Memori perangkat FPGA diatur menggunakan struktur data yang telah ditentukan sebelumnya (Daftar Fitur Perangkat). Fitur yang didukung oleh perangkat FPGA diekspos melalui struktur data ini, seperti yang diilustrasikan di bawah dalam gambar berikut:
Perangkat FPGA PCIe
Driver mendukung PCIe SR-IOV untuk membuat Fungsi Virtual (VF) yang dapat digunakan untuk menetapkan akselerator individual ke mesin virtual.
Perusahaan Intel. Seluruh hak cipta. Intel, logo Intel, dan merek Intel lainnya adalah merek dagang dari Intel Corporation atau anak perusahaannya. Intel menjamin performa produk FPGA dan semikonduktornya sesuai spesifikasi saat ini sesuai dengan garansi standar Intel, tetapi berhak mengubah produk dan layanan apa pun kapan saja tanpa pemberitahuan. Intel tidak bertanggung jawab atau berkewajiban yang timbul dari aplikasi atau penggunaan informasi, produk, atau layanan apa pun yang dijelaskan di sini kecuali secara tegas disetujui secara tertulis oleh Intel. Pelanggan Intel disarankan untuk mendapatkan versi terbaru dari spesifikasi perangkat sebelum mengandalkan informasi yang dipublikasikan dan sebelum memesan produk atau layanan.
Nama dan merek lain dapat diklaim sebagai milik orang lain.
Perangkat PCIe FPGA tervirtualisasi
Mesin Manajemen FPGA (FME)
Mesin Manajemen FPGA melakukan manajemen daya dan termal, pelaporan kesalahan, konfigurasi ulang, pelaporan kinerja, dan fungsi infrastruktur lainnya. Setiap FPGA memiliki satu FME, yang selalu diakses melalui Fungsi Fisik (PF). Aplikasi ruang pengguna dapat memperoleh akses eksklusif ke FME menggunakan open(), dan merilisnya menggunakan close() sebagai pengguna istimewa (root).
Pelabuhan
Port mewakili antarmuka antara struktur FPGA statis ("FPGA Interface Manager (FIM)") dan wilayah yang sebagian dapat dikonfigurasi ulang yang berisi Fungsi Akselerator (AF). Port mengontrol komunikasi dari perangkat lunak ke akselerator dan memaparkan fitur-fitur seperti reset dan debug. Perangkat PCIe mungkin memiliki beberapa Port, dan setiap Port dapat diekspos melalui VF dengan menetapkannya menggunakan ioctl FPGA_FME_PORT_ASSIGN pada perangkat FME.
Unit Fungsi Akselerator (AF).
- Unit Fungsi Akselerator (AF) terpasang ke Port dan memaparkan wilayah MMIO 256K untuk digunakan untuk register kontrol khusus akselerator.
- Aplikasi ruang pengguna dapat memperoleh akses eksklusif ke AFU yang terpasang ke Port dengan menggunakan open() pada perangkat Port, dan melepaskannya menggunakan close().
- Aplikasi ruang pengguna juga dapat mmap() mengakselerator wilayah MMIO.
Konfigurasi Ulang Sebagian
Seperti disebutkan di atas, akselerator dapat dikonfigurasi ulang melalui konfigurasi ulang sebagian dari Fungsi Akselerator (AF) file. Fungsi Akselerator (AF) harus dibuat untuk FIM yang tepat dan wilayah statis (Port) target dari FPGA; jika tidak, operasi konfigurasi ulang akan gagal dan kemungkinan menyebabkan ketidakstabilan sistem. Kompatibilitas ini dapat diperiksa dengan membandingkan ID antarmuka yang tertera di header AF dengan ID antarmuka yang diekspos oleh FME melalui sysfs. Pemeriksaan ini biasanya dilakukan oleh ruang pengguna sebelum memanggil IOCTL rekonfigurasi.
Catatan:
Saat ini, setiap program perangkat lunak yang mengakses FPGA, termasuk yang berjalan di host tervirtualisasi, harus ditutup sebelum mencoba konfigurasi ulang sebagian. Langkah-langkahnya adalah:
- Bongkar pengemudi dari tamu
- Cabut VF dari tamu
- Nonaktifkan SR-IOV
- Lakukan konfigurasi ulang sebagian
- Aktifkan SR-IOV
- Colokkan VF ke tamu
- Muat driver di tamu
Virtualisasi FPGA
Untuk mengaktifkan akses akselerator dari aplikasi yang berjalan di VM, masing-masing port AFU perlu ditetapkan ke VF menggunakan langkah-langkah berikut:
- PF memiliki semua port AFU secara default. Port apa pun yang perlu ditetapkan ulang ke VF harus dilepaskan terlebih dahulu dari PF melalui FPGA_FME_PORT_RELEASE ioctl pada perangkat FME.
- Setelah port N dilepaskan dari PF, perintah di bawah ini dapat digunakan untuk mengaktifkan SRIOV dan VF. Setiap VF hanya memiliki satu port dengan AFU. gema N > PCI_DEVICE_PATH/sriov_numvfs
- Lewati VF ke VM.
- AFU di bawah VF dapat diakses dari aplikasi di VM (menggunakan driver yang sama di dalam VF).
Catatan:
UPH tidak dapat ditugaskan ke VF, sehingga PR dan fungsi manajemen lainnya hanya tersedia melalui PF.
Organisasi Pengemudi
Driver Perangkat Modul PCIe
Organisasi Pengemudi
Perangkat FPGA muncul sebagai perangkat PCIe biasa; dengan demikian, driver perangkat FPGA PCIe (intel-FPGA-PCI.ko) selalu dimuat terlebih dahulu setelah FPGA PCIe PF atau VF terdeteksi. Driver ini memainkan peran infrastruktur dalam arsitektur driver. Dia:
- Membuat perangkat wadah FPGA sebagai induk dari perangkat fitur.
- Telusuri Daftar Fitur Perangkat, yang diimplementasikan dalam memori BAR perangkat PCIe, untuk menemukan perangkat fitur dan subfiturnya serta membuat perangkat platform untuknya di bawah perangkat kontainer.
- Mendukung SR-IOV.
- Memperkenalkan infrastruktur perangkat fitur, yang mengabstraksi operasi untuk sub-fitur dan memaparkan fungsi umum ke driver perangkat fitur.
Fungsi Driver Perangkat Modul PCIe
- Berisi penemuan PCIe, pencacahan perangkat, dan penemuan fitur.
- Membuat direktori sysfs untuk perangkat induk, FPGA Management Engine (FME), dan Port.
- Membuat instans driver platform, menyebabkan kernel Linux memuat masing-masing driver modul platform.
Driver Perangkat Modul Platform FME
- Manajemen daya dan termal, pelaporan kesalahan, pelaporan kinerja, dan fungsi infrastruktur lainnya. Anda dapat mengakses fungsi ini melalui antarmuka sysfs yang diekspos oleh driver FME.
- Konfigurasi Ulang Sebagian. Driver FME mendaftarkan Manajer FPGA selama inisialisasi sub-fitur PR; setelah menerima FPGA_FME_PORT_PR ioctl dari Anda, ia memanggil fungsi antarmuka umum dari FPGA Manager untuk menyelesaikan sebagian konfigurasi ulang bitstream ke Port yang diberikan.
- Manajemen port untuk virtualisasi. Driver FME memperkenalkan dua ioctl, FPGA_FME_PORT_RELEASE, yang melepaskan Port yang diberikan dari PF; dan FPGA_FME_PORT_ASSIGN, yang mengembalikan Port ke PF. Setelah Port dilepaskan dari PF, Port tersebut dapat ditetapkan ke VF melalui antarmuka SR-IOV yang disediakan oleh driver PCIe. Untuk informasi selengkapnya, lihat "Virtualisasi FPGA".
Fungsi Driver Perangkat Modul Platform FME
- Membuat node perangkat karakter FME.
- Membuat sistem FME files dan mengimplementasikan sysfs FME file pengakses.
- Menerapkan sub-driver fitur pribadi FME.
- Sub-driver fitur pribadi FME:
- Kepala FME
- Manajemen Termal
- Manajemen Daya
- Kesalahan Global
- Konfigurasi Ulang Sebagian
- Kinerja Global
Driver Perangkat Modul Port Platform
Mirip dengan driver FME, driver Port FPGA (dan AFU) (intel-fpga-afu.ko) diperiksa setelah perangkat platform Port dibuat. Fungsi utama modul ini adalah menyediakan antarmuka untuk aplikasi ruang pengguna untuk mengakses akselerator individual, termasuk kontrol reset dasar pada Port, ekspor wilayah AFU MMIO, layanan pemetaan buffer DMA, notifikasi UMsg(1), dan fungsi debug jarak jauh ( Lihat di atas).
UMsg hanya didukung melalui Acceleration Stack untuk Prosesor Intel Xeon® dengan FPGA Terintegrasi.
Fungsi Driver Perangkat Modul Port Platform
- Membuat node perangkat karakter Port.
- Membuat Port sysfs files dan mengimplementasikan Port sysfs file pengakses.
- Mengimplementasikan sub-driver fitur pribadi Port.
- Sub-driver fitur pribadi pelabuhan:
- Kepala Pelabuhan
- AFU
- Kesalahan Pelabuhan
- UMsg(2)
- Ketuk Sinyal
Aplikasi Pencacahan Perangkat FPGA
Bagian ini memperkenalkan cara aplikasi menghitung perangkat FPGA dari hierarki sysfs di bawah /sys/class/fpga. Di eksample di bawah ini, dua perangkat Intel FPGA dipasang di host. Setiap perangkat FPGA memiliki satu FME dan dua Port (AFU). Untuk setiap perangkat FPGA, direktori perangkat dibuat di bawah /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Setiap node memiliki satu FME dan dua Port (AFU) sebagai perangkat anak:
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-fme.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.2
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.3
Secara umum, antarmuka FME/Port sysfs diberi nama sebagai berikut:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
dengan I secara berurutan menomori semua perangkat kontainer, j secara berurutan menomori FME dan k secara berurutan menomori semua Port.
Node perangkat yang digunakan untuk ioctl() dan mmap() dapat direferensikan melalui:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
Enumerasi Driver PCIe
Bagian ini memberikan overview aliran kode untuk pencacahan perangkat yang dilakukan oleh intel-fpga-pci.ko. Struktur dan fungsi data utama disorot. Bagian ini paling baik diikuti kapan viewing kode sumber yang menyertainya (pcie.c).
Struktur Data Pencacahan
enum fpga_id_type {
IDENTITAS ORANG TUA,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
struct statis id fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nama;
dev_t dev;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .nama = FPGA_FEATURE_DEV_FME },
{ .nama = FPGA_FEATURE_DEV_PORT },
};
kelas struct statis *fpga_class;
struct statis pci_device_id cci_pcie_id_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_DCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_DCP),},
{0,}
};
struct statis pci_driver cci_pci_driver = {
.nama = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.hapus = cci_pci_hapus,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int perangkat_id;
struct perangkat *fme_dev;
kunci struct mutex;
struct list_head port_dev_list;
int rilis_port_num;
struct list_head wilayah;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
batal __iomem *ioaddr;
batal __iomem *ioend;
int bilah_saat ini;
batal __iomem *pfme_hdr;
struct perangkat *parent_dev;
struct platform_device *fitur_dev;
};
Alur Pencacahan
- ccidrv_init()
- Inisialisasi fpga_ids menggunakan idr_init().
- Inisialisasi fpga_chrdevs[i].devt menggunakan alloc_chrdev_region().
- Inisialisasi fpga_class menggunakan class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Aktifkan perangkat PCI, minta akses ke wilayahnya, atur mode master PCI, dan konfigurasikan DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Alokasikan struct build_feature_devs_info, inisialisasi.
.parent_dev diatur ke direktori sysfs induk (intel-fpga-dev.id) yang berisi direktori FME dan Port sysfs.
- Alokasikan struct build_feature_devs_info, inisialisasi.
- parse_fitur_daftar()
- Telusuri Daftar Fitur Perangkat BAR0 untuk menemukan FME, Port, dan fitur pribadinya.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Ketika FME ditemui:
- build_info_create_dev()
- Alokasikan perangkat platform untuk FME, simpan di build_feature_devs_info.feature_dev.
- feature_dev.id diinisialisasi ke hasil idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent diatur ke build_feature_devs_info.parent_dev.
- Alokasikan array sumber daya struct di feature_dev.resource.
- Alokasikan struct feature_platform_data, inisialisasi, dan simpan pointer di feature_dev.dev.platform_data
- create_feature_instance() build_info_add_sub_feature()
- Inisialisasi feature_dev.resource[FME_FEATURE_ID_HEADER].
- fitur_platform_data_tambahan()
- Inisialisasi feature_platform_data.features[FME_FEATURE_ID_HEADER], semuanya kecuali .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- Ketika Port ditemui:
- build_info_create_dev()
- Alokasikan perangkat platform untuk Port, simpan di build_feature_devs_info.feature_dev.
- feature_dev.id diinisialisasi ke hasil idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent diatur ke build_feature_devs_info.parent_dev.
- Alokasikan array sumber daya struct di feature_dev.resource.
- Alokasikan struct feature_platform_data, inisialisasi, dan simpan pointer di feature_dev.dev.platform_data
- build_info_commit_dev()
- Tambahkan struct feature_platform_data.node untuk Port ke daftar Port di struct cci_drvdata.port_dev_list
- create_feature_instance() build_info_add_sub_feature()
- Inisialisasi feature_dev.resource[PORT_FEATURE_ID_HEADER].
- fitur_platform_data_tambahan()
- Inisialisasi feature_platform_data.features[PORT_FEATURE_ID_HEADER], semuanya kecuali .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Ketika AFU ditemui:
- create_feature_instance() build_info_add_sub_feature()
- Inisialisasi feature_dev.resource[PORT_FEATURE_ID_UAFU].
- fitur_platform_data_tambahan()
- Inisialisasi feature_platform_data.features[PORT_FEATURE_ID_UAFU], semuanya kecuali .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Saat fitur pribadi FME ditemui:
- create_feature_instance() build_info_add_sub_feature()
- Inisialisasi feature_dev.resource[id].
- fitur_platform_data_tambahan()
- Inisialisasi feature_platform_data.features[id], semuanya kecuali .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Ketika fitur pribadi Port ditemui: * create_feature_instance() build_info_add_sub_feature() * Inisialisasi feature_dev.resource[id]. * feature_platform_data_add() Inisialisasi feature_platform_data.features[id], semuanya kecuali .fops.
- parse_ports_from_fme()
- Jika driver dimuat pada Fungsi Fisik (PF), maka:
- Jalankan aliran parse_feature_list() pada setiap port yang dijelaskan di header FME.
- Gunakan BAR yang disebutkan di setiap entri Port di header.
Inisialisasi Perangkat Platform FME
Bagian ini memberikan overview aliran kode untuk inisialisasi perangkat FME yang dilakukan oleh intel-fpga-fme.ko. Struktur dan fungsi data utama disorot. Bagian ini paling baik diikuti kapan viewing kode sumber yang menyertainya (fme-main.c).
Struktur Data Perangkat Platform FME
struct feature_ops {
int (*init)(struct platform_device *pdev, fitur struct *fitur);
int (*uinit)(struct platform_device *pdev, fitur struct *fitur);
panjang (*ioctl)(struct platform_device *pdev, fitur struct *fitur,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, fitur struct *fitur);
};
fitur struktur {
const char *nama;
int indeks_sumber daya;
batal __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head simpul;
kunci struct mutex;
dev_status panjang yang tidak ditandatangani;
struct cdev cdev;
struct platform_device *dev;
unsigned int menonaktifkan_count;
batal *pribadi;
int nomor;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
batal *, int (*cocok)(struct platform_device *, batal *)); struct
fitur fitur[0];
};
struct perf_object {
int.id;
const struct atribut_group **attr_groups;
struct perangkat *fme_dev;
struct list_head simpul;
struct list_head anak;
struct kobjek kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct perangkat *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
Alur Inisialisasi Perangkat Platform FME
Alur Inisialisasi FME
- fme_probe() fme_dev_init()
- Inisialisasi struct fpga_fme dan simpan di kolom feature_platform_data.private.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Simpan struct feature_ops ke dalam feature_platform_data.features untuk setiap fitur yang terisi.
- Panggil fungsi tes, jika ada, dari struct.
- Panggil fungsi init dari struct.
- fme_probe() fpga_register_dev_ops()
- Buat node perangkat karakter FME, daftarkan struct file_operasi.
Inisialisasi Perangkat Port Platform
Bagian ini memberikan overview aliran kode untuk inisialisasi perangkat port yang dilakukan oleh intel-fpga-afu.ko. Struktur dan fungsi data utama disorot. Bagian ini paling baik diikuti kapan viewing kode sumber yang menyertainya (afu.c).
Struktur Data Perangkat Port Platform
struct feature_ops {
int (*init)(struct platform_device *pdev, fitur struct *fitur);
int (*uinit)(struct platform_device *pdev, fitur struct *fitur);
panjang (*ioctl)(struct platform_device *pdev, fitur struct *fitur,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, fitur struct *fitur);
};
fitur struktur {
const char *nama;
int indeks_sumber daya;
batal __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head simpul;
kunci struct mutex;
dev_status panjang yang tidak ditandatangani;
struct cdev cdev;
struct platform_device *dev;
unsigned int menonaktifkan_count;
batal *pribadi;
int nomor;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
batal *, int (*cocok)(struct platform_device *, batal *));
struct fitur fitur[0];
};
struct fpga_afu_region {
indeks u32;
bendera u32;
ukuran u64;
u64 diimbangi;
u64 fisik;
struct list_head simpul;
};
struct fpga_afu_dma_region {
u64 pengguna_addr;
panjang u64;
u64 kuning;
halaman struct **halaman;
struct rb_node simpul;
bool di_use;
};
struct fpga_afu {
u64 region_cur_offset;
int jumlah_wilayah;
u8 angka_umsgs;
struct list_head wilayah;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Alur Inisialisasi Perangkat Port Platform
Alur Inisialisasi Port
- afu_probe() afu_dev_init()
- Inisialisasi struct fpga_afu dan simpan di kolom feature_platform_data.private.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Simpan struct feature_ops ke dalam feature_platform_data.features untuk setiap fitur yang terisi.
- Panggil fungsi tes, jika ada, dari struct.
- Panggil fungsi init dari struct.
- afu_probe() fpga_register_dev_ops()
- Buat simpul perangkat karakter Port, daftarkan struct file_operasi.
IOCTL FME
IOCTL yang dipanggil secara terbuka file deskriptor untuk /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—mengembalikan versi saat ini sebagai bilangan bulat, mulai dari 0.
FPGA_CHECK_EXTENSION—saat ini tidak didukung.
FPGA_FME_PORT_RELEASE—arg adalah penunjuk ke:
struct fpga_fme_port_release {
__u32 argumen; // dalam: sizeof(struct fpga_fme_port_release)
__u32 bendera; // di: harus 0
__u32 port_id; // di: ID port (dari 0) hingga rilis.
};
FPGA_FME_PORT_ASSIGN—arg adalah penunjuk ke:
struct fpga_fme_port_assign {
__u32 argumen; // di: sizeof(struct fpga_fme_port_assign)
__u32 bendera; // di: harus 0
__u32 port_id; // di: port ID (dari 0) untuk menetapkan. (harus
sebelumnya dirilis oleh FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg adalah penunjuk ke:
struct fpga_fme_port_pr {
__u32 argumen; // dalam: sizeof(struct fpga_fme_port_pr)
__u32 bendera; // di: harus 0
__u32 port_id; // masuk: ID port (dari 0)
__u32 buffer_size; // in: ukuran buffer bitstream dalam byte. Harus 4-byte
selaras.
__u64 buffer_address; // di: alamat proses buffer bitstream
__u64 status; // keluar: status kesalahan (bitmask)
};
Port IOCTL
IOCTL yang dipanggil secara terbuka file deskriptor untuk /dev/intel-fpga-port.k FPGA_GET_API_VERSION—mengembalikan versi saat ini sebagai bilangan bulat, mulai dari 0. FPGA_CHECK_EXTENSION—saat ini tidak didukung.
FPGA_PORT_GET_INFO—arg adalah penunjuk ke:
struct fpga_port_info {
__u32 argumen; // di: sizeof(struct fpga_port_info)
__u32 bendera; // keluar: mengembalikan 0
__u32 num_regions; // keluar: jumlah wilayah MMIO, 2 (1 untuk AFU dan 1 untuk
STP)
__u32 num_umsgs; // out: jumlah UMsg yang didukung oleh perangkat keras
};
FPGA_PORT_GET_REGION_INFO—arg adalah penunjuk ke:
struct fpga_port_region_info {
__u32 argumen; // di: sizeof(struct fpga_port_region_info)
__u32 bendera; // keluar: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // di: FPGA_PORT_INDEX_UAFU atau FPGA_PORT_INDEX_STP
__u32 bantalan; // di: harus 0
__u64 ukuran; // keluar: ukuran wilayah MMIO dalam byte
__u64 diimbangi; // keluar: offset wilayah MMIO dari awal perangkat fd
};
FPGA_PORT_DMA_MAP—arg adalah penunjuk ke:
struct fpga_port_dma_map {
__u32 argumen; // di: sizeof(struct fpga_port_dma_map)
__u32 bendera; // di: harus 0 __u64 user_addr; // di: proses virtual
alamat. Harus disejajarkan halaman.
__u64 panjang; // in: panjang pemetaan dalam byte. Harus kelipatan halaman
ukuran.
__u64 iova; // keluar: alamat virtual IO};
FPGA_PORT_DMA_UNMAP—arg adalah penunjuk ke:
struct fpga_port_dma_unmap {
__u32 argumen; // di: sizeof(struct fpga_port_dma_unmap)
__u32 bendera; // di: harus 0
__u64 iova; // di: alamat virtual IO dikembalikan oleh sebelumnya
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg harus NULL.
- FPGA_PORT_UMSG_ENABLE—arg harus NULL.
- FPGA_PORT_UMSG_DISABLE—arg harus NULL.
FPGA_PORT_UMSG_SET_MODE—arg adalah penunjuk ke:
struct fpga_port_umsg_cfg {
__u32 argumen; // dalam: sizeof(struct fpga_port_umsg_cfg)
__u32 bendera; // di: harus 0
__u32 petunjuk_bitmap; // dalam: Bitmap mode petunjuk UMsg. Menandakan mana UMsg itu
diaktifkan.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg harus dinonaktifkan sebelum mengeluarkan ioctl ini.
- Kolom iova harus untuk buffer yang cukup besar untuk semua UMsg (num_umsgs * PAGE_SIZE).
- Buffer ditandai sebagai "sedang digunakan" oleh manajemen buffer pengemudi.
- Jika iova adalah NULL, wilayah sebelumnya tidak ditandai sebagai "sedang digunakan".
- arg adalah penunjuk ke:
struct fpga_port_umsg_base_addr {- u32 argumen; // di: sizeof(struct fpga_port_umsg_base_addr)
- bendera u32; // di: harus 0
- u64 kuning; // di: alamat virtual IO dari FPGA_PORT_DMA_MAP. };
Catatan:
- Untuk menghapus kesalahan port, Anda harus menulis bitmask yang tepat dari kesalahan saat ini, misalnyaample, cat error > clear
- UMsg hanya didukung melalui Acceleration Stack untuk Prosesor Intel Xeon dengan FPGA Terintegrasi.
sistem operasi Files
Sistem Header FME files
intel-fpga-dev.i/intel-fpga-fme.j/
sistem operasi file | bidang mmio | jenis | mengakses |
port_num | fme_header.capability.num_ports | int desimal | Hanya baca |
ukuran_cache | fme_header.capability.cache_size | int desimal | Hanya baca |
versi | fme_header.capability.fabric_verid | int desimal | Hanya baca |
soket_id | fme_header.capability.socket_id | int desimal | Hanya baca |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Hanya baca |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Hanya baca |
Sistem Manajemen Termal FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sistem operasi file | bidang mmio | jenis | mengakses |
ambang batas1 | termal.ambang batas.tmp_thshold1 | int desimal | Pengguna: Hanya-baca Root: Baca-tulis |
ambang batas2 | termal.ambang batas.tmp_thshold2 | int desimal | Pengguna: Hanya-baca Root: Baca-tulis |
ambang_perjalanan | termal.ambang batas.term_trip_thshold | int desimal | Hanya baca |
ambang1_mencapai | thermal.threshold.thshold1_status | int desimal | Hanya baca |
ambang2_mencapai | thermal.threshold.thshold2_status | int desimal | Hanya baca |
ambang batas1_kebijakan | panas. threshold.thshold_policy | int desimal | Pengguna: Hanya-baca Root: Baca-tulis |
suhu | termal.rdsensor_fm1.fpga_temp | int desimal | Hanya baca |
Sistem Manajemen Daya FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sistem operasi file | bidang mmio | jenis | mengakses |
dikonsumsi | power.status.pwr_consumed | hex uint64_t | Hanya baca |
ambang batas1 | kekuatan.ambang batas.ambang batas1 | hex uint64_t | Pengguna: Hanya-baca Root: Baca-tulis |
ambang batas2 | kekuatan.ambang batas.ambang batas2 | hex uint64_t | Pengguna: Hanya-baca Root: Baca-tulis |
ambang1_status | kekuatan.ambang batas.ambang batas1_status | desimal tidak bertanda | Hanya baca |
ambang2_status | kekuatan.ambang batas.ambang batas2_status | desimal tidak bertanda | Hanya baca |
siaran langsung | power.status.fpga_latency_report | desimal tidak bertanda | Hanya baca |
Sistem Kesalahan Global FME files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sistem operasi file | bidang mmio | jenis | mengakses |
pcie0_errors | geror.pcie0_err | hex uint64_t | Baca tulis |
pcie1_errors | geror.pcie1_err | hex uint64_t | Baca tulis |
menyuntikkan_kesalahan | geror.ras_error_inj | hex uint64_t | Baca tulis |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sistem operasi file | bidang mmio | jenis | mengakses |
kesalahan | geror.fme_err | hex uint64_t | Hanya baca |
kesalahan_pertama | gerror.fme_first_err.err_reg_status | hex uint64_t | Hanya baca |
kesalahan_berikutnya | gerror.fme_next_err.err_reg_status | hex uint64_t | Hanya baca |
jernih | Menghapus kesalahan, first_error, next_error | berbagai uint64_t | Hanya tulis |
Catatan:
Untuk menghapus kesalahan FME, Anda harus menulis bitmask yang tepat dari kesalahan saat ini, misalnyaample cat error > clear.
Sistem Konfigurasi Ulang Parsial FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sistem operasi file | bidang mmio | jenis | mengakses |
antarmuka_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | heksa 16 byte | Hanya baca |
Sistem Kinerja Global FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sistem operasi file | bidang mmio | jenis | mengakses |
jam | gperf.clk.afu_interf_clock | hex uint64_t | Hanya baca |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Tidak valid untuk Acceleration Stack untuk CPU Intel Xeon dengan FPGA)
sistem operasi file | bidang mmio | jenis | mengakses |
membekukan | gperf.ch_ctl.freeze | int desimal | Baca tulis |
baca_hit | gperf.CACHE_RD_HIT | hex uint64_t | Hanya baca |
baca_rindu | gperf.CACHE_RD_MISS | hex uint64_t | Hanya baca |
tulis_hit | gperf.CACHE_WR_HIT | hex uint64_t | Hanya baca |
tulis_rindu | gperf.CACHE_WR_MISS | hex uint64_t | Hanya baca |
tahan_permintaan | gperf.CACHE_HOLD_REQ | hex uint64_t | Hanya baca |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Hanya baca |
sistem operasi file | bidang mmio | jenis | mengakses |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Hanya baca |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Hanya baca |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Hanya baca |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Tidak valid untuk Acceleration Stack untuk CPU Intel Xeon dengan FPGA)
sistem operasi file | bidang mmio | jenis | mengakses |
membekukan | gperf.vtd_ctl.freeze | int desimal | Pengguna: Hanya-baca Root: Baca-tulis |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Tidak valid untuk Acceleration Stack untuk CPU Intel Xeon dengan FPGA)
sistem operasi file | bidang mmio | jenis | mengakses |
baca_transaksi | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Hanya baca |
tulis_transaksi | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Hanya baca |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Hanya baca |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Hanya baca |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sistem operasi file | bidang mmio | jenis | mengakses |
memungkinkan | gperf.fab_ctl.(diaktifkan) | int desimal | Pengguna: Hanya-baca Root: Baca-tulis |
membekukan | gperf.fab_ctl.freeze | int desimal | Pengguna: Hanya-baca Root: Baca-tulis |
pcie0_baca | gperf.FAB_PCIE0_RD | hex uint64_t | Hanya baca |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Hanya baca |
pcie1_baca | gperf.FAB_PCIE1_RD | hex uint64_t | Hanya baca |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Hanya baca |
upi_baca | gperf.FAB_UPI_RD | hex uint64_t | Hanya baca |
upi_tulis | gperf.FAB_UPI_WR | hex uint64_t | Hanya baca |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sistem operasi file | bidang mmio | jenis | mengakses |
pcie0_baca | gperf.FAB_PCIE0_RD | hex uint64_t | Hanya baca |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Hanya baca |
pcie1_baca | gperf.FAB_PCIE1_RD | hex uint64_t | Hanya baca |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Hanya baca |
upi_baca | gperf.FAB_UPI_RD | hex uint64_t | Hanya baca |
upi_tulis | gperf.FAB_UPI_WR | hex uint64_t | Hanya baca |
Sistem Port Header files
intel-fpga-dev.i/intel-fpga-port.k/
sistem operasi file | bidang mmio | jenis | mengakses |
id | port_header.capability.port_number | int desimal | Hanya baca |
ltr | port_header.kontrol.latency_tolerance | int desimal | Hanya baca |
Sistem Header Port AFU files
intel-fpga-dev.i/intel-fpga-port.k/
sistem operasi file | bidang mmio | jenis | mengakses |
afu_id | afu_header.guid | heksa 16 byte | Hanya baca |
Sistem Kesalahan Port files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sistem operasi file | bidang mmio | jenis | mengakses |
kesalahan | perror.port_error | hex uint64_t | Hanya baca |
kesalahan_pertama | perror.port_first_error | hex uint64_t | Hanya baca |
first_malformed_req | perorr.malreq | heksa 16 byte | Hanya baca |
jernih | peror.(semua kesalahan) | berbagai uint64_t | Hanya tulis |
Catatan:
Untuk menghapus kesalahan Port, Anda harus menulis bitmask yang tepat dari kesalahan saat ini, misalnyaample cat error > clear.
Riwayat Revisi
Versi Dokumen | Perubahan |
2017.10.02 | Rilis Awal. |
Panduan Arsitektur Driver Perangkat OPAE Intel FPGA Linux
Dokumen / Sumber Daya
![]() |
Arsitektur Driver Perangkat Linux intel OPAE FPGA [Bahasa Indonesia:] Panduan Pengguna OPAE FPGA Arsitektur Driver Perangkat Linux, OPAE FPGA, Arsitektur Driver Perangkat Linux, Arsitektur Driver, Arsitektur |