intel-logo

د انټیل OPAE FPGA لینکس وسیلې ډرایور آرکیټیکچر

intel-OPAE-FPGA-Linux-Divice-Driver-architecture-product

OPAE Intel FPGA لینکس وسیلې ډرایور آرکیټیکچر

د OPAE Intel FPGA ډرایور د انټیل FPGA حلونو سره مجهز پلیټ فارمونو کې د FPGA سرعت کونکي تنظیم کولو ، شمیرلو ، خلاصولو او لاسرسي لپاره د کارونکي ځای غوښتنلیکونو لپاره انٹرفیس چمتو کوي او د سیسټم کچې مدیریت دندې لکه د FPGA بیا تنظیم کول ، د بریښنا مدیریت ، او مجازی کول وړوي.

د هارډویر معمارۍ

د OS له نقطې څخه view، د FPGA هارډویر د منظم PCIe وسیلې په توګه ښکاري. د FPGA وسیلې حافظه د مخکې ټاکل شوي ډیټا جوړښت (د وسیلې فیچر لیست) په کارولو سره تنظیم شوې. د FPGA وسیلې لخوا ملاتړ شوي ځانګړتیاوې د دې ډیټا جوړښتونو له لارې څرګندیږي ، لکه څنګه چې لاندې په لاندې شکل کې ښودل شوي:

د FPGA PCIe وسیله

intel-OPAE-FPGA-Linux-Divice-Driver-architecture-fig- (1)

ډرایور د PCIe SR-IOV ملاتړ کوي ترڅو مجازی افعال (VFs) رامینځته کړي کوم چې د مجازی ماشینونو لپاره د انفرادي سرعت کونکي ټاکلو لپاره کارول کیدی شي.

Intel Corporation. ټول حقونه خوندي دي. Intel، د Intel لوگو، او د Intel نورې نښې د Intel Corporation یا د هغې د فرعي شرکتونو سوداګریزې نښې دي. انټیل د خپل FPGA او سیمیکمډکټر محصولاتو فعالیت د انټیل معیاري تضمین سره سم اوسني مشخصاتو ته تضمینوي مګر پرته له خبرتیا پرته هر وخت په هر محصول او خدماتو کې د بدلون کولو حق خوندي کوي. Intel هیڅ مسؤلیت یا مسؤلیت په غاړه نه اخلي چې د غوښتنلیک یا د کوم معلوماتو، محصول، یا خدماتو کارولو څخه رامینځته کیږي چې دلته تشریح شوي پرته له دې چې د Intel لخوا په لیکلي ډول موافقه شوې وي. د انټیل پیرودونکو ته مشوره ورکول کیږي چې د وسیلې ځانګړتیاو وروستۍ نسخه ترلاسه کړي مخکې لدې چې په کوم خپاره شوي معلوماتو تکیه وکړي او د محصولاتو یا خدماتو لپاره امر کولو دمخه.

نور نومونه او نښې ممکن د نورو ملکیت په توګه ادعا شي.

مجازی شوی FPGA PCIe وسیله

intel-OPAE-FPGA-Linux-Divice-Driver-architecture-fig- (2)

د FPGA مدیریت انجن (FME)
د FPGA مدیریت انجن د بریښنا او تودوخې مدیریت، د تېروتنې راپور ورکول، بیا تنظیم کول، د فعالیت راپور ورکول، او نور زیربنا دندې ترسره کوي. هر FPGA یو FME لري، کوم چې تل د فزیکي فعالیت (PF) له لارې لاسرسی کیږي. د کارونکي ځای غوښتنلیکونه کولی شي د خلاص () په کارولو سره FME ته ځانګړي لاسرسی ترلاسه کړي ، او د امتیاز لرونکي کارونکي (روټ) په توګه د نږدې () په کارولو سره خوشې کړي.

پورټ
پورټ د جامد FPGA پارچه (د "FPGA انٹرفیس مدیر (FIM)") او په جزوي ډول د تنظیم وړ سیمه چې د سرعت فعالیت (AF) لري د انٹرفیس استازیتوب کوي. پورټ د سافټویر څخه سرعت کونکي ته ارتباط کنټرولوي او ځانګړتیاوې افشا کوي لکه ریسیټ او ډیبګ. د PCIe وسیله ممکن څو بندرونه ولري، او هر پورټ د FME وسیله کې د FPGA_FME_PORT_ASSIGN ioctl په کارولو سره د VF له لارې افشا کیدی شي.

د سرعت فعالیت (AF) واحد

  • د سرعت فعالیت (AF) واحد د بندر سره وصل دی او د 256K MMIO سیمه افشا کوي ترڅو د سرعت ځانګړي کنټرول راجسټرونو لپاره وکارول شي.
  • د کارونکي ځای غوښتنلیکونه کولی شي د پورټ وسیلې کې د خلاص () په کارولو سره د بندر سره وصل شوي AFU ته ځانګړي لاسرسی ترلاسه کړي ، او د نږدې () په کارولو سره یې خوشې کړي.
  • د کارن ځای غوښتنلیکونه هم کولی شي mmap() سرعت کونکي MMIO سیمې.

جزوی بیا تنظیمول
لکه څنګه چې پورته یادونه وشوه، سرعت کونکي د سرعت فعالیت (AF) د جزوی بیا تنظیم کولو له لارې بیا تنظیم کیدی شي. file. د سرعت فعالیت (AF) باید د FPGA دقیق FIM او هدف شوي جامد سیمې (پورټ) لپاره رامینځته شوی وي؛ که نه نو، د بیا تنظیمولو عملیات به ناکام شي او ممکن د سیسټم د بې ثباتۍ لامل شي. دا مطابقت د AF سرلیک کې د یاد شوي انٹرفیس ID پرتله کولو سره چیک کیدی شي د sysfs له لارې د FME لخوا افشا شوي انٹرفیس ID سره. دا چک معمولا د کارونکي ځای لخوا ترسره کیږي مخکې لدې چې د بیا تنظیم کولو IOCTL ته زنګ ووهي.

یادونه:
اوس مهال، کوم سافټویر پروګرام چې FPGA ته لاسرسی لري، په شمول هغه چې په مجازی کوربه کې روان دي، باید د جزوی بیا تنظیم کولو هڅه کولو دمخه وتړل شي. ګامونه به دا وي:

  1. چلوونکی له میلمه څخه خلاص کړئ
  2. VF له میلمه څخه خلاص کړئ
  3. SR-IOV غیر فعال کړئ
  4. جزوي بیا تنظیم کول ترسره کړئ
  5. SR-IOV فعال کړئ
  6. VF میلمه ته ولګوه
  7. ډرایور په میلمستون کې پورته کړئ

د FPGA مجازی کول
په VM کې د چلولو غوښتنلیکونو څخه د سرعت کونکي لاسرسي وړولو لپاره ، د AFU اړوند بندر باید د لاندې مرحلو په کارولو سره VF ته ګمارل شي:

  1. PF د ډیفالټ له مخې د AFU ټول بندرونه لري. هر هغه پورټ چې اړتیا لري VF ته بیا واستول شي باید لومړی د PF څخه په FME وسیله کې د FPGA_FME_PORT_RELEASE ioctl له لارې خوشې شي.
  2. یوځل چې N بندرونه د PF څخه خوشې شي، لاندې کمانډ د SRIOV او VFs فعالولو لپاره کارول کیدی شي. هر VF د AFU سره یوازې یو بندر لري. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. د VFs له لارې VMs ته لاړشئ.
  4. د VF لاندې AFU په VM کې د غوښتنلیکونو څخه د لاسرسي وړ دی (د VF دننه ورته ډرایور کارول).

یادونه:
یو FME VF ته نشي ګمارل کیدی ، پدې توګه PR او نور مدیریت دندې یوازې د PF له لارې شتون لري.

د موټر چلوونکي سازمان

د PCIe ماډل وسیله ډرایور

د موټر چلوونکي سازمان

intel-OPAE-FPGA-Linux-Divice-Driver-architecture-fig- (3)

د FPGA وسایل د منظم PCIe وسیلو په توګه ښکاري؛ په دې توګه، د FPGA PCIe وسیلې ډرایور (intel-FPGA-PCI.ko) تل لومړی بار کیږي کله چې د FPGA PCIe PF یا VF کشف شي. دا ډرایور د موټر چلوونکي په جوړښت کې زیربنا رول لوبوي. دا:

  • د فیچر وسیلو د والدین په توګه د FPGA کانټینر وسیله رامینځته کوي.
  • د وسیلې فیچر لیست له لارې تیریږي ، کوم چې د PCIe وسیله بار حافظه کې پلي کیږي ، ترڅو د فیچر وسیلې او د دوی فرعي ب featuresې کشف کړي او د کانټینر وسیلې لاندې د دوی لپاره پلیټ فارم وسایل رامینځته کړي.
  • د SR-IOV ملاتړ کوي.
  • د فیچر وسیلې زیربنا معرفي کوي ، کوم چې د فرعي ځانګړتیاو لپاره عملیات خلاصوي او د وسیلې ډرایورانو ځانګړتیاو لپاره عام افعال افشا کوي.

د PCIe ماډل وسیلې ډرایور دندې

  • د PCIe کشف، د وسیلې شمیرل، او د ځانګړتیا موندنه لري.
  • د اصلي وسیلې ، FPGA مدیریت انجن (FME) او پورټ لپاره sysfs لارښودونه رامینځته کوي.
  • د پلیټ فارم ډرایور مثالونه رامینځته کوي ، د دې لامل کیږي چې د لینکس کرنل د دوی اړوند پلیټ فارم ماډل ډرایورونه بار کړي.

د FME پلیټ فارم ماډل وسیله ډرایور

  • د بریښنا او تودوخې مدیریت، د تېروتنې راپور ورکول، د فعالیت راپور ورکول، او نور زیربنا دندې. تاسو کولی شئ دې افعال ته د FME ډرایور لخوا افشا شوي sysfs انٹرفیسونو له لارې لاسرسی ومومئ.
  • جزوی بیا تنظیمول. د FME ډرایور د PR فرعي فیچر پیل کولو پرمهال د FPGA مدیر راجستر کوي؛ یوځل چې دا ستاسو څخه FPGA_FME_PORT_PR ioctl ترلاسه کړي ، دا د FPGA مدیر څخه د عام انٹرفیس فنکشن غوښتنه کوي ترڅو ورکړل شوي پورټ ته د بټ سټریم جزوي بیا تنظیم کول بشپړ کړي.
  • د مجازی کولو لپاره د بندر مدیریت. د FME ډرایور دوه ioctls معرفي کوي، FPGA_FME_PORT_RELEASE، کوم چې د PF څخه ورکړل شوی پورټ خوشې کوي؛ او 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 یوازې د Intel Xeon® پروسیسر د مدغم FPGA سره د سرعت سټیک له لارې ملاتړ کیږي.

د پورټ پلیټ فارم ماډل وسیلې ډرایور دندې

  • د پورټ کرکټر وسیله نوډ رامینځته کوي.
  • Port sysfs جوړوي files او د Port sysfs پلي کوي file لاسرسۍ
  • د پورټ خصوصي خصوصیت فرعي چلوونکي پلي کوي.
  • د پور خصوصي ځانګړتیا فرعي چلوونکي:
    • د پورټ سرلیک
    • AFU
    • د بندر تېروتنه
    • UMsg(2)
    • د سیګنال ټپ

د غوښتنلیک FPGA وسیله شمیرنه
دا برخه معرفي کوي چې څنګه غوښتنلیکونه د /sys/class/fpga لاندې د sysfs درجه بندي څخه د FPGA وسیله شمیري. په exampلاندې ، دوه Intel FPGA وسیلې په کوربه کې نصب شوي. هر FPGA وسیله یو FME او دوه بندرونه (AFUs) لري. د هر FPGA وسیلې لپاره ، د وسیلې لارښود د /sys/class/fpga لاندې رامینځته کیږي:

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

هر نوډ د ماشومانو د وسیلو په توګه یو FME او دوه بندرونه (AFUs) لري:
/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 ډرایور شمیره
دا برخه پای ورکوي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،
لیرې کول = cci_pci_ لیرې کول
.sriov_configure = cci_pci_sriov_configure
};
جوړښت cci_drvdata {
int device_id;
ساختماني وسیله *fme_dev؛
struct mutex لاک؛
struct list_head port_dev_list ;
int release_port_num;
struct list_head regions;
};
struct build_feature_devs_info {
جوړښت pci_dev *pdev؛
باطل __iomem *ioaddr;
باطل __iomem *ioend؛
int current_bar;
باطل __iomem *pfme_hdr;
د جوړښت وسیله * والدین_ دیو؛
struct platform_device *feature_dev؛
};

د شمیرنې جریان

  • ccidrv_init()
    • د idr_init() په کارولو سره fpga_ids پیل کړئ.
    • د alloc_chrdev_region() په کارولو سره fpga_chrdevs[i].devt پیل کړئ.
    • fpga_class د class_create() په کارولو سره پیل کړئ.
    • pci_register_driver(&cci_pci_driver)؛
  • cci_pci_probe()
    • د PCI وسیله فعال کړئ، خپلو سیمو ته د لاسرسي غوښتنه وکړئ، د PCI ماسټر حالت تنظیم کړئ، او DMA تنظیم کړئ.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • د ساختمان جوړونې_فیچر_devs_info تخصیص کړئ، دا پیل کړئ.
      .parent_dev د والدین sysfs لارښود (intel-fpga-dev.id) ته ټاکل شوی چې د FME او Port sysfs لارښودونه لري.
  • parse_feature_list()
    • د FME، پورټ، او د دوی شخصي ب featuresو موندلو لپاره د 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_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_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_add()
    • د feature_platform_data.features [PORT_FEATURE_ID_HEADER] پیل کړئ، هر څه مګر .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • کله چې د AFU سره مخ کیږي:
  • create_feature_instance() build_info_add_sub_feature()
    • د feature_dev.resource پیل کړئ[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • د feature_platform_data.features [PORT_FEATURE_ID_UAFU] پیل کړئ، هر څه مګر .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • کله چې د FME خصوصي خصوصیت سره مخ کیږي:
  • create_feature_instance() build_info_add_sub_feature()
    • د feature_dev.resource [id] پیل کړئ.
  • feature_platform_data_add()
    • د feature_platform_data.features[id] پیل کړئ، هر څه مګر .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • کله چې د پورټ خصوصي خصوصیت سره مخ کیږي: * create_feature_instance() build_info_add_sub_feature() * د feature_dev.resource [id] پیل کړئ. * feature_platform_data_add() د feature_platform_data.features [id] پیل کړئ، هرڅه مګر .fops.
  • parse_ports_from_fme()
    • که چیرې ډرایور په فزیکي فعالیت (PF) کې بار شوی وي، نو:
  • په هر پورټ کې د FME سرلیک کې تشریح شوي parse_feature_list() جریان چل کړئ.
  • په سرلیک کې د هر پورټ ننوتلو کې ذکر شوي بار وکاروئ.

د FME پلیټ فارم وسیله پیل کول
دا برخه پای ورکويview د FME وسیلې پیل کولو لپاره د کوډ جریان د intel-fpga-fme.ko لخوا ترسره کیږي. د معلوماتو اصلي جوړښتونه او دندې په ګوته شوي. دا برخه غوره تعقیب کیږي کله چې viewد سرچینې کوډ سره یوځای کول (fme-main.c).

د FME پلیټ فارم وسیلې ډیټا جوړښتونه

جوړښت فیچر_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
اوږد (*ioctl)(struct platform_device *pdev، د جوړښت ځانګړتیا *خصوصیت،
unsigned int cmd, unsigned long arg);
int (*ازموینه)(struct platform_device *pdev، د جوړښت ځانګړتیا *خصوصیت)؛
};
جوړښت ځانګړتیا {
const char *نوم؛
int resource_index;
باطل __iomem *ioaddr;
د جوړښت ځانګړتیاوې_ops *ops؛
};
جوړښت فیچر_پلیټفارم_ډاټا {
struct list_head node;
struct mutex لاک؛
نه لاسلیک شوی اوږد dev_status;
struct cdev cdev;
struct platform_device *dev;
غیر لاسلیک شوی int disable_count;
باطل * خصوصي؛
د شمېرې بشپړول؛
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 {
پېژند ID؛
const struct attribute_group **attr_groups؛
ساختماني وسیله *fme_dev؛
struct list_head node;
struct list_head ماشومان;
struct kobject kobj;
};
جوړښت fpga_fme {
u8 port_id؛
u64 pr_err;
ساختماني وسیله *dev_err؛
جوړښت perf_object *perf_dev؛
جوړښت فیچر_پلیټفارم_ډاټا *پی ډیټا؛
};

د FME پلیټ فارم وسیله د پیل کولو جریان

د FME د پیل کولو جریانintel-OPAE-FPGA-Linux-Divice-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_platform_data.features کې د جوړښت فیچر_ops خوندي کړئ.
    • د ازموینې فنکشن ته زنګ ووهئ، که کوم وي، له جوړښت څخه.
    • د جوړښت څخه init فنکشن ته زنګ ووهئ.
  • fme_probe() fpga_register_dev_ops()
    • د FME کرکټر وسیله نوډ جوړ کړئ، د جوړښت ثبت کول file_عملیات

د پورټ پلیټ فارم وسیله پیل کول
دا برخه پای ورکويview د پورټ وسیلې پیل کولو لپاره د کوډ جریان د intel-fpga-afu.ko لخوا ترسره کیږي. د معلوماتو اصلي جوړښتونه او دندې په ګوته شوي. دا برخه غوره تعقیب کیږي کله چې viewد سرچینې کوډ (afu.c) سره یوځای کول.

د پورټ پلیټ فارم وسیلې ډیټا جوړښتونه

جوړښت فیچر_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
اوږد (*ioctl)(struct platform_device *pdev، د جوړښت ځانګړتیا *خصوصیت،
unsigned int cmd, unsigned long arg);
int (*ازموینه)(struct platform_device *pdev، د جوړښت ځانګړتیا *خصوصیت)؛
};
جوړښت ځانګړتیا {
const char *نوم؛
int resource_index;
باطل __iomem *ioaddr;
د جوړښت ځانګړتیاوې_ops *ops؛
};
جوړښت فیچر_پلیټفارم_ډاټا {
struct list_head node;
struct mutex لاک؛
نه لاسلیک شوی اوږد dev_status;
struct cdev cdev;
struct platform_device *dev;
غیر لاسلیک شوی int disable_count;
باطل * خصوصي؛
د شمېرې بشپړول؛
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 offset;
u64 فزیک؛
struct list_head node;
};
جوړښت fpga_afu_dma_region {
u64 user_addr;
u64 اوږدوالی؛
u64 iova;
جوړښت پاڼه ** پاڼې؛
struct rb_node نوډ؛
bool in_use;
};
جوړښت fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head regions;
struct rb_root dma_regions؛
جوړښت فیچر_پلیټفارم_ډاټا *پی ډیټا؛
};

د پورټ پلیټ فارم وسیله د پیل کولو جریان

د پورټ پیل کولو جریانintel-OPAE-FPGA-Linux-Divice-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_platform_data.features کې د جوړښت فیچر_ops خوندي کړئ.
    • د ازموینې فنکشن ته زنګ ووهئ، که کوم وي، له جوړښت څخه.
    • د جوړښت څخه init فنکشن ته زنګ ووهئ.
  • afu_probe() fpga_register_dev_ops()
    • د پورټ کرکټر وسیلې نوډ رامینځته کړئ ، د جوړښت ثبت کول file_عملیات

FME IOCTLs
IOCTLs چې په خلاص کې ویل کیږي file د /dev/intel-fpga-fme.j FPGA_GET_API_VERSION لپاره توضیح کوونکی— د 0 څخه پیل شوي د عدد په توګه اوسنۍ نسخه راوګرځوئ.

FPGA_CHECK_EXTENSION—اوس مهال نه ملاتړ کیږي.

FPGA_FME_PORT_RELEASE—ارګ دې ته اشاره کوي:

جوړښت fpga_fme_port_release {
__u32 argsz; // in: sizeof(structure fpga_fme_port_release)
__u32 بیرغونه؛ // په کې: باید 0 وي
__u32 port_id; // په کې: د پورټ ID (له 0 څخه) خوشې کولو لپاره.
};

FPGA_FME_PORT_ASSIGN—ارګ دې ته اشاره کوي:

جوړښت fpga_fme_port_assign {
__u32 argsz; // in: sizeof(structure fpga_fme_port_assign)
__u32 بیرغونه؛ // په کې: باید 0 وي
__u32 port_id; // په کې: د پورټ ID (له 0 څخه) د سپارلو لپاره. (باید شوی وي
مخکې د FPGA_FME_PORT_RELEASE لخوا خپور شوی)
};

FPGA_FME_PORT_PR—ارګ دې ته اشاره کوي:

جوړښت fpga_fme_port_pr {
__u32 argsz; // in: sizeof(structure fpga_fme_port_pr)
__u32 بیرغونه؛ // په کې: باید 0 وي
__u32 port_id; // په کې: د پورټ ID (له 0 څخه)
__u32 بفر_سایز؛ // in: په بایټس کې د بټ سټریم بفر اندازه. باید 4-بایټ وي
ترتیب شوی
__u64 بفر_درس؛ // in: د بټ سټریم بفر د پروسې پته
__u64 حالت؛ // بهر: د خطا حالت (بټ ماسک)
};

پورټ IOCTLs
IOCTLs چې په خلاص کې ویل کیږي file د /dev/intel-fpga-port.k FPGA_GET_API_VERSION لپاره توضیح کوونکی— د عدد په توګه اوسنۍ نسخه بیرته راګرځئ، د 0 څخه پیل کیږي. FPGA_CHECK_EXTENSION—اوس مهال نه ملاتړ کیږي.

FPGA_PORT_GET_INFO—ارګ دې ته اشاره کوي:

جوړښت fpga_port_info {
__u32 argsz; // in: sizeof(structure fpga_port_info)
__u32 بیرغونه؛ // بهر: 0 بیرته راګرځي
__u32 num_regions; // بهر: د MMIO سیمو شمیر، 2 (1 د AFU لپاره او 1 لپاره
STP)
__u32 num_umsgs; // بهر: د UMsg شمیر د هارډویر لخوا ملاتړ شوی
};

FPGA_PORT_GET_REGION_INFO—ارګ دې ته اشاره کوي:

جوړښت fpga_port_region_info {
__u32 argsz; // in: sizeof(structure fpga_port_region_info)
__u32 بیرغونه؛ // بهر: (بټ ماسک) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 index; // په: FPGA_PORT_INDEX_UAFU یا FPGA_PORT_INDEX_STP
__u32 padding; // په کې: باید 0 وي
__u64 اندازه؛ // بهر: په بایټس کې د MMIO سیمې اندازه
__u64 offset; // بهر: د وسیلې fd له پیل څخه د MMIO سیمې آفسیټ
};

FPGA_PORT_DMA_MAP — ارګ دې ته اشاره کوي:
جوړښت fpga_port_dma_map {
__u32 argsz; // in: sizeof(structure fpga_port_dma_map)
__u32 بیرغونه؛ // in: باید 0 __u64 user_addr؛ // in: پروسس مجازی
پته باید د پاڼې سره سمون ولري.
__u64 اوږدوالی؛ // in: په بایټس کې د نقشه کولو اوږدوالی. باید د پاڼې څو وي
اندازه
__u64 iova; // بهر: IO مجازی پته };

FPGA_PORT_DMA_UNMAP — ارګ دې ته اشاره کوي:
جوړښت fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(structure fpga_port_dma_unmap)
__u32 بیرغونه؛ // په کې: باید 0 وي
__u64 iova; // in: IO مجازی پته د پخوانی لخوا بیرته راستانه شوی
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET — ارګ باید NULL وي.
  • FPGA_PORT_UMSG_ENABLE — ارګ باید NULL وي.
  • FPGA_PORT_UMSG_DISABLE— args باید NULL وي.

FPGA_PORT_UMSG_SET_MODE—ارګ دې ته اشاره کوي:

جوړښت fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 بیرغونه؛ // په کې: باید 0 وي
__u32 hint_bitmap; // in: UMsg اشارو موډ بټ میپ. دا په ګوته کوي چې کوم UMsg دي
فعال شوی
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg باید د دې ioctl جاري کولو دمخه غیر فعال شي.
  • د iova ساحه باید د یو بفر لپاره وي چې د ټولو UMsg (num_umsgs * PAGE_SIZE) لپاره کافي لوی وي.
    • بفر د موټر چلوونکي بفر مدیریت لخوا د "استعمال وړ" په توګه نښه شوی.
    • که iova NULL وي، کومه پخوانۍ سیمه د "استعمال وړ" په توګه نه نښه کیږي.
  • ارګ دې ته اشاره کوي:
    جوړښت fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(structure fpga_port_umsg_base_addr)
    • u32 بیرغونه؛ // په کې: باید 0 وي
    • u64 iova; // په کې: IO مجازی پته د FPGA_PORT_DMA_MAP څخه. };

یادونه:

  • د پورټ غلطیو پاکولو لپاره ، تاسو باید د اوسني غلطیو دقیق بټ ماسک ولیکئ ، د مثال لپارهample، د پیشو تېروتنې> روښانه
  • UMsg یوازې د Intel Xeon پروسیسر لپاره د Integrated FPGA سره د سرعت سټیک له لارې ملاتړ کیږي.

سي اېس اېف Files

د FME سرلیک sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

سي اېس اېف file د mmio ساحه ډول لاسرسی
ports_num fme_header.capability.num_ports decimal int یوازې لوستل
د کیش اندازه fme_header.capability.cache_size decimal int یوازې لوستل
نسخه fme_header.capability.fabric_verid decimal int یوازې لوستل
socket_id fme_header.capability.socket_id decimal int یوازې لوستل
bitstream_id fme_header.bitstream_id hex uint64_t یوازې لوستل
bitstream_metadata fme_header.bitstream_md hex uint64_t یوازې لوستل

د FME حرارتي مدیریت sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

سي اېس اېف file د mmio ساحه ډول لاسرسی
حد ۱ thermal.threshold.tmp_thshold1 decimal int کارن: یوازې د لوستلو ریښه: لوستل - لیکل
حد ۱ thermal.threshold.tmp_thshold2 decimal int کارن: یوازې د لوستلو ریښه: لوستل - لیکل
threshold_trip thermal.threshold.therm_trip_thshold decimal int یوازې لوستل
threshold1_raches thermal.threshold.thshold1_status decimal int یوازې لوستل
threshold2_raches thermal.threshold.thshold2_status decimal int یوازې لوستل
threshold1_policy حرارتي threshold.thshold_policy decimal int کارن: یوازې د لوستلو ریښه: لوستل - لیکل
حرارت thermal.rdsensor_fm1.fpga_temp decimal int یوازې لوستل

د FME بریښنا مدیریت sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

سي اېس اېف file د mmio ساحه ډول لاسرسی
مصرف شوی power.status.pwr_consumed hex uint64_t یوازې لوستل
حد ۱ power.threshold.threshold1 hex uint64_t کارن: یوازې د لوستلو ریښه: لوستل - لیکل
حد ۱ power.threshold.threshold2 hex uint64_t کارن: یوازې د لوستلو ریښه: لوستل - لیکل
threshold1_status power.threshold.threshold1_status لسیزه غیر لاسلیک شوی یوازې لوستل
threshold2_status power.threshold.threshold2_status لسیزه غیر لاسلیک شوی یوازې لوستل
آر ټي ایل power.status.fpga_latency_report لسیزه غیر لاسلیک شوی یوازې لوستل

FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

سي اېس اېف file د mmio ساحه ډول لاسرسی
pcie0_غلطۍ gerror.pcie0_err hex uint64_t ولولئ
pcie1_غلطۍ 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/

سي اېس اېف 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 غلطیو پاکولو لپاره، تاسو باید د اوسني غلطیو دقیق بټ ماسک ولیکئ، د مثال لپارهampد پیشو تېروتنې > روښانه.

د FME جزوی بیا تنظیم کول sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

سي اېس اېف file د mmio ساحه ډول لاسرسی
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l هیکس 16-بایټ یوازې لوستل

د FME نړیوال فعالیت sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

سي اېس اېف file د mmio ساحه ډول لاسرسی
ساعت gperf.clk.afu_interf_clock hex uint64_t یوازې لوستل

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (د FPGAs سره د Intel Xeon CPU لپاره د سرعت سټیک لپاره اعتبار نلري)

سي اېس اېف file د mmio ساحه ډول لاسرسی
کنګل gperf.ch_ctl.freeze decimal int ولولئ
لوستل 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 یوازې لوستل
سي اېس اېف file د mmio ساحه ډول لاسرسی
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t یوازې لوستل
ډاټا_رایټ_پورټ_کنټینشن gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t یوازې لوستل
tag_write_port_content gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t یوازې لوستل

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (د FPGAs سره د Intel Xeon CPU لپاره د سرعت سټیک لپاره اعتبار نلري)

سي اېس اېف file د mmio ساحه ډول لاسرسی
کنګل gperf.vtd_ctl.freeze decimal int کارن: یوازې د لوستلو ریښه: لوستل - لیکل

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (د FPGAs سره د Intel Xeon CPU لپاره د سرعت سټیک لپاره اعتبار نلري)

سي اېس اېف 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/

سي اېس اېف file د mmio ساحه ډول لاسرسی
فعالول gperf.fab_ctl.(فعال شوی) decimal int کارن: یوازې د لوستلو ریښه: لوستل - لیکل
کنګل gperf.fab_ctl.freeze decimal int کارن: یوازې د لوستلو ریښه: لوستل - لیکل
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t یوازې لوستل
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t یوازې لوستل
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t یوازې لوستل
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t یوازې لوستل
upi_لوستل gperf.FAB_UPI_RD hex uint64_t یوازې لوستل
upi_لیکنه gperf.FAB_UPI_WR hex uint64_t یوازې لوستل

intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/

سي اېس اېف file د mmio ساحه ډول لاسرسی
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t یوازې لوستل
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t یوازې لوستل
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t یوازې لوستل
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t یوازې لوستل
upi_لوستل gperf.FAB_UPI_RD hex uint64_t یوازې لوستل
upi_لیکنه gperf.FAB_UPI_WR hex uint64_t یوازې لوستل

د پورټ سرلیک sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

سي اېس اېف file د mmio ساحه ډول لاسرسی
id port_header.capability.port_number decimal int یوازې لوستل
ltr port_header.control.latency_tolerance decimal int یوازې لوستل

د پورټ AFU سرلیک sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

سي اېس اېف file د mmio ساحه ډول لاسرسی
afu_id afu_header.guid هیکس 16-بایټ یوازې لوستل

د پورټ تېروتنه sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

سي اېس اېف file د mmio ساحه ډول لاسرسی
تېروتنې pererror.port_error hex uint64_t یوازې لوستل
لومړۍ_ تېروتنه pererror.port_first_error hex uint64_t یوازې لوستل
لومړی_نقصان شوی_req pererror.malreq هیکس 16-بایټ یوازې لوستل
روښانه خطا.(ټولې تېروتنې) مختلف uint64_t یوازې لیکل

یادونه:
د پورټ غلطیو پاکولو لپاره ، تاسو باید د اوسني غلطیو دقیق بټ ماسک ولیکئ ، د مثال لپارهampد پیشو تېروتنې > روښانه.

د بیاکتنې تاریخ

د سند نسخه بدلونونه
2017.10.02 ابتدايي خوشې کول.

د OPAE Intel FPGA لینکس وسیلې ډرایور آرکیټیکچر لارښود

اسناد / سرچینې

د انټیل OPAE FPGA لینکس وسیلې ډرایور آرکیټیکچر [pdf] د کارونکي لارښود
د OPAE FPGA لینکس وسیلې ډرایور جوړښت ، OPAE FPGA ، د لینکس وسیلې ډرایور آرکیټیکچر ، د ډرایور آرکیټیکچر ، آرکیټیکچر

حوالې

یو نظر پریږدئ

ستاسو بریښنالیک پته به خپره نشي. اړین ساحې په نښه شوي *