logo intel

Arsitektur Driver Perangkat Linux intel OPAE FPGA

intel-OPAE-FPGA-Linux-Device-Driver-Arsitektur-produk

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

intel-OPAE-FPGA-Linux-Device-Driver-Arsitektur-gbr- (1)

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

intel-OPAE-FPGA-Linux-Device-Driver-Arsitektur-gbr- (2)

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:

  1. Bongkar pengemudi dari tamu
  2. Cabut VF dari tamu
  3. Nonaktifkan SR-IOV
  4. Lakukan konfigurasi ulang sebagian
  5. Aktifkan SR-IOV
  6. Colokkan VF ke tamu
  7. 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:

  1. 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.
  2. 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
  3. Lewati VF ke VM.
  4. 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

intel-OPAE-FPGA-Linux-Device-Driver-Arsitektur-gbr- (3)

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.
  • 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 FMEintel-OPAE-FPGA-Linux-Device-Driver-Arsitektur-gbr- (4)

  • 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 Portintel-OPAE-FPGA-Linux-Device-Driver-Arsitektur-gbr- (5)

  • 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

Referensi

Tinggalkan komentar

Alamat email Anda tidak akan dipublikasikan. Bidang yang wajib diisi ditandai *