intel OPAE FPGA Linux Device Driver Architecture
OPAE Intel FPGA Linux Device Driver Architecture
Pemacu Intel FPGA OPAE menyediakan antara muka untuk aplikasi ruang pengguna untuk mengkonfigurasi, menghitung, membuka dan mengakses pemecut FPGA pada platform yang dilengkapi dengan penyelesaian Intel FPGA dan membolehkan fungsi pengurusan peringkat sistem seperti konfigurasi semula FPGA, pengurusan kuasa dan maya.
Seni Bina Perkakasan
Dari sudut OS view, perkakasan FPGA muncul sebagai peranti PCIe biasa. Memori peranti FPGA disusun menggunakan struktur data yang telah ditetapkan (Senarai Ciri Peranti). Ciri-ciri yang disokong oleh peranti FPGA didedahkan melalui struktur data ini, seperti yang digambarkan di bawah dalam rajah berikut:
Peranti PCIe FPGA
Pemacu menyokong PCIe SR-IOV untuk mencipta Fungsi Maya (VF) yang boleh digunakan untuk menetapkan pemecut individu kepada mesin maya.
Perbadanan Intel. Hak cipta terpelihara. Intel, logo Intel dan tanda Intel lain ialah tanda dagangan Intel Corporation atau anak syarikatnya. Intel menjamin prestasi produk FPGA dan semikonduktornya mengikut spesifikasi semasa menurut waranti standard Intel tetapi berhak untuk membuat perubahan kepada mana-mana produk dan perkhidmatan pada bila-bila masa tanpa notis. Intel tidak memikul tanggungjawab atau liabiliti yang timbul daripada aplikasi atau penggunaan mana-mana maklumat, produk atau perkhidmatan yang diterangkan di sini kecuali seperti yang dipersetujui secara bertulis oleh Intel. Pelanggan Intel dinasihatkan untuk mendapatkan versi terkini spesifikasi peranti sebelum bergantung pada sebarang maklumat yang diterbitkan dan sebelum membuat pesanan untuk produk atau perkhidmatan.
Nama dan jenama lain boleh dituntut sebagai hak milik orang lain.
Peranti PCIe FPGA termaya
Enjin Pengurusan FPGA (FME)
Enjin Pengurusan FPGA melaksanakan pengurusan kuasa dan haba, pelaporan ralat, konfigurasi semula, pelaporan prestasi dan fungsi infrastruktur lain. Setiap FPGA mempunyai satu FME, yang sentiasa diakses melalui Fungsi Fizikal (PF). Aplikasi ruang pengguna boleh memperoleh akses eksklusif kepada FME menggunakan open(), dan melepaskannya menggunakan close() sebagai pengguna istimewa (root).
Pelabuhan
Port mewakili antara muka antara fabrik FPGA statik ("Pengurus Antara Muka FPGA (FIM)") dan kawasan boleh dikonfigurasikan separa yang mengandungi Fungsi Pemecut (AF). Port mengawal komunikasi daripada perisian kepada pemecut dan mendedahkan ciri seperti tetapan semula dan nyahpepijat. Peranti PCIe mungkin mempunyai beberapa Port, dan setiap Port boleh didedahkan melalui VF dengan memberikannya menggunakan ioctl FPGA_FME_PORT_ASSIGN pada peranti FME.
Unit Fungsi Pemecut (AF).
- Unit Fungsi Pemecut (AF) dilampirkan pada Port dan mendedahkan rantau 256K MMIO untuk digunakan untuk daftar kawalan khusus pemecut.
- Aplikasi ruang pengguna boleh memperoleh akses eksklusif kepada AFU yang dilampirkan pada Port dengan menggunakan open() pada peranti Port, dan melepaskannya menggunakan close().
- Aplikasi ruang pengguna juga boleh mmap() pemecut kawasan MMIO.
Konfigurasi Semula Separa
Seperti yang dinyatakan di atas, pemecut boleh dikonfigurasikan semula melalui konfigurasi semula separa bagi Fungsi Pemecut (AF) file. Fungsi Pemecut (AF) mesti telah dijana untuk FIM yang tepat dan kawasan statik sasaran (Port) FPGA; jika tidak, operasi konfigurasi semula akan gagal dan mungkin menyebabkan ketidakstabilan sistem. Keserasian ini boleh disemak dengan membandingkan ID antara muka yang dicatatkan dalam pengepala AF dengan ID antara muka yang didedahkan oleh FME melalui sysfs. Semakan ini biasanya dilakukan oleh ruang pengguna sebelum memanggil konfigurasi semula IOCTL.
Nota:
Pada masa ini, sebarang program perisian yang mengakses FPGA, termasuk yang dijalankan dalam hos maya, mesti ditutup sebelum mencuba konfigurasi semula separa. Langkah-langkahnya ialah:
- Punggah pemandu dari tetamu
- Cabut plag VF daripada tetamu
- Lumpuhkan SR-IOV
- Lakukan konfigurasi semula separa
- Dayakan SR-IOV
- Palamkan VF kepada tetamu
- Muatkan pemandu ke dalam tetamu
Maya FPGA
Untuk mendayakan mengakses pemecut daripada aplikasi yang dijalankan dalam VM, port AFU masing-masing perlu diberikan kepada VF menggunakan langkah berikut:
- PF memiliki semua port AFU secara lalai. Mana-mana port yang perlu ditetapkan semula kepada VF mesti dilepaskan terlebih dahulu daripada PF melalui ioctl FPGA_FME_PORT_RELEASE pada peranti FME.
- Setelah N port dilepaskan daripada PF, arahan di bawah boleh digunakan untuk mendayakan SRIOV dan VF. Setiap VF hanya memiliki satu port dengan AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
- Lulus melalui VF ke VM.
- AFU di bawah VF boleh diakses daripada aplikasi dalam VM (menggunakan pemacu yang sama di dalam VF).
Nota:
FME tidak boleh diberikan kepada VF, oleh itu PR dan fungsi pengurusan lain hanya tersedia melalui PF.
Organisasi Pemandu
Pemacu Peranti Modul PCIe
Organisasi Pemandu
Peranti FPGA muncul sebagai peranti PCIe biasa; oleh itu, pemacu peranti FPGA PCIe (intel-FPGA-PCI.ko) sentiasa dimuatkan dahulu sebaik sahaja FPGA PCIe PF atau VF dikesan. Pemandu ini memainkan peranan infrastruktur dalam seni bina pemandu. Ia:
- Mencipta peranti bekas FPGA sebagai induk kepada peranti ciri.
- Berjalan melalui Senarai Ciri Peranti, yang dilaksanakan dalam memori BAR peranti PCIe, untuk menemui peranti ciri dan subcirinya dan mencipta peranti platform untuknya di bawah peranti kontena.
- Menyokong SR-IOV.
- Memperkenalkan infrastruktur peranti ciri, yang mengabstraksi operasi untuk subciri dan mendedahkan fungsi biasa kepada pemacu peranti ciri.
Fungsi Pemacu Peranti Modul PCIe
- Mengandungi penemuan PCIe, penghitungan peranti dan penemuan ciri.
- Mencipta direktori sysfs untuk peranti induk, Enjin Pengurusan FPGA (FME) dan Port.
- Mencipta kejadian pemacu platform, menyebabkan kernel Linux memuatkan pemacu modul platform masing-masing.
Pemacu Peranti Modul Platform FME
- Pengurusan kuasa dan haba, pelaporan ralat, pelaporan prestasi dan fungsi infrastruktur lain. Anda boleh mengakses fungsi ini melalui antara muka sysfs yang didedahkan oleh pemacu FME.
- Konfigurasi Semula Separa. Pemacu FME mendaftarkan Pengurus FPGA semasa permulaan sub-ciri PR; sebaik sahaja ia menerima FPGA_FME_PORT_PR ioctl daripada anda, ia menggunakan fungsi antara muka biasa daripada Pengurus FPGA untuk melengkapkan konfigurasi semula separa aliran bit ke Port yang diberikan.
- Pengurusan pelabuhan untuk virtualisasi. Pemacu FME memperkenalkan dua ioctl, FPGA_FME_PORT_RELEASE, yang melepaskan Port yang diberikan daripada PF; dan FPGA_FME_PORT_ASSIGN, yang memberikan Port kembali kepada PF. Sebaik sahaja Port dilepaskan daripada PF, ia boleh diberikan kepada VF melalui antara muka SR-IOV yang disediakan oleh pemacu PCIe. Untuk maklumat lanjut, rujuk kepada "Penmayaran FPGA".
Fungsi Pemacu Peranti Modul Platform FME
- Mencipta nod peranti aksara FME.
- Mencipta sysfs FME files dan melaksanakan sysfs FME file aksesori.
- Melaksanakan sub-pemacu ciri peribadi FME.
- Sub-pemacu ciri peribadi FME:
- Tajuk FME
- Pengurusan Terma
- Pengurusan Kuasa
- Ralat Global
- Konfigurasi Semula Separa
- Prestasi Global
Pemacu Peranti Modul Pelabuhan Pelabuhan
Sama seperti pemacu FME, pemacu Port FPGA (dan AFU) (intel-fpga-afu. ko) disiasat sebaik sahaja peranti platform Port dibuat. Fungsi utama modul ini adalah untuk menyediakan antara muka untuk aplikasi ruang pengguna untuk mengakses pemecut individu, termasuk kawalan tetapan semula asas pada Port, eksport rantau AFU MMIO, perkhidmatan pemetaan penimbal DMA, pemberitahuan UMsg(1) dan fungsi nyahpepijat jauh ( lihat di atas).
UMsg hanya disokong melalui Timbunan Pecutan untuk Pemproses Intel Xeon® dengan FPGA Bersepadu.
Fungsi Pemacu Peranti Modul Pelabuhan Pelabuhan
- Mencipta nod peranti aksara Port.
- Mencipta sysfs Port files dan melaksanakan sysfs Port file aksesori.
- Melaksanakan sub-pemacu ciri peribadi Port.
- Sub-pemacu ciri peribadi port:
- Pengepala Pelabuhan
- AFU
- Ralat Pelabuhan
- UMsg(2)
- Ketik Isyarat
Pengiraan Peranti FPGA Aplikasi
Bahagian ini memperkenalkan cara aplikasi menghitung peranti FPGA daripada hierarki sysfs di bawah /sys/class/fpga. Dalam bekasampDi bawah, dua peranti Intel FPGA dipasang dalam hos. Setiap peranti FPGA mempunyai satu FME dan dua Port (AFU). Untuk setiap peranti FPGA, direktori peranti dibuat di bawah /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Setiap nod mempunyai satu FME dan dua Port (AFU) sebagai peranti kanak-kanak:
/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, antara muka sysfs FME/Port dinamakan seperti 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 berturut-turut menomborkan semua peranti kontena, j berturut-turut menomborkan FME dan k berturut-turut menomborkan semua Port.
Nod peranti yang digunakan untuk ioctl() dan mmap() boleh dirujuk melalui:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
Penghitungan Pemacu PCIe
Bahagian ini memberi kelebihanview aliran kod untuk penghitungan peranti yang dilakukan oleh intel-fpga-pci.ko. Struktur dan fungsi data utama diserlahkan. Bahagian ini paling baik diikuti apabila viewdalam kod sumber yang disertakan (pcie.c).
Struktur Data Penghitungan
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
struct statik idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nama;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
kelas struct statik *fpga_class;
struct statik 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 statik pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int device_id;
peranti struct *fme_dev;
kunci mutex struktur;
struct list_head port_dev_list;
int released_port_num;
kawasan list_head struktur;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
batal __iomem *ioaddr;
batal __iomem *ioend;
int current_bar;
batal __iomem *pfme_hdr;
peranti struct *parent_dev;
struct platform_device *feature_dev;
};
Aliran Penghitungan
- ccidrv_init()
- Mulakan fpga_ids menggunakan idr_init().
- Mulakan fpga_chrdevs[i].devt menggunakan alloc_chrdev_region().
- Mulakan fpga_class menggunakan class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Dayakan peranti PCI, minta akses kepada kawasannya, tetapkan mod induk PCI dan konfigurasikan DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Peruntukkan struct build_feature_devs_info, mulakan ia.
.parent_dev ditetapkan kepada direktori sysfs induk (intel-fpga-dev.id) yang mengandungi direktori sysfs FME dan Port.
- Peruntukkan struct build_feature_devs_info, mulakan ia.
- parse_feature_list()
- Ikuti Senarai Ciri Peranti BAR0 untuk menemui FME, Pelabuhan dan ciri peribadinya.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Apabila FME ditemui:
- build_info_create_dev()
- Peruntukkan peranti platform untuk FME, simpan dalam build_feature_devs_info.feature_dev.
- feature_dev.id dimulakan kepada hasil idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent ditetapkan kepada build_feature_devs_info.parent_dev.
- Peruntukkan tatasusunan sumber struct dalam feature_dev.resource.
- Peruntukkan struct feature_platform_data, mulakan ia dan simpan penunjuk dalam feature_dev.dev.platform_data
- create_feature_instance() build_info_add_sub_feature()
- Mulakan feature_dev.resource[FME_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Mulakan feature_platform_data.features[FME_FEATURE_ID_HEADER], semuanya kecuali .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- Apabila Pelabuhan ditemui:
- build_info_create_dev()
- Peruntukkan peranti platform untuk Port, simpan dalam build_feature_devs_info.feature_dev.
- feature_dev.id dimulakan kepada hasil idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent ditetapkan kepada build_feature_devs_info.parent_dev.
- Peruntukkan tatasusunan sumber struct dalam feature_dev.resource.
- Peruntukkan struct feature_platform_data, mulakan ia dan simpan penunjuk dalam feature_dev.dev.platform_data
- build_info_commit_dev()
- Tambahkan struct feature_platform_data.node untuk Port ke senarai Port dalam struct cci_drvdata.port_dev_list
- create_feature_instance() build_info_add_sub_feature()
- Mulakan feature_dev.resource[PORT_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Mulakan feature_platform_data.features[PORT_FEATURE_ID_HEADER], semuanya kecuali .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Apabila AFU ditemui:
- create_feature_instance() build_info_add_sub_feature()
- Mulakan feature_dev.resource[PORT_FEATURE_ID_UAFU].
- feature_platform_data_add()
- Mulakan feature_platform_data.features[PORT_FEATURE_ID_UAFU], semuanya kecuali .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Apabila ciri peribadi FME ditemui:
- create_feature_instance() build_info_add_sub_feature()
- Mulakan feature_dev.resource[id].
- feature_platform_data_add()
- Mulakan feature_platform_data.features[id], semuanya kecuali .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Apabila ciri peribadi Port ditemui: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Mulakan feature_platform_data.features[id], semuanya kecuali .fops.
- parse_ports_from_fme()
- Jika pemandu dimuatkan pada Fungsi Fizikal (PF), maka:
- Jalankan aliran parse_feature_list() pada setiap port yang diterangkan dalam pengepala FME.
- Gunakan BAR yang disebut dalam setiap entri Port dalam pengepala.
Permulaan Peranti Platform FME
Bahagian ini memberi kelebihanview aliran kod untuk permulaan peranti FME yang dilakukan oleh intel-fpga-fme.ko. Struktur dan fungsi data utama diserlahkan. Bahagian ini paling baik diikuti apabila viewdalam kod sumber yang disertakan (fme-main.c).
Struktur Data Peranti Platform FME
struct feature_ops {
int (*init)(struct platform_device *pdev, ciri struct *ciri);
int (*uinit)(struct platform_device *pdev, ciri struct *ciri);
panjang (*ioctl)(peranti_platform struct *pdev, ciri struct *ciri,
unsigned int cmd, unsigned long arg);
int (*ujian)(peranti_platform struct *pdev, ciri struct *ciri);
};
ciri struct {
const char *nama;
int sumber_indeks;
batal __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head nod;
kunci mutex struktur;
status dev_panjang yang tidak ditandatangani;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
batal *peribadi;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); struct
ciri ciri[0];
};
struct perf_object {
tangan anda;
const struct attribute_group **attr_groups;
peranti struct *fme_dev;
struct list_head nod;
struct list_head kanak-kanak;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
peranti struct *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
Aliran Permulaan Peranti Platform FME
Aliran Permulaan FME
- fme_probe() fme_dev_init()
- Mulakan struct fpga_fme dan simpannya dalam medan 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 ciri yang diisi.
- Panggil fungsi ujian, jika ada, dari struct.
- Panggil fungsi init dari struct.
- fme_probe() fpga_register_dev_ops()
- Cipta nod peranti aksara FME, mendaftarkan struct file_operasi.
Permulaan Peranti Platform Pelabuhan
Bahagian ini memberi kelebihanview aliran kod untuk permulaan peranti port yang dilakukan oleh intel-fpga-afu.ko. Struktur dan fungsi data utama diserlahkan. Bahagian ini paling baik diikuti apabila viewdalam kod sumber yang disertakan (afu.c).
Struktur Data Peranti Pelabuhan
struct feature_ops {
int (*init)(struct platform_device *pdev, ciri struct *ciri);
int (*uinit)(struct platform_device *pdev, ciri struct *ciri);
panjang (*ioctl)(peranti_platform struct *pdev, ciri struct *ciri,
unsigned int cmd, unsigned long arg);
int (*ujian)(peranti_platform struct *pdev, ciri struct *ciri);
};
ciri struct {
const char *nama;
int sumber_indeks;
batal __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head nod;
kunci mutex struktur;
status dev_panjang yang tidak ditandatangani;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
batal *peribadi;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
ciri ciri struktur[0];
};
struct fpga_afu_region {
indeks u32;
bendera u32;
saiz u64;
u64 mengimbangi;
u64 fizikal;
struct list_head nod;
};
struct fpga_afu_dma_region {
u64 user_addr;
panjang u64;
u64 iova;
halaman struktur **halaman;
struct rb_node nod;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
kawasan list_head struktur;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Aliran Permulaan Peranti Platform Pelabuhan
Aliran Permulaan Port
- afu_probe() afu_dev_init()
- Mulakan struct fpga_afu dan simpannya dalam medan 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 ciri yang diisi.
- Panggil fungsi ujian, jika ada, dari struct.
- Panggil fungsi init dari struct.
- afu_probe() fpga_register_dev_ops()
- Cipta nod peranti aksara Port, mendaftarkan struct file_operasi.
IOCTL FME
IOCTL yang dipanggil terbuka file deskriptor untuk /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—kembali versi semasa sebagai integer, bermula dari 0.
FPGA_CHECK_EXTENSION—tidak disokong pada masa ini.
FPGA_FME_PORT_RELEASE—arg ialah penunjuk kepada:
struct fpga_fme_port_release {
__u32 argsz; // dalam: sizeof(struct fpga_fme_port_release)
__u32 bendera; // dalam: mestilah 0
__u32 port_id; // dalam: port ID (dari 0) untuk dikeluarkan.
};
FPGA_FME_PORT_ASSIGN—arg ialah penunjuk kepada:
struct fpga_fme_port_assign {
__u32 argsz; // dalam: sizeof(struct fpga_fme_port_assign)
__u32 bendera; // dalam: mestilah 0
__u32 port_id; // in: port ID (dari 0) untuk diberikan. (mestilah
dikeluarkan sebelum ini oleh FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg ialah penunjuk kepada:
struct fpga_fme_port_pr {
__u32 argsz; // dalam: sizeof(struct fpga_fme_port_pr)
__u32 bendera; // dalam: mestilah 0
__u32 port_id; // dalam: port ID (dari 0)
__u32 buffer_size; // dalam: saiz penimbal aliran bit dalam bait. Mestilah 4-bait
sejajar.
__u64 alamat_penampan; // dalam: alamat proses penimbal aliran bit
status __u64; // keluar: status ralat (bitmask)
};
Pelabuhan IOCTL
IOCTL yang dipanggil terbuka file deskriptor untuk /dev/intel-fpga-port.k FPGA_GET_API_VERSION—kembali versi semasa sebagai integer, bermula dari 0. FPGA_CHECK_EXTENSION—tidak disokong pada masa ini.
FPGA_PORT_GET_INFO—arg ialah penunjuk kepada:
struct fpga_port_info {
__u32 argsz; // dalam: sizeof(struct fpga_port_info)
__u32 bendera; // keluar: mengembalikan 0
__u32 num_regions; // keluar: bilangan wilayah MMIO, 2 (1 untuk AFU dan 1 untuk
STP)
__u32 num_umsgs; // keluar: bilangan UMsg yang disokong oleh perkakasan
};
FPGA_PORT_GET_REGION_INFO—arg ialah penunjuk kepada:
struct fpga_port_region_info {
__u32 argsz; // dalam: sizeof(struct fpga_port_region_info)
__u32 bendera; // keluar: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // dalam: FPGA_PORT_INDEX_UAFU atau FPGA_PORT_INDEX_STP
__u32 pelapik; // dalam: mestilah 0
__u64 saiz; // keluar: saiz rantau MMIO dalam bait
__u64 mengimbangi; // keluar: mengimbangi rantau MMIO dari permulaan peranti fd
};
FPGA_PORT_DMA_MAP—arg ialah penunjuk kepada:
struct fpga_port_dma_map {
__u32 argsz; // dalam: sizeof(struct fpga_port_dma_map)
__u32 bendera; // dalam: mestilah 0 __u64 user_addr; // dalam: proses maya
alamat. Mesti dijajarkan halaman.
__u64 panjang; // dalam: panjang pemetaan dalam bait. Mestilah berbilang halaman
saiz.
__u64 iova; // keluar: alamat maya IO };
FPGA_PORT_DMA_UNMAP—arg ialah penunjuk kepada:
struct fpga_port_dma_unmap {
__u32 argsz; // dalam: sizeof(struct fpga_port_dma_unmap)
__u32 bendera; // dalam: mestilah 0
__u64 iova; // dalam: alamat maya IO dikembalikan oleh alamat sebelumnya
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg mestilah NULL.
- FPGA_PORT_UMSG_ENABLE—arg mestilah NULL.
- FPGA_PORT_UMSG_DISABLE—arg mestilah NULL.
FPGA_PORT_UMSG_SET_MODE—arg ialah penunjuk kepada:
struct fpga_port_umsg_cfg {
__u32 argsz; // dalam: sizeof(struct fpga_port_umsg_cfg)
__u32 bendera; // dalam: mestilah 0
__u32 hint_bitmap; // dalam: peta bit mod petunjuk UMsg. Menandakan UMsg yang mana
didayakan.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg mesti dilumpuhkan sebelum mengeluarkan ioctl ini.
- Medan iova mestilah untuk penimbal yang cukup besar untuk semua UMsg (num_umsgs * PAGE_SIZE).
- Penampan ditandakan sebagai "sedang digunakan" oleh pengurusan penimbal pemandu.
- Jika iova adalah NULL, mana-mana rantau sebelumnya tidak ditandakan sebagai "sedang digunakan".
- arg ialah penunjuk kepada:
struct fpga_port_umsg_base_addr {- u32 argsz; // dalam: sizeof(struct fpga_port_umsg_base_addr)
- bendera u32; // dalam: mestilah 0
- u64 iova; // dalam: alamat maya IO daripada FPGA_PORT_DMA_MAP. };
Nota:
- Untuk mengosongkan ralat port, anda perlu menulis bitmask yang tepat bagi ralat semasa, contohnyaample, kesilapan kucing > jelas
- UMsg hanya disokong melalui Timbunan Pecutan untuk Pemproses Intel Xeon dengan FPGA Bersepadu.
sysfs Files
sysfs Pengepala FME files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | medan mmio | taip | akses |
ports_num | fme_header.capability.num_ports | int perpuluhan | Baca sahaja |
saiz_cache | fme_header.capability.cache_size | int perpuluhan | Baca sahaja |
versi | fme_header.capability.fabric_verid | int perpuluhan | Baca sahaja |
socket_id | fme_header.capability.socket_id | int perpuluhan | Baca sahaja |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Baca sahaja |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Baca sahaja |
Sistem Pengurusan Terma FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | medan mmio | taip | akses |
ambang1 | thermal.threshold.tmp_threshold1 | int perpuluhan | Pengguna: Baca sahaja Root: Baca-tulis |
ambang2 | thermal.threshold.tmp_threshold2 | int perpuluhan | Pengguna: Baca sahaja Root: Baca-tulis |
ambang_perjalanan | thermal.threshold.therm_trip_thshold | int perpuluhan | Baca sahaja |
threshold1_reached | thermal.threshold.thshold1_status | int perpuluhan | Baca sahaja |
threshold2_reached | thermal.threshold.thshold2_status | int perpuluhan | Baca sahaja |
ambang1_dasar | terma. ambang.dasar_ambang | int perpuluhan | Pengguna: Baca sahaja Root: Baca-tulis |
suhu | thermal.rdsensor_fm1.fpga_temp | int perpuluhan | Baca sahaja |
Sistem Pengurusan Kuasa FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | medan mmio | taip | akses |
dimakan | kuasa.status.pwr_consumed | hex uint64_t | Baca sahaja |
ambang1 | kuasa.ambang.ambang1 | hex uint64_t | Pengguna: Baca sahaja Root: Baca-tulis |
ambang2 | kuasa.ambang.ambang2 | hex uint64_t | Pengguna: Baca sahaja Root: Baca-tulis |
ambang1_status | power.threshold.threshold1_status | perpuluhan tidak ditandatangani | Baca sahaja |
ambang2_status | power.threshold.threshold2_status | perpuluhan tidak ditandatangani | Baca sahaja |
rtl | power.status.fpga_latency_report | perpuluhan tidak ditandatangani | Baca sahaja |
sysfs Ralat Global FME files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | medan mmio | taip | akses |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Baca tulis |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Baca tulis |
inject_error | gerror.ras_error_inj | hex uint64_t | Baca tulis |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | medan mmio | taip | akses |
kesilapan | gerror.fme_err | hex uint64_t | Baca sahaja |
first_error | gerror.fme_first_err.err_reg_status | hex uint64_t | Baca sahaja |
next_error | gerror.fme_next_err.err_reg_status | hex uint64_t | Baca sahaja |
jelas | Membersihkan ralat, ralat_pertama, ralat_seterusnya | pelbagai uint64_t | Tulis sahaja |
Nota:
Untuk mengosongkan ralat FME, anda mesti menulis bitmask yang tepat bagi ralat semasa, contohnyaampralat kucing > jelas.
Sistem Konfigurasi Semula Separa FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | medan mmio | taip | akses |
id_antaramuka | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16-bait | Baca sahaja |
sysfs Prestasi Global FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | medan mmio | taip | akses |
jam | gperf.clk.afu_interf_clock | hex uint64_t | Baca sahaja |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Tidak sah untuk Timbunan Pecutan untuk CPU Intel Xeon dengan FPGA)
sysfs file | medan mmio | taip | akses |
membekukan | gperf.ch_ctl.freeze | int perpuluhan | Baca tulis |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Baca sahaja |
baca_rindu | gperf.CACHE_RD_MISS | hex uint64_t | Baca sahaja |
tulis_kena | gperf.CACHE_WR_HIT | hex uint64_t | Baca sahaja |
tulis_rindu | gperf.CACHE_WR_MISS | hex uint64_t | Baca sahaja |
hold_request | gperf.CACHE_HOLD_REQ | hex uint64_t | Baca sahaja |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Baca sahaja |
sysfs file | medan mmio | taip | akses |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Baca sahaja |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Baca sahaja |
tag_tulis_port_perselisihan | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Baca sahaja |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Tidak sah untuk Timbunan Pecutan untuk CPU Intel Xeon dengan FPGA)
sysfs file | medan mmio | taip | akses |
membekukan | gperf.vtd_ctl.freeze | int perpuluhan | Pengguna: Baca sahaja Root: Baca-tulis |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Tidak sah untuk Timbunan Pecutan untuk CPU Intel Xeon dengan FPGA)
sysfs file | medan mmio | taip | akses |
read_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Baca sahaja |
tulis_urus niaga | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Baca sahaja |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Baca sahaja |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Baca sahaja |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | medan mmio | taip | akses |
membolehkan | gperf.fab_ctl.(didayakan) | int perpuluhan | Pengguna: Baca sahaja Root: Baca-tulis |
membekukan | gperf.fab_ctl.freeze | int perpuluhan | Pengguna: Baca sahaja Root: Baca-tulis |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Baca sahaja |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Baca sahaja |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Baca sahaja |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Baca sahaja |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Baca sahaja |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Baca sahaja |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | medan mmio | taip | akses |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Baca sahaja |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Baca sahaja |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Baca sahaja |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Baca sahaja |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Baca sahaja |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Baca sahaja |
sysfs Pengepala Pelabuhan files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | medan mmio | taip | akses |
id | port_header.capability.port_number | int perpuluhan | Baca sahaja |
ltr | port_header.control.latency_tolerance | int perpuluhan | Baca sahaja |
Port AFU Pengepala sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | medan mmio | taip | akses |
afu_id | afu_header.guid | hex 16-bait | Baca sahaja |
sysfs Ralat Pelabuhan files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | medan mmio | taip | akses |
kesilapan | perror.port_error | hex uint64_t | Baca sahaja |
first_error | perror.port_first_error | hex uint64_t | Baca sahaja |
first_malformed_req | perror.malreq | hex 16-bait | Baca sahaja |
jelas | kesalahan.(semua kesilapan) | pelbagai uint64_t | Tulis sahaja |
Nota:
Untuk mengosongkan ralat Port, anda mesti menulis bitmask yang tepat bagi ralat semasa, contohnyaampralat kucing > jelas.
Sejarah Semakan
Versi Dokumen | Perubahan |
2017.10.02 | Keluaran Awal. |
Panduan Seni Bina Pemacu Peranti OPAE Intel FPGA Linux
Dokumen / Sumber
![]() |
intel OPAE FPGA Linux Device Driver Architecture [pdf] Panduan Pengguna OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |