€•DŒ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/userspace-api/fwctl/fwctl”Œ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/userspace-api/fwctl/fwctl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/it_IT/userspace-api/fwctl/fwctl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ja_JP/userspace-api/fwctl/fwctl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ-/translations/ko_KR/userspace-api/fwctl/fwctl”Œ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/userspace-api/fwctl/fwctl”Œ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/userspace-api/fwctl/fwctl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒG/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒfwctl subsystem”h]”hŒfwctl subsystem”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ field_list”“”)�”}”(hhh]”hŒfield”“”)�”}”(hhh]”(hŒ field_name”“”)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäh³hÇh´KubhŒ field_body”“”)�”}”(hŒJason Gunthorpe ”h]”hŒ paragraph”“”)�”}”(hŒJason Gunthorpe”h]”hŒJason Gunthorpe”…”�”}”(hhÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khhùubah}”(h]”h ]”h"]”h$]”h&]”uh1h÷hhäubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâh³hÇh´Khhßh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒOverview”h]”hŒOverview”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K ubhþ)�”}”(hX[Modern devices contain extensive amounts of FW, and in many cases, are largely software-defined pieces of hardware. The evolution of this approach is largely a reaction to Moore's Law where a chip tape out is now highly expensive, and the chip design is extremely large. Replacing fixed HW logic with a flexible and tightly coupled FW/HW combination is an effective risk mitigation against chip respin. Problems in the HW design can be counteracted in device FW. This is especially true for devices which present a stable and backwards compatible interface to the operating system driver (such as NVMe).”h]”hX]Modern devices contain extensive amounts of FW, and in many cases, are largely software-defined pieces of hardware. The evolution of this approach is largely a reaction to Moore’s Law where a chip tape out is now highly expensive, and the chip design is extremely large. Replacing fixed HW logic with a flexible and tightly coupled FW/HW combination is an effective risk mitigation against chip respin. Problems in the HW design can be counteracted in device FW. This is especially true for devices which present a stable and backwards compatible interface to the operating system driver (such as NVMe).”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K hjh²hubhþ)�”}”(hŒûThe FW layer in devices has grown to incredible size and devices frequently integrate clusters of fast processors to run it. For example, mlx5 devices have over 30MB of FW code, and big configurations operate with over 1GB of FW managed runtime state.”h]”hŒûThe FW layer in devices has grown to incredible size and devices frequently integrate clusters of fast processors to run it. For example, mlx5 devices have over 30MB of FW code, and big configurations operate with over 1GB of FW managed runtime state.”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khjh²hubhþ)�”}”(hX¦The availability of such a flexible layer has created quite a variety in the industry where single pieces of silicon are now configurable software-defined devices and can operate in substantially different ways depending on the need. Further, we often see cases where specific sites wish to operate devices in ways that are highly specialized and require applications that have been tailored to their unique configuration.”h]”hX¦The availability of such a flexible layer has created quite a variety in the industry where single pieces of silicon are now configurable software-defined devices and can operate in substantially different ways depending on the need. Further, we often see cases where specific sites wish to operate devices in ways that are highly specialized and require applications that have been tailored to their unique configuration.”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khjh²hubhþ)�”}”(hX9Further, devices have become multi-functional and integrated to the point they no longer fit neatly into the kernel's division of subsystems. Modern multi-functional devices have drivers, such as bnxt/ice/mlx5/pds, that span many subsystems while sharing the underlying hardware using the auxiliary device system.”h]”hX;Further, devices have become multi-functional and integrated to the point they no longer fit neatly into the kernel’s division of subsystems. Modern multi-functional devices have drivers, such as bnxt/ice/mlx5/pds, that span many subsystems while sharing the underlying hardware using the auxiliary device system.”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K!hjh²hubhþ)�”}”(hX’All together this creates a challenge for the operating system, where devices have an expansive FW environment that needs robust device-specific debugging support, and FW-driven functionality that is not well suited to “genericâ€� interfaces. fwctl seeks to allow access to the full device functionality from user space in the areas of debuggability, management, and first-boot/nth-boot provisioning.”h]”hX’All together this creates a challenge for the operating system, where devices have an expansive FW environment that needs robust device-specific debugging support, and FW-driven functionality that is not well suited to “genericâ€� interfaces. fwctl seeks to allow access to the full device functionality from user space in the areas of debuggability, management, and first-boot/nth-boot provisioning.”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K'hjh²hubhþ)�”}”(hX fwctl is aimed at the common device design pattern where the OS and FW communicate via an RPC message layer constructed with a queue or mailbox scheme. In this case the driver will typically have some layer to deliver RPC messages and collect RPC responses from device FW. The in-kernel subsystem drivers that operate the device for its primary purposes will use these RPCs to build their drivers, but devices also usually have a set of ancillary RPCs that don't really fit into any specific subsystem. For example, a HW RAID controller is primarily operated by the block layer but also comes with a set of RPCs to administer the construction of drives within the HW RAID.”h]”hX¢fwctl is aimed at the common device design pattern where the OS and FW communicate via an RPC message layer constructed with a queue or mailbox scheme. In this case the driver will typically have some layer to deliver RPC messages and collect RPC responses from device FW. The in-kernel subsystem drivers that operate the device for its primary purposes will use these RPCs to build their drivers, but devices also usually have a set of ancillary RPCs that don’t really fit into any specific subsystem. For example, a HW RAID controller is primarily operated by the block layer but also comes with a set of RPCs to administer the construction of drives within the HW RAID.”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K.hjh²hubhþ)�”}”(hX)In the past when devices were more single function, individual subsystems would grow different approaches to solving some of these common problems. For instance, monitoring device health, manipulating its FLASH, debugging the FW, provisioning, all have various unique interfaces across the kernel.”h]”hX)In the past when devices were more single function, individual subsystems would grow different approaches to solving some of these common problems. For instance, monitoring device health, manipulating its FLASH, debugging the FW, provisioning, all have various unique interfaces across the kernel.”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K8hjh²hubhþ)�”}”(hXfwctl's purpose is to define a common set of limited rules, described below, that allow user space to securely construct and execute RPCs inside device FW. The rules serve as an agreement between the operating system and FW on how to correctly design the RPC interface. As a uAPI the subsystem provides a thin layer of discovery and a generic uAPI to deliver the RPCs and collect the response. It supports a system of user space libraries and tools which will use this interface to control the device using the device native protocols.”h]”hXfwctl’s purpose is to define a common set of limited rules, described below, that allow user space to securely construct and execute RPCs inside device FW. The rules serve as an agreement between the operating system and FW on how to correctly design the RPC interface. As a uAPI the subsystem provides a thin layer of discovery and a generic uAPI to deliver the RPCs and collect the response. It supports a system of user space libraries and tools which will use this interface to control the device using the device native protocols.”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K=hjh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒScope of Action”h]”hŒScope of Action”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h²hh³hÇh´KFubhþ)�”}”(hŒªfwctl drivers are strictly restricted to being a way to operate the device FW. It is not an avenue to access random kernel internals, or other operating system SW states.”h]”hŒªfwctl drivers are strictly restricted to being a way to operate the device FW. It is not an avenue to access random kernel internals, or other operating system SW states.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KHhj h²hubhþ)�”}”(hX(fwctl instances must operate on a well-defined device function, and the device should have a well-defined security model for what scope within the physical device the function is permitted to access. For instance, the most complex PCIe device today may broadly have several function-level scopes:”h]”hX(fwctl instances must operate on a well-defined device function, and the device should have a well-defined security model for what scope within the physical device the function is permitted to access. For instance, the most complex PCIe device today may broadly have several function-level scopes:”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KLhj h²hubhŒ block_quote”“”)�”}”(hŒô1. A privileged function with full access to the on-device global state and configuration 2. Multiple hypervisor functions with control over itself and child functions used with VMs 3. Multiple VM functions tightly scoped within the VM ”h]”hŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒWA privileged function with full access to the on-device global state and configuration ”h]”hþ)�”}”(hŒVA privileged function with full access to the on-device global state and configuration”h]”hŒVA privileged function with full access to the on-device global state and configuration”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KQhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjÕubjÙ)�”}”(hŒYMultiple hypervisor functions with control over itself and child functions used with VMs ”h]”hþ)�”}”(hŒXMultiple hypervisor functions with control over itself and child functions used with VMs”h]”hŒXMultiple hypervisor functions with control over itself and child functions used with VMs”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KThjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjÕubjÙ)�”}”(hŒ3Multiple VM functions tightly scoped within the VM ”h]”hþ)�”}”(hŒ2Multiple VM functions tightly scoped within the VM”h]”hŒ2Multiple VM functions tightly scoped within the VM”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KWhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjÕubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1jÓhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³hÇh´KQhj h²hubhþ)�”}”(hXKThe device may create a logical parent/child relationship between these scopes. For instance, a child VM's FW may be within the scope of the hypervisor FW. It is quite common in the VFIO world that the hypervisor environment has a complex provisioning/profiling/configuration responsibility for the function VFIO assigns to the VM.”h]”hXMThe device may create a logical parent/child relationship between these scopes. For instance, a child VM’s FW may be within the scope of the hypervisor FW. It is quite common in the VFIO world that the hypervisor environment has a complex provisioning/profiling/configuration responsibility for the function VFIO assigns to the VM.”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KYhj h²hubhþ)�”}”(hŒˆFurther, within the function, devices often have RPC commands that fall within some general scopes of action (see enum fwctl_rpc_scope):”h]”hŒˆFurther, within the function, devices often have RPC commands that fall within some general scopes of action (see enum fwctl_rpc_scope):”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K_hj h²hubjÎ)�”}”(hXz1. Access to function & child configuration, FLASH, etc. that becomes live at a function reset. Access to function & child runtime configuration that is transparent or non-disruptive to any driver or VM. 2. Read-only access to function debug information that may report on FW objects in the function & child, including FW objects owned by other kernel subsystems. 3. Write access to function & child debug information strictly compatible with the principles of kernel lockdown and kernel integrity protection. Triggers a kernel taint. 4. Full debug device access. Triggers a kernel taint, requires CAP_SYS_RAWIO. ”h]”jÔ)�”}”(hhh]”(jÙ)�”}”(hŒÉAccess to function & child configuration, FLASH, etc. that becomes live at a function reset. Access to function & child runtime configuration that is transparent or non-disruptive to any driver or VM. ”h]”hþ)�”}”(hŒÈAccess to function & child configuration, FLASH, etc. that becomes live at a function reset. Access to function & child runtime configuration that is transparent or non-disruptive to any driver or VM.”h]”hŒÈAccess to function & child configuration, FLASH, etc. that becomes live at a function reset. Access to function & child runtime configuration that is transparent or non-disruptive to any driver or VM.”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KbhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjSubjÙ)�”}”(hŒ�Read-only access to function debug information that may report on FW objects in the function & child, including FW objects owned by other kernel subsystems. ”h]”hþ)�”}”(hŒœRead-only access to function debug information that may report on FW objects in the function & child, including FW objects owned by other kernel subsystems.”h]”hŒœRead-only access to function debug information that may report on FW objects in the function & child, including FW objects owned by other kernel subsystems.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kfhjnubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjSubjÙ)�”}”(hŒ¨Write access to function & child debug information strictly compatible with the principles of kernel lockdown and kernel integrity protection. Triggers a kernel taint. ”h]”hþ)�”}”(hŒ§Write access to function & child debug information strictly compatible with the principles of kernel lockdown and kernel integrity protection. Triggers a kernel taint.”h]”hŒ§Write access to function & child debug information strictly compatible with the principles of kernel lockdown and kernel integrity protection. Triggers a kernel taint.”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kjhj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjSubjÙ)�”}”(hŒKFull debug device access. Triggers a kernel taint, requires CAP_SYS_RAWIO. ”h]”hþ)�”}”(hŒJFull debug device access. Triggers a kernel taint, requires CAP_SYS_RAWIO.”h]”hŒJFull debug device access. Triggers a kernel taint, requires CAP_SYS_RAWIO.”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Knhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjSubeh}”(h]”h ]”h"]”h$]”h&]”j(j)j*hj+j,uh1jÓhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³hÇh´Kbhj h²hubhþ)�”}”(hŒàUser space will provide a scope label on each RPC and the kernel must enforce the above CAPs and taints based on that scope. A combination of kernel and FW can enforce that RPCs are placed in the correct scope by user space.”h]”hŒàUser space will provide a scope label on each RPC and the kernel must enforce the above CAPs and taints based on that scope. A combination of kernel and FW can enforce that RPCs are placed in the correct scope by user space.”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kphj h²hubeh}”(h]”Œscope-of-action”ah ]”h"]”Œscope of action”ah$]”h&]”uh1hÈhjh²hh³hÇh´KFubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒDisallowed behavior”h]”hŒDisallowed behavior”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjØh²hh³hÇh´Kuubhþ)�”}”(hŒ¥There are many things this interface must not allow user space to do (without a taint or CAP), broadly derived from the principles of kernel lockdown. Some examples:”h]”hŒ¥There are many things this interface must not allow user space to do (without a taint or CAP), broadly derived from the principles of kernel lockdown. Some examples:”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KwhjØh²hubjÎ)�”}”(hXÁ1. DMA to/from arbitrary memory, hang the system, compromise FW integrity with untrusted code, or otherwise compromise device or system security and integrity. 2. Provide an abnormal “back doorâ€� to kernel drivers. No manipulation of kernel objects owned by kernel drivers. 3. Directly configure or otherwise control kernel drivers. A subsystem kernel driver can react to the device configuration at function reset/driver load time, but otherwise must not be coupled to fwctl. 4. Operate the HW in a way that overlaps with the core purpose of another primary kernel subsystem, such as read/write to LBAs, send/receive of network packets, or operate an accelerator's data plane. ”h]”jÔ)�”}”(hhh]”(jÙ)�”}”(hŒ�DMA to/from arbitrary memory, hang the system, compromise FW integrity with untrusted code, or otherwise compromise device or system security and integrity. ”h]”hþ)�”}”(hŒœDMA to/from arbitrary memory, hang the system, compromise FW integrity with untrusted code, or otherwise compromise device or system security and integrity.”h]”hŒœDMA to/from arbitrary memory, hang the system, compromise FW integrity with untrusted code, or otherwise compromise device or system security and integrity.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K{hjþubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjûubjÙ)�”}”(hŒrProvide an abnormal “back doorâ€� to kernel drivers. No manipulation of kernel objects owned by kernel drivers. ”h]”hþ)�”}”(hŒqProvide an abnormal “back doorâ€� to kernel drivers. No manipulation of kernel objects owned by kernel drivers.”h]”hŒqProvide an abnormal “back doorâ€� to kernel drivers. No manipulation of kernel objects owned by kernel drivers.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjûubjÙ)�”}”(hŒÈDirectly configure or otherwise control kernel drivers. A subsystem kernel driver can react to the device configuration at function reset/driver load time, but otherwise must not be coupled to fwctl. ”h]”hþ)�”}”(hŒÇDirectly configure or otherwise control kernel drivers. A subsystem kernel driver can react to the device configuration at function reset/driver load time, but otherwise must not be coupled to fwctl.”h]”hŒÇDirectly configure or otherwise control kernel drivers. A subsystem kernel driver can react to the device configuration at function reset/driver load time, but otherwise must not be coupled to fwctl.”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K‚hj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjûubjÙ)�”}”(hŒÆOperate the HW in a way that overlaps with the core purpose of another primary kernel subsystem, such as read/write to LBAs, send/receive of network packets, or operate an accelerator's data plane. ”h]”hþ)�”}”(hŒÅOperate the HW in a way that overlaps with the core purpose of another primary kernel subsystem, such as read/write to LBAs, send/receive of network packets, or operate an accelerator's data plane.”h]”hŒÇOperate the HW in a way that overlaps with the core purpose of another primary kernel subsystem, such as read/write to LBAs, send/receive of network packets, or operate an accelerator’s data plane.”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K†hjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjûubeh}”(h]”h ]”h"]”h$]”h&]”j(j)j*hj+j,uh1jÓhj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³hÇh´K{hjØh²hubhþ)�”}”(hŒRfwctl is not a replacement for device direct access subsystems like uacce or VFIO.”h]”hŒRfwctl is not a replacement for device direct access subsystems like uacce or VFIO.”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KŠhjØh²hubhþ)�”}”(hXÔOperations exposed through fwctl's non-tainting interfaces should be fully sharable with other users of the device. For instance, exposing a RPC through fwctl should never prevent a kernel subsystem from also concurrently using that same RPC or hardware unit down the road. In such cases fwctl will be less important than proper kernel subsystems that eventually emerge. Mistakes in this area resulting in clashes will be resolved in favour of a kernel implementation.”h]”hXÖOperations exposed through fwctl’s non-tainting interfaces should be fully sharable with other users of the device. For instance, exposing a RPC through fwctl should never prevent a kernel subsystem from also concurrently using that same RPC or hardware unit down the road. In such cases fwctl will be less important than proper kernel subsystems that eventually emerge. Mistakes in this area resulting in clashes will be resolved in favour of a kernel implementation.”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K�hjØh²hubeh}”(h]”Œdisallowed-behavior”ah ]”h"]”Œdisallowed behavior”ah$]”h&]”uh1hÈhjh²hh³hÇh´Kuubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfwctl User API”h]”hŒfwctl User API”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj–h²hh³hÇh´K•ubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œfwctl_info_bnxt (C struct)”Œc.fwctl_info_bnxt”hNt”auh1j§hj–h²hh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒfwctl_info_bnxt”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct fwctl_info_bnxt”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jÊhjÆh²hh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´KubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jÜhjÆh²hh³jÛh´KubhŒ desc_name”“”)�”}”(hŒfwctl_info_bnxt”h]”hŒ desc_sig_name”“”)�”}”(hjÂh]”hŒfwctl_info_bnxt”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jóhjïubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jíhjÆh²hh³jÛh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jÄŒsphinx_line_type”Œ declarator”hjÀh²hh³jÛh´Kubah}”(h]”j¶ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j¾h³jÛh´Khj»h²hubhŒ desc_content”“”)�”}”(hhh]”hþ)�”}”(hŒ!ioctl(FWCTL_INFO) out_device_data”h]”hŒ!ioctl(FWCTL_INFO) out_device_data”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´Khj!h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj»h²hh³jÛh´Kubeh}”(h]”h ]”(Œc”Œstruct”eh"]”h$]”h&]”Œdomain”j<Œobjtype”j=Œdesctype”j=Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j¹h²hhj–h³j¸h´NubhŒ container”“”)�”}”(hŒ�**Definition**:: struct fwctl_info_bnxt { __u32 uctx_caps; }; **Members** ``uctx_caps`` The command capabilities driver accepts.”h]”(hþ)�”}”(hŒ**Definition**::”h]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjMubhŒ:”…”�”}”(hjMh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´KhjIubhŒ literal_block”“”)�”}”(hŒ0struct fwctl_info_bnxt { __u32 uctx_caps; };”h]”hŒ0struct fwctl_info_bnxt { __u32 uctx_caps; };”…”�”}”hjnsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´KhjIubhþ)�”}”(hŒ **Members**”h]”jR)�”}”(hjh]”hŒMembers”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´KhjIubhŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒ6``uctx_caps`` The command capabilities driver accepts.”h]”(hŒterm”“”)�”}”(hŒ ``uctx_caps``”h]”hŒliteral”“”)�”}”(hj¤h]”hŒ uctx_caps”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´KhjœubhŒ definition”“”)�”}”(hhh]”hþ)�”}”(hŒ(The command capabilities driver accepts.”h]”hŒ(The command capabilities driver accepts.”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´Khj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjœubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j»h´Khj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjIubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhj–h²hh³j¸h´Nubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hjëh]”hŒ Description”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´Khj–h²hubhþ)�”}”(hŒ:Return basic information about the FW interface available.”h]”hŒ:Return basic information about the FW interface available.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œd/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:151: ./include/uapi/fwctl/bnxt.h”h´Khj–h²hubhŒtarget”“”)�”}”(hŒ.. _General ioctl format:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œgeneral-ioctl-format”uh1jh´Khj–h²hh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”ubhþ)�”}”(hŒ**General ioctl format**”h]”jR)�”}”(hj!h]”hŒGeneral ioctl format”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjubah}”(h]”jah ]”h"]”Œgeneral ioctl format”ah$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khj–h²hŒexpect_referenced_by_name”}”j4jsŒexpect_referenced_by_id”}”jjsubhþ)�”}”(hXxThe ioctl interface follows a general format to allow for extensibility. Each ioctl is passed a structure pointer as the argument providing the size of the structure in the first u32. The kernel checks that any structure space beyond what it understands is 0. This allows userspace to use the backward compatible portion while consistently using the newer, larger, structures.”h]”hXxThe ioctl interface follows a general format to allow for extensibility. Each ioctl is passed a structure pointer as the argument providing the size of the structure in the first u32. The kernel checks that any structure space beyond what it understands is 0. This allows userspace to use the backward compatible portion while consistently using the newer, larger, structures.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K hj–h²hubhþ)�”}”(hŒ0ioctls use a standard meaning for common errnos:”h]”hŒ0ioctls use a standard meaning for common errnos:”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khj–h²hubjÎ)�”}”(hX- ENOTTY: The IOCTL number itself is not supported at all - E2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand. - EOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support. - EINVAL: Everything about the IOCTL was understood, but a field is not correct. - ENOMEM: Out of memory. - ENODEV: The underlying device has been hot-unplugged and the FD is orphaned. ”h]”hŒ bullet_list”“”)�”}”(hhh]”(jÙ)�”}”(hŒ7ENOTTY: The IOCTL number itself is not supported at all”h]”hþ)�”}”(hjeh]”hŒ7ENOTTY: The IOCTL number itself is not supported at all”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhj`ubjÙ)�”}”(hŒwE2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand.”h]”hþ)�”}”(hŒwE2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand.”h]”hŒwE2BIG: The IOCTL number is supported, but the provided structure has non-zero in a part the kernel does not understand.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhj`ubjÙ)�”}”(hŒ˜EOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support.”h]”hþ)�”}”(hŒ˜EOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support.”h]”hŒ˜EOPNOTSUPP: The IOCTL number is supported, and the structure is understood, however a known field has a value the kernel does not understand or support.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhj`ubjÙ)�”}”(hŒNEINVAL: Everything about the IOCTL was understood, but a field is not correct.”h]”hþ)�”}”(hŒNEINVAL: Everything about the IOCTL was understood, but a field is not correct.”h]”hŒNEINVAL: Everything about the IOCTL was understood, but a field is not correct.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhj`ubjÙ)�”}”(hŒENOMEM: Out of memory.”h]”hþ)�”}”(hjÈh]”hŒENOMEM: Out of memory.”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´KhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhj`ubjÙ)�”}”(hŒUENODEV: The underlying device has been hot-unplugged and the FD is orphaned. ”h]”j–)�”}”(hhh]”j›)�”}”(hŒMENODEV: The underlying device has been hot-unplugged and the FD is orphaned. ”h]”(j¡)�”}”(hŒBENODEV: The underlying device has been hot-unplugged and the FD is”h]”hŒBENODEV: The underlying device has been hot-unplugged and the FD is”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Khjåubj½)�”}”(hhh]”hþ)�”}”(hŒ orphaned.”h]”hŒ orphaned.”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j÷h´Khjøubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j÷h´Khjâubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhj`ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j^h³jth´KhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³jth´Khj–h²hubhþ)�”}”(hŒ5As well as additional errnos, within specific ioctls.”h]”hŒ5As well as additional errnos, within specific ioctls.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K!hj–h²hubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_info (C struct)”Œ c.fwctl_info”hNt”auh1j§hj–h²hh³jh´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ fwctl_info”h]”jÅ)�”}”(hŒstruct fwctl_info”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhjSh²hh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K&ubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjSh²hh³jdh´K&ubjî)�”}”(hŒ fwctl_info”h]”jô)�”}”(hjQh]”hŒ fwctl_info”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhjsubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhjSh²hh³jdh´K&ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhjOh²hh³jdh´K&ubah}”(h]”jJah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³jdh´K&hjLh²hubj )�”}”(hhh]”hþ)�”}”(hŒioctl(FWCTL_INFO)”h]”hŒioctl(FWCTL_INFO)”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K4hj–h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjLh²hh³jdh´K&ubeh}”(h]”h ]”(j<Œstruct”eh"]”h$]”h&]”jAj<jBj±jCj±jD‰jE‰jF‰uh1j¹h²hhj–h³jh´NubjH)�”}”(hXŠ**Definition**:: struct fwctl_info { __u32 size; __u32 flags; __u32 out_device_type; __u32 device_data_len; __aligned_u64 out_device_data; }; **Members** ``size`` sizeof(struct fwctl_info) ``flags`` Must be 0 ``out_device_type`` Returns the type of the device from enum fwctl_device_type ``device_data_len`` On input the length of the out_device_data memory. On output the size of the kernel's device_data which may be larger or smaller than the input. Maybe 0 on input. ``out_device_data`` Pointer to a memory of device_data_len bytes. Kernel will fill the entire memory, zeroing as required.”h]”(hþ)�”}”(hŒ**Definition**::”h]”(jR)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj¹ubhŒ:”…”�”}”(hj¹h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K8hjµubjm)�”}”(hŒ�struct fwctl_info { __u32 size; __u32 flags; __u32 out_device_type; __u32 device_data_len; __aligned_u64 out_device_data; };”h]”hŒ�struct fwctl_info { __u32 size; __u32 flags; __u32 out_device_type; __u32 device_data_len; __aligned_u64 out_device_data; };”…”�”}”hjÖsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K:hjµubhþ)�”}”(hŒ **Members**”h]”jR)�”}”(hjçh]”hŒMembers”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´KBhjµubj–)�”}”(hhh]”(j›)�”}”(hŒ#``size`` sizeof(struct fwctl_info) ”h]”(j¡)�”}”(hŒ``size``”h]”j§)�”}”(hjh]”hŒsize”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K6hjubj½)�”}”(hhh]”hþ)�”}”(hŒsizeof(struct fwctl_info)”h]”hŒsizeof(struct fwctl_info)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jh´K6hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jh´K6hjýubj›)�”}”(hŒ``flags`` Must be 0 ”h]”(j¡)�”}”(hŒ ``flags``”h]”j§)�”}”(hj?h]”hŒflags”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K7hj9ubj½)�”}”(hhh]”hþ)�”}”(hŒ Must be 0”h]”hŒ Must be 0”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jTh´K7hjUubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jTh´K7hjýubj›)�”}”(hŒO``out_device_type`` Returns the type of the device from enum fwctl_device_type ”h]”(j¡)�”}”(hŒ``out_device_type``”h]”j§)�”}”(hjxh]”hŒout_device_type”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K8hjrubj½)�”}”(hhh]”hþ)�”}”(hŒ:Returns the type of the device from enum fwctl_device_type”h]”hŒ:Returns the type of the device from enum fwctl_device_type”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j�h´K8hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j�h´K8hjýubj›)�”}”(hŒ·``device_data_len`` On input the length of the out_device_data memory. On output the size of the kernel's device_data which may be larger or smaller than the input. Maybe 0 on input. ”h]”(j¡)�”}”(hŒ``device_data_len``”h]”j§)�”}”(hj±h]”hŒdevice_data_len”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K;hj«ubj½)�”}”(hhh]”hþ)�”}”(hŒ¢On input the length of the out_device_data memory. On output the size of the kernel's device_data which may be larger or smaller than the input. Maybe 0 on input.”h]”hŒ¤On input the length of the out_device_data memory. On output the size of the kernel’s device_data which may be larger or smaller than the input. Maybe 0 on input.”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´K9hjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj«ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jÆh´K;hjýubj›)�”}”(hŒz``out_device_data`` Pointer to a memory of device_data_len bytes. Kernel will fill the entire memory, zeroing as required.”h]”(j¡)�”}”(hŒ``out_device_data``”h]”j§)�”}”(hjëh]”hŒout_device_data”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjéubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:152: ./include/uapi/fwctl/fwctl.h”h´Kh²hh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´KubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhj>h²hh³jOh´Kubjî)�”}”(hŒpds_fwctl_capabilities”h]”jô)�”}”(hj<h]”hŒpds_fwctl_capabilities”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj^ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhj>h²hh³jOh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhj:h²hh³jOh´Kubah}”(h]”j5ah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³jOh´Khj7h²hubj )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jhj7h²hh³jOh´Kubeh}”(h]”h ]”(j<Œenum”eh"]”h$]”h&]”jAj<jBj�jCj�jD‰jE‰jF‰uh1j¹h²hhj–h³Nh´NubjH)�”}”(hŒˆ**Constants** ``PDS_FWCTL_QUERY_CAP`` firmware can be queried for information ``PDS_FWCTL_SEND_CAP`` firmware can be sent commands”h]”(hþ)�”}”(hŒ **Constants**”h]”jR)�”}”(hj—h]”hŒ Constants”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´Khj‘ubj–)�”}”(hhh]”(j›)�”}”(hŒ@``PDS_FWCTL_QUERY_CAP`` firmware can be queried for information ”h]”(j¡)�”}”(hŒ``PDS_FWCTL_QUERY_CAP``”h]”j§)�”}”(hj¶h]”hŒPDS_FWCTL_QUERY_CAP”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´Khj°ubj½)�”}”(hhh]”hþ)�”}”(hŒ'firmware can be queried for information”h]”hŒ'firmware can be queried for information”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jËh´KhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj°ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jËh´Khj­ubj›)�”}”(hŒ4``PDS_FWCTL_SEND_CAP`` firmware can be sent commands”h]”(j¡)�”}”(hŒ``PDS_FWCTL_SEND_CAP``”h]”j§)�”}”(hjïh]”hŒPDS_FWCTL_SEND_CAP”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjíubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K!hjéubj½)�”}”(hhh]”hþ)�”}”(hŒfirmware can be sent commands”h]”hŒfirmware can be sent commands”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K"hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjéubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jh´K!hj­ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j•hj‘ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhj–h²hh³Nh´Nubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_rpc_pds (C struct)”Œc.fwctl_rpc_pds”hNt”auh1j§hj–h²hh³Nh´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ fwctl_rpc_pds”h]”jÅ)�”}”(hŒstruct fwctl_rpc_pds”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhjEh²hh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K'ubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjEh²hh³jVh´K'ubjî)�”}”(hŒ fwctl_rpc_pds”h]”jô)�”}”(hjCh]”hŒ fwctl_rpc_pds”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhjeubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhjEh²hh³jVh´K'ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhjAh²hh³jVh´K'ubah}”(h]”j<ah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³jVh´K'hj>h²hubj )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jhj>h²hh³jVh´K'ubeh}”(h]”h ]”(j<Œstruct”eh"]”h$]”h&]”jAj<jBj”jCj”jD‰jE‰jF‰uh1j¹h²hhj–h³Nh´NubjH)�”}”(hXä**Definition**:: struct fwctl_rpc_pds { struct { __u32 op; __u32 ep; __u32 rsvd; __u32 len; __aligned_u64 payload; } in; struct { __u32 retval; __u32 rsvd[2]; __u32 len; __aligned_u64 payload; } out; }; **Members** ``in`` rpc in parameters ``in.op`` requested operation code ``in.ep`` firmware endpoint to operate on ``in.rsvd`` reserved ``in.len`` length of payload data ``in.payload`` address of payload buffer ``out`` rpc out parameters ``out.retval`` operation result value ``out.rsvd`` reserved ``out.len`` length of result data buffer ``out.payload`` address of payload data buffer”h]”(hþ)�”}”(hŒ**Definition**::”h]”(jR)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjœubhŒ:”…”�”}”(hjœh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K&hj˜ubjm)�”}”(hXstruct fwctl_rpc_pds { struct { __u32 op; __u32 ep; __u32 rsvd; __u32 len; __aligned_u64 payload; } in; struct { __u32 retval; __u32 rsvd[2]; __u32 len; __aligned_u64 payload; } out; };”h]”hXstruct fwctl_rpc_pds { struct { __u32 op; __u32 ep; __u32 rsvd; __u32 len; __aligned_u64 payload; } in; struct { __u32 retval; __u32 rsvd[2]; __u32 len; __aligned_u64 payload; } out; };”…”�”}”hj¹sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K(hj˜ubhþ)�”}”(hŒ **Members**”h]”jR)�”}”(hjÊh]”hŒMembers”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K8hj˜ubj–)�”}”(hhh]”(j›)�”}”(hŒ``in`` rpc in parameters ”h]”(j¡)�”}”(hŒ``in``”h]”j§)�”}”(hjéh]”hŒin”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjçubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K)hjãubj½)�”}”(hhh]”hþ)�”}”(hŒrpc in parameters”h]”hŒrpc in parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jþh´K)hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjãubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jþh´K)hjàubj›)�”}”(hŒ#``in.op`` requested operation code ”h]”(j¡)�”}”(hŒ ``in.op``”h]”j§)�”}”(hj"h]”hŒin.op”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K$hjubj½)�”}”(hhh]”hþ)�”}”(hŒrequested operation code”h]”hŒrequested operation code”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j7h´K$hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j7h´K$hjàubj›)�”}”(hŒ*``in.ep`` firmware endpoint to operate on ”h]”(j¡)�”}”(hŒ ``in.ep``”h]”j§)�”}”(hj[h]”hŒin.ep”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjYubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K%hjUubj½)�”}”(hhh]”hþ)�”}”(hŒfirmware endpoint to operate on”h]”hŒfirmware endpoint to operate on”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jph´K%hjqubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjUubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jph´K%hjàubj›)�”}”(hŒ``in.rsvd`` reserved ”h]”(j¡)�”}”(hŒ ``in.rsvd``”h]”j§)�”}”(hj”h]”hŒin.rsvd”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K&hjŽubj½)�”}”(hhh]”hþ)�”}”(hŒreserved”h]”hŒreserved”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j©h´K&hjªubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjŽubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j©h´K&hjàubj›)�”}”(hŒ"``in.len`` length of payload data ”h]”(j¡)�”}”(hŒ ``in.len``”h]”j§)�”}”(hjÍh]”hŒin.len”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjËubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K'hjÇubj½)�”}”(hhh]”hþ)�”}”(hŒlength of payload data”h]”hŒlength of payload data”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jâh´K'hjãubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjÇubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jâh´K'hjàubj›)�”}”(hŒ)``in.payload`` address of payload buffer ”h]”(j¡)�”}”(hŒ``in.payload``”h]”j§)�”}”(hjh]”hŒ in.payload”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K(hjubj½)�”}”(hhh]”hþ)�”}”(hŒaddress of payload buffer”h]”hŒaddress of payload buffer”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jh´K(hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jh´K(hjàubj›)�”}”(hŒ``out`` rpc out parameters ”h]”(j¡)�”}”(hŒ``out``”h]”j§)�”}”(hj?h]”hŒout”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K.hj9ubj½)�”}”(hhh]”hþ)�”}”(hŒrpc out parameters”h]”hŒrpc out parameters”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jTh´K.hjUubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jTh´K.hjàubj›)�”}”(hŒ&``out.retval`` operation result value ”h]”(j¡)�”}”(hŒ``out.retval``”h]”j§)�”}”(hjxh]”hŒ out.retval”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K*hjrubj½)�”}”(hhh]”hþ)�”}”(hŒoperation result value”h]”hŒoperation result value”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j�h´K*hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j�h´K*hjàubj›)�”}”(hŒ``out.rsvd`` reserved ”h]”(j¡)�”}”(hŒ ``out.rsvd``”h]”j§)�”}”(hj±h]”hŒout.rsvd”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K+hj«ubj½)�”}”(hhh]”hþ)�”}”(hŒreserved”h]”hŒreserved”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jÆh´K+hjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj«ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jÆh´K+hjàubj›)�”}”(hŒ)``out.len`` length of result data buffer ”h]”(j¡)�”}”(hŒ ``out.len``”h]”j§)�”}”(hjêh]”hŒout.len”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjèubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K,hjäubj½)�”}”(hhh]”hþ)�”}”(hŒlength of result data buffer”h]”hŒlength of result data buffer”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jÿh´K,hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjäubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jÿh´K,hjàubj›)�”}”(hŒ.``out.payload`` address of payload data buffer”h]”(j¡)�”}”(hŒ``out.payload``”h]”j§)�”}”(hj#h]”hŒ out.payload”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K,hjubj½)�”}”(hhh]”hþ)�”}”(hŒaddress of payload data buffer”h]”hŒaddress of payload data buffer”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œc/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:154: ./include/uapi/fwctl/pds.h”h´K-hj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j8h´K,hjàubeh}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhj–h²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ sysfs Class”h]”hŒ sysfs Class”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjdh²hh³hÇh´K�ubhþ)�”}”(hŒ»fwctl has a sysfs class (/sys/class/fwctl/fwctlNN/) and character devices (/dev/fwctl/fwctlNN) with a simple numbered scheme. The character device operates the iotcl uAPI described above.”h]”hŒ»fwctl has a sysfs class (/sys/class/fwctl/fwctlNN/) and character devices (/dev/fwctl/fwctlNN) with a simple numbered scheme. The character device operates the iotcl uAPI described above.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KŸhjdh²hubhþ)�”}”(hŒUfwctl devices can be related to driver components in other subsystems through sysfs::”h]”hŒTfwctl devices can be related to driver components in other subsystems through sysfs:”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K£hjdh²hubjm)�”}”(hŒÓ$ ls /sys/class/fwctl/fwctl0/device/infiniband/ ibp0s10f0 $ ls /sys/class/infiniband/ibp0s10f0/device/fwctl/ fwctl0/ $ ls /sys/devices/pci0000:00/0000:00:0a.0/fwctl/fwctl0 dev device power subsystem uevent”h]”hŒÓ$ ls /sys/class/fwctl/fwctl0/device/infiniband/ ibp0s10f0 $ ls /sys/class/infiniband/ibp0s10f0/device/fwctl/ fwctl0/ $ ls /sys/devices/pci0000:00/0000:00:0a.0/fwctl/fwctl0 dev device power subsystem uevent”…”�”}”hj‘sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³hÇh´K¦hjdh²hubeh}”(h]”Œ sysfs-class”ah ]”h"]”Œ sysfs class”ah$]”h&]”uh1hÈhj–h²hh³hÇh´K�ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒUser space Community”h]”hŒUser space Community”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj§h²hh³hÇh´K°ubhþ)�”}”(hŒýDrawing inspiration from nvme-cli, participating in the kernel side must come with a user space in a common TBD git tree, at a minimum to usefully operate the kernel driver. Providing such an implementation is a pre-condition to merging a kernel driver.”h]”hŒýDrawing inspiration from nvme-cli, participating in the kernel side must come with a user space in a common TBD git tree, at a minimum to usefully operate the kernel driver. Providing such an implementation is a pre-condition to merging a kernel driver.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K²hj§h²hubhþ)�”}”(hŒ«The goal is to build user space community around some of the shared problems we all have, and ideally develop some common user space programs with some starting themes of:”h]”hŒ«The goal is to build user space community around some of the shared problems we all have, and ideally develop some common user space programs with some starting themes of:”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K·hj§h²hubjÎ)�”}”(hŒŸ- Device in-field debugging - HW provisioning - VFIO child device profiling before VM boot - Confidential Compute topics (attestation, secure provisioning) ”h]”j_)�”}”(hhh]”(jÙ)�”}”(hŒDevice in-field debugging ”h]”hþ)�”}”(hŒDevice in-field debugging”h]”hŒDevice in-field debugging”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K»hjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjØubjÙ)�”}”(hŒHW provisioning ”h]”hþ)�”}”(hŒHW provisioning”h]”hŒHW provisioning”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K½hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjØubjÙ)�”}”(hŒ+VFIO child device profiling before VM boot ”h]”hþ)�”}”(hŒ*VFIO child device profiling before VM boot”h]”hŒ*VFIO child device profiling before VM boot”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K¿hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjØubjÙ)�”}”(hŒ?Confidential Compute topics (attestation, secure provisioning) ”h]”hþ)�”}”(hŒ>Confidential Compute topics (attestation, secure provisioning)”h]”hŒ>Confidential Compute topics (attestation, secure provisioning)”…”�”}”(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&]”j'j(uh1j^h³hÇh´K»hjÔubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³hÇh´K»hj§h²hubhþ)�”}”(hŒ�that stretch across all subsystems in the kernel. fwupd is a great example of how an excellent user space experience can emerge out of kernel-side diversity.”h]”hŒ�that stretch across all subsystems in the kernel. fwupd is a great example of how an excellent user space experience can emerge out of kernel-side diversity.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÃhj§h²hubeh}”(h]”Œuser-space-community”ah ]”h"]”Œuser space community”ah$]”h&]”uh1hÈhj–h²hh³hÇh´K°ubeh}”(h]”Œfwctl-user-api”ah ]”h"]”Œfwctl user api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K•ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfwctl Kernel API”h]”hŒfwctl Kernel API”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjeh²hh³hÇh´KÇubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_register (C function)”Œc.fwctl_register”hNt”auh1j§hjeh²hh³Nh´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ/int fwctl_register (struct fwctl_device *fwctl)”h]”jÅ)�”}”(hŒ.int fwctl_register(struct fwctl_device *fwctl)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1j�hj‹h²hh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´MXubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhj‹h²hh³j h´MXubjî)�”}”(hŒfwctl_register”h]”jô)�”}”(hŒfwctl_register”h]”hŒfwctl_register”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj¯ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhj‹h²hh³j h´MXubhŒdesc_parameterlist”“”)�”}”(hŒ(struct fwctl_device *fwctl)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct fwctl_device *fwctl”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhjÏubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjÏubh)�”}”(hhh]”jô)�”}”(hŒ fwctl_device”h]”hŒ fwctl_device”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhjîubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j<Œreftype”Œ identifier”Œ reftarget”jóŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”j Œ ASTIdentifier”“”)�”}”jjµsbŒc.fwctl_register”†”asbuh1hhjÏubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjÏubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j'hjÏubjô)�”}”(hŒfwctl”h]”hŒfwctl”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhjÏubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jÍhjÉubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÇhj‹h²hh³j h´MXubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhj‡h²hh³j h´MXubah}”(h]”j‚ah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³j h´MXhj„h²hubj )�”}”(hhh]”hþ)�”}”(hŒ&Register a new device to the subsystem”h]”hŒ&Register a new device to the subsystem”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´MXhj_h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj„h²hh³j h´MXubeh}”(h]”h ]”(j<Œfunction”eh"]”h$]”h&]”jAj<jBjzjCjzjD‰jE‰jF‰uh1j¹h²hhjeh³Nh´NubjH)�”}”(hŒ¶**Parameters** ``struct fwctl_device *fwctl`` Previously allocated fwctl_device **Description** On return the device is visible through sysfs and /dev, driver ops may be called.”h]”(hþ)�”}”(hŒ**Parameters**”h]”jR)�”}”(hj„h]”hŒ Parameters”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´M\hj~ubj–)�”}”(hhh]”j›)�”}”(hŒA``struct fwctl_device *fwctl`` Previously allocated fwctl_device ”h]”(j¡)�”}”(hŒ``struct fwctl_device *fwctl``”h]”j§)�”}”(hj£h]”hŒstruct fwctl_device *fwctl”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´MYhj�ubj½)�”}”(hhh]”hþ)�”}”(hŒ!Previously allocated fwctl_device”h]”hŒ!Previously allocated fwctl_device”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j¸h´MYhj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j¸h´MYhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj~ubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hjÞh]”hŒ Description”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´M[hj~ubhþ)�”}”(hŒQOn return the device is visible through sysfs and /dev, driver ops may be called.”h]”hŒQOn return the device is visible through sysfs and /dev, driver ops may be called.”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´MZhj~ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhjeh²hh³Nh´Nubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_unregister (C function)”Œc.fwctl_unregister”hNt”auh1j§hjeh²hh³Nh´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ2void fwctl_unregister (struct fwctl_device *fwctl)”h]”jÅ)�”}”(hŒ1void fwctl_unregister(struct fwctl_device *fwctl)”h]”(j�)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”jœah"]”h$]”h&]”uh1j�hjh²hh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´MeubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjh²hh³j1h´Meubjî)�”}”(hŒfwctl_unregister”h]”jô)�”}”(hŒfwctl_unregister”h]”hŒfwctl_unregister”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj@ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhjh²hh³j1h´MeubjÈ)�”}”(hŒ(struct fwctl_device *fwctl)”h]”jÎ)�”}”(hŒstruct fwctl_device *fwctl”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhj\ubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhj\ubh)�”}”(hhh]”jô)�”}”(hŒ fwctl_device”h]”hŒ fwctl_device”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj{ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j<Œreftype”jŒ reftarget”j€Œmodname”NŒ classname”Nj j)�”}”j]”j)�”}”jjFsbŒc.fwctl_unregister”†”asbuh1hhj\ubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhj\ubj()�”}”(hj+h]”hŒ*”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”j4ah"]”h$]”h&]”uh1j'hj\ubjô)�”}”(hŒfwctl”h]”hŒfwctl”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj\ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jÍhjXubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jÇhjh²hh³j1h´Meubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhjh²hh³j1h´Meubah}”(h]”jah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³j1h´Mehjh²hubj )�”}”(hhh]”hþ)�”}”(hŒ&Unregister a device from the subsystem”h]”hŒ&Unregister a device from the subsystem”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mehjàh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjh²hh³j1h´Meubeh}”(h]”h ]”(j<Œfunction”eh"]”h$]”h&]”jAj<jBjûjCjûjD‰jE‰jF‰uh1j¹h²hhjeh³Nh´NubjH)�”}”(hX**Parameters** ``struct fwctl_device *fwctl`` Previously allocated and registered fwctl_device **Description** Undoes fwctl_register(). On return no driver ops will be called. The caller must still call fwctl_put() to free the fwctl. Unregister will return even if userspace still has file descriptors open. This will call ops->close_uctx() on any open FDs and after return no driver op will be called. The FDs remain open but all fops will return -ENODEV. The design of fwctl allows this sort of disassociation of the driver from the subsystem primarily by keeping memory allocations owned by the core subsytem. The fwctl_device and fwctl_uctx can both be freed without requiring a driver callback. This allows the module to remain unlocked while FDs are open.”h]”(hþ)�”}”(hŒ**Parameters**”h]”jR)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mihjÿubj–)�”}”(hhh]”j›)�”}”(hŒP``struct fwctl_device *fwctl`` Previously allocated and registered fwctl_device ”h]”(j¡)�”}”(hŒ``struct fwctl_device *fwctl``”h]”j§)�”}”(hj$h]”hŒstruct fwctl_device *fwctl”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mfhjubj½)�”}”(hhh]”hþ)�”}”(hŒ0Previously allocated and registered fwctl_device”h]”hŒ0Previously allocated and registered fwctl_device”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j9h´Mfhj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j9h´Mfhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hj_h]”hŒ Description”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mhhjÿubhþ)�”}”(hŒzUndoes fwctl_register(). On return no driver ops will be called. The caller must still call fwctl_put() to free the fwctl.”h]”hŒzUndoes fwctl_register(). On return no driver ops will be called. The caller must still call fwctl_put() to free the fwctl.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mghjÿubhþ)�”}”(hŒÞUnregister will return even if userspace still has file descriptors open. This will call ops->close_uctx() on any open FDs and after return no driver op will be called. The FDs remain open but all fops will return -ENODEV.”h]”hŒÞUnregister will return even if userspace still has file descriptors open. This will call ops->close_uctx() on any open FDs and after return no driver op will be called. The FDs remain open but all fops will return -ENODEV.”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mjhjÿubhþ)�”}”(hX0The design of fwctl allows this sort of disassociation of the driver from the subsystem primarily by keeping memory allocations owned by the core subsytem. The fwctl_device and fwctl_uctx can both be freed without requiring a driver callback. This allows the module to remain unlocked while FDs are open.”h]”hX0The design of fwctl allows this sort of disassociation of the driver from the subsystem primarily by keeping memory allocations owned by the core subsytem. The fwctl_device and fwctl_uctx can both be freed without requiring a driver callback. This allows the module to remain unlocked while FDs are open.”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ_/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:201: ./drivers/fwctl/main.c”h´Mnhjÿubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhjeh²hh³Nh´Nubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_ops (C struct)”Œ c.fwctl_ops”hNt”auh1j§hjeh²hh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ fwctl_ops”h]”jÅ)�”}”(hŒstruct fwctl_ops”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhj¿h²hh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhj¿h²hh³jÐh´Kubjî)�”}”(hŒ fwctl_ops”h]”jô)�”}”(hj½h]”hŒ fwctl_ops”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhjßubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhj¿h²hh³jÐh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhj»h²hh³jÐh´Kubah}”(h]”jµah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³jÐh´Khj¸h²hubj )�”}”(hhh]”hþ)�”}”(hŒDriver provided operations”h]”hŒDriver provided operations”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¸h²hh³jÐh´Kubeh}”(h]”h ]”(j<Œstruct”eh"]”h$]”h&]”jAj<jBjjCjjD‰jE‰jF‰uh1j¹h²hhjeh³j·h´NubjH)�”}”(hX6**Definition**:: struct fwctl_ops { enum fwctl_device_type device_type; size_t uctx_size; int (*open_uctx)(struct fwctl_uctx *uctx); void (*close_uctx)(struct fwctl_uctx *uctx); void *(*info)(struct fwctl_uctx *uctx, size_t *length); void *(*fw_rpc)(struct fwctl_uctx *uctx, enum fwctl_rpc_scope scope, void *rpc_in, size_t in_len, size_t *out_len); }; **Members** ``device_type`` The drivers assigned device_type number. This is uABI. ``uctx_size`` The size of the fwctl_uctx struct to allocate. The first bytes of this memory will be a fwctl_uctx. The driver can use the remaining bytes as its private memory. ``open_uctx`` Called when a file descriptor is opened before the uctx is ever used. ``close_uctx`` Called when the uctx is destroyed, usually when the FD is closed. ``info`` Implement FWCTL_INFO. Return a kmalloc() memory that is copied to out_device_data. On input length indicates the size of the user buffer on output it indicates the size of the memory. The driver can ignore length on input, the core code will handle everything. ``fw_rpc`` Implement FWCTL_RPC. Deliver rpc_in/in_len to the FW and return the response and set out_len. rpc_in can be returned as the response pointer. Otherwise the returned pointer is freed with kvfree().”h]”(hþ)�”}”(hŒ**Definition**::”h]”(jR)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj%ubhŒ:”…”�”}”(hj%h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khj!ubjm)�”}”(hXgstruct fwctl_ops { enum fwctl_device_type device_type; size_t uctx_size; int (*open_uctx)(struct fwctl_uctx *uctx); void (*close_uctx)(struct fwctl_uctx *uctx); void *(*info)(struct fwctl_uctx *uctx, size_t *length); void *(*fw_rpc)(struct fwctl_uctx *uctx, enum fwctl_rpc_scope scope, void *rpc_in, size_t in_len, size_t *out_len); };”h]”hXgstruct fwctl_ops { enum fwctl_device_type device_type; size_t uctx_size; int (*open_uctx)(struct fwctl_uctx *uctx); void (*close_uctx)(struct fwctl_uctx *uctx); void *(*info)(struct fwctl_uctx *uctx, size_t *length); void *(*fw_rpc)(struct fwctl_uctx *uctx, enum fwctl_rpc_scope scope, void *rpc_in, size_t in_len, size_t *out_len); };”…”�”}”hjBsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khj!ubhþ)�”}”(hŒ **Members**”h]”jR)�”}”(hjSh]”hŒMembers”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khj!ubj–)�”}”(hhh]”(j›)�”}”(hŒG``device_type`` The drivers assigned device_type number. This is uABI. ”h]”(j¡)�”}”(hŒ``device_type``”h]”j§)�”}”(hjrh]”hŒ device_type”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjpubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khjlubj½)�”}”(hhh]”hþ)�”}”(hŒ6The drivers assigned device_type number. This is uABI.”h]”hŒ6The drivers assigned device_type number. This is uABI.”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j‡h´Khjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjlubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j‡h´Khjiubj›)�”}”(hŒ°``uctx_size`` The size of the fwctl_uctx struct to allocate. The first bytes of this memory will be a fwctl_uctx. The driver can use the remaining bytes as its private memory. ”h]”(j¡)�”}”(hŒ ``uctx_size``”h]”j§)�”}”(hj«h]”hŒ uctx_size”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khj¥ubj½)�”}”(hhh]”hþ)�”}”(hŒ¡The size of the fwctl_uctx struct to allocate. The first bytes of this memory will be a fwctl_uctx. The driver can use the remaining bytes as its private memory.”h]”hŒ¡The size of the fwctl_uctx struct to allocate. The first bytes of this memory will be a fwctl_uctx. The driver can use the remaining bytes as its private memory.”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj¥ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jÀh´Khjiubj›)�”}”(hŒT``open_uctx`` Called when a file descriptor is opened before the uctx is ever used. ”h]”(j¡)�”}”(hŒ ``open_uctx``”h]”j§)�”}”(hjåh]”hŒ open_uctx”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjãubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K$hjßubj½)�”}”(hhh]”hþ)�”}”(hŒECalled when a file descriptor is opened before the uctx is ever used.”h]”hŒECalled when a file descriptor is opened before the uctx is ever used.”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K#hjûubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjßubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³júh´K$hjiubj›)�”}”(hŒQ``close_uctx`` Called when the uctx is destroyed, usually when the FD is closed. ”h]”(j¡)�”}”(hŒ``close_uctx``”h]”j§)�”}”(hjh]”hŒ close_uctx”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K)hjubj½)�”}”(hhh]”hþ)�”}”(hŒACalled when the uctx is destroyed, usually when the FD is closed.”h]”hŒACalled when the uctx is destroyed, usually when the FD is closed.”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K(hj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j4h´K)hjiubj›)�”}”(hX``info`` Implement FWCTL_INFO. Return a kmalloc() memory that is copied to out_device_data. On input length indicates the size of the user buffer on output it indicates the size of the memory. The driver can ignore length on input, the core code will handle everything. ”h]”(j¡)�”}”(hŒ``info``”h]”j§)�”}”(hjYh]”hŒinfo”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjWubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K0hjSubj½)�”}”(hhh]”hþ)�”}”(hXImplement FWCTL_INFO. Return a kmalloc() memory that is copied to out_device_data. On input length indicates the size of the user buffer on output it indicates the size of the memory. The driver can ignore length on input, the core code will handle everything.”h]”hXImplement FWCTL_INFO. Return a kmalloc() memory that is copied to out_device_data. On input length indicates the size of the user buffer on output it indicates the size of the memory. The driver can ignore length on input, the core code will handle everything.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K-hjoubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjSubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jnh´K0hjiubj›)�”}”(hŒÏ``fw_rpc`` Implement FWCTL_RPC. Deliver rpc_in/in_len to the FW and return the response and set out_len. rpc_in can be returned as the response pointer. Otherwise the returned pointer is freed with kvfree().”h]”(j¡)�”}”(hŒ ``fw_rpc``”h]”j§)�”}”(hj“h]”hŒfw_rpc”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K6hj�ubj½)�”}”(hhh]”hþ)�”}”(hŒÄImplement FWCTL_RPC. Deliver rpc_in/in_len to the FW and return the response and set out_len. rpc_in can be returned as the response pointer. Otherwise the returned pointer is freed with kvfree().”h]”hŒÄImplement FWCTL_RPC. Deliver rpc_in/in_len to the FW and return the response and set out_len. rpc_in can be returned as the response pointer. Otherwise the returned pointer is freed with kvfree().”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K4hj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³j¨h´K6hjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1j•hj!ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhjeh²hh³j·h´Nubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hjÖh]”hŒ Description”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÔubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K:hjeh²hubhþ)�”}”(hŒÍfwctl_unregister() will wait until all excuting ops are completed before it returns. Drivers should be mindful to not let their ops run for too long as it will block device hot unplug and module unloading.”h]”hŒÍfwctl_unregister() will wait until all excuting ops are completed before it returns. Drivers should be mindful to not let their ops run for too long as it will block device hot unplug and module unloading.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khjeh²hubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_device (C struct)”Œc.fwctl_device”hNt”auh1j§hjeh²hh³j·h´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ fwctl_device”h]”jÅ)�”}”(hŒstruct fwctl_device”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhjh²hh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjh²hh³j!h´Kubjî)�”}”(hŒ fwctl_device”h]”jô)�”}”(hjh]”hŒ fwctl_device”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj0ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhjh²hh³j!h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhj h²hh³j!h´Kubah}”(h]”jah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³j!h´Khj h²hubj )�”}”(hhh]”hþ)�”}”(hŒPer-driver registration struct”h]”hŒPer-driver registration struct”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K=hjSh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj h²hh³j!h´Kubeh}”(h]”h ]”(j<Œstruct”eh"]”h$]”h&]”jAj<jBjnjCjnjD‰jE‰jF‰uh1j¹h²hhjeh³j·h´NubjH)�”}”(hŒ†**Definition**:: struct fwctl_device { struct device dev; }; **Members** ``dev`` The sysfs (class/fwctl/fwctlXX) device”h]”(hþ)�”}”(hŒ**Definition**::”h]”(jR)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjvubhŒ:”…”�”}”(hjvh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KAhjrubjm)�”}”(hŒ/struct fwctl_device { struct device dev; };”h]”hŒ/struct fwctl_device { struct device dev; };”…”�”}”hj“sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KChjrubhþ)�”}”(hŒ **Members**”h]”jR)�”}”(hj¤h]”hŒMembers”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KGhjrubj–)�”}”(hhh]”j›)�”}”(hŒ.``dev`` The sysfs (class/fwctl/fwctlXX) device”h]”(j¡)�”}”(hŒ``dev``”h]”j§)�”}”(hjÃh]”hŒdev”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K>hj½ubj½)�”}”(hhh]”hþ)�”}”(hŒ&The sysfs (class/fwctl/fwctlXX) device”h]”hŒ&The sysfs (class/fwctl/fwctlXX) device”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K?hjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj½ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jØh´K>hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjrubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhjeh²hh³j·h´Nubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hjh]”hŒ Description”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KBhjeh²hubhþ)�”}”(hŒ¬Each driver instance will have one of these structs with the driver private data following immediately after. This struct is refcounted, it is freed by calling fwctl_put().”h]”hŒ¬Each driver instance will have one of these structs with the driver private data following immediately after. This struct is refcounted, it is freed by calling fwctl_put().”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K?hjeh²hubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_alloc_device (C macro)”Œc.fwctl_alloc_device”hNt”auh1j§hjeh²hh³j·h´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒfwctl_alloc_device”h]”jÅ)�”}”(hŒfwctl_alloc_device”h]”jî)�”}”(hŒfwctl_alloc_device”h]”jô)�”}”(hj>h]”hŒfwctl_alloc_device”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhjDubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhj@h²hh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KXubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhj<h²hh³j[h´KXubah}”(h]”j7ah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³j[h´KXhj9h²hubj )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1jhj9h²hh³j[h´KXubeh}”(h]”h ]”(j<Œmacro”eh"]”h$]”h&]”jAj<jBjtjCjtjD‰jE‰jF‰uh1j¹h²hhjeh³j·h´Nubhþ)�”}”(hŒ8``fwctl_alloc_device (parent, ops, drv_struct, member)``”h]”j§)�”}”(hjzh]”hŒ4fwctl_alloc_device (parent, ops, drv_struct, member)”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjxubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KZhjeh²hubjÎ)�”}”(hŒAllocate a fwctl ”h]”hþ)�”}”(hŒAllocate a fwctl”h]”hŒAllocate a fwctl”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KXhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³j¢h´KXhjeh²hubjH)�”}”(hXÃ**Parameters** ``parent`` Physical device that provides the FW interface ``ops`` Driver ops to register ``drv_struct`` 'struct driver_fwctl' that holds the struct fwctl_device ``member`` Name of the struct fwctl_device in **drv_struct** **Description** This allocates and initializes the fwctl_device embedded in the drv_struct. Upon success the pointer must be freed via fwctl_put(). Returns a 'drv_struct \*' on success, NULL on error.”h]”(hþ)�”}”(hŒ**Parameters**”h]”jR)�”}”(hj¯h]”hŒ Parameters”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K\hj©ubj–)�”}”(hhh]”(j›)�”}”(hŒ:``parent`` Physical device that provides the FW interface ”h]”(j¡)�”}”(hŒ ``parent``”h]”j§)�”}”(hjÎh]”hŒparent”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KYhjÈubj½)�”}”(hhh]”hþ)�”}”(hŒ.Physical device that provides the FW interface”h]”hŒ.Physical device that provides the FW interface”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jãh´KYhjäubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjÈubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jãh´KYhjÅubj›)�”}”(hŒ``ops`` Driver ops to register ”h]”(j¡)�”}”(hŒ``ops``”h]”j§)�”}”(hjh]”hŒops”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KZhjubj½)�”}”(hhh]”hþ)�”}”(hŒDriver ops to register”h]”hŒDriver ops to register”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jh´KZhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jh´KZhjÅubj›)�”}”(hŒH``drv_struct`` 'struct driver_fwctl' that holds the struct fwctl_device ”h]”(j¡)�”}”(hŒ``drv_struct``”h]”j§)�”}”(hj@h]”hŒ drv_struct”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K[hj:ubj½)�”}”(hhh]”hþ)�”}”(hŒ8'struct driver_fwctl' that holds the struct fwctl_device”h]”hŒ<‘struct driver_fwctl’ that holds the struct fwctl_device”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jUh´K[hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj:ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jUh´K[hjÅubj›)�”}”(hŒ=``member`` Name of the struct fwctl_device in **drv_struct** ”h]”(j¡)�”}”(hŒ ``member``”h]”j§)�”}”(hjyh]”hŒmember”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K\hjsubj½)�”}”(hhh]”hþ)�”}”(hŒ1Name of the struct fwctl_device in **drv_struct**”h]”(hŒ#Name of the struct fwctl_device in ”…”�”}”(hj’h²hh³Nh´NubjR)�”}”(hŒ**drv_struct**”h]”hŒ drv_struct”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jŽh´K\hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jŽh´K\hjÅubeh}”(h]”h ]”h"]”h$]”h&]”uh1j•hj©ubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hjÂh]”hŒ Description”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K^hj©ubhþ)�”}”(hŒ¸This allocates and initializes the fwctl_device embedded in the drv_struct. Upon success the pointer must be freed via fwctl_put(). Returns a 'drv_struct \*' on success, NULL on error.”h]”hŒ¼This allocates and initializes the fwctl_device embedded in the drv_struct. Upon success the pointer must be freed via fwctl_put(). Returns a ‘drv_struct *’ on success, NULL on error.”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K]hj©ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhjeh²hh³j·h´Nubj¨)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j´Œfwctl_uctx (C struct)”Œ c.fwctl_uctx”hNt”auh1j§hjeh²hh³j·h´Nubjº)�”}”(hhh]”(j¿)�”}”(hŒ fwctl_uctx”h]”jÅ)�”}”(hŒstruct fwctl_uctx”h]”(jË)�”}”(hjÎh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j×ah"]”h$]”h&]”uh1jÊhjh²hh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KdubjÝ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jéah"]”h$]”h&]”uh1jÜhjh²hh³jh´Kdubjî)�”}”(hŒ fwctl_uctx”h]”jô)�”}”(hjh]”hŒ fwctl_uctx”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jÿah"]”h$]”h&]”uh1jóhj#ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jíhjh²hh³jh´Kdubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjˆuh1jÄjjhjÿh²hh³jh´Kdubah}”(h]”júah ]”(jjeh"]”h$]”h&]”jˆj)jhuh1j¾h³jh´Kdhjüh²hubj )�”}”(hhh]”hþ)�”}”(hŒPer user FD context”h]”hŒPer user FD context”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´KzhjFh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjüh²hh³jh´Kdubeh}”(h]”h ]”(j<Œstruct”eh"]”h$]”h&]”jAj<jBjajCjajD‰jE‰jF‰uh1j¹h²hhjeh³j·h´NubjH)�”}”(hŒ�**Definition**:: struct fwctl_uctx { struct fwctl_device *fwctl; }; **Members** ``fwctl`` fwctl instance that owns the context”h]”(hþ)�”}”(hŒ**Definition**::”h]”(jR)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhjiubhŒ:”…”�”}”(hjih²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K~hjeubjm)�”}”(hŒ6struct fwctl_uctx { struct fwctl_device *fwctl; };”h]”hŒ6struct fwctl_uctx { struct fwctl_device *fwctl; };”…”�”}”hj†sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jlh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K€hjeubhþ)�”}”(hŒ **Members**”h]”jR)�”}”(hj—h]”hŒMembers”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K„hjeubj–)�”}”(hhh]”j›)�”}”(hŒ.``fwctl`` fwctl instance that owns the context”h]”(j¡)�”}”(hŒ ``fwctl``”h]”j§)�”}”(hj¶h]”hŒfwctl”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¦hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K{hj°ubj½)�”}”(hhh]”hþ)�”}”(hŒ$fwctl instance that owns the context”h]”hŒ$fwctl instance that owns the context”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K|hjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j¼hj°ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jšh³jËh´K{hj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjeubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jGhjeh²hh³j·h´Nubhþ)�”}”(hŒ**Description**”h]”jR)�”}”(hjùh]”hŒ Description”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jQhj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´Khjeh²hubhþ)�”}”(hŒyEvery FD opened by userspace will get a unique context allocation. Any driver private data will follow immediately after.”h]”hŒyEvery FD opened by userspace will get a unique context allocation. Any driver private data will follow immediately after.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œ`/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl:203: ./include/linux/fwctl.h”h´K|hjeh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfwctl Driver design”h]”hŒfwctl Driver design”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KÎubhþ)�”}”(hXkIn many cases a fwctl driver is going to be part of a larger cross-subsystem device possibly using the auxiliary_device mechanism. In that case several subsystems are going to be sharing the same device and FW interface layer so the device design must already provide for isolation and cooperation between kernel subsystems. fwctl should fit into that same model.”h]”hXkIn many cases a fwctl driver is going to be part of a larger cross-subsystem device possibly using the auxiliary_device mechanism. In that case several subsystems are going to be sharing the same device and FW interface layer so the device design must already provide for isolation and cooperation between kernel subsystems. fwctl should fit into that same model.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÐhjh²hubhþ)�”}”(hXØPart of the driver should include a description of how its scope restrictions and security model work. The driver and FW together must ensure that RPCs provided by user space are mapped to the appropriate scope. If the validation is done in the driver then the validation can read a 'command effects' report from the device, or hardwire the enforcement. If the validation is done in the FW, then the driver should pass the fwctl_rpc_scope to the FW along with the command.”h]”hXÜPart of the driver should include a description of how its scope restrictions and security model work. The driver and FW together must ensure that RPCs provided by user space are mapped to the appropriate scope. If the validation is done in the driver then the validation can read a ‘command effects’ report from the device, or hardwire the enforcement. If the validation is done in the FW, then the driver should pass the fwctl_rpc_scope to the FW along with the command.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÖhjh²hubhþ)�”}”(hXEThe driver and FW must cooperate to ensure that either fwctl cannot allocate any FW resources, or any resources it does allocate are freed on FD closure. A driver primarily constructed around FW RPCs may find that its core PCI function and RPC layer belongs under fwctl with auxiliary devices connecting to other subsystems.”h]”hXEThe driver and FW must cooperate to ensure that either fwctl cannot allocate any FW resources, or any resources it does allocate are freed on FD closure. A driver primarily constructed around FW RPCs may find that its core PCI function and RPC layer belongs under fwctl with auxiliary devices connecting to other subsystems.”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÝhjh²hubhþ)�”}”(hXREach device type must be mindful of Linux's philosophy for stable ABI. The FW RPC interface does not have to meet a strictly stable ABI, but it does need to meet an expectation that user space tools that are deployed and in significant use don't needlessly break. FW upgrade and kernel upgrade should keep widely deployed tooling working.”h]”hXVEach device type must be mindful of Linux’s philosophy for stable ABI. The FW RPC interface does not have to meet a strictly stable ABI, but it does need to meet an expectation that user space tools that are deployed and in significant use don’t needlessly break. FW upgrade and kernel upgrade should keep widely deployed tooling working.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kãhjh²hubhþ)�”}”(hXVDevelopment and debugging focused RPCs under more permissive scopes can have less stability if the tools using them are only run under exceptional circumstances and not for every day use of the device. Debugging tools may even require exact version matching as they may require something similar to DWARF debug information from the FW binary.”h]”hXVDevelopment and debugging focused RPCs under more permissive scopes can have less stability if the tools using them are only run under exceptional circumstances and not for every day use of the device. Debugging tools may even require exact version matching as they may require something similar to DWARF debug information from the FW binary.”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kéhjh²hubeh}”(h]”Œfwctl-driver-design”ah ]”h"]”Œfwctl driver design”ah$]”h&]”uh1hÈhjeh²hh³hÇh´KÎubeh}”(h]”Œfwctl-kernel-api”ah ]”h"]”Œfwctl kernel api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KÇubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSecurity Response”h]”hŒSecurity Response”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj…h²hh³hÇh´Kðubhþ)�”}”(hX.The kernel remains the gatekeeper for this interface. If violations of the scopes, security or isolation principles are found, we have options to let devices fix them with a FW update, push a kernel patch to parse and block RPC commands or push a kernel patch to block entire firmware versions/devices.”h]”hX.The kernel remains the gatekeeper for this interface. If violations of the scopes, security or isolation principles are found, we have options to let devices fix them with a FW update, push a kernel patch to parse and block RPC commands or push a kernel patch to block entire firmware versions/devices.”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kòhj…h²hubhþ)�”}”(hŒµWhile the kernel can always directly parse and restrict RPCs, it is expected that the existing kernel pattern of allowing drivers to delegate validation to FW to be a useful design.”h]”hŒµWhile the kernel can always directly parse and restrict RPCs, it is expected that the existing kernel pattern of allowing drivers to delegate validation to FW to be a useful design.”…”�”•I$}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K÷hj…h²hubeh}”(h]”Œsecurity-response”ah ]”h"]”Œsecurity response”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KðubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒExisting Similar Examples”h]”hŒExisting Similar Examples”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjºh²hh³hÇh´Küubhþ)�”}”(hXkThe approach described in this document is not a new idea. Direct, or near direct device access has been offered by the kernel in different areas for decades. With more devices wanting to follow this design pattern it is becoming clear that it is not entirely well understood and, more importantly, the security considerations are not well defined or agreed upon.”h]”hXkThe approach described in this document is not a new idea. Direct, or near direct device access has been offered by the kernel in different areas for decades. With more devices wanting to follow this design pattern it is becoming clear that it is not entirely well understood and, more importantly, the security considerations are not well defined or agreed upon.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kþhjºh²hubhþ)�”}”(hŒSome examples:”h]”hŒSome examples:”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhjºh²hubjÎ)�”}”(hXµ- HW RAID controllers. This includes RPCs to do things like compose drives into a RAID volume, configure RAID parameters, monitor the HW and more. - Baseboard managers. RPCs for configuring settings in the device and more. - NVMe vendor command capsules. nvme-cli provides access to some monitoring functions that different products have defined, but more exist. - CXL also has a NVMe-like vendor command system. - DRM allows user space drivers to send commands to the device via kernel mediation. - RDMA allows user space drivers to directly push commands to the device without kernel involvement. - Various “rawâ€� APIs, raw HID (SDL2), raw USB, NVMe Generic Interface, etc. ”h]”j_)�”}”(hhh]”(jÙ)�”}”(hŒ‘HW RAID controllers. This includes RPCs to do things like compose drives into a RAID volume, configure RAID parameters, monitor the HW and more. ”h]”hþ)�”}”(hŒ�HW RAID controllers. This includes RPCs to do things like compose drives into a RAID volume, configure RAID parameters, monitor the HW and more.”h]”hŒ�HW RAID controllers. This includes RPCs to do things like compose drives into a RAID volume, configure RAID parameters, monitor the HW and more.”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubjÙ)�”}”(hŒJBaseboard managers. RPCs for configuring settings in the device and more. ”h]”hþ)�”}”(hŒIBaseboard managers. RPCs for configuring settings in the device and more.”h]”hŒIBaseboard managers. RPCs for configuring settings in the device and more.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´M hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubjÙ)�”}”(hŒŠNVMe vendor command capsules. nvme-cli provides access to some monitoring functions that different products have defined, but more exist. ”h]”hþ)�”}”(hŒ‰NVMe vendor command capsules. nvme-cli provides access to some monitoring functions that different products have defined, but more exist.”h]”hŒ‰NVMe vendor command capsules. nvme-cli provides access to some monitoring functions that different products have defined, but more exist.”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´M hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubjÙ)�”}”(hŒ0CXL also has a NVMe-like vendor command system. ”h]”hþ)�”}”(hŒ/CXL also has a NVMe-like vendor command system.”h]”hŒ/CXL also has a NVMe-like vendor command system.”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubjÙ)�”}”(hŒSDRM allows user space drivers to send commands to the device via kernel mediation. ”h]”hþ)�”}”(hŒRDRM allows user space drivers to send commands to the device via kernel mediation.”h]”hŒRDRM allows user space drivers to send commands to the device via kernel mediation.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´MhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubjÙ)�”}”(hŒcRDMA allows user space drivers to directly push commands to the device without kernel involvement. ”h]”hþ)�”}”(hŒbRDMA allows user space drivers to directly push commands to the device without kernel involvement.”h]”hŒbRDMA allows user space drivers to directly push commands to the device without kernel involvement.”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubjÙ)�”}”(hŒNVarious “rawâ€� APIs, raw HID (SDL2), raw USB, NVMe Generic Interface, etc. ”h]”hþ)�”}”(hŒMVarious “rawâ€� APIs, raw HID (SDL2), raw USB, NVMe Generic Interface, etc.”h]”hŒMVarious “rawâ€� APIs, raw HID (SDL2), raw USB, NVMe Generic Interface, etc.”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jØhjëubeh}”(h]”h ]”h"]”h$]”h&]”j'j(uh1j^h³hÇh´Mhjçubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍh³hÇh´Mhjºh²hubhþ)�”}”(hŒ¹The first 4 are examples of areas that fwctl intends to cover. The latter three are examples of disallowed behavior as they fully overlap with the primary purpose of a kernel subsystem.”h]”hŒ¹The first 4 are examples of areas that fwctl intends to cover. The latter three are examples of disallowed behavior as they fully overlap with the primary purpose of a kernel subsystem.”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhjºh²hubhþ)�”}”(hX-Some key lessons learned from these past efforts are the importance of having a common user space project to use as a pre-condition for obtaining a kernel driver. Developing good community around useful software in user space is key to getting companies to fund participation to enable their products.”h]”hX-Some key lessons learned from these past efforts are the importance of having a common user space project to use as a pre-condition for obtaining a kernel driver. Developing good community around useful software in user space is key to getting companies to fund participation to enable their products.”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Mhjºh²hubeh}”(h]”Œexisting-similar-examples”ah ]”h"]”Œexisting similar examples”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Küubeh}”(h]”Œfwctl-subsystem”ah ]”h"]”Œfwctl subsystem”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”}”j]”jasŒnameids”}”(jËjÈj“j�jÕjÒj‹jˆjbj_j4jj¤j¡jZjWj‚jjzjwj·j´jÃjÀuŒ nametypes”}”(jˉj“‰jÕ‰j‹‰jb‰j4ˆj¤‰jZ‰j‚‰jz‰j·‰jÉuh}”(jÈhÊj�jjÒj jˆjØj_j–j¶jÀjjjJjOj^jcjM jR j© j¯ jjj5j:j<jAj¡jdjWj§jjej‚j‡jjjµj»jj j7j<jújÿjwjj´j…jÀ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”]”Œtransform_messages”]”hŒsystem_message”“”)�”}”(hhh]”hþ)�”}”(hhh]”hŒ:Hyperlink target "general-ioctl-format" is not referenced.”…”�”}”hj[ sbah}”(h]”h ]”h"]”h$]”h&]”uh1hýhjX ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”jŒline”Kuh1jV ubaŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.