intel OPAE FPGA Linux құрылғы драйверінің архитектурасы
OPAE Intel FPGA Linux құрылғы драйверінің архитектурасы
OPAE Intel FPGA драйвері Intel FPGA шешімдерімен жабдықталған платформаларда FPGA үдеткіштерін конфигурациялау, санау, ашу және оларға қол жеткізу үшін пайдаланушы-кеңістік қолданбалары үшін интерфейстерді қамтамасыз етеді және FPGA қайта конфигурациялау, қуатты басқару және виртуализация сияқты жүйе деңгейіндегі басқару функцияларын қосады.
Аппараттық сәулет
ОЖ тұрғысынан view, FPGA аппараттық құралы кәдімгі PCIe құрылғысы ретінде пайда болады. FPGA құрылғысының жады алдын ала анықталған деректер құрылымы (Device Feature List) арқылы ұйымдастырылған. Төмендегі суретте көрсетілгендей, FPGA құрылғысы қолдайтын мүмкіндіктер осы деректер құрылымдары арқылы көрсетіледі:
FPGA PCIe құрылғысы
Драйвер виртуалды машиналарға жеке үдеткіштерді тағайындау үшін пайдалануға болатын Виртуалды функцияларды (VFs) жасау үшін PCIe SR-IOV қолдайды.
Intel корпорациясы. Барлық құқықтар сақталған. Intel, Intel логотипі және басқа Intel белгілері Intel корпорациясының немесе оның еншілес компанияларының сауда белгілері болып табылады. Intel өзінің FPGA және жартылай өткізгіш өнімдерінің Intel стандартты кепілдігіне сәйкес ағымдағы техникалық сипаттамаларға сәйкестігіне кепілдік береді, бірақ кез келген уақытта ескертусіз кез келген өнімдер мен қызметтерге өзгертулер енгізу құқығын өзіне қалдырады. Intel жазбаша түрде тікелей келіскен жағдайларды қоспағанда, Intel компаниясы осы құжатта сипатталған кез келген ақпаратты, өнімді немесе қызметті қолданудан немесе пайдаланудан туындайтын жауапкершілікті немесе жауапкершілікті өз мойнына алмайды. Intel тұтынушыларына кез келген жарияланған ақпаратқа сенбес бұрын және өнімдерге немесе қызметтерге тапсырыс бермес бұрын құрылғы сипаттамаларының соңғы нұсқасын алу ұсынылады.
Басқа атаулар мен брендтер басқалардың меншігі ретінде талап етілуі мүмкін.
Виртуалды FPGA PCIe құрылғысы
FPGA басқару механизмі (FME)
FPGA басқару механизмі қуат пен жылуды басқару, қателер туралы есеп беру, қайта конфигурациялау, өнімділік туралы есеп беру және басқа инфрақұрылым функцияларын орындайды. Әрбір FPGA бір FME бар, оған әрқашан физикалық функция (PF) арқылы қол жеткізіледі. Пайдаланушы-кеңістік қолданбалары open() көмегімен FME-ге эксклюзивті қатынасты ала алады және оны артықшылықты пайдаланушы (root) ретінде close() арқылы шығара алады.
Порт
Порт статикалық FPGA құрылымы («FPGA интерфейс реттеушісі (FIM)») мен жеделдеткіш функциясы (AF) бар ішінара қайта конфигурацияланатын аймақ арасындағы интерфейсті білдіреді. Порт бағдарламалық құралдан үдеткішке дейінгі байланысты басқарады және қалпына келтіру және жөндеу сияқты мүмкіндіктерді көрсетеді. PCIe құрылғысында бірнеше порттар болуы мүмкін және әрбір портты FME құрылғысындағы FPGA_FME_PORT_ASSIGN ioctl арқылы тағайындау арқылы VF арқылы шығаруға болады.
Үдеткіш функциясы (AF) бірлігі
- Үдеткіш функциясы (AF) құрылғысы портқа бекітілген және үдеткішке арналған басқару регистрлері үшін пайдаланылатын 256K MMIO аймағын көрсетеді.
- Пайдаланушы-кеңістік қолданбалары Порт құрылғысындағы open() арқылы Портқа тіркелген AFU-ға эксклюзивті қатынасты ала алады және оны close() арқылы босатады.
- Пайдаланушы-кеңістік қолданбалары MMIO аймақтарын да mmap() үдеткіші мүмкін.
Ішінара қайта конфигурациялау
Жоғарыда айтылғандай, үдеткіштерді үдеткіш функциясын (AF) ішінара қайта конфигурациялау арқылы қайта конфигурациялауға болады. file. Үдеткіш функциясы (AF) FPGA нақты FIM және мақсатты статикалық аймағы (Порт) үшін жасалған болуы керек; әйтпесе, қайта конфигурациялау әрекеті сәтсіз болады және жүйенің тұрақсыздығын тудыруы мүмкін. Бұл үйлесімділікті AF тақырыбында көрсетілген интерфейс идентификаторын FME арқылы sysfs арқылы ашқан интерфейс идентификаторымен салыстыру арқылы тексеруге болады. Бұл тексеру әдетте IOCTL қайта конфигурациясын шақырмас бұрын пайдаланушы кеңістігі арқылы жасалады.
Ескерту:
Қазіргі уақытта FPGA-ға қатынайтын кез келген бағдарламалық құрал, соның ішінде виртуалдандырылған хостта жұмыс істейтін бағдарламалық құрал ішінара қайта конфигурациялау әрекетінен бұрын жабылуы керек. Қадамдар келесідей болады:
- Қонақтан драйверді түсіріңіз
- VF-ны қонақтан ажыратыңыз
- SR-IOV өшіру
- Ішінара қайта конфигурациялауды орындаңыз
- SR-IOV қосыңыз
- VF-ны қонаққа қосыңыз
- Қонақтағы драйверді жүктеңіз
FPGA виртуализациясы
VM жүйесінде жұмыс істейтін қолданбалардан үдеткішке қол жеткізуді қосу үшін тиісті AFU порты келесі қадамдарды пайдаланып VF-ге тағайындалуы керек:
- PF әдепкі бойынша барлық AFU порттарына ие. VF-ге қайта тағайындалуы қажет кез келген порт алдымен FME құрылғысындағы FPGA_FME_PORT_RELEASE ioctl арқылы PF-ден босатылуы керек.
- PF-ден N порт босатылғаннан кейін, төмендегі пәрменді SRIOV және VFs қосу үшін пайдалануға болады. Әрбір VF AFU бар бір ғана портты иеленеді. echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF арқылы VM-ге өтіңіз.
- VF астындағы AFU VM жүйесіндегі қолданбалардан (VF ішіндегі бірдей драйверді пайдалану арқылы) қол жетімді.
Ескерту:
FME-ді VF-ге тағайындау мүмкін емес, сондықтан PR және басқа басқару функциялары тек PF арқылы қол жетімді.
Жүргізуші ұйымы
PCIe модулінің құрылғы драйвері
Жүргізуші ұйымы
FPGA құрылғылары кәдімгі PCIe құрылғылары ретінде пайда болады; осылайша, FPGA PCIe құрылғы драйвері (intel-FPGA-PCI.ko) әрқашан FPGA PCIe PF немесе VF анықталғаннан кейін алдымен жүктеледі. Бұл драйвер драйвер архитектурасында инфрақұрылымдық рөл атқарады. Ол:
- Функция құрылғыларының негізгі бөлігі ретінде FPGA контейнер құрылғысын жасайды.
- Функция құрылғыларын және олардың қосалқы мүмкіндіктерін табу және контейнер құрылғысының астында олар үшін платформа құрылғыларын жасау үшін PCIe құрылғысының BAR жадында енгізілген Құрылғы мүмкіндіктері тізімі арқылы өтеді.
- SR-IOV қолдайды.
- Ішкі мүмкіндіктерге арналған операцияларды қысқарту және мүмкіндік құрылғы драйверлеріне ортақ функцияларды ашатын мүмкіндік құрылғысының инфрақұрылымын ұсынады.
PCIe модулінің құрылғы драйверінің функциялары
- Құрамында PCIe табу, құрылғы тізімі және мүмкіндікті табу бар.
- Негізгі құрылғы, FPGA басқару механизмі (FME) және порт үшін sysfs каталогтарын жасайды.
- Linux ядросының платформалық модуль драйверлерін жүктеуіне себеп болатын платформа драйверінің даналарын жасайды.
FME платформа модулінің құрылғы драйвері
- Қуатты және жылуды басқару, қателер туралы есеп беру, өнімділік туралы есеп беру және басқа инфрақұрылым функциялары. Бұл функцияларға FME драйвері ашатын sysfs интерфейстері арқылы қол жеткізуге болады.
- Ішінара қайта конфигурациялау. FME драйвері PR қосалқы мүмкіндікті инициализациялау кезінде FPGA менеджерін тіркейді; ол сізден FPGA_FME_PORT_PR ioctl алғаннан кейін, ол берілген Портқа биттік ағынның ішінара қайта конфигурациясын аяқтау үшін FPGA реттеушісінен ортақ интерфейс функциясын шақырады.
- Виртуализация үшін портты басқару. FME драйвері екі ioctl енгізеді, FPGA_FME_PORT_RELEASE, ол берілген портты PF-ден босатады; және FPGA_FME_PORT_ASSIGN, ол портты PF-ге қайта тағайындайды. Порт PF-ден босатылғаннан кейін оны PCIe драйвері қамтамасыз ететін SR-IOV интерфейстері арқылы VF-ге тағайындауға болады. Қосымша ақпаратты «FPGA виртуализациясы» бөлімінен қараңыз.
FME платформа модулі құрылғы драйверінің функциялары
- FME таңба құрылғысының түйінін жасайды.
- FME sysfs жасайды files және FME sysfs іске асырады file аксессуарлар.
- FME жеке мүмкіндік қосалқы драйверлерін іске асырады.
- FME жеке мүмкіндік қосалқы драйверлері:
- FME тақырыбы
- Жылулық басқару
- Қуатты басқару
- Ғаламдық қате
- Ішінара қайта конфигурациялау
- Жаһандық өнімділік
Порт платформасы модулінің құрылғы драйвері
FME драйверіне ұқсас, FPGA портының (және AFU) драйвері (intel-fpga-afu. ko) Порт платформасының құрылғысы жасалғаннан кейін тексеріледі. Бұл модульдің негізгі функциясы Портта негізгі қалпына келтіруді басқаруды, AFU MMIO аймағын экспорттауды, DMA буферін салыстыру қызметін, UMsg(1) хабарландыруын және қашықтан жөндеу функцияларын қоса, жеке үдеткіштерге қол жеткізу үшін пайдаланушы-кеңістік қолданбалары үшін интерфейсті қамтамасыз ету болып табылады. жоғарыдан қараңыз).
UMsg бағдарламасына тек біріктірілген FPGA бар Intel Xeon® процессорына арналған Acceleration Stack арқылы қолдау көрсетіледі.
Порт платформасының модулі құрылғы драйверінің функциялары
- Порт таңбасының құрылғы түйінін жасайды.
- Port sysfs жасайды files және Port sysfs іске асырады file аксессуарлар.
- Порттың жеке мүмкіндігінің қосалқы драйверлерін іске асырады.
- Порттың жеке мүмкіндік қосалқы драйверлері:
- Порт тақырыбы
- AFU
- Порт қатесі
- UMsg(2)
- Сигналды түртіңіз
Қолданбаның FPGA құрылғысының нөмірі
Бұл бөлім қолданбалардың FPGA құрылғысын /sys/class/fpga астындағы sysfs иерархиясынан қалай санайтынын таныстырады. БұрынғыдаampТөменде екі Intel FPGA құрылғысы хостта орнатылған. Әрбір FPGA құрылғысында бір FME және екі порт (AFU) болады. Әрбір FPGA құрылғысы үшін /sys/class/fpga астында құрылғы каталогы жасалады:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Әрбір түйінде еншілес құрылғылар ретінде бір FME және екі порт (AFU) бар:
/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
Жалпы, FME/Port sysfs интерфейстері келесідей аталады:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
Мен барлық контейнерлік құрылғыларды дәйекті түрде нөмірлеймін, j ретімен FME нөмірлерін және k барлық порттарды дәйекті нөмірлейді.
ioctl() және mmap() үшін пайдаланылатын құрылғы түйіндеріне мыналар арқылы сілтеме жасауға болады:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe драйверінің тізімі
Бұл бөлімде қосымша ақпарат беріледіview intel-fpga-pci.ko орындайтын құрылғыны санауға арналған код ағынының. Негізгі деректер құрылымдары мен функциялары бөлектелген. Бұл бөлімді қашан орындаған дұрыс viewілеспе бастапқы кодты (pcie.c).
Санау деректерінің құрылымдары
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
статикалық құрылым idr fpga_ids[FPGA_ID_MAX];
fpga_chardev_info құрылымы {
const char *атауы;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
статикалық құрылым класы *fpga_class;
статикалық құрылым 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,}
};
статикалық құрылым 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;
құрылымдық құрылғы *fme_dev;
struct mutex құлпы;
struct list_head port_dev_list;
int шығарылған_порт_нөмірі;
struct list_head аймақтары;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int ағымдағы_бар;
void __iomem *pfme_hdr;
құрылымдық құрылғы *parent_dev;
struct platform_device *feature_dev;
};
Санақ ағыны
- ccidrv_init()
- fpga_ids idr_init() арқылы инициализациялаңыз.
- alloc_chrdev_region() арқылы fpga_chrdevs[i].devt файлын инициализациялаңыз.
- class_create() арқылы fpga_class инициализациясы.
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- PCI құрылғысын қосыңыз, оның аймақтарына рұқсат сұраңыз, PCI негізгі режимін орнатыңыз және DMA конфигурациялаңыз.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- build_feature_devs_info құрылымын бөліңіз, оны инициализациялаңыз.
.parent_dev FME және Port sysfs каталогтарын қамтитын негізгі sysfs каталогына (intel-fpga-dev.id) орнатылған.
- build_feature_devs_info құрылымын бөліңіз, оны инициализациялаңыз.
- parse_feature_list()
- FME, порт және олардың жеке мүмкіндіктерін табу үшін BAR0 құрылғы мүмкіндіктері тізімі бойынша жүріңіз.
- parse_feature() parse_feature_afus() parse_feature_fme()
- FME кездескен кезде:
- build_info_create_dev()
- build_feature_devs_info.feature_dev ішінде сақтай отырып, FME үшін платформа құрылғысын бөліңіз.
- feature_dev.id idr_alloc(fpga_ids[FME_ID]) нәтижесіне инициализацияланған
- feature_dev.parent build_feature_devs_info.parent_dev мәніне орнатылған.
- Feature_dev.resource ішіндегі құрылым ресурстарының массивін бөліңіз.
- Feature_platform_data құрылымын бөліңіз, оны инициализациялаңыз және көрсеткішті feature_dev.dev.platform_data ішінде сақтаңыз
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[FME_FEATURE_ID_HEADER] инициализациясы.
- feature_platform_data_add()
- Feature_platform_data.features[FME_FEATURE_ID_HEADER], .fops қоспағанда барлығын инициализациялаңыз.
- parse_feature() parse_feature_afus() parse_feature_port()
- Порт кездескен кезде:
- build_info_create_dev()
- build_feature_devs_info.feature_dev ішінде сақтай отырып, порт үшін платформа құрылғысын бөліңіз.
- feature_dev.id idr_alloc(fpga_ids[PORT_ID]) нәтижесіне инициализацияланған
- feature_dev.parent build_feature_devs_info.parent_dev мәніне орнатылған.
- Feature_dev.resource ішінде құрылымдық ресурс массивін бөліңіз.
- Feature_platform_data құрылымын бөліңіз, оны инициализациялаңыз және көрсеткішті feature_dev.dev.platform_data ішінде сақтаңыз
- build_info_commit_dev()
- Портқа арналған struct feature_platform_data.node параметрін struct cci_drvdata.port_dev_list ішіндегі Порттар тізіміне қосыңыз.
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[PORT_FEATURE_ID_HEADER] инициализациясы.
- feature_platform_data_add()
- Feature_platform_data.features[PORT_FEATURE_ID_HEADER], .fops қоспағанда барлығын инициализациялаңыз.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- AFU кездескен кезде:
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[PORT_FEATURE_ID_UAFU] инициализациясы.
- feature_platform_data_add()
- Feature_platform_data.features[PORT_FEATURE_ID_UAFU], .fops қоспағанда барлығын инициализациялаңыз.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- FME жеке мүмкіндігі кездескен кезде:
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[id] инициализациясы.
- feature_platform_data_add()
- Feature_platform_data.features[id], .fops қоспағанда барлығын инициализациялаңыз.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Порттың жеке мүмкіндігі кездескен кезде: * create_feature_instance() build_info_add_sub_feature() * feature_dev.resource[id] инициализациясы. * feature_platform_data_add() feature_platform_data.features[id], .fops-тан басқасының барлығын инициализациялаңыз.
- parse_ports_from_fme()
- Егер драйвер физикалық функцияға (PF) жүктелген болса, онда:
- FME тақырыбында сипатталған әрбір портта parse_feature_list() ағынын іске қосыңыз.
- Тақырыптағы әрбір Порт жазбасында көрсетілген BAR мәнін пайдаланыңыз.
FME платформасының құрылғысын инициализациялау
Бұл бөлімде қосымша ақпарат беріледіview intel-fpga-fme.ko орындайтын FME құрылғысын инициализациялау үшін код ағынының. Негізгі деректер құрылымдары мен функциялары бөлектелген. Бұл бөлімді қашан орындаған дұрыс viewілеспе бастапқы кодты (fme-main.c).
FME платформасының құрылғы деректерінің құрылымдары
struct feature_ops {
int (*init)(struct platform_device *pdev, құрылымдық мүмкіндік *мүмкіндік);
int (*uinit)(struct platform_device *pdev, құрылымдық мүмкіндік *мүмкіндік);
long (*ioctl)(struct platform_device *pdev, құрылымдық мүмкіндік *мүмкіндік,
unsigned int cmd, unsigned long arg);
int (*test)(құрылымдық платформа_құрылғы *pdev, құрылымдық мүмкіндік *мүмкіндік);
};
құрылым ерекшелігі {
const char *атауы;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
құрылымдық тізім_бас түйіні;
struct mutex құлпы;
қол қойылмаған ұзақ dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
void *private;
int сан;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*сәйкестік)(құрылым платформа_құрылғы *, void *)); құрылым
мүмкіндік мүмкіндіктері[0];
};
struct perf_object {
int идентификаторы;
const struct attribute_group **attr_groups;
құрылымдық құрылғы *fme_dev;
құрылымдық тізім_бас түйіні;
struct list_head балалары;
struct kobject kobj;
};
fpga_fme құрылымы {
u8 port_id;
u64 pr_err;
құрылымдық құрылғы *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME платформасының құрылғысын инициализациялау ағыны
FME инициализациялау ағыны
- fme_probe() fme_dev_init()
- fpga_fme құрылымын инициализациялаңыз және оны feature_platform_data.private өрісінде сақтаңыз.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Әрбір толтырылған мүмкіндік үшін feature_ops құрылымын feature_platform_data.features ішіне сақтаңыз.
- Сынақ функциясын, егер бар болса, құрылымнан шақырыңыз.
- Құрылымнан init функциясын шақырыңыз.
- fme_probe() fpga_register_dev_ops()
- Құрылымды тіркей отырып, FME таңба құрылғысының түйінін жасаңыз file_операциялар.
Порт платформасының құрылғысын инициализациялау
Бұл бөлімде қосымша ақпарат беріледіview intel-fpga-afu.ko орындайтын порт құрылғысын инициализациялау үшін код ағынының. Негізгі деректер құрылымдары мен функциялары бөлектелген. Бұл бөлімді қашан орындаған дұрыс viewілеспе бастапқы кодты (afu.c).
Порт платформасы құрылғысының деректер құрылымдары
struct feature_ops {
int (*init)(struct platform_device *pdev, құрылымдық мүмкіндік *мүмкіндік);
int (*uinit)(struct platform_device *pdev, құрылымдық мүмкіндік *мүмкіндік);
long (*ioctl)(struct platform_device *pdev, құрылымдық мүмкіндік *мүмкіндік,
unsigned int cmd, unsigned long arg);
int (*test)(құрылымдық платформа_құрылғы *pdev, құрылымдық мүмкіндік *мүмкіндік);
};
құрылым ерекшелігі {
const char *атауы;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
құрылымдық тізім_бас түйіні;
struct mutex құлпы;
қол қойылмаған ұзақ dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
void *private;
int сан;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*сәйкестік)(құрылым платформа_құрылғы *, void *));
құрылымдық мүмкіндіктердің мүмкіндіктері[0];
};
fpga_afu_region құрылымы {
u32 индексі;
u32 жалаулары;
u64 өлшемі;
u64 офсет;
u64 физ;
құрылымдық тізім_бас түйіні;
};
fpga_afu_dma_region құрылымы {
u64 user_addr;
u64 ұзындығы;
u64 iova;
құрылым беті **беттер;
struct rb_node түйіні;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int_аймақ саны;
u8_numsgs;
struct list_head аймақтары;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Порт платформасы құрылғысын инициализациялау ағыны
Портты инициализациялау ағыны
- afu_probe() afu_dev_init()
- fpga_afu құрылымын инициализациялаңыз және оны feature_platform_data.private өрісінде сақтаңыз.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Әрбір толтырылған мүмкіндік үшін feature_ops құрылымын feature_platform_data.features ішіне сақтаңыз.
- Сынақ функциясын, егер бар болса, құрылымнан шақырыңыз.
- Құрылымнан init функциясын шақырыңыз.
- afu_probe() fpga_register_dev_ops()
- Құрылымды тіркей отырып, Порт таңбасының құрылғы түйінін жасаңыз file_операциялар.
FME IOCTLs
Ашық режимде шақырылатын IOCTL file /dev/intel-fpga-fme.j дескрипторы FPGA_GET_API_VERSION — ағымдағы нұсқаны 0-ден бастап бүтін сан ретінде қайтарады.
FPGA_CHECK_EXTENSION — қазіргі уақытта қолдау көрсетілмейді.
FPGA_FME_PORT_RELEASE—arg мынаға көрсеткіш:
fpga_fme_port_release құрылымы {
__u32 argsz; // ішінде: sizeof(struct fpga_fme_port_release)
__u32 жалаушалары; // ішінде: 0 болуы керек
__u32 port_id; // ішінде: порт идентификаторы (0-ден) шығаруға дейін.
};
FPGA_FME_PORT_ASSIGN—arg мынаға көрсеткіш:
struct fpga_fme_port_assign {
__u32 argsz; // ішінде: sizeof(құрылым fpga_fme_port_assign)
__u32 жалаушалары; // ішінде: 0 болуы керек
__u32 port_id; // ішінде: тағайындау үшін порт идентификаторы (0-ден). (болған болуы керек
бұрын FPGA_FME_PORT_RELEASE шығарған)
};
FPGA_FME_PORT_PR—arg мынаны көрсететін көрсеткіш:
fpga_fme_port_pr құрылымы {
__u32 argsz; // ішінде: sizeof(struct fpga_fme_port_pr)
__u32 жалаушалары; // ішінде: 0 болуы керек
__u32 port_id; // ішінде: порт идентификаторы (0-ден)
__u32 буфер_өлшемі; // ішінде: биттегі буфер өлшемі. 4 байт болуы керек
тураланған.
__u64 буфер_адресі; // ішінде: биттік буфердің процесс мекенжайы
__u64 күйі; // шығыс: қате күйі (бит маскасы)
};
IOCTL порттары
Ашық режимде шақырылатын IOCTL file /dev/intel-fpga-port.k дескрипторы FPGA_GET_API_VERSION — ағымдағы нұсқаны 0-ден бастап бүтін сан ретінде қайтарады. FPGA_CHECK_EXTENSION — қазіргі уақытта қолдау көрсетілмейді.
FPGA_PORT_GET_INFO—arg мынаны көрсететін көрсеткіш:
fpga_port_info құрылымы {
__u32 argsz; // ішінде: sizeof(құрылым fpga_port_info)
__u32 жалаушалары; // out: 0 қайтарады
__u32 аймақтың саны; // шықты: MMIO аймақтарының саны, 2 (AFU үшін 1 және
STP)
__u32 num_umsgs; // шығыс: аппараттық құрал қолдайтын UMsg саны
};
FPGA_PORT_GET_REGION_INFO—arg мынаны көрсететін көрсеткіш:
fpga_port_region_info құрылымы {
__u32 argsz; // ішінде: sizeof(құрылым fpga_port_region_info)
__u32 жалаушалары; // шығыс: (бит маскасы) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 индексі; // ішінде: FPGA_PORT_INDEX_UAFU немесе FPGA_PORT_INDEX_STP
__u32 толтыру; // ішінде: 0 болуы керек
__u64 өлшемі; // шығыс: байттағы MMIO аймағының өлшемі
__u64 офсет; // out: fd құрылғысының басынан MMIO аймағының ығысуы
};
FPGA_PORT_DMA_MAP—arg мынаны көрсететін көрсеткіш:
fpga_port_dma_map құрылымы {
__u32 argsz; // ішінде: sizeof(struct fpga_port_dma_map)
__u32 жалаушалары; // ішінде: 0 болуы керек __u64 user_addr; // in: процесс виртуалды
мекенжайы. Бетті туралау керек.
__u64 ұзындығы; // ішінде: байттағы салыстыру ұзындығы. Бірнеше бет болуы керек
өлшемі.
__u64 iova; // шығыс: IO виртуалды мекенжайы };
FPGA_PORT_DMA_UNMAP—arg мынаны көрсететін көрсеткіш:
fpga_port_dma_unmap құрылымы {
__u32 argsz; // ішінде: sizeof(struct fpga_port_dma_unmap)
__u32 жалаушалары; // ішінде: 0 болуы керек
__u64 iova; // ішінде: алдыңғы қайтарған IO виртуалды мекенжайы
FPGA_PORT_DMA_MAP};
- FPGA_PORT_RESET—arg мәні NULL болуы керек.
- FPGA_PORT_UMSG_ENABLE—arg мәні NULL болуы керек.
- FPGA_PORT_UMSG_DISABLE—args NULL болуы керек.
FPGA_PORT_UMSG_SET_MODE—arg мынаны көрсететін көрсеткіш:
fpga_port_umsg_cfg құрылымы {
__u32 argsz; // ішінде: sizeof(struct fpga_port_umsg_cfg)
__u32 жалаушалары; // ішінде: 0 болуы керек
__u32 hint_bitmap; // ішінде: UMsg анықтама режимінің нүктелік суреті. UMsg қайсы екенін көрсетеді
қосылған.
};
FPGA_PORT_UMSG_SET_BASE_ADDR —
- Бұл ioctl шығарар алдында UMsg өшірілген болуы керек.
- iova өрісі барлық UMsg үшін жеткілікті үлкен буфер үшін болуы керек (num_umsgs * PAGE_SIZE).
- Драйвердің буфер басқаруы буферді «пайдалануда» деп белгілейді.
- Егер iova NULL болса, кез келген алдыңғы аймақ «пайдалануда» белгісі алынып тасталады.
- arg келесіге көрсеткіш:
fpga_port_umsg_base_addr құрылымы {- u32 argsz; // ішінде: sizeof(struct fpga_port_umsg_base_addr)
- u32 жалаулары; // ішінде: 0 болуы керек
- u64 iova; // ішінде: IO виртуалды мекенжайы FPGA_PORT_DMA_MAP. };
Ескерту:
- Порт қателерін жою үшін ағымдағы қателердің нақты нүкте маскасын жазу керек, мысалыample, мысық қателері > анық
- UMsg тек біріктірілген FPGA бар Intel Xeon процессорына арналған Acceleration Stack арқылы қолдау көрсетеді.
sysfs Files
FME тақырыбы жүйесі files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio өрісі | түрі | қол жеткізу |
порттар_саны | fme_header.capability.num_ports | ондық инт | Тек оқуға арналған |
кэш_өлшемі | fme_header.capability.cache_size | ондық инт | Тек оқуға арналған |
нұсқасы | fme_header.capability.fabric_verid | ондық инт | Тек оқуға арналған |
socket_id | fme_header.capability.socket_id | ондық инт | Тек оқуға арналған |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Тек оқуға арналған |
биттік_метадеректер | fme_header.bitstream_md | hex uint64_t | Тек оқуға арналған |
FME жылуды басқару жүйесі files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio өрісі | түрі | қол жеткізу |
табалдырық 1 | thermal.threshold.tmp_thshold1 | ондық инт | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
табалдырық 2 | thermal.threshold.tmp_thshold2 | ондық инт | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
шекті_сапар | thermal.threshold.therm_trip_thshold | ондық инт | Тек оқуға арналған |
шекті 1_жетілді | thermal.threshold.thshold1_status | ондық инт | Тек оқуға арналған |
шекті 2_жетілді | thermal.threshold.thshold2_status | ондық инт | Тек оқуға арналған |
шек 1_саясат | термиялық. threshold.thshold_policy | ондық инт | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
температура | thermal.rdsensor_fm1.fpga_temp | ондық инт | Тек оқуға арналған |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio өрісі | түрі | қол жеткізу |
тұтынылған | power.status.pwr_consumed | hex uint64_t | Тек оқуға арналған |
табалдырық 1 | қуат.табалдырық.табалдырық1 | hex uint64_t | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
табалдырық 2 | қуат.табалдырық.табалдырық2 | hex uint64_t | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
шек 1_күй | power.threshold.threshold1_status | ондық таңбасыз | Тек оқуға арналған |
шек 2_күй | power.threshold.threshold2_status | ондық таңбасыз | Тек оқуға арналған |
rtl | power.status.fpga_latency_report | ондық таңбасыз | Тек оқуға арналған |
FME жаһандық қатесі sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio өрісі | түрі | қол жеткізу |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Оқу-жазу |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Оқу-жазу |
inject_error | gerror.ras_error_inj | hex uint64_t | Оқу-жазу |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio өрісі | түрі | қол жеткізу |
қателер | gerror.fme_err | hex uint64_t | Тек оқуға арналған |
бірінші_қате | gerror.fme_first_err.err_reg_status | hex uint64_t | Тек оқуға арналған |
келесі_қате | gerror.fme_next_err.err_reg_status | hex uint64_t | Тек оқуға арналған |
анық | Қателерді жояды, бірінші_қате, келесі_қате | әртүрлі uint64_t | Тек жазу |
Ескерту:
FME қателерін жою үшін ағымдағы қателердің нақты нүкте маскасын жазу керек, мысалыample cat errors > clear.
FME ішінара қайта конфигурациялау жүйесі files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio өрісі | түрі | қол жеткізу |
интерфейс_идентификаторы | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | он алтылық 16 байт | Тек оқуға арналған |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio өрісі | түрі | қол жеткізу |
сағат | gperf.clk.afu_interf_clock | hex uint64_t | Тек оқуға арналған |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (FPGA бар Intel Xeon процессорына арналған Acceleration Stack үшін жарамсыз)
sysfs file | mmio өрісі | түрі | қол жеткізу |
мұздату | gperf.ch_ctl.freeze | ондық инт | Оқу-жазу |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Тек оқуға арналған |
оқуды_сағындым | gperf.CACHE_RD_MISS | hex uint64_t | Тек оқуға арналған |
write_hit | gperf.CACHE_WR_HIT | hex uint64_t | Тек оқуға арналған |
жазу_сағындым | gperf.CACHE_WR_MISS | hex uint64_t | Тек оқуға арналған |
ұстап_сұрау | gperf.CACHE_HOLD_REQ | hex uint64_t | Тек оқуға арналған |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Тек оқуға арналған |
sysfs file | mmio өрісі | түрі | қол жеткізу |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Тек оқуға арналған |
data_write_port_content | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Тек оқуға арналған |
tag_жазу_порты | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Тек оқуға арналған |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGA бар Intel Xeon процессорына арналған Acceleration Stack үшін жарамсыз)
sysfs file | mmio өрісі | түрі | қол жеткізу |
мұздату | gperf.vtd_ctl.freeze | ондық инт | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA бар Intel Xeon процессорына арналған Acceleration Stack үшін жарамсыз)
sysfs file | mmio өрісі | түрі | қол жеткізу |
оқу_транзакциясы | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Тек оқуға арналған |
жазу_транзакция | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Тек оқуға арналған |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Тек оқуға арналған |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Тек оқуға арналған |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio өрісі | түрі | қол жеткізу |
қосу | gperf.fab_ctl.(қосылған) | ондық инт | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
мұздату | gperf.fab_ctl.freeze | ондық инт | Пайдаланушы: тек оқуға арналған түбір: оқу-жазу |
pcie0_оқу | gperf.FAB_PCIE0_RD | hex uint64_t | Тек оқуға арналған |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Тек оқуға арналған |
pcie1_оқу | gperf.FAB_PCIE1_RD | hex uint64_t | Тек оқуға арналған |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Тек оқуға арналған |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Тек оқуға арналған |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Тек оқуға арналған |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio өрісі | түрі | қол жеткізу |
pcie0_оқу | gperf.FAB_PCIE0_RD | hex uint64_t | Тек оқуға арналған |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Тек оқуға арналған |
pcie1_оқу | gperf.FAB_PCIE1_RD | hex uint64_t | Тек оқуға арналған |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Тек оқуға арналған |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Тек оқуға арналған |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Тек оқуға арналған |
Порт тақырыбы sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio өрісі | түрі | қол жеткізу |
id | port_header.capability.port_number | ондық инт | Тек оқуға арналған |
лтр | port_header.control.latency_tolerance | ондық инт | Тек оқуға арналған |
Порт AFU тақырып жүйесі files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio өрісі | түрі | қол жеткізу |
afu_id | afu_header.guid | он алтылық 16 байт | Тек оқуға арналған |
Порт қатесі sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio өрісі | түрі | қол жеткізу |
қателер | perror.port_error | hex uint64_t | Тек оқуға арналған |
бірінші_қате | perror.port_first_error | hex uint64_t | Тек оқуға арналған |
бірінші_қате жасалған_талап | perror.malreq | он алтылық 16 байт | Тек оқуға арналған |
анық | қате.(барлық қателер) | әртүрлі uint64_t | Тек жазу |
Ескерту:
Порт қателерін жою үшін ағымдағы қателердің нақты нүкте маскасын жазу керек, мысалыample cat errors > clear.
Қайта қарау тарихы
Құжат нұсқасы | Өзгерістер |
2017.10.02 | Бастапқы шығарылым. |
OPAE Intel FPGA Linux құрылғы драйверінің архитектурасы бойынша нұсқаулық
Құжаттар / Ресурстар
![]() |
intel OPAE FPGA Linux құрылғы драйверінің архитектурасы [pdf] Пайдаланушы нұсқаулығы OPAE FPGA Linux құрылғы драйверінің архитектурасы, OPAE FPGA, Linux құрылғы драйверінің архитектурасы, драйвер архитектурасы, архитектурасы |