€•Æ­Œ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”Œ1/translations/zh_CN/userspace-api/fwctl/fwctl-cxl”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/zh_TW/userspace-api/fwctl/fwctl-cxl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/it_IT/userspace-api/fwctl/fwctl-cxl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/ja_JP/userspace-api/fwctl/fwctl-cxl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/ko_KR/userspace-api/fwctl/fwctl-cxl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/pt_BR/userspace-api/fwctl/fwctl-cxl”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ1/translations/sp_SP/userspace-api/fwctl/fwctl-cxl”Œ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³ŒK/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒfwctl cxl driver”h]”hŒfwctl cxl driver”…”�”}”(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Œ Dave Jiang ”h]”hŒ paragraph”“”)�”}”(hŒ Dave Jiang”h]”hŒ Dave Jiang”…”�”}”(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þ)�”}”(hX6The CXL spec defines a set of commands that can be issued to the mailbox of a CXL device or switch. It also left room for vendor specific commands to be issued to the mailbox as well. fwctl provides a path to issue a set of allowed mailbox commands from user space to the device moderated by the kernel driver.”h]”hX6The CXL spec defines a set of commands that can be issued to the mailbox of a CXL device or switch. It also left room for vendor specific commands to be issued to the mailbox as well. fwctl provides a path to issue a set of allowed mailbox commands from user space to the device moderated by the kernel driver.”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K hjh²hubhþ)�”}”(hŒâThe following 3 commands will be used to support CXL Features: CXL spec r3.1 8.2.9.6.1 Get Supported Features (Opcode 0500h) CXL spec r3.1 8.2.9.6.2 Get Feature (Opcode 0501h) CXL spec r3.1 8.2.9.6.3 Set Feature (Opcode 0502h)”h]”hŒâThe following 3 commands will be used to support CXL Features: CXL spec r3.1 8.2.9.6.1 Get Supported Features (Opcode 0500h) CXL spec r3.1 8.2.9.6.2 Get Feature (Opcode 0501h) CXL spec r3.1 8.2.9.6.3 Set Feature (Opcode 0502h)”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khjh²hubhþ)�”}”(hXºThe "Get Supported Features" return data may be filtered by the kernel driver to drop any features that are forbidden by the kernel or being exclusively used by the kernel. The driver will set the "Set Feature Size" of the "Get Supported Features Supported Feature Entry" to 0 to indicate that the Feature cannot be modified. The "Get Supported Features" command and the "Get Features" falls under the fwctl policy of FWCTL_RPC_CONFIGURATION.”h]”hXÎThe “Get Supported Featuresâ€� return data may be filtered by the kernel driver to drop any features that are forbidden by the kernel or being exclusively used by the kernel. The driver will set the “Set Feature Sizeâ€� of the “Get Supported Features Supported Feature Entryâ€� to 0 to indicate that the Feature cannot be modified. The “Get Supported Featuresâ€� command and the “Get Featuresâ€� falls under the fwctl policy of FWCTL_RPC_CONFIGURATION.”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khjh²hubhþ)�”}”(hXWFor "Set Feature" command, the access policy currently is broken down into two categories depending on the Set Feature effects reported by the device. If the Set Feature will cause immediate change to the device, the fwctl access policy must be FWCTL_RPC_DEBUG_WRITE_FULL. The effects for this level are "immediate config change", "immediate data change", "immediate policy change", or "immediate log change" for the set effects mask. If the effects are "config change with cold reset" or "config change with conventional reset", then the fwctl access policy must be FWCTL_RPC_DEBUG_WRITE or higher.”h]”hXsFor “Set Featureâ€� command, the access policy currently is broken down into two categories depending on the Set Feature effects reported by the device. If the Set Feature will cause immediate change to the device, the fwctl access policy must be FWCTL_RPC_DEBUG_WRITE_FULL. The effects for this level are “immediate config changeâ€�, “immediate data changeâ€�, “immediate policy changeâ€�, or “immediate log changeâ€� for the set effects mask. If the effects are “config change with cold resetâ€� or “config change with conventional resetâ€�, then the fwctl access policy must be FWCTL_RPC_DEBUG_WRITE or higher.”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khjh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfwctl cxl User API”h]”hŒfwctl cxl User API”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjph²hh³hÇh´K'ubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œfwctl_rpc_cxl (C struct)”Œc.fwctl_rpc_cxl”hNt”auh1j�hjph²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ fwctl_rpc_cxl”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct fwctl_rpc_cxl”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³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.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_rpc_cxl”h]”hŒ desc_sig_name”“”)�”}”(hj›h]”hŒ fwctl_rpc_cxl”…”�”}”(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_RPC) input for CXL”h]”hŒioctl(FWCTL_RPC) input for CXL”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khjúh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jøhj”h²hh³j´h´Kubeh}”(h]”h ]”(Œc”Œstruct”eh"]”h$]”h&]”Œdomain”jŒobjtype”jŒdesctype”jŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j’h²hhjph³Nh´NubhŒ container”“”)�”}”(hXÕ**Definition**:: struct fwctl_rpc_cxl { struct { __u32 opcode; __u32 flags; __u32 op_size; __u32 reserved1; }; union { struct cxl_mbox_get_sup_feats_in get_sup_feats_in; struct cxl_mbox_get_feat_in get_feat_in; struct cxl_mbox_set_feat_in set_feat_in; }; }; **Members** ``{unnamed_struct}`` anonymous ``opcode`` CXL mailbox command opcode ``flags`` Flags for the command (input). ``op_size`` Size of input payload. ``reserved1`` Reserved. Must be 0s. ``{unnamed_union}`` anonymous ``get_sup_feats_in`` Get Supported Features input ``get_feat_in`` Get Feature input ``set_feat_in`` Set Feature input”h]”(hþ)�”}”(hŒ**Definition**::”h]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj&ubhŒ:”…”�”}”(hj&h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj"ubhŒ literal_block”“”)�”}”(hX8struct fwctl_rpc_cxl { struct { __u32 opcode; __u32 flags; __u32 op_size; __u32 reserved1; }; union { struct cxl_mbox_get_sup_feats_in get_sup_feats_in; struct cxl_mbox_get_feat_in get_feat_in; struct cxl_mbox_set_feat_in set_feat_in; }; };”h]”hX8struct fwctl_rpc_cxl { struct { __u32 opcode; __u32 flags; __u32 op_size; __u32 reserved1; }; union { struct cxl_mbox_get_sup_feats_in get_sup_feats_in; struct cxl_mbox_get_feat_in get_feat_in; struct cxl_mbox_set_feat_in set_feat_in; }; };”…”�”}”hjGsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jEh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj"ubhþ)�”}”(hŒ **Members**”h]”j+)�”}”(hjXh]”hŒMembers”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K#hj"ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ``{unnamed_struct}`` anonymous ”h]”(hŒterm”“”)�”}”(hŒ``{unnamed_struct}``”h]”hŒliteral”“”)�”}”(hj}h]”hŒ{unnamed_struct}”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´KhjuubhŒ definition”“”)�”}”(hhh]”hþ)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j”h´Khj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³j”h´Khjpubjt)�”}”(hŒ&``opcode`` CXL mailbox command opcode ”h]”(jz)�”}”(hŒ ``opcode``”h]”j€)�”}”(hjºh]”hŒopcode”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj´ubj–)�”}”(hhh]”hþ)�”}”(hŒCXL mailbox command opcode”h]”hŒCXL mailbox command opcode”…”�”}”(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&]”uh1jsh³jÏh´Khjpubjt)�”}”(hŒ)``flags`` Flags for the command (input). ”h]”(jz)�”}”(hŒ ``flags``”h]”j€)�”}”(hjóh]”hŒflags”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjñubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khjíubj–)�”}”(hhh]”hþ)�”}”(hŒFlags for the command (input).”h]”hŒFlags for the command (input).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jh´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jh´Khjpubjt)�”}”(hŒ#``op_size`` Size of input payload. ”h]”(jz)�”}”(hŒ ``op_size``”h]”j€)�”}”(hj,h]”hŒop_size”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj&ubj–)�”}”(hhh]”hþ)�”}”(hŒSize of input payload.”h]”hŒSize of input payload.”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jAh´KhjBubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jAh´Khjpubjt)�”}”(hŒ$``reserved1`` Reserved. Must be 0s. ”h]”(jz)�”}”(hŒ ``reserved1``”h]”j€)�”}”(hjeh]”hŒ reserved1”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj_ubj–)�”}”(hhh]”hþ)�”}”(hŒReserved. Must be 0s.”h]”hŒReserved. Must be 0s.”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jzh´Khj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jzh´Khjpubjt)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(jz)�”}”(hŒ``{unnamed_union}``”h]”j€)�”}”(hjžh]”hŒ{unnamed_union}”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj˜ubj–)�”}”(hhh]”hþ)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(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&]”uh1jsh³j³h´Khjpubjt)�”}”(hŒ2``get_sup_feats_in`` Get Supported Features input ”h]”(jz)�”}”(hŒ``get_sup_feats_in``”h]”j€)�”}”(hj×h]”hŒget_sup_feats_in”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´KhjÑubj–)�”}”(hhh]”hþ)�”}”(hŒGet Supported Features input”h]”hŒGet Supported Features input”…”�”}”(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&]”uh1jsh³jìh´Khjpubjt)�”}”(hŒ"``get_feat_in`` Get Feature input ”h]”(jz)�”}”(hŒ``get_feat_in``”h]”j€)�”}”(hjh]”hŒ get_feat_in”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj ubj–)�”}”(hhh]”hþ)�”}”(hŒGet Feature input”h]”hŒGet Feature input”…”�”}”(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&]”uh1jsh³j%h´Khjpubjt)�”}”(hŒ!``set_feat_in`` Set Feature input”h]”(jz)�”}”(hŒ``set_feat_in``”h]”j€)�”}”(hjIh]”hŒ set_feat_in”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjGubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´KhjCubj–)�”}”(hhh]”hþ)�”}”(hŒSet Feature input”h]”hŒSet Feature input”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjCubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³j^h´Khjpubeh}”(h]”h ]”h"]”h$]”h&]”uh1jnhj"ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjph²hh³Nh´Nubj‚)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŽŒfwctl_rpc_cxl_out (C struct)”Œc.fwctl_rpc_cxl_out”hNt”auh1j�hjph²hh³Nh´Nubj“)�”}”(hhh]”(j˜)�”}”(hŒfwctl_rpc_cxl_out”h]”jž)�”}”(hŒstruct fwctl_rpc_cxl_out”h]”(j¤)�”}”(hj§h]”hŒstruct”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”j°ah"]”h$]”h&]”uh1j£hjŸh²hh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.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_rpc_cxl_out”h]”jÍ)�”}”(hj�h]”hŒfwctl_rpc_cxl_out”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jÌhj¿ubah}”(h]”h ]”(jßjàeh"]”h$]”h&]”hÅhÆuh1jÆhjŸh²hh³j°h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjêˆuh1j�jëjìhj›h²hh³j°h´Kubah}”(h]”j–ah ]”(jðjñeh"]”h$]”h&]”jõˆjö)j÷huh1j—h³j°h´Khj˜h²hubjù)�”}”(hhh]”hþ)�”}”(hŒioctl(FWCTL_RPC) output for CXL”h]”hŒioctl(FWCTL_RPC) output for CXL”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K'hjâh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jøhj˜h²hh³j°h´Kubeh}”(h]”h ]”(jŒstruct”eh"]”h$]”h&]”jjjjýjjýj‰j‰j‰uh1j’h²hhjph³Nh´Nubj!)�”}”(hXè**Definition**:: struct fwctl_rpc_cxl_out { struct { __u32 size; __u32 retval; }; union { struct cxl_mbox_get_sup_feats_out get_sup_feats_out; __u8 payload[]; }; }; **Members** ``{unnamed_struct}`` anonymous ``size`` Size of the output payload ``retval`` Return value from device ``{unnamed_union}`` anonymous ``get_sup_feats_out`` Get Supported Features output ``payload`` raw byte stream of payload”h]”(hþ)�”}”(hŒ**Definition**::”h]”(j+)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjubhŒ:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K+hjubjF)�”}”(hŒÃstruct fwctl_rpc_cxl_out { struct { __u32 size; __u32 retval; }; union { struct cxl_mbox_get_sup_feats_out get_sup_feats_out; __u8 payload[]; }; };”h]”hŒÃstruct fwctl_rpc_cxl_out { struct { __u32 size; __u32 retval; }; union { struct cxl_mbox_get_sup_feats_out get_sup_feats_out; __u8 payload[]; }; };”…”�”}”hj"sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jEh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K-hjubhþ)�”}”(hŒ **Members**”h]”j+)�”}”(hj3h]”hŒMembers”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K8hjubjo)�”}”(hhh]”(jt)�”}”(hŒ``{unnamed_struct}`` anonymous ”h]”(jz)�”}”(hŒ``{unnamed_struct}``”h]”j€)�”}”(hjRh]”hŒ{unnamed_struct}”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´KhjLubj–)�”}”(hhh]”hþ)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jgh´Khjhubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jgh´KhjIubjt)�”}”(hŒ$``size`` Size of the output payload ”h]”(jz)�”}”(hŒ``size``”h]”j€)�”}”(hj‹h]”hŒsize”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K)hj…ubj–)�”}”(hhh]”hþ)�”}”(hŒSize of the output payload”h]”hŒSize of the output payload”…”�”}”(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&]”uh1jsh³j h´K)hjIubjt)�”}”(hŒ$``retval`` Return value from device ”h]”(jz)�”}”(hŒ ``retval``”h]”j€)�”}”(hjÄh]”hŒretval”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K*hj¾ubj–)�”}”(hhh]”hþ)�”}”(hŒReturn value from device”h]”hŒReturn value from device”…”�”}”(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&]”uh1jsh³jÙh´K*hjIubjt)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(jz)�”}”(hŒ``{unnamed_union}``”h]”j€)�”}”(hjýh]”hŒ{unnamed_union}”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´Khj÷ubj–)�”}”(hhh]”hþ)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jh´KhjIubjt)�”}”(hŒ4``get_sup_feats_out`` Get Supported Features output ”h]”(jz)�”}”(hŒ``get_sup_feats_out``”h]”j€)�”}”(hj6h]”hŒget_sup_feats_out”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K+hj0ubj–)�”}”(hhh]”hþ)�”}”(hŒGet Supported Features output”h]”hŒGet Supported Features output”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³jKh´K+hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jKh´K+hjIubjt)�”}”(hŒ&``payload`` raw byte stream of payload”h]”(jz)�”}”(hŒ ``payload``”h]”j€)�”}”(hjoh]”hŒpayload”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjmubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K+hjiubj–)�”}”(hhh]”hþ)�”}”(hŒraw byte stream of payload”h]”hŒraw byte stream of payload”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œf/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:41: ./include/uapi/fwctl/cxl.h”h´K,hj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³j„h´K+hjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jnhjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjph²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ1. Driver info query”h]”hŒ1. Driver info query”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj°h²hh³hÇh´K,ubhþ)�”}”(hX£First step for the app is to issue the ioctl(FWCTL_CMD_INFO). Successful invocation of the ioctl implies the Features capability is operational and returns an all zeros 32bit payload. A ``struct fwctl_info`` needs to be filled out with the ``fwctl_info.out_device_type`` set to ``FWCTL_DEVICE_TYPE_CXL``. The return data should be ``struct fwctl_info_cxl`` that contains a reserved 32bit field that should be all zeros.”h]”(hŒºFirst step for the app is to issue the ioctl(FWCTL_CMD_INFO). Successful invocation of the ioctl implies the Features capability is operational and returns an all zeros 32bit payload. A ”…”�”}”(hjÁh²hh³Nh´Nubj€)�”}”(hŒ``struct fwctl_info``”h]”hŒstruct fwctl_info”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÁubhŒ! needs to be filled out with the ”…”�”}”(hjÁh²hh³Nh´Nubj€)�”}”(hŒ``fwctl_info.out_device_type``”h]”hŒfwctl_info.out_device_type”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÁubhŒ set to ”…”�”}”(hjÁh²hh³Nh´Nubj€)�”}”(hŒ``FWCTL_DEVICE_TYPE_CXL``”h]”hŒFWCTL_DEVICE_TYPE_CXL”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÁubhŒ. The return data should be ”…”�”}”(hjÁh²hh³Nh´Nubj€)�”}”(hŒ``struct fwctl_info_cxl``”h]”hŒstruct fwctl_info_cxl”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÁubhŒ? that contains a reserved 32bit field that should be all zeros.”…”�”}”(hjÁh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K.hj°h²hubeh}”(h]”Œdriver-info-query”ah ]”h"]”Œ1. driver info query”ah$]”h&]”uh1hÈhjph²hh³hÇh´K,ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ2. Send hardware commands”h]”hŒ2. Send hardware commands”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K6ubhþ)�”}”(hX^Next step is to send the 'Get Supported Features' command to the driver from user space via ioctl(FWCTL_RPC). A ``struct fwctl_rpc_cxl`` is pointed to by ``fwctl_rpc.in``. ``struct fwctl_rpc_cxl.in_payload`` points to the hardware input structure that is defined by the CXL spec. ``fwctl_rpc.out`` points to the buffer that contains a ``struct fwctl_rpc_cxl_out`` that includes the hardware output data inlined as ``fwctl_rpc_cxl_out.payload``. This command is called twice. First time to retrieve the number of features supported. A second time to retrieve the specific feature details as the output data.”h]”(hŒtNext step is to send the ‘Get Supported Features’ command to the driver from user space via ioctl(FWCTL_RPC). A ”…”�”}”(hj0h²hh³Nh´Nubj€)�”}”(hŒ``struct fwctl_rpc_cxl``”h]”hŒstruct fwctl_rpc_cxl”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ is pointed to by ”…”�”}”(hj0h²hh³Nh´Nubj€)�”}”(hŒ``fwctl_rpc.in``”h]”hŒ fwctl_rpc.in”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ. ”…”�”}”(hj0h²hh³Nh´Nubj€)�”}”(hŒ#``struct fwctl_rpc_cxl.in_payload``”h]”hŒstruct fwctl_rpc_cxl.in_payload”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒI points to the hardware input structure that is defined by the CXL spec. ”…”�”}”(hj0h²hh³Nh´Nubj€)�”}”(hŒ``fwctl_rpc.out``”h]”hŒ fwctl_rpc.out”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ& points to the buffer that contains a ”…”�”}”(hj0h²hh³Nh´Nubj€)�”}”(hŒ``struct fwctl_rpc_cxl_out``”h]”hŒstruct fwctl_rpc_cxl_out”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ3 that includes the hardware output data inlined as ”…”�”}”(hj0h²hh³Nh´Nubj€)�”}”(hŒ``fwctl_rpc_cxl_out.payload``”h]”hŒfwctl_rpc_cxl_out.payload”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubhŒ£. This command is called twice. First time to retrieve the number of features supported. A second time to retrieve the specific feature details as the output data.”…”�”}”(hj0h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K8hjh²hubhþ)�”}”(hXhAfter getting the specific feature details, a Get/Set Feature command can be appropriately programmed and sent. For a "Set Feature" command, the retrieved feature info contains an effects field that details the resulting "Set Feature" command will trigger. That will inform the user whether the system is configured to allowed the "Set Feature" command or not.”h]”hXtAfter getting the specific feature details, a Get/Set Feature command can be appropriately programmed and sent. For a “Set Featureâ€� command, the retrieved feature info contains an effects field that details the resulting “Set Featureâ€� command will trigger. That will inform the user whether the system is configured to allowed the “Set Featureâ€� command or not.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KAhjh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCode example of a Get Feature”h]”hŒCode example of a Get Feature”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¸h²hh³hÇh´KHubjF)�”}”(hXBstatic int cxl_fwctl_rpc_get_test_feature(int fd, struct test_feature *feat_ctx, const uint32_t expected_data) { struct cxl_mbox_get_feat_in *feat_in; struct fwctl_rpc_cxl_out *out; struct fwctl_rpc rpc = {0}; struct fwctl_rpc_cxl *in; size_t out_size, in_size; uint32_t val; void *data; int rc; in_size = sizeof(*in) + sizeof(*feat_in); rc = posix_memalign((void **)&in, 16, in_size); if (rc) return -ENOMEM; memset(in, 0, in_size); feat_in = &in->get_feat_in; uuid_copy(feat_in->uuid, feat_ctx->uuid); feat_in->count = feat_ctx->get_size; out_size = sizeof(*out) + feat_ctx->get_size; rc = posix_memalign((void **)&out, 16, out_size); if (rc) goto free_in; memset(out, 0, out_size); in->opcode = CXL_MBOX_OPCODE_GET_FEATURE; in->op_size = sizeof(*feat_in); rpc.size = sizeof(rpc); rpc.scope = FWCTL_RPC_CONFIGURATION; rpc.in_len = in_size; rpc.out_len = out_size; rpc.in = (uint64_t)(uint64_t *)in; rpc.out = (uint64_t)(uint64_t *)out; rc = send_command(fd, &rpc, out); if (rc) goto free_all; data = out->payload; val = le32toh(*(__le32 *)data); if (memcmp(&val, &expected_data, sizeof(val)) != 0) { rc = -ENXIO; goto free_all; } free_all: free(out); free_in: free(in); return rc; }”h]”hXBstatic int cxl_fwctl_rpc_get_test_feature(int fd, struct test_feature *feat_ctx, const uint32_t expected_data) { struct cxl_mbox_get_feat_in *feat_in; struct fwctl_rpc_cxl_out *out; struct fwctl_rpc rpc = {0}; struct fwctl_rpc_cxl *in; size_t out_size, in_size; uint32_t val; void *data; int rc; in_size = sizeof(*in) + sizeof(*feat_in); rc = posix_memalign((void **)&in, 16, in_size); if (rc) return -ENOMEM; memset(in, 0, in_size); feat_in = &in->get_feat_in; uuid_copy(feat_in->uuid, feat_ctx->uuid); feat_in->count = feat_ctx->get_size; out_size = sizeof(*out) + feat_ctx->get_size; rc = posix_memalign((void **)&out, 16, out_size); if (rc) goto free_in; memset(out, 0, out_size); in->opcode = CXL_MBOX_OPCODE_GET_FEATURE; in->op_size = sizeof(*feat_in); rpc.size = sizeof(rpc); rpc.scope = FWCTL_RPC_CONFIGURATION; rpc.in_len = in_size; rpc.out_len = out_size; rpc.in = (uint64_t)(uint64_t *)in; rpc.out = (uint64_t)(uint64_t *)out; rc = send_command(fd, &rpc, out); if (rc) goto free_all; data = out->payload; val = le32toh(*(__le32 *)data); if (memcmp(&val, &expected_data, sizeof(val)) != 0) { rc = -ENXIO; goto free_all; } free_all: free(out); free_in: free(in); return rc; }”…”�”}”hjÉsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”jŒhighlight_args”}”uh1jEh³hÇh´KJhj¸h²hubhþ)�”}”(hŒ Take a look at CXL CLI test directory for a detailed user code for examples on how to exercise this path.”h]”(hŒ'Take a look at CXL CLI test directory <”…”�”}”(hjÛh²hh³Nh´NubhŒ reference”“”)�”}”(hŒ4https://github.com/pmem/ndctl/tree/main/test/fwctl.c”h]”hŒ4https://github.com/pmem/ndctl/tree/main/test/fwctl.c”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jçuh1jãhjÛubhŒE> for a detailed user code for examples on how to exercise this path.”…”�”}”(hjÛh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K„hj¸h²hubeh}”(h]”Œcode-example-of-a-get-feature”ah ]”h"]”Œcode example of a get feature”ah$]”h&]”uh1hÈhjh²hh³hÇh´KHubeh}”(h]”Œsend-hardware-commands”ah ]”h"]”Œ2. send hardware commands”ah$]”h&]”uh1hÈhjph²hh³hÇh´K6ubeh}”(h]”Œfwctl-cxl-user-api”ah ]”h"]”Œfwctl cxl user api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K'ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒfwctl cxl Kernel API”h]”hŒfwctl cxl Kernel API”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KŠubj‚)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŽŒ$devm_cxl_setup_features (C function)”Œc.devm_cxl_setup_features”hNt”auh1j�hjh²hh³Nh´Nubj“)�”}”(hhh]”(j˜)�”}”(hŒ9int devm_cxl_setup_features (struct cxl_dev_state *cxlds)”h]”jž)�”}”(hŒ8int devm_cxl_setup_features(struct cxl_dev_state *cxlds)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1j@hj<h²hh³Œj/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:140: ./drivers/cxl/core/features.c”h´KÂubj¶)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”jÂah"]”h$]”h&]”uh1jµhj<h²hh³jQh´KÂubjÇ)�”}”(hŒdevm_cxl_setup_features”h]”jÍ)�”}”(hŒdevm_cxl_setup_features”h]”hŒdevm_cxl_setup_features”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jÌhj`ubah}”(h]”h ]”(jßjàeh"]”h$]”h&]”hÅhÆuh1jÆhj<h²hh³jQh´KÂubhŒdesc_parameterlist”“”)�”}”(hŒ(struct cxl_dev_state *cxlds)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct cxl_dev_state *cxlds”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Œ cxl_dev_state”h]”hŒ cxl_dev_state”…”�”}”(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”“”)�”}”j¸jfsbŒc.devm_cxl_setup_features”†”asbuh1hhj€ubj¶)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÊh²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Œcxlds”h]”hŒcxlds”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jÌhj€ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j~hjzubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jxhj<h²hh³jQh´KÂubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjêˆuh1j�jëjìhj8h²hh³jQh´KÂubah}”(h]”j3ah ]”(jðjñeh"]”h$]”h&]”jõˆjö)j÷huh1j—h³jQh´KÂhj5h²hubjù)�”}”(hhh]”hþ)�”}”(hŒ(Allocate and initialize features context”h]”hŒ(Allocate and initialize features context”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œj/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:140: ./drivers/cxl/core/features.c”h´KÂhj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jøhj5h²hh³jQh´KÂubeh}”(h]”h ]”(jŒfunction”eh"]”h$]”h&]”jjjj+ jj+ j‰j‰j‰uh1j’h²hhjh³Nh´Nubj!)�”}”(hŒ€**Parameters** ``struct cxl_dev_state *cxlds`` CXL device context **Description** Return 0 on success or -errno on failure.”h]”(hþ)�”}”(hŒ**Parameters**”h]”j+)�”}”(hj5 h]”hŒ Parameters”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj3 ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œj/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:140: ./drivers/cxl/core/features.c”h´KÆhj/ ubjo)�”}”(hhh]”jt)�”}”(hŒ3``struct cxl_dev_state *cxlds`` CXL device context ”h]”(jz)�”}”(hŒ``struct cxl_dev_state *cxlds``”h]”j€)�”}”(hjT h]”hŒstruct cxl_dev_state *cxlds”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjR ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œj/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:140: ./drivers/cxl/core/features.c”h´KÃhjN ubj–)�”}”(hhh]”hþ)�”}”(hŒCXL device context”h]”hŒCXL device context”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³ji h´KÃhjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjN ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³ji h´KÃhjK ubah}”(h]”h ]”h"]”h$]”h&]”uh1jnhj/ ubhþ)�”}”(hŒ**Description**”h]”j+)�”}”(hj� h]”hŒ Description”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œj/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:140: ./drivers/cxl/core/features.c”h´KÅhj/ ubhþ)�”}”(hŒ)Return 0 on success or -errno on failure.”h]”hŒ)Return 0 on success or -errno on failure.”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œj/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:140: ./drivers/cxl/core/features.c”h´KÄhj/ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjh²hh³Nh´Nubj‚)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŽŒcxl_features_state (C struct)”Œc.cxl_features_state”hNt”auh1j�hjh²hh³Nh´Nubj“)�”}”(hhh]”(j˜)�”}”(hŒcxl_features_state”h]”jž)�”}”(hŒstruct cxl_features_state”h]”(j¤)�”}”(hj§h]”hŒstruct”…”�”}”(hjÔ h²hh³Nh´Nubah}”(h]”h ]”j°ah"]”h$]”h&]”uh1j£hjÐ h²hh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.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Œcxl_features_state”h]”jÍ)�”}”(hjÎ h]”hŒcxl_features_state”…”�”}”(hjô h²hh³Nh´Nubah}”(h]”h ]”jØah"]”h$]”h&]”uh1jÌhjð ubah}”(h]”h ]”(jßjàeh"]”h$]”h&]”hÅhÆuh1jÆhjÐ h²hh³já h´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆjêˆuh1j�jëjìhjÌ h²hh³já h´Kubah}”(h]”jÇ ah ]”(jðjñeh"]”h$]”h&]”jõˆjö)j÷huh1j—h³já h´KhjÉ h²hubjù)�”}”(hhh]”hþ)�”}”(hŒ!The Features state for the device”h]”hŒ!The Features state for the device”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´K3hj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jøhjÉ h²hh³já h´Kubeh}”(h]”h ]”(jŒstruct”eh"]”h$]”h&]”jjjj. jj. j‰j‰j‰uh1j’h²hhjh³Nh´Nubj!)�”}”(hXL**Definition**:: struct cxl_features_state { struct cxl_dev_state *cxlds; struct cxl_feat_entries { int num_features; int num_user_features; struct cxl_feat_entry ent[]; } *entries; }; **Members** ``cxlds`` Pointer to CXL device state ``entries`` CXl feature entry context”h]”(hþ)�”}”(hŒ**Definition**::”h]”(j+)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj: h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hj6 ubhŒ:”…”�”}”(hj6 h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´K7hj2 ubjF)�”}”(hŒËstruct cxl_features_state { struct cxl_dev_state *cxlds; struct cxl_feat_entries { int num_features; int num_user_features; struct cxl_feat_entry ent[]; } *entries; };”h]”hŒËstruct cxl_features_state { struct cxl_dev_state *cxlds; struct cxl_feat_entries { int num_features; int num_user_features; struct cxl_feat_entry ent[]; } *entries; };”…”�”}”hjS sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jEh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´K9hj2 ubhþ)�”}”(hŒ **Members**”h]”j+)�”}”(hjd h]”hŒMembers”…”�”}”(hjf h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjb ubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´KBhj2 ubjo)�”}”(hhh]”(jt)�”}”(hŒ&``cxlds`` Pointer to CXL device state ”h]”(jz)�”}”(hŒ ``cxlds``”h]”j€)�”}”(hjƒ h]”hŒcxlds”…”�”}”(hj… h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´K5hj} ubj–)�”}”(hhh]”hþ)�”}”(hŒPointer to CXL device state”h]”hŒPointer to CXL device state”…”�”}”(hjœ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³j˜ h´K5hj™ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj} ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³j˜ h´K5hjz ubjt)�”}”(hŒ%``entries`` CXl feature entry context”h]”(jz)�”}”(hŒ ``entries``”h]”j€)�”}”(hj¼ h]”hŒentries”…”�”}”(hj¾ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjº ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´K5hj¶ ubj–)�”}”(hhh]”hþ)�”}”(hŒCXl feature entry context”h]”hŒCXl feature entry context”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³Œe/var/lib/git/docbuild/linux/Documentation/userspace-api/fwctl/fwctl-cxl:142: ./include/cxl/features.h”h´K6hjÒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¶ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jsh³jÑ h´K5hjz ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jnhj2 ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j hjh²hh³Nh´Nubeh}”(h]”Œfwctl-cxl-kernel-api”ah ]”h"]”Œfwctl cxl kernel api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KŠubeh}”(h]”Œfwctl-cxl-driver”ah ]”h"]”Œfwctl cxl driver”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”j0 Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j j jmjjjjjjj jjjj jÿ uŒ nametypes”}”(j ‰jm‰j‰j‰j ‰j‰j ‰uh}”(j hÊjjjjjpj�j™j–j›jj°jjjj¸jÿ jj3j8jÇ 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”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.