هندسة برامج تشغيل جهاز intel OPAE FPGA Linux
هندسة برنامج تشغيل جهاز OPAE Intel FPGA Linux
يوفر برنامج تشغيل OPAE Intel FPGA واجهات لتطبيقات مساحة المستخدم لتكوين وترقيم وفتح والوصول إلى مسرعات FPGA على المنصات المجهزة بحلول Intel FPGA وتمكين وظائف الإدارة على مستوى النظام مثل إعادة تكوين FPGA وإدارة الطاقة والافتراض.
هندسة الأجهزة
من وجهة نظر نظام التشغيل viewتظهر أجهزة FPGA كجهاز PCIe عادي. يتم تنظيم ذاكرة جهاز FPGA باستخدام بنية بيانات محددة مسبقًا (قائمة ميزات الجهاز). يتم عرض الميزات التي يدعمها جهاز FPGA من خلال هياكل البيانات هذه، كما هو موضح أدناه في الشكل التالي:
جهاز FPGA PCIe
يدعم برنامج التشغيل PCIe SR-IOV لإنشاء وظائف افتراضية (VFs) يمكن استخدامها لتعيين مسرعات فردية للآلات الافتراضية.
شركة إنتل. كل الحقوق محفوظة. تعد Intel وشعار Intel وعلامات Intel الأخرى علامات تجارية لشركة Intel Corporation أو الشركات التابعة لها. تضمن Intel أداء منتجات FPGA وأشباه الموصلات وفقًا للمواصفات الحالية وفقًا للضمان القياسي لشركة Intel ولكنها تحتفظ بالحق في إجراء تغييرات على أي منتجات وخدمات في أي وقت دون إشعار. لا تتحمل Intel أي مسؤولية أو التزام ناشئ عن التطبيق أو استخدام أي معلومات أو منتج أو خدمة موصوفة هنا باستثناء ما تم الاتفاق عليه صراحةً كتابةً من قبل Intel. يُنصح عملاء Intel بالحصول على أحدث إصدار من مواصفات الجهاز قبل الاعتماد على أي معلومات منشورة وقبل تقديم طلبات المنتجات أو الخدمات.
يمكن المطالبة بأسماء وعلامات تجارية أخرى باعتبارها ملكًا للآخرين.
جهاز FPGA PCIe افتراضي
محرك إدارة FPGA (FME)
يقوم محرك إدارة FPGA بإدارة الطاقة والحرارة، وإعداد تقارير الأخطاء، وإعادة التكوين، وإعداد تقارير الأداء، وغير ذلك من وظائف البنية الأساسية. يحتوي كل FPGA على FME واحد، والذي يتم الوصول إليه دائمًا من خلال الوظيفة المادية (PF). يمكن لتطبيقات مساحة المستخدم الحصول على وصول حصري إلى FME باستخدام open()، وإطلاقه باستخدام close() كمستخدم مميز (جذر).
ميناء
يمثل المنفذ الواجهة بين بنية FPGA الثابتة ("مدير واجهة FPGA (FIM)) ومنطقة قابلة لإعادة التكوين جزئيًا تحتوي على وظيفة تسريع (AF). يتحكم المنفذ في الاتصال من البرنامج إلى المسرع ويعرض ميزات مثل إعادة الضبط والتصحيح. قد يحتوي جهاز PCIe على عدة منافذ، ويمكن عرض كل منفذ من خلال VF عن طريق تعيينه باستخدام ioctl FPGA_FME_PORT_ASSIGN على جهاز FME.
وحدة وظيفة التسريع (AF)
- وحدة وظيفة التسريع (AF) متصلة بمنفذ وتعرض منطقة MMIO 256K لاستخدامها في سجلات التحكم الخاصة بالتسريع.
- يمكن لتطبيقات مساحة المستخدم الحصول على وصول حصري إلى وحدة AFU المرفقة بمنفذ عن طريق استخدام open() على جهاز المنفذ، وإطلاقها باستخدام close().
- يمكن لتطبيقات مساحة المستخدم أيضًا تسريع مناطق MMIO باستخدام mmap().
إعادة التكوين الجزئي
كما ذكر أعلاه، يمكن إعادة تكوين المسرعات من خلال إعادة التكوين الجزئي لوظيفة المسرع (AF) fileيجب إنشاء وظيفة التسريع (AF) لـ FIM الدقيق والمنطقة الثابتة المستهدفة (المنفذ) لـ FPGA؛ وإلا، ستفشل عملية إعادة التكوين وربما تتسبب في عدم استقرار النظام. يمكن التحقق من هذا التوافق من خلال مقارنة معرف الواجهة الموضح في رأس AF بمعرف الواجهة المكشوف بواسطة FME من خلال sysfs. يتم إجراء هذا الفحص عادةً بواسطة مساحة المستخدم قبل استدعاء IOCTL لإعادة التكوين.
ملحوظة:
حاليًا، يجب إغلاق أي برنامج برمجي قادر على الوصول إلى FPGA، بما في ذلك البرامج التي تعمل في مضيف افتراضي، قبل محاولة إعادة التكوين الجزئي. ستكون الخطوات كما يلي:
- تفريغ السائق من الضيف
- افصل جهاز VF عن جهاز الضيف
- تعطيل SR-IOV
- إجراء إعادة تكوين جزئية
- تمكين SR-IOV
- قم بتوصيل جهاز VF بجهاز الضيف
- تحميل السائق في الضيف
المحاكاة الافتراضية لـ FPGA
لتمكين الوصول إلى مسرع من التطبيقات التي تعمل في جهاز افتراضي، يجب تعيين منفذ AFU الخاص بـ VM إلى VM باستخدام الخطوات التالية:
- يمتلك PF جميع منافذ AFU بشكل افتراضي. يجب أولاً تحرير أي منفذ يحتاج إلى إعادة تعيينه إلى VF من PF من خلال FPGA_FME_PORT_RELEASE ioctl على جهاز FME.
- بمجرد تحرير N منفذ من PF، يمكن استخدام الأمر أدناه لتمكين SRIOV وVFs. يمتلك كل VF منفذًا واحدًا فقط مع AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
- المرور عبر VFs إلى VMs.
- يمكن الوصول إلى وحدة AFU ضمن VF من التطبيقات الموجودة في VM (باستخدام نفس برنامج التشغيل داخل VF).
ملحوظة:
لا يمكن تعيين FME إلى VF، وبالتالي فإن وظائف العلاقات العامة والإدارة الأخرى متاحة فقط من خلال PF.
منظمة السائقين
برنامج تشغيل جهاز وحدة PCIe
منظمة السائقين
تظهر أجهزة FPGA كأجهزة PCIe عادية؛ وبالتالي، يتم تحميل برنامج تشغيل جهاز FPGA PCIe (intel-FPGA-PCI.ko) دائمًا أولًا بمجرد اكتشاف FPGA PCIe PF أو VF. يلعب برنامج التشغيل هذا دورًا أساسيًا في بنية برنامج التشغيل. فهو:
- يقوم بإنشاء جهاز حاوية FPGA كجهاز أساسي لأجهزة الميزات.
- يتجول عبر قائمة ميزات الجهاز، والتي يتم تنفيذها في ذاكرة BAR لجهاز PCIe، لاكتشاف أجهزة الميزات وميزاتها الفرعية وإنشاء أجهزة منصة لها ضمن جهاز الحاوية.
- يدعم SR-IOV.
- يقدم البنية الأساسية لجهاز الميزة، والتي تلخص العمليات للميزات الفرعية وتعرض الوظائف المشتركة لبرامج تشغيل جهاز الميزة.
وظائف برنامج تشغيل جهاز وحدة PCIe
- يحتوي على اكتشاف PCIe، وتعداد الأجهزة، واكتشاف الميزات.
- إنشاء أدلة sysfs للجهاز الرئيسي، ومحرك إدارة FPGA (FME)، والمنفذ.
- ينشئ حالات برنامج تشغيل النظام الأساسي، مما يتسبب في قيام نواة Linux بتحميل برامج تشغيل وحدات النظام الأساسي الخاصة بها.
برنامج تشغيل جهاز وحدة منصة FME
- إدارة الطاقة والحرارة، وإعداد تقارير الأخطاء، وإعداد تقارير الأداء، ووظائف البنية الأساسية الأخرى. يمكنك الوصول إلى هذه الوظائف عبر واجهات sysfs التي يعرضها برنامج تشغيل FME.
- إعادة التكوين الجزئي. يسجل برنامج تشغيل FME مدير FPGA أثناء تهيئة ميزة فرعية PR؛ بمجرد استلامه ioctl FPGA_FME_PORT_PR منك، فإنه يستدعي وظيفة الواجهة المشتركة من FPGA Manager لإكمال إعادة التكوين الجزئي لتدفق البتات إلى المنفذ المحدد.
- إدارة المنافذ للمحاكاة الافتراضية. يقدم برنامج تشغيل FME اثنين من ioctls، FPGA_FME_PORT_RELEASE، الذي يحرر المنفذ المحدد من PF؛ وFPGA_FME_PORT_ASSIGN، الذي يعين المنفذ مرة أخرى إلى PF. بمجرد تحرير المنفذ من PF، يمكن تعيينه إلى VF من خلال واجهات SR-IOV التي يوفرها برنامج تشغيل PCIe. لمزيد من المعلومات، راجع "محاكاة FPGA الافتراضية".
وظائف برنامج تشغيل جهاز وحدة منصة FME
- ينشئ عقدة جهاز أحرف FME.
- إنشاء FME sysfs files وينفذ FME sysfs file الملحقات.
- تنفيذ برامج التشغيل الفرعية للميزة الخاصة FME.
- برامج التشغيل الفرعية للميزة الخاصة لـ FME:
- رأس الصفحة FME
- الإدارة الحرارية
- إدارة الطاقة
- خطأ عالمي
- إعادة التكوين الجزئي
- الأداء العالمي
برنامج تشغيل جهاز وحدة منصة المنفذ
على غرار برنامج تشغيل FME، يتم فحص برنامج تشغيل FPGA Port (وAFU) (intel-fpga-afu.ko) بمجرد إنشاء جهاز منصة Port. الوظيفة الرئيسية لهذه الوحدة هي توفير واجهة لتطبيقات مساحة المستخدم للوصول إلى المسرعات الفردية، بما في ذلك التحكم الأساسي في إعادة الضبط على Port، وتصدير منطقة AFU MMIO، وخدمة تعيين مخزن DMA، وإشعار UMsg(1)، ووظائف التصحيح عن بعد (انظر أعلاه).
يتم دعم UMsg فقط من خلال Acceleration Stack لمعالج Intel Xeon® مع FPGA المتكامل.
وظائف برنامج تشغيل جهاز وحدة منصة المنفذ
- ينشئ عقدة جهاز حرف المنفذ.
- إنشاء المنفذ sysfs files وينفذ منفذ sysfs file الملحقات.
- تنفيذ برامج التشغيل الفرعية لميزة المنفذ الخاص.
- برامج تشغيل فرعية لميزات المنفذ الخاصة:
- رأس المنفذ
- أفو
- خطأ المنفذ
- UMsg(2)
- إشارة النقر
تطبيق عد أجهزة FPGA
يقدم هذا القسم مقدمة حول كيفية قيام التطبيقات بإحصاء جهاز FPGA من التسلسل الهرمي sysfs ضمن /sys/class/fpga. في المثال السابق،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. يتم تسليط الضوء على هياكل البيانات والوظائف الرئيسية. من الأفضل اتباع هذا القسم عند viewباستخدام الكود المصدر المصاحب (pcie.c).
هياكل بيانات التعداد
عد fpga_id_type {
معرف الوالد،
معرف FME_،
معرف المنفذ،
معرف FPGA_MAX
};
هيكل ثابت معرف fpga_ids[FPGA_ID_MAX]؛
هيكل fpga_chardev_info {
اسم الحرف * ؛
ديف_ت ديف؛
};
هيكل fpga_chardev_info fpga_chrdevs[] = {
{ .الاسم = FPGA_FEATURE_DEV_FME },
{ .الاسم = منفذ تطوير ميزة FPGA }،
};
فئة البنية الثابتة *fpga_class؛
بنية ثابتة pci_device_id cci_pcie_id_tbl[] = {
{جهاز PCI(معرف مورد PCI_INTEL، معرف جهاز PCIe_RCiEP0_MCP)،},
{جهاز PCI(معرف مورد PCI_INTEL، معرف جهاز PCIe_VF_MCP)،},
{جهاز PCI(معرف مورد PCI_INTEL، معرف جهاز PCIe_RCiEP0_SKX_P)،},
{جهاز PCI(معرف مورد PCI_INTEL، معرف جهاز PCIe_VF_SKX_P)،},
{جهاز PCI(معرف مورد PCI_INTEL، معرف جهاز PCIe_RCiEP0_DCP)،},
{جهاز PCI(معرف مورد PCI_INTEL، معرف جهاز PCIe_VF_DCP)،},
{0}
};
هيكل ثابت pci_driver cci_pci_driver = {
.الاسم = DRV_NAME،
.id_table = cci_pcie_id_tbl،
.المسبار = cci_pci_probe،
.إزالة = cci_pci_إزالة،
.sriov_configure = cci_pci_sriov_configure
};
هيكل cci_drvdata {
معرف الجهاز int؛
هيكل الجهاز *fme_dev؛
قفل المزامنة الهيكلية؛
هيكل list_head port_dev_list؛
int released_port_num؛
مناطق هيكل قائمة الرأس؛
};
بنية build_feature_devs_info {
هيكل pci_dev *pdev؛
باطل __iomem *ioaddr؛
باطل __iomem *ioend؛
int شريط الحالي؛
باطل __iomem *pfme_hdr؛
هيكل الجهاز *parent_dev؛
هيكل platform_device *feature_dev؛
};
تدفق التعداد
- ccidrv_init()
- قم بتهيئة fpga_ids باستخدام idr_init().
- قم بتهيئة fpga_chrdevs[i].devt باستخدام alloc_chrdev_region().
- قم بتهيئة fpga_class باستخدام class_create().
- برنامج تشغيل سجل pci(&cci_pci_driver);
- مسبار cci_pci()
- تمكين جهاز PCI، وطلب الوصول إلى مناطقه، وتعيين وضع PCI الرئيسي، وتكوين DMA.
- cci_pci_create_feature_devs() إنشاء معلومات التخصيص والتهيئة الأولية()
- تخصيص هيكل build_feature_devs_info، ثم قم بتهيئته.
تم تعيين .parent_dev إلى دليل sysfs الرئيسي (intel-fpga-dev.id) الذي يحتوي على أدلة sysfs FME وPort.
- تخصيص هيكل build_feature_devs_info، ثم قم بتهيئته.
- تحليل قائمة الميزات
- قم بالتجول في قائمة ميزات جهاز BAR0 لاكتشاف FME والمنفذ وميزاتهما الخاصة.
- تحليل الميزة() تحليل الميزة_afus() تحليل الميزة_fme()
- عند مواجهة FME:
- معلومات البناء_إنشاء_التطوير()
- تخصيص جهاز منصة لـ 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
- إنشاء_ميزة_مثيل() إنشاء_معلومات_إضافة_ميزة_فرعية()
- قم بتهيئة feature_dev.resource[FME_FEATURE_ID_HEADER].
- إضافة بيانات المنصة المميزة
- قم بتهيئة feature_platform_data.features[FME_FEATURE_ID_HEADER]، كل شيء ما عدا .fops.
- تحليل الميزة() تحليل الميزة() تحليل الميزة() تحليل الميزة()
- عند مواجهة منفذ:
- معلومات البناء_إنشاء_التطوير()
- تخصيص جهاز منصة للمنفذ، وتخزينه في 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
- بناء_معلومات_الالتزام_التطوير()
- أضف بنية feature_platform_data.node للمنفذ إلى قائمة المنافذ في بنية cci_drvdata.port_dev_list
- إنشاء_ميزة_مثيل() إنشاء_معلومات_إضافة_ميزة_فرعية()
- قم بتهيئة feature_dev.resource[PORT_FEATURE_ID_HEADER].
- إضافة بيانات المنصة المميزة
- قم بتهيئة feature_platform_data.features[PORT_FEATURE_ID_HEADER]، كل شيء ما عدا .fops.
- تحليل الميزة() تحليل الميزة() تحليل الميزة() تحليل الميزة()
- عند مواجهة AFU:
- إنشاء_ميزة_مثيل() إنشاء_معلومات_إضافة_ميزة_فرعية()
- قم بتهيئة feature_dev.resource[PORT_FEATURE_ID_UAFU].
- إضافة بيانات المنصة المميزة
- قم بتهيئة feature_platform_data.features[PORT_FEATURE_ID_UAFU]، كل شيء ما عدا .fops.
- تحليل الميزة() تحليل الميزة الخاصة() تحليل الميزة الخاصة fme()
- عند مواجهة ميزة خاصة لـ FME:
- إنشاء_ميزة_مثيل() إنشاء_معلومات_إضافة_ميزة_فرعية()
- قم بتهيئة feature_dev.resource[id].
- إضافة بيانات المنصة المميزة
- قم بتهيئة feature_platform_data.features[id]، كل شيء ما عدا .fops.
- تحليل الميزة() تحليل الميزة الخاصة() تحليل الميزة الخاصة()
- عند مواجهة ميزة خاصة بالمنفذ: * create_feature_instance() build_info_add_sub_feature() * تهيئة feature_dev.resource[id]. * feature_platform_data_add() تهيئة feature_platform_data.features[id]، كل شيء ما عدا .fops.
- تحليل المنافذ من fme()
- إذا تم تحميل برنامج التشغيل على الوظيفة المادية (PF)، فعندئذٍ:
- قم بتشغيل تدفق parse_feature_list() على كل منفذ موصوف في رأس FME.
- استخدم BAR المذكور في كل إدخال منفذ في العنوان.
تهيئة جهاز منصة FME
هذا القسم يعطي أكثرview من تدفق التعليمات البرمجية لتهيئة جهاز FME الذي تم إجراؤه بواسطة intel-fpga-fme. تم تسليط الضوء على هياكل البيانات والوظائف الرئيسية. من الأفضل اتباع هذا القسم عند viewباستخدام الكود المصدر المصاحب (fme-main.c).
هياكل بيانات أجهزة منصة FME
هيكل feature_ops {
int (*init)(هيكل جهاز المنصة *pdev، هيكل الميزة *الميزة)؛
int (*uinit)(هيكل جهاز المنصة *pdev، هيكل الميزة *الميزة)؛
طويل (*ioctl)(هيكل platform_device *pdev، هيكل feature *feature،
int غير موقّع cmd، وسيطة طويلة غير موقّعة)؛
int (*test)(هيكل platform_device *pdev، هيكل الميزة *الميزة)؛
};
ميزة الهيكل {
اسم الحرف * ؛
int resource_index؛
باطل __iomem *ioaddr؛
هيكل feature_ops *ops؛
};
بنية بيانات منصة الميزة {
عقدة هيكل قائمة الرأس؛
قفل المزامنة الهيكلية؛
حالة dev_status طويلة غير موقعة؛
هيكل cdev cdev؛
هيكل platform_device *dev؛
int غير موقّع disabled_count؛
باطل * خاص؛
رقم int؛
int (*config_port)(هيكل جهاز المنصة *، u32، bool)؛
هيكل جهاز المنصة *(*fpga_for_each_port)(هيكل جهاز المنصة *,
void *, int (*match)(هيكل جهاز المنصة *, void *)); هيكل
ميزات الميزات[0]؛
};
هيكل perf_object {
معرف كثافة العمليات؛
مجموعة السمات الثابتة **attr_groups؛
هيكل الجهاز *fme_dev؛
عقدة هيكل قائمة الرأس؛
هيكل قائمة الأطفال head؛
هيكل kobject kobj؛
};
هيكل fpga_fme {
معرف منفذ u8؛
u64 خطأ؛
هيكل الجهاز *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_العمليات.
تهيئة جهاز منصة المنفذ
هذا القسم يعطي أكثرview من تدفق التعليمات البرمجية لتهيئة جهاز المنفذ الذي تم إجراؤه بواسطة intel-fpga-afu.ko. يتم تسليط الضوء على هياكل البيانات والوظائف الرئيسية. من الأفضل اتباع هذا القسم عند viewباستخدام الكود المصدر المصاحب (afu.c).
هياكل بيانات أجهزة منصة المنفذ
هيكل feature_ops {
int (*init)(هيكل جهاز المنصة *pdev، هيكل الميزة *الميزة)؛
int (*uinit)(هيكل جهاز المنصة *pdev، هيكل الميزة *الميزة)؛
طويل (*ioctl)(هيكل platform_device *pdev، هيكل feature *feature،
int غير موقّع cmd، وسيطة طويلة غير موقّعة)؛
int (*test)(هيكل platform_device *pdev، هيكل الميزة *الميزة)؛
};
ميزة الهيكل {
اسم الحرف * ؛
int resource_index؛
باطل __iomem *ioaddr؛
هيكل feature_ops *ops؛
};
بنية بيانات منصة الميزة {
عقدة هيكل قائمة الرأس؛
قفل المزامنة الهيكلية؛
حالة dev_status طويلة غير موقعة؛
هيكل cdev cdev؛
هيكل platform_device *dev؛
int غير موقّع disabled_count؛
باطل * خاص؛
رقم int؛
int (*config_port)(هيكل جهاز المنصة *، u32، bool)؛
هيكل جهاز المنصة *(*fpga_for_each_port)(هيكل جهاز المنصة *,
void *, int (*match)(هيكل جهاز المنصة *, void *));
بنية الميزة features[0];
};
هيكل fpga_afu_region {
مؤشر u32؛
أعلام u32؛
حجم u64؛
إزاحة u64؛
u64 فيزيا؛
عقدة هيكل قائمة الرأس؛
};
هيكل fpga_afu_dma_region {
u64 عنوان المستخدم؛
طول u64؛
u64 أيوفا؛
هيكل الصفحة **الصفحات؛
بنية rb_node العقدة؛
بولي في الاستخدام؛
};
هيكل fpga_afu {
u64 منطقة_الإزاحة الحالية؛
عدد المناطق؛
u8 عدد_umsgs؛
مناطق هيكل قائمة الرأس؛
هيكل 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_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 flags; // في: يجب أن يكون 0
__u32 port_id; // في: معرف المنفذ (من 0) للإصدار.
};
FPGA_FME_PORT_ASSIGN—arg هو مؤشر إلى:
هيكل fpga_fme_port_assign {
__u32 argsz; // في: sizeof(struct fpga_fme_port_assign)
__u32 flags; // في: يجب أن يكون 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 flags; // في: يجب أن يكون 0
__u32 port_id; // في: معرف المنفذ (من 0)
__u32 buffer_size; // in: حجم مخزن تدفق البتات بالبايتات. يجب أن يكون 4 بايتات
محاذاة.
__u64 buffer_address; // في: عنوان عملية المخزن المؤقت لتدفق البتات
__u64 status; // out: حالة الخطأ (قناع البت)
};
ميناء 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 flags; // out: يعود 0
__u32 num_regions; // out: عدد مناطق MMIO، 2 (1 لـ AFU و1 لـ
إس تي بي)
__u32 num_umsgs; // out: عدد وحدات ذاكرة الوصول العشوائي (UMsg) التي يدعمها الجهاز
};
FPGA_PORT_GET_REGION_INFO—arg هو مؤشر إلى:
هيكل fpga_port_region_info {
__u32 argsz; // في: sizeof(struct fpga_port_region_info)
__u32 flags; // out: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
منطقة FPGA_MMAP
__u32 index; // في: FPGA_PORT_INDEX_UAFU أو FPGA_PORT_INDEX_STP
__u32 padding; // in: يجب أن يكون 0
__u64 size; // out: حجم منطقة MMIO بالبايتات
__u64 offset; // out: إزاحة منطقة MMIO من بداية تشغيل الجهاز
};
FPGA_PORT_DMA_MAP—arg هو مؤشر إلى:
هيكل fpga_port_dma_map {
__u32 argsz; // في: sizeof(struct fpga_port_dma_map)
__u32 flags; // in: يجب أن يكون 0 __u64 user_addr; // in: عملية افتراضية
العنوان. يجب أن يكون محاذيًا للصفحة.
__u64 length; // in: طول التعيين بالبايتات. يجب أن يكون مضاعفًا للصفحة
مقاس.
__u64 iova; // out: عنوان الإدخال/الإخراج الافتراضي };
FPGA_PORT_DMA_UNMAP—arg هو مؤشر إلى:
هيكل fpga_port_dma_unmap {
__u32 argsz; // في: sizeof(struct fpga_port_dma_unmap)
__u32 flags; // في: يجب أن يكون 0
__u64 iova; // في: عنوان IO الافتراضي الذي تم إرجاعه بواسطة عنوان IO السابق
خريطة منفذ FPGA_DMA;
- FPGA_PORT_RESET—يجب أن تكون الوسيطة NULL.
- FPGA_PORT_UMSG_ENABLE—يجب أن تكون arg فارغة.
- FPGA_PORT_UMSG_DISABLE—يجب أن تكون الوسائط فارغة.
FPGA_PORT_UMSG_SET_MODE—arg هو مؤشر إلى:
هيكل fpga_port_umsg_cfg {
__u32 argsz; // في: sizeof(struct fpga_port_umsg_cfg)
__u32 flags; // في: يجب أن يكون 0
__u32 hint_bitmap; // في: خريطة بتات وضع تلميح UMsg. تشير إلى UMsg's التي
مُمَكَّن.
};
عنوان قاعدة مجموعة منفذ FPGA_UMSG—
- يجب تعطيل 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؛ // في: يجب أن تكون 0
- u64 iova; // في: عنوان الإدخال/الإخراج الافتراضي من FPGA_PORT_DMA_MAP.
ملحوظة:
- لمسح أخطاء المنفذ، عليك كتابة قناع البت الدقيق للأخطاء الحالية، على سبيل المثالample, أخطاء القط > مسح
- يتم دعم UMsg فقط من خلال Acceleration Stack لمعالج Intel Xeon مع FPGA المتكامل.
نظام الملفات Files
رأس FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
نظام الملفات file | حقل الميمو | يكتب | وصول |
عدد المنافذ | رأس القدرة fme.num_ports | عدد عشري صحيح | للقراءة فقط |
حجم ذاكرة التخزين المؤقت | القدرة على تخزين البيانات في الرأس fme.حجم ذاكرة التخزين المؤقت | عدد عشري صحيح | للقراءة فقط |
إصدار | رأس fme.القدرة.النسيج_الحقيقي | عدد عشري صحيح | للقراءة فقط |
معرف المقبس | fme_header.capability.socket_id | عدد عشري صحيح | للقراءة فقط |
معرف تدفق البتات | fme_header.bitstream_id | سداسي عشري uint64_t | للقراءة فقط |
بيانات تعريفية لتدفق البتات | fme_header.bitstream_md | سداسي عشري uint64_t | للقراءة فقط |
أنظمة إدارة الحرارة FME files
برنامج intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
نظام الملفات file | حقل الميمو | يكتب | وصول |
العتبة 1 | عتبة حرارية.tmp_thshold1 | عدد عشري صحيح | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
العتبة 2 | عتبة حرارية.tmp_thshold2 | عدد عشري صحيح | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
عتبة_الرحلة | عتبة حرارية.therm_trip_thshold | عدد عشري صحيح | للقراءة فقط |
تم الوصول إلى العتبة 1 | العتبة الحرارية.thshold.thshold1_status | عدد عشري صحيح | للقراءة فقط |
تم الوصول إلى العتبة 2 | العتبة الحرارية.thshold.thshold2_status | عدد عشري صحيح | للقراءة فقط |
عتبة 1_سياسة | حراري. عتبة. سياسة الاحتفاظ | عدد عشري صحيح | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
درجة حرارة | الحرارية.rdsensor_fm1.fpga_temp | عدد عشري صحيح | للقراءة فقط |
إدارة الطاقة FME sysfs files
برنامج intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
نظام الملفات file | حقل الميمو | يكتب | وصول |
مستهلك | حالة الطاقة المستهلكة | سداسي عشري uint64_t | للقراءة فقط |
العتبة 1 | قوة.عتبة.عتبة1 | سداسي عشري uint64_t | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
العتبة 2 | قوة.عتبة.عتبة2 | سداسي عشري uint64_t | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
العتبة 1_الحالة | القدرة.العتبة.العتبة1_الحالة | عدد عشري غير موقّع | للقراءة فقط |
العتبة 2_الحالة | القدرة.العتبة.العتبة2_الحالة | عدد عشري غير موقّع | للقراءة فقط |
ار تي ال | تقرير حالة الطاقة fpga | عدد عشري غير موقّع | للقراءة فقط |
خطأ FME العالمي في sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/الأخطاء/
نظام الملفات file | حقل الميمو | يكتب | وصول |
أخطاء pcie0 | خطأ.pcie0_err | سداسي عشري uint64_t | قراءة و كتابة |
أخطاء pcie1 | خطأ.pcie1_err | سداسي عشري uint64_t | قراءة و كتابة |
حقن_خطأ | خطأ.راس_خطأ_في_الجن | سداسي عشري uint64_t | قراءة و كتابة |
intel-fpga-dev.i/intel-fpga-fme.j/أخطاء/fme-errors/
نظام الملفات file | حقل الميمو | يكتب | وصول |
أخطاء | خطأ gerror.fme_err | سداسي عشري uint64_t | للقراءة فقط |
الخطأ الأول | gerror.fme_first_err.err_reg_status | سداسي عشري uint64_t | للقراءة فقط |
الخطأ التالي | gerror.fme_next_err.err_reg_status | سداسي عشري uint64_t | للقراءة فقط |
واضح | مسح الأخطاء، الخطأ الأول، الخطأ التالي | uint64_t مختلفة | اكتب فقط |
ملحوظة:
لمسح أخطاء FME، يجب عليك كتابة قناع البت الدقيق للأخطاء الحالية، على سبيل المثالampأخطاء القط > واضح.
إعادة تكوين FME الجزئية sysfs files
برنامج intel-fpga-dev.i/intel-fpga-fme.j/pr/
نظام الملفات file | حقل الميمو | يكتب | وصول |
معرف الواجهة | pr.fme_pr_intfc_id0_h، pr.fme_pre_intfc_id0_l | سداسي عشري 16 بايت | للقراءة فقط |
نظام الأداء العالمي FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
نظام الملفات file | حقل الميمو | يكتب | وصول |
ساعة | gperf.clk.afu_interf_clock | سداسي عشري uint64_t | للقراءة فقط |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (غير صالح لمجموعة تسريع معالجات Intel Xeon مع وحدات FPGA)
نظام الملفات file | حقل الميمو | يكتب | وصول |
تجميد | gperf.ch_ctl.تجميد | عدد عشري صحيح | قراءة و كتابة |
اقرأ_اضرب | gperf.CACHE_RD_HIT | سداسي عشري uint64_t | للقراءة فقط |
قراءة_مفقودة | gperf.CACHE_RD_MISS | سداسي عشري uint64_t | للقراءة فقط |
اكتب_ضرب | gperf.CACHE_WR_HIT | سداسي عشري uint64_t | للقراءة فقط |
كتابة_مفقودة | gperf.CACHE_WR_MISS | سداسي عشري uint64_t | للقراءة فقط |
طلب_الاحتفاظ | gperf.CACHE_HOLD_REQ | سداسي عشري uint64_t | للقراءة فقط |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | سداسي عشري uint64_t | للقراءة فقط |
نظام الملفات file | حقل الميمو | يكتب | وصول |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | سداسي عشري uint64_t | للقراءة فقط |
نزاع منفذ كتابة البيانات | gperf.CACHE_DATA_WR_PORT_CONTEN | سداسي عشري uint64_t | للقراءة فقط |
tag_كتابة_المنافذ_المتنازع عليها | gperf.CACHE_TAG_WR_PORT_CONTEN | سداسي عشري uint64_t | للقراءة فقط |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (غير صالح لمجموعة تسريع معالجات Intel Xeon مع وحدات FPGA)
نظام الملفات file | حقل الميمو | يكتب | وصول |
تجميد | gperf.vtd_ctl.تجميد | عدد عشري صحيح | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (غير صالح لمجموعة تسريع معالجات Intel Xeon مع وحدات FPGA)
نظام الملفات file | حقل الميمو | يكتب | وصول |
قراءة المعاملة | gperf.VTD_AFU0_MEM_RD_TRANS | سداسي عشري uint64_t | للقراءة فقط |
كتابة المعاملة | gperf.VTD_AFU0_MEM_WR_TRANS | سداسي عشري uint64_t | للقراءة فقط |
قراءة_الضربة | 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/
نظام الملفات file | حقل الميمو | يكتب | وصول |
يُمكَِن | gperf.fab_ctl.(ممكن) | عدد عشري صحيح | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
تجميد | gperf.fab_ctl.تجميد | عدد عشري صحيح | المستخدم: للقراءة فقط الجذر: للقراءة والكتابة |
pcie0_read | gperf.FAB_PCIE0_RD | سداسي عشري uint64_t | للقراءة فقط |
كتابة pcie0 | gperf.FAB_PCIE0_WR | سداسي عشري uint64_t | للقراءة فقط |
pcie1_read | gperf.FAB_PCIE1_RD | سداسي عشري uint64_t | للقراءة فقط |
كتابة pcie1 | gperf.FAB_PCIE1_WR | سداسي عشري uint64_t | للقراءة فقط |
أوبي_ريد | gperf.FAB_UPI_RD | سداسي عشري uint64_t | للقراءة فقط |
الكتابة عبر upi | gperf.FAB_UPI_WR | سداسي عشري uint64_t | للقراءة فقط |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
نظام الملفات file | حقل الميمو | يكتب | وصول |
pcie0_read | gperf.FAB_PCIE0_RD | سداسي عشري uint64_t | للقراءة فقط |
كتابة pcie0 | gperf.FAB_PCIE0_WR | سداسي عشري uint64_t | للقراءة فقط |
pcie1_read | gperf.FAB_PCIE1_RD | سداسي عشري uint64_t | للقراءة فقط |
كتابة pcie1 | gperf.FAB_PCIE1_WR | سداسي عشري uint64_t | للقراءة فقط |
أوبي_ريد | gperf.FAB_UPI_RD | سداسي عشري uint64_t | للقراءة فقط |
الكتابة عبر upi | gperf.FAB_UPI_WR | سداسي عشري uint64_t | للقراءة فقط |
رأس المنفذ sysfs files
برنامج intel-fpga-dev.i/intel-fpga-port.k/
نظام الملفات file | حقل الميمو | يكتب | وصول |
id | رأس المنفذ.القدرة.رقم المنفذ | عدد عشري صحيح | للقراءة فقط |
لتر | port_header.control.latency_tolerance | عدد عشري صحيح | للقراءة فقط |
رأس منفذ AFU sysfs files
برنامج intel-fpga-dev.i/intel-fpga-port.k/
نظام الملفات file | حقل الميمو | يكتب | وصول |
معرف afu_id | دليل رأس afu | سداسي عشري 16 بايت | للقراءة فقط |
خطأ المنفذ sysfs files
intel-fpga-dev.i/intel-fpga-port.k/الأخطاء/
نظام الملفات file | حقل الميمو | يكتب | وصول |
أخطاء | منفذ الخطأ | سداسي عشري uint64_t | للقراءة فقط |
الخطأ الأول | perror.port_الخطأ_الأول | سداسي عشري uint64_t | للقراءة فقط |
أول طلب مشوه | إرهاب.مُرَق | سداسي عشري 16 بايت | للقراءة فقط |
واضح | perror.(كل الأخطاء) | uint64_t مختلفة | اكتب فقط |
ملحوظة:
لمسح أخطاء المنفذ، يجب عليك كتابة قناع البت الدقيق للأخطاء الحالية، على سبيل المثالampأخطاء القط > واضح.
سجل المراجعة
نسخة الوثيقة | التغييرات |
2017.10.02 | الإصدار الأولي. |
دليل هندسة برامج تشغيل الأجهزة OPAE Intel FPGA Linux
المستندات / الموارد
![]() |
هندسة برامج تشغيل جهاز intel OPAE FPGA Linux [بي دي اف] دليل المستخدم هندسة برنامج تشغيل جهاز OPAE FPGA Linux، OPAE FPGA، هندسة برنامج تشغيل جهاز Linux، هندسة برنامج التشغيل، الهندسة |