និមិត្តសញ្ញា Intel

intel OPAE FPGA ស្ថាបត្យកម្មកម្មវិធីបញ្ជាឧបករណ៍លីនុច

intel-OPAE-FPGA-Linux-ឧបករណ៍-កម្មវិធីបញ្ជា-ស្ថាបត្យកម្ម-ផលិតផល

OPAE Intel FPGA ស្ថាបត្យកម្មកម្មវិធីបញ្ជាឧបករណ៍លីនុច

កម្មវិធីបញ្ជា OPAE Intel FPGA ផ្តល់ចំណុចប្រទាក់សម្រាប់កម្មវិធីចន្លោះអ្នកប្រើប្រាស់ដើម្បីកំណត់រចនាសម្ព័ន្ធ រាប់បញ្ចូល បើក និងចូលប្រើឧបករណ៍បង្កើនល្បឿន FPGA នៅលើវេទិកាដែលបំពាក់ដោយដំណោះស្រាយ Intel FPGA និងបើកដំណើរការមុខងារគ្រប់គ្រងកម្រិតប្រព័ន្ធដូចជា ការកំណត់រចនាសម្ព័ន្ធ FPGA ការគ្រប់គ្រងថាមពល និងនិម្មិត។

ស្ថាបត្យកម្មផ្នែករឹង

ពីចំណុចរបស់ OS viewផ្នែករឹង FPGA លេចឡើងជាឧបករណ៍ PCIe ធម្មតា។ អង្គចងចាំឧបករណ៍ FPGA ត្រូវបានរៀបចំដោយប្រើរចនាសម្ព័ន្ធទិន្នន័យដែលបានកំណត់ជាមុន (បញ្ជីលក្ខណៈពិសេសឧបករណ៍) ។ លក្ខណៈពិសេសដែលគាំទ្រដោយឧបករណ៍ FPGA ត្រូវបានលាតត្រដាងតាមរយៈរចនាសម្ព័ន្ធទិន្នន័យទាំងនេះ ដូចដែលបានបង្ហាញខាងក្រោមក្នុងរូបភាពខាងក្រោម៖

ឧបករណ៍ FPGA PCIe

intel-OPAE-FPGA-Linux-ឧបករណ៍-កម្មវិធីបញ្ជា-ស្ថាបត្យកម្ម-fig- (1)

កម្មវិធីបញ្ជាគាំទ្រ PCIe SR-IOV ដើម្បីបង្កើតមុខងារនិម្មិត (VFs) ដែលអាចត្រូវបានប្រើដើម្បីផ្តល់ឧបករណ៍បង្កើនល្បឿនបុគ្គលទៅម៉ាស៊ីននិម្មិត។

សាជីវកម្ម Intel ។ រក្សា​រ​សិទ្ធ​គ្រប់យ៉ាង។ Intel, និមិត្តសញ្ញា Intel និងសញ្ញា Intel ផ្សេងទៀតគឺជាពាណិជ្ជសញ្ញារបស់ Intel Corporation ឬក្រុមហ៊ុនបុត្រសម្ព័ន្ធរបស់ខ្លួន។ Intel ធានានូវដំណើរការនៃផលិតផល FPGA និង semiconductor របស់ខ្លួនទៅនឹងលក្ខណៈបច្ចេកទេសបច្ចុប្បន្នស្របតាមការធានាស្តង់ដាររបស់ Intel ប៉ុន្តែរក្សាសិទ្ធិក្នុងការផ្លាស់ប្តូរផលិតផល និងសេវាកម្មណាមួយនៅពេលណាមួយដោយមិនមានការជូនដំណឹងជាមុន។ Intel សន្មត់ថាគ្មានទំនួលខុសត្រូវ ឬការទទួលខុសត្រូវដែលកើតចេញពីកម្មវិធី ឬការប្រើប្រាស់ព័ត៌មាន ផលិតផល ឬសេវាកម្មណាមួយដែលបានពិពណ៌នានៅទីនេះ លើកលែងតែមានការយល់ព្រមជាលាយលក្ខណ៍អក្សរដោយ Intel ។ អតិថិជនរបស់ Intel ត្រូវបានណែនាំឱ្យទទួលបានកំណែចុងក្រោយបំផុតនៃលក្ខណៈបច្ចេកទេសឧបករណ៍ មុនពេលពឹងផ្អែកលើព័ត៌មានដែលបានបោះពុម្ពផ្សាយណាមួយ និងមុនពេលធ្វើការបញ្ជាទិញផលិតផល ឬសេវាកម្ម។

ឈ្មោះ និងម៉ាកផ្សេងទៀតអាចត្រូវបានអះអាងថាជាកម្មសិទ្ធិរបស់អ្នកដទៃ។

ឧបករណ៍ FPGA PCIe និម្មិត

intel-OPAE-FPGA-Linux-ឧបករណ៍-កម្មវិធីបញ្ជា-ស្ថាបត្យកម្ម-fig- (2)

ម៉ាស៊ីនគ្រប់គ្រង FPGA (FME)
ម៉ាស៊ីនគ្រប់គ្រង FPGA អនុវត្តការគ្រប់គ្រងថាមពល និងកម្ដៅ របាយការណ៍កំហុស ការកំណត់រចនាសម្ព័ន្ធឡើងវិញ របាយការណ៍ប្រតិបត្តិការ និងមុខងារហេដ្ឋារចនាសម្ព័ន្ធផ្សេងទៀត។ FPGA នីមួយៗមាន FME មួយ ដែលតែងតែចូលប្រើតាមរយៈមុខងាររូបវិទ្យា (PF)។ កម្មវិធីលំហអ្នកប្រើប្រាស់អាចទទួលបានការចូលប្រើផ្តាច់មុខទៅកាន់ FME ដោយប្រើ open() ហើយបញ្ចេញវាដោយប្រើ close() ជាអ្នកប្រើប្រាស់ដែលមានសិទ្ធិ (root)។

ច្រក
ច្រកតំណាងឱ្យចំណុចប្រទាក់រវាងក្រណាត់ FPGA ឋិតិវន្ត ( "កម្មវិធីគ្រប់គ្រងចំណុចប្រទាក់ FPGA (FIM)") និងតំបន់ដែលអាចកំណត់រចនាសម្ព័ន្ធឡើងវិញបានដោយផ្នែកដែលមានមុខងារបង្កើនល្បឿន (AF) ។ ច្រកគ្រប់គ្រងទំនាក់ទំនងពីកម្មវិធីទៅឧបករណ៍បង្កើនល្បឿន និងបង្ហាញលក្ខណៈពិសេសដូចជាការកំណត់ឡើងវិញ និងបំបាត់កំហុស។ ឧបករណ៍ PCIe អាចមានច្រកជាច្រើន ហើយច្រកនីមួយៗអាចត្រូវបានលាតត្រដាងតាមរយៈ VF ដោយកំណត់វាដោយប្រើ FPGA_FME_PORT_ASSIGN ioctl នៅលើឧបករណ៍ FME ។

ឯកតាមុខងារបង្កើនល្បឿន (AF)

  • ឯកតាមុខងារបង្កើនល្បឿន (AF) ត្រូវបានភ្ជាប់ទៅច្រកមួយ និងបង្ហាញតំបន់ 256K MMIO ដែលត្រូវប្រើសម្រាប់ការចុះឈ្មោះត្រួតពិនិត្យជាក់លាក់នៃឧបករណ៍បង្កើនល្បឿន។
  • កម្មវិធីលំហអ្នកប្រើប្រាស់អាចទទួលបានសិទ្ធិចូលប្រើផ្តាច់មុខទៅកាន់ AFU ដែលភ្ជាប់ទៅនឹងច្រកមួយ ដោយប្រើ open() នៅលើឧបករណ៍ Port ហើយបញ្ចេញវាដោយប្រើ close()។
  • កម្មវិធីលំហអ្នកប្រើប្រាស់ក៏អាច mmap() accelerator តំបន់ 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 ដំបូងត្រូវតែបញ្ចេញចេញពី PF តាមរយៈ FPGA_FME_PORT_RELEASE ioctl នៅលើឧបករណ៍ FME ។
  2. នៅពេលដែលច្រក N ត្រូវបានបញ្ចេញចេញពី PF ពាក្យបញ្ជាខាងក្រោមអាចត្រូវបានប្រើដើម្បីបើក SRIOV និង VFs ។ VF នីមួយៗមានច្រកតែមួយជាមួយ AFU ។ បន្ទរ N > PCI_DEVICE_PATH/sriov_numvfs
  3. ឆ្លងកាត់ VFs ទៅ VMs ។
  4. AFU ក្រោម VF អាចចូលប្រើបានពីកម្មវិធីនៅក្នុង VM (ដោយប្រើកម្មវិធីបញ្ជាដូចគ្នានៅខាងក្នុង VF) ។

ចំណាំ៖
FME មិនអាចត្រូវបានកំណត់ទៅ VF ទេ ដូច្នេះ PR និងមុខងារគ្រប់គ្រងផ្សេងទៀតគឺមានតែតាមរយៈ PF ប៉ុណ្ណោះ។

អង្គការអ្នកបើកបរ

កម្មវិធីបញ្ជាឧបករណ៍ម៉ូឌុល PCIe

អង្គការអ្នកបើកបរ

intel-OPAE-FPGA-Linux-ឧបករណ៍-កម្មវិធីបញ្ជា-ស្ថាបត្យកម្ម-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 ដើម្បីបញ្ចប់ការកំណត់រចនាសម្ព័ន្ធឡើងវិញដោយផ្នែកនៃ bitstream ទៅច្រកដែលបានផ្តល់ឱ្យ។
  • ការគ្រប់គ្រងច្រកសម្រាប់និម្មិត។ កម្មវិធីបញ្ជា FME ណែនាំ ioctls ពីរ FPGA_FME_PORT_RELEASE ដែលបញ្ចេញច្រកដែលបានផ្តល់ឱ្យពី PF ។ និង FPGA_FME_PORT_ASSIGN ដែលកំណត់ច្រកត្រឡប់ទៅ PF វិញ។ នៅពេលដែលច្រកត្រូវបានបញ្ចេញចេញពី PF វាអាចត្រូវបានកំណត់ទៅ VF តាមរយៈចំណុចប្រទាក់ SR-IOV ដែលផ្តល់ដោយកម្មវិធីបញ្ជា PCIe ។ សម្រាប់ព័ត៌មានបន្ថែម សូមមើល "FPGA Virtualization"។

មុខងារកម្មវិធីបញ្ជាឧបករណ៍ម៉ូឌុលវេទិកា FME

  • បង្កើតថ្នាំងឧបករណ៍តួអក្សរ FME ។
  • បង្កើត FME sysfs files និងអនុវត្ត FME sysfs file ឧបករណ៍ប្រើប្រាស់។
  • អនុវត្តកម្មវិធីបញ្ជារងមុខងារឯកជន FME ។
  • កម្មវិធីបញ្ជារងមុខងារឯកជន FME៖
    • បឋមកថា FME
    • ការគ្រប់គ្រងកំដៅ
    • ការគ្រប់គ្រងថាមពល
    • កំហុសសកល
    • ការកំណត់រចនាសម្ព័ន្ធឡើងវិញដោយផ្នែក
    • ការអនុវត្តជាសកល

កម្មវិធីបញ្ជាឧបករណ៍ម៉ូឌុលច្រកវេទិកា
ស្រដៀងទៅនឹងកម្មវិធីបញ្ជា FME ដែរ FPGA Port (និង AFU) driver (intel-fpga-afu. ko) ត្រូវបានស៊ើបអង្កេតនៅពេលដែលឧបករណ៍ Port platform ត្រូវបានបង្កើត។ មុខងារចម្បងនៃម៉ូឌុលនេះគឺដើម្បីផ្តល់នូវចំណុចប្រទាក់សម្រាប់កម្មវិធីចន្លោះអ្នកប្រើប្រាស់ដើម្បីចូលប្រើឧបករណ៍បង្កើនល្បឿនបុគ្គល រួមទាំងការគ្រប់គ្រងការកំណត់ឡើងវិញជាមូលដ្ឋាននៅលើច្រក ការនាំចេញតំបន់ AFU MMIO សេវាគូសផែនទីសតិបណ្ដោះអាសន្ន DMA ការជូនដំណឹង UMsg(1) និងមុខងារបំបាត់កំហុសពីចម្ងាយ ( សូមមើលខាងលើ) ។

UMsg ត្រូវបានគាំទ្រតែតាមរយៈ Acceleration Stack សម្រាប់ Intel Xeon® Processor ជាមួយនឹង FPGA រួមបញ្ចូលគ្នា។

Port Platform Module មុខងារកម្មវិធីបញ្ជាឧបករណ៍

  • បង្កើតថ្នាំងឧបករណ៍តួអក្សរច្រក។
  • បង្កើត Port sysfs files និងអនុវត្ត Port sysfs file ឧបករណ៍ប្រើប្រាស់។
  • អនុវត្តកម្មវិធីបញ្ជារងមុខងារឯកជនរបស់កំពង់ផែ។
  • កម្មវិធីបញ្ជារងមុខងារឯកជនកំពង់ផែ៖
    • ក្បាលច្រក
    • AFU
    • កំហុសច្រក
    • UMsg(2)
    • សញ្ញាប៉ះ

កម្មវិធី FPGA ការរាប់បញ្ចូលឧបករណ៍
ផ្នែកនេះណែនាំពីរបៀបដែលកម្មវិធីរាប់បញ្ចូលឧបករណ៍ FPGA ពីឋានានុក្រម sysfs ក្រោម /sys/class/fpga ។ នៅក្នុងអតីតampនៅខាងក្រោមឧបករណ៍ 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[] = {
{ .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;
រចនាសម្ព័ន្ធ mutex ចាក់សោ;
struct list_head port_dev_list;
int release_port_num;
រចនាសម្ព័ន្ធ list_head តំបន់;
};
រចនាសម្ព័ន្ធ build_feature_devs_info {
រចនាសម្ព័ន្ធ pci_dev * pdev;
មោឃៈ __ioem * ioaddr;
មោឃៈ __ioem * ioend;
int current_bar;
មោឃៈ __ioem * 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_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()
    • ដើរបញ្ជីលក្ខណៈពិសេសឧបករណ៍ BAR0 ដើម្បីស្វែងរក FME ច្រក និងលក្ខណៈពិសេសឯកជនរបស់ពួកគេ។
  • 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 ។
  • បែងចែករចនាសម្ព័ន្ធ struct 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 ។
    • បែងចែករចនាសម្ព័ន្ធ struct 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() * ចាប់ផ្តើម 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
ផ្នែកនេះផ្តល់នូវការបញ្ចប់view នៃលំហូរកូដសម្រាប់ការចាប់ផ្តើមឧបករណ៍ FME ដែលធ្វើឡើងដោយ intel-fpga-fme.ko ។ រចនាសម្ព័ន្ធទិន្នន័យ និងមុខងារសំខាន់ៗត្រូវបានលើកឡើង។ ផ្នែកនេះត្រូវបានអនុវត្តតាមល្អបំផុតនៅពេល viewដោយភ្ជាប់មកជាមួយកូដប្រភព (fme-main.c) ។

រចនាសម្ព័ន្ធទិន្នន័យឧបករណ៍វេទិកា FME

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*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 * ឈ្មោះ;
int resource_index;
មោឃៈ __ioem * ioaddr;
struct feature_ops * ops;
};
struct feature_platform_data {
struct list_head node;
រចនាសម្ព័ន្ធ mutex ចាក់សោ;
ស្ថានភាព dev_ដែលមិនបានចុះហត្ថលេខា;
រចនាសម្ព័ន្ធ cdev cdev;
រចនាសម្ព័ន្ធ platform_device * dev;
unsigned int disable_count;
មោឃៈ * ឯកជន;
int លេខ;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); រចនាសម្ព័ន្ធ
លក្ខណៈពិសេស[0];
};
struct perf_object {
លេខសម្គាល់ int;
const struct attribute_group ** attr_groups;
ឧបករណ៍រចនាសម្ព័ន្ធ * fme_dev;
struct list_head node;
struct list_head កុមារ;
រចនាសម្ព័ន្ធ kobject kobj;
};
រចនាសម្ព័ន្ធ fpga_fme {
u8 port_id;
u64 pr_err;
ឧបករណ៍រចនាសម្ព័ន្ធ * dev_err;
រចនាសម្ព័ន្ធ perf_object *perf_dev;
struct feature_platform_data * pdata;
};

លំហូរការចាប់ផ្តើមឧបករណ៍វេទិកា FME

លំហូរការចាប់ផ្តើម FMEintel-OPAE-FPGA-Linux-ឧបករណ៍-កម្មវិធីបញ្ជា-ស្ថាបត្យកម្ម-fig- (4)

  • fme_probe() fme_dev_init()
    • ចាប់ផ្តើមរចនាសម្ព័ន្ធ fpga_fme ហើយរក្សាទុកវានៅក្នុងវាល feature_platform_data.private ។
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • រក្សាទុក struct feature_ops ទៅក្នុង feature_platform_data.features សម្រាប់លក្ខណៈពិសេសនីមួយៗ។
    • ហៅមុខងារសាកល្បង ប្រសិនបើមាន ពីរចនាសម្ព័ន្ធ។
    • ហៅមុខងារ init ពី struct ។
  • fme_probe() fpga_register_dev_ops()
    • បង្កើតថ្នាំងឧបករណ៍តួអក្សរ FME ដោយចុះឈ្មោះរចនាសម្ព័ន្ធ file_ប្រតិបត្តិការ។

ការចាប់ផ្តើមឧបករណ៍ច្រកវេទិកា
ផ្នែកនេះផ្តល់នូវការបញ្ចប់view នៃលំហូរកូដសម្រាប់ការចាប់ផ្តើមឧបករណ៍ច្រកដែលអនុវត្តដោយ intel-fpga-afu.ko ។ រចនាសម្ព័ន្ធទិន្នន័យ និងមុខងារសំខាន់ៗត្រូវបានបន្លិច។ ផ្នែកនេះត្រូវបានអនុវត្តតាមល្អបំផុតនៅពេល viewដោយភ្ជាប់មកជាមួយកូដប្រភព (afu.c) ។

រចនាសម្ព័ន្ធទិន្នន័យឧបករណ៍ច្រកវេទិកា

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*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 * ឈ្មោះ;
int resource_index;
មោឃៈ __ioem * ioaddr;
struct feature_ops * ops;
};
struct feature_platform_data {
struct list_head node;
រចនាសម្ព័ន្ធ mutex ចាក់សោ;
ស្ថានភាព dev_ដែលមិនបានចុះហត្ថលេខា;
រចនាសម្ព័ន្ធ cdev cdev;
រចនាសម្ព័ន្ធ platform_device * dev;
unsigned int disable_count;
មោឃៈ * ឯកជន;
int លេខ;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
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;
ទំព័ររចនាសម្ព័ន្ធ ** ទំព័រ;
struct rb_node node;
bool in_use;
};
រចនាសម្ព័ន្ធ fpga_afu {
u64 តំបន់_cur_offset;
int num_regions;
u8 num_umsgs;
រចនាសម្ព័ន្ធ list_head តំបន់;
រចនាសម្ព័ន្ធ rb_root dma_regions;
struct feature_platform_data * pdata;
};

លំហូរការចាប់ផ្តើមឧបករណ៍ច្រកវេទិកា

លំហូរការចាប់ផ្តើមច្រកintel-OPAE-FPGA-Linux-ឧបករណ៍-កម្មវិធីបញ្ជា-ស្ថាបត្យកម្ម-fig- (5)

  • afu_probe() afu_dev_init()
    • ចាប់ផ្តើមរចនាសម្ព័ន្ធ fpga_afu ហើយរក្សាទុកវានៅក្នុងវាល feature_platform_data.private ។
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • រក្សាទុក struct feature_ops ទៅក្នុង feature_platform_data.features សម្រាប់លក្ខណៈពិសេសនីមួយៗ។
    • ហៅមុខងារសាកល្បង ប្រសិនបើមាន ពីរចនាសម្ព័ន្ធ។
    • ហៅមុខងារ init ពី struct ។
  • 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—arg ជា​ទ្រនិច​ទៅ​កាន់៖

រចនាសម្ព័ន្ធ fpga_fme_port_release {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_fme_port_release)
__u32 ទង់; // ក្នុង៖ ត្រូវតែជា 0
__u32 port_id; // នៅក្នុង: លេខសម្គាល់ច្រក (ពី 0) ដើម្បីចេញផ្សាយ។
};

FPGA_FME_PORT_ASSIGN—arg ជា​ទ្រនិច​ទៅ​កាន់៖

រចនាសម្ព័ន្ធ fpga_fme_port_assign {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_fme_port_assign)
__u32 ទង់; // ក្នុង៖ ត្រូវតែជា 0
__u32 port_id; // ក្នុង៖ លេខសម្គាល់ច្រក (ពី ០) ដើម្បីចាត់ចែង។ (ត្រូវតែជា
ចេញផ្សាយពីមុនដោយ FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg ជា​ទ្រនិច​ទៅ​កាន់៖

រចនាសម្ព័ន្ធ fpga_fme_port_pr {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_fme_port_pr)
__u32 ទង់; // ក្នុង៖ ត្រូវតែជា 0
__u32 port_id; // ក្នុង៖ លេខសម្គាល់ច្រក (ពី ០)
__u32 ទំហំសតិបណ្ដោះអាសន្ន; // ក្នុង៖ ទំហំនៃបណ្តុំចរន្តប៊ីតគិតជាបៃ។ ត្រូវតែជា 4 បៃ
តម្រឹម។
__u64 buffer_address; // នៅក្នុង៖ អាសយដ្ឋានដំណើរការនៃសតិបណ្ដោះអាសន្ន bitstream
ស្ថានភាព __u64; // ចេញ៖ ស្ថានភាពកំហុស (ប៊ីតម៉ាស)
};

ច្រក IOCTLs
IOCTLs ដែលត្រូវបានហៅឱ្យបើក file descriptor សម្រាប់ /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 ទង់; // ចេញ៖ ត្រឡប់ ០
__u32 num_regions; // ចេញ៖ ចំនួននៃតំបន់ MMIO, 2 (1 សម្រាប់ AFU និង 1 សម្រាប់
STP)
__u32 num_umsgs; // ចេញ៖ ចំនួន UMsg ដែលគាំទ្រដោយផ្នែករឹង
};

FPGA_PORT_GET_REGION_INFO—arg ជា​ទ្រនិច​ទៅ​កាន់៖

រចនាសម្ព័ន្ធ fpga_port_region_info {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_port_region_info)
__u32 ទង់; // ចេញ៖ (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 សន្ទស្សន៍; // ក្នុង៖ FPGA_PORT_INDEX_UAFU ឬ FPGA_PORT_INDEX_STP
__u32 ទ្រនាប់; // ក្នុង៖ ត្រូវតែជា 0
ទំហំ __u64; // ចេញ៖ ទំហំនៃតំបន់ MMIO គិតជាបៃ
__u64 អុហ្វសិត; // ចេញ៖ អុហ្វសិតនៃតំបន់ MMIO ពីការចាប់ផ្តើមឧបករណ៍ fd
};

FPGA_PORT_DMA_MAP—arg ជា​ទ្រនិច​ទៅ​កាន់៖
រចនាសម្ព័ន្ធ fpga_port_dma_map {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_port_dma_map)
__u32 ទង់; // ក្នុង៖ ត្រូវតែជា 0 __u64 user_addr; // នៅក្នុង៖ ដំណើរការនិម្មិត
អាសយដ្ឋាន។ ត្រូវតែតម្រឹមទំព័រ។
__u64 ប្រវែង; // ក្នុង៖ ប្រវែងនៃផែនទីគិតជាបៃ។ ត្រូវតែជាពហុទំព័រ
ទំហំ។
__u64 អ៊ីវ៉ា; // ចេញ៖ IO អាសយដ្ឋាននិម្មិត };

FPGA_PORT_DMA_UNMAP—arg ជា​ទ្រនិច​ទៅ​កាន់៖
រចនាសម្ព័ន្ធ fpga_port_dma_unmap {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_port_dma_unmap)
__u32 ទង់; // ក្នុង៖ ត្រូវតែជា 0
__u64 អ៊ីវ៉ា; // នៅក្នុង៖ IO អាសយដ្ឋាននិម្មិតបានត្រឡប់ដោយមុន។
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg ត្រូវតែ NULL ។
  • FPGA_PORT_UMSG_ENABLE—arg ត្រូវតែ NULL ។
  • FPGA_PORT_UMSG_DISABLE—args ត្រូវតែ NULL ។

FPGA_PORT_UMSG_SET_MODE—arg ជា​ទ្រនិច​ទៅ​កាន់៖

រចនាសម្ព័ន្ធ fpga_port_umsg_cfg {
__u32 argsz; // ក្នុង៖ sizeof(struct fpga_port_umsg_cfg)
__u32 ទង់; // ក្នុង៖ ត្រូវតែជា 0
__u32 hint_bitmap; // នៅក្នុង៖ ផែនទីបង្ហាញព័ត៌មាន UMsg ។ បញ្ជាក់ថា 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 ទង់; // ក្នុង៖ ត្រូវតែជា 0
    • u64 iova; // នៅក្នុង៖ IO អាសយដ្ឋាននិម្មិតពី FPGA_PORT_DMA_MAP ។ };

ចំណាំ៖

  • ដើម្បីជម្រះកំហុសច្រក អ្នកត្រូវតែសរសេរ bitmask ពិតប្រាកដនៃកំហុសបច្ចុប្បន្ន ឧ។ample, cat errors > clear
  • UMsg ត្រូវបានគាំទ្រតែតាមរយៈ Acceleration Stack សម្រាប់ Intel Xeon Processor ជាមួយនឹង 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 បានតែអាន
ទំហំឃ្លាំងសម្ងាត់ 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 hex uint64_t បានតែអាន
bitstream_metadata fme_header.bitstream_md hex uint64_t បានតែអាន

FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
កម្រិត 1 thermal.threshold.tmp_thshold1 ទសភាគ int អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
កម្រិត 2 thermal.threshold.tmp_thshold2 ទសភាគ int អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
threshold_trip thermal.threshold.therm_trip_thshold ទសភាគ int បានតែអាន
threshold1_ឈានដល់ thermal.threshold.thshold1_ស្ថានភាព ទសភាគ int បានតែអាន
threshold2_ឈានដល់ thermal.threshold.thshold2_ស្ថានភាព ទសភាគ int បានតែអាន
threshold1_policy កម្ដៅ។ threshold.thshold_policy ទសភាគ int អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
សីតុណ្ហភាព thermal.rdsensor_fm1.fpga_temp ទសភាគ int បានតែអាន

ការគ្រប់គ្រងថាមពល FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
ប្រើប្រាស់ power.status.pwr_consumed hex uint64_t បានតែអាន
កម្រិត 1 power.threshold.threshold1 hex uint64_t អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
កម្រិត 2 power.threshold.threshold2 hex uint64_t អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
threshold1_status power.threshold.threshold1_ស្ថានភាព ទសភាគដែលមិនបានចុះហត្ថលេខា បានតែអាន
threshold2_status power.threshold.threshold2_ស្ថានភាព ទសភាគដែលមិនបានចុះហត្ថលេខា បានតែអាន
rtl power.status.fpga_latency_report ទសភាគដែលមិនបានចុះហត្ថលេខា បានតែអាន

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

sysfs 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/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
កំហុស gerror.fme_err hex uint64_t បានតែអាន
first_error gerror.fme_first_err.err_reg_status hex uint64_t បានតែអាន
Next_error gerror.fme_next_err.err_reg_status hex uint64_t បានតែអាន
ច្បាស់ ជម្រះកំហុស, first_error, next_error ផ្សេងៗ uint64_t សរសេរតែប៉ុណ្ណោះ

ចំណាំ៖
ដើម្បីជម្រះកំហុស FME អ្នកត្រូវតែសរសេរ bitmask ពិតប្រាកដនៃកំហុសបច្ចុប្បន្ន ឧ។ampកំហុសឆ្មា > ច្បាស់។

FME ការកំណត់រចនាសម្ព័ន្ធឡើងវិញដោយផ្នែក sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
លេខសម្គាល់ចំណុចប្រទាក់ pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte បានតែអាន

FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
នាឡិកា gperf.clk.afu_interf_clock hex uint64_t បានតែអាន

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (មិន​ត្រឹមត្រូវ​សម្រាប់ Acceleration Stack សម្រាប់ Intel Xeon CPU ជាមួយ FPGAs)

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
បង្កក gperf.ch_ctl.បង្កក ទសភាគ int អាន​សរសេរ
read_hit gperf.CACHE_RD_HIT hex uint64_t បានតែអាន
read_នឹក gperf.CACHE_RD_MISS hex uint64_t បានតែអាន
write_hit gperf.CACHE_WR_HIT hex uint64_t បានតែអាន
សរសេរ_នឹក gperf.CACHE_WR_MISS hex uint64_t បានតែអាន
hold_request gperf.CACHE_HOLD_REQ hex uint64_t បានតែអាន
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t បានតែអាន
sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t បានតែអាន
data_write_port_ការឈ្លោះប្រកែកគ្នា។ gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t បានតែអាន
tag_write_port_ការឈ្លោះប្រកែកគ្នា។ gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t បានតែអាន

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (មិន​ត្រឹមត្រូវ​សម្រាប់ Acceleration Stack សម្រាប់ CPU Intel Xeon ជាមួយ FPGAs)

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
បង្កក gperf.vtd_ctl.បង្កក ទសភាគ int អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (មិន​ត្រឹមត្រូវ​សម្រាប់ Acceleration Stack សម្រាប់ Intel Xeon CPU ជាមួយ FPGAs)

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t បានតែអាន
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t បានតែអាន
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t បានតែអាន
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t បានតែអាន

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
បើក gperf.fab_ctl.(បានបើក) ទសភាគ int អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
បង្កក gperf.fab_ctl.freeze ទសភាគ int អ្នកប្រើប្រាស់៖ អានបានតែឫស៖ អាន-សរសេរ
pcie0_អាន gperf.FAB_PCIE0_RD hex uint64_t បានតែអាន
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t បានតែអាន
pcie1_អាន gperf.FAB_PCIE1_RD hex uint64_t បានតែអាន
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t បានតែអាន
upi_read gperf.FAB_UPI_RD hex uint64_t បានតែអាន
upi_write gperf.FAB_UPI_WR hex uint64_t បានតែអាន

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

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
pcie0_អាន gperf.FAB_PCIE0_RD hex uint64_t បានតែអាន
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t បានតែអាន
pcie1_អាន gperf.FAB_PCIE1_RD hex uint64_t បានតែអាន
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t បានតែអាន
upi_read gperf.FAB_UPI_RD hex uint64_t បានតែអាន
upi_write gperf.FAB_UPI_WR hex uint64_t បានតែអាន

ច្រកបឋមកថា sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
id port_header.capability.port_number ទសភាគ 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 hex 16-byte បានតែអាន

កំហុសច្រក sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file វាល mmio ប្រភេទ ការចូលប្រើ
កំហុស perror.port_error hex uint64_t បានតែអាន
first_error perror.port_first_error hex uint64_t បានតែអាន
first_malformed_req perror.malreq hex 16-byte បានតែអាន
ច្បាស់ កំហុស។ (កំហុសទាំងអស់) ផ្សេងៗ uint64_t សរសេរតែប៉ុណ្ណោះ

ចំណាំ៖
ដើម្បីជម្រះកំហុសច្រក អ្នកត្រូវតែសរសេរ bitmask ពិតប្រាកដនៃកំហុសបច្ចុប្បន្ន ឧទាហរណ៍ampកំហុសឆ្មា > ច្បាស់។

ប្រវត្តិកែប្រែ

កំណែឯកសារ ការផ្លាស់ប្តូរ
2017.10.02 ការចេញផ្សាយដំបូង។

ការណែនាំអំពីស្ថាបត្យកម្មកម្មវិធីបញ្ជាឧបករណ៍លីនុច OPAE Intel FPGA

ឯកសារ/ធនធាន

intel OPAE FPGA ស្ថាបត្យកម្មកម្មវិធីបញ្ជាឧបករណ៍លីនុច [pdf] ការណែនាំអ្នកប្រើប្រាស់
OPAE FPGA ស្ថាបត្យកម្មកម្មវិធីបញ្ជាឧបករណ៍លីនុច, OPAE FPGA, ស្ថាបត្យកម្មកម្មវិធីបញ្ជាឧបករណ៍លីនុច, ស្ថាបត្យកម្មកម្មវិធីបញ្ជា, ស្ថាបត្យកម្ម

ឯកសារយោង

ទុកមតិយោបល់

អាសយដ្ឋានអ៊ីមែលរបស់អ្នកនឹងមិនត្រូវបានផ្សព្វផ្សាយទេ។ វាលដែលត្រូវការត្រូវបានសម្គាល់ *