intel OPAE FPGA Linux Device Driver Architecture
OPAE Intel FPGA Linux Device Driver Arxitekturasi
OPAE Intel FPGA drayveri Intel FPGA yechimlari bilan jihozlangan platformalarda FPGA tezlatkichlarini sozlash, sanash, ochish va ularga kirish uchun foydalanuvchi-kosmik ilovalar uchun interfeyslarni taqdim etadi va FPGA qayta konfiguratsiyasi, quvvatni boshqarish va virtualizatsiya kabi tizim darajasidagi boshqaruv funksiyalarini ishga tushiradi.
Uskuna arxitekturasi
OS nuqtai nazaridan view, FPGA apparati oddiy PCIe qurilmasi sifatida paydo bo'ladi. FPGA qurilma xotirasi oldindan belgilangan ma'lumotlar tuzilmasi (Device Feature List) yordamida tashkil qilingan. FPGA qurilmasi tomonidan qo'llab-quvvatlanadigan xususiyatlar quyidagi rasmda ko'rsatilganidek, ushbu ma'lumotlar tuzilmalari orqali namoyon bo'ladi:
FPGA PCIe qurilmasi
Drayv virtual mashinalarga individual tezlatgichlarni belgilash uchun ishlatilishi mumkin bo'lgan Virtual Funktsiyalarni (VF) yaratish uchun PCIe SR-IOV-ni qo'llab-quvvatlaydi.
Intel korporatsiyasi. Barcha huquqlar himoyalangan. Intel, Intel logotipi va boshqa Intel belgilari Intel korporatsiyasi yoki uning sho'ba korxonalarining savdo belgilaridir. Intel o'zining FPGA va yarimo'tkazgich mahsulotlarining Intel standart kafolatiga muvofiq joriy spetsifikatsiyalarga muvofiq ishlashiga kafolat beradi, lekin istalgan vaqtda ogohlantirmasdan istalgan mahsulot va xizmatlarga o'zgartirish kiritish huquqini o'zida saqlab qoladi. Intel tomonidan yozma ravishda kelishilgan hollar bundan mustasno, bu erda tasvirlangan har qanday ma'lumot, mahsulot yoki xizmatdan foydalanish yoki qo'llash natijasida kelib chiqadigan hech qanday javobgarlik yoki javobgarlikni o'z zimmasiga olmaydi. Intel mijozlariga har qanday nashr etilgan ma'lumotlarga tayanishdan va mahsulot yoki xizmatlarga buyurtma berishdan oldin qurilma texnik xususiyatlarining so'nggi versiyasini olish tavsiya etiladi.
Boshqa nomlar va brendlar boshqalarning mulki sifatida da'vo qilinishi mumkin.
Virtuallashtirilgan FPGA PCIe qurilmasi
FPGA boshqaruv mexanizmi (FME)
FPGA boshqaruv mexanizmi quvvat va issiqlik boshqaruvi, xatolar haqida hisobot berish, qayta konfiguratsiya, ishlash hisoboti va boshqa infratuzilma funktsiyalarini bajaradi. Har bir FPGAda bitta FME mavjud bo'lib, unga har doim jismoniy funktsiya (PF) orqali kirish mumkin. Foydalanuvchilar-kosmik ilovalar open() yordamida FME-ga eksklyuziv kirish huquqiga ega bo'lishi va uni imtiyozli foydalanuvchi (root) sifatida close() yordamida chiqarishi mumkin.
Port
Port statik FPGA tuzilishi ("FPGA interfeys menejeri (FIM)") va tezlatkich funktsiyasi (AF) o'z ichiga olgan qisman qayta sozlanishi mumkin bo'lgan hudud o'rtasidagi interfeysni ifodalaydi. Port dasturiy ta'minotdan tezlatgichgacha bo'lgan aloqani boshqaradi va qayta o'rnatish va disk raskadrovka kabi xususiyatlarni ochib beradi. PCIe qurilmasi bir nechta portga ega bo'lishi mumkin va har bir portni FME qurilmasida FPGA_FME_PORT_ASSIGN ioctl yordamida tayinlash orqali VF orqali ochish mumkin.
Tezlatgich funktsiyasi (AF) birligi
- Tezlatgich funksiyasi (AF) birligi portga biriktirilgan va tezlatgichga xos boshqaruv registrlari uchun foydalanish uchun 256K MMIO hududini ochib beradi.
- Foydalanuvchilar-kosmik ilovalar Port qurilmasida open() yordamida portga biriktirilgan AFUga eksklyuziv kirish huquqiga ega bo'lishi va uni close() yordamida chiqarishi mumkin.
- Foydalanuvchilar uchun mo'ljallangan ilovalar, shuningdek, MMIO mintaqalarini mmap() tezlashtirishi mumkin.
Qisman qayta konfiguratsiya
Yuqorida aytib o'tilganidek, tezlatgichlar tezlatgich funktsiyasini (AF) qisman qayta konfiguratsiya qilish orqali qayta konfiguratsiya qilinishi mumkin. file. Tezlatgich funktsiyasi (AF) FPGA ning aniq FIM va maqsadli statik mintaqasi (Port) uchun yaratilgan bo'lishi kerak; aks holda, qayta konfiguratsiya operatsiyasi muvaffaqiyatsiz bo'ladi va ehtimol tizimning beqarorligiga olib kelishi mumkin. Ushbu muvofiqlikni AF sarlavhasida qayd etilgan interfeys identifikatorini sysfs orqali FME tomonidan ochilgan interfeys identifikatori bilan solishtirish orqali tekshirish mumkin. Ushbu tekshirish odatda IOCTL rekonfiguratsiyasini chaqirishdan oldin foydalanuvchi maydoni tomonidan amalga oshiriladi.
Eslatma:
Ayni paytda, FPGA-ga kiradigan har qanday dasturiy ta'minot, shu jumladan virtuallashtirilgan xostda ishlaydigan dasturlar, qisman qayta konfiguratsiyaga urinishdan oldin yopilishi kerak. Qadamlar quyidagicha bo'ladi:
- Haydovchini mehmondan tushiring
- VF ni mehmondan uzing
- SR-IOV-ni o'chiring
- Qisman qayta konfiguratsiyani amalga oshiring
- SR-IOV ni yoqing
- VF ni mehmonga ulang
- Mehmonga haydovchini yuklang
FPGA virtualizatsiyasi
VM da ishlayotgan ilovalardan tezlatkichga kirishni yoqish uchun tegishli AFU portini VF ga quyidagi amallar yordamida tayinlash kerak:
- PF sukut bo'yicha barcha AFU portlariga ega. VF ga qayta tayinlanishi kerak bo'lgan har qanday port avval FME qurilmasidagi FPGA_FME_PORT_RELEASE ioctl orqali PFdan chiqarilishi kerak.
- PF dan N port chiqarilgach, SRIOV va VF larni yoqish uchun quyidagi buyruqdan foydalanish mumkin. Har bir VF AFU bilan faqat bitta portga ega. echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF-lar orqali VM-larga o'ting.
- VF ostidagi AFU-ga VM-dagi ilovalardan kirish mumkin (VF ichidagi bir xil drayver yordamida).
Eslatma:
FME ni VFga tayinlash mumkin emas, shuning uchun PR va boshqa boshqaruv funktsiyalari faqat PF orqali mavjud.
Haydovchi tashkiloti
PCIe moduli qurilma drayveri
Haydovchi tashkiloti
FPGA qurilmalari oddiy PCIe qurilmalari sifatida ko'rinadi; Shunday qilib, FPGA PCIe qurilma drayveri (intel-FPGA-PCI.ko) har doim FPGA PCIe PF yoki VF aniqlangandan keyin birinchi bo'lib yuklanadi. Ushbu drayver haydovchi arxitekturasida infratuzilmaviy rol o'ynaydi. Bu:
- Xususiyat qurilmalarining ota-onasi sifatida FPGA konteyner qurilmasini yaratadi.
- Xususiyat qurilmalari va ularning kichik funksiyalarini kashf qilish va konteyner qurilmasi ostida ular uchun platforma qurilmalarini yaratish uchun PCIe qurilmasi BAR xotirasida o'rnatilgan Device Features ro'yxati bo'ylab yuradi.
- SR-IOV ni qo'llab-quvvatlaydi.
- Quyi funksiyalar uchun operatsiyalarni abstraktlashtiradigan va xususiyat qurilma drayverlariga umumiy funksiyalarni ochib beruvchi xususiyatli qurilma infratuzilmasini taqdim etadi.
PCIe moduli qurilma drayveri funktsiyalari
- PCIe kashfiyoti, qurilmalar ro'yxati va xususiyatlarni aniqlashni o'z ichiga oladi.
- Asosiy qurilma, FPGA boshqaruv mexanizmi (FME) va port uchun sysfs kataloglarini yaratadi.
- Platforma drayverlari nusxalarini yaratadi, bu esa Linux yadrosiga tegishli platforma moduli drayverlarini yuklashiga olib keladi.
FME platforma moduli qurilma drayveri
- Quvvat va issiqlikni boshqarish, xatolar haqida hisobot berish, ishlash haqida hisobot berish va boshqa infratuzilma funktsiyalari. Siz ushbu funksiyalarga FME drayveri tomonidan ochilgan sysfs interfeyslari orqali kirishingiz mumkin.
- Qisman qayta konfiguratsiya. FME drayveri FPGA menejerini PR kichik funksiyasini ishga tushirish vaqtida ro'yxatdan o'tkazadi; u sizdan FPGA_FME_PORT_PR ioctl-ni olgandan so'ng, berilgan portga bit oqimining qisman qayta konfiguratsiyasini yakunlash uchun FPGA menejeridan umumiy interfeys funksiyasini ishga tushiradi.
- Virtualizatsiya uchun port boshqaruvi. FME drayveri ikkita ioctl-ni taqdim etadi, bu FPGA_FME_PORT_RELEASE, berilgan portni PFdan chiqaradi; va FPGA_FME_PORT_ASSIGN, bu portni PF ga qaytaradi. Port PF dan chiqarilgandan so'ng, uni VF ga PCIe drayveri tomonidan taqdim etilgan SR-IOV interfeyslari orqali tayinlash mumkin. Qo'shimcha ma'lumot uchun "FPGA virtualizatsiyasi" ga qarang.
FME platformasi moduli qurilma drayveri funktsiyalari
- FME belgilar qurilmasi tugunini yaratadi.
- FME sysfs ni yaratadi files va FME sysfs ni amalga oshiradi file yordamchilar.
- FME xususiy funksiyasi pastki drayverlarini amalga oshiradi.
- FME xususiy funksiyali pastki drayverlari:
- FME sarlavhasi
- Issiqlik boshqaruvi
- Quvvatni boshqarish
- Global xato
- Qisman qayta konfiguratsiya
- Global ishlash
Port platforma moduli qurilma drayveri
FME drayveriga o'xshab, FPGA Port (va AFU) drayveri (intel-fpga-afu. ko) Port platforma qurilmasi yaratilgandan so'ng tekshiriladi. Ushbu modulning asosiy vazifasi foydalanuvchi-kosmik ilovalar uchun alohida tezlatkichlarga kirish uchun interfeysni ta'minlashdan iborat, jumladan Portdagi asosiy qayta o'rnatish boshqaruvi, AFU MMIO hududini eksport qilish, DMA bufer xaritalash xizmati, UMsg(1) bildirishnomasi va masofaviy disk raskadrovka funksiyalari ( yuqoriga qarang).
UMsg faqat o'rnatilgan FPGA bilan Intel Xeon® protsessorlari uchun Acceleration Stack orqali qo'llab-quvvatlanadi.
Port platforma moduli qurilma drayveri funktsiyalari
- Port belgisi qurilma tugunini yaratadi.
- Port sysfs-ni yaratadi files va Port sysfs ni amalga oshiradi file yordamchilar.
- Port shaxsiy funksiyasi pastki drayverlarini amalga oshiradi.
- Portning shaxsiy xususiyatlarining pastki drayverlari:
- Port sarlavhasi
- AFU
- Port xatosi
- UMsg(2)
- Signal teginish
Ilova FPGA Device Enumeration
Ushbu bo'lim ilovalar FPGA qurilmasini /sys/class/fpga ostida sysfs ierarxiyasidan qanday sanab o'tishini tanishtiradi. OldindaampQuyida, xostda ikkita Intel FPGA qurilmasi o'rnatilgan. Har bir FPGA qurilmasida bitta FME va ikkita port (AFU) mavjud. Har bir FPGA qurilmasi uchun /sys/class/fpga ostida qurilma katalogi yaratiladi:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Har bir tugunda bitta FME va ikkita port (AFU) bolalar qurilmalari sifatida mavjud:
/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
Umuman olganda, FME/Port sysfs interfeyslari quyidagicha nomlanadi:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
bilan I ketma-ket barcha konteyner qurilmalarini raqamlash, j ketma-ket FME va k barcha portlarni ketma-ket raqamlash.
ioctl() va mmap() uchun ishlatiladigan qurilma tugunlariga quyidagilar orqali murojaat qilish mumkin:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe drayverlari ro'yxati
Bu bo'lim tugatish imkoniyatini beradiview intel-fpga-pci.ko tomonidan amalga oshirilgan qurilmalarni ro'yxatga olish uchun kod oqimi. Asosiy ma'lumotlar tuzilmalari va funktsiyalari ta'kidlangan. Bu bo'lim eng yaxshi qachon amal qiladi viewilova qilingan manba kodini (pcie.c).
Ro'yxatga olish ma'lumotlar tuzilmalari
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statik tuzilma idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nomi;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statik struktura sinfi * fpga_class;
statik struktura 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,}
};
statik struktura 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;
strukturaviy qurilma *fme_dev;
struct mutex blokirovkasi;
struct list_head port_dev_list;
int chiqarilgan_port_num;
struct list_head mintaqalari;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
bekor __iomem *ioaddr;
void __iomem *ioend;
int joriy_bar;
bekor __iomem *pfme_hdr;
struct qurilmasi *parent_dev;
struct platform_device * xususiyat_dev;
};
Ro'yxatga olish oqimi
- ccidrv_init()
- idr_init() yordamida fpga_idsni ishga tushiring.
- alloc_chrdev_region() yordamida fpga_chrdevs[i].devt faylini ishga tushiring.
- class_create() yordamida fpga_classni ishga tushiring.
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- PCI qurilmasini yoqing, uning hududlariga kirishni so'rang, PCI master rejimini o'rnating va DMA-ni sozlang.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- build_feature_devs_info strukturasini ajrating, uni ishga tushiring.
.parent_dev FME va Port sysfs kataloglarini o'z ichiga olgan asosiy sysfs katalogiga (intel-fpga-dev.id) o'rnatiladi.
- build_feature_devs_info strukturasini ajrating, uni ishga tushiring.
- parse_feature_list()
- FME, Port va ularning shaxsiy xususiyatlarini bilish uchun BAR0 Device Features ro'yxati bo'ylab yuring.
- parse_feature() parse_feature_afus() parse_feature_fme()
- FMEga duch kelganda:
- build_info_create_dev()
- FME uchun platforma qurilmasini ajratib, build_feature_devs_info.feature_dev da saqlang.
- feature_dev.id idr_alloc (fpga_ids[FME_ID]) natijasiga ishga tushirildi
- feature_dev.parent build_feature_devs_info.parent_dev ga o'rnatiladi.
- Feature_dev.resource-da strukturaviy resurslar qatorini ajrating.
- Feature_platform_data strukturasini ajrating, uni ishga tushiring va ko'rsatgichni feature_dev.dev.platform_data da saqlang
- create_feature_instance() build_info_add_sub_feature()
- Feature_dev.resource[FME_FEATURE_ID_HEADER] ni ishga tushiring.
- feature_platform_data_add()
- Feature_platform_data.features[FME_FEATURE_ID_HEADER], .fopsdan tashqari hamma narsani ishga tushiring.
- parse_feature() parse_feature_afus() parse_feature_port()
- Portga duch kelganda:
- build_info_create_dev()
- build_feature_devs_info.feature_dev da saqlangan port uchun platforma qurilmasini ajrating.
- feature_dev.id idr_alloc(fpga_ids[PORT_ID]) natijasiga ishga tushirildi
- feature_dev.parent build_feature_devs_info.parent_dev ga o'rnatiladi.
- Feature_dev.resource-da strukturaviy manbalar massivini ajrating.
- Feature_platform_data strukturasini ajrating, uni ishga tushiring va ko'rsatgichni feature_dev.dev.platform_data da saqlang
- build_info_commit_dev()
- Port uchun struct feature_platform_data.node ni struct cci_drvdata.port_dev_list ichidagi portlar ro‘yxatiga qo‘shing.
- create_feature_instance() build_info_add_sub_feature()
- Feature_dev.resource[PORT_FEATURE_ID_HEADER]ni ishga tushiring.
- feature_platform_data_add()
- Feature_platform_data.features[PORT_FEATURE_ID_HEADER], .fopsdan tashqari hamma narsani ishga tushiring.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- AFUga duch kelganda:
- create_feature_instance() build_info_add_sub_feature()
- Feature_dev.resource[PORT_FEATURE_ID_UAFU] ni ishga tushiring.
- feature_platform_data_add()
- Feature_platform_data.features[PORT_FEATURE_ID_UAFU], .fopsdan tashqari hamma narsani ishga tushiring.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- FME shaxsiy xususiyatiga duch kelganda:
- create_feature_instance() build_info_add_sub_feature()
- Feature_dev.resource[id] ni ishga tushiring.
- feature_platform_data_add()
- Features_platform_data.features[id], .fopsdan tashqari hamma narsani ishga tushiring.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Portning shaxsiy xususiyatiga duch kelganda: * create_feature_instance() build_info_add_sub_feature() * Feature_dev.resource[id] ni ishga tushiring. * feature_platform_data_add() Features_platform_data.features[id] ni ishga tushiring, .fopsdan tashqari hamma narsa.
- parse_ports_from_fme()
- Agar drayver Jismoniy funktsiyaga (PF) yuklangan bo'lsa, unda:
- FME sarlavhasida tasvirlangan har bir portda parse_feature_list() oqimini ishga tushiring.
- Sarlavhadagi har bir Port yozuvida ko'rsatilgan BAR dan foydalaning.
FME platformasi qurilmasini ishga tushirish
Bu bo'lim tugatish imkoniyatini beradiview intel-fpga-fme.ko tomonidan amalga oshirilgan FME qurilmasini ishga tushirish uchun kod oqimi. Asosiy ma'lumotlar tuzilmalari va funktsiyalari ta'kidlangan. Bu bo'lim eng yaxshi qachon amal qiladi viewilova qilingan manba kodini (fme-main.c).
FME platformasi qurilmalari ma'lumotlar tuzilmalari
struct feature_ops {
int (*init)(struct platform_device *pdev, struktur xususiyati *xususiyati);
int (*uinit)(struct platform_device *pdev, struktura xususiyati *xususiyati);
long (*ioctl)(struct platform_device *pdev, struktur xususiyati *xususiyati,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct xususiyati *xususiyati);
};
tuzilish xususiyati {
const char *nomi;
int resource_index;
bekor __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head tugun;
struct mutex blokirovkasi;
imzosiz uzoq dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
bekor * xususiy;
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 *)); tuzilishi
xususiyat xususiyatlari[0];
};
struct perf_object {
int identifikatori;
const struct attribute_group **attr_groups;
strukturaviy qurilma *fme_dev;
struct list_head tugun;
struct list_head bolalar;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
strukturaviy qurilma *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME platformasi qurilmasini ishga tushirish oqimi
FME ishga tushirish oqimi
- fme_probe() fme_dev_init()
- Fpga_fme strukturasini ishga tushiring va uni feature_platform_data.private maydoniga saqlang.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Har bir toʻldirilgan funksiya uchun xususiyat_ops strukturasini Feature_platform_data.features ichiga saqlang.
- Agar mavjud bo'lsa, strukturadan test funktsiyasini chaqiring.
- Strukturadan init funksiyasini chaqiring.
- fme_probe() fpga_register_dev_ops()
- Strukturani ro'yxatdan o'tkazgan holda FME belgilar qurilmasi tugunini yarating file_operatsiyalar.
Port platformasi qurilmasini ishga tushirish
Bu bo'lim tugatish imkoniyatini beradiview intel-fpga-afu.ko tomonidan amalga oshirilgan port qurilmasini ishga tushirish uchun kod oqimi. Asosiy ma'lumotlar tuzilmalari va funktsiyalari ta'kidlangan. Bu bo'lim eng yaxshi qachon amal qiladi viewilova qilingan manba kodini (afu.c).
Port platformasi qurilmalari ma'lumotlar tuzilmalari
struct feature_ops {
int (*init)(struct platform_device *pdev, struktur xususiyati *xususiyati);
int (*uinit)(struct platform_device *pdev, struktura xususiyati *xususiyati);
long (*ioctl)(struct platform_device *pdev, struktur xususiyati *xususiyati,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct xususiyati *xususiyati);
};
tuzilish xususiyati {
const char *nomi;
int resource_index;
bekor __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head tugun;
struct mutex blokirovkasi;
imzosiz uzoq dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
bekor * xususiy;
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 *));
strukturaviy xususiyatlar [0];
};
fpga_afu_region tuzilishi {
u32 indeksi;
u32 bayroqlari;
u64 o'lchami;
u64 ofset;
u64 jismoniy;
struct list_head tugun;
};
fpga_afu_dma_region tuzilishi {
u64 user_addr;
u64 uzunligi;
u64 iova;
struktura sahifasi **sahifalar;
struct rb_node tugun;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int mintaqalar soni;
u8 soni_ums;
struct list_head mintaqalari;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Port platformasi qurilmasini ishga tushirish oqimi
Portni ishga tushirish oqimi
- afu_probe() afu_dev_init()
- Fpga_afu strukturasini ishga tushiring va uni feature_platform_data.private maydoniga saqlang.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Har bir toʻldirilgan funksiya uchun xususiyat_ops strukturasini Feature_platform_data.features ichiga saqlang.
- Agar mavjud bo'lsa, strukturadan test funktsiyasini chaqiring.
- Strukturadan init funksiyasini chaqiring.
- afu_probe() fpga_register_dev_ops()
- Strukturani ro'yxatdan o'tkazgan holda Port belgilar qurilmasi tugunini yarating file_operatsiyalar.
FME IOCTLs
Ochiq rejimda chaqiriladigan IOCTLlar file /dev/intel-fpga-fme.j uchun deskriptor FPGA_GET_API_VERSION — joriy versiyani 0 dan boshlab butun son sifatida qaytaring.
FPGA_CHECK_EXTENSION—hozirda qo‘llab-quvvatlanmaydi.
FPGA_FME_PORT_RELEASE — arg quyidagi ko‘rsatkichdir:
struct fpga_fme_port_release {
__u32 argsz; // ichida: sizeof(struct fpga_fme_port_release)
__u32 bayroqlari; // ichida: 0 bo'lishi kerak
__u32 port_id; // ichida: port ID (0 dan) chiqarish uchun.
};
FPGA_FME_PORT_ASSIGN — arg quyidagi ko'rsatkichdir:
struct fpga_fme_port_assign {
__u32 argsz; // ichida: sizeof(struct fpga_fme_port_assign)
__u32 bayroqlari; // ichida: 0 bo'lishi kerak
__u32 port_id; // ichida: tayinlash uchun port ID (0 dan). (bo'lgan bo'lsa kerak
avval FPGA_FME_PORT_RELEASE tomonidan chiqarilgan)
};
FPGA_FME_PORT_PR—arg quyidagi ko‘rsatkichdir:
fpga_fme_port_pr tuzilishi {
__u32 argsz; // ichida: sizeof(struct fpga_fme_port_pr)
__u32 bayroqlari; // ichida: 0 bo'lishi kerak
__u32 port_id; // ichida: port ID (0 dan)
__u32 bufer_sizi; // ichida: bit oqimi buferining baytdagi hajmi. 4 bayt bo'lishi kerak
tekislangan.
__u64 bufer_manzil; // ichida: bit oqimi buferining jarayon manzili
__u64 holati; // chiqdi: xato holati (bit maskasi)
};
Port IOCTL
Ochiq rejimda chaqiriladigan IOCTLlar file /dev/intel-fpga-port.k deskriptori FPGA_GET_API_VERSION—joriy versiyani 0 dan boshlab butun son sifatida qaytaradi. FPGA_CHECK_EXTENSION—hozirda qo‘llab-quvvatlanmaydi.
FPGA_PORT_GET_INFO—arg quyidagiga ko‘rsatgichdir:
fpga_port_info tuzilishi {
__u32 argsz; // ichida: sizeof (struct fpga_port_info)
__u32 bayroqlari; // out: 0 ni qaytaradi
__u32 mintaqalar soni; // chiqdi: MMIO hududlari soni, 2 (AFU uchun 1 va
STP)
__u32 num_umsgs; // chiqdi: apparat tomonidan qo'llab-quvvatlanadigan UMsg soni
};
FPGA_PORT_GET_REGION_INFO—arg quyidagi ko‘rsatkichdir:
struct fpga_port_region_info {
__u32 argsz; // ichida: sizeof(struct fpga_port_region_info)
__u32 bayroqlari; // chiqish: (bit maskasi) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeksi; // ichida: FPGA_PORT_INDEX_UAFU yoki FPGA_PORT_INDEX_STP
__u32 to'ldirish; // ichida: 0 bo'lishi kerak
__u64 o'lchami; // chiqib: MMIO hududining baytdagi o'lchami
__u64 ofset; // chiqib: MMIO hududining qurilma fd boshlanishidan ofseti
};
FPGA_PORT_DMA_MAP — arg quyidagi ko‘rsatkichdir:
struct fpga_port_dma_map {
__u32 argsz; // ichida: sizeof(struct fpga_port_dma_map)
__u32 bayroqlari; // ichida: 0 bo'lishi kerak __u64 user_addr; // ichida: virtual jarayon
manzil. Sahifani tekislash kerak.
__u64 uzunligi; // ichida: baytlarda xaritalash uzunligi. Koʻp sahifa boʻlishi kerak
hajmi.
__u64 iova; // chiqish: IO virtual manzili };
FPGA_PORT_DMA_UNMAP—arg quyidagi ko‘rsatkichdir:
struct fpga_port_dma_unmap {
__u32 argsz; // ichida: sizeof(struct fpga_port_dma_unmap)
__u32 bayroqlari; // ichida: 0 bo'lishi kerak
__u64 iova; // ichida: oldingi tomonidan qaytarilgan IO virtual manzili
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg NULL bo‘lishi kerak.
- FPGA_PORT_UMSG_ENABLE—arg NULL bo‘lishi kerak.
- FPGA_PORT_UMSG_DISABLE—arglar NULL bo‘lishi kerak.
FPGA_PORT_UMSG_SET_MODE — arg quyidagi ko‘rsatkichdir:
struct fpga_port_umsg_cfg {
__u32 argsz; // ichida: sizeof(struct fpga_port_umsg_cfg)
__u32 bayroqlari; // ichida: 0 bo'lishi kerak
__u32 hint_bitmap; // ichida: UMsg maslahat rejimi bitmap. Qaysi UMsg ekanligini bildiradi
yoqilgan.
};
FPGA_PORT_UMSG_SET_BASE_ADDR -
- Ushbu ioctlni chiqarishdan oldin UMsg o'chirib qo'yilishi kerak.
- iova maydoni barcha UMsglar uchun etarlicha katta bufer uchun bo'lishi kerak (umsgs_s * PAGE_SIZE).
- Bufer haydovchining bufer boshqaruvi tomonidan “foydalanishda” deb belgilangan.
- Agar iova NULL bo'lsa, oldingi hudud "foydalanishda" deb belgilanmagan.
- arg quyidagi ko'rsatkichdir:
struct fpga_port_umsg_base_addr {- u32 argsz; // ichida: sizeof(struct fpga_port_umsg_base_addr)
- u32 bayroqlari; // ichida: 0 bo'lishi kerak
- u64 iova; // ichida: FPGA_PORT_DMA_MAP dan IO virtual manzili. };
Eslatma:
- Port xatolarini tozalash uchun siz joriy xatolarning aniq bit niqobini yozishingiz kerak, masalanample, mushuk xatolar > aniq
- UMsg faqat o'rnatilgan FPGA bilan Intel Xeon protsessorlari uchun Acceleration Stack orqali qo'llab-quvvatlanadi.
sysfs Files
FME sarlavhasi sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio maydoni | turi | kirish |
portlar_raqami | fme_header.capability.num_ports | kasr int | Faqat o'qish uchun |
kesh_sizi | fme_header.capability.cache_size | kasr int | Faqat o'qish uchun |
versiya | fme_header.capability.fabric_verid | kasr int | Faqat o'qish uchun |
socket_id | fme_header.capability.socket_id | kasr int | Faqat o'qish uchun |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Faqat o'qish uchun |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Faqat o'qish uchun |
FME termal boshqaruv tizimlari files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio maydoni | turi | kirish |
chegara 1 | thermal.threshold.tmp_thshold1 | kasr int | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
chegara 2 | thermal.threshold.tmp_thshold2 | kasr int | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
ostona_sayohat | thermal.threshold.therm_trip_thshold | kasr int | Faqat o'qish uchun |
1_eshikka erishildi | thermal.threshold.thshold1_status | kasr int | Faqat o'qish uchun |
2_eshikka erishildi | thermal.threshold.thshold2_status | kasr int | Faqat o'qish uchun |
pol1_siyosat | issiqlik. threshold.thshold_policy | kasr int | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
harorat | thermal.rdsensor_fm1.fpga_temp | kasr int | Faqat o'qish uchun |
FME quvvatni boshqarish tizimlari files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio maydoni | turi | kirish |
iste'mol qilingan | quvvat.status.pwr_iste'mol qilingan | hex uint64_t | Faqat o'qish uchun |
chegara 1 | kuch.bo‘sag‘a.bo‘sagi1 | hex uint64_t | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
chegara 2 | kuch.bo‘sag‘a.bo‘sagi2 | hex uint64_t | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
pol1_status | quvvat.threshold.threshold1_status | o'nlik belgisiz | Faqat o'qish uchun |
pol2_status | quvvat.threshold.threshold2_status | o'nlik belgisiz | Faqat o'qish uchun |
rtl | power.status.fpga_latency_report | o'nlik belgisiz | Faqat o'qish uchun |
FME global xatosi sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio maydoni | turi | kirish |
pcie0_errors | gerror.pcie0_err | hex uint64_t | O'qish - yozish |
pcie1_errors | gerror.pcie1_err | hex uint64_t | O'qish - yozish |
inject_error | gerror.ras_error_inj | hex uint64_t | O'qish - yozish |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio maydoni | turi | kirish |
xatolar | gerror.fme_err | hex uint64_t | Faqat o'qish uchun |
birinchi_xato | gerror.fme_first_err.err_reg_status | hex uint64_t | Faqat o'qish uchun |
keyingi_xato | gerror.fme_next_err.err_reg_status | hex uint64_t | Faqat o'qish uchun |
aniq | Xatolarni tozalaydi, birinchi_xato, keyingi_xato | turli xil uint64_t | Faqat yozish uchun |
Eslatma:
FME xatolarini tozalash uchun siz joriy xatolarning aniq bit niqobini yozishingiz kerak, masalanample cat errors > clear.
FME qisman qayta konfiguratsiya tizimlari files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio maydoni | turi | kirish |
interfeys_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16 bayt | Faqat o'qish uchun |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio maydoni | turi | kirish |
soat | gperf.clk.afu_interf_clock | hex uint64_t | Faqat o'qish uchun |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGA bilan Intel Xeon protsessorlari uchun Acceleration Stack uchun amal qilmaydi)
sysfs file | mmio maydoni | turi | kirish |
muzlash | gperf.ch_ctl.freeze | kasr int | O'qish - yozish |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Faqat o'qish uchun |
read_miss | gperf.CACHE_RD_MISS | hex uint64_t | Faqat o'qish uchun |
write_hit | gperf.CACHE_WR_HIT | hex uint64_t | Faqat o'qish uchun |
write_miss | gperf.CACHE_WR_MISS | hex uint64_t | Faqat o'qish uchun |
hold_so'rov | gperf.CACHE_HOLD_REQ | hex uint64_t | Faqat o'qish uchun |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Faqat o'qish uchun |
sysfs file | mmio maydoni | turi | kirish |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Faqat o'qish uchun |
data_write_port_content | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Faqat o'qish uchun |
tag_write_port_content | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Faqat o'qish uchun |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGAli Intel Xeon protsessorlari uchun Acceleration Stack uchun amal qilmaydi)
sysfs file | mmio maydoni | turi | kirish |
muzlash | gperf.vtd_ctl.freeze | kasr int | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGAli Intel Xeon protsessorlari uchun Acceleration Stack uchun amal qilmaydi)
sysfs file | mmio maydoni | turi | kirish |
o'qish_tranzaksiyasi | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Faqat o'qish uchun |
yozish_tranzaksiya | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Faqat o'qish uchun |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Faqat o'qish uchun |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Faqat o'qish uchun |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio maydoni | turi | kirish |
yoqish | gperf.fab_ctl.(yoqilgan) | kasr int | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
muzlash | gperf.fab_ctl.freeze | kasr int | Foydalanuvchi: Faqat o'qish uchun ildiz: o'qish-yozish |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Faqat o'qish uchun |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Faqat o'qish uchun |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Faqat o'qish uchun |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Faqat o'qish uchun |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Faqat o'qish uchun |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Faqat o'qish uchun |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio maydoni | turi | kirish |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Faqat o'qish uchun |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Faqat o'qish uchun |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Faqat o'qish uchun |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Faqat o'qish uchun |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Faqat o'qish uchun |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Faqat o'qish uchun |
Port sarlavhasi sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio maydoni | turi | kirish |
id | port_header.capability.port_number | kasr int | Faqat o'qish uchun |
ltr | port_header.control.latency_tolerance | kasr int | Faqat o'qish uchun |
Port AFU sarlavhasi sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio maydoni | turi | kirish |
afu_id | afu_header.guid | hex 16 bayt | Faqat o'qish uchun |
Port xatosi sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio maydoni | turi | kirish |
xatolar | perror.port_error | hex uint64_t | Faqat o'qish uchun |
birinchi_xato | perror.port_first_error | hex uint64_t | Faqat o'qish uchun |
birinchi_noto'g'ri tuzilgan_talab | perror.malreq | hex 16 bayt | Faqat o'qish uchun |
aniq | xato.(barcha xatolar) | turli xil uint64_t | Faqat yozish uchun |
Eslatma:
Port xatolarini tozalash uchun siz joriy xatolarning aniq bit niqobini yozishingiz kerak, masalanample cat errors > clear.
Qayta ko'rib chiqish tarixi
Hujjat versiyasi | O'zgarishlar |
2017.10.02 | Dastlabki nashr. |
OPAE Intel FPGA Linux Device Driver Arxitektura qo'llanmasi
Hujjatlar / manbalar
![]() |
intel OPAE FPGA Linux Device Driver Architecture [pdf] Foydalanuvchi uchun qoʻllanma OPAE FPGA Linux qurilma drayverlari arxitekturasi, OPAE FPGA, Linux qurilma drayverlari arxitekturasi, drayverlar arxitekturasi, arxitekturasi |