intel OPAE FPGA ലിനക്സ് ഡിവൈസ് ഡ്രൈവർ ആർക്കിടെക്ചർ
OPAE ഇന്റൽ FPGA ലിനക്സ് ഡിവൈസ് ഡ്രൈവർ ആർക്കിടെക്ചർ
OPAE Intel FPGA ഡ്രൈവർ, Intel FPGA സൊല്യൂഷനുകളുള്ള പ്ലാറ്റ്ഫോമുകളിൽ FPGA ആക്സിലറേറ്ററുകൾ കോൺഫിഗർ ചെയ്യുന്നതിനും എണ്ണിക്കുന്നതിനും തുറക്കുന്നതിനും ആക്സസ് ചെയ്യുന്നതിനും ഉപയോക്തൃ-സ്പേസ് ആപ്ലിക്കേഷനുകൾക്കായി ഇന്റർഫേസുകൾ നൽകുന്നു കൂടാതെ FPGA റീകോൺഫിഗറേഷൻ, പവർ മാനേജ്മെന്റ്, വെർച്വലൈസേഷൻ തുടങ്ങിയ സിസ്റ്റം-ലെവൽ മാനേജ്മെന്റ് ഫംഗ്ഷനുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു.
ഹാർഡ്വെയർ ആർക്കിടെക്ചർ
OS-ന്റെ പോയിന്റിൽ നിന്ന് view, FPGA ഹാർഡ്വെയർ ഒരു സാധാരണ PCIe ഉപകരണമായി ദൃശ്യമാകുന്നു. എഫ്പിജിഎ ഉപകരണ മെമ്മറി ഒരു മുൻനിശ്ചയിച്ച ഡാറ്റാ ഘടന (ഉപകരണ ഫീച്ചർ ലിസ്റ്റ്) ഉപയോഗിച്ചാണ് ക്രമീകരിച്ചിരിക്കുന്നത്. FPGA ഉപകരണം പിന്തുണയ്ക്കുന്ന സവിശേഷതകൾ ഈ ഡാറ്റാ ഘടനകളിലൂടെ തുറന്നുകാട്ടപ്പെടുന്നു, ഇനിപ്പറയുന്ന ചിത്രത്തിൽ താഴെ ചിത്രീകരിച്ചിരിക്കുന്നു:
FPGA PCIe ഉപകരണം
വെർച്വൽ മെഷീനുകൾക്ക് വ്യക്തിഗത ആക്സിലറേറ്ററുകൾ നൽകുന്നതിന് ഉപയോഗിക്കാവുന്ന വെർച്വൽ ഫംഗ്ഷനുകൾ (VFs) സൃഷ്ടിക്കാൻ ഡ്രൈവർ PCIe SR-IOV-യെ പിന്തുണയ്ക്കുന്നു.
ഇന്റൽ കോർപ്പറേഷൻ. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം. ഇന്റൽ, ഇന്റൽ ലോഗോ, മറ്റ് ഇന്റൽ മാർക്കുകൾ എന്നിവ ഇന്റൽ കോർപ്പറേഷന്റെയോ അതിന്റെ അനുബന്ധ സ്ഥാപനങ്ങളുടെയോ വ്യാപാരമുദ്രകളാണ്. ഇന്റലിന്റെ സ്റ്റാൻഡേർഡ് വാറന്റിക്ക് അനുസൃതമായി അതിന്റെ എഫ്പിജിഎ, അർദ്ധചാലക ഉൽപ്പന്നങ്ങളുടെ പ്രകടനം നിലവിലെ സ്പെസിഫിക്കേഷനുകളിലേക്ക് ഇന്റൽ ഉറപ്പ് നൽകുന്നു, എന്നാൽ അറിയിപ്പ് കൂടാതെ ഏത് സമയത്തും ഏത് ഉൽപ്പന്നങ്ങളിലും സേവനങ്ങളിലും മാറ്റങ്ങൾ വരുത്താനുള്ള അവകാശം നിക്ഷിപ്തമാണ്. Intel രേഖാമൂലം രേഖാമൂലം സമ്മതിച്ചതല്ലാതെ ഇവിടെ വിവരിച്ചിരിക്കുന്ന ഏതെങ്കിലും വിവരങ്ങളുടെയോ ഉൽപ്പന്നത്തിന്റെയോ സേവനത്തിന്റെയോ ആപ്ലിക്കേഷനിൽ നിന്നോ ഉപയോഗത്തിൽ നിന്നോ ഉണ്ടാകുന്ന ഉത്തരവാദിത്തമോ ബാധ്യതയോ Intel ഏറ്റെടുക്കുന്നില്ല. ഏതെങ്കിലും പ്രസിദ്ധീകരിച്ച വിവരങ്ങളെ ആശ്രയിക്കുന്നതിന് മുമ്പും ഉൽപ്പന്നങ്ങൾക്കോ സേവനങ്ങൾക്കോ ഓർഡറുകൾ നൽകുന്നതിനുമുമ്പ് ഉപകരണ സവിശേഷതകളുടെ ഏറ്റവും പുതിയ പതിപ്പ് നേടുന്നതിന് ഇന്റൽ ഉപഭോക്താക്കളോട് നിർദ്ദേശിക്കുന്നു.
മറ്റ് പേരുകളും ബ്രാൻഡുകളും മറ്റുള്ളവരുടെ സ്വത്തായി അവകാശപ്പെടാം.
വെർച്വലൈസ്ഡ് FPGA PCIe ഉപകരണം
FPGA മാനേജ്മെന്റ് എഞ്ചിൻ (FME)
FPGA മാനേജ്മെന്റ് എഞ്ചിൻ പവർ, തെർമൽ മാനേജ്മെന്റ്, പിശക് റിപ്പോർട്ടിംഗ്, പുനർക്രമീകരണം, പ്രകടന റിപ്പോർട്ടിംഗ്, മറ്റ് ഇൻഫ്രാസ്ട്രക്ചർ പ്രവർത്തനങ്ങൾ എന്നിവ നിർവഹിക്കുന്നു. ഓരോ എഫ്പിജിഎയ്ക്കും ഒരു എഫ്എംഇ ഉണ്ട്, അത് എല്ലായ്പ്പോഴും ഫിസിക്കൽ ഫംഗ്ഷനിലൂടെ (പിഎഫ്) ആക്സസ് ചെയ്യപ്പെടുന്നു. ഉപയോക്തൃ-സ്പേസ് ആപ്ലിക്കേഷനുകൾക്ക് ഓപ്പൺ() ഉപയോഗിച്ച് FME-യിലേക്കുള്ള എക്സ്ക്ലൂസീവ് ആക്സസ് നേടാനും ഒരു പ്രത്യേക ഉപയോക്താവായി (റൂട്ട്) ക്ലോസ്() ഉപയോഗിച്ച് റിലീസ് ചെയ്യാനും കഴിയും.
തുറമുഖം
സ്റ്റാറ്റിക് എഫ്പിജിഎ ഫാബ്രിക്കും ("എഫ്പിജിഎ ഇന്റർഫേസ് മാനേജർ (എഫ്ഐഎം)") ആക്സിലറേറ്റർ ഫംഗ്ഷൻ (എഎഫ്) അടങ്ങുന്ന ഭാഗികമായി പുനഃക്രമീകരിക്കാവുന്ന മേഖലയും തമ്മിലുള്ള ഇന്റർഫേസിനെ ഒരു പോർട്ട് പ്രതിനിധീകരിക്കുന്നു. പോർട്ട് സോഫ്റ്റ്വെയറിൽ നിന്ന് ആക്സിലറേറ്ററിലേക്കുള്ള ആശയവിനിമയം നിയന്ത്രിക്കുകയും റീസെറ്റ്, ഡീബഗ് പോലുള്ള സവിശേഷതകൾ തുറന്നുകാട്ടുകയും ചെയ്യുന്നു. ഒരു PCIe ഉപകരണത്തിന് നിരവധി പോർട്ടുകൾ ഉണ്ടായിരിക്കാം, ഓരോ പോർട്ടും FME ഉപകരണത്തിലെ FPGA_FME_PORT_ASSIGN ioctl ഉപയോഗിച്ച് അസൈൻ ചെയ്ത് VF മുഖേന തുറന്നുകാട്ടാനാകും.
ആക്സിലറേറ്റർ ഫംഗ്ഷൻ (AF) യൂണിറ്റ്
- ഒരു ആക്സിലറേറ്റർ ഫംഗ്ഷൻ (AF) യൂണിറ്റ് ഒരു പോർട്ടിൽ ഘടിപ്പിച്ചിരിക്കുന്നു കൂടാതെ ആക്സിലറേറ്റർ-നിർദ്ദിഷ്ട നിയന്ത്രണ രജിസ്റ്ററുകൾക്കായി ഉപയോഗിക്കുന്നതിന് 256K MMIO പ്രദേശം തുറന്നുകാട്ടുന്നു.
- പോർട്ട് ഉപകരണത്തിൽ ഓപ്പൺ() ഉപയോഗിച്ച് ഒരു പോർട്ടിൽ ഘടിപ്പിച്ചിട്ടുള്ള AFU-ലേക്കുള്ള എക്സ്ക്ലൂസീവ് ആക്സസ് നേടാൻ ഉപയോക്തൃ-സ്പേസ് ആപ്ലിക്കേഷനുകൾക്ക് കഴിയും, കൂടാതെ അത് ക്ലോസ്() ഉപയോഗിച്ച് റിലീസ് ചെയ്യാം.
- ഉപയോക്തൃ-സ്പേസ് ആപ്ലിക്കേഷനുകൾക്ക് എംഎംഐഒ മേഖലകൾ ആക്സിലറേറ്റർ എംഎംപി() ചെയ്യാനും കഴിയും.
ഭാഗിക പുനഃക്രമീകരണം
മുകളിൽ സൂചിപ്പിച്ചതുപോലെ, ഒരു ആക്സിലറേറ്റർ ഫംഗ്ഷന്റെ (AF) ഭാഗിക പുനർക്രമീകരണത്തിലൂടെ ആക്സിലറേറ്ററുകൾ പുനഃക്രമീകരിക്കാൻ കഴിയും. file. എഫ്പിജിഎയുടെ കൃത്യമായ എഫ്ഐഎമ്മിനും ടാർഗെറ്റുചെയ്ത സ്റ്റാറ്റിക് റീജിയണിനും (പോർട്ട്) ആക്സിലറേറ്റർ ഫംഗ്ഷൻ (എഎഫ്) സൃഷ്ടിച്ചിരിക്കണം; അല്ലെങ്കിൽ, പുനഃക്രമീകരണ പ്രവർത്തനം പരാജയപ്പെടുകയും സിസ്റ്റത്തിന്റെ അസ്ഥിരതയ്ക്ക് കാരണമാവുകയും ചെയ്യും. sysfs മുഖേന FME വെളിപ്പെടുത്തിയ ഇന്റർഫേസ് ഐഡിയുമായി AF തലക്കെട്ടിൽ രേഖപ്പെടുത്തിയിരിക്കുന്ന ഇന്റർഫേസ് ഐഡി താരതമ്യം ചെയ്തുകൊണ്ട് ഈ അനുയോജ്യത പരിശോധിക്കാവുന്നതാണ്. റീകോൺഫിഗറേഷൻ IOCTL-ലേക്ക് വിളിക്കുന്നതിന് മുമ്പ് ഉപയോക്തൃ ഇടം ഉപയോഗിച്ചാണ് ഈ പരിശോധന സാധാരണയായി ചെയ്യുന്നത്.
കുറിപ്പ്:
നിലവിൽ, ഒരു വിർച്ച്വലൈസ്ഡ് ഹോസ്റ്റിൽ പ്രവർത്തിക്കുന്നവ ഉൾപ്പെടെ, FPGA ആക്സസ് ചെയ്യുന്ന ഏതൊരു സോഫ്റ്റ്വെയർ പ്രോഗ്രാമും ഭാഗികമായി പുനഃക്രമീകരിക്കാൻ ശ്രമിക്കുന്നതിന് മുമ്പ് അടച്ചിരിക്കണം. ഘട്ടങ്ങൾ ഇതായിരിക്കും:
- അതിഥിയിൽ നിന്ന് ഡ്രൈവർ അൺലോഡ് ചെയ്യുക
- അതിഥിയിൽ നിന്ന് VF അൺപ്ലഗ് ചെയ്യുക
- SR-IOV പ്രവർത്തനരഹിതമാക്കുക
- ഭാഗികമായ പുനർക്രമീകരണം നടത്തുക
- SR-IOV പ്രവർത്തനക്ഷമമാക്കുക
- അതിഥിയിലേക്ക് VF പ്ലഗ് ചെയ്യുക
- അതിഥിയിൽ ഡ്രൈവറെ കയറ്റുക
FPGA വിർച്ച്വലൈസേഷൻ
ഒരു VM-ൽ പ്രവർത്തിക്കുന്ന ആപ്ലിക്കേഷനുകളിൽ നിന്ന് ആക്സിലറേറ്റർ ആക്സസ് ചെയ്യുന്നത് പ്രവർത്തനക്ഷമമാക്കുന്നതിന്, ഇനിപ്പറയുന്ന ഘട്ടങ്ങൾ ഉപയോഗിച്ച് ബന്ധപ്പെട്ട AFU-ന്റെ പോർട്ട് ഒരു VF-ന് നൽകേണ്ടതുണ്ട്:
- ഡിഫോൾട്ടായി എല്ലാ AFU പോർട്ടുകളും PF-ന് സ്വന്തമാണ്. ഒരു VF-ലേക്ക് വീണ്ടും അസൈൻ ചെയ്യേണ്ട ഏത് പോർട്ടും ആദ്യം PF-ൽ നിന്ന് FME ഉപകരണത്തിലെ FPGA_FME_PORT_RELEASE ioctl വഴി റിലീസ് ചെയ്യണം.
- PF-ൽ നിന്ന് N പോർട്ടുകൾ റിലീസ് ചെയ്തുകഴിഞ്ഞാൽ, SRIOV, VF-കൾ പ്രവർത്തനക്ഷമമാക്കാൻ താഴെയുള്ള കമാൻഡ് ഉപയോഗിക്കാം. ഓരോ VF-നും AFU ഉള്ള ഒരു പോർട്ട് മാത്രമേ ഉള്ളൂ. echo N > PCI_DEVICE_PATH/sriov_numvfs
- VF-കളിലൂടെ VM-കളിലേക്ക് കടന്നുപോകുക.
- VF-ന് കീഴിലുള്ള AFU VM-ലെ ആപ്ലിക്കേഷനുകളിൽ നിന്ന് ആക്സസ് ചെയ്യാൻ കഴിയും (VF-നുള്ളിലെ അതേ ഡ്രൈവർ ഉപയോഗിച്ച്).
കുറിപ്പ്:
ഒരു VF-ന് ഒരു FME-യെ അസൈൻ ചെയ്യാൻ കഴിയില്ല, അതിനാൽ PR-ഉം മറ്റ് മാനേജ്മെന്റ് ഫംഗ്ഷനുകളും PF വഴി മാത്രമേ ലഭ്യമാകൂ.
ഡ്രൈവർ ഓർഗനൈസേഷൻ
PCIe മൊഡ്യൂൾ ഡിവൈസ് ഡ്രൈവർ
ഡ്രൈവർ ഓർഗനൈസേഷൻ
FPGA ഉപകരണങ്ങൾ സാധാരണ PCIe ഉപകരണങ്ങളായി ദൃശ്യമാകുന്നു; അങ്ങനെ, ഒരു FPGA PCIe PF അല്ലെങ്കിൽ VF കണ്ടുപിടിച്ചാൽ FPGA PCIe ഡിവൈസ് ഡ്രൈവർ (intel-FPGA-PCI.ko) എല്ലായ്പ്പോഴും ആദ്യം ലോഡ് ചെയ്യപ്പെടും. ഈ ഡ്രൈവർ ഡ്രൈവർ ആർക്കിടെക്ചറിൽ അടിസ്ഥാന സൗകര്യങ്ങളുടെ പങ്ക് വഹിക്കുന്നു. ഇത്:
- ഫീച്ചർ ഉപകരണങ്ങളുടെ രക്ഷിതാവായി ഒരു FPGA കണ്ടെയ്നർ ഉപകരണം സൃഷ്ടിക്കുന്നു.
- ഫീച്ചർ ഉപകരണങ്ങളും അവയുടെ ഉപ സവിശേഷതകളും കണ്ടെത്തുന്നതിനും കണ്ടെയ്നർ ഉപകരണത്തിന് കീഴിൽ അവയ്ക്കായി പ്ലാറ്റ്ഫോം ഉപകരണങ്ങൾ സൃഷ്ടിക്കുന്നതിനും പിസിഐഇ ഉപകരണ ബാർ മെമ്മറിയിൽ നടപ്പിലാക്കിയിട്ടുള്ള ഉപകരണ ഫീച്ചർ ലിസ്റ്റിലൂടെ നടക്കുന്നു.
- SR-IOV പിന്തുണയ്ക്കുന്നു.
- ഫീച്ചർ ഡിവൈസ് ഇൻഫ്രാസ്ട്രക്ചർ അവതരിപ്പിക്കുന്നു, ഇത് ഉപ-സവിശേഷതകൾക്കായുള്ള പ്രവർത്തനങ്ങളെ സംഗ്രഹിക്കുകയും ഫീച്ചർ ഡിവൈസ് ഡ്രൈവറുകളിലേക്ക് പൊതുവായ പ്രവർത്തനങ്ങൾ വെളിപ്പെടുത്തുകയും ചെയ്യുന്നു.
PCIe മൊഡ്യൂൾ ഡിവൈസ് ഡ്രൈവർ പ്രവർത്തനങ്ങൾ
- PCIe കണ്ടെത്തൽ, ഉപകരണ കണക്കെടുപ്പ്, ഫീച്ചർ കണ്ടെത്തൽ എന്നിവ അടങ്ങിയിരിക്കുന്നു.
- പാരന്റ് ഡിവൈസ്, എഫ്പിജിഎ മാനേജ്മെന്റ് എഞ്ചിൻ (എഫ്എംഇ), പോർട്ട് എന്നിവയ്ക്കായി sysfs ഡയറക്ടറികൾ സൃഷ്ടിക്കുന്നു.
- പ്ലാറ്റ്ഫോം ഡ്രൈവർ സംഭവങ്ങൾ സൃഷ്ടിക്കുന്നു, ലിനക്സ് കേർണൽ അതത് പ്ലാറ്റ്ഫോം മൊഡ്യൂൾ ഡ്രൈവറുകൾ ലോഡുചെയ്യുന്നതിന് കാരണമാകുന്നു.
FME പ്ലാറ്റ്ഫോം മൊഡ്യൂൾ ഡിവൈസ് ഡ്രൈവർ
- പവർ ആൻഡ് തെർമൽ മാനേജ്മെന്റ്, പിശക് റിപ്പോർട്ടിംഗ്, പ്രകടന റിപ്പോർട്ടിംഗ്, മറ്റ് ഇൻഫ്രാസ്ട്രക്ചർ പ്രവർത്തനങ്ങൾ. FME ഡ്രൈവർ തുറന്നുകാട്ടുന്ന sysfs ഇന്റർഫേസുകൾ വഴി നിങ്ങൾക്ക് ഈ ഫംഗ്ഷനുകൾ ആക്സസ് ചെയ്യാൻ കഴിയും.
- ഭാഗിക പുനഃക്രമീകരണം. PR സബ്-ഫീച്ചർ ഇനീഷ്യലൈസേഷൻ സമയത്ത് FME ഡ്രൈവർ ഒരു 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 തലക്കെട്ട്
- തെർമൽ മാനേജ്മെൻ്റ്
- പവർ മാനേജ്മെൻ്റ്
- ആഗോള പിശക്
- ഭാഗിക പുനഃക്രമീകരണം
- ആഗോള പ്രകടനം
പോർട്ട് പ്ലാറ്റ്ഫോം മൊഡ്യൂൾ ഡിവൈസ് ഡ്രൈവർ
എഫ്എംഇ ഡ്രൈവറിനു സമാനമായി, പോർട്ട് പ്ലാറ്റ്ഫോം ഉപകരണം സൃഷ്ടിച്ചുകഴിഞ്ഞാൽ, FPGA പോർട്ട് (ഒപ്പം AFU) ഡ്രൈവറും (intel-fpga-afu. ko) പരിശോധിക്കപ്പെടുന്നു. പോർട്ടിലെ അടിസ്ഥാന റീസെറ്റ് നിയന്ത്രണം, AFU MMIO റീജിയൻ എക്സ്പോർട്ട്, DMA ബഫർ മാപ്പിംഗ് സേവനം, UMsg(1) അറിയിപ്പ്, റിമോട്ട് ഡീബഗ് ഫംഗ്ഷനുകൾ എന്നിവ ഉൾപ്പെടെ വ്യക്തിഗത ആക്സിലറേറ്ററുകൾ ആക്സസ് ചെയ്യുന്നതിന് ഉപയോക്തൃ-സ്പേസ് അപ്ലിക്കേഷനുകൾക്ക് ഒരു ഇന്റർഫേസ് നൽകുക എന്നതാണ് ഈ മൊഡ്യൂളിന്റെ പ്രധാന പ്രവർത്തനം. മുകളിൽ കാണുന്ന).
ഇന്റഗ്രേറ്റഡ് FPGA ഉള്ള Intel Xeon® പ്രോസസറിനായുള്ള ആക്സിലറേഷൻ സ്റ്റാക്കിലൂടെ മാത്രമേ UMsg പിന്തുണയ്ക്കൂ.
പോർട്ട് പ്ലാറ്റ്ഫോം മൊഡ്യൂൾ ഡിവൈസ് ഡ്രൈവർ ഫംഗ്ഷനുകൾ
- പോർട്ട് പ്രതീക ഉപകരണ നോഡ് സൃഷ്ടിക്കുന്നു.
- പോർട്ട് sysfs സൃഷ്ടിക്കുന്നു files കൂടാതെ പോർട്ട് sysfs നടപ്പിലാക്കുന്നു file ആക്സസറുകൾ.
- പോർട്ട് പ്രൈവറ്റ് ഫീച്ചർ സബ്-ഡ്രൈവറുകൾ നടപ്പിലാക്കുന്നു.
- പോർട്ട് പ്രൈവറ്റ് ഫീച്ചർ സബ് ഡ്രൈവറുകൾ:
- പോർട്ട് ഹെഡ്ഡർ
- എ.എഫ്.യു
- പോർട്ട് പിശക്
- UMsg(2)
- സിഗ്നൽ ടാപ്പ്
അപേക്ഷ FPGA ഉപകരണ കണക്കെടുപ്പ്
/sys/class/fpga എന്നതിന് കീഴിലുള്ള sysfs ശ്രേണിയിൽ നിന്ന് 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 ഉം രണ്ട് പോർട്ടുകളും (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 ഡ്രൈവർ എണ്ണൽ
ഈ വിഭാഗം ഒരു ഓവർ നൽകുന്നു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 {
കോൺസ്റ്റ് ചാർ *പേര്;
dev_t devt;
};
struct 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 = {
.പേര് = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.പ്രോബ് = cci_pci_probe,
.നീക്കം = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
ഘടന cci_drvdata {
int device_id;
struct ഉപകരണം *fme_dev;
സ്ട്രക്റ്റ് മ്യൂട്ടക്സ് ലോക്ക്;
struct list_head port_dev_list;
int released_port_num;
struct list_head മേഖലകൾ;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
അസാധുവായ __iomem *ioaddr;
ശൂന്യം __iomem *ioend;
int കറന്റ്_ബാർ;
അസാധുവായ __iomem *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()
- പിസിഐ ഉപകരണം പ്രവർത്തനക്ഷമമാക്കുക, അതിന്റെ മേഖലകളിലേക്ക് ആക്സസ് അഭ്യർത്ഥിക്കുക, പിസിഐ മാസ്റ്റർ മോഡ് സജ്ജമാക്കുക, ഡിഎംഎ കോൺഫിഗർ ചെയ്യുക.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- ഒരു struct build_feature_devs_info അനുവദിക്കുക, അത് ആരംഭിക്കുക.
.parent_dev, FME, Port sysfs ഡയറക്ടറികൾ അടങ്ങുന്ന ഒരു പാരന്റ് sysfs ഡയറക്ടറിയിലേക്ക് (intel-fpga-dev.id) സജ്ജീകരിച്ചിരിക്കുന്നു.
- ഒരു struct build_feature_devs_info അനുവദിക്കുക, അത് ആരംഭിക്കുക.
- 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-ൽ struct റിസോഴ്സുകളുടെ ഒരു നിര അനുവദിക്കുക.
- ഒരു struct feature_platform_data അനുവദിക്കുക, അത് സമാരംഭിക്കുക, ഫീച്ചർ_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 റിസോഴ്സിന്റെ ഒരു നിര അനുവദിക്കുക.
- ഒരു struct feature_platform_data അനുവദിക്കുക, അത് സമാരംഭിക്കുക, ഫീച്ചർ_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() ഫ്ലോ റൺ ചെയ്യുക.
- ഹെഡറിലെ ഓരോ പോർട്ട് എൻട്രിയിലും സൂചിപ്പിച്ചിരിക്കുന്ന BAR ഉപയോഗിക്കുക.
എഫ്എംഇ പ്ലാറ്റ്ഫോം ഡിവൈസ് ഇനീഷ്യലൈസേഷൻ
ഈ വിഭാഗം ഒരു ഓവർ നൽകുന്നുview intel-fpga-fme.ko നടത്തുന്ന FME ഡിവൈസ് ഇനീഷ്യലൈസേഷനായുള്ള കോഡ് ഫ്ലോ. പ്രധാന ഡാറ്റ ഘടനകളും പ്രവർത്തനങ്ങളും ഹൈലൈറ്റ് ചെയ്തിരിക്കുന്നു. എപ്പോഴാണ് ഈ വിഭാഗം ഏറ്റവും നന്നായി പിന്തുടരുന്നത് viewഇതോടൊപ്പമുള്ള സോഴ്സ് കോഡിൽ (fme-main.c)
FME പ്ലാറ്റ്ഫോം ഉപകരണ ഡാറ്റ ഘടനകൾ
struct feature_ops {
int (*init)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ);
int (*uinit)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ);
നീളമുള്ള (*ioctl)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ,
ഒപ്പിടാത്ത int cmd, ഒപ്പിടാത്ത നീണ്ട ആർഗ്);
int (*test)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ);
};
ഘടനാ സവിശേഷത {
കോൺസ്റ്റ് ചാർ *പേര്;
int resource_index;
അസാധുവായ __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
സ്ട്രക്റ്റ് ലിസ്റ്റ്_ഹെഡ് നോഡ്;
സ്ട്രക്റ്റ് മ്യൂട്ടക്സ് ലോക്ക്;
ഒപ്പിടാത്ത നീണ്ട dev_status;
struct cdev cdev;
struct platform_device *dev;
ഒപ്പിടാത്ത ഇൻറ്റ് 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];
};
struct perf_object {
int ഐഡി;
const struct attribute_group **attr_groups;
struct ഉപകരണം *fme_dev;
സ്ട്രക്റ്റ് ലിസ്റ്റ്_ഹെഡ് നോഡ്;
struct list_head കുട്ടികൾ;
struct kobject kobj;
};
struct fpga_fme {
u8 പോർട്ട്_ഐഡി;
u64 pr_err;
struct ഉപകരണം *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME പ്ലാറ്റ്ഫോം ഡിവൈസ് ഇനീഷ്യലൈസേഷൻ ഫ്ലോ
എഫ്എംഇ ഇനീഷ്യലൈസേഷൻ ഫ്ലോ
- fme_probe() fme_dev_init()
- ഒരു struct fpga_fme സമാരംഭിച്ച് അത് feature_platform_data.private ഫീൽഡിൽ സംഭരിക്കുക.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- ഓരോ ജനസംഖ്യയുള്ള ഫീച്ചറിനും ഫീച്ചർ_platform_data.features-ലേക്ക് ഒരു struct feature_ops സംരക്ഷിക്കുക.
- സ്ട്രക്റ്റിൽ നിന്ന് ടെസ്റ്റ് ഫംഗ്ഷൻ എന്തെങ്കിലും ഉണ്ടെങ്കിൽ അത് വിളിക്കുക.
- struct-ൽ നിന്ന് init ഫംഗ്ഷനെ വിളിക്കുക.
- 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 ഫീച്ചർ *ഫീച്ചർ);
int (*uinit)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ);
നീളമുള്ള (*ioctl)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ,
ഒപ്പിടാത്ത int cmd, ഒപ്പിടാത്ത നീണ്ട ആർഗ്);
int (*test)(struct platform_device *pdev, struct ഫീച്ചർ *ഫീച്ചർ);
};
ഘടനാ സവിശേഷത {
കോൺസ്റ്റ് ചാർ *പേര്;
int resource_index;
അസാധുവായ __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
സ്ട്രക്റ്റ് ലിസ്റ്റ്_ഹെഡ് നോഡ്;
സ്ട്രക്റ്റ് മ്യൂട്ടക്സ് ലോക്ക്;
ഒപ്പിടാത്ത നീണ്ട dev_status;
struct cdev cdev;
struct platform_device *dev;
ഒപ്പിടാത്ത ഇൻറ്റ് 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];
};
struct fpga_afu_region {
u32 സൂചിക;
u32 പതാകകൾ;
u64 വലിപ്പം;
u64 ഓഫ്സെറ്റ്;
u64 ഫിസി;
സ്ട്രക്റ്റ് ലിസ്റ്റ്_ഹെഡ് നോഡ്;
};
ഘടന fpga_afu_dma_region {
u64 user_addr;
u64 നീളം;
u64 അയോവ;
struct പേജ് ** പേജുകൾ;
struct rb_node നോഡ്;
ബൂൾ ഇൻ_ഉപയോഗം;
};
struct fpga_afu {
u64 റീജിയൻ_കർ_ഓഫ്സെറ്റ്;
int num_regions;
u8 num_umsgs;
struct list_head മേഖലകൾ;
rb_root dma_regions ഘടന;
struct feature_platform_data *pdata;
};
പോർട്ട് പ്ലാറ്റ്ഫോം ഡിവൈസ് ഇനീഷ്യലൈസേഷൻ ഫ്ലോ
പോർട്ട് ഇനീഷ്യലൈസേഷൻ ഫ്ലോ
- afu_probe() afu_dev_init()
- ഒരു struct fpga_afu സമാരംഭിച്ച് ഫീച്ചർ_platform_data.private ഫീൽഡിൽ സംഭരിക്കുക.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- ഓരോ ജനസംഖ്യയുള്ള ഫീച്ചറിനും ഫീച്ചർ_platform_data.features-ലേക്ക് ഒരു struct feature_ops സംരക്ഷിക്കുക.
- സ്ട്രക്റ്റിൽ നിന്ന് ടെസ്റ്റ് ഫംഗ്ഷൻ എന്തെങ്കിലും ഉണ്ടെങ്കിൽ അത് വിളിക്കുക.
- struct-ൽ നിന്ന് init ഫംഗ്ഷനെ വിളിക്കുക.
- afu_probe() fpga_register_dev_ops()
- ഒരു സ്ട്രക്റ്റ് രജിസ്റ്റർ ചെയ്ത് പോർട്ട് ക്യാരക്ടർ ഉപകരണ നോഡ് സൃഷ്ടിക്കുക file_ഓപ്പറേഷൻസ്.
FME IOCTL-കൾ
ഓപ്പൺ ആയി വിളിക്കപ്പെടുന്ന IOCTL-കൾ file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION-നുള്ള വിവരണം—0 മുതൽ ആരംഭിക്കുന്ന നിലവിലെ പതിപ്പ് ഒരു പൂർണ്ണസംഖ്യയായി തിരികെ നൽകുക.
FPGA_CHECK_EXTENSION-നിലവിൽ പിന്തുണയ്ക്കുന്നില്ല.
FPGA_FME_PORT_RELEASE—arg ഒരു പോയിന്ററാണ്:
struct fpga_fme_port_release {
__u32 argsz; // ഇതിൽ: sizeof(struct fpga_fme_port_release)
__u32 പതാകകൾ; // ഇൻ: 0 ആയിരിക്കണം
__u32 പോർട്ട്_ഐഡി; // ഇൻ: പോർട്ട് ഐഡി (0 മുതൽ) റിലീസ് ചെയ്യാൻ.
};
FPGA_FME_PORT_ASSIGN—arg ഒരു പോയിന്ററാണ്:
ഘടന fpga_fme_port_assign {
__u32 argsz; // ഇതിൽ: sizeof(struct fpga_fme_port_assign)
__u32 പതാകകൾ; // ഇൻ: 0 ആയിരിക്കണം
__u32 പോർട്ട്_ഐഡി; // ഇൻ: അസൈൻ ചെയ്യാൻ പോർട്ട് ഐഡി (0 മുതൽ). (ആയിരിക്കണം
FPGA_FME_PORT_RELEASE മുമ്പ് പുറത്തിറക്കിയത്)
};
FPGA_FME_PORT_PR—arg ഒരു പോയിന്ററാണ്:
ഘടന fpga_fme_port_pr {
__u32 argsz; // ഇതിൽ: sizeof(struct fpga_fme_port_pr)
__u32 പതാകകൾ; // ഇൻ: 0 ആയിരിക്കണം
__u32 പോർട്ട്_ഐഡി; // ഇൻ: പോർട്ട് ഐഡി (0 മുതൽ)
__u32 ബഫർ_സൈസ്; // ഇൻ: ബിറ്റ്സ്ട്രീം ബഫറിന്റെ വലുപ്പം ബൈറ്റുകളിൽ. 4-ബൈറ്റ് ആയിരിക്കണം
വിന്യസിച്ചു.
__u64 ബഫർ_വിലാസം; // ഇൻ: ബിറ്റ്സ്ട്രീം ബഫറിന്റെ പ്രോസസ്സ് വിലാസം
__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 പതാകകൾ; // ഔട്ട്: 0 നൽകുന്നു
__u32 സംഖ്യ_പ്രദേശങ്ങൾ; /
STP)
__u32 num_umsgs; // ഔട്ട്: ഹാർഡ്വെയർ പിന്തുണയ്ക്കുന്ന 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 പാഡിംഗ്; // ഇൻ: 0 ആയിരിക്കണം
__u64 വലിപ്പം; // ഔട്ട്: MMIO മേഖലയുടെ വലുപ്പം ബൈറ്റുകളിൽ
__u64 ഓഫ്സെറ്റ്; // ഔട്ട്: ഡിവൈസ് fd-ന്റെ തുടക്കം മുതൽ MMIO റീജിയന്റെ ഓഫ്സെറ്റ്
};
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 അയോവ; // ഔട്ട്: 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—ആർഗുകൾ NULL ആയിരിക്കണം.
FPGA_PORT_UMSG_SET_MODE—arg ഒരു പോയിന്ററാണ്:
ഘടന fpga_port_umsg_cfg {
__u32 argsz; // ഇതിൽ: sizeof(struct fpga_port_umsg_cfg)
__u32 പതാകകൾ; // ഇൻ: 0 ആയിരിക്കണം
__u32 സൂചന_ബിറ്റ്മാപ്പ്; // ഇൻ: UMsg സൂചന മോഡ് ബിറ്റ്മാപ്പ്. UMsg-കൾ ഏതൊക്കെയാണെന്ന് സൂചിപ്പിക്കുന്നു
പ്രവർത്തനക്ഷമമാക്കി.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- ഈ ioctl നൽകുന്നതിന് മുമ്പ് UMsg പ്രവർത്തനരഹിതമാക്കിയിരിക്കണം.
- എല്ലാ UMsg-കൾക്കും (num_umsgs * PAGE_SIZE) വേണ്ടത്ര വലിപ്പമുള്ള ബഫറിനുള്ളതായിരിക്കണം iova ഫീൽഡ്.
- ഡ്രൈവറുടെ ബഫർ മാനേജ്മെന്റ് ബഫർ "ഉപയോഗത്തിലാണ്" എന്ന് അടയാളപ്പെടുത്തിയിരിക്കുന്നു.
- iova NULL ആണെങ്കിൽ, മുമ്പത്തെ ഏതെങ്കിലും പ്രദേശം "ഉപയോഗത്തിലാണ്" എന്ന് അടയാളപ്പെടുത്തിയിട്ടില്ല.
- arg ഒരു സൂചികയാണ്:
ഘടന fpga_port_umsg_base_addr {- u32 argsz; // ഇതിൽ: sizeof(struct fpga_port_umsg_base_addr)
- u32 പതാകകൾ; // ഇൻ: 0 ആയിരിക്കണം
- u64 അയോവ; // ഇൻ: FPGA_PORT_DMA_MAP-ൽ നിന്നുള്ള IO വെർച്വൽ വിലാസം. };
കുറിപ്പ്:
- പോർട്ട് പിശകുകൾ മായ്ക്കുന്നതിന്, നിലവിലെ പിശകുകളുടെ കൃത്യമായ ബിറ്റ്മാസ്ക് നിങ്ങൾ എഴുതണം, ഉദാഹരണത്തിന്ample, cat errors > clear
- ഇന്റഗ്രേറ്റഡ് FPGA ഉള്ള Intel Xeon പ്രോസസറിനുള്ള ആക്സിലറേഷൻ സ്റ്റാക്കിലൂടെ മാത്രമേ UMsg പിന്തുണയ്ക്കൂ.
sysfs Files
FME ഹെഡർ sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio ഫീൽഡ് | തരം | പ്രവേശനം |
പോർട്ടുകളുടെ_എണ്ണം | fme_header.capability.num_ports | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
കാഷെ_വലിപ്പം | fme_header.capability.cache_size | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
പതിപ്പ് | fme_header.capability.fabric_verid | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
സോക്കറ്റ്_ഐഡി | fme_header.capability.socket_id | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
ബിറ്റ്സ്ട്രീം_ഐഡി | fme_header.bitstream_id | hex uint64_t | വായിക്കാൻ മാത്രം |
ബിറ്റ്സ്ട്രീം_മെറ്റാഡാറ്റ | fme_header.bitstream_md | hex uint64_t | വായിക്കാൻ മാത്രം |
FME തെർമൽ മാനേജ്മെന്റ് sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio ഫീൽഡ് | തരം | പ്രവേശനം |
പരിധി1 | thermal.threshold.tmp_thshold1 | ദശാംശ സംഖ്യ | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
പരിധി2 | thermal.threshold.tmp_thshold2 | ദശാംശ സംഖ്യ | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
ത്രെഷോൾഡ്_ട്രിപ്പ് | thermal.threshold.therm_trip_thshold | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
പരിധി1_എത്തി | thermal.threshold.thshold1_status | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
പരിധി2_എത്തി | thermal.threshold.thshold2_status | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
പരിധി1_നയം | താപ. threshold.thshold_policy | ദശാംശ സംഖ്യ | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
താപനില | thermal.rdsensor_fm1.fpga_temp | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
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 | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
പരിധി1_നില | power.threshold.threshold1_status | ദശാംശം ഒപ്പിടാത്തത് | വായിക്കാൻ മാത്രം |
പരിധി2_നില | power.threshold.threshold2_status | ദശാംശം ഒപ്പിടാത്തത് | വായിക്കാൻ മാത്രം |
rtl | power.status.fpga_latency_report | ദശാംശം ഒപ്പിടാത്തത് | വായിക്കാൻ മാത്രം |
FME ഗ്ലോബൽ പിശക് 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 | വായിക്കാൻ മാത്രം |
ആദ്യ_പിശക് | gerror.fme_first_err.err_reg_status | hex uint64_t | വായിക്കാൻ മാത്രം |
അടുത്ത_പിശക് | gerror.fme_next_err.err_reg_status | hex uint64_t | വായിക്കാൻ മാത്രം |
വ്യക്തമായ | പിശകുകൾ മായ്ക്കുന്നു, first_error, next_error | വിവിധ uint64_t | എഴുതുക-മാത്രം |
കുറിപ്പ്:
FME പിശകുകൾ മായ്ക്കുന്നതിന്, നിലവിലെ പിശകുകളുടെ കൃത്യമായ ബിറ്റ്മാസ്ക് നിങ്ങൾ എഴുതണം, ഉദാഹരണത്തിന്ample cat errors > clear.
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 | ഹെക്സ് 16-ബൈറ്റ് | വായിക്കാൻ മാത്രം |
FME ഗ്ലോബൽ പെർഫോമൻസ് 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/ (FPGA-കൾക്കൊപ്പം Intel Xeon CPU-നുള്ള ആക്സിലറേഷൻ സ്റ്റാക്കിന് സാധുതയില്ല)
sysfs file | mmio ഫീൽഡ് | തരം | പ്രവേശനം |
മരവിപ്പിക്കുക | gperf.ch_ctl.freeze | ദശാംശ സംഖ്യ | വായിക്കുക-എഴുതുക |
വായിക്കുക_ഹിറ്റ് | 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 | വായിക്കാൻ മാത്രം |
sysfs file | mmio ഫീൽഡ് | തരം | പ്രവേശനം |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | വായിക്കാൻ മാത്രം |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | വായിക്കാൻ മാത്രം |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | വായിക്കാൻ മാത്രം |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (FPGA-കൾക്കൊപ്പം Intel Xeon CPU-നുള്ള ആക്സിലറേഷൻ സ്റ്റാക്കിന് സാധുതയില്ല)
sysfs file | mmio ഫീൽഡ് | തരം | പ്രവേശനം |
മരവിപ്പിക്കുക | gperf.vtd_ctl.freeze | ദശാംശ സംഖ്യ | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (FPGA-കളുള്ള ഇന്റൽ സിയോൺ സിപിയുവിനുള്ള ആക്സിലറേഷൻ സ്റ്റാക്കിന് സാധുതയില്ല)
sysfs 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/
sysfs file | mmio ഫീൽഡ് | തരം | പ്രവേശനം |
പ്രാപ്തമാക്കുക | gperf.fab_ctl.(പ്രവർത്തനക്ഷമമാക്കി) | ദശാംശ സംഖ്യ | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
മരവിപ്പിക്കുക | gperf.fab_ctl.freeze | ദശാംശ സംഖ്യ | ഉപയോക്താവ്: വായന-മാത്രം റൂട്ട്: വായിക്കുക-എഴുതുക |
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 | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
ltr | port_header.control.latency_tolerance | ദശാംശ സംഖ്യ | വായിക്കാൻ മാത്രം |
പോർട്ട് 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 | hex uint64_t | വായിക്കാൻ മാത്രം |
ആദ്യ_പിശക് | perror.port_first_error | hex uint64_t | വായിക്കാൻ മാത്രം |
ഫസ്റ്റ്_മൽഫോർമഡ്_റെക് | perror.malreq | ഹെക്സ് 16-ബൈറ്റ് | വായിക്കാൻ മാത്രം |
വ്യക്തമായ | തെറ്റ്.(എല്ലാ പിശകുകളും) | വിവിധ uint64_t | എഴുതുക-മാത്രം |
കുറിപ്പ്:
പോർട്ട് പിശകുകൾ മായ്ക്കുന്നതിന്, നിലവിലെ പിശകുകളുടെ കൃത്യമായ ബിറ്റ്മാസ്ക് നിങ്ങൾ എഴുതണം, ഉദാഹരണത്തിന്ample cat errors > clear.
റിവിഷൻ ചരിത്രം
പ്രമാണ പതിപ്പ് | മാറ്റങ്ങൾ |
2017.10.02 | പ്രാരംഭ റിലീസ്. |
OPAE ഇന്റൽ FPGA ലിനക്സ് ഡിവൈസ് ഡ്രൈവർ ആർക്കിടെക്ചർ ഗൈഡ്
പ്രമാണങ്ങൾ / വിഭവങ്ങൾ
![]() |
intel OPAE FPGA ലിനക്സ് ഡിവൈസ് ഡ്രൈവർ ആർക്കിടെക്ചർ [pdf] ഉപയോക്തൃ ഗൈഡ് OPAE FPGA ലിനക്സ് ഡിവൈസ് ഡ്രൈവർ ആർക്കിടെക്ചർ, OPAE FPGA, ലിനക്സ് ഡിവൈസ് ഡ്രൈവർ ആർക്കിടെക്ചർ, ഡ്രൈവർ ആർക്കിടെക്ചർ, ആർക്കിടെക്ചർ |