intel OPAE FPGA Linux төхөөрөмжийн драйверын архитектур
OPAE Intel FPGA Linux төхөөрөмжийн драйверын архитектур
OPAE Intel FPGA драйвер нь Intel FPGA шийдлээр тоноглогдсон платформ дээрх FPGA хурдасгуурыг тохируулах, тоолох, нээх, хандах хэрэглэгчийн орон зайн хэрэглээний программуудыг интерфейсээр хангадаг бөгөөд FPGA-г дахин тохируулах, тэжээлийн удирдлага, виртуалчлал зэрэг системийн түвшний удирдлагын функцуудыг идэвхжүүлдэг.
Техник хангамжийн архитектур
OS-ийн үүднээс авч үзвэл view, FPGA техник хангамж нь ердийн PCIe төхөөрөмж шиг харагдана. FPGA төхөөрөмжийн санах ойг урьдчилан тодорхойлсон өгөгдлийн бүтцийг (Төхөөрөмжийн онцлогийн жагсаалт) ашиглан зохион байгуулдаг. FPGA төхөөрөмжөөр дэмжигдсэн функцууд нь эдгээр өгөгдлийн бүтцээр дамжуулан ил гарсан бөгөөд доорх зурагт үзүүлэв.
FPGA PCIe төхөөрөмж
Драйвер нь PCIe SR-IOV-ийг дэмждэг Виртуал Функцуудыг (VFs) үүсгэхийн тулд виртуал машинуудад хувь хүний хурдасгуур хуваарилахад ашиглаж болно.
Intel корпораци. Бүх эрх хуулиар хамгаалагдсан. Intel, Intel лого болон бусад Intel тэмдэг нь Intel корпораци эсвэл түүний охин компаниудын худалдааны тэмдэг юм. Intel нь FPGA болон хагас дамжуулагч бүтээгдэхүүнүүдээ Intel-ийн стандарт баталгааны дагуу одоогийн техникийн үзүүлэлтүүдэд нийцүүлэн ажиллуулах баталгаа өгдөг боловч ямар ч бүтээгдэхүүн, үйлчилгээнд ямар ч үед мэдэгдэлгүйгээр өөрчлөлт оруулах эрхтэй. Intel нь бичгээр тохиролцсоноос бусад тохиолдолд энд дурдсан аливаа мэдээлэл, бүтээгдэхүүн, үйлчилгээг ашиглах, ашиглахаас үүдэн гарах хариуцлага, хариуцлага хүлээхгүй. Intel-ийн хэрэглэгчид нийтлэгдсэн мэдээлэлд найдах, бүтээгдэхүүн, үйлчилгээний захиалга өгөхөөс өмнө төхөөрөмжийн техникийн үзүүлэлтүүдийн хамгийн сүүлийн хувилбарыг авахыг зөвлөж байна.
Бусад нэр, брэндийг бусдын өмч гэж үзэж болно.
Виртуалжуулсан FPGA PCIe төхөөрөмж
FPGA удирдлагын хөдөлгүүр (FME)
FPGA удирдлагын хөдөлгүүр нь эрчим хүч, дулааны удирдлага, алдаа мэдээлэх, дахин тохируулах, гүйцэтгэлийн мэдээлэх болон бусад дэд бүтцийн функцуудыг гүйцэтгэдэг. FPGA бүр нэг FME-тэй байдаг бөгөөд энэ нь Физик функцээр (PF) үргэлж ханддаг. Хэрэглэгчийн орон зайн програмууд нь open()-г ашиглан FME-д онцгой хандалтыг олж авах боломжтой бөгөөд үүнийг close() ашиглан давуу эрхтэй хэрэглэгч (root) болгон суллах боломжтой.
Порт
Порт нь статик 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 толгой хэсэгт тэмдэглэсэн интерфэйсийн ID-г sysfs-ээр дамжуулан FME-ээс илэрсэн интерфейсийн ID-тай харьцуулж шалгаж болно. Энэ шалгалтыг 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 болон VF-г идэвхжүүлэхийн тулд доорх тушаалыг ашиглаж болно. VF бүр зөвхөн AFU-тай нэг портыг эзэмшдэг. echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF-уудаар дамжуулан VM-ууд руу шилжих.
- VF доорх AFU нь VM дээрх програмуудаас (VF доторх ижил драйвер ашиглан) хандах боломжтой.
Жич:
FME-ийг VF-д хуваарилах боломжгүй тул PR болон бусад удирдлагын функцийг зөвхөн PF-ээр дамжуулан ашиглах боломжтой.
Жолоочийн байгууллага
PCIe модулийн төхөөрөмжийн драйвер
Жолоочийн байгууллага
FPGA төхөөрөмжүүд нь ердийн PCIe төхөөрөмж шиг харагддаг; Тиймээс FPGA PCIe PF эсвэл VF илэрсэн үед FPGA PCIe төхөөрөмжийн драйвер (intel-FPGA-PCI.ko) үргэлж эхлээд ачаалагддаг. Энэ драйвер нь жолоочийн архитектурт дэд бүтцийн үүрэг гүйцэтгэдэг. Энэ нь:
- Онцлог төхөөрөмжүүдийн эх болгон FPGA контейнер төхөөрөмжийг үүсгэдэг.
- PCIe төхөөрөмжийн BAR санах ойд хэрэгжсэн Төхөөрөмжийн Онцлогын Жагсаалтаар алхаж, функцын төхөөрөмжүүд болон тэдгээрийн дэд функцуудыг олж илрүүлж, контейнер төхөөрөмжийн доор платформын төхөөрөмжүүдийг бий болгодог.
- SR-IOV дэмждэг.
- Дэд функцүүдийн үйлдлүүдийг хийсвэрлэн гаргаж, төхөөрөмжийн драйверуудад нийтлэг функцуудыг үзүүлдэг онцлог төхөөрөмжийн дэд бүтцийг танилцуулж байна.
PCIe модулийн төхөөрөмжийн драйверын функцууд
- PCIe илрүүлэлт, төхөөрөмжийн дугаарлалт, онцлог шинж чанарыг илрүүлэх зэргийг агуулдаг.
- Үндсэн төхөөрөмж, FPGA удирдлагын хөдөлгүүр (FME) болон портын sysfs сангуудыг үүсгэдэг.
- Линуксийн цөмд платформын драйверуудыг ачаалахад хүргэдэг платформ драйверын жишээг үүсгэнэ.
FME платформ модулийн төхөөрөмжийн драйвер
- Эрчим хүч, дулааны удирдлага, алдааны тайлан, гүйцэтгэлийн тайлан болон бусад дэд бүтцийн функцууд. Та эдгээр функцүүдэд FME драйверын нээсэн sysfs интерфэйсээр дамжуулан хандах боломжтой.
- Хэсэгчилсэн дахин тохируулга. FME драйвер нь PR дэд функцийг эхлүүлэх үед FPGA менежерийг бүртгэдэг; Энэ нь танаас FPGA_FME_PORT_PR ioctl-г хүлээн авмагц FPGA Manager-ийн нийтлэг интерфэйсийн функцийг өгөгдсөн порт руу бит урсгалын хэсэгчилсэн тохиргоог хийж дуусгах болно.
- Виртуалчлалын портын менежмент. FME драйвер нь өгөгдсөн портыг PF-ээс гаргадаг FPGA_FME_PORT_RELEASE гэсэн хоёр ioctl-г нэвтрүүлдэг; болон 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/
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 *нэр;
dev_t devt;
};
бүтэц fpga_chardev_info fpga_chrdevs[] = {
{ .нэр = FPGA_FEATURE_DEV_FME },
{ .нэр = 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 = {
.нэр = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_тохируулга
};
struct cci_drvdata {
int төхөөрөмжийн_id;
бүтцийн төхөөрөмж *fme_dev;
struct mutex цоож;
struct list_head port_dev_list;
int гаргасан_порт_тоо;
бүтцийн жагсаалтын_толгой бүсүүд;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
хүчингүй болсон __iomem *ioaddr;
хүчингүй __иомем *ioend;
int одоогийн_бар;
хүчингүй болгох __iomem *pfme_hdr;
бүтцийн төхөөрөмж *parent_dev;
struct platform_device * онцлог_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 бүтцийг хуваарилж, эхлүүлнэ үү.
- задлан шинжлэлийн_жагсаалт()
- 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.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 cci_drvdata.port_dev_list доторх портуудын жагсаалтад портын struct feature_platform_data.node-г нэмнэ үү.
- create_feature_instance() build_info_add_sub_feature()
- feature_dev.resource[PORT_FEATURE_ID_HEADER]-г эхлүүлнэ үү.
- онцлог_платформ_өгөгдлийн_нэмэх()
- 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]-г эхлүүлнэ үү.
- онцлог_платформ_өгөгдлийн_нэмэх()
- Features_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]-г эхлүүлэх.
- онцлог_платформ_өгөгдлийн_нэмэх()
- Features_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 платформын төхөөрөмжийн мэдээллийн бүтэц
бүтцийн онцлог_опс {
int (*init)(struct platform_device *pdev, бүтцийн онцлог * онцлог);
int (*uinit)(struct platform_device *pdev, бүтцийн онцлог * онцлог);
урт (*ioctl)(struct platform_device *pdev, бүтцийн онцлог * онцлог,
unsigned int cmd, unsigned long arg);
int (*туршилт)(бүтцийн платформ_төхөөрөмж *pdev, бүтцийн онцлог * онцлог);
};
бүтцийн онцлог {
const char *нэр;
int resource_index;
хүчингүй болсон __iomem *ioaddr;
struct feature_ops *ops;
};
бүтцийн онцлог_платформ_өгөгдөл {
бүтцийн жагсаалт_толгой зангилаа;
struct mutex цоож;
гарын үсэг зураагүй урт dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
хүчингүй * хувийн;
int тоо;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
хүчингүй *, int (* таарч)(бүтэц платформ_төхөөрөмж *, хүчингүй болсон *)); бүтэц
онцлог шинж чанарууд[0];
};
struct perf_object {
чи гар;
const struct attribute_group **attr_groups;
бүтцийн төхөөрөмж *fme_dev;
бүтцийн жагсаалт_толгой зангилаа;
struct list_head children;
struct kobject kobj;
};
бүтэц fpga_fme {
u8 port_id;
u64 pr_err;
бүтцийн төхөөрөмж *dev_err;
struct perf_object *perf_dev;
бүтцийн онцлог_платформ_өгөгдөл *pdata;
};
FME платформын төхөөрөмжийг эхлүүлэх урсгал
FME эхлүүлэх урсгал
- fme_probe() fme_dev_init()
- fpga_fme бүтцийг эхлүүлж, feature_platform_data.private талбарт хадгална.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Бүрэлдэхүүнтэй функц бүрийн функцийн_опсуудыг Feature_platform_data.features-д хадгална уу.
- Хэрэв байгаа бол тестийн функцийг бүтцээс дуудна уу.
- Бүтцээс init функцийг дуудна.
- fme_probe() fpga_register_dev_ops()
- FME тэмдэгтийн төхөөрөмжийн зангилаа үүсгэх, бүтцийг бүртгэх file_үйл ажиллагаа.
Порт платформын төхөөрөмжийг эхлүүлэх
Энэ хэсэг нь илүү ихийг өгдөгview intel-fpga-afu.ko-ийн гүйцэтгэсэн портын төхөөрөмжийг эхлүүлэх кодын урсгалын. Өгөгдлийн үндсэн бүтэц, функцуудыг онцлон тэмдэглэв. Энэ хэсгийг хэзээ дагаж мөрдөх нь дээр viewдагалдах эх код (afu.c).
Порт платформын төхөөрөмжийн өгөгдлийн бүтэц
бүтцийн онцлог_опс {
int (*init)(struct platform_device *pdev, бүтцийн онцлог * онцлог);
int (*uinit)(struct platform_device *pdev, бүтцийн онцлог * онцлог);
урт (*ioctl)(struct platform_device *pdev, бүтцийн онцлог * онцлог,
unsigned int cmd, unsigned long arg);
int (*туршилт)(бүтцийн платформ_төхөөрөмж *pdev, бүтцийн онцлог * онцлог);
};
бүтцийн онцлог {
const char *нэр;
int resource_index;
хүчингүй болсон __iomem *ioaddr;
struct feature_ops *ops;
};
бүтцийн онцлог_платформ_өгөгдөл {
бүтцийн жагсаалт_толгой зангилаа;
struct mutex цоож;
гарын үсэг зураагүй урт dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
хүчингүй * хувийн;
int тоо;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
хүчингүй *, int (* таарч) (бүтэц платформ_төхөөрөмж *, хүчингүй болсон *));
бүтцийн онцлог шинж чанарууд[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;
};
бүтэц fpga_afu {
u64 region_cur_offset;
int бүсүүдийн тоо;
u8 umsgs;
бүтцийн жагсаалтын_толгой бүсүүд;
struct rb_root dma_regions;
бүтцийн онцлог_платформ_өгөгдөл *pdata;
};
Порт платформын төхөөрөмжийг эхлүүлэх урсгал
Порт эхлүүлэх урсгал
- afu_probe() afu_dev_init()
- fpga_afu бүтцийг эхлүүлж, feature_platform_data.private талбарт хадгална.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Бүрэлдэхүүнтэй функц бүрийн функцийн_опсуудыг Feature_platform_data.features-д хадгална уу.
- Хэрэв байгаа бол тестийн функцийг бүтцээс дуудна уу.
- Бүтцээс init функцийг дуудна.
- afu_probe() fpga_register_dev_ops()
- Бүтэц бүртгүүлж Порт тэмдэгтийн төхөөрөмжийн зангилаа үүсгэнэ үү file_үйл ажиллагаа.
FME IOCTL
Нээлттэй үед дуудагдсан 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 туг; // in: 0 байх ёстой
__u32 порт_id; //-д: портын ID (0-ээс) гаргах.
};
FPGA_FME_PORT_ASSIGN—arg нь дараахыг заадаг:
struct fpga_fme_port_assign {
__u32 argsz; //-д: sizeof(struct fpga_fme_port_assign)
__u32 туг; // in: 0 байх ёстой
__u32 порт_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 туг; // in: 0 байх ёстой
__u32 порт_id; // дотор: портын ID (0-ээс)
__u32 буферийн хэмжээ; // in: битийн урсгалын буферийн хэмжээ. 4 байт байх ёстой
зэрэгцүүлсэн.
__u64 буферийн хаяг; // in: бит урсгалын буферийн процессын хаяг
__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(struct fpga_port_info)
__u32 туг; // гадагш: 0-г буцаана
__u32 бүс нутгийн тоо; // гарах: 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 дэвсгэр; // in: 0 байх ёстой
__u64 хэмжээ; // гадагш: байтаар MMIO бүсийн хэмжээ
__u64 офсет; // гарч: төхөөрөмжийн эхлэлээс MMIO бүсийн офсет fd
};
FPGA_PORT_DMA_MAP—arg нь дараахыг заадаг:
бүтэц fpga_port_dma_map {
__u32 argsz; // дотор: sizeof(struct fpga_port_dma_map)
__u32 туг; // in: 0 байх ёстой __u64 user_addr; // in: virtual process
хаяг. Хуудсыг зэрэгцүүлсэн байх ёстой.
__u64 урт; // in: байтаар дүрслэх урт. Олон хуудас байх ёстой
хэмжээ.
__u64 iova; // гарах: IO виртуал хаяг };
FPGA_PORT_DMA_UNMAP—arg нь дараахыг заадаг:
бүтэц fpga_port_dma_unmap {
__u32 argsz; // дотор: sizeof(struct fpga_port_dma_unmap)
__u32 туг; // in: 0 байх ёстой
__u64 iova; // in: Өмнөх хаягаар буцаасан IO виртуал хаяг
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg нь NULL байх ёстой.
- FPGA_PORT_UMSG_ENABLE—arg нь NULL байх ёстой.
- FPGA_PORT_UMSG_DISABLE—arg нь NULL байх ёстой.
FPGA_PORT_UMSG_SET_MODE—arg нь дараахыг заадаг:
бүтэц fpga_port_umsg_cfg {
__u32 argsz; // дотор: sizeof(struct fpga_port_umsg_cfg)
__u32 туг; // in: 0 байх ёстой
__u32 hint_bitmap; // in: 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 туг; // in: 0 байх ёстой
- u64 iova; // дотор: FPGA_PORT_DMA_MAP-с IO виртуал хаяг. };
Жич:
- Портын алдааг арилгахын тулд та одоогийн алдаануудын яг бит маскыг бичих хэрэгтэй, жишээ ньample, муурны алдаа > тодорхой
- UMsg нь зөвхөн нэгдсэн FPGA бүхий Intel Xeon процессорт зориулсан Acceleration Stack-ээр дэмжигддэг.
sysfs Files
FME Header sysfs 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 | аравтын инт | Зөвхөн унших боломжтой |
сокет_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 | дулааны.босго.tmp_thshold1 | аравтын инт | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
босго 2 | дулааны.босго.tmp_thshold2 | аравтын инт | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
босго_аялал | дулааны.босго.термийн_аялалын_босго | аравтын инт | Зөвхөн унших боломжтой |
босго 1_ хүрсэн | дулааны.босго.босго1_төлөв | аравтын инт | Зөвхөн унших боломжтой |
босго 2_ хүрсэн | дулааны.босго.босго2_төлөв | аравтын инт | Зөвхөн унших боломжтой |
босго1_бодлого | дулааны. босго.босго_бодлого | аравтын инт | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
температур | thermal.rdsensor_fm1.fpga_temp | аравтын инт | Зөвхөн унших боломжтой |
FME Эрчим хүчний удирдлагын систем files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio талбар | төрөл | хандалт |
хэрэглэсэн | эрчим хүч.status.pwr_хэрэглэсэн | hex uint64_t | Зөвхөн унших боломжтой |
босго 1 | хүч.босго.босго1 | hex uint64_t | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
босго 2 | хүч.босго.босго2 | hex uint64_t | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
босго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 талбар | төрөл | хандалт |
интерфейсийн_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_цаг | 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 | аравтын инт | Унших бичих |
уншсан_цохих | gperf.CACHE_RD_HIT | hex uint64_t | Зөвхөн унших боломжтой |
уншсан_алдсан | gperf.CACHE_RD_MISS | hex uint64_t | Зөвхөн унших боломжтой |
бичих_хит | 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 | Зөвхөн унших боломжтой |
өгөгдөл_бичих_портын зөрчилдөөн | 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 | аравтын инт | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
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.(идэвхжүүлсэн) | аравтын инт | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
хөлдөх | gperf.fab_ctl.freeze | аравтын инт | Хэрэглэгч: Зөвхөн унших боломжтой Root: Унших-бичих |
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_унших | 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_унших | 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 толгой sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio талбар | төрөл | хандалт |
afu_id | afu_header.guid | hex 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 | hex 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 төхөөрөмжийн драйверын архитектур, драйверын архитектур, архитектур |