Intel-လိုဂို

intel OPAE FPGA Linux Device Driver Architecture

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-ထုတ်ကုန်

OPAE Intel FPGA Linux Device Driver Architecture

OPAE Intel FPGA ဒရိုက်ဘာသည် Intel FPGA ဖြေရှင်းချက်များနှင့် တပ်ဆင်ထားသော ပလပ်ဖောင်းများပေါ်ရှိ FPGA အရှိန်မြှင့်စက်များကို စီစဉ်သတ်မှတ်ရန်၊ အသုံးပြုသူ-အာကာသအက်ပ်လီကေးရှင်းများအတွက် အင်တာဖေ့စ်များကို ထောက်ပံ့ပေးပြီး FPGA ပြန်လည်ဖွဲ့စည်းမှု၊ ပါဝါစီမံခန့်ခွဲမှုနှင့် virtualization ကဲ့သို့သော စနစ်အဆင့်စီမံခန့်ခွဲမှုလုပ်ဆောင်ချက်များကို လုပ်ဆောင်ပေးသည်။

ဟာ့ဒ်ဝဲဗိသုကာ

OS ၏အချက်မှ viewFPGA ဟာ့ဒ်ဝဲသည် ပုံမှန် PCIe စက်တစ်ခုအဖြစ် ပေါ်လာသည်။ FPGA စက်ပစ္စည်းမမ်မိုရီကို ကြိုတင်သတ်မှတ်ထားသော ဒေတာဖွဲ့စည်းပုံ (စက်ပစ္စည်း အင်္ဂါရပ်စာရင်း) ကို အသုံးပြု၍ ဖွဲ့စည်းထားသည်။ FPGA စက်ပစ္စည်းမှ ပံ့ပိုးပေးထားသည့် အင်္ဂါရပ်များကို အောက်ပါပုံတွင် ဖော်ပြထားသည့်အတိုင်း ဤဒေတာဖွဲ့စည်းပုံများမှတစ်ဆင့် ဖော်ထုတ်နိုင်သည်-

FPGA PCIe ကိရိယာ

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

ဒရိုက်ဘာသည် PCIe SR-IOV ကို ပံ့ပိုးပေးသည့် Virtual Functions (VFs) ကို ဖန်တီးရန်အတွက် တစ်ဦးချင်းစီ accelerators များကို virtual machines များသို့ သတ်မှတ်ပေးရန်အတွက် အသုံးပြုနိုင်သည်။

Intel ကော်ပိုရေးရှင်း။ မူပိုင်ခွင့်ကိုလက်ဝယ်ထားသည်။ Intel၊ Intel လိုဂိုနှင့် အခြားသော Intel အမှတ်အသားများသည် Intel ကော်ပိုရေးရှင်း သို့မဟုတ် ၎င်း၏လုပ်ငန်းခွဲများ၏ အမှတ်တံဆိပ်များဖြစ်သည်။ Intel သည် Intel ၏ စံအာမခံချက်နှင့်အညီ ၎င်း၏ FPGA နှင့် တစ်ပိုင်းလျှပ်ကူးပစ္စည်းထုတ်ကုန်များ၏ စွမ်းဆောင်ရည်ကို လက်ရှိသတ်မှတ်ချက်များအတိုင်း အာမခံထားသော်လည်း မည်သည့်ထုတ်ကုန်နှင့်ဝန်ဆောင်မှုများကိုမဆို အသိပေးခြင်းမရှိဘဲ အချိန်မရွေး အပြောင်းအလဲပြုလုပ်ပိုင်ခွင့်ကို လက်ဝယ်ရှိပါသည်။ Intel မှ စာဖြင့် အတိအလင်း သဘောတူထားသည့်အတိုင်း ဤနေရာတွင် ဖော်ပြထားသော အချက်အလက်၊ ထုတ်ကုန် သို့မဟုတ် ဝန်ဆောင်မှုကို အသုံးပြုခြင်း သို့မဟုတ် အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော တာဝန် သို့မဟုတ် တာဝန်ခံမှု မရှိဟု ယူဆပါသည်။ Intel သုံးစွဲသူများသည် ထုတ်ဝေထားသော အချက်အလက်များနှင့် ထုတ်ကုန် သို့မဟုတ် ဝန်ဆောင်မှုများအတွက် အမှာစာမတင်မီ နောက်ဆုံးဗားရှင်းကို ရယူရန် အကြံပြုအပ်ပါသည်။

အခြားအမည်များနှင့် အမှတ်တံဆိပ်များကို အခြားသူများ၏ ပိုင်ဆိုင်မှုအဖြစ် တောင်းဆိုနိုင်ပါသည်။

Virtualized FPGA PCIe ကိရိယာ

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

FPGA စီမံခန့်ခွဲမှုအင်ဂျင် (FME)
FPGA Management Engine သည် ပါဝါနှင့် အပူပိုင်းစီမံခန့်ခွဲမှု၊ အမှားအယွင်းအစီရင်ခံခြင်း၊ ပြန်လည်ဖွဲ့စည်းခြင်း၊ စွမ်းဆောင်ရည်အစီရင်ခံခြင်းနှင့် အခြားအခြေခံအဆောက်အအုံလုပ်ဆောင်ချက်များကို လုပ်ဆောင်သည်။ FPGA တစ်ခုစီတွင် Physical Function (PF) မှတဆင့် အမြဲဝင်ရောက်သည့် FME တစ်ခုစီရှိသည်။ အသုံးပြုသူ-အာကာသအက်ပ်လီကေးရှင်းများသည် open() ကိုအသုံးပြု၍ FME သို့ သီးသန့်ဝင်ရောက်ခွင့်ကို ရယူနိုင်ပြီး အခွင့်ထူးခံအသုံးပြုသူ (root) အဖြစ် close() ကို အသုံးပြု၍ ၎င်းအား ထုတ်လွှတ်နိုင်သည်။

ဆိပ်ကမ်း
Port သည် static FPGA ထည် (“FPGA Interface Manager (FIM)”) နှင့် Accelerator Function (AF) ပါဝင်သော တစ်စိတ်တစ်ပိုင်း ပြန်လည်ပြင်ဆင်နိုင်သော ဒေသကို ကိုယ်စားပြုသည်။ Port သည် ဆော့ဖ်ဝဲလ်မှ အရှိန်မြှင့်စက်သို့ ဆက်သွယ်မှုကို ထိန်းချုပ်ပြီး ပြန်လည်သတ်မှတ်ခြင်းနှင့် အမှားရှာပြင်ခြင်းကဲ့သို့သော အင်္ဂါရပ်များကို ဖော်ထုတ်ပေးသည်။ PCIe စက်ပစ္စည်းတွင် Ports အများအပြားရှိနိုင်ပြီး FME စက်ပေါ်ရှိ FPGA_FME_PORT_ASSIGN ioctl ကို အသုံးပြု၍ ၎င်းအား သတ်မှတ်ပေးခြင်းဖြင့် Port တစ်ခုစီကို VF မှတစ်ဆင့် ဖော်ထုတ်နိုင်ပါသည်။

Accelerator Function (AF) ယူနစ်

  • Accelerator Function (AF) ယူနစ်ကို ဆိပ်ကမ်းတစ်ခုတွင် ချိတ်ဆက်ထားပြီး အရှိန်မြှင့်စက်-သီးသန့် ထိန်းချုပ်မှုစာရင်းများအတွက် အသုံးပြုရန်အတွက် အသုံးပြုရန် 256K MMIO ဒေသကို ဖော်ထုတ်ပေးပါသည်။
  • User-space အပလီကေးရှင်းများသည် Port စက်ပစ္စည်းပေါ်ရှိ open() ကို အသုံးပြု၍ ဆိပ်ကမ်းတစ်ခုနှင့် ချိတ်ဆက်ထားသော AFU သို့ သီးသန့်ဝင်ရောက်ခွင့်ကို ရယူနိုင်ပြီး close() ကို အသုံးပြု၍ ၎င်းကို လွှတ်ပေးနိုင်သည်။
  • အသုံးပြုသူ-အာကာသအပလီကေးရှင်းများသည် mmap() အရှိန်မြှင့်ကိရိယာ MMIO ဒေသများကိုလည်း လုပ်ဆောင်နိုင်သည်။

တစ်စိတ်တစ်ပိုင်း ပြန်လည်ပြင်ဆင်ခြင်း။
အထက်တွင်ဖော်ပြခဲ့သည့်အတိုင်း Accelerator Function (AF) ၏ တစ်စိတ်တစ်ပိုင်း ပြန်လည်ဖွဲ့စည်းမှုဖြင့် အရှိန်မြှင့်စက်များကို ပြန်လည်ပြင်ဆင်နိုင်သည်။ file. Accelerator Function (AF) ကို အတိအကျ FIM နှင့် FPGA ၏ ပစ်မှတ်ထားသော အငြိမ်ဒေသ (Port) အတွက် ထုတ်ပေးရပါမည်။ မဟုတ်ပါက၊ ပြန်လည်ဖွဲ့စည်းမှုလုပ်ဆောင်မှုသည် ကျရှုံးမည်ဖြစ်ပြီး စနစ်မတည်ငြိမ်မှုကို ဖြစ်စေနိုင်သည်။ FME မှ sysfs မှတဆင့် FME မှထုတ်လွှတ်သော interface ID နှင့် AF ခေါင်းစီးတွင်ဖော်ပြထားသော interface ID ကို နှိုင်းယှဉ်ခြင်းဖြင့် ဤလိုက်ဖက်ညီမှုကို စစ်ဆေးနိုင်ပါသည်။ ပြန်လည်ဖွဲ့စည်းမှု IOCTL ကို မခေါ်ဆိုမီ အသုံးပြုသူနေရာက ဤစစ်ဆေးမှုကို အများအားဖြင့် လုပ်ဆောင်သည်။

မှတ်ချက် -
လက်ရှိတွင်၊ တစ်စိတ်တစ်ပိုင်းပြန်လည်ဖွဲ့စည်းမှုမလုပ်ဆောင်မီ FPGA ကို အသုံးပြုနေသည့် မည်သည့်ဆော့ဖ်ဝဲလ်ပရိုဂရမ်ကိုမဆို ပိတ်ထားရပါမည်။ အဆင့်များသည်-

  1. ယာဉ်မောင်းကို ဧည့်သည်မှ ဖြုတ်ပါ။
  2. VF ကို ဧည့်သည်မှ ဖြုတ်ပါ။
  3. SR-IOV ကို ပိတ်ပါ။
  4. တစ်စိတ်တစ်ပိုင်း ပြန်လည်ပြင်ဆင်ခြင်းကို လုပ်ဆောင်ပါ။
  5. SR-IOV ကိုဖွင့်ပါ။
  6. VF ကို ဧည့်သည်ထံ ချိတ်ပါ။
  7. ဧည့်ခန်းထဲတွင် ယာဉ်မောင်းကို တင်ပါ။

FPGA Virtualization
VM တွင်လည်ပတ်နေသော application များမှ accelerator ကိုဝင်ရောက်အသုံးပြုရန်၊ သက်ဆိုင်ရာ AFU ၏ port ကိုအောက်ပါအဆင့်များကိုအသုံးပြု၍ VF သို့သတ်မှတ်ပေးရန်လိုအပ်သည်-

  1. PF သည် ပုံမှန်အားဖြင့် AFU port အားလုံးကို ပိုင်ဆိုင်သည်။ VF သို့ ပြန်လည်သတ်မှတ်ရန် လိုအပ်သည့် မည်သည့် port ကို FME စက်ပစ္စည်းပေါ်ရှိ FPGA_FME_PORT_RELEASE ioctl မှတစ်ဆင့် PF မှ ဦးစွာထုတ်လွှတ်ရပါမည်။
  2. N port များကို PF မှထုတ်လွှတ်လိုက်သည်နှင့် SRIOV နှင့် VFs ကိုဖွင့်ရန်အောက်ပါ command ကိုအသုံးပြုနိုင်ပါသည်။ VF တစ်ခုစီသည် AFU နှင့် တစ်ခုတည်းသော ဆိပ်ကမ်းကို ပိုင်ဆိုင်သည်။ ပဲ့တင်သံ N > PCI_DEVICE_PATH/sriov_numvfs
  3. VFs မှတဆင့် VMs သို့ဖြတ်သန်းပါ။
  4. VF အောက်ရှိ AFU သည် VM ရှိ အပလီကေးရှင်းများ (VF အတွင်းတွင် တူညီသောဒရိုက်ဗာကို အသုံးပြု၍) သုံးစွဲနိုင်သည်။

မှတ်ချက် -
FME တစ်ခုအား VF သို့ တာဝန်မပေးအပ်နိုင်ပါ၊ ထို့ကြောင့် PR နှင့် အခြားသော စီမံခန့်ခွဲမှုလုပ်ဆောင်ချက်များကို PF မှတဆင့်သာ ရရှိနိုင်ပါသည်။

ယာဉ်မောင်းအဖွဲ့

PCIe Module Device Driver

ယာဉ်မောင်းအဖွဲ့

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

FPGA ကိရိယာများသည် ပုံမှန် PCIe ကိရိယာများအဖြစ် ပေါ်လာသည်။ ထို့ကြောင့် FPGA PCIe စက်ပစ္စည်းဒရိုက်ဗာ (intel-FPGA-PCI.ko) သည် FPGA PCIe PF သို့မဟုတ် VF ကိုတွေ့ရှိသည်နှင့် အမြဲတမ်း ဦးစွာတင်ထားသည်။ ဤယာဉ်မောင်းသည် ယာဉ်မောင်းဗိသုကာတွင် အခြေခံအဆောက်အအုံဆိုင်ရာ အခန်းကဏ္ဍမှ ပါဝင်ပါသည်။ ၎င်း-

  • အင်္ဂါရပ်ကိရိယာများ၏ ပင်မအဖြစ် FPGA ကွန်တိန်နာစက်ကို ဖန်တီးသည်။
  • အင်္ဂါရပ်ကိရိယာများနှင့် ၎င်းတို့၏ အင်္ဂါရပ်ခွဲများကို ရှာဖွေရန်နှင့် ကွန်တိန်နာစက်အောက်တွင် ၎င်းတို့အတွက် ပလပ်ဖောင်းစက်ပစ္စည်းများကို ဖန်တီးရန်အတွက် PCIe စက်ပစ္စည်း BAR မန်မိုရီတွင် အကောင်အထည်ဖော်ထားသည့် စက်ပစ္စည်း အင်္ဂါရပ်စာရင်းကို ဖြတ်လျှောက်ပါ။
  • SR-IOV ကို ပံ့ပိုးပေးသည်။
  • အင်္ဂါရပ်ခွဲများအတွက် သရုပ်ဖော်လုပ်ဆောင်မှုများကို လုပ်ဆောင်ပေးကာ စက်ပစ္စည်းဒရိုက်ဗာများကို ဖော်ညွှန်းရန်အတွက် ဘုံလုပ်ဆောင်ချက်များကို ဖော်ထုတ်ပေးသည့် အင်္ဂါရပ်စက်ပစ္စည်း အခြေခံအဆောက်အအုံကို မိတ်ဆက်သည်။

PCIe Module Device Driver လုပ်ဆောင်ချက်များ

  • PCIe ရှာဖွေတွေ့ရှိမှု၊ စက်ပစ္စည်းစာရင်းကောက်ယူခြင်းနှင့် အင်္ဂါရပ်ရှာဖွေတွေ့ရှိမှုတို့ ပါဝင်သည်။
  • ပင်မစက်ပစ္စည်းအတွက် sysfs လမ်းညွှန်များ၊ FPGA စီမံခန့်ခွဲမှုအင်ဂျင် (FME) နှင့် ဆိပ်ကမ်းတို့ကို ဖန်တီးပေးသည်။
  • Linux kernel သည် ၎င်းတို့၏ သက်ဆိုင်ရာ ပလပ်ဖောင်း မော်ဂျူးဒရိုက်ဗာများကို တင်နိုင်စေသည့် ပလပ်ဖောင်းဒရိုင်ဘာ ဖြစ်ရပ်များကို ဖန်တီးပေးသည်။

FME Platform Module Device Driver

  • ပါဝါနှင့် အပူပိုင်းစီမံခန့်ခွဲမှု၊ အမှားအယွင်းအစီရင်ခံခြင်း၊ စွမ်းဆောင်ရည်အစီရင်ခံခြင်းနှင့် အခြားအခြေခံအဆောက်အအုံလုပ်ဆောင်ချက်များ။ FME ဒရိုက်ဘာမှ ဖော်ထုတ်ထားသော sysfs အင်တာဖေ့စ်များမှတစ်ဆင့် ဤလုပ်ဆောင်ချက်များကို သင်ဝင်ရောက်နိုင်သည်။
  • တစ်စိတ်တစ်ပိုင်း ပြန်လည်ပြင်ဆင်ခြင်း။ FME ဒရိုက်ဘာသည် PR အင်္ဂါရပ်ခွဲများ အစပြုချိန်အတွင်း FPGA မန်နေဂျာကို မှတ်ပုံတင်သည်။ ၎င်းသည် သင့်ထံမှ FPGA_FME_PORT_PR ioctl တစ်ခုကို လက်ခံရရှိသည်နှင့်၊ ၎င်းသည် ပေးထားသော ပို့တ်သို့ bitstream ၏ တစ်စိတ်တစ်ပိုင်း ပြန်လည်ဖွဲ့စည်းမှုကို အပြီးသတ်ရန်အတွက် FPGA Manager မှ ဘုံအင်တာဖေ့စ်လုပ်ဆောင်ချက်ကို ခေါ်ဆိုသည်။
  • virtualization အတွက် ဆိပ်ကမ်းစီမံခန့်ခွဲမှု။ FME ဒရိုက်ဘာသည် FPGA_FME_PORT_RELEASE မှ ပေးထားသော Port ကို ထုတ်လွှတ်သည့် ioctls နှစ်ခုကို မိတ်ဆက်ပေးသည်။ Port ကို PF သို့ ပြန်သတ်မှတ်ပေးသော FPGA_FME_PORT_ASSIGN Port ကို PF မှ ထုတ်လွှတ်လိုက်သည်နှင့် PCIe driver မှပေးသော SR-IOV အင်တာဖေ့စ်များမှတဆင့် ၎င်းအား VF သို့ သတ်မှတ်ပေးနိုင်ပါသည်။ နောက်ထပ်အချက်အလက်များအတွက် "FPGA Virtualization" ကို ကိုးကားပါ။

FME Platform Module Device Driver Functions

  • FME ဇာတ်ကောင် ကိရိယာ ခုံးကို ဖန်တီးသည်။
  • FME sysfs ကိုဖန်တီးပါ။ files နှင့် FME sysfs ကိုအကောင်အထည်ဖော်သည်။ file ဆက်စပ်ပစ္စည်းများ။
  • FME သီးသန့်အင်္ဂါရပ်ခွဲ ယာဉ်မောင်းများကို အကောင်အထည်ဖော်ပါ။
  • FME သီးသန့် အင်္ဂါရပ်ခွဲ ယာဉ်မောင်းများ-
    • FME ခေါင်းစီး
    • အပူစီမံခန့်ခွဲမှု
    • ပါဝါစီမံခန့်ခွဲမှု
    • ကမ္ဘာလုံးဆိုင်ရာ အမှား
    • တစ်စိတ်တစ်ပိုင်း ပြန်လည်ပြင်ဆင်ခြင်း။
    • ကမ္ဘာလုံးဆိုင်ရာစွမ်းဆောင်ရည်

Port Platform Module Device Driver
FME ဒရိုက်ဘာနှင့်ဆင်တူသည်၊ FPGA Port (နှင့် AFU) ဒရိုက်ဘာ (intel-fpga-afu. ko) ကို Port ပလပ်ဖောင်းစက်ပစ္စည်းကို ဖန်တီးပြီးသည်နှင့် စမ်းသပ်စစ်ဆေးသည်။ ဤ module ၏အဓိကလုပ်ဆောင်ချက်မှာ ဆိပ်ကမ်းရှိ အခြေခံပြန်လည်သတ်မှတ်မှုထိန်းချုပ်မှု၊ AFU MMIO ဒေသတင်ပို့မှု၊ DMA ကြားခံမြေပုံဆွဲခြင်းဝန်ဆောင်မှု၊ UMsg(1) အသိပေးချက်နှင့် အဝေးထိန်းအမှားရှာပြင်ခြင်းလုပ်ဆောင်ချက်များအပါအဝင် အသုံးပြုသူ-အာကာသအက်ပ်လီကေးရှင်းများအတွက် အင်တာဖေ့စ်ကို ပံ့ပိုးပေးရန်ဖြစ်သည်။ အပေါ်ကိုကြည့်ပါ)။

UMsg ကို Intel Xeon® ပရိုဆက်ဆာအတွက် Acceleration Stack မှတဆင့်သာ ပံ့ပိုးပေးပါသည်။

Port Platform Module Device Driver Functions

  • Port character device node ကိုဖန်တီးပါ။
  • Port sysfs ကိုဖန်တီးပါ။ files နှင့် Port sysfs ကိုအကောင်အထည်ဖော်သည်။ file ဆက်စပ်ပစ္စည်းများ။
  • Port သီးသန့်အင်္ဂါရပ်ခွဲ ဒရိုက်ဗာများကို အကောင်အထည်ဖော်ပါ။
  • ဆိပ်ကမ်းသီးသန့် အင်္ဂါရပ်ခွဲ ဒရိုက်ဗာများ-
    • Port Header
    • AFU
    • Port Error
    • UMsg(2)
    • အချက်ပြမှုကို နှိပ်ပါ။

အပလီကေးရှင်း FPGA စက်ပစ္စည်းစာရင်းကောက်ယူခြင်း။
ဤကဏ္ဍတွင် အပလီကေးရှင်းများက FPGA စက်ပစ္စည်းအား /sys/class/fpga အောက်ရှိ sysfs အထက်တန်းအဆင့်မှ FPGA ကိရိယာကို ရေတွက်ပုံအကြောင်း မိတ်ဆက်ပေးသည်။ ဟောင်းထဲမှာampအောက်တွင်၊ Intel FPGA စက်နှစ်လုံးကို host တွင် ထည့်သွင်းထားသည်။ FPGA စက်တစ်ခုစီတွင် FME တစ်ခုနှင့် Port နှစ်ခု (AFU) ရှိသည်။ FPGA စက်တစ်ခုစီအတွက်၊ /sys/class/fpga အောက်တွင် စက်ပစ္စည်းလမ်းညွှန်တစ်ခုကို ဖန်တီးထားသည်-

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

node တစ်ခုစီတွင် FME တစ်ခုနှင့် Ports နှစ်ခု (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/

ကွန်တိန်နာ ကိရိယာ အားလုံးကို ငါ ဆက်တိုက် နံပါတ်တပ်ပြီး FME ၏ နံပါတ်စဉ် နှင့် k အားလုံးကို ဆိပ်ကမ်း အားလုံးကို ဆက်တိုက် နံပါတ်စဉ် ပေးသည်။

ioctl() နှင့် mmap() အတွက် အသုံးပြုသည့် စက်ပစ္စည်း node များကို ကိုးကားနိုင်သည်-
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe Driver စာရင်းကောက်ယူခြင်း။
ဤအပိုင်းကိုအဆုံးသတ်ပေးသည်view intel-fpga-pci.ko မှလုပ်ဆောင်သော စက်စာရင်းကောက်ယူခြင်းအတွက် ကုဒ်စီးဆင်းမှု။ ပင်မဒေတာဖွဲ့စည်းပုံနှင့် လုပ်ဆောင်ချက်များကို မီးမောင်းထိုးပြထားသည်။ ဒီပုဒ်မကို အကောင်းဆုံး လိုက်နာလိုက်တာ viewပူးတွဲပါအရင်းအမြစ်ကုဒ် (pcie.c) ပါဝင်သည်။

စာရင်းကောက်ခြင်း ဒေတာဖွဲ့စည်းပုံများ

enum fpga_id_type {
PARENT_ID၊
FME_ID၊
PORT_ID၊
FPGA_ID_MAX
};
static struct idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *အမည်;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME }၊
{ .name = FPGA_FEATURE_DEV_PORT }၊
};
static struct class *fpga_class;
static struct 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၊}
};
static struct 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
};
struct cci_drvdata {
int device_id;
struct device *fme_dev;
struct mutex သော့ခတ်;
struct list_head port_dev_list;
int release_port_num;
struct list_head ဒေသများ;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
__iomem *ioaddr ပျက်ပြယ်သည်၊
__ioem *ioend;
int လက်ရှိ_bar;
__ioem *pfme_hdr;
struct device *parent_dev;
struct platform_device *feature_dev;
};

စာရင်းကောက်မှု စီးဆင်းမှု

  • ccidrv_init()
    • idr_init() ကို အသုံးပြု၍ fpga_ids ကို စတင်ပါ။
    • 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()
    • struct build_feature_devs_info ကို ခွဲဝေသတ်မှတ်ပါ၊ ၎င်းကို စတင်ပါ။
      .parent_dev ကို FME နှင့် Port sysfs လမ်းညွှန်များပါ၀င်သော parent sysfs လမ်းညွှန် (intel-fpga-dev.id) သို့ သတ်မှတ်ထားသည်။
  • parse_feature_list()
    • FME၊ ဆိပ်ကမ်းနှင့် ၎င်းတို့၏ သီးသန့်အင်္ဂါရပ်များကို ရှာဖွေတွေ့ရှိရန် BAR0 စက်ပစ္စည်း အင်္ဂါရပ်စာရင်းကို လျှောက်လှမ်းပါ။
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • FME ကြုံတွေ့ရသောအခါ၊
  • build_info_create_dev()
    • build_feature_devs_info.feature_dev တွင် သိမ်းဆည်းထားသည့် FME အတွက် ပလပ်ဖောင်းစက်ပစ္စည်းတစ်ခုကို ခွဲဝေချထားပါ။
    • feature_dev.id ကို idr_alloc(fpga_ids[FME_ID]၊
    • feature_dev.parent ကို build_feature_devs_info.parent_dev ဟု သတ်မှတ်ထားသည်။
    • feature_dev.resource တွင် တည်ဆောက်ပုံအရင်းအမြစ်များ၏ array တစ်ခုအား ခွဲဝေသတ်မှတ်ပါ။
  • struct feature_platform_data တစ်ခုကို ခွဲဝေသတ်မှတ်ပါ၊ ၎င်းကို အစပြုပြီး feature_dev.dev.platform_data တွင် pointer တစ်ခုကို သိမ်းဆည်းပါ။
    • 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()
    • Port တစ်ခုတွေ့သောအခါ
  • build_info_create_dev()
    • build_feature_devs_info.feature_dev တွင် သိမ်းဆည်းထားသည့် Port အတွက် ပလပ်ဖောင်းစက်ပစ္စည်းတစ်ခုကို ခွဲဝေချထားပါ။
    • feature_dev.id ကို idr_alloc(fpga_ids[PORT_ID]၊
    • feature_dev.parent ကို build_feature_devs_info.parent_dev ဟု သတ်မှတ်ထားသည်။
    • feature_dev.resource တွင် struct resource အခင်းအကျင်းတစ်ခုကို ခွဲဝေသတ်မှတ်ပါ။
    • struct feature_platform_data တစ်ခုကို ခွဲဝေသတ်မှတ်ပါ၊ ၎င်းကို အစပြုပြီး feature_dev.dev.platform_data တွင် pointer တစ်ခုကို သိမ်းဆည်းပါ။
  • build_info_commit_dev()
    • Port အတွက် 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()
  • Port သီးသန့်အင်္ဂါရပ်တစ်ခုကို ကြုံတွေ့ရသောအခါ- *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()
    • အကယ်၍ ယာဉ်မောင်းအား Physical Function (PF) တွင် တင်ထားပါက၊
  • FME ခေါင်းစီးတွင် ဖော်ပြထားသော ပို့တ်တစ်ခုစီတွင် parse_feature_list() စီးဆင်းမှုကို လုပ်ဆောင်ပါ။
  • ခေါင်းစီးရှိ Port entry တစ်ခုစီတွင် ဖော်ပြထားသော BAR ကို အသုံးပြုပါ။

FME ပလပ်ဖောင်း စက်ပစ္စည်း စတင်ခြင်း
ဤအပိုင်းကိုအဆုံးသတ်ပေးသည်view intel-fpga-fme.ko မှလုပ်ဆောင်သော FME စက်ပစ္စည်း အစပြုခြင်းအတွက် ကုဒ်စီးဆင်းမှု။ ပင်မဒေတာဖွဲ့စည်းပုံနှင့် လုပ်ဆောင်ချက်များကို အထူးအသားပေးထားသည်။ ဒီပုဒ်မကို အကောင်းဆုံး လိုက်နာလိုက်တာ 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၊
လက်မှတ်မထိုးထားသော int cmd၊ လက်မှတ်မထိုးထားသော long arg);
int (*test)(struct platform_device *pdev၊ struct feature *feature);
};
တည်ဆောက်ပုံအင်္ဂါရပ် {
const char *အမည်;
int resource_index;
__iomem *ioaddr ပျက်ပြယ်သည်၊
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex သော့ခတ်;
လက်မှတ်မထိုးထားသော ရှည်လျားသော dev_status;
struct cdev cdev;
struct platform_device *dev;
လက်မှတ်မထိုးထားသော 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 id ကို;
const struct attribute_group **attr_groups;
struct device *fme_dev;
struct list_head node;
struct list_head ကလေးများ;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct device *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME Platform Device Initialization Flow

FME စတင်ခြင်း စီးဆင်းမှုintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • struct fpga_fme ကို စတင်ပြီး feature_platform_data.private အကွက်တွင် သိမ်းဆည်းပါ။
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • ပြည့်နေသောအင်္ဂါရပ်တစ်ခုစီအတွက် struct feature_ops ကို feature_platform_data.features တွင် သိမ်းဆည်းပါ။
    • struct မှ test function ကိုခေါ်ပါ။
    • struct မှ init function ကိုခေါ်ပါ။
  • fme_probe() fpga_register_dev_ops()
    • ဖွဲ့စည်းတည်ဆောက်ပုံကို မှတ်ပုံတင်ပြီး FME ဇာတ်ကောင် ကိရိယာကို ဖန်တီးပါ။ file_လုပ်ငန်းများ

Port Platform Device ကို စတင်ခြင်း
ဤအပိုင်းကိုအဆုံးသတ်ပေးသည်view intel-fpga-afu.ko မှလုပ်ဆောင်သော port device အစပြုခြင်းအတွက် ကုဒ်စီးဆင်းမှု။ ပင်မဒေတာဖွဲ့စည်းပုံနှင့် လုပ်ဆောင်ချက်များကို မီးမောင်းထိုးပြထားသည်။ ဒီပုဒ်မကို အကောင်းဆုံး လိုက်နာလိုက်တာ viewပါ၀င်သောအရင်းအမြစ်ကုဒ် (afu.c) ပါဝင်သည်။

Port Platform Device Data Structures

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၊
လက်မှတ်မထိုးထားသော int cmd၊ လက်မှတ်မထိုးထားသော long arg);
int (*test)(struct platform_device *pdev၊ struct feature *feature);
};
တည်ဆောက်ပုံအင်္ဂါရပ် {
const char *အမည်;
int resource_index;
__iomem *ioaddr ပျက်ပြယ်သည်၊
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex သော့ခတ်;
လက်မှတ်မထိုးထားသော ရှည်လျားသော dev_status;
struct cdev cdev;
struct platform_device *dev;
လက်မှတ်မထိုးထားသော 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 fpga_afu_region {
u32 အညွှန်း;
u32 အလံများ;
u64 အရွယ်အစား;
u64 အော့ဖ်ဆက်;
u64 phys;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 အရှည်;
u64 iova;
တည်ဆောက်မှုစာမျက်နှာ ** စာမျက်နှာများ;
struct rb_node node;
bool in_use;
};
တည်ဆောက်ပုံ fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head ဒေသများ;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Port Platform Device Initialization Flow

Port Initialization Flowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • struct fpga_afu ကို စတင်ပြီး feature_platform_data.private အကွက်တွင် သိမ်းဆည်းပါ။
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • ပြည့်နေသောအင်္ဂါရပ်တစ်ခုစီအတွက် struct feature_ops ကို feature_platform_data.features တွင် သိမ်းဆည်းပါ။
    • struct မှ test function ကိုခေါ်ပါ။
    • struct မှ init function ကိုခေါ်ပါ။
  • afu_probe() fpga_register_dev_ops()
    • struct ကိုမှတ်ပုံတင်ပြီး Port character device node ကိုဖန်တီးပါ။ file_လုပ်ငန်းများ

FME IOCTLs
IOCTLs များကို ဖွင့်ခြင်းဟု ခေါ်သည်။ file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION အတွက် ဖော်ပြချက်- 0 မှစတင်၍ လက်ရှိဗားရှင်းကို ကိန်းပြည့်အဖြစ် ပြန်ပေးသည်။

FPGA_CHECK_EXTENSION—လောလောဆယ် ပံ့ပိုးမထားပါ။

FPGA_FME_PORT_RELEASE—arg သည် a ကိုညွှန်ပြသည်-

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 အလံများ; // in: 0 ဖြစ်ရမည်။
__u32 port_id; // in: port ID (0) မှ release လုပ်ပါ။
};

FPGA_FME_PORT_ASSIGN—arg သည် a ကိုညွှန်ပြသည်-

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 အလံများ; // in: 0 ဖြစ်ရမည်။
__u32 port_id; // in: port ID (0) မှ assign ။ (ဖြစ်မယ်။
FPGA_FME_PORT_RELEASE မှ ယခင်ထုတ်ခဲ့သည်)
};

FPGA_FME_PORT_PR—arg သည် ညွှန်ပြချက်တစ်ခုဖြစ်သည်-

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 အလံများ; // in: 0 ဖြစ်ရမည်။
__u32 port_id; // in: port ID (0 မှ)
__u32 ကြားခံ_အရွယ်အစား; // in: bytes အတွင်းရှိ bitstream ကြားခံ၏အရွယ်အစား။ 4-byte ဖြစ်ရမည်။
ညှိထားသည်။
__u64 ကြားခံ_လိပ်စာ; // in: bitstream ကြားခံ၏ လုပ်ငန်းစဉ်လိပ်စာ
__u64 အခြေအနေ၊ // out: အမှားအယွင်းအခြေအနေ (bitmask)
};

IOCTLs ဆိပ်ကမ်းများ
IOCTLs များကို ဖွင့်ခြင်းဟု ခေါ်သည်။ file /dev/intel-fpga-port.k FPGA_GET_API_VERSION အတွက် ဖော်ပြချက်— 0 မှစတင်၍ လက်ရှိဗားရှင်းကို ကိန်းပြည့်အဖြစ် ပြန်ပေးသည်။ FPGA_CHECK_EXTENSION—လောလောဆယ် ပံ့ပိုးမထားပါ။

FPGA_PORT_GET_INFO—arg သည် ညွှန်ပြချက်တစ်ခုဖြစ်သည်-

struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 အလံများ; // out: 0 ပြန်လာသည်
__u32 num_regions; // out: MMIO ဒေသအရေအတွက်၊ 2 (AFU အတွက် 1 ခုနှင့် 1 အတွက်
STP)
__u32 num_umsgs; // out: ဟာ့ဒ်ဝဲမှပံ့ပိုးထားသော UMsg အရေအတွက်
};

FPGA_PORT_GET_REGION_INFO—arg သည် a ကိုညွှန်ပြသည်-

struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 အလံများ; // out: (bitmask) { FPGA_REGION_READ၊ FPGA_REGION_WRITE၊
FPGA_REGION_MMAP }
__u32 အညွှန်း; // တွင်- FPGA_PORT_INDEX_UAFU သို့မဟုတ် FPGA_PORT_INDEX_STP
__u32 padding; // in: 0 ဖြစ်ရမည်။
__u64 အရွယ်အစား; // out: bytes ဖြင့် MMIO ဒေသ၏ အရွယ်အစား
__u64 ထေရ; // out: စက်ပစ္စည်း fd စတင်ချိန်မှ MMIO ဒေသ၏ offset
};

FPGA_PORT_DMA_MAP—arg သည် ညွှန်ပြချက်တစ်ခုဖြစ်သည်-
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 အလံများ; // in: 0 __u64 user_addr ဖြစ်ရမည်။ // in: လုပ်ငန်းစဉ် virtual
လိပ်စာ။ စာမျက်နှာကို ချိန်ညှိရပါမည်။
__u64 အရှည်; // in: ဘိုက်ဖြင့် မြေပုံဆွဲခြင်း အရှည်။ စာမျက်နှာများစွာရှိရမည်။
အရွယ်အစား။
__u64 iova; // out: IO virtual address };

FPGA_PORT_DMA_UNMAP—arg သည် a ကိုညွှန်ပြသည်-
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 အလံများ; // in: 0 ဖြစ်ရမည်။
__u64 iova; // in: IO virtual address ကို ယခင်တစ်ခုက ပြန်ပေးသည်။
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 သည် a ကိုညွှန်ပြသည်-

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 အလံများ; // in: 0 ဖြစ်ရမည်။
__u32 အရိပ်အမြွက်_bitmap; // in: UMsg အရိပ်အမြွက်မုဒ် ဘစ်မြေပုံ။ မည်သည့် UMsg ကို ဆိုလိုသည်
ဖွင့်ထားသည်။
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • ဤ ioctl ကို မထုတ်ပေးမီ UMsg ကို ပိတ်ရပါမည်။
  • iova အကွက်သည် UMsg (num_umsgs * PAGE_SIZE) အားလုံးအတွက် လုံလောက်သော ကျယ်ဝန်းသော ကြားခံတစ်ခုအတွက် ဖြစ်ရပါမည်။
    • ယာဉ်မောင်း၏ ကြားခံစီမံခန့်ခွဲမှုက "အသုံးပြုနေသည်" အဖြစ် ကြားခံကို အမှတ်အသားပြုထားသည်။
    • iova သည် NULL ဖြစ်ပါက၊ ယခင်ဒေသကို "အသုံးပြုနေသည်" အဖြစ် အမှတ်အသားမှ ဖြုတ်ထားသည်။
  • arg သည် a ကိုညွှန်ပြသည်-
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • u32 အလံများ; // in: 0 ဖြစ်ရမည်။
    • u64 iova; // in: FPGA_PORT_DMA_MAP မှ IO virtual လိပ်စာ။ };

မှတ်ချက် -

  • port error များကိုရှင်းရန်၊ ဥပမာအားဖြင့်၊ သင်သည် လက်ရှိ error များ၏ bitmask အတိအကျကို ရေးရပါမည်။ample, cat errors > ရှင်းပါတယ်။
  • UMsg ကို Integrated FPGA ဖြင့် Intel Xeon ပရိုဆက်ဆာအတွက် Acceleration Stack မှတဆင့်သာ ပံ့ပိုးပေးပါသည်။

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 အပူပိုင်းစီမံခန့်ခွဲမှု sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio အကွက် အမျိုးအစား ဝင်ရောက်ခွင့်
အဆင့် ၁ thermal.threshold.tmp_thshold1 ဒဿမ int အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
အဆင့် ၁ thermal.threshold.tmp_thshold2 ဒဿမ int အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
threshold_trip thermal.threshold.therm_trip_thshold ဒဿမ int ဖတ်ရန်သာ
အဆင့်၁_ရောက်ရှိ thermal.threshold.thshold1_အခြေအနေ ဒဿမ int ဖတ်ရန်သာ
အဆင့်၁_ရောက်ရှိ thermal.threshold.thshold2_အခြေအနေ ဒဿမ int ဖတ်ရန်သာ
အဆင့် ၁_မူဝါဒ အပူ။ threshold.thshold_policy ဒဿမ int အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
အပူချိန် 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 hex uint64_t ဖတ်ရန်သာ
အဆင့် ၁ power.threshold.threshold1 hex uint64_t အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
အဆင့် ၁ power.threshold.threshold2 hex uint64_t အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
အဆင့် ၁_အခြေအနေ power.threshold.threshold1_အခြေအနေ ဒဿမ လက်မှတ်မထိုး ဖတ်ရန်သာ
အဆင့် ၁_အခြေအနေ 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_errors gerror.pcie0_err hex uint64_t ဖတ်ရေး
pcie1_errors 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 ဖတ်ရန်သာ
ပထမ_အမှား 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 အတိအကျကို ရေးရပါမည်။ample cat errors > ရှင်းပါတယ်။

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/ (FPGAs ရှိသော Intel Xeon CPU အတွက် Acceleration Stack အတွက် မမှန်ကန်ပါ)

sysfs file mmio အကွက် အမျိုးအစား ဝင်ရောက်ခွင့်
အေးခဲ gperf.ch_ctl.freeze ဒဿမ int ဖတ်ရေး
read_hit gperf.CACHE_RD_HIT hex uint64_t ဖတ်ရန်သာ
read_mis gperf.CACHE_RD_MISS hex uint64_t ဖတ်ရန်သာ
write_hit gperf.CACHE_WR_HIT hex uint64_t ဖတ်ရန်သာ
write_mis 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 ဖတ်ရန်သာ
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/ (FPGAs ရှိသော Intel Xeon CPU အတွက် Acceleration Stack အတွက် မမှန်ကန်ပါ)

sysfs file mmio အကွက် အမျိုးအစား ဝင်ရောက်ခွင့်
အေးခဲ gperf.vtd_ctl.freeze ဒဿမ int အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGAs ပါသော Intel Xeon CPU အတွက် Acceleration Stack အတွက် မမှန်ကန်ပါ)

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 အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
အေးခဲ gperf.fab_ctl.freeze ဒဿမ int အသုံးပြုသူ- Read-only Root- ဖတ်-ရေး
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_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_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_read gperf.FAB_UPI_RD hex uint64_t ဖတ်ရန်သာ
upi_write gperf.FAB_UPI_WR hex uint64_t ဖတ်ရန်သာ

Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio အကွက် အမျိုးအစား ဝင်ရောက်ခွင့်
id port_header.capability.port_number ဒဿမ int ဖတ်ရန်သာ
ltr port_header.control.latency_tolerance ဒဿမ int ဖတ်ရန်သာ

Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio အကွက် အမျိုးအစား ဝင်ရောက်ခွင့်
afu_id afu_header.guid hex 16-byte ဖတ်ရန်သာ

Port Error sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio အကွက် အမျိုးအစား ဝင်ရောက်ခွင့်
အမှားများ perror.port_error hex uint64_t ဖတ်ရန်သာ
ပထမ_အမှား perror.port_first_error hex uint64_t ဖတ်ရန်သာ
first_formed_req perror.malreq hex 16-byte ဖတ်ရန်သာ
ရှင်းပါတယ်။ အမှား။(အမှားအားလုံး) uint64_t အမျိုးမျိုး ရေးရန်သာ

မှတ်ချက် -
Port error များကိုရှင်းလင်းရန်၊ ဥပမာ- လက်ရှိအမှားများ၏ bitmask အတိအကျကို ရေးရပါမည်။ample cat errors > ရှင်းပါတယ်။

ပြန်လည်ပြင်ဆင်မှုမှတ်တမ်း

စာရွက်စာတမ်းဗားရှင်း အပြောင်းအလဲများ
2017.10.02 ကနဦးဖြန့်ချိမှု။

OPAE Intel FPGA Linux Device Driver ဗိသုကာလမ်းညွှန်

စာရွက်စာတမ်းများ / အရင်းအမြစ်များ

intel OPAE FPGA Linux Device Driver Architecture [pdf] အသုံးပြုသူလမ်းညွှန်
OPAE FPGA Linux Device Driver Architecture၊ OPAE FPGA၊ Linux Device Driver Architecture၊ Driver Architecture၊ Architecture

ကိုးကား

မှတ်ချက်တစ်ခုချန်ထားပါ။

သင့်အီးမေးလ်လိပ်စာကို ထုတ်ပြန်မည်မဟုတ်ပါ။ လိုအပ်သောအကွက်များကို အမှတ်အသားပြုထားသည်။ *