اینتل لوگو

معماری درایور دستگاه لینوکس اینتل OPAE FPGA

Intel-OPAE-FPGA-Linux-Device-Driver-Architecture-product

OPAE Intel FPGA Linux Device Driver Architecture

درایور OPAE Intel FPGA رابط‌هایی را برای برنامه‌های کاربردی فضای کاربر برای پیکربندی، شمارش، باز کردن و دسترسی به شتاب‌دهنده‌های FPGA در پلتفرم‌های مجهز به راه‌حل‌های FPGA اینتل فراهم می‌کند و عملکردهای مدیریت سطح سیستم مانند پیکربندی مجدد FPGA، مدیریت توان و مجازی‌سازی را فعال می‌کند.

معماری سخت افزار

از نقطه نظر سیستم عامل view، سخت افزار FPGA به عنوان یک دستگاه PCIe معمولی ظاهر می شود. حافظه دستگاه FPGA با استفاده از یک ساختار داده از پیش تعریف شده (فهرست ویژگی های دستگاه) سازماندهی شده است. ویژگی های پشتیبانی شده توسط دستگاه FPGA از طریق این ساختارهای داده، همانطور که در شکل زیر نشان داده شده است:

دستگاه FPGA PCIe

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

درایور از PCIe SR-IOV برای ایجاد توابع مجازی (VF) پشتیبانی می‌کند که می‌تواند برای تخصیص شتاب‌دهنده‌های فردی به ماشین‌های مجازی استفاده شود.

شرکت اینتل تمامی حقوق محفوظ است. اینتل، لوگوی اینتل و سایر علائم اینتل علائم تجاری Intel Corporation یا شرکت های تابعه آن هستند. اینتل عملکرد FPGA و محصولات نیمه هادی خود را با مشخصات فعلی مطابق با ضمانت استاندارد اینتل تضمین می کند، اما این حق را برای خود محفوظ می دارد که در هر زمان و بدون اطلاع قبلی، هر محصول و خدماتی را تغییر دهد. اینتل هیچ مسئولیت یا مسئولیتی را که ناشی از کاربرد یا استفاده از هر گونه اطلاعات، محصول یا خدماتی است که در اینجا توضیح داده شده است، ندارد، مگر اینکه صراحتاً توسط اینتل به صورت کتبی با آن موافقت شده باشد. به مشتریان اینتل توصیه می شود قبل از تکیه بر اطلاعات منتشر شده و قبل از سفارش محصولات یا خدمات، آخرین نسخه مشخصات دستگاه را دریافت کنند.

نام ها و مارک های دیگر ممکن است به عنوان دارایی دیگران ادعا شود.

دستگاه مجازی FPGA PCIe

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

موتور مدیریت 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 دسترسی دارد، از جمله برنامه هایی که در یک میزبان مجازی اجرا می شوند، باید قبل از تلاش برای پیکربندی مجدد جزئی بسته شوند. مراحل این خواهد بود:

  1. راننده را از مهمان خارج کنید
  2. VF را از مهمان جدا کنید
  3. SR-IOV را غیرفعال کنید
  4. پیکربندی مجدد جزئی را انجام دهید
  5. SR-IOV را فعال کنید
  6. VF را به مهمان وصل کنید
  7. راننده را در مهمان بار کنید

مجازی سازی FPGA
برای فعال کردن دسترسی به یک شتاب دهنده از برنامه های در حال اجرا در VM، پورت AFU مربوطه باید با استفاده از مراحل زیر به VF اختصاص داده شود:

  1. PF به طور پیش فرض مالک تمام پورت های AFU است. هر پورتی که نیاز به تخصیص مجدد به VF دارد باید ابتدا از طریق FPGA_FME_PORT_RELEASE ioctl در دستگاه FME از PF آزاد شود.
  2. هنگامی که N پورت از PF آزاد شد، دستور زیر را می توان برای فعال کردن SRIOV و VF استفاده کرد. هر VF تنها دارای یک پورت با AFU است. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. از VF ها به VM ها عبور کنید.
  4. AFU تحت VF از برنامه های کاربردی در VM قابل دسترسی است (با استفاده از همان درایور داخل VF).

توجه:
یک FME را نمی توان به VF اختصاص داد، بنابراین PR و سایر عملکردهای مدیریتی فقط از طریق PF در دسترس هستند.

سازمان رانندگان

درایور دستگاه ماژول PCIe

سازمان رانندگان

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

دستگاه های 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 است.
  • 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

جریان اولیه سازی FMEintel-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_عملیات

راه اندازی دستگاه پلت فرم پورت
این بخش یک 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;
};

جریان راه اندازی دستگاه پلت فرم پورت

جریان راه اندازی پورت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()
    • با ثبت یک ساختار، گره دستگاه کاراکتر 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

مراجع

نظر بدهید

آدرس ایمیل شما منتشر نخواهد شد. فیلدهای الزامی مشخص شده اند *