معماری درایور دستگاه لینوکس اینتل OPAE FPGA
OPAE Intel FPGA Linux Device Driver Architecture
درایور OPAE Intel FPGA رابطهایی را برای برنامههای کاربردی فضای کاربر برای پیکربندی، شمارش، باز کردن و دسترسی به شتابدهندههای FPGA در پلتفرمهای مجهز به راهحلهای FPGA اینتل فراهم میکند و عملکردهای مدیریت سطح سیستم مانند پیکربندی مجدد FPGA، مدیریت توان و مجازیسازی را فعال میکند.
معماری سخت افزار
از نقطه نظر سیستم عامل view، سخت افزار FPGA به عنوان یک دستگاه PCIe معمولی ظاهر می شود. حافظه دستگاه FPGA با استفاده از یک ساختار داده از پیش تعریف شده (فهرست ویژگی های دستگاه) سازماندهی شده است. ویژگی های پشتیبانی شده توسط دستگاه FPGA از طریق این ساختارهای داده، همانطور که در شکل زیر نشان داده شده است:
دستگاه FPGA PCIe
درایور از PCIe SR-IOV برای ایجاد توابع مجازی (VF) پشتیبانی میکند که میتواند برای تخصیص شتابدهندههای فردی به ماشینهای مجازی استفاده شود.
شرکت اینتل تمامی حقوق محفوظ است. اینتل، لوگوی اینتل و سایر علائم اینتل علائم تجاری Intel Corporation یا شرکت های تابعه آن هستند. اینتل عملکرد FPGA و محصولات نیمه هادی خود را با مشخصات فعلی مطابق با ضمانت استاندارد اینتل تضمین می کند، اما این حق را برای خود محفوظ می دارد که در هر زمان و بدون اطلاع قبلی، هر محصول و خدماتی را تغییر دهد. اینتل هیچ مسئولیت یا مسئولیتی را که ناشی از کاربرد یا استفاده از هر گونه اطلاعات، محصول یا خدماتی است که در اینجا توضیح داده شده است، ندارد، مگر اینکه صراحتاً توسط اینتل به صورت کتبی با آن موافقت شده باشد. به مشتریان اینتل توصیه می شود قبل از تکیه بر اطلاعات منتشر شده و قبل از سفارش محصولات یا خدمات، آخرین نسخه مشخصات دستگاه را دریافت کنند.
نام ها و مارک های دیگر ممکن است به عنوان دارایی دیگران ادعا شود.
دستگاه مجازی FPGA PCIe
موتور مدیریت FPGA (FME)
موتور مدیریت FPGA مدیریت توان و حرارت، گزارش خطا، پیکربندی مجدد، گزارش عملکرد و سایر عملکردهای زیرساخت را انجام می دهد. هر FPGA یک FME دارد که همیشه از طریق عملکرد فیزیکی (PF) قابل دسترسی است. برنامه های کاربردی فضای کاربر می توانند با استفاده از open() دسترسی انحصاری به FME داشته باشند و آن را با استفاده از close() به عنوان یک کاربر ممتاز (root) آزاد کنند.
بندر
یک پورت رابط بین فابریک FPGA استاتیک ("مدیر رابط FPGA (FIM)") و یک منطقه تا حدی قابل تنظیم مجدد حاوی یک تابع شتاب دهنده (AF) را نشان می دهد. پورت ارتباط از نرمافزار به شتابدهنده را کنترل میکند و ویژگیهایی مانند تنظیم مجدد و اشکال زدایی را در معرض دید قرار میدهد. یک دستگاه PCIe ممکن است چندین پورت داشته باشد، و هر پورت را می توان از طریق یک VF با اختصاص دادن آن با استفاده از FPGA_FME_PORT_ASSIGN ioctl در دستگاه FME، در معرض دید قرار داد.
واحد عملکرد شتاب دهنده (AF).
- یک واحد عملکرد شتاب دهنده (AF) به یک پورت متصل است و یک ناحیه 256K MMIO را برای استفاده برای ثبت های کنترل ویژه شتاب دهنده در معرض دید قرار می دهد.
- برنامههای فضای کاربر میتوانند با استفاده از open() در دستگاه Port، دسترسی انحصاری به AFU متصل به پورت داشته باشند و با استفاده از close() آن را آزاد کنند.
- برنامه های کاربردی فضای کاربر همچنین می توانند ()mmap مناطق MMIO را شتاب دهند.
پیکربندی مجدد جزئی
همانطور که در بالا ذکر شد، شتاب دهنده ها را می توان از طریق پیکربندی مجدد جزئی یک عملکرد شتاب دهنده (AF) مجدداً پیکربندی کرد. file. تابع شتاب دهنده (AF) باید برای FIM دقیق و منطقه ثابت هدفمند (پورت) FPGA ایجاد شده باشد. در غیر این صورت، عملیات پیکربندی مجدد با شکست مواجه می شود و احتمالاً باعث بی ثباتی سیستم می شود. این سازگاری را می توان با مقایسه شناسه رابط ذکر شده در هدر AF با شناسه رابط که توسط FME از طریق sysfs در معرض دید قرار گرفته است بررسی کرد. این بررسی معمولاً قبل از فراخوانی پیکربندی مجدد IOCTL توسط فضای کاربر انجام می شود.
توجه:
در حال حاضر، هر برنامه نرم افزاری که به FPGA دسترسی دارد، از جمله برنامه هایی که در یک میزبان مجازی اجرا می شوند، باید قبل از تلاش برای پیکربندی مجدد جزئی بسته شوند. مراحل این خواهد بود:
- راننده را از مهمان خارج کنید
- VF را از مهمان جدا کنید
- SR-IOV را غیرفعال کنید
- پیکربندی مجدد جزئی را انجام دهید
- SR-IOV را فعال کنید
- VF را به مهمان وصل کنید
- راننده را در مهمان بار کنید
مجازی سازی FPGA
برای فعال کردن دسترسی به یک شتاب دهنده از برنامه های در حال اجرا در VM، پورت AFU مربوطه باید با استفاده از مراحل زیر به VF اختصاص داده شود:
- PF به طور پیش فرض مالک تمام پورت های AFU است. هر پورتی که نیاز به تخصیص مجدد به VF دارد باید ابتدا از طریق FPGA_FME_PORT_RELEASE ioctl در دستگاه FME از PF آزاد شود.
- هنگامی که N پورت از PF آزاد شد، دستور زیر را می توان برای فعال کردن SRIOV و VF استفاده کرد. هر VF تنها دارای یک پورت با AFU است. echo N > PCI_DEVICE_PATH/sriov_numvfs
- از VF ها به VM ها عبور کنید.
- AFU تحت VF از برنامه های کاربردی در VM قابل دسترسی است (با استفاده از همان درایور داخل VF).
توجه:
یک FME را نمی توان به VF اختصاص داد، بنابراین PR و سایر عملکردهای مدیریتی فقط از طریق PF در دسترس هستند.
سازمان رانندگان
درایور دستگاه ماژول PCIe
سازمان رانندگان
دستگاه های FPGA به عنوان دستگاه های PCIe معمولی ظاهر می شوند. بنابراین، درایور دستگاه FPGA PCIe (intel-FPGA-PCI.ko) همیشه زمانی که FPGA PCIe PF یا VF شناسایی شد، ابتدا بارگذاری می شود. این درایور نقش زیرساختی را در معماری راننده ایفا می کند. آی تی:
- یک دستگاه ظرف FPGA به عنوان والد دستگاه های ویژگی ایجاد می کند.
- در فهرست ویژگیهای دستگاه، که در حافظه BAR دستگاه PCIe پیادهسازی شده است، میرود تا دستگاههای ویژگی و ویژگیهای فرعی آنها را کشف کند و دستگاههای پلتفرمی را برای آنها در زیر دستگاه کانتینر ایجاد کند.
- از SR-IOV پشتیبانی می کند.
- زیرساخت دستگاه ویژگی را معرفی می کند که عملیات را برای ویژگی های فرعی خلاصه می کند و عملکردهای رایج را در معرض درایورهای دستگاه ویژگی قرار می دهد.
عملکردهای درایور دستگاه ماژول PCIe
- شامل کشف PCIe، شمارش دستگاه، و کشف ویژگی است.
- فهرست های sysfs را برای دستگاه والد، موتور مدیریت FPGA (FME) و پورت ایجاد می کند.
- نمونه های درایور پلتفرم را ایجاد می کند و باعث می شود که هسته لینوکس درایورهای ماژول پلتفرم مربوطه خود را بارگیری کند.
درایور دستگاه ماژول پلتفرم FME
- مدیریت برق و حرارت، گزارش خطا، گزارش عملکرد و سایر عملکردهای زیرساختی. شما می توانید از طریق رابط های sysfs که توسط درایور FME در معرض دید قرار می گیرند به این عملکردها دسترسی داشته باشید.
- پیکربندی مجدد جزئی درایور FME یک مدیر FPGA را در طول اولیه سازی ویژگی فرعی PR ثبت می کند. هنگامی که یک FPGA_FME_PORT_PR ioctl را از شما دریافت کرد، تابع رابط مشترک را از FPGA Manager فراخوانی می کند تا پیکربندی مجدد جزئی جریان بیت به پورت داده شده را تکمیل کند.
- مدیریت پورت برای مجازی سازی درایور FME دو ioctl را معرفی می کند، FPGA_FME_PORT_RELEASE، که پورت داده شده را از PF آزاد می کند. و FPGA_FME_PORT_ASSIGN، که پورت را به PF باز میگرداند. هنگامی که پورت از PF آزاد شد، می توان آن را از طریق رابط های SR-IOV ارائه شده توسط درایور PCIe به VF اختصاص داد. برای اطلاعات بیشتر، به "مجازی سازی FPGA" مراجعه کنید.
عملکردهای درایور دستگاه ماژول پلتفرم FME
- گره دستگاه کاراکتر FME را ایجاد می کند.
- FME sysfs را ایجاد می کند files و FME sysfs را پیاده سازی می کند file لوازم جانبی
- درایورهای فرعی ویژگی خصوصی FME را پیاده سازی می کند.
- درایورهای فرعی ویژگی های خصوصی FME:
- هدر FME
- مدیریت حرارتی
- مدیریت نیرو
- خطای جهانی
- پیکربندی مجدد جزئی
- عملکرد جهانی
درایور دستگاه ماژول پلت فرم پورت
مشابه درایور FME، درایور پورت FPGA (و AFU) (intel-fpga-afu. ko) پس از ایجاد دستگاه پلت فرم Port مورد بررسی قرار می گیرد. عملکرد اصلی این ماژول ارائه یک رابط برای برنامه های کاربردی فضای کاربر برای دسترسی به شتاب دهنده های فردی است، از جمله کنترل بازنشانی اولیه در پورت، صادرات منطقه AFU MMIO، سرویس نقشه برداری بافر DMA، اعلان UMsg(1) و عملکردهای اشکال زدایی از راه دور. بالا را ببین).
UMsg فقط از طریق Acceleration Stack برای پردازنده Intel Xeon® با FPGA یکپارچه پشتیبانی می شود.
عملکردهای درایور دستگاه ماژول پلت فرم پورت
- گره دستگاه کاراکتر Port را ایجاد می کند.
- پورت sysfs را ایجاد می کند files و Port sysfs را پیاده سازی می کند file لوازم جانبی
- درایورهای فرعی ویژگی Port private را پیاده سازی می کند.
- درایورهای فرعی ویژگی پورت خصوصی:
- سربرگ بندر
- AFU
- خطای پورت
- UMsg (2)
- سیگنال ضربه بزنید
برنامه FPGA Device Enumeration
این بخش نحوه شمارش دستگاه FPGA را از سلسله مراتب sysfs در زیر /sys/class/fpga معرفی می کند. در سابقampدر زیر، دو دستگاه 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
این بخش یک over می دهدview جریان کد برای شمارش دستگاه انجام شده توسط intel-fpga-pci.ko. ساختارهای داده و توابع اصلی برجسته شده اند. این بخش بهتر است زمانی دنبال شود viewکد منبع همراه (pcie.c) را دریافت کنید.
ساختارهای داده شمارش
enum fpga_id_type {
شناسه اصلی،
FME_ID،
PORT_ID،
FPGA_ID_MAX
};
ساختار ثابت idr fpga_ids[FPGA_ID_MAX];
ساختار fpga_chardev_info {
const char *name;
dev_t devt;
};
ساخت 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
};
ساختار cci_drvdata {
int device_id;
ساخت دستگاه *fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int release_port_num;
struct list_head مناطق;
};
ساختار build_feature_devs_info {
ساختار 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 روی یک فهرست والد sysfs (intel-fpga-dev.id) تنظیم شده است که شامل دایرکتوری های FME و Port sysfs است.
- یک ساختار build_feature_devs_info را اختصاص دهید، آن را مقداردهی اولیه کنید.
- parse_feature_list()
- برای کشف FME، پورت و ویژگیهای خصوصی آنها، فهرست ویژگیهای دستگاه BAR0 را دنبال کنید.
- parse_feature() parse_feature_afus() parse_feature_fme()
- هنگامی که با FME مواجه می شوید:
- build_info_create_dev()
- یک دستگاه پلت فرم برای FME اختصاص دهید که در build_feature_devs_info.feature_dev ذخیره شود.
- 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() * Initialize feature_dev.resource[id]. * feature_platform_data_add() شروع به کار feature_platform_data.features[id]، همه چیز به جز .fops.
- parse_ports_from_fme()
- اگر درایور بر روی عملکرد فیزیکی (PF) بارگذاری شود، سپس:
- جریان parse_feature_list() را روی هر پورت توضیح داده شده در هدر FME اجرا کنید.
- از BAR ذکر شده در هر ورودی پورت در هدر استفاده کنید.
راه اندازی دستگاه پلت فرم FME
این بخش یک over می دهدview جریان کد برای مقداردهی اولیه دستگاه FME توسط intel-fpga-fme.ko انجام شده است. ساختارهای داده و توابع اصلی برجسته شده اند. این بخش بهتر است زمانی دنبال شود viewکد منبع همراه (fme-main.c) را دریافت کنید.
ساختارهای داده دستگاه پلتفرم FME
ساختار feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
طولانی (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
ویژگی ساختار {
const char *name;
int resource_index;
void __iomem *ioaddr;
ساختار feature_ops *ops;
};
ساختار feature_platform_data {
struct list_head node;
struct mutex lock;
dev_status طولانی بدون امضا;
ساخت cdev cdev;
struct platform_device *dev;
int بدون امضا disable_count;
باطل *خصوصی;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); ساخت
ویژگی های ویژگی[0];
};
ساختار perf_object {
شناسه int
const struct attribute_group **attr_groups;
ساخت دستگاه *fme_dev;
struct list_head node;
struct list_head children;
struct kobject kobj;
};
ساخت fpga_fme {
u8 port_id;
u64 pr_err;
ساخت دستگاه *dev_err;
ساختار perf_object *perf_dev;
ساختار 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_عملیات
راه اندازی دستگاه پلت فرم پورت
این بخش یک over می دهدview جریان کد برای مقداردهی اولیه دستگاه پورت توسط intel-fpga-afu.ko انجام شده است. ساختارهای داده و توابع اصلی برجسته شده اند. این بخش بهتر است زمانی دنبال شود viewکد منبع همراه (afu.c) را بنویسید.
ساختارهای داده دستگاه پلت فرم پورت
ساختار feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
طولانی (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
ویژگی ساختار {
const char *name;
int resource_index;
void __iomem *ioaddr;
ساختار feature_ops *ops;
};
ساختار feature_platform_data {
struct list_head node;
struct mutex lock;
dev_status طولانی بدون امضا;
ساخت cdev cdev;
struct platform_device *dev;
int بدون امضا disable_count;
باطل *خصوصی;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
ویژگی های ویژگی ساختار[0];
};
ساختار fpga_afu_region {
شاخص u32;
پرچم های u32;
اندازه u64;
افست u64;
فیزیک u64;
struct list_head node;
};
ساخت fpga_afu_dma_region {
u64 user_addr;
طول u64;
u64 iova;
صفحه ساختار **صفحات;
ساخت گره rb_node;
bool in_use;
};
ساختار fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head مناطق;
struct rb_root dma_regions;
ساختار 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()
- با ثبت یک ساختار، گره دستگاه کاراکتر Port را ایجاد کنید 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 پرچم؛ // in: باید 0 باشد
__u32 port_id; // در: شناسه پورت (از 0) برای انتشار.
};
FPGA_FME_PORT_ASSIGN - arg یک اشاره گر به یک است:
ساخت fpga_fme_port_assign {
__u32 argsz; // در: sizeof (ساختار fpga_fme_port_assign)
__u32 پرچم؛ // in: باید 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 پرچم؛ // in: باید 0 باشد
__u32 port_id; // در: شناسه پورت (از 0)
__u32 بافر_اندازه؛ // در: اندازه بافر بیت استریم بر حسب بایت. باید 4 بایت باشد
تراز شده است.
__u64 buffer_address; // در: آدرس پردازش بافر بیت استریم
وضعیت __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 پرچم؛ // out: 0 را برمی گرداند
__u32 num_regions; // out: تعداد مناطق MMIO، 2 (1 برای AFU و 1 برای
STP)
__u32 num_umsgs; // out: تعداد 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 padding; // in: باید 0 باشد
اندازه __u64; // out: اندازه منطقه MMIO بر حسب بایت
__u64 افست؛ // out: افست ناحیه 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; // در: پردازش مجازی
نشانی. باید صفحه تراز شود.
__u64 طول; // در: طول نگاشت بر حسب بایت. باید مضرب صفحه باشد
اندازه
__u64 iova; // out: آدرس مجازی 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 - آرگها باید 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; // در: UMsg bitmap حالت اشاره. نشان می دهد که کدام UMsg هستند
فعال شد.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg باید قبل از صدور این ioctl غیرفعال شود.
- فیلد 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; // در: آدرس مجازی IO از FPGA_PORT_DMA_MAP. };
توجه:
- برای پاک کردن خطاهای پورت، باید بیت ماسک دقیق خطاهای فعلی را بنویسید.ampخطاهای گربه > روشن
- UMsg فقط از طریق Acceleration Stack برای پردازنده Intel Xeon با FPGA یکپارچه پشتیبانی می شود.
sysfs Files
FME هدر sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
ports_num | fme_header.capability.num_ports | اعشاری int | فقط خواندنی |
cache_size | fme_header.capability.cache_size | اعشاری int | فقط خواندنی |
نسخه | fme_header.capability.fabric_verid | اعشاری int | فقط خواندنی |
socket_id | fme_header.capability.socket_id | اعشاری int | فقط خواندنی |
bitstream_id | fme_header.bitstream_id | هگز uint64_t | فقط خواندنی |
bitstream_metadata | fme_header.bitstream_md | هگز uint64_t | فقط خواندنی |
سیستم مدیریت حرارتی FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
آستانه 1 | thermal.threshold.tmp_thshold1 | اعشاری int | کاربر: Root فقط خواندنی: Read-Write |
آستانه 2 | thermal.threshold.tmp_thshold2 | اعشاری int | کاربر: Root فقط خواندنی: Read-Write |
آستانه_سفر | thermal.threshold.therm_trip_thshold | اعشاری int | فقط خواندنی |
threshold1_reached | thermal.threshold.thshold1_status | اعشاری int | فقط خواندنی |
threshold2_reached | thermal.threshold.thshold2_status | اعشاری int | فقط خواندنی |
threshold1_policy | حرارتی thshold.thshold_policy | اعشاری int | کاربر: Root فقط خواندنی: Read-Write |
دما | thermal.rdsensor_fm1.fpga_temp | اعشاری int | فقط خواندنی |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
مصرف شده است | power.status.pwr_consumed | هگز uint64_t | فقط خواندنی |
آستانه 1 | قدرت.آستانه.آستانه1 | هگز uint64_t | کاربر: Root فقط خواندنی: Read-Write |
آستانه 2 | قدرت.آستانه.آستانه2 | هگز uint64_t | کاربر: Root فقط خواندنی: Read-Write |
threshold1_status | power.threshold.threshold1_status | اعشاری بدون علامت | فقط خواندنی |
threshold2_status | power.threshold.threshold2_status | اعشاری بدون علامت | فقط خواندنی |
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 | هگز uint64_t | خواندن – نوشتن |
pcie1_errors | gerror.pcie1_err | هگز uint64_t | خواندن – نوشتن |
inject_error | gerror.ras_error_inj | هگز uint64_t | خواندن – نوشتن |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
خطاها | gerror.fme_err | هگز uint64_t | فقط خواندنی |
first_error | gerror.fme_first_err.err_reg_status | هگز uint64_t | فقط خواندنی |
next_error | gerror.fme_next_err.err_reg_status | هگز uint64_t | فقط خواندنی |
روشن | خطاها، first_error، next_error را پاک می کند | uint64_t مختلف | فقط نوشتن |
توجه:
برای پاک کردن خطاهای FME، باید بیت ماسک دقیق خطاهای فعلی را بنویسید.ampخطاهای گربه > پاک کردن.
سیستم پیکربندی مجدد جزئی 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 | هگز 16 بایتی | فقط خواندنی |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
ساعت | gperf.clk.afu_interf_clock | هگز uint64_t | فقط خواندنی |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (برای پشته Acceleration برای CPU Intel Xeon با FPGA معتبر نیست)
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
منجمد کردن | gperf.ch_ctl.freeze | اعشاری int | خواندن – نوشتن |
read_hit | gperf.CACHE_RD_HIT | هگز uint64_t | فقط خواندنی |
read_miss | gperf.CACHE_RD_MISS | هگز uint64_t | فقط خواندنی |
write_hit | gperf.CACHE_WR_HIT | هگز uint64_t | فقط خواندنی |
write_miss | gperf.CACHE_WR_MISS | هگز uint64_t | فقط خواندنی |
hold_request | gperf.CACHE_HOLD_REQ | هگز uint64_t | فقط خواندنی |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | هگز uint64_t | فقط خواندنی |
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | هگز uint64_t | فقط خواندنی |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | هگز uint64_t | فقط خواندنی |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | هگز uint64_t | فقط خواندنی |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (برای پشته Acceleration برای CPU Intel Xeon با FPGA معتبر نیست)
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
منجمد کردن | gperf.vtd_ctl.freeze | اعشاری int | کاربر: Root فقط خواندنی: Read-Write |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (برای پشته Acceleration برای CPU Intel Xeon با FPGA معتبر نیست)
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
read_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | هگز uint64_t | فقط خواندنی |
نوشتن_تراکنش | gperf.VTD_AFU0_MEM_WR_TRANS | هگز uint64_t | فقط خواندنی |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | هگز uint64_t | فقط خواندنی |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | هگز uint64_t | فقط خواندنی |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
فعال کردن | gperf.fab_ctl.(فعال) | اعشاری int | کاربر: Root فقط خواندنی: Read-Write |
منجمد کردن | gperf.fab_ctl.freeze | اعشاری int | کاربر: Root فقط خواندنی: Read-Write |
pcie0_read | gperf.FAB_PCIE0_RD | هگز uint64_t | فقط خواندنی |
pcie0_write | gperf.FAB_PCIE0_WR | هگز uint64_t | فقط خواندنی |
pcie1_read | gperf.FAB_PCIE1_RD | هگز uint64_t | فقط خواندنی |
pcie1_write | gperf.FAB_PCIE1_WR | هگز uint64_t | فقط خواندنی |
upi_read | gperf.FAB_UPI_RD | هگز uint64_t | فقط خواندنی |
upi_write | gperf.FAB_UPI_WR | هگز uint64_t | فقط خواندنی |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
pcie0_read | gperf.FAB_PCIE0_RD | هگز uint64_t | فقط خواندنی |
pcie0_write | gperf.FAB_PCIE0_WR | هگز uint64_t | فقط خواندنی |
pcie1_read | gperf.FAB_PCIE1_RD | هگز uint64_t | فقط خواندنی |
pcie1_write | gperf.FAB_PCIE1_WR | هگز uint64_t | فقط خواندنی |
upi_read | gperf.FAB_UPI_RD | هگز uint64_t | فقط خواندنی |
upi_write | gperf.FAB_UPI_WR | هگز uint64_t | فقط خواندنی |
پورت هدر sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | میدان mmio | نوع | دسترسی داشته باشید |
id | port_header.capability.port_number | اعشاری int | فقط خواندنی |
لیتر | port_header.control.latency_tolerance | اعشاری int | فقط خواندنی |
پورت AFU هدر sysfs 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 | هگز uint64_t | فقط خواندنی |
first_error | perror.port_first_error | هگز uint64_t | فقط خواندنی |
first_malformed_req | وحشت.malreq | هگز 16 بایتی | فقط خواندنی |
روشن | خطا. (همه خطاها) | uint64_t مختلف | فقط نوشتن |
توجه:
برای پاک کردن خطاهای Port، باید بیت ماسک دقیق خطاهای فعلی را بنویسیدampخطاهای گربه > پاک کردن.
تاریخچه تجدید نظر
نسخه سند | تغییرات |
2017.10.02 | انتشار اولیه. |
راهنمای معماری OPAE Intel FPGA Linux Device Driver
اسناد / منابع
![]() |
معماری درایور دستگاه لینوکس اینتل OPAE FPGA [pdfراهنمای کاربر OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |