€•ÿŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/translations/zh_CN/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/zh_TW/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/it_IT/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ja_JP/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ko_KR/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/pt_BR/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/sp_SP/fpga/dfl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ1FPGA Device Feature List (DFL) Framework Overview”h]”hŒ1FPGA Device Feature List (DFL) Framework Overview”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ6/var/lib/git/docbuild/linux/Documentation/fpga/dfl.rst”h´KubhŒ paragraph”“”)�”}”(hŒAuthors:”h]”hŒAuthors:”…”�”}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ'Enno Luebbers ”h]”hÌ)�”}”(hhäh]”(hŒEnno Luebbers <”…”�”}”(hhæh²hh³Nh´NubhŒ reference”“”)�”}”(hŒenno.luebbers@intel.com”h]”hŒenno.luebbers@intel.com”…”�”}”(hhïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:enno.luebbers@intel.com”uh1híhhæubhŒ>”…”�”}”(hhæh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khhâubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhhÝh²hh³hÊh´Nubhá)�”}”(hŒ/Xiao Guangrong ”h]”hÌ)�”}”(hjh]”(hŒXiao Guangrong <”…”�”}”(hjh²hh³Nh´Nubhî)�”}”(hŒguangrong.xiao@linux.intel.com”h]”hŒguangrong.xiao@linux.intel.com”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ%mailto:guangrong.xiao@linux.intel.com”uh1híhjubhŒ>”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhhÝh²hh³hÊh´Nubhá)�”}”(hŒWu Hao ”h]”hÌ)�”}”(hj<h]”(hŒWu Hao <”…”�”}”(hj>h²hh³Nh´Nubhî)�”}”(hŒhao.wu@intel.com”h]”hŒhao.wu@intel.com”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:hao.wu@intel.com”uh1híhj>ubhŒ>”…”�”}”(hj>h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhhÝh²hh³hÊh´Nubhá)�”}”(hŒXu Yilun ”h]”hÌ)�”}”(hŒXu Yilun ”h]”(hŒ Xu Yilun <”…”�”}”(hjih²hh³Nh´Nubhî)�”}”(hŒyilun.xu@intel.com”h]”hŒyilun.xu@intel.com”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:yilun.xu@intel.com”uh1híhjiubhŒ>”…”�”}”(hjih²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hjeubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhhÝh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hÛh³hÊh´Khh·h²hubhÌ)�”}”(hX·The Device Feature List (DFL) FPGA framework (and drivers according to this framework) hides the very details of low layer hardware and provides unified interfaces to userspace. Applications could use these interfaces to configure, enumerate, open and access FPGA accelerators on platforms which implement the DFL in the device memory. Besides this, the DFL framework enables system level management functions such as FPGA reconfiguration.”h]”hX·The Device Feature List (DFL) FPGA framework (and drivers according to this framework) hides the very details of low layer hardware and provides unified interfaces to userspace. Applications could use these interfaces to configure, enumerate, open and access FPGA accelerators on platforms which implement the DFL in the device memory. Besides this, the DFL framework enables system level management functions such as FPGA reconfiguration.”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hh·h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒ"Device Feature List (DFL) Overview”h]”hŒ"Device Feature List (DFL) Overview”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj§h²hh³hÊh´KubhÌ)�”}”(hXODevice Feature List (DFL) defines a linked list of feature headers within the device MMIO space to provide an extensible way of adding features. Software can walk through these predefined data structures to enumerate FPGA features: FPGA Interface Unit (FIU), Accelerated Function Unit (AFU) and Private Features, as illustrated below::”h]”hXNDevice Feature List (DFL) defines a linked list of feature headers within the device MMIO space to provide an extensible way of adding features. Software can walk through these predefined data structures to enumerate FPGA features: FPGA Interface Unit (FIU), Accelerated Function Unit (AFU) and Private Features, as illustrated below:”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khj§h²hubhŒ literal_block”“”)�”}”(hXF Header Header Header Header +----------+ +-->+----------+ +-->+----------+ +-->+----------+ | Type | | | Type | | | Type | | | Type | | FIU | | | Private | | | Private | | | Private | +----------+ | | Feature | | | Feature | | | Feature | | Next_DFH |--+ +----------+ | +----------+ | +----------+ +----------+ | Next_DFH |--+ | Next_DFH |--+ | Next_DFH |--> NULL | ID | +----------+ +----------+ +----------+ +----------+ | ID | | ID | | ID | | Next_AFU |--+ +----------+ +----------+ +----------+ +----------+ | | Feature | | Feature | | Feature | | Header | | | Register | | Register | | Register | | Register | | | Set | | Set | | Set | | Set | | +----------+ +----------+ +----------+ +----------+ | Header +-->+----------+ | Type | | AFU | +----------+ | Next_DFH |--> NULL +----------+ | GUID | +----------+ | Header | | Register | | Set | +----------+”h]”hXF Header Header Header Header +----------+ +-->+----------+ +-->+----------+ +-->+----------+ | Type | | | Type | | | Type | | | Type | | FIU | | | Private | | | Private | | | Private | +----------+ | | Feature | | | Feature | | | Feature | | Next_DFH |--+ +----------+ | +----------+ | +----------+ +----------+ | Next_DFH |--+ | Next_DFH |--+ | Next_DFH |--> NULL | ID | +----------+ +----------+ +----------+ +----------+ | ID | | ID | | ID | | Next_AFU |--+ +----------+ +----------+ +----------+ +----------+ | | Feature | | Feature | | Feature | | Header | | | Register | | Register | | Register | | Register | | | Set | | Set | | Set | | Set | | +----------+ +----------+ +----------+ +----------+ | Header +-->+----------+ | Type | | AFU | +----------+ | Next_DFH |--> NULL +----------+ | GUID | +----------+ | Header | | Register | | Set | +----------+”…”�”}”hjÈsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jÆh³hÊh´Khj§h²hubhÌ)�”}”(hŒÂFPGA Interface Unit (FIU) represents a standalone functional unit for the interface to FPGA, e.g. the FPGA Management Engine (FME) and Port (more descriptions on FME and Port in later sections).”h]”hŒÂFPGA Interface Unit (FIU) represents a standalone functional unit for the interface to FPGA, e.g. the FPGA Management Engine (FME) and Port (more descriptions on FME and Port in later sections).”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K8hj§h²hubhÌ)�”}”(hŒ”Accelerated Function Unit (AFU) represents an FPGA programmable region and always connects to a FIU (e.g. a Port) as its child as illustrated above.”h]”hŒ”Accelerated Function Unit (AFU) represents an FPGA programmable region and always connects to a FIU (e.g. a Port) as its child as illustrated above.”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KREV - The revision of the feature associated with this header.”h]”hÌ)�”}”(hjáh]”hŒ>REV - The revision of the feature associated with this header.”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kehjßubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjhubhá)�”}”(hŒ0ID - The feature ID if Type is private feature. ”h]”hÌ)�”}”(hŒ/ID - The feature ID if Type is private feature.”h]”hŒ/ID - The feature ID if Type is private feature.”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kfhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjhubeh}”(h]”h ]”h"]”h$]”h&]”j—Œ*”uh1hÛh³hÊh´K^hjVubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhjSh²hh³Nh´Nubhá)�”}”(hŒ‚Offset 0x08 * GUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU). ”h]”(hÌ)�”}”(hŒ Offset 0x08”h]”hŒ Offset 0x08”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhhjubhÜ)�”}”(hhh]”há)�”}”(hŒqGUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU). ”h]”hÌ)�”}”(hŒpGUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU).”h]”hŒpGUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU).”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kjhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj-ubah}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´Kjhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhjSh²hh³Nh´Nubhá)�”}”(hŒ‚Offset 0x10 * GUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU). ”h]”(hÌ)�”}”(hŒ Offset 0x10”h]”hŒ Offset 0x10”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KmhjTubhÜ)�”}”(hhh]”há)�”}”(hŒqGUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU). ”h]”hÌ)�”}”(hŒoGUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU).”h]”hŒoGUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier (present only if Type is FME or AFU).”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kohjiubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjfubah}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´KohjTubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhjSh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j—j˜uh1hÛh³hÊh´K\hj&h²hubeh}”(h]”Œdevice-feature-header-version-0”ah ]”h"]”Œ!device feature header - version 0”ah$]”h&]”uh1hµhh·h²hh³hÊh´KOubh¶)�”}”(hhh]”(h»)�”}”(hŒ!Device Feature Header - Version 1”h]”hŒ!Device Feature Header - Version 1”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj›h²hh³hÊh´KtubhÌ)�”}”(hŒPVersion 1 (DFHv1) of the Device Feature Header adds the following functionality:”h]”hŒPVersion 1 (DFHv1) of the Device Feature Header adds the following functionality:”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kuhj›h²hubhÜ)�”}”(hhh]”(há)�”}”(hŒ_Provides a standardized mechanism for features to describe parameters/capabilities to software.”h]”hÌ)�”}”(hŒ_Provides a standardized mechanism for features to describe parameters/capabilities to software.”h]”hŒ_Provides a standardized mechanism for features to describe parameters/capabilities to software.”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kwhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjºh²hh³hÊh´Nubhá)�”}”(hŒ2Standardize the use of a GUID for all DFHv1 types.”h]”hÌ)�”}”(hj×h]”hŒ2Standardize the use of a GUID for all DFHv1 types.”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KyhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjºh²hh³hÊh´Nubhá)�”}”(hŒJDecouples the DFH location from the register space of the feature itself. ”h]”hÌ)�”}”(hŒIDecouples the DFH location from the register space of the feature itself.”h]”hŒIDecouples the DFH location from the register space of the feature itself.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kzhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjºh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´Kwhj›h²hubhÌ)�”}”(hŒ�All multi-byte quantities in DFHv1 are little-endian. The format of Version 1 of the Device Feature Header (DFH) is shown below::”h]”hŒ€All multi-byte quantities in DFHv1 are little-endian. The format of Version 1 of the Device Feature Header (DFH) is shown below:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K|hj›h²hubjÇ)�”}”(hX+-----------------------------------------------------------------------+ |63 Type 60|59 DFH VER 52|51 Rsvd 41|40 EOL|39 Next 16|15 REV 12|11 ID 0| 0x00 +-----------------------------------------------------------------------+ |63 GUID_L 0| 0x08 +-----------------------------------------------------------------------+ |63 GUID_H 0| 0x10 +-----------------------------------------------------------------------+ |63 Reg Address/Offset 1| Rel 0| 0x18 +-----------------------------------------------------------------------+ |63 Reg Size 32|Params 31|30 Group 16|15 Instance 0| 0x20 +-----------------------------------------------------------------------+ |63 Next 35|34RSV33|EOP32|31 Param Version 16|15 Param ID 0| 0x28 +-----------------------------------------------------------------------+ |63 Parameter Data 0| 0x30 +-----------------------------------------------------------------------+ ... +-----------------------------------------------------------------------+ |63 Next 35|34RSV33|EOP32|31 Param Version 16|15 Param ID 0| +-----------------------------------------------------------------------+ |63 Parameter Data 0| +-----------------------------------------------------------------------+”h]”hX+-----------------------------------------------------------------------+ |63 Type 60|59 DFH VER 52|51 Rsvd 41|40 EOL|39 Next 16|15 REV 12|11 ID 0| 0x00 +-----------------------------------------------------------------------+ |63 GUID_L 0| 0x08 +-----------------------------------------------------------------------+ |63 GUID_H 0| 0x10 +-----------------------------------------------------------------------+ |63 Reg Address/Offset 1| Rel 0| 0x18 +-----------------------------------------------------------------------+ |63 Reg Size 32|Params 31|30 Group 16|15 Instance 0| 0x20 +-----------------------------------------------------------------------+ |63 Next 35|34RSV33|EOP32|31 Param Version 16|15 Param ID 0| 0x28 +-----------------------------------------------------------------------+ |63 Parameter Data 0| 0x30 +-----------------------------------------------------------------------+ ... +-----------------------------------------------------------------------+ |63 Next 35|34RSV33|EOP32|31 Param Version 16|15 Param ID 0| +-----------------------------------------------------------------------+ |63 Parameter Data 0| +-----------------------------------------------------------------------+”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´Khj›h²hubhÜ)�”}”(hhh]”(há)�”}”(hXOffset 0x00 * Type - The type of DFH (e.g. FME, AFU, or private feature). * DFH VER - The version of the DFH. * Rsvd - Currently unused. * EOL - Set if the DFH is the end of the Device Feature List (DFL). * Next - The offset in bytes of the next DFH in the DFL from the DFH start, and the start of a DFH must be aligned to an 8 byte boundary. If EOL is set, Next is the size of MMIO of the last feature in the list. * REV - The revision of the feature associated with this header. * ID - The feature ID if Type is private feature. ”h]”(hÌ)�”}”(hŒ Offset 0x00”h]”hŒ Offset 0x00”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K—hj)ubhÜ)�”}”(hhh]”(há)�”}”(hŒ;Type - The type of DFH (e.g. FME, AFU, or private feature).”h]”hÌ)�”}”(hj@h]”hŒ;Type - The type of DFH (e.g. FME, AFU, or private feature).”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K™hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubhá)�”}”(hŒ!DFH VER - The version of the DFH.”h]”hÌ)�”}”(hjWh]”hŒ!DFH VER - The version of the DFH.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KšhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubhá)�”}”(hŒRsvd - Currently unused.”h]”hÌ)�”}”(hjnh]”hŒRsvd - Currently unused.”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K›hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubhá)�”}”(hŒAEOL - Set if the DFH is the end of the Device Feature List (DFL).”h]”hÌ)�”}”(hj…h]”hŒAEOL - Set if the DFH is the end of the Device Feature List (DFL).”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kœhjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubhá)�”}”(hŒÐNext - The offset in bytes of the next DFH in the DFL from the DFH start, and the start of a DFH must be aligned to an 8 byte boundary. If EOL is set, Next is the size of MMIO of the last feature in the list.”h]”hÌ)�”}”(hŒÐNext - The offset in bytes of the next DFH in the DFL from the DFH start, and the start of a DFH must be aligned to an 8 byte boundary. If EOL is set, Next is the size of MMIO of the last feature in the list.”h]”hŒÐNext - The offset in bytes of the next DFH in the DFL from the DFH start, and the start of a DFH must be aligned to an 8 byte boundary. If EOL is set, Next is the size of MMIO of the last feature in the list.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K�hjšubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubhá)�”}”(hŒ>REV - The revision of the feature associated with this header.”h]”hÌ)�”}”(hj´h]”hŒ>REV - The revision of the feature associated with this header.”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubhá)�”}”(hŒ0ID - The feature ID if Type is private feature. ”h]”hÌ)�”}”(hŒ/ID - The feature ID if Type is private feature.”h]”hŒ/ID - The feature ID if Type is private feature.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¡hjÉubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj;ubeh}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´K™hj)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubhá)�”}”(hŒ[Offset 0x08 * GUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier. ”h]”(hÌ)�”}”(hŒ Offset 0x08”h]”hŒ Offset 0x08”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K£hjíubhÜ)�”}”(hhh]”há)�”}”(hŒLGUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier. ”h]”hÌ)�”}”(hŒKGUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier.”h]”hŒKGUID_L - Least significant 64 bits of a 128-bit Globally Unique Identifier.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¥hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjÿubah}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´K¥hjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubhá)�”}”(hŒZOffset 0x10 * GUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier. ”h]”(hÌ)�”}”(hŒ Offset 0x10”h]”hŒ Offset 0x10”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K§hj&ubhÜ)�”}”(hhh]”há)�”}”(hŒKGUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier. ”h]”hÌ)�”}”(hŒJGUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier.”h]”hŒJGUID_H - Most significant 64 bits of a 128-bit Globally Unique Identifier.”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K©hj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj8ubah}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´K©hj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubhá)�”}”(hŒ÷Offset 0x18 * Reg Address/Offset - If Rel bit is set, then the value is the high 63 bits of a 16-bit aligned absolute address of the feature's registers. Otherwise the value is the offset from the start of the DFH of the feature's registers. ”h]”(hÌ)�”}”(hŒ Offset 0x18”h]”hŒ Offset 0x18”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K«hj_ubhÜ)�”}”(hhh]”há)�”}”(hŒäReg Address/Offset - If Rel bit is set, then the value is the high 63 bits of a 16-bit aligned absolute address of the feature's registers. Otherwise the value is the offset from the start of the DFH of the feature's registers. ”h]”hÌ)�”}”(hŒãReg Address/Offset - If Rel bit is set, then the value is the high 63 bits of a 16-bit aligned absolute address of the feature's registers. Otherwise the value is the offset from the start of the DFH of the feature's registers.”h]”hŒçReg Address/Offset - If Rel bit is set, then the value is the high 63 bits of a 16-bit aligned absolute address of the feature’s registers. Otherwise the value is the offset from the start of the DFH of the feature’s registers.”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K­hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjqubah}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´K­hj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubhá)�”}”(hŒâOffset 0x20 * Reg Size - Size of feature's register set in bytes. * Params - Set if DFH has a list of parameter blocks. * Group - Id of group if feature is part of a group. * Instance - Id of feature instance within a group. ”h]”(hÌ)�”}”(hŒ Offset 0x20”h]”hŒ Offset 0x20”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K±hj˜ubhÜ)�”}”(hhh]”(há)�”}”(hŒ3Reg Size - Size of feature's register set in bytes.”h]”hÌ)�”}”(hj¯h]”hŒ5Reg Size - Size of feature’s register set in bytes.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K³hj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjªubhá)�”}”(hŒ3Params - Set if DFH has a list of parameter blocks.”h]”hÌ)�”}”(hjÆh]”hŒ3Params - Set if DFH has a list of parameter blocks.”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K´hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjªubhá)�”}”(hŒ2Group - Id of group if feature is part of a group.”h]”hÌ)�”}”(hjÝh]”hŒ2Group - Id of group if feature is part of a group.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KµhjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjªubhá)�”}”(hŒ2Instance - Id of feature instance within a group. ”h]”hÌ)�”}”(hŒ1Instance - Id of feature instance within a group.”h]”hŒ1Instance - Id of feature instance within a group.”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¶hjòubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjªubeh}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´K³hj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubhá)�”}”(hŒßOffset 0x28 if feature has parameters * Next - Offset to the next parameter block in 8 byte words. If EOP set, size in 8 byte words of last parameter. * Param Version - Version of Param ID. * Param ID - ID of parameter. ”h]”(hÌ)�”}”(hŒ%Offset 0x28 if feature has parameters”h]”hŒ%Offset 0x28 if feature has parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¸hjubhÜ)�”}”(hhh]”(há)�”}”(hŒnNext - Offset to the next parameter block in 8 byte words. If EOP set, size in 8 byte words of last parameter.”h]”hÌ)�”}”(hŒnNext - Offset to the next parameter block in 8 byte words. If EOP set, size in 8 byte words of last parameter.”h]”hŒnNext - Offset to the next parameter block in 8 byte words. If EOP set, size in 8 byte words of last parameter.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kºhj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj(ubhá)�”}”(hŒ$Param Version - Version of Param ID.”h]”hÌ)�”}”(hjEh]”hŒ$Param Version - Version of Param ID.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¼hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj(ubhá)�”}”(hŒParam ID - ID of parameter. ”h]”hÌ)�”}”(hŒParam ID - ID of parameter.”h]”hŒParam ID - ID of parameter.”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K½hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj(ubeh}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´Kºhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubhá)�”}”(hŒwOffset 0x30 * Parameter Data - Parameter data whose size and format is defined by version and ID of the parameter. ”h]”(hÌ)�”}”(hŒ Offset 0x30”h]”hŒ Offset 0x30”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¿hj~ubhÜ)�”}”(hhh]”há)�”}”(hŒfParameter Data - Parameter data whose size and format is defined by version and ID of the parameter. ”h]”hÌ)�”}”(hŒdParameter Data - Parameter data whose size and format is defined by version and ID of the parameter.”h]”hŒdParameter Data - Parameter data whose size and format is defined by version and ID of the parameter.”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÁhj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj�ubah}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´KÁhj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj&h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j—j˜uh1hÛh³hÊh´K—hj›h²hubeh}”(h]”Œdevice-feature-header-version-1”ah ]”h"]”Œ!device feature header - version 1”ah$]”h&]”uh1hµhh·h²hh³hÊh´Ktubh¶)�”}”(hhh]”(h»)�”}”(hŒ"FIU - FME (FPGA Management Engine)”h]”hŒ"FIU - FME (FPGA Management Engine)”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÅh²hh³hÊh´KÆubhÌ)�”}”(hŒzThe FPGA Management Engine performs reconfiguration and other infrastructure functions. Each FPGA device only has one FME.”h]”hŒzThe FPGA Management Engine performs reconfiguration and other infrastructure functions. Each FPGA device only has one FME.”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÇhjÅh²hubhÌ)�”}”(hŒkUser-space applications can acquire exclusive access to the FME using open(), and release it using close().”h]”hŒkUser-space applications can acquire exclusive access to the FME using open(), and release it using close().”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÊhjÅh²hubhÌ)�”}”(hŒ3The following functions are exposed through ioctls:”h]”hŒ3The following functions are exposed through ioctls:”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÍhjÅh²hubhÜ)�”}”(hhh]”(há)�”}”(hŒ1Get driver API version (DFL_FPGA_GET_API_VERSION)”h]”hÌ)�”}”(hjh]”hŒ1Get driver API version (DFL_FPGA_GET_API_VERSION)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÏhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubhá)�”}”(hŒ/Check for extensions (DFL_FPGA_CHECK_EXTENSION)”h]”hÌ)�”}”(hjh]”hŒ/Check for extensions (DFL_FPGA_CHECK_EXTENSION)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÐhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubhá)�”}”(hŒ(Program bitstream (DFL_FPGA_FME_PORT_PR)”h]”hÌ)�”}”(hj3h]”hŒ(Program bitstream (DFL_FPGA_FME_PORT_PR)”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÑhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubhá)�”}”(hŒ,Assign port to PF (DFL_FPGA_FME_PORT_ASSIGN)”h]”hÌ)�”}”(hjJh]”hŒ,Assign port to PF (DFL_FPGA_FME_PORT_ASSIGN)”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÒhjHubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubhá)�”}”(hŒ0Release port from PF (DFL_FPGA_FME_PORT_RELEASE)”h]”hÌ)�”}”(hjah]”hŒ0Release port from PF (DFL_FPGA_FME_PORT_RELEASE)”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÓhj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubhá)�”}”(hŒEGet number of irqs of FME global error (DFL_FPGA_FME_ERR_GET_IRQ_NUM)”h]”hÌ)�”}”(hjxh]”hŒEGet number of irqs of FME global error (DFL_FPGA_FME_ERR_GET_IRQ_NUM)”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÔhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubhá)�”}”(hŒ?Set interrupt trigger for FME error (DFL_FPGA_FME_ERR_SET_IRQ) ”h]”hÌ)�”}”(hŒ>Set interrupt trigger for FME error (DFL_FPGA_FME_ERR_SET_IRQ)”h]”hŒ>Set interrupt trigger for FME error (DFL_FPGA_FME_ERR_SET_IRQ)”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÕhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhjh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j—j˜uh1hÛh³hÊh´KÏhjÅh²hubhÌ)�”}”(hŒUMore functions are exposed through sysfs (/sys/class/fpga_region/regionX/dfl-fme.n/):”h]”hŒUMore functions are exposed through sysfs (/sys/class/fpga_region/regionX/dfl-fme.n/):”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K×hjÅh²hubhŒ block_quote”“”)�”}”(hXRead bitstream ID (bitstream_id) bitstream_id indicates version of the static FPGA region. Read bitstream metadata (bitstream_metadata) bitstream_metadata includes detailed information of static FPGA region, e.g. synthesis date and seed. Read number of ports (ports_num) one FPGA device may have more than one port, this sysfs interface indicates how many ports the FPGA device has. Global error reporting management (errors/) error reporting sysfs interfaces allow user to read errors detected by the hardware, and clear the logged errors. Power management (dfl_fme_power hwmon) power management hwmon sysfs interfaces allow user to read power management information (power consumption, thresholds, threshold status, limits, etc.) and configure power thresholds for different throttling levels. Thermal management (dfl_fme_thermal hwmon) thermal management hwmon sysfs interfaces allow user to read thermal management information (current temperature, thresholds, threshold status, etc.). Performance reporting performance counters are exposed through perf PMU APIs. Standard perf tool can be used to monitor all available perf events. Please see performance counter section below for more detailed information. ”h]”hŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ[Read bitstream ID (bitstream_id) bitstream_id indicates version of the static FPGA region. ”h]”(hŒterm”“”)�”}”(hŒ Read bitstream ID (bitstream_id)”h]”hŒ Read bitstream ID (bitstream_id)”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´KÛhjÆubhŒ definition”“”)�”}”(hhh]”hÌ)�”}”(hŒ9bitstream_id indicates version of the static FPGA region.”h]”hŒ9bitstream_id indicates version of the static FPGA region.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÛhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjÆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´KÛhjÁubjÅ)�”}”(hŒ“Read bitstream metadata (bitstream_metadata) bitstream_metadata includes detailed information of static FPGA region, e.g. synthesis date and seed. ”h]”(jË)�”}”(hŒ,Read bitstream metadata (bitstream_metadata)”h]”hŒ,Read bitstream metadata (bitstream_metadata)”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´KßhjùubjÛ)�”}”(hhh]”hÌ)�”}”(hŒebitstream_metadata includes detailed information of static FPGA region, e.g. synthesis date and seed.”h]”hŒebitstream_metadata includes detailed information of static FPGA region, e.g. synthesis date and seed.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÞhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjùubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´KßhjÁubjÅ)�”}”(hŒ‘Read number of ports (ports_num) one FPGA device may have more than one port, this sysfs interface indicates how many ports the FPGA device has. ”h]”(jË)�”}”(hŒ Read number of ports (ports_num)”h]”hŒ Read number of ports (ports_num)”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´Kãhj(ubjÛ)�”}”(hhh]”hÌ)�”}”(hŒoone FPGA device may have more than one port, this sysfs interface indicates how many ports the FPGA device has.”h]”hŒoone FPGA device may have more than one port, this sysfs interface indicates how many ports the FPGA device has.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kâhj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´KãhjÁubjÅ)�”}”(hŒžGlobal error reporting management (errors/) error reporting sysfs interfaces allow user to read errors detected by the hardware, and clear the logged errors. ”h]”(jË)�”}”(hŒ+Global error reporting management (errors/)”h]”hŒ+Global error reporting management (errors/)”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´KçhjWubjÛ)�”}”(hhh]”hÌ)�”}”(hŒqerror reporting sysfs interfaces allow user to read errors detected by the hardware, and clear the logged errors.”h]”hŒqerror reporting sysfs interfaces allow user to read errors detected by the hardware, and clear the logged errors.”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kæhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjWubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´KçhjÁubjÅ)�”}”(hŒÿPower management (dfl_fme_power hwmon) power management hwmon sysfs interfaces allow user to read power management information (power consumption, thresholds, threshold status, limits, etc.) and configure power thresholds for different throttling levels. ”h]”(jË)�”}”(hŒ&Power management (dfl_fme_power hwmon)”h]”hŒ&Power management (dfl_fme_power hwmon)”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´Kìhj†ubjÛ)�”}”(hhh]”hÌ)�”}”(hŒ×power management hwmon sysfs interfaces allow user to read power management information (power consumption, thresholds, threshold status, limits, etc.) and configure power thresholds for different throttling levels.”h]”hŒ×power management hwmon sysfs interfaces allow user to read power management information (power consumption, thresholds, threshold status, limits, etc.) and configure power thresholds for different throttling levels.”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kêhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj†ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´KìhjÁubjÅ)�”}”(hŒÂThermal management (dfl_fme_thermal hwmon) thermal management hwmon sysfs interfaces allow user to read thermal management information (current temperature, thresholds, threshold status, etc.). ”h]”(jË)�”}”(hŒ*Thermal management (dfl_fme_thermal hwmon)”h]”hŒ*Thermal management (dfl_fme_thermal hwmon)”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´KñhjµubjÛ)�”}”(hhh]”hÌ)�”}”(hŒ–thermal management hwmon sysfs interfaces allow user to read thermal management information (current temperature, thresholds, threshold status, etc.).”h]”hŒ–thermal management hwmon sysfs interfaces allow user to read thermal management information (current temperature, thresholds, threshold status, etc.).”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KïhjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjµubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´KñhjÁubjÅ)�”}”(hŒàPerformance reporting performance counters are exposed through perf PMU APIs. Standard perf tool can be used to monitor all available perf events. Please see performance counter section below for more detailed information. ”h]”(jË)�”}”(hŒPerformance reporting”h]”hŒPerformance reporting”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´K÷hjäubjÛ)�”}”(hhh]”hÌ)�”}”(hŒÈperformance counters are exposed through perf PMU APIs. Standard perf tool can be used to monitor all available perf events. Please see performance counter section below for more detailed information.”h]”hŒÈperformance counters are exposed through perf PMU APIs. Standard perf tool can be used to monitor all available perf events. Please see performance counter section below for more detailed information.”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kôhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjäubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´K÷hjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¿hj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹h³hÊh´KÚhjÅh²hubeh}”(h]”Œfiu-fme-fpga-management-engine”ah ]”h"]”Œ"fiu - fme (fpga management engine)”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÆubh¶)�”}”(hhh]”(h»)�”}”(hŒ FIU - PORT”h]”hŒ FIU - PORT”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj' h²hh³hÊh´KúubhÌ)�”}”(hX)A port represents the interface between the static FPGA fabric and a partially reconfigurable region containing an AFU. It controls the communication from SW to the accelerator and exposes features such as reset and debug. Each FPGA device may have more than one port, but always one AFU per port.”h]”hX)A port represents the interface between the static FPGA fabric and a partially reconfigurable region containing an AFU. It controls the communication from SW to the accelerator and exposes features such as reset and debug. Each FPGA device may have more than one port, but always one AFU per port.”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kûhj' h²hubeh}”(h]”Œfiu-port”ah ]”h"]”Œ fiu - port”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kúubh¶)�”}”(hhh]”(h»)�”}”(hŒAFU”h]”hŒAFU”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjN h²hh³hÊh´MubhÌ)�”}”(hŒ~An AFU is attached to a port FIU and exposes a fixed length MMIO region to be used for accelerator-specific control registers.”h]”hŒ~An AFU is attached to a port FIU and exposes a fixed length MMIO region to be used for accelerator-specific control registers.”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MhjN h²hubhÌ)�”}”(hŒ—User-space applications can acquire exclusive access to an AFU attached to a port by using open() on the port device node and release it using close().”h]”hŒ—User-space applications can acquire exclusive access to an AFU attached to a port by using open() on the port device node and release it using close().”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MhjN h²hubhÌ)�”}”(hŒ3The following functions are exposed through ioctls:”h]”hŒ3The following functions are exposed through ioctls:”…”�”}”(hj{ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hjN h²hubhÜ)�”}”(hhh]”(há)�”}”(hŒ1Get driver API version (DFL_FPGA_GET_API_VERSION)”h]”hÌ)�”}”(hjŽ h]”hŒ1Get driver API version (DFL_FPGA_GET_API_VERSION)”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hjŒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ/Check for extensions (DFL_FPGA_CHECK_EXTENSION)”h]”hÌ)�”}”(hj¥ h]”hŒ/Check for extensions (DFL_FPGA_CHECK_EXTENSION)”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hj£ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ&Get port info (DFL_FPGA_PORT_GET_INFO)”h]”hÌ)�”}”(hj¼ h]”hŒ&Get port info (DFL_FPGA_PORT_GET_INFO)”…”�”}”(hj¾ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hjº ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ4Get MMIO region info (DFL_FPGA_PORT_GET_REGION_INFO)”h]”hÌ)�”}”(hjÓ h]”hŒ4Get MMIO region info (DFL_FPGA_PORT_GET_REGION_INFO)”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MhjÑ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ&Map DMA buffer (DFL_FPGA_PORT_DMA_MAP)”h]”hÌ)�”}”(hjê h]”hŒ&Map DMA buffer (DFL_FPGA_PORT_DMA_MAP)”…”�”}”(hjì h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjè ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ*Unmap DMA buffer (DFL_FPGA_PORT_DMA_UNMAP)”h]”hÌ)�”}”(hj h]”hŒ*Unmap DMA buffer (DFL_FPGA_PORT_DMA_UNMAP)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjÿ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒReset AFU (DFL_FPGA_PORT_RESET)”h]”hÌ)�”}”(hj h]”hŒReset AFU (DFL_FPGA_PORT_RESET)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ@Get number of irqs of port error (DFL_FPGA_PORT_ERR_GET_IRQ_NUM)”h]”hÌ)�”}”(hj/ h]”hŒ@Get number of irqs of port error (DFL_FPGA_PORT_ERR_GET_IRQ_NUM)”…”�”}”(hj1 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhj- ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ@Set interrupt trigger for port error (DFL_FPGA_PORT_ERR_SET_IRQ)”h]”hÌ)�”}”(hjF h]”hŒ@Set interrupt trigger for port error (DFL_FPGA_PORT_ERR_SET_IRQ)”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MhjD ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ;Get number of irqs of UINT (DFL_FPGA_PORT_UINT_GET_IRQ_NUM)”h]”hÌ)�”}”(hj] h]”hŒ;Get number of irqs of UINT (DFL_FPGA_PORT_UINT_GET_IRQ_NUM)”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhj[ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj‰ h²hh³hÊh´Nubhá)�”}”(hŒ//):”h]”hŒ[More functions are exposed through sysfs: (/sys/class/fpga_region///):”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MhjN h²hubjº)�”}”(hXRead Accelerator GUID (afu_id) afu_id indicates which PR bitstream is programmed to this AFU. Error reporting (errors/) error reporting sysfs interfaces allow user to read port/afu errors detected by the hardware, and clear the logged errors. ”h]”jÀ)�”}”(hhh]”(jÅ)�”}”(hŒ^Read Accelerator GUID (afu_id) afu_id indicates which PR bitstream is programmed to this AFU. ”h]”(jË)�”}”(hŒRead Accelerator GUID (afu_id)”h]”hŒRead Accelerator GUID (afu_id)”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´M#hjë ubjÛ)�”}”(hhh]”hÌ)�”}”(hŒ>afu_id indicates which PR bitstream is programmed to this AFU.”h]”hŒ>afu_id indicates which PR bitstream is programmed to this AFU.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M#hjý ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjë ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´M#hjè ubjÅ)�”}”(hŒ–Error reporting (errors/) error reporting sysfs interfaces allow user to read port/afu errors detected by the hardware, and clear the logged errors. ”h]”(jË)�”}”(hŒError reporting (errors/)”h]”hŒError reporting (errors/)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÊh³hÊh´M(hj ubjÛ)�”}”(hhh]”hÌ)�”}”(hŒzerror reporting sysfs interfaces allow user to read port/afu errors detected by the hardware, and clear the logged errors.”h]”hŒzerror reporting sysfs interfaces allow user to read port/afu errors detected by the hardware, and clear the logged errors.”…”�”}”(hj/ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M&hj, ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÄh³hÊh´M(hjè ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¿hjä ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹h³hÊh´M"hjN h²hubeh}”(h]”Œafu”ah ]”h"]”Œafu”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mubh¶)�”}”(hhh]”(h»)�”}”(hŒDFL Framework Overview”h]”hŒDFL Framework Overview”…”�”}”(hj` h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj] h²hh³hÊh´M+ubjÇ)�”}”(hX +----------+ +--------+ +--------+ +--------+ | FME | | AFU | | AFU | | AFU | | Module | | Module | | Module | | Module | +----------+ +--------+ +--------+ +--------+ +-----------------------+ | FPGA Container Device | Device Feature List | (FPGA Base Region) | Framework +-----------------------+ ------------------------------------------------------------------ +----------------------------+ | FPGA DFL Device Module | | (e.g. PCIE/Platform Device)| +----------------------------+ +------------------------+ | FPGA Hardware Device | +------------------------+”h]”hX +----------+ +--------+ +--------+ +--------+ | FME | | AFU | | AFU | | AFU | | Module | | Module | | Module | | Module | +----------+ +--------+ +--------+ +--------+ +-----------------------+ | FPGA Container Device | Device Feature List | (FPGA Base Region) | Framework +-----------------------+ ------------------------------------------------------------------ +----------------------------+ | FPGA DFL Device Module | | (e.g. PCIE/Platform Device)| +----------------------------+ +------------------------+ | FPGA Hardware Device | +------------------------+”…”�”}”hjn sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´M/hj] h²hubhÌ)�”}”(hX�DFL framework in kernel provides common interfaces to create container device (FPGA base region), discover feature devices and their private features from the given Device Feature Lists and create platform devices for feature devices (e.g. FME, Port and AFU) with related resources under the container device. It also abstracts operations for the private features and exposes common ops to feature device drivers.”h]”hX�DFL framework in kernel provides common interfaces to create container device (FPGA base region), discover feature devices and their private features from the given Device Feature Lists and create platform devices for feature devices (e.g. FME, Port and AFU) with related resources under the container device. It also abstracts operations for the private features and exposes common ops to feature device drivers.”…”�”}”(hj| h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M@hj] h²hubhÌ)�”}”(hX¾The FPGA DFL Device could be different hardware, e.g. PCIe device, platform device and etc. Its driver module is always loaded first once the device is created by the system. This driver plays an infrastructural role in the driver architecture. It locates the DFLs in the device memory, handles them and related resources to common interfaces from DFL framework for enumeration. (Please refer to drivers/fpga/dfl.c for detailed enumeration APIs).”h]”hX¾The FPGA DFL Device could be different hardware, e.g. PCIe device, platform device and etc. Its driver module is always loaded first once the device is created by the system. This driver plays an infrastructural role in the driver architecture. It locates the DFLs in the device memory, handles them and related resources to common interfaces from DFL framework for enumeration. (Please refer to drivers/fpga/dfl.c for detailed enumeration APIs).”…”�”}”(hjŠ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MGhj] h²hubhÌ)�”}”(hŒÖThe FPGA Management Engine (FME) driver is a platform driver which is loaded automatically after FME platform device creation from the DFL device module. It provides the key features for FPGA management, including:”h]”hŒÖThe FPGA Management Engine (FME) driver is a platform driver which is loaded automatically after FME platform device creation from the DFL device module. It provides the key features for FPGA management, including:”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MNhj] h²hubjº)�”}”(hXîa) Expose static FPGA region information, e.g. version and metadata. Users can read related information via sysfs interfaces exposed by FME driver. b) Partial Reconfiguration. The FME driver creates FPGA manager, FPGA bridges and FPGA regions during PR sub feature initialization. Once it receives a DFL_FPGA_FME_PORT_PR ioctl from user, it invokes the common interface function from FPGA Region to complete the partial reconfiguration of the PR bitstream to the given port. ”h]”hŒenumerated_list”“”)�”}”(hhh]”(há)�”}”(hŒ‘Expose static FPGA region information, e.g. version and metadata. Users can read related information via sysfs interfaces exposed by FME driver. ”h]”hÌ)�”}”(hŒ�Expose static FPGA region information, e.g. version and metadata. Users can read related information via sysfs interfaces exposed by FME driver.”h]”hŒ�Expose static FPGA region information, e.g. version and metadata. Users can read related information via sysfs interfaces exposed by FME driver.”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MRhj¯ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj¬ ubhá)�”}”(hXDPartial Reconfiguration. The FME driver creates FPGA manager, FPGA bridges and FPGA regions during PR sub feature initialization. Once it receives a DFL_FPGA_FME_PORT_PR ioctl from user, it invokes the common interface function from FPGA Region to complete the partial reconfiguration of the PR bitstream to the given port. ”h]”hÌ)�”}”(hXCPartial Reconfiguration. The FME driver creates FPGA manager, FPGA bridges and FPGA regions during PR sub feature initialization. Once it receives a DFL_FPGA_FME_PORT_PR ioctl from user, it invokes the common interface function from FPGA Region to complete the partial reconfiguration of the PR bitstream to the given port.”h]”hXCPartial Reconfiguration. The FME driver creates FPGA manager, FPGA bridges and FPGA regions during PR sub feature initialization. Once it receives a DFL_FPGA_FME_PORT_PR ioctl from user, it invokes the common interface function from FPGA Region to complete the partial reconfiguration of the PR bitstream to the given port.”…”�”}”(hjË h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MVhjÇ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj¬ ubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ loweralpha”Œprefix”hŒsuffix”Œ)”uh1jª hj¦ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¹h³hÊh´MRhj] h²hubhÌ)�”}”(hX`Similar to the FME driver, the FPGA Accelerated Function Unit (AFU) driver is probed once the AFU platform device is created. The main function of this module is to provide an interface for userspace applications to access the individual accelerators, including basic reset control on port, AFU MMIO region export, dma buffer mapping service functions.”h]”hX`Similar to the FME driver, the FPGA Accelerated Function Unit (AFU) driver is probed once the AFU platform device is created. The main function of this module is to provide an interface for userspace applications to access the individual accelerators, including basic reset control on port, AFU MMIO region export, dma buffer mapping service functions.”…”�”}”(hjð h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M\hj] h²hubhÌ)�”}”(hX After feature platform devices creation, matched platform drivers will be loaded automatically to handle different functionalities. Please refer to next sections for detailed information on functional units which have been already implemented under this DFL framework.”h]”hX After feature platform devices creation, matched platform drivers will be loaded automatically to handle different functionalities. Please refer to next sections for detailed information on functional units which have been already implemented under this DFL framework.”…”�”}”(hjþ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mbhj] h²hubeh}”(h]”Œdfl-framework-overview”ah ]”h"]”Œdfl framework overview”ah$]”h&]”uh1hµhh·h²hh³hÊh´M+ubh¶)�”}”(hhh]”(h»)�”}”(hŒPartial Reconfiguration”h]”hŒPartial Reconfiguration”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´MiubhÌ)�”}”(hXEAs mentioned above, accelerators can be reconfigured through partial reconfiguration of a PR bitstream file. The PR bitstream file must have been generated for the exact static FPGA region and targeted reconfigurable region (port) of the FPGA, otherwise, the reconfiguration operation will fail and possibly cause system instability. This compatibility can be checked by comparing the compatibility ID noted in the header of PR bitstream file against the compat_id exposed by the target FPGA region. This check is usually done by userspace before calling the reconfiguration IOCTL.”h]”hXEAs mentioned above, accelerators can be reconfigured through partial reconfiguration of a PR bitstream file. The PR bitstream file must have been generated for the exact static FPGA region and targeted reconfigurable region (port) of the FPGA, otherwise, the reconfiguration operation will fail and possibly cause system instability. This compatibility can be checked by comparing the compatibility ID noted in the header of PR bitstream file against the compat_id exposed by the target FPGA region. This check is usually done by userspace before calling the reconfiguration IOCTL.”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mjhj h²hubeh}”(h]”Œpartial-reconfiguration”ah ]”h"]”Œpartial reconfiguration”ah$]”h&]”uh1hµhh·h²hh³hÊh´Miubh¶)�”}”(hhh]”(h»)�”}”(hŒ FPGA virtualization - PCIe SRIOV”h]”hŒ FPGA virtualization - PCIe SRIOV”…”�”}”(hj> h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj; h²hh³hÊh´MuubhÌ)�”}”(hŒíThis section describes the virtualization support on DFL based FPGA device to enable accessing an accelerator from applications running in a virtual machine (VM). This section only describes the PCIe based FPGA device with SRIOV support.”h]”hŒíThis section describes the virtualization support on DFL based FPGA device to enable accessing an accelerator from applications running in a virtual machine (VM). This section only describes the PCIe based FPGA device with SRIOV support.”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mvhj; h²hubhÌ)�”}”(hŒpFeatures supported by the particular FPGA device are exposed through Device Feature Lists, as illustrated below:”h]”hŒpFeatures supported by the particular FPGA device are exposed through Device Feature Lists, as illustrated below:”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mzhj; h²hubjÇ)�”}”(hX¸ +-------------------------------+ +-------------+ | PF | | VF | +-------------------------------+ +-------------+ ^ ^ ^ ^ | | | | +-----|------------|---------|--------------|-------+ | | | | | | | +-----+ +-------+ +-------+ +-------+ | | | FME | | Port0 | | Port1 | | Port2 | | | +-----+ +-------+ +-------+ +-------+ | | ^ ^ ^ | | | | | | | +-------+ +------+ +-------+ | | | AFU | | AFU | | AFU | | | +-------+ +------+ +-------+ | | | | DFL based FPGA PCIe Device | +---------------------------------------------------+”h]”hX¸ +-------------------------------+ +-------------+ | PF | | VF | +-------------------------------+ +-------------+ ^ ^ ^ ^ | | | | +-----|------------|---------|--------------|-------+ | | | | | | | +-----+ +-------+ +-------+ +-------+ | | | FME | | Port0 | | Port1 | | Port2 | | | +-----+ +-------+ +-------+ +-------+ | | ^ ^ ^ | | | | | | | +-------+ +------+ +-------+ | | | AFU | | AFU | | AFU | | | +-------+ +------+ +-------+ | | | | DFL based FPGA PCIe Device | +---------------------------------------------------+”…”�”•WŒ}”hjh sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´Mhj; h²hubhÌ)�”}”(hŒ:FME is always accessed through the physical function (PF).”h]”hŒ:FME is always accessed through the physical function (PF).”…”�”}”(hjv h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M’hj; h²hubhÌ)�”}”(hX!Ports (and related AFUs) are accessed via PF by default, but could be exposed through virtual function (VF) devices via PCIe SRIOV. Each VF only contains 1 Port and 1 AFU for isolation. Users could assign individual VFs (accelerators) created via PCIe SRIOV interface, to virtual machines.”h]”hX!Ports (and related AFUs) are accessed via PF by default, but could be exposed through virtual function (VF) devices via PCIe SRIOV. Each VF only contains 1 Port and 1 AFU for isolation. Users could assign individual VFs (accelerators) created via PCIe SRIOV interface, to virtual machines.”…”�”}”(hj„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M”hj; h²hubhÌ)�”}”(hŒGThe driver organization in virtualization case is illustrated below: ::”h]”hŒDThe driver organization in virtualization case is illustrated below:”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M™hj; h²hubjÇ)�”}”(hXÖ +-------++------++------+ | | FME || FME || FME | | | FPGA || FPGA || FPGA | | |Manager||Bridge||Region| | +-------++------++------+ | +-----------------------+ +--------+ | +--------+ | FME | | AFU | | | AFU | | Module | | Module | | | Module | +-----------------------+ +--------+ | +--------+ +-----------------------+ | +-----------------------+ | FPGA Container Device | | | FPGA Container Device | | (FPGA Base Region) | | | (FPGA Base Region) | +-----------------------+ | +-----------------------+ +------------------+ | +------------------+ | FPGA PCIE Module | | Virtual | FPGA PCIE Module | +------------------+ Host | Machine +------------------+ -------------------------------------- | ------------------------------ +---------------+ | +---------------+ | PCI PF Device | | | PCI VF Device | +---------------+ | +---------------+”h]”hXÖ +-------++------++------+ | | FME || FME || FME | | | FPGA || FPGA || FPGA | | |Manager||Bridge||Region| | +-------++------++------+ | +-----------------------+ +--------+ | +--------+ | FME | | AFU | | | AFU | | Module | | Module | | | Module | +-----------------------+ +--------+ | +--------+ +-----------------------+ | +-----------------------+ | FPGA Container Device | | | FPGA Container Device | | (FPGA Base Region) | | | (FPGA Base Region) | +-----------------------+ | +-----------------------+ +------------------+ | +------------------+ | FPGA PCIE Module | | Virtual | FPGA PCIE Module | +------------------+ Host | Machine +------------------+ -------------------------------------- | ------------------------------ +---------------+ | +---------------+ | PCI PF Device | | | PCI VF Device | +---------------+ | +---------------+”…”�”}”hj  sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´Mœhj; h²hubhÌ)�”}”(hŒaFPGA PCIe device driver is always loaded first once an FPGA PCIe PF or VF device is detected. It:”h]”hŒaFPGA PCIe device driver is always loaded first once an FPGA PCIe PF or VF device is detected. It:”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M±hj; h²hubhÜ)�”}”(hhh]”(há)�”}”(hŒcFinishes enumeration on both FPGA PCIe PF and VF device using common interfaces from DFL framework.”h]”hÌ)�”}”(hŒcFinishes enumeration on both FPGA PCIe PF and VF device using common interfaces from DFL framework.”h]”hŒcFinishes enumeration on both FPGA PCIe PF and VF device using common interfaces from DFL framework.”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M´hj¿ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj¼ h²hh³hÊh´Nubhá)�”}”(hŒSupports SRIOV. ”h]”hÌ)�”}”(hŒSupports SRIOV.”h]”hŒSupports SRIOV.”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M¶hj× ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj¼ h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´M´hj; h²hubhÌ)�”}”(hŒúThe FME device driver plays a management role in this driver architecture, it provides ioctls to release Port from PF and assign Port to PF. After release a port from PF, then it's safe to expose this port through a VF via PCIe SRIOV sysfs interface.”h]”hŒüThe FME device driver plays a management role in this driver architecture, it provides ioctls to release Port from PF and assign Port to PF. After release a port from PF, then it’s safe to expose this port through a VF via PCIe SRIOV sysfs interface.”…”�”}”(hjõ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M¸hj; h²hubhÌ)�”}”(hŒ—To enable accessing an accelerator from applications running in a VM, the respective AFU's port needs to be assigned to a VF using the following steps:”h]”hŒ™To enable accessing an accelerator from applications running in a VM, the respective AFU’s port needs to be assigned to a VF using the following steps:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M½hj; h²hubj« )�”}”(hhh]”(há)�”}”(hŒ©The PF owns all AFU ports by default. Any port that needs to be reassigned to a VF must first be released through the DFL_FPGA_FME_PORT_RELEASE ioctl on the FME device. ”h]”hÌ)�”}”(hŒ¨The PF owns all AFU ports by default. Any port that needs to be reassigned to a VF must first be released through the DFL_FPGA_FME_PORT_RELEASE ioctl on the FME device.”h]”hŒ¨The PF owns all AFU ports by default. Any port that needs to be reassigned to a VF must first be released through the DFL_FPGA_FME_PORT_RELEASE ioctl on the FME device.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÀhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj h²hh³hÊh´Nubhá)�”}”(hŒ°Once N ports are released from PF, then user can use command below to enable SRIOV and VFs. Each VF owns only one Port with AFU. :: echo N > $PCI_DEVICE_PATH/sriov_numvfs ”h]”(hÌ)�”}”(hŒ€Once N ports are released from PF, then user can use command below to enable SRIOV and VFs. Each VF owns only one Port with AFU.”h]”hŒ€Once N ports are released from PF, then user can use command below to enable SRIOV and VFs. Each VF owns only one Port with AFU.”…”�”}”(hj0 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÄhj, ubjÇ)�”}”(hŒ&echo N > $PCI_DEVICE_PATH/sriov_numvfs”h]”hŒ&echo N > $PCI_DEVICE_PATH/sriov_numvfs”…”�”}”hj> sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´MÉhj, ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj h²hh³hÊh´Nubhá)�”}”(hŒPass through the VFs to VMs ”h]”hÌ)�”}”(hŒPass through the VFs to VMs”h]”hŒPass through the VFs to VMs”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MËhjR ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj h²hh³hÊh´Nubhá)�”}”(hŒ^The AFU under VF is accessible from applications in VM (using the same driver inside the VF). ”h]”hÌ)�”}”(hŒ]The AFU under VF is accessible from applications in VM (using the same driver inside the VF).”h]”hŒ]The AFU under VF is accessible from applications in VM (using the same driver inside the VF).”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÍhjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jå Œarabic”jç hjè Œ.”uh1jª hj; h²hh³hÊh´MÀubhÌ)�”}”(hŒqNote that an FME can't be assigned to a VF, thus PR and other management functions are only available via the PF.”h]”hŒsNote that an FME can’t be assigned to a VF, thus PR and other management functions are only available via the PF.”…”�”}”(hjŠ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÐhj; h²hubeh}”(h]”Œfpga-virtualization-pcie-sriov”ah ]”h"]”Œ fpga virtualization - pcie sriov”ah$]”h&]”uh1hµhh·h²hh³hÊh´Muubh¶)�”}”(hhh]”(h»)�”}”(hŒDevice enumeration”h]”hŒDevice enumeration”…”�”}”(hj£ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj  h²hh³hÊh´MÔubhÌ)�”}”(hŒyThis section introduces how applications enumerate the fpga device from the sysfs hierarchy under /sys/class/fpga_region.”h]”hŒyThis section introduces how applications enumerate the fpga device from the sysfs hierarchy under /sys/class/fpga_region.”…”�”}”(hj± h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÕhj  h²hubhÌ)�”}”(hŒ~In the example below, two DFL based FPGA devices are installed in the host. Each fpga device has one FME and two ports (AFUs).”h]”hŒ~In the example below, two DFL based FPGA devices are installed in the host. Each fpga device has one FME and two ports (AFUs).”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MØhj  h²hubhÌ)�”}”(hŒ8FPGA regions are created under /sys/class/fpga_region/::”h]”hŒ7FPGA regions are created under /sys/class/fpga_region/:”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MÛhj  h²hubjÇ)�”}”(hŒ`/sys/class/fpga_region/region0 /sys/class/fpga_region/region1 /sys/class/fpga_region/region2 ...”h]”hŒ`/sys/class/fpga_region/region0 /sys/class/fpga_region/region1 /sys/class/fpga_region/region2 ...”…”�”}”hjÛ sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´MÝhj  h²hubhÌ)�”}”(hŒºApplication needs to search each regionX folder, if feature device is found, (e.g. "dfl-port.n" or "dfl-fme.m" is found), then it's the base fpga region which represents the FPGA device.”h]”hŒÄApplication needs to search each regionX folder, if feature device is found, (e.g. “dfl-port.nâ€� or “dfl-fme.mâ€� is found), then it’s the base fpga region which represents the FPGA device.”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mâhj  h²hubhÌ)�”}”(hŒDEach base region has one FME and two ports (AFUs) as child devices::”h]”hŒCEach base region has one FME and two ports (AFUs) as child devices:”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mæhj  h²hubjÇ)�”}”(hX/sys/class/fpga_region/region0/dfl-fme.0 /sys/class/fpga_region/region0/dfl-port.0 /sys/class/fpga_region/region0/dfl-port.1 ... /sys/class/fpga_region/region3/dfl-fme.1 /sys/class/fpga_region/region3/dfl-port.2 /sys/class/fpga_region/region3/dfl-port.3 ...”h]”hX/sys/class/fpga_region/region0/dfl-fme.0 /sys/class/fpga_region/region0/dfl-port.0 /sys/class/fpga_region/region0/dfl-port.1 ... /sys/class/fpga_region/region3/dfl-fme.1 /sys/class/fpga_region/region3/dfl-port.2 /sys/class/fpga_region/region3/dfl-port.3 ...”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´Mèhj  h²hubhÌ)�”}”(hŒ?In general, the FME/AFU sysfs interfaces are named as follows::”h]”hŒ>In general, the FME/AFU sysfs interfaces are named as follows:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mòhj  h²hubjÇ)�”}”(hŒ\/sys/class/fpga_region/// /sys/class/fpga_region///”h]”hŒ\/sys/class/fpga_region/// /sys/class/fpga_region///”…”�”}”hj!sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´Môhj  h²hubhÌ)�”}”(hŒTwith 'n' consecutively numbering all FMEs and 'm' consecutively numbering all ports.”h]”hŒ\with ‘n’ consecutively numbering all FMEs and ‘m’ consecutively numbering all ports.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M÷hj  h²hubhÌ)�”}”(hŒGThe device nodes used for ioctl() or mmap() can be referenced through::”h]”hŒFThe device nodes used for ioctl() or mmap() can be referenced through:”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Múhj  h²hubjÇ)�”}”(hŒb/sys/class/fpga_region///dev /sys/class/fpga_region///dev”h]”hŒb/sys/class/fpga_region///dev /sys/class/fpga_region///dev”…”�”}”hjKsbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´Mühj  h²hubeh}”(h]”Œdevice-enumeration”ah ]”h"]”Œdevice enumeration”ah$]”h&]”uh1hµhh·h²hh³hÊh´MÔubh¶)�”}”(hhh]”(h»)�”}”(hŒPerformance Counters”h]”hŒPerformance Counters”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjah²hh³hÊh´MubhÌ)�”}”(hX£Performance reporting is one private feature implemented in FME. It could supports several independent, system-wide, device counter sets in hardware to monitor and count for performance events, including "basic", "cache", "fabric", "vtd" and "vtd_sip" counters. Users could use standard perf tool to monitor FPGA cache hit/miss rate, transaction number, interface clock counter of AFU and other FPGA performance events.”h]”hX·Performance reporting is one private feature implemented in FME. It could supports several independent, system-wide, device counter sets in hardware to monitor and count for performance events, including “basicâ€�, “cacheâ€�, “fabricâ€�, “vtdâ€� and “vtd_sipâ€� counters. Users could use standard perf tool to monitor FPGA cache hit/miss rate, transaction number, interface clock counter of AFU and other FPGA performance events.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjah²hubhÌ)�”}”(hŒêDifferent FPGA devices may have different counter sets, depending on hardware implementation. E.g., some discrete FPGA cards don't have any cache. User could use "perf list" to check which perf events are supported by target hardware.”h]”hŒðDifferent FPGA devices may have different counter sets, depending on hardware implementation. E.g., some discrete FPGA cards don’t have any cache. User could use “perf listâ€� to check which perf events are supported by target hardware.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hjah²hubhÌ)�”}”(hŒôIn order to allow user to use standard perf API to access these performance counters, driver creates a perf PMU, and related sysfs interfaces in /sys/bus/event_source/devices/dfl_fme* to describe available perf events and configuration options.”h]”hŒôIn order to allow user to use standard perf API to access these performance counters, driver creates a perf PMU, and related sysfs interfaces in /sys/bus/event_source/devices/dfl_fme* to describe available perf events and configuration options.”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M hjah²hubhÌ)�”}”(hXOThe "format" directory describes the format of the config field of struct perf_event_attr. There are 3 bitfields for config: "evtype" defines which type the perf event belongs to; "event" is the identity of the event within its category; "portid" is introduced to decide counters set to monitor on FPGA overall data or a specific port.”h]”hX_The “formatâ€� directory describes the format of the config field of struct perf_event_attr. There are 3 bitfields for config: “evtypeâ€� defines which type the perf event belongs to; “eventâ€� is the identity of the event within its category; “portidâ€� is introduced to decide counters set to monitor on FPGA overall data or a specific port.”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjah²hubhÌ)�”}”(hXXThe "events" directory describes the configuration templates for all available events which can be used with perf tool directly. For example, fab_mmio_read has the configuration "event=0x06,evtype=0x02,portid=0xff", which shows this event belongs to fabric type (0x02), the local event id is 0x06 and it is for overall monitoring (portid=0xff).”h]”hX`The “eventsâ€� directory describes the configuration templates for all available events which can be used with perf tool directly. For example, fab_mmio_read has the configuration “event=0x06,evtype=0x02,portid=0xffâ€�, which shows this event belongs to fabric type (0x02), the local event id is 0x06 and it is for overall monitoring (portid=0xff).”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjah²hubhÌ)�”}”(hŒExample usage of perf::”h]”hŒExample usage of perf:”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mhjah²hubjÇ)�”}”(hXt$# perf list |grep dfl_fme dfl_fme0/fab_mmio_read/ [Kernel PMU event] <...> dfl_fme0/fab_port_mmio_read,portid=?/ [Kernel PMU event] <...> $# perf stat -a -e dfl_fme0/fab_mmio_read/ or $# perf stat -a -e dfl_fme0/event=0x06,evtype=0x02,portid=0xff/ or $# perf stat -a -e dfl_fme0/config=0xff2006/ ”h]”hXt$# perf list |grep dfl_fme dfl_fme0/fab_mmio_read/ [Kernel PMU event] <...> dfl_fme0/fab_port_mmio_read,portid=?/ [Kernel PMU event] <...> $# perf stat -a -e dfl_fme0/fab_mmio_read/ or $# perf stat -a -e dfl_fme0/event=0x06,evtype=0x02,portid=0xff/ or $# perf stat -a -e dfl_fme0/config=0xff2006/ ”…”�”}”hjÆsbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´M hjah²hubhÌ)�”}”(hŒ³Another example, fab_port_mmio_read monitors mmio read of a specific port. So its configuration template is "event=0x06,evtype=0x01,portid=?". The portid should be explicitly set.”h]”hŒ·Another example, fab_port_mmio_read monitors mmio read of a specific port. So its configuration template is “event=0x06,evtype=0x01,portid=?â€�. The portid should be explicitly set.”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M-hjah²hubhÌ)�”}”(hŒIts usage of perf::”h]”hŒIts usage of perf:”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M1hjah²hubjÇ)�”}”(hŒÈ$# perf stat -a -e dfl_fme0/fab_port_mmio_read,portid=0x0/ or $# perf stat -a -e dfl_fme0/event=0x06,evtype=0x02,portid=0x0/ or $# perf stat -a -e dfl_fme0/config=0x2006/ ”h]”hŒÈ$# perf stat -a -e dfl_fme0/fab_port_mmio_read,portid=0x0/ or $# perf stat -a -e dfl_fme0/event=0x06,evtype=0x02,portid=0x0/ or $# perf stat -a -e dfl_fme0/config=0x2006/ ”…”�”}”hjðsbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´M3hjah²hubhÌ)�”}”(hX6Please note for fabric counters, overall perf events (fab_*) and port perf events (fab_port_*) actually share one set of counters in hardware, so it can't monitor both at the same time. If this set of counters is configured to monitor overall data, then per port perf data is not supported. See below example::”h]”hX7Please note for fabric counters, overall perf events (fab_*) and port perf events (fab_port_*) actually share one set of counters in hardware, so it can’t monitor both at the same time. If this set of counters is configured to monitor overall data, then per port perf data is not supported. See below example:”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M9hjah²hubjÇ)�”}”(hXM$# perf stat -e dfl_fme0/fab_mmio_read/,dfl_fme0/fab_port_mmio_write,\ portid=0/ sleep 1 Performance counter stats for 'system wide': 3 dfl_fme0/fab_mmio_read/ dfl_fme0/fab_port_mmio_write,portid=0x0/ 1.001750904 seconds time elapsed”h]”hXM$# perf stat -e dfl_fme0/fab_mmio_read/,dfl_fme0/fab_port_mmio_write,\ portid=0/ sleep 1 Performance counter stats for 'system wide': 3 dfl_fme0/fab_mmio_read/ dfl_fme0/fab_port_mmio_write,portid=0x0/ 1.001750904 seconds time elapsed”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´M>hjah²hubhÌ)�”}”(hŒÒThe driver also provides a "cpumask" sysfs attribute, which contains only one CPU id used to access these perf events. Counting on multiple CPU is not allowed since they are system-wide counters on FPGA device.”h]”hŒÖThe driver also provides a “cpumaskâ€� sysfs attribute, which contains only one CPU id used to access these perf events. Counting on multiple CPU is not allowed since they are system-wide counters on FPGA device.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MHhjah²hubhÌ)�”}”(hŒNThe current driver does not support sampling. So "perf record" is unsupported.”h]”hŒRThe current driver does not support sampling. So “perf recordâ€� is unsupported.”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MLhjah²hubeh}”(h]”Œperformance-counters”ah ]”h"]”Œperformance counters”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mubh¶)�”}”(hhh]”(h»)�”}”(hŒInterrupt support”h]”hŒInterrupt support”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj>h²hh³hÊh´MPubhÌ)�”}”(hX4Some FME and AFU private features are able to generate interrupts. As mentioned above, users could call ioctl (DFL_FPGA_*_GET_IRQ_NUM) to know whether or how many interrupts are supported for this private feature. Drivers also implement an eventfd based interrupt handling mechanism for users to get notified when interrupt happens. Users could set eventfds to driver via ioctl (DFL_FPGA_*_SET_IRQ), and then poll/select on these eventfds waiting for notification. In Current DFL, 3 sub features (Port error, FME global error and AFU interrupt) support interrupts.”h]”hX4Some FME and AFU private features are able to generate interrupts. As mentioned above, users could call ioctl (DFL_FPGA_*_GET_IRQ_NUM) to know whether or how many interrupts are supported for this private feature. Drivers also implement an eventfd based interrupt handling mechanism for users to get notified when interrupt happens. Users could set eventfds to driver via ioctl (DFL_FPGA_*_SET_IRQ), and then poll/select on these eventfds waiting for notification. In Current DFL, 3 sub features (Port error, FME global error and AFU interrupt) support interrupts.”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MQhj>h²hubeh}”(h]”Œinterrupt-support”ah ]”h"]”Œinterrupt support”ah$]”h&]”uh1hµhh·h²hh³hÊh´MPubh¶)�”}”(hhh]”(h»)�”}”(hŒAdd new FIUs support”h]”hŒAdd new FIUs support”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjeh²hh³hÊh´M]ubhÌ)�”}”(hX§It's possible that developers made some new function blocks (FIUs) under this DFL framework, then new platform device driver needs to be developed for the new feature dev (FIU) following the same way as existing feature dev drivers (e.g. FME and Port/AFU platform device driver). Besides that, it requires modification on DFL framework enumeration code too, for new FIU type detection and related platform devices creation.”h]”hX©It’s possible that developers made some new function blocks (FIUs) under this DFL framework, then new platform device driver needs to be developed for the new feature dev (FIU) following the same way as existing feature dev drivers (e.g. FME and Port/AFU platform device driver). Besides that, it requires modification on DFL framework enumeration code too, for new FIU type detection and related platform devices creation.”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M^hjeh²hubeh}”(h]”Œadd-new-fius-support”ah ]”h"]”Œadd new fius support”ah$]”h&]”uh1hµhh·h²hh³hÊh´M]ubh¶)�”}”(hhh]”(h»)�”}”(hŒ Add new private features support”h]”hŒ Add new private features support”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjŒh²hh³hÊh´MgubhÌ)�”}”(hXæIn some cases, we may need to add some new private features to existing FIUs (e.g. FME or Port). Developers don't need to touch enumeration code in DFL framework, as each private feature will be parsed automatically and related mmio resources can be found under FIU platform device created by DFL framework. Developer only needs to provide a sub feature driver with matched feature id. FME Partial Reconfiguration Sub Feature driver (see drivers/fpga/dfl-fme-pr.c) could be a reference.”h]”hXèIn some cases, we may need to add some new private features to existing FIUs (e.g. FME or Port). Developers don’t need to touch enumeration code in DFL framework, as each private feature will be parsed automatically and related mmio resources can be found under FIU platform device created by DFL framework. Developer only needs to provide a sub feature driver with matched feature id. FME Partial Reconfiguration Sub Feature driver (see drivers/fpga/dfl-fme-pr.c) could be a reference.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MhhjŒh²hubhÌ)�”}”(hŒ‰Please refer to below link to existing feature id table and guide for new feature ids application. https://github.com/OPAE/dfl-feature-id”h]”(hŒcPlease refer to below link to existing feature id table and guide for new feature ids application. ”…”�”}”(hj«h²hh³Nh´Nubhî)�”}”(hŒ&https://github.com/OPAE/dfl-feature-id”h]”hŒ&https://github.com/OPAE/dfl-feature-id”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jµuh1híhj«ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MphjŒh²hubeh}”(h]”Œ add-new-private-features-support”ah ]”h"]”Œ add new private features support”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mgubh¶)�”}”(hhh]”(h»)�”}”(hŒ Location of DFLs on a PCI Device”h]”hŒ Location of DFLs on a PCI Device”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÐh²hh³hÊh´MvubhÌ)�”}”(hXõThe original method for finding a DFL on a PCI device assumed the start of the first DFL to offset 0 of bar 0. If the first node of the DFL is an FME, then further DFLs in the port(s) are specified in FME header registers. Alternatively, a PCIe vendor specific capability structure can be used to specify the location of all the DFLs on the device, providing flexibility for the type of starting node in the DFL. Intel has reserved the VSEC ID of 0x43 for this purpose. The vendor specific data begins with a 4 byte vendor specific register for the number of DFLs followed 4 byte Offset/BIR vendor specific registers for each DFL. Bits 2:0 of Offset/BIR register indicates the BAR, and bits 31:3 form the 8 byte aligned offset where bits 2:0 are zero. ::”h]”hXòThe original method for finding a DFL on a PCI device assumed the start of the first DFL to offset 0 of bar 0. If the first node of the DFL is an FME, then further DFLs in the port(s) are specified in FME header registers. Alternatively, a PCIe vendor specific capability structure can be used to specify the location of all the DFLs on the device, providing flexibility for the type of starting node in the DFL. Intel has reserved the VSEC ID of 0x43 for this purpose. The vendor specific data begins with a 4 byte vendor specific register for the number of DFLs followed 4 byte Offset/BIR vendor specific registers for each DFL. Bits 2:0 of Offset/BIR register indicates the BAR, and bits 31:3 form the 8 byte aligned offset where bits 2:0 are zero.”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MwhjÐh²hubjÇ)�”}”(hX +----------------------------+ |31 Number of DFLS 0| +----------------------------+ |31 Offset 3|2 BIR 0| +----------------------------+ . . . +----------------------------+ |31 Offset 3|2 BIR 0| +----------------------------+”h]”hX +----------------------------+ |31 Number of DFLS 0| +----------------------------+ |31 Offset 3|2 BIR 0| +----------------------------+ . . . +----------------------------+ |31 Offset 3|2 BIR 0| +----------------------------+”…”�”}”hjïsbah}”(h]”h ]”h"]”h$]”h&]”jÖj×uh1jÆh³hÊh´M„hjÐh²hubhÌ)�”}”(hŒâBeing able to specify more than one DFL per BAR has been considered, but it was determined the use case did not provide value. Specifying a single DFL per BAR simplifies the implementation and allows for extra error checking.”h]”hŒâBeing able to specify more than one DFL per BAR has been considered, but it was determined the use case did not provide value. Specifying a single DFL per BAR simplifies the implementation and allows for extra error checking.”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MŽhjÐh²hubeh}”(h]”Œ location-of-dfls-on-a-pci-device”ah ]”h"]”Œ location of dfls on a pci device”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mvubh¶)�”}”(hhh]”(h»)�”}”(hŒ(Userspace driver support for DFL devices”h]”hŒ(Userspace driver support for DFL devices”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´M”ubhÌ)�”}”(hXThe purpose of an FPGA is to be reprogrammed with newly developed hardware components. New hardware can instantiate a new private feature in the DFL, and then present a DFL device in the system. In some cases users may need a userspace driver for the DFL device:”h]”hXThe purpose of an FPGA is to be reprogrammed with newly developed hardware components. New hardware can instantiate a new private feature in the DFL, and then present a DFL device in the system. In some cases users may need a userspace driver for the DFL device:”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M•hjh²hubhÜ)�”}”(hhh]”(há)�”}”(hŒ>Users may need to run some diagnostic test for their hardware.”h]”hÌ)�”}”(hj7h]”hŒ>Users may need to run some diagnostic test for their hardware.”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mšhj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj2h²hh³hÊh´Nubhá)�”}”(hŒ4Users may prototype the kernel driver in user space.”h]”hÌ)�”}”(hjNh]”hŒ4Users may prototype the kernel driver in user space.”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M›hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj2h²hh³hÊh´Nubhá)�”}”(hŒmSome hardware is designed for specific purposes and does not fit into one of the standard kernel subsystems. ”h]”hÌ)�”}”(hŒlSome hardware is designed for specific purposes and does not fit into one of the standard kernel subsystems.”h]”hŒlSome hardware is designed for specific purposes and does not fit into one of the standard kernel subsystems.”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Mœhjcubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj2h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j—juh1hÛh³hÊh´Mšhjh²hubhÌ)�”}”(hŒ—This requires direct access to MMIO space and interrupt handling from userspace. The uio_dfl module exposes the UIO device interfaces for this purpose.”h]”hŒ—This requires direct access to MMIO space and interrupt handling from userspace. The uio_dfl module exposes the UIO device interfaces for this purpose.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´MŸhjh²hubhÌ)�”}”(hŒœCurrently the uio_dfl driver only supports the Ether Group sub feature, which has no irq in hardware. So the interrupt handling is not added in this driver.”h]”hŒœCurrently the uio_dfl driver only supports the Ether Group sub feature, which has no irq in hardware. So the interrupt handling is not added in this driver.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M£hjh²hubhÌ)�”}”(hŒ¬UIO_DFL should be selected to enable the uio_dfl module driver. To support a new DFL feature via UIO direct access, its feature id should be added to the driver's id_table.”h]”hŒ®UIO_DFL should be selected to enable the uio_dfl module driver. To support a new DFL feature via UIO direct access, its feature id should be added to the driver’s id_table.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M¦hjh²hubeh}”(h]”Œ(userspace-driver-support-for-dfl-devices”ah ]”h"]”Œ(userspace driver support for dfl devices”ah$]”h&]”uh1hµhh·h²hh³hÊh´M”ubh¶)�”}”(hhh]”(h»)�”}”(hŒOpen discussion”h]”hŒOpen discussion”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj³h²hh³hÊh´M¬ubhÌ)�”}”(hŒÜFME driver exports one ioctl (DFL_FPGA_FME_PORT_PR) for partial reconfiguration to user now. In the future, if unified user interfaces for reconfiguration are added, FME driver should switch to them from ioctl interface.”h]”hŒÜFME driver exports one ioctl (DFL_FPGA_FME_PORT_PR) for partial reconfiguration to user now. In the future, if unified user interfaces for reconfiguration are added, FME driver should switch to them from ioctl interface.”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´M­hj³h²hubeh}”(h]”Œopen-discussion”ah ]”h"]”Œopen discussion”ah$]”h&]”uh1hµhh·h²hh³hÊh´M¬ubeh}”(h]”Œ/fpga-device-feature-list-dfl-framework-overview”ah ]”h"]”Œ1fpga device feature list (dfl) framework overview”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jßjÜj#j j˜j•jÂj¿j$ j! jK jH jZ jW j j j8 j5 j� jš j^j[j;j8jbj_j‰j†jÍjÊjj j°j­j×jÔuŒ nametypes”}”(j߉j#‰j˜‰j‰j$ ‰jK ‰jZ ‰j ‰j8 ‰j� ‰j^‰j;‰jb‰j‰‰j͉j‰j°‰j׉uh}”(jÜh·j j§j•j&j¿j›j! jÅjH j' jW jN j j] j5 j jš j; j[j  j8jaj_j>j†jejÊjŒj jÐj­jjÔj³uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÌ)�”}”(hŒfPossible title underline, too short for the title. Treating it as ordinary text because it's so short.”h]”hŒhPossible title underline, too short for the title. Treating it as ordinary text because it’s so short.”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhjiubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œline”MšŒsource”hÊuh1jghj; h²hh³hÊh´MšubaŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.