intel-logo

intel OPAE FPGA Linux Device Driver Architecture

intel-OPAE-FPGA-Linux-түзмөк-драйвер-архитектура-продукты

OPAE Intel FPGA Linux Device Driver Architecture

OPAE Intel FPGA драйвери Intel FPGA чечимдери менен жабдылган платформаларда FPGA тездеткичтерин конфигурациялоо, санап чыгуу, ачуу жана кирүү үчүн колдонуучу мейкиндик колдонмолору үчүн интерфейстерди камсыз кылат жана FPGA реконфигурациясы, кубаттуулукту башкаруу жана виртуалдаштыруу сыяктуу система деңгээлиндеги башкаруу функцияларын иштетет.

Аппараттык архитектура

OS жагынан view, FPGA жабдыгы кадимки PCIe түзмөгү катары көрүнөт. FPGA аппаратынын эстутуму алдын ала аныкталган маалымат структурасын (Түзмөктүн өзгөчөлүктөрү тизмеси) колдонуу менен уюштурулган. FPGA аппараты тарабынан колдоого алынган функциялар төмөндөгү сүрөттө көрсөтүлгөндөй, бул маалымат структуралары аркылуу ачыкка чыгат:

FPGA PCIe түзмөк

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (1)

Драйвер виртуалдык машиналарга жеке тездеткичтерди дайындоо үчүн колдонула турган Virtual Functions (VFs) түзүү үчүн PCIe SR-IOV колдойт.

Intel корпорациясы. Бардык укуктар корголгон. Intel, Intel логотиби жана башка Intel белгилери Intel корпорациясынын же анын туунду компанияларынын соода белгилери болуп саналат. Intel өзүнүн FPGA жана жарым өткөргүч өнүмдөрүн Intelдин стандарттык гарантиясына ылайык учурдагы спецификацияларга кепилдик берет, бирок эскертүүсүз каалаган убакта каалаган өнүмгө жана кызматтарга өзгөртүү киргизүү укугун өзүнө калтырат. Intel бул жерде сүрөттөлгөн кандайдыр бир маалыматты, продуктуну же кызматты колдонуудан же колдонуудан келип чыккан эч кандай жоопкерчиликти же жоопкерчиликти өзүнө албайт, Intel тарабынан жазуу жүзүндө ачык макулдашылгандан башка учурларда. Intel кардарларына жарыяланган маалыматка таянардан мурун жана өнүмдөр же кызматтарга буйрутма берүүдөн мурун түзмөктүн спецификацияларынын акыркы версиясын алуу сунушталат.

Башка аталыштар жана бренддер башкалардын менчиги катары талап кылынышы мүмкүн.

Виртуализацияланган FPGA PCIe түзмөк

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (2)

FPGA башкаруу кыймылдаткычы (FME)
FPGA башкаруу кыймылдаткычы кубаттуулукту жана жылуулукту башкарууну, каталар жөнүндө отчетту, кайра конфигурациялоону, аткаруу отчетун жана башка инфраструктуралык функцияларды аткарат. Ар бир FPGA бир FMEге ээ, ал ар дайым Физикалык Функция (PF) аркылуу жеткиликтүү. Колдонуучу мейкиндик колдонмолору open() аркылуу FMEге эксклюзивдүү кирүү мүмкүнчүлүгүн ала алышат жана аны артыкчылыктуу колдонуучу (root) катары close() аркылуу чыгара алышат.

Порт
Порт статикалык FPGA ткани ("FPGA Interface Manager (FIM)") менен акселератор функциясын (AF) камтыган жарым-жартылай кайра конфигурациялануучу аймактын ортосундагы интерфейсти билдирет. Порт программалык камсыздоодон ылдамдаткычка чейинки байланышты көзөмөлдөйт жана баштапкы абалга келтирүү жана мүчүлүштүктөрдү оңдоо сыяктуу функцияларды көрсөтөт. PCIe түзмөгүндө бир нече порт болушу мүмкүн жана ар бир портту FME түзмөгүндөгү FPGA_FME_PORT_ASSIGN ioctl аркылуу дайындоо аркылуу VF аркылуу ачыкка чыгарса болот.

Accelerator Function (AF) Unit

  • Accelerator Function (AF) бирдиги портко туташтырылган жана тездеткичке тиешелүү башкаруу регистрлери үчүн колдонула турган 256K MMIO аймагын ачып берет.
  • Колдонуучунун мейкиндик тиркемелери Порт түзмөгүндөгү open() аркылуу портко туташтырылган AFUге эксклюзивдүү кирүү мүмкүнчүлүгүн ала алат жана аны close() аркылуу коё алат.
  • Колдонуучу мейкиндик колдонмолору MMIO аймактарын да mmap() ылдамдата алат.

Жарым-жартылай кайра конфигурациялоо
Жогоруда айтылгандай, тездеткичтер Ылдамдаткыч Функциясынын (AF) жарым-жартылай кайра конфигурацияланышы аркылуу кайра конфигурацияланышы мүмкүн. file. Accelerator Function (AF) FPGAнын так FIM жана максаттуу статикалык аймагы (Порт) үчүн түзүлгөн болушу керек; антпесе, кайра конфигурациялоо операциясы ийгиликсиз болуп, системанын туруксуздугуна алып келиши мүмкүн. Бул шайкештикти AF темасында белгиленген интерфейс идентификаторун sysfs аркылуу FME көрсөткөн интерфейс идентификаторуна салыштыруу аркылуу текшерсе болот. Бул текшерүү, адатта, IOCTL реконфигурациясын чакыруудан мурун колдонуучу мейкиндиги тарабынан жүргүзүлөт.

Эскертүү:
Учурда, FPGAга кирүүчү бардык программалык камсыздоо программасы, анын ичинде виртуалдаштырылган хостто иштегендер, жарым-жартылай кайра конфигурациялоо аракетине чейин жабылышы керек. кадамдар болот:

  1. Айдоочуну коноктон түшүрүңүз
  2. VFти коноктон ажыратыңыз
  3. SR-IOV өчүрүү
  4. Жарым-жартылай кайра конфигурациялоо
  5. SR-IOV иштетүү
  6. VFти конокко туташтырыңыз
  7. Конокко айдоочуну жүктөңүз

FPGA виртуалдаштыруу
VMде иштеген тиркемелерден тездеткичке жетүүнү иштетүү үчүн, тиешелүү AFU порту VFге төмөнкү кадамдарды колдонуу менен дайындалышы керек:

  1. PF демейки боюнча бардык AFU портторуна ээ. VFге кайра дайындалышы керек болгон ар кандай порт алгач FME түзмөгүндөгү FPGA_FME_PORT_RELEASE ioctl аркылуу PFден бошотулушу керек.
  2. PFден N порт бошотулгандан кийин, SRIOV жана VFs иштетүү үчүн төмөндөгү буйрукту колдонсо болот. Ар бир VF AFU менен бир гана портко ээ. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. VF аркылуу VMлерге өтүңүз.
  4. VF алдындагы AFU VMдеги тиркемелерден жеткиликтүү (VF ичиндеги ошол эле драйверди колдонуу менен).

Эскертүү:
FMEди VFге дайындоо мүмкүн эмес, ошондуктан PR жана башка башкаруу функциялары КФ аркылуу гана жеткиликтүү.

Айдоочулар уюму

PCIe модулунун түзмөк драйвери

Айдоочулар уюму

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (3)

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ден бошотулгандан кийин, аны VFке PCIe драйвери тарабынан берилген SR-IOV интерфейстери аркылуу дайындоого болот. Көбүрөөк маалымат алуу үчүн, "FPGA Virtualization" карагыла.

FME Platform Module Device Driver Functions

  • FME белги түзүлүш түйүнүн түзөт.
  • FME системаларын түзөт fileс жана FME sysfs ишке ашырат file аксессуарлар.
  • FME жеке функция суб-драйверлерин ишке ашырат.
  • FME жеке өзгөчөлүк суб-драйверлери:
    • FME аталышы
    • Жылуулук башкаруу
    • Power Management
    • Глобалдык ката
    • Жарым-жартылай кайра конфигурациялоо
    • Global Performance

Port Platform Module Device Driver
FME драйверине окшош, FPGA портунун (жана AFU) драйвери (intel-fpga-afu. ko) Порт платформасынын түзмөгү түзүлгөндөн кийин текшерилет. Бул модулдун негизги функциясы колдонуучу-мейкиндик тиркемелери үчүн интерфейсти камсыз кылуу болуп саналат, анын ичинде Портто баштапкы абалга келтирүү башкаруусу, AFU MMIO чөлкөмүн экспорттоо, DMA буфердик карта түзүү кызматы, UMsg(1) билдирүүсү жана алыстан мүчүлүштүктөрдү оңдоо функциялары ( жогорудан карагыла).

UMsg интегралдык FPGA менен Intel Xeon® процессору үчүн Acceleration Stack аркылуу гана колдоого алынат.

Port Platform Module Device Driver Functions

  • Порт тамгасынын түзүлүш түйүнүн түзөт.
  • Port sysfs түзөт files жана Port sysfs ишке ашырат file аксессуарлар.
  • Порттун жеке өзгөчөлүктөрүнүн суб-драйверлерин ишке ашырат.
  • Порттун жеке өзгөчөлүк суб-драйверлери:
    • Port Header
    • AFU
    • Порт катасы
    • UMsg(2)
    • Signal Tap

Колдонмо FPGA Түзмөктүн саналышы
Бул бөлүмдө колдонмолор FPGA түзмөгүн /sys/class/fpga астындагы sysfs иерархиясынан кантип санаарын тааныштырышат. мурдагыampТөмөндө, эки Intel FPGA аппараты хостко орнотулган. Ар бир FPGA аппаратында бир FME жана эки порт (AFUs) бар. Ар бир 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/

I катары менен бардык контейнер түзүлүштөрүн номерлөө, 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 *name;
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 release_port_num;
struct list_head аймактары;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
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) коюлган.
  • 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)(struct platform_device *pdev, структура өзгөчөлүгү *функция);
};
структуралык өзгөчөлүк {
const char *name;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head түйүнү;
struct mutex кулпусу;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
void *жеке;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*матч)(struct platform_device *, void *)); структура
өзгөчөлүктөр [0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
структуралык түзүлүш *fme_dev;
struct list_head түйүнү;
struct list_head children;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
структуралык түзүлүш *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME Platform Device Initialization Flow

FME Initialization Flowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • 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_операциялар.

Port Platform Device Initialization
Бул бөлүм ашыкча маалымат берет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)(struct platform_device *pdev, структура өзгөчөлүгү *функция);
};
структуралык өзгөчөлүк {
const char *name;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head түйүнү;
struct mutex кулпусу;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
void *жеке;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*матч)(struct platform_device *, void *));
структуралык өзгөчөлүктөр [0];
};
структура fpga_afu_region {
u32 индекси;
u32 желектери;
u64 өлчөмү;
u64 офсет;
u64 phys;
struct list_head түйүнү;
};
структура fpga_afu_dma_region {
u64 user_addr;
u64 узундугу;
u64 iova;
структуралык бет **беттер;
struct rb_node түйүнү;
bool in_use;
};
структура fpga_afu {
u64 region_cur_offset;
int аймактардын саны;
u8 num_umsgs;
struct list_head аймактары;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Port Platform Device Device Initialization Flow

Портту инициализациялоо агымыintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • 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
Ачык түрдө чакырылган IOCTLs 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; // ичинде: порт ID (0дон) чыгаруу үчүн.
};

FPGA_FME_PORT_ASSIGN — arg бул көрсөткүч:

struct fpga_fme_port_assign {
__u32 argsz; // ичинде: sizeof(struct fpga_fme_port_assign)
__u32 желектер; // ичинде: 0 болушу керек
__u32 port_id; // ичинде: порт 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; // ичинде: порт ID (0дон баштап)
__u32 buffer_size; // ичинде: байт агымынын буферинин өлчөмү. 4-байт болушу керек
тегизделген.
__u64 buffer_address; // ичинде: бит агымынын буферинин процессинин дареги
__u64 статусу; // чыгып: ката абалы (бит маскасы)
};

Порт IOCTLs
Ачык түрдө чакырылган IOCTLs 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(struct fpga_port_info)
__u32 желектер; // out: 0 кайтарат
__u32 num_regions; // чыгып: MMIO аймактарынын саны, 2 (AFU үчүн 1 жана
STP)
__u32 num_umsgs; // чыгып: аппараттык камсыздоо тарабынан колдоого алынган UMsg саны
};

FPGA_PORT_GET_REGION_INFO—arg бул көрсөткүч:

структура fpga_port_region_info {
__u32 argsz; // ичинде: sizeof(struct 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 офсет; // чыгып: аппараттын башталышынан MMIO чөлкөмүнүн жылышы fd
};

FPGA_PORT_DMA_MAP — arg бул көрсөткүч:
struct fpga_port_dma_map {
__u32 argsz; // ичинде: sizeof(struct fpga_port_dma_map)
__u32 желектер; // in: 0 болушу керек __u64 user_addr; // ичинде: виртуалдык процесс
дареги. Баракты тегиздөө керек.
__u64 узундук; // менен: картанын узундугу байт менен. Бир нече бет болушу керек
өлчөмү.
__u64 iova; // чыгып: IO виртуалдык дареги};

FPGA_PORT_DMA_UNMAP — arg бул көрсөткүч:
struct 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 (сан_umsgs * PAGE_SIZE) үчүн жетиштүү чоң буфер үчүн болушу керек.
    • Буфер айдоочунун буфер башкаруусу тарабынан «колдонулуп жатат» деп белгиленет.
    • Эгерде iova NULL болсо, мурунку аймактардын баары "колдонулуп жатат" деп белгиленбейт.
  • arg көрсөткүчү болуп саналат:
    структура fpga_port_umsg_base_addr {
    • u32 argsz; // ичинде: sizeof(struct fpga_port_umsg_base_addr)
    • u32 желектери; // in: 0 болушу керек
    • u64 iova; // ичинде: IO виртуалдык дареги FPGA_PORT_DMA_MAP. };

Эскертүү:

  • Порт каталарын тазалоо үчүн учурдагы каталардын так бит маскасын жазышыңыз керек, мисалыampле, мышык каталар > ачык
  • UMsg интегралдык FPGA менен Intel Xeon процессору үчүн Acceleration Stack аркылуу гана колдоого алынат.

sysfs Files

FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file mmio талаасы түрү мүмкүндүк алуу
ports_num 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 Окуу үчүн гана
bitstream_metadata 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_threshold ондук инт Окуу үчүн гана
босого 1_жетти жылуулук. босого. босого 1_статус ондук инт Окуу үчүн гана
босого 2_жетти жылуулук. босого. босого 2_статус ондук инт Окуу үчүн гана
босого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_статус күч.босого.босого1_статус ондук кол коюлбаган Окуу үчүн гана
босого2_статус күч.босого.босого2_статус ондук кол коюлбаган Окуу үчүн гана
rtl power.status.fpga_latency_report ондук кол коюлбаган Окуу үчүн гана

FME Global Error 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 талаасы түрү мүмкүндүк алуу
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 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 CPU үчүн 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 Окуу үчүн гана
write_miss 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 CPU үчүн Acceleration Stack үчүн жараксыз)

sysfs file mmio талаасы түрү мүмкүндүк алуу
тоңуу gperf.vtd_ctl.freeze ондук инт Колдонуучу: окуу үчүн гана тамыр: окуу-жазуу

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA менен Intel Xeon CPU үчүн 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_read gperf.FAB_PCIE0_RD hex uint64_t Окуу үчүн гана
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Окуу үчүн гана
pcie1_read 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_read gperf.FAB_PCIE0_RD hex uint64_t Окуу үчүн гана
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Окуу үчүн гана
pcie1_read 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 Окуу үчүн гана

Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio талаасы түрү мүмкүндүк алуу
id port_header.capability.port_number ондук инт Окуу үчүн гана
лтр port_header.control.latency_tolerance ондук инт Окуу үчүн гана

Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio талаасы түрү мүмкүндүк алуу
afu_id afu_header.guid hex 16-байт Окуу үчүн гана

Port Error 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 hex 16-байт Окуу үчүн гана
ачык ката.(бардык каталар) ар кандай uint64_t Жазуу гана

Эскертүү:
Порт каталарын тазалоо үчүн учурдагы каталардын так бит маскасын жазышыңыз керек, мисалыample cat errors > clear.

Кайра карап чыгуу тарыхы

Документтин версиясы Өзгөрүүлөр
2017.10.02 Баштапкы релиз.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Документтер / Ресурстар

intel OPAE FPGA Linux Device Driver Architecture [pdf] Колдонуучунун колдонмосу
OPAE FPGA Linux Device Driver Архитектурасы, OPAE FPGA, Linux Device Driver Архитектурасы, Драйвер Архитектурасы, Архитектура

Шилтемелер

Комментарий калтырыңыз

Сиздин электрондук почта дарегиңиз жарыяланбайт. Талап кылынган талаалар белгиленген *