sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget6/translations/zh_CN/driver-api/cxl/theory-of-operationmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/zh_TW/driver-api/cxl/theory-of-operationmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/it_IT/driver-api/cxl/theory-of-operationmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/ja_JP/driver-api/cxl/theory-of-operationmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/ko_KR/driver-api/cxl/theory-of-operationmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/sp_SP/driver-api/cxl/theory-of-operationmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhP/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation.rsthKubh)}(h4This data file has been placed in the public domain.h]h4This data file has been placed in the public domain.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhho/srv/docbuild/lib/venvs/build-kernel-docs/lib64/python3.9/site-packages/docutils/parsers/rst/include/isonum.txthKubh)}(hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .h]hDerived from the Unicode character mappings available from . Processed by unicode2rstsubs.py, part of Docutils: .}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsubstitution_definition)}(h*.. |amp| unicode:: U+00026 .. AMPERSANDh]h&}hhsbah}(h]h ]h"]ampah$]h&]uh1hhhhKhhhhubh)}(h+.. |apos| unicode:: U+00027 .. APOSTROPHEh]h'}hhsbah}(h]h ]h"]aposah$]h&]uh1hhhhKhhhhubh)}(h).. |ast| unicode:: U+0002A .. ASTERISKh]h*}hhsbah}(h]h ]h"]astah$]h&]uh1hhhhK hhhhubh)}(h+.. |brvbar| unicode:: U+000A6 .. BROKEN BARh]h¦}hjsbah}(h]h ]h"]brvbarah$]h&]uh1hhhhK hhhhubh)}(h0.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUSh]h\}hjsbah}(h]h ]h"]bsolah$]h&]uh1hhhhK hhhhubh)}(h*.. |cent| unicode:: U+000A2 .. CENT SIGNh]h¢}hjsbah}(h]h ]h"]centah$]h&]uh1hhhhK hhhhubh)}(h&.. |colon| unicode:: U+0003A .. COLONh]h:}hj-sbah}(h]h ]h"]colonah$]h&]uh1hhhhK hhhhubh)}(h&.. |comma| unicode:: U+0002C .. COMMAh]h,}hj<sbah}(h]h ]h"]commaah$]h&]uh1hhhhKhhhhubh)}(h... |commat| unicode:: U+00040 .. COMMERCIAL ATh]h@}hjKsbah}(h]h ]h"]commatah$]h&]uh1hhhhKhhhhubh)}(h/.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGNh]h©}hjZsbah}(h]h ]h"]copyah$]h&]uh1hhhhKhhhhubh)}(h... |curren| unicode:: U+000A4 .. CURRENCY SIGNh]h¤}hjisbah}(h]h ]h"]currenah$]h&]uh1hhhhKhhhhubh)}(h0.. |darr| unicode:: U+02193 .. DOWNWARDS ARROWh]h↓}hjxsbah}(h]h ]h"]darrah$]h&]uh1hhhhKhhhhubh)}(h,.. |deg| unicode:: U+000B0 .. DEGREE SIGNh]h°}hjsbah}(h]h ]h"]degah$]h&]uh1hhhhKhhhhubh)}(h... |divide| unicode:: U+000F7 .. DIVISION SIGNh]h÷}hjsbah}(h]h ]h"]divideah$]h&]uh1hhhhKhhhhubh)}(h,.. |dollar| unicode:: U+00024 .. DOLLAR SIGNh]h$}hjsbah}(h]h ]h"]dollarah$]h&]uh1hhhhKhhhhubh)}(h,.. |equals| unicode:: U+0003D .. EQUALS SIGNh]h=}hjsbah}(h]h ]h"]equalsah$]h&]uh1hhhhKhhhhubh)}(h1.. |excl| unicode:: U+00021 .. EXCLAMATION MARKh]h!}hjsbah}(h]h ]h"]exclah$]h&]uh1hhhhKhhhhubh)}(h9.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjsbah}(h]h ]h"]frac12ah$]h&]uh1hhhhKhhhhubh)}(h<.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTERh]h¼}hjsbah}(h]h ]h"]frac14ah$]h&]uh1hhhhKhhhhubh)}(h;.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTHh]h⅛}hjsbah}(h]h ]h"]frac18ah$]h&]uh1hhhhKhhhhubh)}(h?.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERSh]h¾}hjsbah}(h]h ]h"]frac34ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHSh]h⅜}hjsbah}(h]h ]h"]frac38ah$]h&]uh1hhhhKhhhhubh)}(h=.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHSh]h⅝}hjsbah}(h]h ]h"]frac58ah$]h&]uh1hhhhKhhhhubh)}(h>.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHSh]h⅞}hj,sbah}(h]h ]h"]frac78ah$]h&]uh1hhhhKhhhhubh)}(h2.. |gt| unicode:: U+0003E .. GREATER-THAN SIGNh]h>}hj;sbah}(h]h ]h"]gtah$]h&]uh1hhhhKhhhhubh)}(h9.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALFh]h½}hjJsbah}(h]h ]h"]halfah$]h&]uh1hhhhK hhhhubh)}(h/.. |horbar| unicode:: U+02015 .. HORIZONTAL BARh]h―}hjYsbah}(h]h ]h"]horbarah$]h&]uh1hhhhK!hhhhubh)}(h'.. |hyphen| unicode:: U+02010 .. HYPHENh]h‐}hjhsbah}(h]h ]h"]hyphenah$]h&]uh1hhhhK"hhhhubh)}(h:.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARKh]h¡}hjwsbah}(h]h ]h"]iexclah$]h&]uh1hhhhK#hhhhubh)}(h7.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARKh]h¿}hjsbah}(h]h ]h"]iquestah$]h&]uh1hhhhK$hhhhubh)}(hJ.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARKh]h«}hjsbah}(h]h ]h"]laquoah$]h&]uh1hhhhK%hhhhubh)}(h0.. |larr| unicode:: U+02190 .. LEFTWARDS ARROWh]h←}hjsbah}(h]h ]h"]larrah$]h&]uh1hhhhK&hhhhubh)}(h3.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKETh]h{}hjsbah}(h]h ]h"]lcubah$]h&]uh1hhhhK'hhhhubh)}(h;.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARKh]h“}hjsbah}(h]h ]h"]ldquoah$]h&]uh1hhhhK(hhhhubh)}(h).. |lowbar| unicode:: U+0005F .. LOW LINEh]h_}hjsbah}(h]h ]h"]lowbarah$]h&]uh1hhhhK)hhhhubh)}(h1.. |lpar| unicode:: U+00028 .. LEFT PARENTHESISh]h(}hjsbah}(h]h ]h"]lparah$]h&]uh1hhhhK*hhhhubh)}(h4.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKETh]h[}hjsbah}(h]h ]h"]lsqbah$]h&]uh1hhhhK+hhhhubh)}(h;.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARKh]h‘}hjsbah}(h]h ]h"]lsquoah$]h&]uh1hhhhK,hhhhubh)}(h/.. |lt| unicode:: U+0003C .. LESS-THAN SIGNh]h<}hj sbah}(h]h ]h"]ltah$]h&]uh1hhhhK-hhhhubh)}(h+.. |micro| unicode:: U+000B5 .. MICRO SIGNh]hµ}hjsbah}(h]h ]h"]microah$]h&]uh1hhhhK.hhhhubh)}(h+.. |middot| unicode:: U+000B7 .. MIDDLE DOTh]h·}hj+sbah}(h]h ]h"]middotah$]h&]uh1hhhhK/hhhhubh)}(h/.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACEh]h }hj:sbah}(h]h ]h"]nbspah$]h&]uh1hhhhK0hhhhubh)}(h).. |not| unicode:: U+000AC .. NOT SIGNh]h¬}hjIsbah}(h]h ]h"]notah$]h&]uh1hhhhK1hhhhubh)}(h,.. |num| unicode:: U+00023 .. NUMBER SIGNh]h#}hjXsbah}(h]h ]h"]numah$]h&]uh1hhhhK2hhhhubh)}(h).. |ohm| unicode:: U+02126 .. OHM SIGNh]hΩ}hjgsbah}(h]h ]h"]ohmah$]h&]uh1hhhhK3hhhhubh)}(h;.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATORh]hª}hjvsbah}(h]h ]h"]ordfah$]h&]uh1hhhhK4hhhhubh)}(h<.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATORh]hº}hjsbah}(h]h ]h"]ordmah$]h&]uh1hhhhK5hhhhubh)}(h-.. |para| unicode:: U+000B6 .. PILCROW SIGNh]h¶}hjsbah}(h]h ]h"]paraah$]h&]uh1hhhhK6hhhhubh)}(h-.. |percnt| unicode:: U+00025 .. PERCENT SIGNh]h%}hjsbah}(h]h ]h"]percntah$]h&]uh1hhhhK7hhhhubh)}(h*.. |period| unicode:: U+0002E .. FULL STOPh]h.}hjsbah}(h]h ]h"]periodah$]h&]uh1hhhhK8hhhhubh)}(h*.. |plus| unicode:: U+0002B .. PLUS SIGNh]h+}hjsbah}(h]h ]h"]plusah$]h&]uh1hhhhK9hhhhubh)}(h0.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGNh]h±}hjsbah}(h]h ]h"]plusmnah$]h&]uh1hhhhK:hhhhubh)}(h+.. |pound| unicode:: U+000A3 .. POUND SIGNh]h£}hjsbah}(h]h ]h"]poundah$]h&]uh1hhhhK;hhhhubh)}(h... |quest| unicode:: U+0003F .. QUESTION MARKh]h?}hjsbah}(h]h ]h"]questah$]h&]uh1hhhhKhhhhubh)}(h1.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROWh]h→}hjsbah}(h]h ]h"]rarrah$]h&]uh1hhhhK?hhhhubh)}(h4.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKETh]h}}hj*sbah}(h]h ]h"]rcubah$]h&]uh1hhhhK@hhhhubh)}(h<.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARKh]h”}hj9sbah}(h]h ]h"]rdquoah$]h&]uh1hhhhKAhhhhubh)}(h0.. |reg| unicode:: U+000AE .. REGISTERED SIGNh]h®}hjHsbah}(h]h ]h"]regah$]h&]uh1hhhhKBhhhhubh)}(h2.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESISh]h)}hjWsbah}(h]h ]h"]rparah$]h&]uh1hhhhKChhhhubh)}(h5.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKETh]h]}hjfsbah}(h]h ]h"]rsqbah$]h&]uh1hhhhKDhhhhubh)}(h<.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARKh]h’}hjusbah}(h]h ]h"]rsquoah$]h&]uh1hhhhKEhhhhubh)}(h-.. |sect| unicode:: U+000A7 .. SECTION SIGNh]h§}hjsbah}(h]h ]h"]sectah$]h&]uh1hhhhKFhhhhubh)}(h*.. |semi| unicode:: U+0003B .. SEMICOLONh]h;}hjsbah}(h]h ]h"]semiah$]h&]uh1hhhhKGhhhhubh)}(h,.. |shy| unicode:: U+000AD .. SOFT HYPHENh]h­}hjsbah}(h]h ]h"]shyah$]h&]uh1hhhhKHhhhhubh)}(h(.. |sol| unicode:: U+0002F .. SOLIDUSh]h/}hjsbah}(h]h ]h"]solah$]h&]uh1hhhhKIhhhhubh)}(h,.. |sung| unicode:: U+0266A .. EIGHTH NOTEh]h♪}hjsbah}(h]h ]h"]sungah$]h&]uh1hhhhKJhhhhubh)}(h0.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONEh]h¹}hjsbah}(h]h ]h"]sup1ah$]h&]uh1hhhhKKhhhhubh)}(h0.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWOh]h²}hjsbah}(h]h ]h"]sup2ah$]h&]uh1hhhhKLhhhhubh)}(h2.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREEh]h³}hjsbah}(h]h ]h"]sup3ah$]h&]uh1hhhhKMhhhhubh)}(h4.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGNh]h×}hjsbah}(h]h ]h"]timesah$]h&]uh1hhhhKNhhhhubh)}(h0.. |trade| unicode:: U+02122 .. TRADE MARK SIGNh]h™}hj sbah}(h]h ]h"]tradeah$]h&]uh1hhhhKOhhhhubh)}(h... |uarr| unicode:: U+02191 .. UPWARDS ARROWh]h↑}hjsbah}(h]h ]h"]uarrah$]h&]uh1hhhhKPhhhhubh)}(h... |verbar| unicode:: U+0007C .. VERTICAL LINEh]h|}hj)sbah}(h]h ]h"]verbarah$]h&]uh1hhhhKQhhhhubh)}(h*.. |yen| unicode:: U+000A5 .. YEN SIGN h]h¥}hj8sbah}(h]h ]h"]yenah$]h&]uh1hhhhKRhhhhubhsection)}(hhh](htitle)}(h/Compute Express Link Driver Theory of Operationh]h/Compute Express Link Driver Theory of Operation}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIhhhhhKubh paragraph)}(hXA Compute Express Link Memory Device is a CXL component that implements the CXL.mem protocol. It contains some amount of volatile memory, persistent memory, or both. It is enumerated as a PCI device for configuration and passing messages over an MMIO mailbox. Its contribution to the System Physical Address space is handled via HDM (Host Managed Device Memory) decoders that optionally define a device's contribution to an interleaved address range across multiple devices underneath a host-bridge or interleaved across host-bridges.h]hXA Compute Express Link Memory Device is a CXL component that implements the CXL.mem protocol. It contains some amount of volatile memory, persistent memory, or both. It is enumerated as a PCI device for configuration and passing messages over an MMIO mailbox. Its contribution to the System Physical Address space is handled via HDM (Host Managed Device Memory) decoders that optionally define a device’s contribution to an interleaved address range across multiple devices underneath a host-bridge or interleaved across host-bridges.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjIhhubjH)}(hhh](jM)}(h The CXL Bush]h The CXL Bus}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjlhhhhhKubj])}(hXSSimilar to how a RAID driver takes disk objects and assembles them into a new logical device, the CXL subsystem is tasked to take PCIe and ACPI objects and assemble them into a CXL.mem decode topology. The need for runtime configuration of the CXL.mem topology is also similar to RAID in that different environments with the same hardware configuration may decide to assemble the topology in contrasting ways. One may choose performance (RAID0) striping memory across multiple Host Bridges and endpoints while another may opt for fault tolerance and disable any striping in the CXL.mem topology.h]hXSSimilar to how a RAID driver takes disk objects and assembles them into a new logical device, the CXL subsystem is tasked to take PCIe and ACPI objects and assemble them into a CXL.mem decode topology. The need for runtime configuration of the CXL.mem topology is also similar to RAID in that different environments with the same hardware configuration may decide to assemble the topology in contrasting ways. One may choose performance (RAID0) striping memory across multiple Host Bridges and endpoints while another may opt for fault tolerance and disable any striping in the CXL.mem topology.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjlhhubj])}(hXPlatform firmware enumerates a menu of interleave options at the "CXL root port" (Linux term for the top of the CXL decode topology). From there, PCIe topology dictates which endpoints can participate in which Host Bridge decode regimes. Each PCIe Switch in the path between the root and an endpoint introduces a point at which the interleave can be split. For example, platform firmware may say a given range only decodes to one Host Bridge, but that Host Bridge may in turn interleave cycles across multiple Root Ports. An intervening Switch between a port and an endpoint may interleave cycles across multiple Downstream Switch Ports, etc.h]hXPlatform firmware enumerates a menu of interleave options at the “CXL root port” (Linux term for the top of the CXL decode topology). From there, PCIe topology dictates which endpoints can participate in which Host Bridge decode regimes. Each PCIe Switch in the path between the root and an endpoint introduces a point at which the interleave can be split. For example, platform firmware may say a given range only decodes to one Host Bridge, but that Host Bridge may in turn interleave cycles across multiple Root Ports. An intervening Switch between a port and an endpoint may interleave cycles across multiple Downstream Switch Ports, etc.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjlhhubj])}(hX-Here is a sample listing of a CXL topology defined by 'cxl_test'. The 'cxl_test' module generates an emulated CXL topology of 2 Host Bridges each with 2 Root Ports. Each of those Root Ports are connected to 2-way switches with endpoints connected to those downstream ports for a total of 8 endpoints::h]hX4Here is a sample listing of a CXL topology defined by ‘cxl_test’. The ‘cxl_test’ module generates an emulated CXL topology of 2 Host Bridges each with 2 Root Ports. Each of those Root Ports are connected to 2-way switches with endpoints connected to those downstream ports for a total of 8 endpoints:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhK&hjlhhubh literal_block)}(hX# cxl list -BEMPu -b cxl_test { "bus":"root3", "provider":"cxl_test", "ports:root3":[ { "port":"port5", "host":"cxl_host_bridge.1", "ports:port5":[ { "port":"port8", "host":"cxl_switch_uport.1", "endpoints:port8":[ { "endpoint":"endpoint9", "host":"mem2", "memdev":{ "memdev":"mem2", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x1", "numa_node":1, "host":"cxl_mem.1" } }, { "endpoint":"endpoint15", "host":"mem6", "memdev":{ "memdev":"mem6", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x5", "numa_node":1, "host":"cxl_mem.5" } } ] }, { "port":"port12", "host":"cxl_switch_uport.3", "endpoints:port12":[ { "endpoint":"endpoint17", "host":"mem8", "memdev":{ "memdev":"mem8", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x7", "numa_node":1, "host":"cxl_mem.7" } }, { "endpoint":"endpoint13", "host":"mem4", "memdev":{ "memdev":"mem4", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x3", "numa_node":1, "host":"cxl_mem.3" } } ] } ] }, { "port":"port4", "host":"cxl_host_bridge.0", "ports:port4":[ { "port":"port6", "host":"cxl_switch_uport.0", "endpoints:port6":[ { "endpoint":"endpoint7", "host":"mem1", "memdev":{ "memdev":"mem1", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0", "numa_node":0, "host":"cxl_mem.0" } }, { "endpoint":"endpoint14", "host":"mem5", "memdev":{ "memdev":"mem5", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x4", "numa_node":0, "host":"cxl_mem.4" } } ] }, { "port":"port10", "host":"cxl_switch_uport.2", "endpoints:port10":[ { "endpoint":"endpoint16", "host":"mem7", "memdev":{ "memdev":"mem7", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x6", "numa_node":0, "host":"cxl_mem.6" } }, { "endpoint":"endpoint11", "host":"mem3", "memdev":{ "memdev":"mem3", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x2", "numa_node":0, "host":"cxl_mem.2" } } ] } ] } ] }h]hX# cxl list -BEMPu -b cxl_test { "bus":"root3", "provider":"cxl_test", "ports:root3":[ { "port":"port5", "host":"cxl_host_bridge.1", "ports:port5":[ { "port":"port8", "host":"cxl_switch_uport.1", "endpoints:port8":[ { "endpoint":"endpoint9", "host":"mem2", "memdev":{ "memdev":"mem2", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x1", "numa_node":1, "host":"cxl_mem.1" } }, { "endpoint":"endpoint15", "host":"mem6", "memdev":{ "memdev":"mem6", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x5", "numa_node":1, "host":"cxl_mem.5" } } ] }, { "port":"port12", "host":"cxl_switch_uport.3", "endpoints:port12":[ { "endpoint":"endpoint17", "host":"mem8", "memdev":{ "memdev":"mem8", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x7", "numa_node":1, "host":"cxl_mem.7" } }, { "endpoint":"endpoint13", "host":"mem4", "memdev":{ "memdev":"mem4", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x3", "numa_node":1, "host":"cxl_mem.3" } } ] } ] }, { "port":"port4", "host":"cxl_host_bridge.0", "ports:port4":[ { "port":"port6", "host":"cxl_switch_uport.0", "endpoints:port6":[ { "endpoint":"endpoint7", "host":"mem1", "memdev":{ "memdev":"mem1", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0", "numa_node":0, "host":"cxl_mem.0" } }, { "endpoint":"endpoint14", "host":"mem5", "memdev":{ "memdev":"mem5", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x4", "numa_node":0, "host":"cxl_mem.4" } } ] }, { "port":"port10", "host":"cxl_switch_uport.2", "endpoints:port10":[ { "endpoint":"endpoint16", "host":"mem7", "memdev":{ "memdev":"mem7", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x6", "numa_node":0, "host":"cxl_mem.6" } }, { "endpoint":"endpoint11", "host":"mem3", "memdev":{ "memdev":"mem3", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x2", "numa_node":0, "host":"cxl_mem.2" } } ] } ] } ] }}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhK+hjlhhubj])}(hXIn that listing each "root", "port", and "endpoint" object correspond a kernel 'struct cxl_port' object. A 'cxl_port' is a device that can decode CXL.mem to its descendants. So "root" claims non-PCIe enumerable platform decode ranges and decodes them to "ports", "ports" decode to "endpoints", and "endpoints" represent the decode from SPA (System Physical Address) to DPA (Device Physical Address).h]hXIn that listing each “root”, “port”, and “endpoint” object correspond a kernel ‘struct cxl_port’ object. A ‘cxl_port’ is a device that can decode CXL.mem to its descendants. So “root” claims non-PCIe enumerable platform decode ranges and decodes them to “ports”, “ports” decode to “endpoints”, and “endpoints” represent the decode from SPA (System Physical Address) to DPA (Device Physical Address).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjlhhubj])}(hXContinuing the RAID analogy, disks have both topology metadata and on-device metadata that determine RAID set assembly. CXL Port topology and CXL Port link status is metadata for CXL.mem set assembly. The CXL Port topology is enumerated by the arrival of a CXL.mem device. I.e. unless and until the PCIe core attaches the cxl_pci driver to a CXL Memory Expander there is no role for CXL Port objects. Conversely for hot-unplug / removal scenarios, there is no need for the Linux PCI core to tear down switch-level CXL resources because the endpoint ->remove() event cleans up the port data that was established to support that Memory Expander.h]hXContinuing the RAID analogy, disks have both topology metadata and on-device metadata that determine RAID set assembly. CXL Port topology and CXL Port link status is metadata for CXL.mem set assembly. The CXL Port topology is enumerated by the arrival of a CXL.mem device. I.e. unless and until the PCIe core attaches the cxl_pci driver to a CXL Memory Expander there is no role for CXL Port objects. Conversely for hot-unplug / removal scenarios, there is no need for the Linux PCI core to tear down switch-level CXL resources because the endpoint ->remove() event cleans up the port data that was established to support that Memory Expander.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjlhhubj])}(hThe port metadata and potential decode schemes that a given memory device may participate can be determined via a command like::h]hThe port metadata and potential decode schemes that a given memory device may participate can be determined via a command like:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjlhhubj)}(hX# cxl list -BDMu -d root -m mem3 { "bus":"root3", "provider":"cxl_test", "decoders:root3":[ { "decoder":"decoder3.1", "resource":"0x8030000000", "size":"512.00 MiB (536.87 MB)", "volatile_capable":true, "nr_targets":2 }, { "decoder":"decoder3.3", "resource":"0x8060000000", "size":"512.00 MiB (536.87 MB)", "pmem_capable":true, "nr_targets":2 }, { "decoder":"decoder3.0", "resource":"0x8020000000", "size":"256.00 MiB (268.44 MB)", "volatile_capable":true, "nr_targets":1 }, { "decoder":"decoder3.2", "resource":"0x8050000000", "size":"256.00 MiB (268.44 MB)", "pmem_capable":true, "nr_targets":1 } ], "memdevs:root3":[ { "memdev":"mem3", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x2", "numa_node":0, "host":"cxl_mem.2" } ] }h]hX# cxl list -BDMu -d root -m mem3 { "bus":"root3", "provider":"cxl_test", "decoders:root3":[ { "decoder":"decoder3.1", "resource":"0x8030000000", "size":"512.00 MiB (536.87 MB)", "volatile_capable":true, "nr_targets":2 }, { "decoder":"decoder3.3", "resource":"0x8060000000", "size":"512.00 MiB (536.87 MB)", "pmem_capable":true, "nr_targets":2 }, { "decoder":"decoder3.0", "resource":"0x8020000000", "size":"256.00 MiB (268.44 MB)", "volatile_capable":true, "nr_targets":1 }, { "decoder":"decoder3.2", "resource":"0x8050000000", "size":"256.00 MiB (268.44 MB)", "pmem_capable":true, "nr_targets":1 } ], "memdevs:root3":[ { "memdev":"mem3", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x2", "numa_node":0, "host":"cxl_mem.2" } ] }}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjlhhubj])}(hXH...which queries the CXL topology to ask "given CXL Memory Expander with a kernel device name of 'mem3' which platform level decode ranges may this device participate". A given expander can participate in multiple CXL.mem interleave sets simultaneously depending on how many decoder resources it has. In this example mem3 can participate in one or more of a PMEM interleave that spans two Host Bridges, a PMEM interleave that targets a single Host Bridge, a Volatile memory interleave that spans 2 Host Bridges, and a Volatile memory interleave that only targets a single Host Bridge.h]hXP...which queries the CXL topology to ask “given CXL Memory Expander with a kernel device name of ‘mem3’ which platform level decode ranges may this device participate”. A given expander can participate in multiple CXL.mem interleave sets simultaneously depending on how many decoder resources it has. In this example mem3 can participate in one or more of a PMEM interleave that spans two Host Bridges, a PMEM interleave that targets a single Host Bridge, a Volatile memory interleave that spans 2 Host Bridges, and a Volatile memory interleave that only targets a single Host Bridge.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhKhjlhhubj])}(hConversely the memory devices that can participate in a given platform level decode scheme can be determined via a command like the following::h]hConversely the memory devices that can participate in a given platform level decode scheme can be determined via a command like the following:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhMhjlhhubj)}(hXF# cxl list -MDu -d 3.2 [ { "memdevs":[ { "memdev":"mem1", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0", "numa_node":0, "host":"cxl_mem.0" }, { "memdev":"mem5", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x4", "numa_node":0, "host":"cxl_mem.4" }, { "memdev":"mem7", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x6", "numa_node":0, "host":"cxl_mem.6" }, { "memdev":"mem3", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x2", "numa_node":0, "host":"cxl_mem.2" } ] }, { "root decoders":[ { "decoder":"decoder3.2", "resource":"0x8050000000", "size":"256.00 MiB (268.44 MB)", "pmem_capable":true, "nr_targets":1 } ] } ]h]hXF# cxl list -MDu -d 3.2 [ { "memdevs":[ { "memdev":"mem1", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0", "numa_node":0, "host":"cxl_mem.0" }, { "memdev":"mem5", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x4", "numa_node":0, "host":"cxl_mem.4" }, { "memdev":"mem7", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x6", "numa_node":0, "host":"cxl_mem.6" }, { "memdev":"mem3", "pmem_size":"256.00 MiB (268.44 MB)", "ram_size":"256.00 MiB (268.44 MB)", "serial":"0x2", "numa_node":0, "host":"cxl_mem.2" } ] }, { "root decoders":[ { "decoder":"decoder3.2", "resource":"0x8050000000", "size":"256.00 MiB (268.44 MB)", "pmem_capable":true, "nr_targets":1 } ] } ]}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhjlhhubj])}(hL...where the naming scheme for decoders is "decoder.".h]hP...where the naming scheme for decoders is “decoder.”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhM8hjlhhubeh}(h] the-cxl-busah ]h"] the cxl busah$]h&]uh1jGhjIhhhhhKubjH)}(hhh](jM)}(hDriver Infrastructureh]hDriver Infrastructure}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj/hhhhhM;ubj])}(hFThis section covers the driver infrastructure for a CXL memory device.h]hFThis section covers the driver infrastructure for a CXL memory device.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hhhM=hj/hhubjH)}(hhh](jM)}(hCXL Memory Deviceh]hCXL Memory Device}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjNhhhhhM@ubj])}(hXThis implements the PCI exclusive functionality for a CXL device as it is defined by the Compute Express Link specification. CXL devices may surface certain functionality even if it isn't CXL enabled. While this driver is focused around the PCI specific aspects of a CXL device, it binds to the specific CXL memory device class code, and therefore the implementation of cxl_pci is focused around CXL memory devices.h]hXThis implements the PCI exclusive functionality for a CXL device as it is defined by the Compute Express Link specification. CXL devices may surface certain functionality even if it isn’t CXL enabled. While this driver is focused around the PCI specific aspects of a CXL device, it binds to the specific CXL memory device class code, and therefore the implementation of cxl_pci is focused around CXL memory devices.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:408: ./drivers/cxl/pci.chKhjNhhubhdefinition_list)}(hhh]hdefinition_list_item)}(hThe driver has several responsibilities, mainly: - Create the memX device and register on the CXL bus. - Enumerate device's register interface and map them. - Registers nvdimm bridge device with cxl_core. - Registers a CXL mailbox with cxl_core. h](hterm)}(h0The driver has several responsibilities, mainly:h]h0The driver has several responsibilities, mainly:}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:408: ./drivers/cxl/pci.chK!hjuubh definition)}(hhh]h bullet_list)}(hhh](h list_item)}(h3Create the memX device and register on the CXL bus.h]j])}(hjh]h3Create the memX device and register on the CXL bus.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:408: ./drivers/cxl/pci.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h3Enumerate device's register interface and map them.h]j])}(hjh]h5Enumerate device’s register interface and map them.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:408: ./drivers/cxl/pci.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h-Registers nvdimm bridge device with cxl_core.h]j])}(hjh]h-Registers nvdimm bridge device with cxl_core.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:408: ./drivers/cxl/pci.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h(Registers a CXL mailbox with cxl_core. h]j])}(h&Registers a CXL mailbox with cxl_core.h]h&Registers a CXL mailbox with cxl_core.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:408: ./drivers/cxl/pci.chK hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jshjhK!hjpubah}(h]h ]h"]h$]h&]uh1jnhjNhhhNhNubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](single$__cxl_pci_mbox_send_cmd (C function)c.__cxl_pci_mbox_send_cmdhNtauh1jhjNhhhNhNubhdesc)}(hhh](hdesc_signature)}(hYint __cxl_pci_mbox_send_cmd (struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd)h]hdesc_signature_line)}(hXint __cxl_pci_mbox_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd)h](hdesc_sig_keyword_type)}(hinth]hint}(hj5hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j3hj/hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKubhdesc_sig_space)}(h h]h }(hjGhhhNhNubah}(h]h ]wah"]h$]h&]uh1jEhj/hhhjDhKubh desc_name)}(h__cxl_pci_mbox_send_cmdh]h desc_sig_name)}(h__cxl_pci_mbox_send_cmdh]h__cxl_pci_mbox_send_cmd}(hj^hhhNhNubah}(h]h ]nah"]h$]h&]uh1j\hjXubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jVhj/hhhjDhKubhdesc_parameterlist)}(h=(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd)h](hdesc_parameter)}(hstruct cxl_mailbox *cxl_mboxh](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhj}ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}ubh)}(hhh]j])}(h cxl_mailboxh]h cxl_mailbox}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj`sbc.__cxl_pci_mbox_send_cmdasbuh1hhj}ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}ubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhj}ubj])}(hcxl_mboxh]hcxl_mbox}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj}ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjwubj|)}(hstruct cxl_mbox_cmd *mbox_cmdh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_mbox_cmdh]h cxl_mbox_cmd}(hj"hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]jc.__cxl_pci_mbox_send_cmdasbuh1hhjubjF)}(h h]h }(hj@hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmbox_cmdh]hmbox_cmd}(hj[hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjwubeh}(h]h ]h"]h$]h&]hhuh1juhj/hhhjDhKubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1j-sphinx_line_type declaratorhj)hhhjDhKubah}(h]j ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1j'hjDhKhj$hhubh desc_content)}(hhh]j])}(hExecute a mailbox commandh]hExecute a mailbox command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhj$hhhjDhKubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1j"hhhjNhNhNubh container)}(hX **Parameters** ``struct cxl_mailbox *cxl_mbox`` CXL mailbox context ``struct cxl_mbox_cmd *mbox_cmd`` Command to send to the memory device. **Context** Any context. Expects mbox_mutex to be held. **Return** -ETIMEDOUT if timeout occurred waiting for completion. 0 on success. Caller should check the return code in **mbox_cmd** to make sure it succeeded. **Description** This is a generic form of the CXL mailbox send command thus only using the registers defined by the mailbox capability ID - CXL 2.0 8.2.8.4. Memory devices, and perhaps other types of CXL devices may have further information available upon error conditions. Driver facilities wishing to send mailbox commands should use the wrapper command. The CXL spec allows for up to two mailboxes. The intention is for the primary mailbox to be OS controlled and the secondary mailbox to be used by system firmware. This allows the OS and firmware to communicate with the device and not need to coordinate with each other. The driver only uses the primary mailbox.h](j])}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubjo)}(hhh](jt)}(h5``struct cxl_mailbox *cxl_mbox`` CXL mailbox context h](jz)}(h ``struct cxl_mailbox *cxl_mbox``h]hliteral)}(hjh]hstruct cxl_mailbox *cxl_mbox}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj)}(hhh]j])}(hCXL mailbox contexth]hCXL mailbox context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(hH``struct cxl_mbox_cmd *mbox_cmd`` Command to send to the memory device. h](jz)}(h!``struct cxl_mbox_cmd *mbox_cmd``h]j)}(hj h]hstruct cxl_mbox_cmd *mbox_cmd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhj ubj)}(hhh]j])}(h%Command to send to the memory device.h]h%Command to send to the memory device.}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj* hKhj+ ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj* hKhjubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Context**h]j)}(hjP h]hContext}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj])}(h+Any context. Expects mbox_mutex to be held.h]h+Any context. Expects mbox_mutex to be held.}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj])}(h **Return**h]j)}(hjw h]hReturn}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj])}(h-ETIMEDOUT if timeout occurred waiting for completion. 0 on success. Caller should check the return code in **mbox_cmd** to make sure it succeeded.h](hl-ETIMEDOUT if timeout occurred waiting for completion. 0 on success. Caller should check the return code in }(hj hhhNhNubj)}(h **mbox_cmd**h]hmbox_cmd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh to make sure it succeeded.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj])}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj])}(hXTThis is a generic form of the CXL mailbox send command thus only using the registers defined by the mailbox capability ID - CXL 2.0 8.2.8.4. Memory devices, and perhaps other types of CXL devices may have further information available upon error conditions. Driver facilities wishing to send mailbox commands should use the wrapper command.h]hXTThis is a generic form of the CXL mailbox send command thus only using the registers defined by the mailbox capability ID - CXL 2.0 8.2.8.4. Memory devices, and perhaps other types of CXL devices may have further information available upon error conditions. Driver facilities wishing to send mailbox commands should use the wrapper command.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubj])}(hX7The CXL spec allows for up to two mailboxes. The intention is for the primary mailbox to be OS controlled and the secondary mailbox to be used by system firmware. This allows the OS and firmware to communicate with the device and not need to coordinate with each other. The driver only uses the primary mailbox.h]hX7The CXL spec allows for up to two mailboxes. The intention is for the primary mailbox to be OS controlled and the secondary mailbox to be used by system firmware. This allows the OS and firmware to communicate with the device and not need to coordinate with each other. The driver only uses the primary mailbox.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:411: ./drivers/cxl/pci.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj])}(hCXL memory endpoint devices and switches are CXL capable devices that are participating in CXL.mem protocol. Their functionality builds on top of the CXL.io protocol that allows enumerating and configuring components via standard PCI mechanisms.h]hCXL memory endpoint devices and switches are CXL capable devices that are participating in CXL.mem protocol. Their functionality builds on top of the CXL.io protocol that allows enumerating and configuring components via standard PCI mechanisms.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:414: ./drivers/cxl/mem.chK hjNhhubj])}(hXThe cxl_mem driver owns kicking off the enumeration of this CXL.mem capability. With the detection of a CXL capable endpoint, the driver will walk up to find the platform specific port it is connected to, and determine if there are intervening switches in the path. If there are switches, a secondary action is to enumerate those (implemented in cxl_core). Finally the cxl_mem driver adds the device it is bound to as a CXL endpoint-port for use in higher level operations.h]hXThe cxl_mem driver owns kicking off the enumeration of this CXL.mem capability. With the detection of a CXL capable endpoint, the driver will walk up to find the platform specific port it is connected to, and determine if there are intervening switches in the path. If there are switches, a secondary action is to enumerate those (implemented in cxl_core). Finally the cxl_mem driver adds the device it is bound to as a CXL endpoint-port for use in higher level operations.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:414: ./drivers/cxl/mem.chKhjNhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_memdev (C struct) c.cxl_memdevhNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h cxl_memdevh]j.)}(hstruct cxl_memdevh](j)}(hjh]hstruct}(hj" hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKubjF)}(h h]h }(hj0 hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj hhhj/ hKubjW)}(h cxl_memdevh]j])}(hj h]h cxl_memdev}(hjB hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj> ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj hhhj/ hKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj hhhj/ hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j'hj/ hKhj hhubj)}(hhh]j])}(h2CXL bus object representing a Type-3 Memory Deviceh]h2CXL bus object representing a Type-3 Memory Device}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK&hja hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj/ hKubeh}(h]h ](jstructeh"]h$]h&]jjjj| jj| jjjuh1j"hhhjNhNhNubj)}(hX**Definition**:: struct cxl_memdev { struct device dev; struct cdev cdev; struct cxl_dev_state *cxlds; struct work_struct detach_work; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_nvdimm *cxl_nvd; struct cxl_port *endpoint; int id; int depth; u8 scrub_cycle; int scrub_region_id; void *err_rec_array; }; **Members** ``dev`` driver core device object ``cdev`` char dev core object for ioctl operations ``cxlds`` The device state backing this device ``detach_work`` active memdev lost a port in its ancestry ``cxl_nvb`` coordinate removal of **cxl_nvd** if present ``cxl_nvd`` optional bridge to an nvdimm if the device supports pmem ``endpoint`` connection to the CXL port topology for this memory device ``id`` id number of this memdev instance. ``depth`` endpoint port depth ``scrub_cycle`` current scrub cycle set for this device ``scrub_region_id`` id number of a backed region (if any) for which current scrub cycle set ``err_rec_array`` List of xarrarys to store the memdev error records to check attributes for a memory repair operation are from current boot.h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK*hj ubj)}(hXOstruct cxl_memdev { struct device dev; struct cdev cdev; struct cxl_dev_state *cxlds; struct work_struct detach_work; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_nvdimm *cxl_nvd; struct cxl_port *endpoint; int id; int depth; u8 scrub_cycle; int scrub_region_id; void *err_rec_array; };h]hXOstruct cxl_memdev { struct device dev; struct cdev cdev; struct cxl_dev_state *cxlds; struct work_struct detach_work; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_nvdimm *cxl_nvd; struct cxl_port *endpoint; int id; int depth; u8 scrub_cycle; int scrub_region_id; void *err_rec_array; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK,hj ubj])}(h **Members**h]j)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK;hj ubjo)}(hhh](jt)}(h"``dev`` driver core device object h](jz)}(h``dev``h]j)}(hj h]hdev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK(hj ubj)}(hhh]j])}(hdriver core device objecth]hdriver core device object}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK(hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj hK(hj ubjt)}(h3``cdev`` char dev core object for ioctl operations h](jz)}(h``cdev``h]j)}(hj h]hcdev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK)hj ubj)}(hhh]j])}(h)char dev core object for ioctl operationsh]h)char dev core object for ioctl operations}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK)hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj hK)hj ubjt)}(h/``cxlds`` The device state backing this device h](jz)}(h ``cxlds``h]j)}(hjC h]hcxlds}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK*hj= ubj)}(hhh]j])}(h$The device state backing this deviceh]h$The device state backing this device}(hj\ hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjX hK*hjY ubah}(h]h ]h"]h$]h&]uh1jhj= ubeh}(h]h ]h"]h$]h&]uh1jshjX hK*hj ubjt)}(h:``detach_work`` active memdev lost a port in its ancestry h](jz)}(h``detach_work``h]j)}(hj| h]h detach_work}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK+hjv ubj)}(hhh]j])}(h)active memdev lost a port in its ancestryh]h)active memdev lost a port in its ancestry}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK+hj ubah}(h]h ]h"]h$]h&]uh1jhjv ubeh}(h]h ]h"]h$]h&]uh1jshj hK+hj ubjt)}(h9``cxl_nvb`` coordinate removal of **cxl_nvd** if present h](jz)}(h ``cxl_nvb``h]j)}(hj h]hcxl_nvb}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK,hj ubj)}(hhh]j])}(h,coordinate removal of **cxl_nvd** if presenth](hcoordinate removal of }(hj hhhNhNubj)}(h **cxl_nvd**h]hcxl_nvd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh if present}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hj hK,hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj hK,hj ubjt)}(hE``cxl_nvd`` optional bridge to an nvdimm if the device supports pmem h](jz)}(h ``cxl_nvd``h]j)}(hj h]hcxl_nvd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK-hj ubj)}(hhh]j])}(h8optional bridge to an nvdimm if the device supports pmemh]h8optional bridge to an nvdimm if the device supports pmem}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK-hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj hK-hj ubjt)}(hH``endpoint`` connection to the CXL port topology for this memory device h](jz)}(h ``endpoint``h]j)}(hj9 h]hendpoint}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7 ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK.hj3 ubj)}(hhh]j])}(h:connection to the CXL port topology for this memory deviceh]h:connection to the CXL port topology for this memory device}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjN hK.hjO ubah}(h]h ]h"]h$]h&]uh1jhj3 ubeh}(h]h ]h"]h$]h&]uh1jshjN hK.hj ubjt)}(h*``id`` id number of this memdev instance. h](jz)}(h``id``h]j)}(hjr h]hid}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK/hjl ubj)}(hhh]j])}(h"id number of this memdev instance.h]h"id number of this memdev instance.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK/hj ubah}(h]h ]h"]h$]h&]uh1jhjl ubeh}(h]h ]h"]h$]h&]uh1jshj hK/hj ubjt)}(h``depth`` endpoint port depth h](jz)}(h ``depth``h]j)}(hj h]hdepth}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK0hj ubj)}(hhh]j])}(hendpoint port depthh]hendpoint port depth}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK0hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj hK0hj ubjt)}(h8``scrub_cycle`` current scrub cycle set for this device h](jz)}(h``scrub_cycle``h]j)}(hj h]h scrub_cycle}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK1hj ubj)}(hhh]j])}(h'current scrub cycle set for this deviceh]h'current scrub cycle set for this device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hK1hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj hK1hj ubjt)}(h\``scrub_region_id`` id number of a backed region (if any) for which current scrub cycle set h](jz)}(h``scrub_region_id``h]j)}(hj h]hscrub_region_id}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK2hj ubj)}(hhh]j])}(hGid number of a backed region (if any) for which current scrub cycle seth]hGid number of a backed region (if any) for which current scrub cycle set}(hj6 hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj2 hK2hj3 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj2 hK2hj ubjt)}(h``err_rec_array`` List of xarrarys to store the memdev error records to check attributes for a memory repair operation are from current boot.h](jz)}(h``err_rec_array``h]j)}(hjV h]h err_rec_array}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK4hjP ubj)}(hhh]j])}(h{List of xarrarys to store the memdev error records to check attributes for a memory repair operation are from current boot.h]h{List of xarrarys to store the memdev error records to check attributes for a memory repair operation are from current boot.}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK3hjl ubah}(h]h ]h"]h$]h&]uh1jhjP ubeh}(h]h ]h"]h$]h&]uh1jshjk hK4hj ubeh}(h]h ]h"]h$]h&]uh1jnhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_event_state (C struct)c.cxl_event_statehNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hcxl_event_stateh]j.)}(hstruct cxl_event_stateh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhK;ubjF)}(h h]h }(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj hhhj hK;ubjW)}(hcxl_event_stateh]j])}(hj h]hcxl_event_state}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj ubah}(h]h E](jpjqeh"]h$]h&]hhuh1jVhj hhhj hK;ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj hhhj hK;ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j'hj hK;hj hhubj)}(hhh]j])}(hEvent log driver stateh]hEvent log driver state}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hK;ubeh}(h]h ](jstructeh"]h$]h&]jjjj jj jjjuh1j"hhhjNhNhNubj)}(h**Definition**:: struct cxl_event_state { struct cxl_get_event_payload *buf; struct mutex log_lock; }; **Members** ``buf`` Buffer to receive event data ``log_lock`` Serialize event_buf and log useh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjubj)}(h]struct cxl_event_state { struct cxl_get_event_payload *buf; struct mutex log_lock; };h]h]struct cxl_event_state { struct cxl_get_event_payload *buf; struct mutex log_lock; };}hj/sbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjubj])}(h **Members**h]j)}(hj@h]hMembers}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjubjo)}(hhh](jt)}(h%``buf`` Buffer to receive event data h](jz)}(h``buf``h]j)}(hj_h]hbuf}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjYubj)}(hhh]j])}(hBuffer to receive event datah]hBuffer to receive event data}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjthKhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jshjthKhjVubjt)}(h,``log_lock`` Serialize event_buf and log useh](jz)}(h ``log_lock``h]j)}(hjh]hlog_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjubj)}(hhh]j])}(hSerialize event_buf and log useh]hSerialize event_buf and log use}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjVubeh}(h]h ]h"]h$]h&]uh1jnhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_poison_state (C struct)c.cxl_poison_statehNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hcxl_poison_stateh]j.)}(hstruct cxl_poison_stateh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhKubjW)}(hcxl_poison_stateh]j])}(hjh]hcxl_poison_state}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhKhjhhubj)}(hhh]j])}(hDriver poison state infoh]hDriver poison state info}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhj1hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjLjjLjjjuh1j"hhhjNhNhNubj)}(hX**Definition**:: struct cxl_poison_state { u32 max_errors; unsigned long enabled_cmds[BITS_TO_LONGS(CXL_POISON_ENABLED_MAX)]; struct cxl_mbox_poison_out *list_out; struct mutex mutex; }; **Members** ``max_errors`` Maximum media error records held in device cache ``enabled_cmds`` All poison commands enabled in the CEL ``list_out`` The poison list payload returned by device ``mutex`` Protect reads of the poison listh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubh:}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjPubj)}(hstruct cxl_poison_state { u32 max_errors; unsigned long enabled_cmds[BITS_TO_LONGS(CXL_POISON_ENABLED_MAX)]; struct cxl_mbox_poison_out *list_out; struct mutex mutex; };h]hstruct cxl_poison_state { u32 max_errors; unsigned long enabled_cmds[BITS_TO_LONGS(CXL_POISON_ENABLED_MAX)]; struct cxl_mbox_poison_out *list_out; struct mutex mutex; };}hjqsbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjPubj])}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhM hjPubjo)}(hhh](jt)}(h@``max_errors`` Maximum media error records held in device cache h](jz)}(h``max_errors``h]j)}(hjh]h max_errors}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhKhjubj)}(hhh]j])}(h0Maximum media error records held in device cacheh]h0Maximum media error records held in device cache}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h8``enabled_cmds`` All poison commands enabled in the CEL h](jz)}(h``enabled_cmds``h]j)}(hjh]h enabled_cmds}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h&All poison commands enabled in the CELh]h&All poison commands enabled in the CEL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h8``list_out`` The poison list payload returned by device h](jz)}(h ``list_out``h]j)}(hjh]hlist_out}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj ubj)}(hhh]j])}(h*The poison list payload returned by deviceh]h*The poison list payload returned by device}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj(hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj(hMhjubjt)}(h*``mutex`` Protect reads of the poison listh](jz)}(h ``mutex``h]j)}(hjLh]hmutex}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjFubj)}(hhh]j])}(h Protect reads of the poison listh]h Protect reads of the poison list}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjbubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jshjahMhjubeh}(h]h ]h"]h$]h&]uh1jnhjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjNhhubj])}(hReads of the poison list are synchronized to ensure that a reader does not get an incomplete list because their request overlapped (was interrupted or preceded by) another read request of the same DPA range. CXL Spec 3.0 Section 8.2.9.8.4.1h]hReads of the poison list are synchronized to ensure that a reader does not get an incomplete list because their request overlapped (was interrupted or preceded by) another read request of the same DPA range. CXL Spec 3.0 Section 8.2.9.8.4.1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjNhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_fw_state (C struct)c.cxl_fw_statehNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h cxl_fw_stateh]j.)}(hstruct cxl_fw_stateh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhM ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhM ubjW)}(h cxl_fw_stateh]j])}(hjh]h cxl_fw_state}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhM ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhM ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhM hjhhubj)}(hhh]j])}(h"Firmware upload / activation stateh]h"Firmware upload / activation state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM ubeh}(h]h ](jstructeh"]h$]h&]jjjj'jj'jjjuh1j"hhhjNhNhNubj)}(hX**Definition**:: struct cxl_fw_state { unsigned long state[BITS_TO_LONGS(CXL_FW_STATE_BITS)]; bool oneshot; int num_slots; int cur_slot; int next_slot; }; **Members** ``state`` fw_uploader state bitmask ``oneshot`` whether the fw upload fits in a single transfer ``num_slots`` Number of FW slots available ``cur_slot`` Slot number currently active ``next_slot`` Slot number for the new firmwareh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh:}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMQhj+ubj)}(hstruct cxl_fw_state { unsigned long state[BITS_TO_LONGS(CXL_FW_STATE_BITS)]; bool oneshot; int num_slots; int cur_slot; int next_slot; };h]hstruct cxl_fw_state { unsigned long state[BITS_TO_LONGS(CXL_FW_STATE_BITS)]; bool oneshot; int num_slots; int cur_slot; int next_slot; };}hjLsbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMShj+ubj])}(h **Members**h]j)}(hj]h]hMembers}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhM[hj+ubjo)}(hhh](jt)}(h$``state`` fw_uploader state bitmask h](jz)}(h ``state``h]j)}(hj|h]hstate}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMPhjvubj)}(hhh]j])}(hfw_uploader state bitmaskh]hfw_uploader state bitmask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMPhjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jshjhMPhjsubjt)}(h<``oneshot`` whether the fw upload fits in a single transfer h](jz)}(h ``oneshot``h]j)}(hjh]honeshot}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMQhjubj)}(hhh]j])}(h/whether the fw upload fits in a single transferh]h/whether the fw upload fits in a single transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMQhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMQhjsubjt)}(h+``num_slots`` Number of FW slots available h](jz)}(h ``num_slots``h]j)}(hjh]h num_slots}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMRhjubj)}(hhh]j])}(hNumber of FW slots availableh]hNumber of FW slots available}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMRhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMRhjsubjt)}(h*``cur_slot`` Slot number currently active h](jz)}(h ``cur_slot``h]j)}(hj'h]hcur_slot}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMShj!ubj)}(hhh]j])}(hSlot number currently activeh]hSlot number currently active}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj<hMShj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jshj<hMShjsubjt)}(h.``next_slot`` Slot number for the new firmwareh](jz)}(h ``next_slot``h]j)}(hj`h]h next_slot}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMShjZubj)}(hhh]j])}(h Slot number for the new firmwareh]h Slot number for the new firmware}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMThjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jshjuhMShjsubeh}(h]h ]h"]h$]h&]uh1jnhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_security_state (C struct)c.cxl_security_statehNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hcxl_security_stateh]j.)}(hstruct cxl_security_stateh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMZubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMZubjW)}(hcxl_security_stateh]j])}(hjh]hcxl_security_state}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMZubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMZubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhMZhjhhubj)}(hhh]j])}(hDevice security stateh]hDevice security state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhM^hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMZubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1j"hhhjNhNhNubj)}(hXB**Definition**:: struct cxl_security_state { unsigned long state; unsigned long enabled_cmds[BITS_TO_LONGS(CXL_SEC_ENABLED_MAX)]; int poll_tmo_secs; bool sanitize_active; struct delayed_work poll_dwork; struct kernfs_node *sanitize_node; }; **Members** ``state`` state of last security operation ``enabled_cmds`` All security commands enabled in the CEL ``poll_tmo_secs`` polling timeout ``sanitize_active`` sanitize completion pending ``poll_dwork`` polling work item ``sanitize_node`` sanitation sysfs file to notifyh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMbhjubj)}(hstruct cxl_security_state { unsigned long state; unsigned long enabled_cmds[BITS_TO_LONGS(CXL_SEC_ENABLED_MAX)]; int poll_tmo_secs; bool sanitize_active; struct delayed_work poll_dwork; struct kernfs_node *sanitize_node; };h]hstruct cxl_security_state { unsigned long state; unsigned long enabled_cmds[BITS_TO_LONGS(CXL_SEC_ENABLED_MAX)]; int poll_tmo_secs; bool sanitize_active; struct delayed_work poll_dwork; struct kernfs_node *sanitize_node; };}hj9sbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMdhjubj])}(h **Members**h]j)}(hjJh]hMembers}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMmhjubjo)}(hhh](jt)}(h+``state`` state of last security operation h](jz)}(h ``state``h]j)}(hjih]hstate}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMahjcubj)}(hhh]j])}(h state of last security operationh]h state of last security operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj~hMahjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jshj~hMahj`ubjt)}(h:``enabled_cmds`` All security commands enabled in the CEL h](jz)}(h``enabled_cmds``h]j)}(hjh]h enabled_cmds}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMbhjubj)}(hhh]j])}(h(All security commands enabled in the CELh]h(All security commands enabled in the CEL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMbhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMbhj`ubjt)}(h"``poll_tmo_secs`` polling timeout h](jz)}(h``poll_tmo_secs``h]j)}(hjh]h poll_tmo_secs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMchjubj)}(hhh]j])}(hpolling timeouth]hpolling timeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMchjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMchj`ubjt)}(h0``sanitize_active`` sanitize completion pending h](jz)}(h``sanitize_active``h]j)}(hjh]hsanitize_active}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMdhjubj)}(hhh]j])}(hsanitize completion pendingh]hsanitize completion pending}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj)hMdhj*ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj)hMdhj`ubjt)}(h!``poll_dwork`` polling work item h](jz)}(h``poll_dwork``h]j)}(hjMh]h poll_dwork}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMehjGubj)}(hhh]j])}(hpolling work itemh]hpolling work item}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjbhMehjcubah}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ]h"]h$]h&]uh1jshjbhMehj`ubjt)}(h1``sanitize_node`` sanitation sysfs file to notifyh](jz)}(h``sanitize_node``h]j)}(hjh]h sanitize_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMehjubj)}(hhh]j])}(hsanitation sysfs file to notifyh]hsanitation sysfs file to notify}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMfhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMehj`ubeh}(h]h ]h"]h$]h&]uh1jnhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_dpa_perf (C struct)c.cxl_dpa_perfhNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h cxl_dpa_perfh]j.)}(hstruct cxl_dpa_perfh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMlubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMlubjW)}(h cxl_dpa_perfh]j])}(hjh]h cxl_dpa_perf}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMlubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMlubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhMlhjhhubj)}(hhh]j])}(hDPA performance property entryh]hDPA performance property entry}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMlubeh}(h]h ](jstructeh"]h$]h&]jjjj:jj:jjjuh1j"hhhjNhNhNubj)}(hX**Definition**:: struct cxl_dpa_perf { struct range dpa_range; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct access_coordinate cdat_coord[ACCESS_COORDINATE_MAX]; int qos_class; }; **Members** ``dpa_range`` range for DPA address ``coord`` QoS performance data (i.e. latency, bandwidth) ``cdat_coord`` raw QoS performance data from CDAT ``qos_class`` QoS Class cookiesh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh:}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj>ubj)}(hstruct cxl_dpa_perf { struct range dpa_range; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct access_coordinate cdat_coord[ACCESS_COORDINATE_MAX]; int qos_class; };h]hstruct cxl_dpa_perf { struct range dpa_range; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct access_coordinate cdat_coord[ACCESS_COORDINATE_MAX]; int qos_class; };}hj_sbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj>ubj])}(h **Members**h]j)}(hjph]hMembers}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj>ubjo)}(hhh](jt)}(h$``dpa_range`` range for DPA address h](jz)}(h ``dpa_range``h]j)}(hjh]h dpa_range}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(hrange for DPA addressh]hrange for DPA address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h9``coord`` QoS performance data (i.e. latency, bandwidth) h](jz)}(h ``coord``h]j)}(hjh]hcoord}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h.QoS performance data (i.e. latency, bandwidth)h]h.QoS performance data (i.e. latency, bandwidth)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h2``cdat_coord`` raw QoS performance data from CDAT h](jz)}(h``cdat_coord``h]j)}(hjh]h cdat_coord}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h"raw QoS performance data from CDATh]h"raw QoS performance data from CDAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h``qos_class`` QoS Class cookiesh](jz)}(h ``qos_class``h]j)}(hj:h]h qos_class}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj4ubj)}(hhh]j])}(hQoS Class cookiesh]hQoS Class cookies}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jshjOhMhjubeh}(h]h ]h"]h$]h&]uh1jnhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_dpa_partition (C struct)c.cxl_dpa_partitionhNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hcxl_dpa_partitionh]j.)}(hstruct cxl_dpa_partitionh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMubjW)}(hcxl_dpa_partitionh]j])}(hjh]hcxl_dpa_partition}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhMhjhhubj)}(hhh]j])}(hDPA partition descriptorh]hDPA partition descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1j"hhhjNhNhNubj)}(hXx**Definition**:: struct cxl_dpa_partition { struct resource res; struct cxl_dpa_perf perf; enum cxl_partition_mode mode; }; **Members** ``res`` shortcut to the partition in the DPA resource tree (cxlds->dpa_res) ``perf`` performance attributes of the partition from CDAT ``mode`` operation mode for the DPA capacity, e.g. ram, pmem, dynamic...h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hvstruct cxl_dpa_partition { struct resource res; struct cxl_dpa_perf perf; enum cxl_partition_mode mode; };h]hvstruct cxl_dpa_partition { struct resource res; struct cxl_dpa_perf perf; enum cxl_partition_mode mode; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj])}(h **Members**h]j)}(hj$h]hMembers}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubjo)}(hhh](jt)}(hL``res`` shortcut to the partition in the DPA resource tree (cxlds->dpa_res) h](jz)}(h``res``h]j)}(hjCh]hres}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj=ubj)}(hhh]j])}(hCshortcut to the partition in the DPA resource tree (cxlds->dpa_res)h]hCshortcut to the partition in the DPA resource tree (cxlds->dpa_res)}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjXhMhjYubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jshjXhMhj:ubjt)}(h;``perf`` performance attributes of the partition from CDAT h](jz)}(h``perf``h]j)}(hj|h]hperf}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjvubj)}(hhh]j])}(h1performance attributes of the partition from CDATh]h1performance attributes of the partition from CDAT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jshjhMhj:ubjt)}(hH``mode`` operation mode for the DPA capacity, e.g. ram, pmem, dynamic...h](jz)}(h``mode``h]j)}(hjh]hmode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h?operation mode for the DPA capacity, e.g. ram, pmem, dynamic...h]h?operation mode for the DPA capacity, e.g. ram, pmem, dynamic...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhj:ubeh}(h]h ]h"]h$]h&]uh1jnhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_dev_state (C struct)c.cxl_dev_statehNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h cxl_dev_stateh]j.)}(hstruct cxl_dev_stateh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj hhhjhMubjW)}(h cxl_dev_stateh]j])}(hj h]h cxl_dev_state}(hj/hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj+ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj hhhjhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhMhjhhubj)}(hhh]j])}(hThe driver device stateh]hThe driver device state}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjNhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jstructeh"]h$]h&]jjjjijjijjjuh1j"hhhjNhNhNubj)}(hX**Definition**:: struct cxl_dev_state { struct device *dev; struct cxl_memdev *cxlmd; struct cxl_register_map reg_map; struct cxl_regs regs; int cxl_dvsec; bool rcd; bool media_ready; struct resource dpa_res; struct cxl_dpa_partition part[CXL_NR_PARTITIONS_MAX]; unsigned int nr_partitions; u64 serial; enum cxl_devtype type; struct cxl_mailbox cxl_mbox; #ifdef CONFIG_CXL_FEATURES; struct cxl_features_state *cxlfs; #endif; }; **Members** ``dev`` The device associated with this CXL state ``cxlmd`` The device representing the CXL.mem capabilities of **dev** ``reg_map`` component and ras register mapping parameters ``regs`` Parsed register blocks ``cxl_dvsec`` Offset to the PCIe device DVSEC ``rcd`` operating in RCD mode (CXL 3.0 9.11.8 CXL Devices Attached to an RCH) ``media_ready`` Indicate whether the device media is usable ``dpa_res`` Overall DPA resource tree for the device ``part`` DPA partition array ``nr_partitions`` Number of DPA partitions ``serial`` PCIe Device Serial Number ``type`` Generic Memory Class device or Vendor Specific Memory device ``cxl_mbox`` CXL mailbox context ``cxlfs`` CXL features contexth](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh:}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjmubj)}(hXstruct cxl_dev_state { struct device *dev; struct cxl_memdev *cxlmd; struct cxl_register_map reg_map; struct cxl_regs regs; int cxl_dvsec; bool rcd; bool media_ready; struct resource dpa_res; struct cxl_dpa_partition part[CXL_NR_PARTITIONS_MAX]; unsigned int nr_partitions; u64 serial; enum cxl_devtype type; struct cxl_mailbox cxl_mbox; #ifdef CONFIG_CXL_FEATURES; struct cxl_features_state *cxlfs; #endif; };h]hXstruct cxl_dev_state { struct device *dev; struct cxl_memdev *cxlmd; struct cxl_register_map reg_map; struct cxl_regs regs; int cxl_dvsec; bool rcd; bool media_ready; struct resource dpa_res; struct cxl_dpa_partition part[CXL_NR_PARTITIONS_MAX]; unsigned int nr_partitions; u64 serial; enum cxl_devtype type; struct cxl_mailbox cxl_mbox; #ifdef CONFIG_CXL_FEATURES; struct cxl_features_state *cxlfs; #endif; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjmubj])}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjmubjo)}(hhh](jt)}(h2``dev`` The device associated with this CXL state h](jz)}(h``dev``h]j)}(hjh]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h)The device associated with this CXL stateh]h)The device associated with this CXL state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(hF``cxlmd`` The device representing the CXL.mem capabilities of **dev** h](jz)}(h ``cxlmd``h]j)}(hjh]hcxlmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h;The device representing the CXL.mem capabilities of **dev**h](h4The device representing the CXL.mem capabilities of }(hjhhhNhNubj)}(h**dev**h]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j\hj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj hMhjubjt)}(h:``reg_map`` component and ras register mapping parameters h](jz)}(h ``reg_map``h]j)}(hj>h]hreg_map}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj8ubj)}(hhh]j])}(h-component and ras register mapping parametersh]h-component and ras register mapping parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjShMhjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jshjShMhjubjt)}(h ``regs`` Parsed register blocks h](jz)}(h``regs``h]j)}(hjwh]hregs}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjqubj)}(hhh]j])}(hParsed register blocksh]hParsed register blocks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h.``cxl_dvsec`` Offset to the PCIe device DVSEC h](jz)}(h ``cxl_dvsec``h]j)}(hjh]h cxl_dvsec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(hOffset to the PCIe device DVSECh]hOffset to the PCIe device DVSEC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(hN``rcd`` operating in RCD mode (CXL 3.0 9.11.8 CXL Devices Attached to an RCH) h](jz)}(h``rcd``h]j)}(hjh]hrcd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(hEoperating in RCD mode (CXL 3.0 9.11.8 CXL Devices Attached to an RCH)h]hEoperating in RCD mode (CXL 3.0 9.11.8 CXL Devices Attached to an RCH)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h<``media_ready`` Indicate whether the device media is usable h](jz)}(h``media_ready``h]j)}(hj"h]h media_ready}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(h+Indicate whether the device media is usableh]h+Indicate whether the device media is usable}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj7hMhj8ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj7hMhjubjt)}(h5``dpa_res`` Overall DPA resource tree for the device h](jz)}(h ``dpa_res``h]j)}(hj[h]hdpa_res}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjUubj)}(hhh]j])}(h(Overall DPA resource tree for the deviceh]h(Overall DPA resource tree for the device}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjphMhjqubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jshjphMhjubjt)}(h``part`` DPA partition array h](jz)}(h``part``h]j)}(hjh]hpart}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(hDPA partition arrayh]hDPA partition array}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h+``nr_partitions`` Number of DPA partitions h](jz)}(h``nr_partitions``h]j)}(hjh]h nr_partitions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(hNumber of DPA partitionsh]hNumber of DPA partitions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h%``serial`` PCIe Device Serial Number h](jz)}(h ``serial``h]j)}(hjh]hserial}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjubj)}(hhh]j])}(hPCIe Device Serial Numberh]hPCIe Device Serial Number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(hF``type`` Generic Memory Class device or Vendor Specific Memory device h](jz)}(h``type``h]j)}(hj?h]htype}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj9ubj)}(hhh]j])}(h to validate the fields passed in by the user then submit the }(hj "hhhNhNubj)}(h **opcode**h]hopcode}(hj'"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj "ubh to the hardware.}(hj "hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjNhhubj])}(hSee struct cxl_command_info.h]hSee struct cxl_command_info.}(hj@"hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhM"hjNhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_hdm (C struct) c.cxl_hdmhNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hcxl_hdmh]j.)}(hstruct cxl_hdmh](j)}(hjh]hstruct}(hjh"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjd"hhhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhM'ubjF)}(h h]h }(hjv"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjd"hhhju"hM'ubjW)}(hcxl_hdmh]j])}(hjb"h]hcxl_hdm}(hj"hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj"ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjd"hhhju"hM'ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj`"hhhju"hM'ubah}(h]j["ah ](jjeh"]h$]h&]jj)jhuh1j'hju"hM'hj]"hhubj)}(hhh]j])}(h7HDM Decoder registers and cached / decoded capabilitiesh]h7HDM Decoder registers and cached / decoded capabilities}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj"hhubah}(h]h ]h"]h$]h&]uh1jhj]"hhhju"hM'ubeh}(h]h ](jstructeh"]h$]h&]jjjj"jj"jjjuh1j"hhhjNhNhNubj)}(hX**Definition**:: struct cxl_hdm { struct cxl_component_regs regs; unsigned int decoder_count; unsigned int target_count; unsigned int interleave_mask; unsigned long iw_cap_mask; struct cxl_port *port; }; **Members** ``regs`` mapped registers, see devm_cxl_setup_hdm() ``decoder_count`` number of decoders for this port ``target_count`` for switch decoders, max downstream port targets ``interleave_mask`` interleave granularity capability, see check_interleave_cap() ``iw_cap_mask`` bitmask of supported interleave ways, see check_interleave_cap() ``port`` mapped cxl_port, see devm_cxl_setup_hdm()h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh:}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj"ubj)}(hstruct cxl_hdm { struct cxl_component_regs regs; unsigned int decoder_count; unsigned int target_count; unsigned int interleave_mask; unsigned long iw_cap_mask; struct cxl_port *port; };h]hstruct cxl_hdm { struct cxl_component_regs regs; unsigned int decoder_count; unsigned int target_count; unsigned int interleave_mask; unsigned long iw_cap_mask; struct cxl_port *port; };}hj"sbah}(h]h ]h"]h$]h&]hhuh1jhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj"ubj])}(h **Members**h]j)}(hj"h]hMembers}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj"ubjo)}(hhh](jt)}(h4``regs`` mapped registers, see devm_cxl_setup_hdm() h](jz)}(h``regs``h]j)}(hj#h]hregs}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj#ubj)}(hhh]j])}(h*mapped registers, see devm_cxl_setup_hdm()h]h*mapped registers, see devm_cxl_setup_hdm()}(hj0#hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj,#hMhj-#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jshj,#hMhj#ubjt)}(h3``decoder_count`` number of decoders for this port h](jz)}(h``decoder_count``h]j)}(hjP#h]h decoder_count}(hjR#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN#ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjJ#ubj)}(hhh]j])}(h number of decoders for this porth]h number of decoders for this port}(hji#hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hje#hMhjf#ubah}(h]h ]h"]h$]h&]uh1jhjJ#ubeh}(h]h ]h"]h$]h&]uh1jshje#hMhj#ubjt)}(hB``target_count`` for switch decoders, max downstream port targets h](jz)}(h``target_count``h]j)}(hj#h]h target_count}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj#ubj)}(hhh]j])}(h0for switch decoders, max downstream port targetsh]h0for switch decoders, max downstream port targets}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jshj#hMhj#ubjt)}(hR``interleave_mask`` interleave granularity capability, see check_interleave_cap() h](jz)}(h``interleave_mask``h]j)}(hj#h]hinterleave_mask}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj#ubj)}(hhh]j])}(h=interleave granularity capability, see check_interleave_cap()h]h=interleave granularity capability, see check_interleave_cap()}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj#hMhj#ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jshj#hMhj#ubjt)}(hQ``iw_cap_mask`` bitmask of supported interleave ways, see check_interleave_cap() h](jz)}(h``iw_cap_mask``h]j)}(hj#h]h iw_cap_mask}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj#ubj)}(hhh]j])}(h@bitmask of supported interleave ways, see check_interleave_cap()h]h@bitmask of supported interleave ways, see check_interleave_cap()}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jshj$hMhj#ubjt)}(h2``port`` mapped cxl_port, see devm_cxl_setup_hdm()h](jz)}(h``port``h]j)}(hj4$h]hport}(hj6$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2$ubah}(h]h ]h"]h$]h&]uh1jyhh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhj.$ubj)}(hhh]j])}(h)mapped cxl_port, see devm_cxl_setup_hdm()h]h)mapped cxl_port, see devm_cxl_setup_hdm()}(hjM$hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hh/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:417: ./drivers/cxl/cxlmem.hhMhjJ$ubah}(h]h ]h"]h$]h&]uh1jhj.$ubeh}(h]h ]h"]h$]h&]uh1jshjI$hMhj#ubeh}(h]h ]h"]h$]h&]uh1jnhj"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'set_exclusive_cxl_commands (C function)c.set_exclusive_cxl_commandshNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hSvoid set_exclusive_cxl_commands (struct cxl_memdev_state *mds, unsigned long *cmds)h]j.)}(hRvoid set_exclusive_cxl_commands(struct cxl_memdev_state *mds, unsigned long *cmds)h](j4)}(hvoidh]hvoid}(hj$hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj$hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM/ubjF)}(h h]h }(hj$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj$hhhj$hM/ubjW)}(hset_exclusive_cxl_commandsh]j])}(hset_exclusive_cxl_commandsh]hset_exclusive_cxl_commands}(hj$hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj$ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj$hhhj$hM/ubjv)}(h3(struct cxl_memdev_state *mds, unsigned long *cmds)h](j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubjF)}(h h]h }(hj$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj$ubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hj$hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjj)}j]j)}jj$sbc.set_exclusive_cxl_commandsasbuh1hhj$ubjF)}(h h]h }(hj %hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj$ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj])}(hmdsh]hmds}(hj$%hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj$ubj|)}(hunsigned long *cmdsh](j4)}(hunsignedh]hunsigned}(hj=%hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj9%ubjF)}(h h]h }(hjK%hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj9%ubj4)}(hlongh]hlong}(hjY%hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj9%ubjF)}(h h]h }(hjg%hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj9%ubj)}(hjh]h*}(hju%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9%ubj])}(hcmdsh]hcmds}(hj%hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj9%ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj$ubeh}(h]h ]h"]h$]h&]hhuh1juhj$hhhj$hM/ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj$hhhj$hM/ubah}(h]j$ah ](jjeh"]h$]h&]jj)jhuh1j'hj$hM/hj$hhubj)}(hhh]j])}(h$atomically disable user cxl commandsh]h$atomically disable user cxl commands}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM/hj%hhubah}(h]h ]h"]h$]h&]uh1jhj$hhhj$hM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1j"hhhjNhNhNubj)}(hXP**Parameters** ``struct cxl_memdev_state *mds`` The device state to operate on ``unsigned long *cmds`` bitmap of commands to mark exclusive **Description** Grab the cxl_memdev_rwsem in write mode to flush in-flight invocations of the ioctl path and then disable future execution of commands with the command ids set in **cmds**.h](j])}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM3hj%ubjo)}(hhh](jt)}(h@``struct cxl_memdev_state *mds`` The device state to operate on h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hj%h]hstruct cxl_memdev_state *mds}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM0hj%ubj)}(hhh]j])}(hThe device state to operate onh]hThe device state to operate on}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj&hM0hj&ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jshj&hM0hj%ubjt)}(h=``unsigned long *cmds`` bitmap of commands to mark exclusive h](jz)}(h``unsigned long *cmds``h]j)}(hj&&h]hunsigned long *cmds}(hj(&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$&ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM1hj &ubj)}(hhh]j])}(h$bitmap of commands to mark exclusiveh]h$bitmap of commands to mark exclusive}(hj?&hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj;&hM1hj<&ubah}(h]h ]h"]h$]h&]uh1jhj &ubeh}(h]h ]h"]h$]h&]uh1jshj;&hM1hj%ubeh}(h]h ]h"]h$]h&]uh1jnhj%ubj])}(h**Description**h]j)}(hja&h]h Description}(hjc&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_&ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM3hj%ubj])}(hGrab the cxl_memdev_rwsem in write mode to flush in-flight invocations of the ioctl path and then disable future execution of commands with the command ids set in **cmds**.h](hGrab the cxl_memdev_rwsem in write mode to flush in-flight invocations of the ioctl path and then disable future execution of commands with the command ids set in }(hjw&hhhNhNubj)}(h**cmds**h]hcmds}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw&ubh.}(hjw&hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM2hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)clear_exclusive_cxl_commands (C function)c.clear_exclusive_cxl_commandshNtauh1jhjNhhhNhNubj#)}(hhh](j()}(hUvoid clear_exclusive_cxl_commands (struct cxl_memdev_state *mds, unsigned long *cmds)h]j.)}(hTvoid clear_exclusive_cxl_commands(struct cxl_memdev_state *mds, unsigned long *cmds)h](j4)}(hvoidh]hvoid}(hj&hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj&hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMCubjF)}(h h]h }(hj&hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&hhhj&hMCubjW)}(hclear_exclusive_cxl_commandsh]j])}(hclear_exclusive_cxl_commandsh]hclear_exclusive_cxl_commands}(hj&hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj&ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj&hhhj&hMCubjv)}(h3(struct cxl_memdev_state *mds, unsigned long *cmds)h](j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjF)}(h h]h }(hj'hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&ubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hj'hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjj)}j]j)}jj&sbc.clear_exclusive_cxl_commandsasbuh1hhj&ubjF)}(h h]h }(hj3'hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&ubj)}(hjh]h*}(hjA'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj])}(hmdsh]hmds}(hjN'hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj&ubj|)}(hunsigned long *cmdsh](j4)}(hunsignedh]hunsigned}(hjg'hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjc'ubjF)}(h h]h }(hju'hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjc'ubj4)}(hlongh]hlong}(hj'hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjc'ubjF)}(h h]h }(hj'hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjc'ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjc'ubj])}(hcmdsh]hcmds}(hj'hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjc'ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj&ubeh}(h]h ]h"]h$]h&]hhuh1juhj&hhhj&hMCubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj&hhhj&hMCubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1j'hj&hMChj&hhubj)}(hhh]j])}(h#atomically enable user cxl commandsh]h#atomically enable user cxl commands}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMChj'hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj&hMCubeh}(h]h ](jfunctioneh"]h$]h&]jjjj'jj'jjjuh1j"hhhjNhNhNubj)}(h**Parameters** ``struct cxl_memdev_state *mds`` The device state to modify ``unsigned long *cmds`` bitmap of commands to mark available for userspaceh](j])}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMGhj'ubjo)}(hhh](jt)}(h<``struct cxl_memdev_state *mds`` The device state to modify h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hj(h]hstruct cxl_memdev_state *mds}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMDhj(ubj)}(hhh]j])}(hThe device state to modifyh]hThe device state to modify}(hj0(hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj,(hMDhj-(ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1jshj,(hMDhj(ubjt)}(hJ``unsigned long *cmds`` bitmap of commands to mark available for userspaceh](jz)}(h``unsigned long *cmds``h]j)}(hjP(h]hunsigned long *cmds}(hjR(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN(ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMFhjJ(ubj)}(hhh]j])}(h2bitmap of commands to mark available for userspaceh]h2bitmap of commands to mark available for userspace}(hji(hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMEhjf(ubah}(h]h ]h"]h$]h&]uh1jhjJ(ubeh}(h]h ]h"]h$]h&]uh1jshje(hMFhj(ubeh}(h]h ]h"]h$]h&]uh1jnhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j cxl_mem_get_fw_info (C function)c.cxl_mem_get_fw_infohNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h6int cxl_mem_get_fw_info (struct cxl_memdev_state *mds)h]j.)}(h5int cxl_mem_get_fw_info(struct cxl_memdev_state *mds)h](j4)}(hinth]hint}(hj(hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj(hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMubjF)}(h h]h }(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj(hhhj(hMubjW)}(hcxl_mem_get_fw_infoh]j])}(hcxl_mem_get_fw_infoh]hcxl_mem_get_fw_info}(hj(hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj(ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj(hhhj(hMubjv)}(h(struct cxl_memdev_state *mds)h]j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjF)}(h h]h }(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj(ubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hj)hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj)modnameN classnameNjj)}j]j)}jj(sbc.cxl_mem_get_fw_infoasbuh1hhj(ubjF)}(h h]h }(hj%)hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj(ubj)}(hjh]h*}(hj3)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj])}(hmdsh]hmds}(hj@)hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj(ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj(ubah}(h]h ]h"]h$]h&]hhuh1juhj(hhhj(hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj(hhhj(hMubah}(h]j(ah ](jjeh"]h$]h&]jj)jhuh1j'hj(hMhj(hhubj)}(hhh]j])}(hGet Firmware infoh]hGet Firmware info}(hjj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjg)hhubah}(h]h ]h"]h$]h&]uh1jhj(hhhj(hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj)jj)jjjuh1j"hhhjNhNhNubj)}(h**Parameters** ``struct cxl_memdev_state *mds`` The device data for the operation **Description** Retrieve firmware info for the device specified. See CXL-3.0 8.2.9.3.1 Get FW Info **Return** 0 if no error: or the result of the mailbox command.h](j])}(h**Parameters**h]j)}(hj)h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubjo)}(hhh]jt)}(hC``struct cxl_memdev_state *mds`` The device data for the operation h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hj)h]hstruct cxl_memdev_state *mds}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubj)}(hhh]j])}(h!The device data for the operationh]h!The device data for the operation}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jshj)hMhj)ubah}(h]h ]h"]h$]h&]uh1jnhj)ubj])}(h**Description**h]j)}(hj)h]h Description}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubj])}(h0Retrieve firmware info for the device specified.h]h0Retrieve firmware info for the device specified.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubj])}(h!See CXL-3.0 8.2.9.3.1 Get FW Infoh]h!See CXL-3.0 8.2.9.3.1 Get FW Info}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubj])}(h **Return**h]j)}(hj*h]hReturn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubj])}(h40 if no error: or the result of the mailbox command.h]h40 if no error: or the result of the mailbox command.}(hj2*hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj)ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j cxl_mem_activate_fw (C function)c.cxl_mem_activate_fwhNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h@int cxl_mem_activate_fw (struct cxl_memdev_state *mds, int slot)h]j.)}(h?int cxl_mem_activate_fw(struct cxl_memdev_state *mds, int slot)h](j4)}(hinth]hint}(hja*hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj]*hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMubjF)}(h h]h }(hjp*hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj]*hhhjo*hMubjW)}(hcxl_mem_activate_fwh]j])}(hcxl_mem_activate_fwh]hcxl_mem_activate_fw}(hj*hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj~*ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj]*hhhjo*hMubjv)}(h((struct cxl_memdev_state *mds, int slot)h](j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjF)}(h h]h }(hj*hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj*ubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hj*hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*modnameN classnameNjj)}j]j)}jj*sbc.cxl_mem_activate_fwasbuh1hhj*ubjF)}(h h]h }(hj*hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj*ubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj])}(hmdsh]hmds}(hj*hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj*ubj|)}(hint sloth](j4)}(hinth]hint}(hj+hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj +ubjF)}(h h]h }(hj+hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj +ubj])}(hsloth]hslot}(hj,+hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj +ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj*ubeh}(h]h ]h"]h$]h&]hhuh1juhj]*hhhjo*hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjY*hhhjo*hMubah}(h]jT*ah ](jjeh"]h$]h&]jj)jhuh1j'hjo*hMhjV*hhubj)}(hhh]j])}(hActivate Firmwareh]hActivate Firmware}(hjV+hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjS+hhubah}(h]h ]h"]h$]h&]uh1jhjV*hhhjo*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjn+jjn+jjjuh1j"hhhjNhNhNubj)}(hX0**Parameters** ``struct cxl_memdev_state *mds`` The device data for the operation ``int slot`` slot number to activate **Description** Activate firmware in a given slot for the device specified. See CXL-3.0 8.2.9.3.3 Activate FW **Return** 0 if no error: or the result of the mailbox command.h](j])}(h**Parameters**h]j)}(hjx+h]h Parameters}(hjz+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv+ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjr+ubjo)}(hhh](jt)}(hC``struct cxl_memdev_state *mds`` The device data for the operation h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hj+h]hstruct cxl_memdev_state *mds}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj+ubj)}(hhh]j])}(h!The device data for the operationh]h!The device data for the operation}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jshj+hMhj+ubjt)}(h%``int slot`` slot number to activate h](jz)}(h ``int slot``h]j)}(hj+h]hint slot}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhj+ubj)}(hhh]j])}(hslot number to activateh]hslot number to activate}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jshj+hMhj+ubeh}(h]h ]h"]h$]h&]uh1jnhjr+ubj])}(h**Description**h]j)}(hj ,h]h Description}(hj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ,ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjr+ubj])}(h;Activate firmware in a given slot for the device specified.h]h;Activate firmware in a given slot for the device specified.}(hj!,hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjr+ubj])}(h!See CXL-3.0 8.2.9.3.3 Activate FWh]h!See CXL-3.0 8.2.9.3.3 Activate FW}(hj0,hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjr+ubj])}(h **Return**h]j)}(hjA,h]hReturn}(hjC,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?,ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjr+ubj])}(h40 if no error: or the result of the mailbox command.h]h40 if no error: or the result of the mailbox command.}(hjW,hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjr+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"cxl_mem_abort_fw_xfer (C function)c.cxl_mem_abort_fw_xferhNtauh1jhjNhhhNhNubj#)}(hhh](j()}(h8int cxl_mem_abort_fw_xfer (struct cxl_memdev_state *mds)h]j.)}(h7int cxl_mem_abort_fw_xfer(struct cxl_memdev_state *mds)h](j4)}(hinth]hint}(hj,hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj,hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM ubjF)}(h h]h }(hj,hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj,hhhj,hM ubjW)}(hcxl_mem_abort_fw_xferh]j])}(hcxl_mem_abort_fw_xferh]hcxl_mem_abort_fw_xfer}(hj,hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj,ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj,hhhj,hM ubjv)}(h(struct cxl_memdev_state *mds)h]j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubjF)}(h h]h }(hj,hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj,ubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hj,hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj,ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj,modnameN classnameNjj)}j]j)}jj,sbc.cxl_mem_abort_fw_xferasbuh1hhj,ubjF)}(h h]h }(hj-hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj,ubj)}(hjh]h*}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj])}(hmdsh]hmds}(hj-hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj,ubah}(h]h ]h"]h$]h&]hhuh1juhj,hhhj,hM ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj~,hhhj,hM ubah}(h]jy,ah ](jjeh"]h$]h&]jj)jhuh1j'hj,hM hj{,hhubj)}(hhh]j])}(h Abort an in-progress FW transferh]h Abort an in-progress FW transfer}(hjF-hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM hjC-hhubah}(h]h ]h"]h$]h&]uh1jhj{,hhhj,hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj^-jj^-jjjuh1j"hhhjNhNhNubj)}(hX **Parameters** ``struct cxl_memdev_state *mds`` The device data for the operation **Description** Abort an in-progress firmware transfer for the device specified. See CXL-3.0 8.2.9.3.2 Transfer FW **Return** 0 if no error: or the result of the mailbox command.h](j])}(h**Parameters**h]j)}(hjh-h]h Parameters}(hjj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf-ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjb-ubjo)}(hhh]jt)}(hC``struct cxl_memdev_state *mds`` The device data for the operation h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hj-h]hstruct cxl_memdev_state *mds}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM hj-ubj)}(hhh]j])}(h!The device data for the operationh]h!The device data for the operation}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj-hM hj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jshj-hM hj~-ubah}(h]h ]h"]h$]h&]uh1jnhjb-ubj])}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjb-ubj])}(h@Abort an in-progress firmware transfer for the device specified.h]h@Abort an in-progress firmware transfer for the device specified.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chM hjb-ubj])}(h!See CXL-3.0 8.2.9.3.2 Transfer FWh]h!See CXL-3.0 8.2.9.3.2 Transfer FW}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjb-ubj])}(h **Return**h]j)}(hj-h]hReturn}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjb-ubj])}(h40 if no error: or the result of the mailbox command.h]h40 if no error: or the result of the mailbox command.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:420: ./drivers/cxl/core/memdev.chMhjb-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjNhhhNhNubeh}(h]cxl-memory-deviceah ]h"]cxl memory deviceah$]h&]uh1jGhj/hhhhhM@ubjH)}(hhh](jM)}(hCXL Porth]hCXL Port}(hj/.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj,.hhhhhMRubj])}(hXThe port driver enumerates dport via PCI and scans for HDM (Host-managed-Device-Memory) decoder resources via the **component_reg_phys** value passed in by the agent that registered the port. All descendant ports of a CXL root port (described by platform firmware) are managed in this drivers context. Each driver instance is responsible for tearing down the driver context of immediate descendant ports. The locking for this is validated by CONFIG_PROVE_CXL_LOCKING.h](hrThe port driver enumerates dport via PCI and scans for HDM (Host-managed-Device-Memory) decoder resources via the }(hj=.hhhNhNubj)}(h**component_reg_phys**h]hcomponent_reg_phys}(hjE.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=.ubhXK value passed in by the agent that registered the port. All descendant ports of a CXL root port (described by platform firmware) are managed in this drivers context. Each driver instance is responsible for tearing down the driver context of immediate descendant ports. The locking for this is validated by CONFIG_PROVE_CXL_LOCKING.}(hj=.hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hf/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:425: ./drivers/cxl/port.chK hj,.hhubj])}(hThe primary service this driver provides is presenting APIs to other drivers to utilize the decoders, and indicating to userspace (via bind status) the connectivity of the CXL.mem protocol throughout the PCIe topology.h]hThe primary service this driver provides is presenting APIs to other drivers to utilize the decoders, and indicating to userspace (via bind status) the connectivity of the CXL.mem protocol throughout the PCIe topology.}(hj^.hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hf/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:425: ./drivers/cxl/port.chKhj,.hhubeh}(h]cxl-portah ]h"]cxl portah$]h&]uh1jGhj/hhhhhMRubjH)}(hhh](jM)}(hCXL Coreh]hCXL Core}(hjx.hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhju.hhhhhMWubj])}(hThe CXL core objects like ports, decoders, and regions are shared between the subsystem drivers cxl_acpi, cxl_pci, and core drivers (port-driver, region-driver, nvdimm object-drivers... etc).h]hThe CXL core objects like ports, decoders, and regions are shared between the subsystem drivers cxl_acpi, cxl_pci, and core drivers (port-driver, region-driver, nvdimm object-drivers... etc).}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:430: ./drivers/cxl/cxl.hhKhju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_register_map (C struct)c.cxl_register_maphNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcxl_register_maph]j.)}(hstruct cxl_register_maph](j)}(hjh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhKubjF)}(h h]h }(hj.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj.hhhj.hKubjW)}(hcxl_register_maph]j])}(hj.h]hcxl_register_map}(hj.hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj.ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj.hhhj.hKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj.hhhj.hKubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1j'hj.hKhj.hhubj)}(hhh]j])}(h1DVSEC harvested register block mapping parametersh]h1DVSEC harvested register block mapping parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj.hhubah}(h]h ]h"]h$]h&]uh1jhj.hhhj.hKubeh}(h]h ](jstructeh"]h$]h&]jjjj/jj/jjjuh1j"hhhju.hNhNubj)}(hX\**Definition**:: struct cxl_register_map { struct device *host; void __iomem *base; resource_size_t resource; resource_size_t max_size; u8 reg_type; union { struct cxl_component_reg_map component_map; struct cxl_device_reg_map device_map; struct cxl_pmu_reg_map pmu_map; }; }; **Members** ``host`` device for devm operations and logging ``base`` virtual base of the register-block-BAR + **block_offset** ``resource`` physical resource base of the register block ``max_size`` maximum mapping size to perform register search ``reg_type`` see enum cxl_regloc_type ``{unnamed_union}`` anonymous ``component_map`` cxl_reg_map for component registers ``device_map`` cxl_reg_maps for device registers ``pmu_map`` cxl_reg_maps for CXL Performance Monitoring Unitsh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubh:}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj /ubj)}(hX7struct cxl_register_map { struct device *host; void __iomem *base; resource_size_t resource; resource_size_t max_size; u8 reg_type; union { struct cxl_component_reg_map component_map; struct cxl_device_reg_map device_map; struct cxl_pmu_reg_map pmu_map; }; };h]hX7struct cxl_register_map { struct device *host; void __iomem *base; resource_size_t resource; resource_size_t max_size; u8 reg_type; union { struct cxl_component_reg_map component_map; struct cxl_device_reg_map device_map; struct cxl_pmu_reg_map pmu_map; }; };}hj-/sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj /ubj])}(h **Members**h]j)}(hj>/h]hMembers}(hj@/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:2ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMahj62ubj)}(hhh]j])}(hthis decoder's deviceh]hthis decoder’s device}(hjU2hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjQ2hMahjR2ubah}(h]h ]h"]h$]h&]uh1jhj62ubeh}(h]h ]h"]h$]h&]uh1jshjQ2hMahj32ubjt)}(h``id`` kernel device name id h](jz)}(h``id``h]j)}(hju2h]hid}(hjw2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs2ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMbhjo2ubj)}(hhh]j])}(hkernel device name idh]hkernel device name id}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj2hMbhj2ubah}(h]h ]h"]h$]h&]uh1jhjo2ubeh}(h]h ]h"]h$]h&]uh1jshj2hMbhj32ubjt)}(hA``hpa_range`` Host physical address range mapped by this decoder h](jz)}(h ``hpa_range``h]j)}(hj2h]h hpa_range}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMchj2ubj)}(hhh]j])}(h2Host physical address range mapped by this decoderh]h2Host physical address range mapped by this decoder}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj2hMchj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jshj2hMchj32ubjt)}(h8``interleave_ways`` number of cxl_dports in this decode h](jz)}(h``interleave_ways``h]j)}(hj2h]hinterleave_ways}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMdhj2ubj)}(hhh]j])}(h#number of cxl_dports in this decodeh]h#number of cxl_dports in this decode}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj2hMdhj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jshj2hMdhj32ubjt)}(h1``interleave_granularity`` data stride per dport h](jz)}(h``interleave_granularity``h]j)}(hj 3h]hinterleave_granularity}(hj"3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMehj3ubj)}(hhh]j])}(hdata stride per dporth]hdata stride per dport}(hj93hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj53hMehj63ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jshj53hMehj32ubjt)}(hB``target_type`` accelerator vs expander (type2 vs type3) selector h](jz)}(h``target_type``h]j)}(hjY3h]h target_type}(hj[3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjW3ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMfhjS3ubj)}(hhh]j])}(h1accelerator vs expander (type2 vs type3) selectorh]h1accelerator vs expander (type2 vs type3) selector}(hjr3hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjn3hMfhjo3ubah}(h]h ]h"]h$]h&]uh1jhjS3ubeh}(h]h ]h"]h$]h&]uh1jshjn3hMfhj32ubjt)}(h6``region`` currently assigned region for this decoder h](jz)}(h ``region``h]j)}(hj3h]hregion}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMghj3ubj)}(hhh]j])}(h*currently assigned region for this decoderh]h*currently assigned region for this decoder}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj3hMghj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jshj3hMghj32ubjt)}(h/``flags`` memory type capabilities and locking h](jz)}(h ``flags``h]j)}(hj3h]hflags}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhhj3ubj)}(hhh]j])}(h$memory type capabilities and lockingh]h$memory type capabilities and locking}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj3hMhhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jshj3hMhhj32ubjt)}(hJ``commit`` device/decoder-type specific callback to commit settings to hw h](jz)}(h ``commit``h]j)}(hj4h]hcommit}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMihj3ubj)}(hhh]j])}(h>device/decoder-type specific callback to commit settings to hwh]h>device/decoder-type specific callback to commit settings to hw}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj4hMihj4ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1jshj4hMihj32ubjt)}(hD``reset`` device/decoder-type specific callback to reset hw settingsh](jz)}(h ``reset``h]j)}(hj=4h]hreset}(hj?4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;4ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMihj74ubj)}(hhh]j])}(h:device/decoder-type specific callback to reset hw settingsh]h:device/decoder-type specific callback to reset hw settings}(hjV4hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMjhjS4ubah}(h]h ]h"]h$]h&]uh1jhj74ubeh}(h]h ]h"]h$]h&]uh1jshjR4hMihj32ubeh}(h]h ]h"]h$]h&]uh1jnhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_endpoint_decoder (C struct)c.cxl_endpoint_decoderhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcxl_endpoint_decoderh]j.)}(hstruct cxl_endpoint_decoderh](j)}(hjh]hstruct}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMpubjF)}(h h]h }(hj4hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj4hhhj4hMpubjW)}(hcxl_endpoint_decoderh]j])}(hj4h]hcxl_endpoint_decoder}(hj4hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj4ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj4hhhj4hMpubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj4hhhj4hMpubah}(h]j4ah ](jjeh"]h$]h&]jj)jhuh1j'hj4hMphj4hhubj)}(hhh]j])}(hEndpoint / SPA to DPA decoderh]hEndpoint / SPA to DPA decoder}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj4hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj4hMpubeh}(h]h ](jstructeh"]h$]h&]jjjj4jj4jjjuh1j"hhhju.hNhNubj)}(hX**Definition**:: struct cxl_endpoint_decoder { struct cxl_decoder cxld; struct resource *dpa_res; resource_size_t skip; enum cxl_decoder_state state; int part; int pos; }; **Members** ``cxld`` base cxl_decoder_object ``dpa_res`` actively claimed DPA span of this decoder ``skip`` offset into **dpa_res** where **cxld.hpa_range** maps ``state`` autodiscovery state ``part`` partition index this decoder maps ``pos`` interleave position in **cxld.region**h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubh:}(hj4hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj4ubj)}(hstruct cxl_endpoint_decoder { struct cxl_decoder cxld; struct resource *dpa_res; resource_size_t skip; enum cxl_decoder_state state; int part; int pos; };h]hstruct cxl_endpoint_decoder { struct cxl_decoder cxld; struct resource *dpa_res; resource_size_t skip; enum cxl_decoder_state state; int part; int pos; };}hj5sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj4ubj])}(h **Members**h]j)}(hj'5h]hMembers}(hj)5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%5ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj4ubjo)}(hhh](jt)}(h!``cxld`` base cxl_decoder_object h](jz)}(h``cxld``h]j)}(hjF5h]hcxld}(hjH5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD5ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj@5ubj)}(hhh]j])}(hbase cxl_decoder_objecth]hbase cxl_decoder_object}(hj_5hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj[5hMhj\5ubah}(h]h ]h"]h$]h&]uh1jhj@5ubeh}(h]h ]h"]h$]h&]uh1jshj[5hMhj=5ubjt)}(h6``dpa_res`` actively claimed DPA span of this decoder h](jz)}(h ``dpa_res``h]j)}(hj5h]hdpa_res}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}5ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjy5ubj)}(hhh]j])}(h)actively claimed DPA span of this decoderh]h)actively claimed DPA span of this decoder}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jhjy5ubeh}(h]h ]h"]h$]h&]uh1jshj5hMhj=5ubjt)}(h?``skip`` offset into **dpa_res** where **cxld.hpa_range** maps h](jz)}(h``skip``h]j)}(hj5h]hskip}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj5ubj)}(hhh]j])}(h5offset into **dpa_res** where **cxld.hpa_range** mapsh](h offset into }(hj5hhhNhNubj)}(h **dpa_res**h]hdpa_res}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh where }(hj5hhhNhNubj)}(h**cxld.hpa_range**h]hcxld.hpa_range}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh maps}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jshj5hMhj=5ubjt)}(h``state`` autodiscovery state h](jz)}(h ``state``h]j)}(hj6h]hstate}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj6ubj)}(hhh]j])}(hautodiscovery stateh]hautodiscovery state}(hj.6hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj*6hMhj+6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jshj*6hMhj=5ubjt)}(h+``part`` partition index this decoder maps h](jz)}(h``part``h]j)}(hjN6h]hpart}(hjP6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL6ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjH6ubj)}(hhh]j])}(h!partition index this decoder mapsh]h!partition index this decoder maps}(hjg6hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjc6hMhjd6ubah}(h]h ]h"]h$]h&]uh1jhjH6ubeh}(h]h ]h"]h$]h&]uh1jshjc6hMhj=5ubjt)}(h.``pos`` interleave position in **cxld.region**h](jz)}(h``pos``h]j)}(hj6h]hpos}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj6ubj)}(hhh]j])}(h&interleave position in **cxld.region**h](hinterleave position in }(hj6hhhNhNubj)}(h**cxld.region**h]h cxld.region}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jshj6hMhj=5ubeh}(h]h ]h"]h$]h&]uh1jnhj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_switch_decoder (C struct)c.cxl_switch_decoderhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcxl_switch_decoderh]j.)}(hstruct cxl_switch_decoderh](j)}(hjh]hstruct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMubjF)}(h h]h }(hj6hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj6hhhj6hMubjW)}(hcxl_switch_decoderh]j])}(hj6h]hcxl_switch_decoder}(hj7hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj 7ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj6hhhj6hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj6hhhj6hMubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1j'hj6hMhj6hhubj)}(hhh]j])}(hSwitch specific CXL HDM Decoderh]hSwitch specific CXL HDM Decoder}(hj17hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj.7hhubah}(h]h ]h"]h$]h&]uh1jhj6hhhj6hMubeh}(h]h ](jstructeh"]h$]h&]jjjjI7jjI7jjjuh1j"hhhju.hNhNubj)}(hX9**Definition**:: struct cxl_switch_decoder { struct cxl_decoder cxld; int nr_targets; struct cxl_dport *target[]; }; **Members** ``cxld`` base cxl_decoder object ``nr_targets`` number of elements in **target** ``target`` active ordered target list in current decoder configurationh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjU7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ7ubh:}(hjQ7hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjM7ubj)}(hostruct cxl_switch_decoder { struct cxl_decoder cxld; int nr_targets; struct cxl_dport *target[]; };h]hostruct cxl_switch_decoder { struct cxl_decoder cxld; int nr_targets; struct cxl_dport *target[]; };}hjn7sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjM7ubj])}(h **Members**h]j)}(hj7h]hMembers}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}7ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjM7ubjo)}(hhh](jt)}(h!``cxld`` base cxl_decoder object h](jz)}(h``cxld``h]j)}(hj7h]hcxld}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj7ubj)}(hhh]j])}(hbase cxl_decoder objecth]hbase cxl_decoder object}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj7hMhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jshj7hMhj7ubjt)}(h0``nr_targets`` number of elements in **target** h](jz)}(h``nr_targets``h]j)}(hj7h]h nr_targets}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj7ubj)}(hhh]j])}(h number of elements in **target**h](hnumber of elements in }(hj7hhhNhNubj)}(h **target**h]htarget}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1j\hj7hMhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jshj7hMhj7ubjt)}(hF``target`` active ordered target list in current decoder configurationh](jz)}(h ``target``h]j)}(hj8h]htarget}(hj 8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj8ubj)}(hhh]j])}(h;active ordered target list in current decoder configurationh]h;active ordered target list in current decoder configuration}(hj78hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj48ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jshj38hMhj7ubeh}(h]h ]h"]h$]h&]uh1jnhjM7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(h**Description**h]j)}(hja8h]h Description}(hjc8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_8ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhju.hhubj])}(hXTThe 'switch' decoder type represents the decoder instances of cxl_port's that route from the root of a CXL memory decode topology to the endpoints. They come in two flavors, root-level decoders, statically defined by platform firmware, and mid-level decoders, where interleave-granularity, interleave-width, and the target list are mutable.h]hXZThe ‘switch’ decoder type represents the decoder instances of cxl_port’s that route from the root of a CXL memory decode topology to the endpoints. They come in two flavors, root-level decoders, statically defined by platform firmware, and mid-level decoders, where interleave-granularity, interleave-width, and the target list are mutable.}(hjw8hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_root_decoder (C struct)c.cxl_root_decoderhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcxl_root_decoderh]j.)}(hstruct cxl_root_decoderh](j)}(hjh]hstruct}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMubjF)}(h h]h }(hj8hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj8hhhj8hMubjW)}(hcxl_root_decoderh]j])}(hj8h]hcxl_root_decoder}(hj8hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj8ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj8hhhj8hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj8hhhj8hMubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1j'hj8hMhj8hhubj)}(hhh]j])}(h#Static platform CXL address decoderh]h#Static platform CXL address decoder}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj8hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj8hMubeh}(h]h ](jstructeh"]h$]h&]jjjj8jj8jjjuh1j"hhhju.hNhNubj)}(hX**Definition**:: struct cxl_root_decoder { struct resource *res; resource_size_t cache_size; atomic_t region_id; cxl_hpa_to_spa_fn hpa_to_spa; void *platform_data; struct mutex range_lock; int qos_class; struct cxl_switch_decoder cxlsd; }; **Members** ``res`` host / parent resource for region allocations ``cache_size`` extended linear cache size if exists, otherwise zero. ``region_id`` region id for next region provisioning event ``hpa_to_spa`` translate CXL host-physical-address to Platform system-physical-address ``platform_data`` platform specific configuration data ``range_lock`` sync region autodiscovery by address range ``qos_class`` QoS performance class cookie ``cxlsd`` base cxl switch decoderh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh:}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj8ubj)}(hstruct cxl_root_decoder { struct resource *res; resource_size_t cache_size; atomic_t region_id; cxl_hpa_to_spa_fn hpa_to_spa; void *platform_data; struct mutex range_lock; int qos_class; struct cxl_switch_decoder cxlsd; };h]hstruct cxl_root_decoder { struct resource *res; resource_size_t cache_size; atomic_t region_id; cxl_hpa_to_spa_fn hpa_to_spa; void *platform_data; struct mutex range_lock; int qos_class; struct cxl_switch_decoder cxlsd; };}hj9sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj8ubj])}(h **Members**h]j)}(hj/9h]hMembers}(hj19hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-9ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj8ubjo)}(hhh](jt)}(h6``res`` host / parent resource for region allocations h](jz)}(h``res``h]j)}(hjN9h]hres}(hjP9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL9ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjH9ubj)}(hhh]j])}(h-host / parent resource for region allocationsh]h-host / parent resource for region allocations}(hjg9hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjc9hMhjd9ubah}(h]h ]h"]h$]h&]uh1jhjH9ubeh}(h]h ]h"]h$]h&]uh1jshjc9hMhjE9ubjt)}(hE``cache_size`` extended linear cache size if exists, otherwise zero. h](jz)}(h``cache_size``h]j)}(hj9h]h cache_size}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj9ubj)}(hhh]j])}(h5extended linear cache size if exists, otherwise zero.h]h5extended linear cache size if exists, otherwise zero.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj9hMhj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jshj9hMhjE9ubjt)}(h;``region_id`` region id for next region provisioning event h](jz)}(h ``region_id``h]j)}(hj9h]h region_id}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj9ubj)}(hhh]j])}(h,region id for next region provisioning eventh]h,region id for next region provisioning event}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj9hMhj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jshj9hMhjE9ubjt)}(hW``hpa_to_spa`` translate CXL host-physical-address to Platform system-physical-address h](jz)}(h``hpa_to_spa``h]j)}(hj9h]h hpa_to_spa}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj9ubj)}(hhh]j])}(hGtranslate CXL host-physical-address to Platform system-physical-addressh]hGtranslate CXL host-physical-address to Platform system-physical-address}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jshj:hMhjE9ubjt)}(h7``platform_data`` platform specific configuration data h](jz)}(h``platform_data``h]j)}(hj2:h]h platform_data}(hj4:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0:ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj,:ubj)}(hhh]j])}(h$platform specific configuration datah]h$platform specific configuration data}(hjK:hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjG:hMhjH:ubah}(h]h ]h"]h$]h&]uh1jhj,:ubeh}(h]h ]h"]h$]h&]uh1jshjG:hMhjE9ubjt)}(h:``range_lock`` sync region autodiscovery by address range h](jz)}(h``range_lock``h]j)}(hjk:h]h range_lock}(hjm:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji:ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhje:ubj)}(hhh]j])}(h*sync region autodiscovery by address rangeh]h*sync region autodiscovery by address range}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhje:ubeh}(h]h ]h"]h$]h&]uh1jshj:hMhjE9ubjt)}(h+``qos_class`` QoS performance class cookie h](jz)}(h ``qos_class``h]j)}(hj:h]h qos_class}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj:ubj)}(hhh]j])}(hQoS performance class cookieh]hQoS performance class cookie}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jshj:hMhjE9ubjt)}(h!``cxlsd`` base cxl switch decoderh](jz)}(h ``cxlsd``h]j)}(hj:h]hcxlsd}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj:ubj)}(hhh]j])}(hbase cxl switch decoderh]hbase cxl switch decoder}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jshj:hMhjE9ubeh}(h]h ]h"]h$]h&]uh1jnhj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_region_params (C struct)c.cxl_region_paramshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcxl_region_paramsh]j.)}(hstruct cxl_region_paramsh](j)}(hjh]hstruct}(hj7;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3;hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMubjF)}(h h]h }(hjE;hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj3;hhhjD;hMubjW)}(hcxl_region_paramsh]j])}(hj1;h]hcxl_region_params}(hjW;hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjS;ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj3;hhhjD;hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj/;hhhjD;hMubah}(h]j*;ah ](jjeh"]h$]h&]jj)jhuh1j'hjD;hMhj,;hhubj)}(hhh]j])}(hregion settingsh]hregion settings}(hjy;hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjv;hhubah}(h]h ]h"]h$]h&]uh1jhj,;hhhjD;hMubeh}(h]h ](jstructeh"]h$]h&]jjjj;jj;jjjuh1j"hhhju.hNhNubj)}(hX-**Definition**:: struct cxl_region_params { enum cxl_config_state state; uuid_t uuid; int interleave_ways; int interleave_granularity; struct resource *res; struct cxl_endpoint_decoder *targets[CXL_DECODER_MAX_INTERLEAVE]; int nr_targets; resource_size_t cache_size; }; **Members** ``state`` allow the driver to lockdown further parameter changes ``uuid`` unique id for persistent regions ``interleave_ways`` number of endpoints in the region ``interleave_granularity`` capacity each endpoint contributes to a stripe ``res`` allocated iomem capacity for this region ``targets`` active ordered targets in current decoder configuration ``nr_targets`` number of targets ``cache_size`` extended linear cache size if exists, otherwise zero.h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh:}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj;ubj)}(hXstruct cxl_region_params { enum cxl_config_state state; uuid_t uuid; int interleave_ways; int interleave_granularity; struct resource *res; struct cxl_endpoint_decoder *targets[CXL_DECODER_MAX_INTERLEAVE]; int nr_targets; resource_size_t cache_size; };h]hXstruct cxl_region_params { enum cxl_config_state state; uuid_t uuid; int interleave_ways; int interleave_granularity; struct resource *res; struct cxl_endpoint_decoder *targets[CXL_DECODER_MAX_INTERLEAVE]; int nr_targets; resource_size_t cache_size; };}hj;sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj;ubj])}(h **Members**h]j)}(hj;h]hMembers}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj;ubjo)}(hhh](jt)}(hA``state`` allow the driver to lockdown further parameter changes h](jz)}(h ``state``h]j)}(hj;h]hstate}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj;ubj)}(hhh]j])}(h6allow the driver to lockdown further parameter changesh]h6allow the driver to lockdown further parameter changes}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jshj;hMhj;ubjt)}(h*``uuid`` unique id for persistent regions h](jz)}(h``uuid``h]j)}(hj<h]huuid}(hj!<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj<ubj)}(hhh]j])}(h unique id for persistent regionsh]h unique id for persistent regions}(hj8<hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj4<hMhj5<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jshj4<hMhj;ubjt)}(h6``interleave_ways`` number of endpoints in the region h](jz)}(h``interleave_ways``h]j)}(hjX<h]hinterleave_ways}(hjZ<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV<ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjR<ubj)}(hhh]j])}(h!number of endpoints in the regionh]h!number of endpoints in the region}(hjq<hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjm<hMhjn<ubah}(h]h ]h"]h$]h&]uh1jhjR<ubeh}(h]h ]h"]h$]h&]uh1jshjm<hMhj;ubjt)}(hJ``interleave_granularity`` capacity each endpoint contributes to a stripe h](jz)}(h``interleave_granularity``h]j)}(hj<h]hinterleave_granularity}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj<ubj)}(hhh]j])}(h.capacity each endpoint contributes to a stripeh]h.capacity each endpoint contributes to a stripe}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jshj<hMhj;ubjt)}(h1``res`` allocated iomem capacity for this region h](jz)}(h``res``h]j)}(hj<h]hres}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj<ubj)}(hhh]j])}(h(allocated iomem capacity for this regionh]h(allocated iomem capacity for this region}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jshj<hMhj;ubjt)}(hD``targets`` active ordered targets in current decoder configuration h](jz)}(h ``targets``h]j)}(hj=h]htargets}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj<ubj)}(hhh]j])}(h7active ordered targets in current decoder configurationh]h7active ordered targets in current decoder configuration}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj=hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jshj=hMhj;ubjt)}(h!``nr_targets`` number of targets h](jz)}(h``nr_targets``h]j)}(hj<=h]h nr_targets}(hj>=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:=ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj6=ubj)}(hhh]j])}(hnumber of targetsh]hnumber of targets}(hjU=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjQ=hMhjR=ubah}(h]h ]h"]h$]h&]uh1jhj6=ubeh}(h]h ]h"]h$]h&]uh1jshjQ=hMhj;ubjt)}(hD``cache_size`` extended linear cache size if exists, otherwise zero.h](jz)}(h``cache_size``h]j)}(hju=h]h cache_size}(hjw=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs=ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjo=ubj)}(hhh]j])}(h5extended linear cache size if exists, otherwise zero.h]h5extended linear cache size if exists, otherwise zero.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj=ubah}(h]h ]h"]h$]h&]uh1jhjo=ubeh}(h]h ]h"]h$]h&]uh1jshj=hMhj;ubeh}(h]h ]h"]h$]h&]uh1jnhj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(h**Description**h]j)}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhju.hhubj])}(h3State transitions are protected by cxl_rwsem.regionh]h3State transitions are protected by cxl_rwsem.region}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_region (C struct) c.cxl_regionhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h cxl_regionh]j.)}(hstruct cxl_regionh](j)}(hjh]hstruct}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMubjF)}(h h]h }(hj>hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj=hhhj>hMubjW)}(h cxl_regionh]j])}(hj=h]h cxl_region}(hj>hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj>ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj=hhhj>hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj=hhhj>hMubah}(h]j=ah ](jjeh"]h$]h&]jj)jhuh1j'hj>hMhj=hhubj)}(hhh]j])}(h CXL regionh]h CXL region}(hj8>hhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj5>hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj>hMubeh}(h]h ](jstructeh"]h$]h&]jjjjP>jjP>jjjuh1j"hhhju.hNhNubj)}(hX?**Definition**:: struct cxl_region { struct device dev; int id; enum cxl_partition_mode mode; enum cxl_decoder_type type; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_pmem_region *cxlr_pmem; unsigned long flags; struct cxl_region_params params; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct notifier_block node_notifier; struct notifier_block adist_notifier; }; **Members** ``dev`` This region's device ``id`` This region's id. Id is globally unique across all regions ``mode`` Operational mode of the mapped capacity ``type`` Endpoint decoder target type ``cxl_nvb`` nvdimm bridge for coordinating **cxlr_pmem** setup / shutdown ``cxlr_pmem`` (for pmem regions) cached copy of the nvdimm bridge ``flags`` Region state flags ``params`` active + config params for the region ``coord`` QoS access coordinates for the region ``node_notifier`` notifier for setting the access coordinates to node ``adist_notifier`` notifier for calculating the abstract distance of nodeh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj\>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX>ubh:}(hjX>hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjT>ubj)}(hXstruct cxl_region { struct device dev; int id; enum cxl_partition_mode mode; enum cxl_decoder_type type; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_pmem_region *cxlr_pmem; unsigned long flags; struct cxl_region_params params; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct notifier_block node_notifier; struct notifier_block adist_notifier; };h]hXstruct cxl_region { struct device dev; int id; enum cxl_partition_mode mode; enum cxl_decoder_type type; struct cxl_nvdimm_bridge *cxl_nvb; struct cxl_pmem_region *cxlr_pmem; unsigned long flags; struct cxl_region_params params; struct access_coordinate coord[ACCESS_COORDINATE_MAX]; struct notifier_block node_notifier; struct notifier_block adist_notifier; };}hju>sbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjT>ubj])}(h **Members**h]j)}(hj>h]hMembers}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjT>ubjo)}(hhh](jt)}(h``dev`` This region's device h](jz)}(h``dev``h]j)}(hj>h]hdev}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj>ubj)}(hhh]j])}(hThis region's deviceh]hThis region’s device}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jshj>hMhj>ubjt)}(hB``id`` This region's id. Id is globally unique across all regions h](jz)}(h``id``h]j)}(hj>h]hid}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj>ubj)}(hhh]j])}(h:This region's id. Id is globally unique across all regionsh]hhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]uh1jshj>hMhj>ubjt)}(h1``mode`` Operational mode of the mapped capacity h](jz)}(h``mode``h]j)}(hj?h]hmode}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj?ubj)}(hhh]j])}(h'Operational mode of the mapped capacityh]h'Operational mode of the mapped capacity}(hj0?hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj,?hMhj-?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jshj,?hMhj>ubjt)}(h&``type`` Endpoint decoder target type h](jz)}(h``type``h]j)}(hjP?h]htype}(hjR?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN?ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjJ?ubj)}(hhh]j])}(hEndpoint decoder target typeh]hEndpoint decoder target type}(hji?hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hje?hMhjf?ubah}(h]h ]h"]h$]h&]uh1jhjJ?ubeh}(h]h ]h"]h$]h&]uh1jshje?hMhj>ubjt)}(hJ``cxl_nvb`` nvdimm bridge for coordinating **cxlr_pmem** setup / shutdown h](jz)}(h ``cxl_nvb``h]j)}(hj?h]hcxl_nvb}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj?ubj)}(hhh]j])}(h=nvdimm bridge for coordinating **cxlr_pmem** setup / shutdownh](hnvdimm bridge for coordinating }(hj?hhhNhNubj)}(h **cxlr_pmem**h]h cxlr_pmem}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh setup / shutdown}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jshj?hMhj>ubjt)}(hB``cxlr_pmem`` (for pmem regions) cached copy of the nvdimm bridge h](jz)}(h ``cxlr_pmem``h]j)}(hj?h]h cxlr_pmem}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj?ubj)}(hhh]j])}(h3(for pmem regions) cached copy of the nvdimm bridgeh]h3(for pmem regions) cached copy of the nvdimm bridge}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj?hMhj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jshj?hMhj>ubjt)}(h``flags`` Region state flags h](jz)}(h ``flags``h]j)}(hj @h]hflags}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj @ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj@ubj)}(hhh]j])}(hRegion state flagsh]hRegion state flags}(hj&@hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj"@hMhj#@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jshj"@hMhj>ubjt)}(h1``params`` active + config params for the region h](jz)}(h ``params``h]j)}(hjF@h]hparams}(hjH@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD@ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj@@ubj)}(hhh]j])}(h%active + config params for the regionh]h%active + config params for the region}(hj_@hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj[@hMhj\@ubah}(h]h ]h"]h$]h&]uh1jhj@@ubeh}(h]h ]h"]h$]h&]uh1jshj[@hMhj>ubjt)}(h0``coord`` QoS access coordinates for the region h](jz)}(h ``coord``h]j)}(hj@h]hcoord}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}@ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjy@ubj)}(hhh]j])}(h%QoS access coordinates for the regionh]h%QoS access coordinates for the region}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj@hMhj@ubah}(h]h ]h"]h$]h&]uh1jhjy@ubeh}(h]h ]h"]h$]h&]uh1jshj@hMhj>ubjt)}(hF``node_notifier`` notifier for setting the access coordinates to node h](jz)}(h``node_notifier``h]j)}(hj@h]h node_notifier}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj@ubj)}(hhh]j])}(h3notifier for setting the access coordinates to nodeh]h3notifier for setting the access coordinates to node}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj@hMhj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jshj@hMhj>ubjt)}(hI``adist_notifier`` notifier for calculating the abstract distance of nodeh](jz)}(h``adist_notifier``h]j)}(hj@h]hadist_notifier}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhj@ubj)}(hhh]j])}(h6notifier for calculating the abstract distance of nodeh]h6notifier for calculating the abstract distance of node}(hj AhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhM hjAubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jshjAhMhj>ubeh}(h]h ]h"]h$]h&]uh1jnhjT>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_port (C struct) c.cxl_porthNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcxl_porth]j.)}(hstruct cxl_porth](j)}(hjh]hstruct}(hjKAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGAhhhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMubjF)}(h h]h }(hjYAhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjGAhhhjXAhMubjW)}(hcxl_porth]j])}(hjEAh]hcxl_port}(hjkAhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjgAubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjGAhhhjXAhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjCAhhhjXAhMubah}(h]j>Aah ](jjeh"]h$]h&]jj)jhuh1j'hjXAhMhj@Ahhubj)}(hhh]j])}(hslogical collection of upstream port devices and downstream port devices to construct a CXL memory decode hierarchy.h]hslogical collection of upstream port devices and downstream port devices to construct a CXL memory decode hierarchy.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMAhjAhhubah}(h]h ]h"]h$]h&]uh1jhj@AhhhjXAhMubeh}(h]h ](jstructeh"]h$]h&]jjjjAjjAjjjuh1j"hhhju.hNhNubj)}(hX**Definition**:: struct cxl_port { struct device dev; struct device *uport_dev; struct device *host_bridge; int id; struct xarray dports; struct xarray endpoints; struct xarray regions; struct cxl_dport *parent_dport; struct ida decoder_ida; struct cxl_register_map reg_map; int nr_dports; int hdm_end; int commit_end; bool dead; unsigned int depth; struct cxl_cdat { void *table; size_t length; } cdat; bool cdat_available; long pci_latency; }; **Members** ``dev`` this port's device ``uport_dev`` PCI or platform device implementing the upstream port capability ``host_bridge`` Shortcut to the platform attach point for this port ``id`` id for port device-name ``dports`` cxl_dport instances referenced by decoders ``endpoints`` cxl_ep instances, endpoints that are a descendant of this port ``regions`` cxl_region_ref instances, regions mapped by this port ``parent_dport`` dport that points to this port in the parent ``decoder_ida`` allocator for decoder ids ``reg_map`` component and ras register mapping parameters ``nr_dports`` number of entries in **dports** ``hdm_end`` track last allocated HDM decoder instance for allocation ordering ``commit_end`` cursor to track highest committed decoder for commit ordering ``dead`` last ep has been removed, force port re-creation ``depth`` How deep this port is relative to the root. depth 0 is the root. ``cdat`` Cached CDAT data ``cdat_available`` Should a CDAT attribute be available in sysfs ``pci_latency`` Upstream latency in picosecondsh](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh:}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMEhjAubj)}(hXstruct cxl_port { struct device dev; struct device *uport_dev; struct device *host_bridge; int id; struct xarray dports; struct xarray endpoints; struct xarray regions; struct cxl_dport *parent_dport; struct ida decoder_ida; struct cxl_register_map reg_map; int nr_dports; int hdm_end; int commit_end; bool dead; unsigned int depth; struct cxl_cdat { void *table; size_t length; } cdat; bool cdat_available; long pci_latency; };h]hXstruct cxl_port { struct device dev; struct device *uport_dev; struct device *host_bridge; int id; struct xarray dports; struct xarray endpoints; struct xarray regions; struct cxl_dport *parent_dport; struct ida decoder_ida; struct cxl_register_map reg_map; int nr_dports; int hdm_end; int commit_end; bool dead; unsigned int depth; struct cxl_cdat { void *table; size_t length; } cdat; bool cdat_available; long pci_latency; };}hjAsbah}(h]h ]h"]h$]h&]hhuh1jhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMGhjAubj])}(h **Members**h]j)}(hjAh]hMembers}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1j\he/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhM_hjAubjo)}(hhh](jt)}(h``dev`` this port's device h](jz)}(h``dev``h]j)}(hjAh]hdev}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMEhjAubj)}(hhh]j])}(hthis port's deviceh]hthis port’s device}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjBhMEhjBubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jshjBhMEhjAubjt)}(hO``uport_dev`` PCI or platform device implementing the upstream port capability h](jz)}(h ``uport_dev``h]j)}(hj3Bh]h uport_dev}(hj5BhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Bubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMFhj-Bubj)}(hhh]j])}(h@PCI or platform device implementing the upstream port capabilityh]h@PCI or platform device implementing the upstream port capability}(hjLBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjHBhMFhjIBubah}(h]h ]h"]h$]h&]uh1jhj-Bubeh}(h]h ]h"]h$]h&]uh1jshjHBhMFhjAubjt)}(hD``host_bridge`` Shortcut to the platform attach point for this port h](jz)}(h``host_bridge``h]j)}(hjlBh]h host_bridge}(hjnBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjBubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMGhjfBubj)}(hhh]j])}(h3Shortcut to the platform attach point for this porth]h3Shortcut to the platform attach point for this port}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjBhMGhjBubah}(h]h ]h"]h$]h&]uh1jhjfBubeh}(h]h ]h"]h$]h&]uh1jshjBhMGhjAubjt)}(h``id`` id for port device-name h](jz)}(h``id``h]j)}(hjBh]hid}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMHhjBubj)}(hhh]j])}(hid for port device-nameh]hid for port device-name}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjBhMHhjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jshjBhMHhjAubjt)}(h6``dports`` cxl_dport instances referenced by decoders h](jz)}(h ``dports``h]j)}(hjBh]hdports}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMIhjBubj)}(hhh]j])}(h*cxl_dport instances referenced by decodersh]h*cxl_dport instances referenced by decoders}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjBhMIhjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jshjBhMIhjAubjt)}(hM``endpoints`` cxl_ep instances, endpoints that are a descendant of this port h](jz)}(h ``endpoints``h]j)}(hjCh]h endpoints}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMJhjCubj)}(hhh]j])}(h>cxl_ep instances, endpoints that are a descendant of this porth]h>cxl_ep instances, endpoints that are a descendant of this port}(hj0ChhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj,ChMJhj-Cubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jshj,ChMJhjAubjt)}(hB``regions`` cxl_region_ref instances, regions mapped by this port h](jz)}(h ``regions``h]j)}(hjPCh]hregions}(hjRChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNCubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMKhjJCubj)}(hhh]j])}(h5cxl_region_ref instances, regions mapped by this porth]h5cxl_region_ref instances, regions mapped by this port}(hjiChhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjeChMKhjfCubah}(h]h ]h"]h$]h&]uh1jhjJCubeh}(h]h ]h"]h$]h&]uh1jshjeChMKhjAubjt)}(h>``parent_dport`` dport that points to this port in the parent h](jz)}(h``parent_dport``h]j)}(hjCh]h parent_dport}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMLhjCubj)}(hhh]j])}(h,dport that points to this port in the parenth]h,dport that points to this port in the parent}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjChMLhjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jshjChMLhjAubjt)}(h*``decoder_ida`` allocator for decoder ids h](jz)}(h``decoder_ida``h]j)}(hjCh]h decoder_ida}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMMhjCubj)}(hhh]j])}(hallocator for decoder idsh]hallocator for decoder ids}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjChMMhjCubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jshjChMMhjAubjt)}(h:``reg_map`` component and ras register mapping parameters h](jz)}(h ``reg_map``h]j)}(hjCh]hreg_map}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMNhjCubj)}(hhh]j])}(h-component and ras register mapping parametersh]h-component and ras register mapping parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjDhMNhjDubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jshjDhMNhjAubjt)}(h.``nr_dports`` number of entries in **dports** h](jz)}(h ``nr_dports``h]j)}(hj4Dh]h nr_dports}(hj6DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2Dubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMOhj.Dubj)}(hhh]j])}(hnumber of entries in **dports**h](hnumber of entries in }(hjMDhhhNhNubj)}(h **dports**h]hdports}(hjUDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMDubeh}(h]h ]h"]h$]h&]uh1j\hjIDhMOhjJDubah}(h]h ]h"]h$]h&]uh1jhj.Dubeh}(h]h ]h"]h$]h&]uh1jshjIDhMOhjAubjt)}(hN``hdm_end`` track last allocated HDM decoder instance for allocation ordering h](jz)}(h ``hdm_end``h]j)}(hj{Dh]hhdm_end}(hj}DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyDubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMPhjuDubj)}(hhh]j])}(hAtrack last allocated HDM decoder instance for allocation orderingh]hAtrack last allocated HDM decoder instance for allocation ordering}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjDhMPhjDubah}(h]h ]h"]h$]h&]uh1jhjuDubeh}(h]h ]h"]h$]h&]uh1jshjDhMPhjAubjt)}(hM``commit_end`` cursor to track highest committed decoder for commit ordering h](jz)}(h``commit_end``h]j)}(hjDh]h commit_end}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMQhjDubj)}(hhh]j])}(h=cursor to track highest committed decoder for commit orderingh]h=cursor to track highest committed decoder for commit ordering}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjDhMQhjDubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jshjDhMQhjAubjt)}(h:``dead`` last ep has been removed, force port re-creation h](jz)}(h``dead``h]j)}(hjDh]hdead}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMRhjDubj)}(hhh]j])}(h0last ep has been removed, force port re-creationh]h0last ep has been removed, force port re-creation}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjEhMRhjEubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jshjEhMRhjAubjt)}(hK``depth`` How deep this port is relative to the root. depth 0 is the root. h](jz)}(h ``depth``h]j)}(hj&Eh]hdepth}(hj(EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Eubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMShj Eubj)}(hhh]j])}(h@How deep this port is relative to the root. depth 0 is the root.h]h@How deep this port is relative to the root. depth 0 is the root.}(hj?E8hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj;EhMShjPCI bridge or firmware device representing the downstream linkh]h>PCI bridge or firmware device representing the downstream link}(hj5HhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj1HhMhj2Hubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jshj1HhMhjHubjt)}(h:``reg_map`` component and ras register mapping parameters h](jz)}(h ``reg_map``h]j)}(hjUHh]hreg_map}(hjWHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSHubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjOHubj)}(hhh]j])}(h-component and ras register mapping parametersh]h-component and ras register mapping parameters}(hjnHhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjjHhMhjkHubah}(h]h ]h"]h$]h&]uh1jhjOHubeh}(h]h ]h"]h$]h&]uh1jshjjHhMhjHubjt)}(hH``port_id`` unique hardware identifier for dport in decoder target list h](jz)}(h ``port_id``h]j)}(hjHh]hport_id}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjHubj)}(hhh]j])}(h;unique hardware identifier for dport in decoder target listh]h;unique hardware identifier for dport in decoder target list}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjHhMhjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jshjHhMhjHubjt)}(h;``rcrb`` Data about the Root Complex Register Block layout h](jz)}(h``rcrb``h]j)}(hjHh]hrcrb}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjHubj)}(hhh]j])}(h1Data about the Root Complex Register Block layouth]h1Data about the Root Complex Register Block layout}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjHhMhjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jshjHhMhjHubjt)}(hE``rch`` Indicate whether this dport was enumerated in RCH or VH mode h](jz)}(h``rch``h]j)}(hjIh]hrch}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jyhe/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:433: ./drivers/cxl/cxl.hhMhjHubj)}(hhh]j])}(hdpa_res** resource treeh](hTrack DPA ‘skip’ in }(hjdVhhhNhNubj)}(h**cxlds->dpa_res**h]hcxlds->dpa_res}(hjlVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdVubh resource tree}(hjdVhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM1hjaVhhubah}(h]h ]h"]h$]h&]uh1jhjbThhhj{ThM1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjVjjVjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_dev_state *cxlds`` CXL.mem device context that parents **cxled** ``struct cxl_endpoint_decoder *cxled`` Endpoint decoder establishing new allocation that skips lower DPA ``const resource_size_t skip_base`` DPA < start of new DPA allocation (DPAnew) ``const resource_size_t skip_len`` **skip_base** + **skip_len** == DPAnew **Description** DPA 'skip' arises from out-of-sequence DPA allocation events relative to free capacity across multiple partitions. It is a wasteful event as usable DPA gets thrown away, but if a deployment has, for example, a dual RAM+PMEM device, wants to use PMEM, and has unallocated RAM DPA, the free RAM DPA must be sacrificed to start allocating PMEM. See third "Implementation Note" in CXL 3.1 8.2.4.19.13 "Decoder Protection" for more details. A 'skip' always covers the last allocated DPA in a previous partition to the start of the current partition to allocate. Allocations never start in the middle of a partition, and allocations are always de-allocated in reverse order (see cxl_dpa_free(), or natural devm unwind order from forced in-order allocation). If **cxlds->nr_partitions** was guaranteed to be <= 2 then the 'skip' would always be contained to a single partition. Given **cxlds->nr_partitions** may be > 2 it results in cases where the 'skip' might span "tail capacity of partition[0], all of partition[1], ..., all of partition[N-1]" to support allocating from partition[N]. That in turn interacts with the partition 'struct resource' boundaries within **cxlds->dpa_res** whereby 'skip' requests need to be divided by partition. I.e. this is a quirk of using a 'struct resource' tree to detect range conflicts while also tracking partition boundaries in **cxlds->dpa_res**.h](j])}(h**Parameters**h]j)}(hjVh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM5hjVubjo)}(hhh](jt)}(hN``struct cxl_dev_state *cxlds`` CXL.mem device context that parents **cxled** h](jz)}(h``struct cxl_dev_state *cxlds``h]j)}(hjVh]hstruct cxl_dev_state *cxlds}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM2hjVubj)}(hhh]j])}(h-CXL.mem device context that parents **cxled**h](h$CXL.mem device context that parents }(hjVhhhNhNubj)}(h **cxled**h]hcxled}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1j\hjVhM2hjVubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jshjVhM2hjVubjt)}(hi``struct cxl_endpoint_decoder *cxled`` Endpoint decoder establishing new allocation that skips lower DPA h](jz)}(h&``struct cxl_endpoint_decoder *cxled``h]j)}(hjVh]h"struct cxl_endpoint_decoder *cxled}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM3hjVubj)}(hhh]j])}(hAEndpoint decoder establishing new allocation that skips lower DPAh]hAEndpoint decoder establishing new allocation that skips lower DPA}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjWhM3hjWubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jshjWhM3hjVubjt)}(hO``const resource_size_t skip_base`` DPA < start of new DPA allocation (DPAnew) h](jz)}(h#``const resource_size_t skip_base``h]j)}(hj7Wh]hconst resource_size_t skip_base}(hj9WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5Wubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM4hj1Wubj)}(hhh]j])}(h*DPA < start of new DPA allocation (DPAnew)h]h*DPA < start of new DPA allocation (DPAnew)}(hjPWhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjLWhM4hjMWubah}(h]h ]h"]h$]h&]uh1jhj1Wubeh}(h]h ]h"]h$]h&]uh1jshjLWhM4hjVubjt)}(hJ``const resource_size_t skip_len`` **skip_base** + **skip_len** == DPAnew h](jz)}(h"``const resource_size_t skip_len``h]j)}(hjpWh]hconst resource_size_t skip_len}(hjrWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnWubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM5hjjWubj)}(hhh]j])}(h&**skip_base** + **skip_len** == DPAnewh](j)}(h **skip_base**h]h skip_base}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh + }(hjWhhhNhNubj)}(h **skip_len**h]hskip_len}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh == DPAnew}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjWhM5hjWubah}(h]h ]h"]h$]h&]uh1jhjjWubeh}(h]h ]h"]h$]h&]uh1jshjWhM5hjVubeh}(h]h ]h"]h$]h&]uh1jnhjVubj])}(h**Description**h]j)}(hjWh]h Description}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM7hjVubj])}(hXDPA 'skip' arises from out-of-sequence DPA allocation events relative to free capacity across multiple partitions. It is a wasteful event as usable DPA gets thrown away, but if a deployment has, for example, a dual RAM+PMEM device, wants to use PMEM, and has unallocated RAM DPA, the free RAM DPA must be sacrificed to start allocating PMEM. See third "Implementation Note" in CXL 3.1 8.2.4.19.13 "Decoder Protection" for more details.h]hXDPA ‘skip’ arises from out-of-sequence DPA allocation events relative to free capacity across multiple partitions. It is a wasteful event as usable DPA gets thrown away, but if a deployment has, for example, a dual RAM+PMEM device, wants to use PMEM, and has unallocated RAM DPA, the free RAM DPA must be sacrificed to start allocating PMEM. See third “Implementation Note” in CXL 3.1 8.2.4.19.13 “Decoder Protection” for more details.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM6hjVubj])}(hX<A 'skip' always covers the last allocated DPA in a previous partition to the start of the current partition to allocate. Allocations never start in the middle of a partition, and allocations are always de-allocated in reverse order (see cxl_dpa_free(), or natural devm unwind order from forced in-order allocation).h]hX@A ‘skip’ always covers the last allocated DPA in a previous partition to the start of the current partition to allocate. Allocations never start in the middle of a partition, and allocations are always de-allocated in reverse order (see cxl_dpa_free(), or natural devm unwind order from forced in-order allocation).}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chM>hjVubj])}(hXuIf **cxlds->nr_partitions** was guaranteed to be <= 2 then the 'skip' would always be contained to a single partition. Given **cxlds->nr_partitions** may be > 2 it results in cases where the 'skip' might span "tail capacity of partition[0], all of partition[1], ..., all of partition[N-1]" to support allocating from partition[N]. That in turn interacts with the partition 'struct resource' boundaries within **cxlds->dpa_res** whereby 'skip' requests need to be divided by partition. I.e. this is a quirk of using a 'struct resource' tree to detect range conflicts while also tracking partition boundaries in **cxlds->dpa_res**.h](hIf }(hjWhhhNhNubj)}(h**cxlds->nr_partitions**h]hcxlds->nr_partitions}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubhf was guaranteed to be <= 2 then the ‘skip’ would always be contained to a single partition. Given }(hjWhhhNhNubj)}(h**cxlds->nr_partitions**h]hcxlds->nr_partitions}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubhX may be > 2 it results in cases where the ‘skip’ might span “tail capacity of partition[0], all of partition[1], ..., all of partition[N-1]” to support allocating from partition[N]. That in turn interacts with the partition ‘struct resource’ boundaries within }(hjWhhhNhNubj)}(h**cxlds->dpa_res**h]hcxlds->dpa_res}(hj+XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh whereby ‘skip’ requests need to be divided by partition. I.e. this is a quirk of using a ‘struct resource’ tree to detect range conflicts while also tracking partition boundaries in }(hjWhhhNhNubj)}(h**cxlds->dpa_res**h]hcxlds->dpa_res}(hj=XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMDhjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(devm_cxl_enumerate_decoders (C function)c.devm_cxl_enumerate_decodershNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h^int devm_cxl_enumerate_decoders (struct cxl_hdm *cxlhdm, struct cxl_endpoint_dvsec_info *info)h]j.)}(h]int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm, struct cxl_endpoint_dvsec_info *info)h](j4)}(hinth]hint}(hjvXhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjrXhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMubjF)}(h h]h }(hjXhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjrXhhhjXhMubjW)}(hdevm_cxl_enumerate_decodersh]j])}(hdevm_cxl_enumerate_decodersh]hdevm_cxl_enumerate_decoders}(hjXhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjXubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjrXhhhjXhMubjv)}(h>(struct cxl_hdm *cxlhdm, struct cxl_endpoint_dvsec_info *info)h](j|)}(hstruct cxl_hdm *cxlhdmh](j)}(hjh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubjF)}(h h]h }(hjXhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjXubh)}(hhh]j])}(hcxl_hdmh]hcxl_hdm}(hjXhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjXubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjXmodnameN classnameNjj)}j]j)}jjXsbc.devm_cxl_enumerate_decodersasbuh1hhjXubjF)}(h h]h }(hjXhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjXubj)}(hjh]h*}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj])}(hcxlhdmh]hcxlhdm}(hj YhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjXubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjXubj|)}(h$struct cxl_endpoint_dvsec_info *infoh](j)}(hjh]hstruct}(hj%YhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!YubjF)}(h h]h }(hj2YhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!Yubh)}(hhh]j])}(hcxl_endpoint_dvsec_infoh]hcxl_endpoint_dvsec_info}(hjCYhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj@Yubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEYmodnameN classnameNjj)}j]jXc.devm_cxl_enumerate_decodersasbuh1hhj!YubjF)}(h h]h }(hjaYhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!Yubj)}(hjh]h*}(hjoYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!Yubj])}(hinfoh]hinfo}(hj|YhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj!Yubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjXubeh}(h]h ]h"]h$]h&]hhuh1juhjrXhhhjXhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjnXhhhjXhMubah}(h]jiXah ](jjeh"]h$]h&]jj)jhuh1j'hjXhMhjkXhhubj)}(hhh]j])}(h(add decoder objects per HDM register seth]h(add decoder objects per HDM register set}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMhjYhhubah}(h]h ]h"]h$]h&]uh1jhjkXhhhjXhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjYjjYjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_hdm *cxlhdm`` Structure to populate with HDM capabilities ``struct cxl_endpoint_dvsec_info *info`` cached DVSEC range register infoh](j])}(h**Parameters**h]j)}(hjYh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMhjYubjo)}(hhh](jt)}(hG``struct cxl_hdm *cxlhdm`` Structure to populate with HDM capabilities h](jz)}(h``struct cxl_hdm *cxlhdm``h]j)}(hjYh]hstruct cxl_hdm *cxlhdm}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMhjYubj)}(hhh]j])}(h+Structure to populate with HDM capabilitiesh]h+Structure to populate with HDM capabilities}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjYhMhjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jshjYhMhjYubjt)}(hI``struct cxl_endpoint_dvsec_info *info`` cached DVSEC range register infoh](jz)}(h(``struct cxl_endpoint_dvsec_info *info``h]j)}(hj Zh]h$struct cxl_endpoint_dvsec_info *info}(hj"ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMhjZubj)}(hhh]j])}(h cached DVSEC range register infoh]h cached DVSEC range register info}(hj9ZhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:442: ./drivers/cxl/core/hdm.chMhj6Zubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jshj5ZhMhjYubeh}(h]h ]h"]h$]h&]uh1jnhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$cxl_coordinates_combine (C function)c.cxl_coordinates_combinehNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hxvoid cxl_coordinates_combine (struct access_coordinate *out, struct access_coordinate *c1, struct access_coordinate *c2)h]j.)}(hwvoid cxl_coordinates_combine(struct access_coordinate *out, struct access_coordinate *c1, struct access_coordinate *c2)h](j4)}(hvoidh]hvoid}(hjzZhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjvZhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM"ubjF)}(h h]h }(hjZhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjvZhhhjZhM"ubjW)}(hcxl_coordinates_combineh]j])}(hcxl_coordinates_combineh]hcxl_coordinates_combine}(hjZhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjZubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjvZhhhjZhM"ubjv)}(h[(struct access_coordinate *out, struct access_coordinate *c1, struct access_coordinate *c2)h](j|)}(hstruct access_coordinate *outh](j)}(hjh]hstruct}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubjF)}(h h]h }(hjZhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjZubh)}(hhh]j])}(haccess_coordinateh]haccess_coordinate}(hjZhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjZubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjZmodnameN classnameNjj)}j]j)}jjZsbc.cxl_coordinates_combineasbuh1hhjZubjF)}(h h]h }(hjZhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjZubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj])}(houth]hout}(hj[hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjZubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjZubj|)}(hstruct access_coordinate *c1h](j)}(hjh]hstruct}(hj)[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%[ubjF)}(h h]h }(hj6[hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj%[ubh)}(hhh]j])}(haccess_coordinateh]haccess_coordinate}(hjG[hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjD[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjI[modnameN classnameNjj)}j]jZc.cxl_coordinates_combineasbuh1hhj%[ubjF)}(h h]h }(hje[hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj%[ubj)}(hjh]h*}(hjs[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%[ubj])}(hc1h]hc1}(hj[hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj%[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjZubj|)}(hstruct access_coordinate *c2h](j)}(hjh]hstruct}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubjF)}(h h]h }(hj[hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj[ubh)}(hhh]j])}(haccess_coordinateh]haccess_coordinate}(hj[hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[modnameN classnameNjj)}j]jZc.cxl_coordinates_combineasbuh1hhj[ubjF)}(h h]h }(hj[hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj[ubj)}(hjh]h*}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj])}(hc2h]hc2}(hj[hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjZubeh}(h]h ]h"]h$]h&]hhuh1juhjvZhhhjZhM"ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjrZhhhjZhM"ubah}(h]jmZah ](jjeh"]h$]h&]jj)jhuh1j'hjZhM"hjoZhhubj)}(hhh]j])}(h!Combine the two input coordinatesh]h!Combine the two input coordinates}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM"hj\hhubah}(h]h ]h"]h$]h&]uh1jhjoZhhhjZhM"ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj2\jj2\jjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct access_coordinate *out`` Output coordinate of c1 and c2 combined ``struct access_coordinate *c1`` input coordinates ``struct access_coordinate *c2`` input coordinatesh](j])}(h**Parameters**h]j)}(hj<\h]h Parameters}(hj>\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:\ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM&hj6\ubjo)}(hhh](jt)}(hJ``struct access_coordinate *out`` Output coordinate of c1 and c2 combined h](jz)}(h!``struct access_coordinate *out``h]j)}(hj[\h]hstruct access_coordinate *out}(hj]\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY\ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM$hjU\ubj)}(hhh]j])}(h'Output coordinate of c1 and c2 combinedh]h'Output coordinate of c1 and c2 combined}(hjt\hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjp\hM$hjq\ubah}(h]h ]h"]h$]h&]uh1jhjU\ubeh}(h]h ]h"]h$]h&]uh1jshjp\hM$hjR\ubjt)}(h3``struct access_coordinate *c1`` input coordinates h](jz)}(h ``struct access_coordinate *c1``h]j)}(hj\h]hstruct access_coordinate *c1}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM%hj\ubj)}(hhh]j])}(hinput coordinatesh]hinput coordinates}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj\hM%hj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jshj\hM%hjR\ubjt)}(h2``struct access_coordinate *c2`` input coordinatesh](jz)}(h ``struct access_coordinate *c2``h]j)}(hj\h]hstruct access_coordinate *c2}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM'hj\ubj)}(hhh]j])}(hinput coordinatesh]hinput coordinates}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM&hj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jshj\hM'hjR\ubeh}(h]h ]h"]h$]h&]uh1jnhj6\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*cxl_endpoint_gather_bandwidth (C function)c.cxl_endpoint_gather_bandwidthhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hint cxl_endpoint_gather_bandwidth (struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, struct xarray *usp_xa, bool *gp_is_root)h]j.)}(hint cxl_endpoint_gather_bandwidth(struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, struct xarray *usp_xa, bool *gp_is_root)h](j4)}(hinth]hint}(hj']hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj#]hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMfubjF)}(h h]h }(hj6]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj#]hhhj5]hMfubjW)}(hcxl_endpoint_gather_bandwidthh]j])}(hcxl_endpoint_gather_bandwidthh]hcxl_endpoint_gather_bandwidth}(hjH]hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjD]ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj#]hhhj5]hMfubjv)}(hf(struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, struct xarray *usp_xa, bool *gp_is_root)h](j|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hjd]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`]ubjF)}(h h]h }(hjq]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj`]ubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hj]hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj]modnameN classnameNjj)}j]j)}jjJ]sbc.cxl_endpoint_gather_bandwidthasbuh1hhj`]ubjF)}(h h]h }(hj]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj`]ubj)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`]ubj])}(hcxlrh]hcxlr}(hj]hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj`]ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj\]ubj|)}(h"struct cxl_endpoint_decoder *cxledh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubjF)}(h h]h }(hj]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj]ubh)}(hhh]j])}(hcxl_endpoint_decoderh]hcxl_endpoint_decoder}(hj]hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj]ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj]modnameN classnameNjj)}j]j]c.cxl_endpoint_gather_bandwidthasbuh1hhj]ubjF)}(h h]h }(hj^hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj]ubj)}(hjh]h*}(hj ^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ubj])}(hcxledh]hcxled}(hj-^hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj\]ubj|)}(hstruct xarray *usp_xah](j)}(hjh]hstruct}(hjF^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB^ubjF)}(h h]h }(hjS^hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjB^ubh)}(hhh]j])}(hxarrayh]hxarray}(hjd^hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hja^ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjf^modnameN classnameNjj)}j]j]c.cxl_endpoint_gather_bandwidthasbuh1hhjB^ubjF)}(h h]h }(hj^hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjB^ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB^ubj])}(husp_xah]husp_xa}(hj^hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjB^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj\]ubj|)}(hbool *gp_is_rooth](j4)}(hboolh]hbool}(hj^hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj^ubjF)}(h h]h }(hj^hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj^ubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj])}(h gp_is_rooth]h gp_is_root}(hj^hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj\]ubeh}(h]h ]h"]h$]h&]hhuh1juhj#]hhhj5]hMfubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj]hhhj5]hMfubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1j'hj5]hMfhj]hhubj)}(hhh]j])}(h/collect all the endpoint bandwidth in an xarrayh]h/collect all the endpoint bandwidth in an xarray}(hj _hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMfhj_hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj5]hMfubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!_jj!_jjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_region *cxlr`` CXL region for the bandwidth calculation ``struct cxl_endpoint_decoder *cxled`` endpoint decoder to start on ``struct xarray *usp_xa`` (output) the xarray that collects all the bandwidth coordinates indexed by the upstream device with data of 'struct cxl_perf_ctx'. ``bool *gp_is_root`` (output) bool of whether the grandparent is cxl root. **Return** 0 for success or -errno **Description** Collects aggregated endpoint bandwidth and store the bandwidth in an xarray indexed by the upstream device of the switch or the RP device. Each endpoint consists the minimum of the bandwidth from DSLBIS from the endpoint CDAT, the endpoint upstream link bandwidth, and the bandwidth from the SSLBIS of the switch CDAT for the switch upstream port to the downstream port that's associated with the endpoint. If the device is directly connected to a RP, then no SSLBIS is involved.h](j])}(h**Parameters**h]j)}(hj+_h]h Parameters}(hj-_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)_ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMjhj%_ubjo)}(hhh](jt)}(hE``struct cxl_region *cxlr`` CXL region for the bandwidth calculation h](jz)}(h``struct cxl_region *cxlr``h]j)}(hjJ_h]hstruct cxl_region *cxlr}(hjL_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH_ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMghjD_ubj)}(hhh]j])}(h(CXL region for the bandwidth calculationh]h(CXL region for the bandwidth calculation}(hjc_hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj__hMghj`_ubah}(h]h ]h"]h$]h&]uh1jhjD_ubeh}(h]h ]h"]h$]h&]uh1jshj__hMghjA_ubjt)}(hD``struct cxl_endpoint_decoder *cxled`` endpoint decoder to start on h](jz)}(h&``struct cxl_endpoint_decoder *cxled``h]j)}(hj_h]h"struct cxl_endpoint_decoder *cxled}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhhj}_ubj)}(hhh]j])}(hendpoint decoder to start onh]hendpoint decoder to start on}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj_hMhhj_ubah}(h]h ]h"]h$]h&]uh1jhj}_ubeh}(h]h ]h"]h$]h&]uh1jshj_hMhhjA_ubjt)}(h``struct xarray *usp_xa`` (output) the xarray that collects all the bandwidth coordinates indexed by the upstream device with data of 'struct cxl_perf_ctx'. h](jz)}(h``struct xarray *usp_xa``h]j)}(hj_h]hstruct xarray *usp_xa}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMjhj_ubj)}(hhh]j])}(h(output) the xarray that collects all the bandwidth coordinates indexed by the upstream device with data of 'struct cxl_perf_ctx'.h]h(output) the xarray that collects all the bandwidth coordinates indexed by the upstream device with data of ‘struct cxl_perf_ctx’.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMihj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jshj_hMjhjA_ubjt)}(hK``bool *gp_is_root`` (output) bool of whether the grandparent is cxl root. h](jz)}(h``bool *gp_is_root``h]j)}(hj_h]hbool *gp_is_root}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMkhj_ubj)}(hhh]j])}(h5(output) bool of whether the grandparent is cxl root.h]h5(output) bool of whether the grandparent is cxl root.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj `hMkhj `ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jshj `hMkhjA_ubeh}(h]h ]h"]h$]h&]uh1jnhj%_ubj])}(h **Return**h]j)}(hj1`h]hReturn}(hj3`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/`ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMmhj%_ubj])}(h0 for success or -errnoh]h0 for success or -errno}(hjG`hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMmhj%_ubj])}(h**Description**h]j)}(hjX`h]h Description}(hjZ`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV`ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMohj%_ubj])}(hXCollects aggregated endpoint bandwidth and store the bandwidth in an xarray indexed by the upstream device of the switch or the RP device. Each endpoint consists the minimum of the bandwidth from DSLBIS from the endpoint CDAT, the endpoint upstream link bandwidth, and the bandwidth from the SSLBIS of the switch CDAT for the switch upstream port to the downstream port that's associated with the endpoint. If the device is directly connected to a RP, then no SSLBIS is involved.h]hXCollects aggregated endpoint bandwidth and store the bandwidth in an xarray indexed by the upstream device of the switch or the RP device. Each endpoint consists the minimum of the bandwidth from DSLBIS from the endpoint CDAT, the endpoint upstream link bandwidth, and the bandwidth from the SSLBIS of the switch CDAT for the switch upstream port to the downstream port that’s associated with the endpoint. If the device is directly connected to a RP, then no SSLBIS is involved.}(hjn`hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMnhj%_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(cxl_switch_gather_bandwidth (C function)c.cxl_switch_gather_bandwidthhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hpstruct xarray * cxl_switch_gather_bandwidth (struct cxl_region *cxlr, struct xarray *input_xa, bool *gp_is_root)h]j.)}(hnstruct xarray *cxl_switch_gather_bandwidth(struct cxl_region *cxlr, struct xarray *input_xa, bool *gp_is_root)h](j)}(hjh]hstruct}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMubjF)}(h h]h }(hj`hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj`hhhj`hMubh)}(hhh]j])}(hxarrayh]hxarray}(hj`hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`modnameN classnameNjj)}j]j)}jcxl_switch_gather_bandwidthsbc.cxl_switch_gather_bandwidthasbuh1hhj`hhhj`hMubjF)}(h h]h }(hj`hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj`hhhj`hMubj)}(hjh]h*}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhj`hMubjW)}(hcxl_switch_gather_bandwidthh]j])}(hj`h]hcxl_switch_gather_bandwidth}(hj`hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj`ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj`hhhj`hMubjv)}(hD(struct cxl_region *cxlr, struct xarray *input_xa, bool *gp_is_root)h](j|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubjF)}(h h]h }(hj$ahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjaubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hj5ahhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj2aubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj7amodnameN classnameNjj)}j]j`c.cxl_switch_gather_bandwidthasbuh1hhjaubjF)}(h h]h }(hjSahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjaubj)}(hjh]h*}(hjaahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj])}(hcxlrh]hcxlr}(hjnahhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjaubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjaubj|)}(hstruct xarray *input_xah](j)}(hjh]hstruct}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubjF)}(h h]h }(hjahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjaubh)}(hhh]j])}(hxarrayh]hxarray}(hjahhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjaubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjamodnameN classnameNjj)}j]j`c.cxl_switch_gather_bandwidthasbuh1hhjaubjF)}(h h]h }(hjahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjaubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj])}(hinput_xah]hinput_xa}(hjahhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjaubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjaubj|)}(hbool *gp_is_rooth](j4)}(hj^h]hbool}(hjahhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjaubjF)}(h h]h }(hjbhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjaubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubj])}(h gp_is_rooth]h gp_is_root}(hjbhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjaubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjaubeh}(h]h ]h"]h$]h&]hhuh1juhj`hhhj`hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj`hhhj`hMubah}(h]j`ah ](jjeh"]h$]h&]jj)jhuh1j'hj`hMhj`hhubj)}(hhh]j])}(h6collect all the bandwidth at switch level in an xarrayh]h6collect all the bandwidth at switch level in an xarray}(hjIbhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjFbhhubah}(h]h ]h"]h$]h&]uh1jhj`hhhj`hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjabjjabjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_region *cxlr`` The region being operated on ``struct xarray *input_xa`` xarray indexed by upstream device of a switch with data of 'struct cxl_perf_ctx' ``bool *gp_is_root`` (output) bool of whether the grandparent is cxl root. **Return** a xarray of resulting cxl_perf_ctx per parent switch or root port or ERR_PTR(-errno) **Description** Iterate through the xarray. Take the minimum of the downstream calculated bandwidth, the upstream link bandwidth, and the SSLBIS of the upstream switch if exists. Sum the resulting bandwidth under the switch upstream device or a RP device. The function can be iterated over multiple switches if the switches are present.h](j])}(h**Parameters**h]j)}(hjkbh]h Parameters}(hjmbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjibubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjebubjo)}(hhh](jt)}(h9``struct cxl_region *cxlr`` The region being operated on h](jz)}(h``struct cxl_region *cxlr``h]j)}(hjbh]hstruct cxl_region *cxlr}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjbubj)}(hhh]j])}(hThe region being operated onh]hThe region being operated on}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjbhMhjbubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jshjbhMhjbubjt)}(hm``struct xarray *input_xa`` xarray indexed by upstream device of a switch with data of 'struct cxl_perf_ctx' h](jz)}(h``struct xarray *input_xa``h]j)}(hjbh]hstruct xarray *input_xa}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjbubj)}(hhh]j])}(hPxarray indexed by upstream device of a switch with data of 'struct cxl_perf_ctx'h]hTxarray indexed by upstream device of a switch with data of ‘struct cxl_perf_ctx’}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjbubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jshjbhMhjbubjt)}(hK``bool *gp_is_root`` (output) bool of whether the grandparent is cxl root. h](jz)}(h``bool *gp_is_root``h]j)}(hjbh]hbool *gp_is_root}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjbubj)}(hhh]j])}(h5(output) bool of whether the grandparent is cxl root.h]h5(output) bool of whether the grandparent is cxl root.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjchMhjcubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jshjchMhjbubeh}(h]h ]h"]h$]h&]uh1jnhjebubj])}(h **Return**h]j)}(hj8ch]hReturn}(hj:chhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6cubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjebubj])}(hTa xarray of resulting cxl_perf_ctx per parent switch or root port or ERR_PTR(-errno)h]hTa xarray of resulting cxl_perf_ctx per parent switch or root port or ERR_PTR(-errno)}(hjNchhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjebubj])}(h**Description**h]j)}(hj_ch]h Description}(hjachhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]cubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjebubj])}(hX@Iterate through the xarray. Take the minimum of the downstream calculated bandwidth, the upstream link bandwidth, and the SSLBIS of the upstream switch if exists. Sum the resulting bandwidth under the switch upstream device or a RP device. The function can be iterated over multiple switches if the switches are present.h]hX@Iterate through the xarray. Take the minimum of the downstream calculated bandwidth, the upstream link bandwidth, and the SSLBIS of the upstream switch if exists. Sum the resulting bandwidth under the switch upstream device or a RP device. The function can be iterated over multiple switches if the switches are present.}(hjuchhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjebubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$cxl_rp_gather_bandwidth (C function)c.cxl_rp_gather_bandwidthhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h;struct xarray * cxl_rp_gather_bandwidth (struct xarray *xa)h]j.)}(h9struct xarray *cxl_rp_gather_bandwidth(struct xarray *xa)h](j)}(hjh]hstruct}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM[ubjF)}(h h]h }(hjchhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjchhhjchM[ubh)}(hhh]j])}(hxarrayh]hxarray}(hjchhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjcubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjcmodnameN classnameNjj)}j]j)}jcxl_rp_gather_bandwidthsbc.cxl_rp_gather_bandwidthasbuh1hhjchhhjchM[ubjF)}(h h]h }(hjchhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjchhhjchM[ubj)}(hjh]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjchhhjchM[ubjW)}(hcxl_rp_gather_bandwidthh]j])}(hjch]hcxl_rp_gather_bandwidth}(hjdhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjcubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjchhhjchM[ubjv)}(h(struct xarray *xa)h]j|)}(hstruct xarray *xah](j)}(hjh]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubjF)}(h h]h }(hj+dhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjdubh)}(hhh]j])}(hxarrayh]hxarray}(hjdmodnameN classnameNjj)}j]jcc.cxl_rp_gather_bandwidthasbuh1hhjdubjF)}(h h]h }(hjZdhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjdubj)}(hjh]h*}(hjhdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubj])}(hxah]hxa}(hjudhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjdubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjdubah}(h]h ]h"]h$]h&]hhuh1juhjchhhjchM[ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjchhhjchM[ubah}(h]jcah ](jjeh"]h$]h&]jj)jhuh1j'hjchM[hjchhubj)}(hhh]j])}(h/handle the root port level bandwidth collectionh]h/handle the root port level bandwidth collection}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM[hjdhhubah}(h]h ]h"]h$]h&]uh1jhjchhhjchM[ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjdjjdjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct xarray *xa`` the xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each root port device. **Return** xarray that holds cxl_perf_ctx per host bridge or ERR_PTR(-errno)h](j])}(h**Parameters**h]j)}(hjdh]h Parameters}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM_hjdubjo)}(hhh]jt)}(h|``struct xarray *xa`` the xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each root port device. h](jz)}(h``struct xarray *xa``h]j)}(hjdh]hstruct xarray *xa}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM]hjdubj)}(hhh]j])}(hethe xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each root port device.h]hethe xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each root port device.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM\hjdubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jshjdhM]hjdubah}(h]h ]h"]h$]h&]uh1jnhjdubj])}(h **Return**h]j)}(hjeh]hReturn}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM_hjdubj])}(hAxarray that holds cxl_perf_ctx per host bridge or ERR_PTR(-errno)h]hAxarray that holds cxl_perf_ctx per host bridge or ERR_PTR(-errno)}(hj2ehhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chM_hjdubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$cxl_hb_gather_bandwidth (C function)c.cxl_hb_gather_bandwidthhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h;struct xarray * cxl_hb_gather_bandwidth (struct xarray *xa)h]j.)}(h9struct xarray *cxl_hb_gather_bandwidth(struct xarray *xa)h](j)}(hjh]hstruct}(hjaehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ehhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMubjF)}(h h]h }(hjoehhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj]ehhhjnehMubh)}(hhh]j])}(hxarrayh]hxarray}(hjehhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj}eubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjemodnameN classnameNjj)}j]j)}jcxl_hb_gather_bandwidthsbc.cxl_hb_gather_bandwidthasbuh1hhj]ehhhjnehMubjF)}(h h]h }(hjehhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj]ehhhjnehMubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]ehhhjnehMubjW)}(hcxl_hb_gather_bandwidthh]j])}(hjeh]hcxl_hb_gather_bandwidth}(hjehhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjeubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj]ehhhjnehMubjv)}(h(struct xarray *xa)h]j|)}(hstruct xarray *xah](j)}(hjh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubjF)}(h h]h }(hjehhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjeubh)}(hhh]j])}(hxarrayh]hxarray}(hjehhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjeubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjemodnameN classnameNjj)}j]jec.cxl_hb_gather_bandwidthasbuh1hhjeubjF)}(h h]h }(hjfhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjeubj)}(hjh]h*}(hj%fhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj])}(hxah]hxa}(hj2fhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjeubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjeubah}(h]h ]h"]h$]h&]hhuh1juhj]ehhhjnehMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjYehhhjnehMubah}(h]jTeah ](jjeh"]h$]h&]jj)jhuh1j'hjnehMhjVehhubj)}(hhh]j])}(h1handle the host bridge level bandwidth collectionh]h1handle the host bridge level bandwidth collection}(hj\fhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjYfhhubah}(h]h ]h"]h$]h&]uh1jhjVehhhjnehMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjtfjjtfjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct xarray *xa`` the xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each host bridge. **Return** xarray that holds cxl_perf_ctx per ACPI0017 device or ERR_PTR(-errno)h](j])}(h**Parameters**h]j)}(hj~fh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|fubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjxfubjo)}(hhh]jt)}(hw``struct xarray *xa`` the xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each host bridge. h](jz)}(h``struct xarray *xa``h]j)}(hjfh]hstruct xarray *xa}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjfubj)}(hhh]j])}(h`the xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each host bridge.h]h`the xarray that holds the cxl_perf_ctx that has the bandwidth calculated below each host bridge.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjfubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jshjfhMhjfubah}(h]h ]h"]h$]h&]uh1jnhjxfubj])}(h **Return**h]j)}(hjfh]hReturn}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjxfubj])}(hExarray that holds cxl_perf_ctx per ACPI0017 device or ERR_PTR(-errno)h]hExarray that holds cxl_perf_ctx per ACPI0017 device or ERR_PTR(-errno)}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjxfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j(cxl_region_update_bandwidth (C function)c.cxl_region_update_bandwidthhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hSvoid cxl_region_update_bandwidth (struct cxl_region *cxlr, struct xarray *input_xa)h]j.)}(hRvoid cxl_region_update_bandwidth(struct cxl_region *cxlr, struct xarray *input_xa)h](j4)}(hvoidh]hvoid}(hjghhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjghhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMubjF)}(h h]h }(hj-ghhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjghhhj,ghMubjW)}(hcxl_region_update_bandwidthh]j])}(hcxl_region_update_bandwidthh]hcxl_region_update_bandwidth}(hj?ghhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj;gubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjghhhj,ghMubjv)}(h2(struct cxl_region *cxlr, struct xarray *input_xa)h](j|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hj[ghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWgubjF)}(h h]h }(hjhghhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjWgubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hjyghhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjvgubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj{gmodnameN classnameNjj)}j]j)}jjAgsbc.cxl_region_update_bandwidthasbuh1hhjWgubjF)}(h h]h }(hjghhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjWgubj)}(hjh]h*}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWgubj])}(hcxlrh]hcxlr}(hjghhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjWgubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjSgubj|)}(hstruct xarray *input_xah](j)}(hjh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubjF)}(h h]h }(hjghhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjgubh)}(hhh]j])}(hxarrayh]hxarray}(hjghhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjgubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjgmodnameN classnameNjj)}j]jgc.cxl_region_update_bandwidthasbuh1hhjgubjF)}(h h]h }(hj hhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjgubj)}(hjh]h*}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj])}(hinput_xah]hinput_xa}(hj$hhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjgubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjSgubeh}(h]h ]h"]h$]h&]hhuh1juhjghhhj,ghMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjghhhj,ghMubah}(h]jgah ](jjeh"]h$]h&]jj)jhuh1j'hj,ghMhjghhubj)}(hhh]j])}(h3Update the bandwidth access coordinates of a regionh]h3Update the bandwidth access coordinates of a region}(hjNhhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjKhhhubah}(h]h ]h"]h$]h&]uh1jhjghhhj,ghMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjfhjjfhjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_region *cxlr`` The region being operated on ``struct xarray *input_xa`` xarray holds cxl_perf_ctx wht calculated bandwidth per ACPI0017 instanceh](j])}(h**Parameters**h]j)}(hjphh]h Parameters}(hjrhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnhubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjjhubjo)}(hhh](jt)}(h9``struct cxl_region *cxlr`` The region being operated on h](jz)}(h``struct cxl_region *cxlr``h]j)}(hjhh]hstruct cxl_region *cxlr}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjhubj)}(hhh]j])}(hThe region being operated onh]hThe region being operated on}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhhMhjhubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jshjhhMhjhubjt)}(hd``struct xarray *input_xa`` xarray holds cxl_perf_ctx wht calculated bandwidth per ACPI0017 instanceh](jz)}(h``struct xarray *input_xa``h]j)}(hjhh]hstruct xarray *input_xa}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjhubj)}(hhh]j])}(hHxarray holds cxl_perf_ctx wht calculated bandwidth per ACPI0017 instanceh]hHxarray holds cxl_perf_ctx wht calculated bandwidth per ACPI0017 instance}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjhubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jshjhhMhjhubeh}(h]h ]h"]h$]h&]uh1jnhjjhubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j8cxl_region_shared_upstream_bandwidth_update (C function)-c.cxl_region_shared_upstream_bandwidth_updatehNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hJvoid cxl_region_shared_upstream_bandwidth_update (struct cxl_region *cxlr)h]j.)}(hIvoid cxl_region_shared_upstream_bandwidth_update(struct cxl_region *cxlr)h](j4)}(hvoidh]hvoid}(hj"ihhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjihhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMubjF)}(h h]h }(hj1ihhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjihhhj0ihMubjW)}(h+cxl_region_shared_upstream_bandwidth_updateh]j])}(h+cxl_region_shared_upstream_bandwidth_updateh]h+cxl_region_shared_upstream_bandwidth_update}(hjCihhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj?iubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjihhhj0ihMubjv)}(h(struct cxl_region *cxlr)h]j|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hj_ihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[iubjF)}(h h]h }(hjlihhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj[iubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hj}ihhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjziubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjimodnameN classnameNjj)}j]j)}jjEisb-c.cxl_region_shared_upstream_bandwidth_updateasbuh1hhj[iubjF)}(h h]h }(hjihhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj[iubj)}(hjh]h*}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[iubj])}(hcxlrh]hcxlr}(hjihhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj[iubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjWiubah}(h]h ]h"]h$]h&]hhuh1juhjihhhj0ihMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjihhhj0ihMubah}(h]jiah ](jjeh"]h$]h&]jj)jhuh1j'hj0ihMhjihhubj)}(hhh]j])}(h(Recalculate the bandwidth for the regionh]h(Recalculate the bandwidth for the region}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjihhubah}(h]h ]h"]h$]h&]uh1jhjihhhj0ihMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjijjijjjuh1j"hhhju.hNhNubj)}(hXI**Parameters** ``struct cxl_region *cxlr`` the cxl region to recalculate **Description** The function walks the topology from bottom up and calculates the bandwidth. It starts at the endpoints, processes at the switches if any, processes at the rootport level, at the host bridge level, and finally aggregates at the region.h](j])}(h**Parameters**h]j)}(hjjh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjiubjo)}(hhh]jt)}(h:``struct cxl_region *cxlr`` the cxl region to recalculate h](jz)}(h``struct cxl_region *cxlr``h]j)}(hj#jh]hstruct cxl_region *cxlr}(hj%jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!jubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:445: ./drivers/cxl/core/cdat.chMhjjubj)}(hhh]j])}(hthe cxl region to recalculateh]hthe cxl region to recalculate}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj:mhMhj;mubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jshj:mhMhjmubjt)}(hO``struct device *uport_dev`` "physical" device implementing this upstream port h](jz)}(h``struct device *uport_dev``h]j)}(hj^mh]hstruct device *uport_dev}(hj`mhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\mubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjXmubj)}(hhh]j])}(h1"physical" device implementing this upstream porth]h5“physical” device implementing this upstream port}(hjwmhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjsmhMhjtmubah}(h]h ]h"]h$]h&]uh1jhjXmubeh}(h]h ]h"]h$]h&]uh1jshjsmhMhjmubjt)}(hV``resource_size_t component_reg_phys`` (optional) for configurable cxl_port instances h](jz)}(h&``resource_size_t component_reg_phys``h]j)}(hjmh]h"resource_size_t component_reg_phys}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjmubj)}(hhh]j])}(h.(optional) for configurable cxl_port instancesh]h.(optional) for configurable cxl_port instances}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjmhMhjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jshjmhMhjmubjt)}(hQ``struct cxl_dport *parent_dport`` next hop up in the CXL memory decode hierarchyh](jz)}(h"``struct cxl_dport *parent_dport``h]j)}(hjmh]hstruct cxl_dport *parent_dport}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjmubj)}(hhh]j])}(h.next hop up in the CXL memory decode hierarchyh]h.next hop up in the CXL memory decode hierarchy}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jshjmhMhjmubeh}(h]h ]h"]h$]h&]uh1jnhjmubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdevm_cxl_add_dport (C function)c.devm_cxl_add_dporthNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hstruct cxl_dport * devm_cxl_add_dport (struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t component_reg_phys)h]j.)}(hstruct cxl_dport *devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t component_reg_phys)h](j)}(hjh]hstruct}(hj*nhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&nhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hj8nhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&nhhhj7nhMubh)}(hhh]j])}(h cxl_dporth]h cxl_dport}(hjInhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjFnubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjKnmodnameN classnameNjj)}j]j)}jdevm_cxl_add_dportsbc.devm_cxl_add_dportasbuh1hhj&nhhhj7nhMubjF)}(h h]h }(hjjnhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&nhhhj7nhMubj)}(hjh]h*}(hjxnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&nhhhj7nhMubjW)}(hdevm_cxl_add_dporth]j])}(hjgnh]hdevm_cxl_add_dport}(hjnhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjnubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj&nhhhj7nhMubjv)}(hb(struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t component_reg_phys)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubjF)}(h h]h }(hjnhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjnubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjnhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjnubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjnmodnameN classnameNjj)}j]jenc.devm_cxl_add_dportasbuh1hhjnubjF)}(h h]h }(hjnhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjnubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnubj])}(hporth]hport}(hjnhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjnubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjnubj|)}(hstruct device *dport_devh](j)}(hjh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubjF)}(h h]h }(hj!ohhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjoubh)}(hhh]j])}(hdeviceh]hdevice}(hj2ohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj/oubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj4omodnameN classnameNjj)}j]jenc.devm_cxl_add_dportasbuh1hhjoubjF)}(h h]h }(hjPohhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjoubj)}(hjh]h*}(hj^ohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjoubj])}(h dport_devh]h dport_dev}(hjkohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjoubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjnubj|)}(h int port_idh](j4)}(hinth]hint}(hjohhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjoubjF)}(h h]h }(hjohhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjoubj])}(hport_idh]hport_id}(hjohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjoubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjnubj|)}(h"resource_size_t component_reg_physh](h)}(hhh]j])}(hresource_size_th]hresource_size_t}(hjohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjoubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjomodnameN classnameNjj)}j]jenc.devm_cxl_add_dportasbuh1hhjoubjF)}(h h]h }(hjohhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjoubj])}(hcomponent_reg_physh]hcomponent_reg_phys}(hjohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjoubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjnubeh}(h]h ]h"]h$]h&]hhuh1juhj&nhhhj7nhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj"nhhhj7nhMubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1j'hj7nhMhjnhhubj)}(hhh]j])}(h,append VH downstream port data to a cxl_porth]h,append VH downstream port data to a cxl_port}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjphhubah}(h]h ]h"]h$]h&]uh1jhjnhhhj7nhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*pjj*pjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_port *port`` the cxl_port that references this dport ``struct device *dport_dev`` firmware or PCI device representing the dport ``int port_id`` identifier for this dport in a decoder's target list ``resource_size_t component_reg_phys`` optional location of CXL component registers **Description** Note that dports are appended to the devm release action's of the either the port's host (for root ports), or the port itself (for switch ports)h](j])}(h**Parameters**h]j)}(hj4ph]h Parameters}(hj6phhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2pubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj.pubjo)}(hhh](jt)}(hB``struct cxl_port *port`` the cxl_port that references this dport h](jz)}(h``struct cxl_port *port``h]j)}(hjSph]hstruct cxl_port *port}(hjUphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQpubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjMpubj)}(hhh]j])}(h'the cxl_port that references this dporth]h'the cxl_port that references this dport}(hjlphhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhphMhjipubah}(h]h ]h"]h$]h&]uh1jhjMpubeh}(h]h ]h"]h$]h&]uh1jshjhphMhjJpubjt)}(hK``struct device *dport_dev`` firmware or PCI device representing the dport h](jz)}(h``struct device *dport_dev``h]j)}(hjph]hstruct device *dport_dev}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjpubj)}(hhh]j])}(h-firmware or PCI device representing the dporth]h-firmware or PCI device representing the dport}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjphMhjpubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jshjphMhjJpubjt)}(hE``int port_id`` identifier for this dport in a decoder's target list h](jz)}(h``int port_id``h]j)}(hjph]h int port_id}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjpubj)}(hhh]j])}(h4identifier for this dport in a decoder's target listh]h6identifier for this dport in a decoder’s target list}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjphMhjpubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jshjphMhjJpubjt)}(hT``resource_size_t component_reg_phys`` optional location of CXL component registers h](jz)}(h&``resource_size_t component_reg_phys``h]j)}(hjph]h"resource_size_t component_reg_phys}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjpubj)}(hhh]j])}(h,optional location of CXL component registersh]h,optional location of CXL component registers}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjqhMhjqubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jshjqhMhjJpubeh}(h]h ]h"]h$]h&]uh1jnhj.pubj])}(h**Description**h]j)}(hj9qh]h Description}(hj;qhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7qubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj.pubj])}(hNote that dports are appended to the devm release action's of the either the port's host (for root ports), or the port itself (for switch ports)h]hNote that dports are appended to the devm release action’s of the either the port’s host (for root ports), or the port itself (for switch ports)}(hjOqhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj.pubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#devm_cxl_add_rch_dport (C function)c.devm_cxl_add_rch_dporthNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h~struct cxl_dport * devm_cxl_add_rch_dport (struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t rcrb)h]j.)}(h|struct cxl_dport *devm_cxl_add_rch_dport(struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t rcrb)h](j)}(hjh]hstruct}(hj~qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzqhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hjqhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjzqhhhjqhMubh)}(hhh]j])}(h cxl_dporth]h cxl_dport}(hjqhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjqubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjqmodnameN classnameNjj)}j]j)}jdevm_cxl_add_rch_dportsbc.devm_cxl_add_rch_dportasbuh1hhjzqhhhjqhMubjF)}(h h]h }(hjqhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjzqhhhjqhMubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjzqhhhjqhMubjW)}(hdevm_cxl_add_rch_dporth]j])}(hjqh]hdevm_cxl_add_rch_dport}(hjqhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjqubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjzqhhhjqhMubjv)}(hT(struct cxl_port *port, struct device *dport_dev, int port_id, resource_size_t rcrb)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubjF)}(h h]h }(hjrhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjqubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjrhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjrubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjrmodnameN classnameNjj)}j]jqc.devm_cxl_add_rch_dportasbuh1hhjqubjF)}(h h]h }(hj4rhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjqubj)}(hjh]h*}(hjBrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj])}(hporth]hport}(hjOrhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjqubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjqubj|)}(hstruct device *dport_devh](j)}(hjh]hstruct}(hjhrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdrubjF)}(h h]h }(hjurhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjdrubh)}(hhh]j])}(hdeviceh]hdevice}(hjrhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjrubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjrmodnameN classnameNjj)}j]jqc.devm_cxl_add_rch_dportasbuh1hhjdrubjF)}(h h]h }(hjrhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjdrubj)}(hjh]h*}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdrubj])}(h dport_devh]h dport_dev}(hjrhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjdrubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjqubj|)}(h int port_idh](j4)}(hinth]hint}(hjrhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjrubjF)}(h h]h }(hjrhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjrubj])}(hport_idh]hport_id}(hjrhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjrubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjqubj|)}(hresource_size_t rcrbh](h)}(hhh]j])}(hresource_size_th]hresource_size_t}(hjshhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj subah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjsmodnameN classnameNjj)}j]jqc.devm_cxl_add_rch_dportasbuh1hhj subjF)}(h h]h }(hj.shhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj subj])}(hrcrbh]hrcrb}(hjint cxl_add_ep(struct cxl_dport *dport, struct device *ep_dev)h](j4)}(hinth]hint}(hjthhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjthhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hjthhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjthhhjthMubjW)}(h cxl_add_eph]j])}(h cxl_add_eph]h cxl_add_ep}(hjthhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjtubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjthhhjthMubjv)}(h0(struct cxl_dport *dport, struct device *ep_dev)h](j|)}(hstruct cxl_dport *dporth](j)}(hjh]hstruct}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubjF)}(h h]h }(hjuhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj uubh)}(hhh]j])}(h cxl_dporth]h cxl_dport}(hj-uhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj*uubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj/umodnameN classnameNjj)}j]j)}jjtsb c.cxl_add_epasbuh1hhj uubjF)}(h h]h }(hjMuhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj uubj)}(hjh]h*}(hj[uhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj uubj])}(hdporth]hdport}(hjhuhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj uubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjuubj|)}(hstruct device *ep_devh](j)}(hjh]hstruct}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}uubjF)}(h h]h }(hjuhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}uubh)}(hhh]j])}(hdeviceh]hdevice}(hjuhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjuubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjumodnameN classnameNjj)}j]jIu c.cxl_add_epasbuh1hhj}uubjF)}(h h]h }(hjuhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}uubj)}(hjh]h*}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}uubj])}(hep_devh]hep_dev}(hjuhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj}uubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjuubeh}(h]h ]h"]h$]h&]hhuh1juhjthhhjthMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjthhhjthMubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1j'hjthMhjthhubj)}(hhh]j])}(h)register an endpoint's interest in a porth]h+register an endpoint’s interest in a port}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjuhhubah}(h]h ]h"]h$]h&]uh1jhjthhhjthMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjvjjvjjjuh1j"hhhju.hNhNubj)}(hX]**Parameters** ``struct cxl_dport *dport`` the dport that routes to **ep_dev** ``struct device *ep_dev`` device representing the endpoint **Description** Intermediate CXL ports are scanned based on the arrival of endpoints. When those endpoints depart the port can be destroyed once all endpoints that care about that port have been removed.h](j])}(h**Parameters**h]j)}(hj$vh]h Parameters}(hj&vhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"vubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjvubjo)}(hhh](jt)}(h@``struct cxl_dport *dport`` the dport that routes to **ep_dev** h](jz)}(h``struct cxl_dport *dport``h]j)}(hjCvh]hstruct cxl_dport *dport}(hjEvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAvubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj=vubj)}(hhh]j])}(h#the dport that routes to **ep_dev**h](hthe dport that routes to }(hj\vhhhNhNubj)}(h **ep_dev**h]hep_dev}(hjdvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\vubeh}(h]h ]h"]h$]h&]uh1j\hjXvhMhjYvubah}(h]h ]h"]h$]h&]uh1jhj=vubeh}(h]h ]h"]h$]h&]uh1jshjXvhMhj:vubjt)}(h;``struct device *ep_dev`` device representing the endpoint h](jz)}(h``struct device *ep_dev``h]j)}(hjvh]hstruct device *ep_dev}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjvubj)}(hhh]j])}(h device representing the endpointh]h device representing the endpoint}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjvhMhjvubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jshjvhMhj:vubeh}(h]h ]h"]h$]h&]uh1jnhjvubj])}(h**Description**h]j)}(hjvh]h Description}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjvubj])}(hIntermediate CXL ports are scanned based on the arrival of endpoints. When those endpoints depart the port can be destroyed once all endpoints that care about that port have been removed.h]hIntermediate CXL ports are scanned based on the arrival of endpoints. When those endpoints depart the port can be destroyed once all endpoints that care about that port have been removed.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjvubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_decoder_init (C function)c.cxl_decoder_inithNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hFint cxl_decoder_init (struct cxl_port *port, struct cxl_decoder *cxld)h]j.)}(hEint cxl_decoder_init(struct cxl_port *port, struct cxl_decoder *cxld)h](j4)}(hinth]hint}(hj whhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjwhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hjwhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwhhhjwhMubjW)}(hcxl_decoder_inith]j])}(hcxl_decoder_inith]hcxl_decoder_init}(hj+whhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj'wubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjwhhhjwhMubjv)}(h1(struct cxl_port *port, struct cxl_decoder *cxld)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjGwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCwubjF)}(h h]h }(hjTwhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjCwubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjewhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjbwubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjgwmodnameN classnameNjj)}j]j)}jj-wsbc.cxl_decoder_initasbuh1hhjCwubjF)}(h h]h }(hjwhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjCwubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCwubj])}(hporth]hport}(hjwhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjCwubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj?wubj|)}(hstruct cxl_decoder *cxldh](j)}(hjh]hstruct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubjF)}(h h]h }(hjwhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwubh)}(hhh]j])}(h cxl_decoderh]h cxl_decoder}(hjwhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjwubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjwmodnameN classnameNjj)}j]jwc.cxl_decoder_initasbuh1hhjwubjF)}(h h]h }(hjwhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwubj)}(hjh]h*}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj])}(hcxldh]hcxld}(hjxhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjwubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj?wubeh}(h]h ]h"]h$]h&]hhuh1juhjwhhhjwhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjwhhhjwhMubah}(h]jvah ](jjeh"]h$]h&]jj)jhuh1j'hjwhMhjvhhubj)}(hhh]j])}(h%Common decoder setup / initializationh]h%Common decoder setup / initialization}(hj:xhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj7xhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjwhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjRxjjRxjjjuh1j"hhhju.hNhNubj)}(hXr**Parameters** ``struct cxl_port *port`` owning port of this decoder ``struct cxl_decoder *cxld`` common decoder properties to initialize **Description** A port may contain one or more decoders. Each of those decoders enable some address space for CXL.mem utilization. A decoder is expected to be configured by the caller before registering via cxl_decoder_add()h](j])}(h**Parameters**h]j)}(hj\xh]h Parameters}(hj^xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZxubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjVxubjo)}(hhh](jt)}(h6``struct cxl_port *port`` owning port of this decoder h](jz)}(h``struct cxl_port *port``h]j)}(hj{xh]hstruct cxl_port *port}(hj}xhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyxubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjuxubj)}(hhh]j])}(howning port of this decoderh]howning port of this decoder}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjxhMhjxubah}(h]h ]h"]h$]h&]uh1jhjuxubeh}(h]h ]h"]h$]h&]uh1jshjxhMhjrxubjt)}(hE``struct cxl_decoder *cxld`` common decoder properties to initialize h](jz)}(h``struct cxl_decoder *cxld``h]j)}(hjxh]hstruct cxl_decoder *cxld}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjxubj)}(hhh]j])}(h'common decoder properties to initializeh]h'common decoder properties to initialize}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjxhMhjxubah}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ]h"]h$]h&]uh1jshjxhMhjrxubeh}(h]h ]h"]h$]h&]uh1jnhjVxubj])}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjVxubj])}(hA port may contain one or more decoders. Each of those decoders enable some address space for CXL.mem utilization. A decoder is expected to be configured by the caller before registering via cxl_decoder_add()h]hA port may contain one or more decoders. Each of those decoders enable some address space for CXL.mem utilization. A decoder is expected to be configured by the caller before registering via cxl_decoder_add()}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjVxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#cxl_root_decoder_alloc (C function)c.cxl_root_decoder_allochNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hastruct cxl_root_decoder * cxl_root_decoder_alloc (struct cxl_port *port, unsigned int nr_targets)h]j.)}(h_struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, unsigned int nr_targets)h](j)}(hjh]hstruct}(hj4yhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0yhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hjByhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj0yhhhjAyhMubh)}(hhh]j])}(hcxl_root_decoderh]hcxl_root_decoder}(hjSyhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjPyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjUymodnameN classnameNjj)}j]j)}jcxl_root_decoder_allocsbc.cxl_root_decoder_allocasbuh1hhj0yhhhjAyhMubjF)}(h h]h }(hjtyhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj0yhhhjAyhMubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0yhhhjAyhMubjW)}(hcxl_root_decoder_alloch]j])}(hjqyh]hcxl_root_decoder_alloc}(hjyhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjyubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj0yhhhjAyhMubjv)}(h0(struct cxl_port *port, unsigned int nr_targets)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubjF)}(h h]h }(hjyhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjyubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjyhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjymodnameN classnameNjj)}j]joyc.cxl_root_decoder_allocasbuh1hhjyubjF)}(h h]h }(hjyhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjyubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubj])}(hporth]hport}(hjzhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjyubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjyubj|)}(hunsigned int nr_targetsh](j4)}(hunsignedh]hunsigned}(hjzhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjzubjF)}(h h]h }(hj,zhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjzubj4)}(hinth]hint}(hj:zhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjzubjF)}(h h]h }(hjHzhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjzubj])}(h nr_targetsh]h nr_targets}(hjVzhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjzubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjyubeh}(h]h ]h"]h$]h&]hhuh1juhj0yhhhjAyhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj,yhhhjAyhMubah}(h]j'yah ](jjeh"]h$]h&]jj)jhuh1j'hjAyhMhj)yhhubj)}(hhh]j])}(hAllocate a root level decoderh]hAllocate a root level decoder}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj}zhhubah}(h]h ]h"]h$]h&]uh1jhj)yhhhjAyhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzjjzjjjuh1j"hhhju.hNhNubj)}(hXk**Parameters** ``struct cxl_port *port`` owning CXL root of this decoder ``unsigned int nr_targets`` static number of downstream targets **Return** A new cxl decoder to be registered by cxl_decoder_add(). A 'CXL root' decoder is one that decodes from a top-level / static platform firmware description of CXL resources into a CXL standard decode topology.h](j])}(h**Parameters**h]j)}(hjzh]h Parameters}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjzubjo)}(hhh](jt)}(h:``struct cxl_port *port`` owning CXL root of this decoder h](jz)}(h``struct cxl_port *port``h]j)}(hjzh]hstruct cxl_port *port}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjzubj)}(hhh]j])}(howning CXL root of this decoderh]howning CXL root of this decoder}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjzhMhjzubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jshjzhMhjzubjt)}(h@``unsigned int nr_targets`` static number of downstream targets h](jz)}(h``unsigned int nr_targets``h]j)}(hjzh]hunsigned int nr_targets}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjzubj)}(hhh]j])}(h#static number of downstream targetsh]h#static number of downstream targets}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj{hMhj{ubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jshj{hMhjzubeh}(h]h ]h"]h$]h&]uh1jnhjzubj])}(h **Return**h]j)}(hj5{h]hReturn}(hj7{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3{ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjzubj])}(hA new cxl decoder to be registered by cxl_decoder_add(). A 'CXL root' decoder is one that decodes from a top-level / static platform firmware description of CXL resources into a CXL standard decode topology.h]hA new cxl decoder to be registered by cxl_decoder_add(). A ‘CXL root’ decoder is one that decodes from a top-level / static platform firmware description of CXL resources into a CXL standard decode topology.}(hjK{hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjzubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%cxl_switch_decoder_alloc (C function)c.cxl_switch_decoder_allochNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hestruct cxl_switch_decoder * cxl_switch_decoder_alloc (struct cxl_port *port, unsigned int nr_targets)h]j.)}(hcstruct cxl_switch_decoder *cxl_switch_decoder_alloc(struct cxl_port *port, unsigned int nr_targets)h](j)}(hjh]hstruct}(hjz{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv{hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM1ubjF)}(h h]h }(hj{hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjv{hhhj{hM1ubh)}(hhh]j])}(hcxl_switch_decoderh]hcxl_switch_decoder}(hj{hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj{ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj{modnameN classnameNjj)}j]j)}jcxl_switch_decoder_allocsbc.cxl_switch_decoder_allocasbuh1hhjv{hhhj{hM1ubjF)}(h h]h }(hj{hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjv{hhhj{hM1ubj)}(hjh]h*}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv{hhhj{hM1ubjW)}(hcxl_switch_decoder_alloch]j])}(hj{h]hcxl_switch_decoder_alloc}(hj{hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj{ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjv{hhhj{hM1ubjv)}(h0(struct cxl_port *port, unsigned int nr_targets)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubjF)}(h h]h }(hj|hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj{ubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hj|hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj|ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj|modnameN classnameNjj)}j]j{c.cxl_switch_decoder_allocasbuh1hhj{ubjF)}(h h]h }(hj0|hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj{ubj)}(hjh]h*}(hj>|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj])}(hporth]hport}(hjK|hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj{ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj{ubj|)}(hunsigned int nr_targetsh](j4)}(hunsignedh]hunsigned}(hjd|hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj`|ubjF)}(h h]h }(hjr|hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj`|ubj4)}(hinth]hint}(hj|hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj`|ubjF)}(h h]h }(hj|hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj`|ubj])}(h nr_targetsh]h nr_targets}(hj|hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj`|ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj{ubeh}(h]h ]h"]h$]h&]hhuh1juhjv{hhhj{hM1ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjr{hhhj{hM1ubah}(h]jm{ah ](jjeh"]h$]h&]jj)jhuh1j'hj{hM1hjo{hhubj)}(hhh]j])}(hAllocate a switch level decoderh]hAllocate a switch level decoder}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM1hj|hhubah}(h]h ]h"]h$]h&]uh1jhjo{hhhj{hM1ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj|jj|jjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_port *port`` owning CXL switch port of this decoder ``unsigned int nr_targets`` max number of dynamically addressable downstream targets **Return** A new cxl decoder to be registered by cxl_decoder_add(). A 'switch' decoder is any decoder that can be enumerated by PCIe topology and the HDM Decoder Capability. This includes the decoders that sit between Switch Upstream Ports / Switch Downstream Ports and Host Bridges / Root Ports.h](j])}(h**Parameters**h]j)}(hj|h]h Parameters}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM5hj|ubjo)}(hhh](jt)}(hA``struct cxl_port *port`` owning CXL switch port of this decoder h](jz)}(h``struct cxl_port *port``h]j)}(hj}h]hstruct cxl_port *port}(hj }hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM2hj}ubj)}(hhh]j])}(h&owning CXL switch port of this decoderh]h&owning CXL switch port of this decoder}(hj }hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj}hM2hj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jshj}hM2hj|ubjt)}(hU``unsigned int nr_targets`` max number of dynamically addressable downstream targets h](jz)}(h``unsigned int nr_targets``h]j)}(hj@}h]hunsigned int nr_targets}(hjB}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>}ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM3hj:}ubj)}(hhh]j])}(h8max number of dynamically addressable downstream targetsh]h8max number of dynamically addressable downstream targets}(hjY}hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjU}hM3hjV}ubah}(h]h ]h"]h$]h&]uh1jhj:}ubeh}(h]h ]h"]h$]h&]uh1jshjU}hM3hj|ubeh}(h]h ]h"]h$]h&]uh1jnhj|ubj])}(h **Return**h]j)}(hj{}h]hReturn}(hj}}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy}ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM5hj|ubj])}(hXA new cxl decoder to be registered by cxl_decoder_add(). A 'switch' decoder is any decoder that can be enumerated by PCIe topology and the HDM Decoder Capability. This includes the decoders that sit between Switch Upstream Ports / Switch Downstream Ports and Host Bridges / Root Ports.h]hX!A new cxl decoder to be registered by cxl_decoder_add(). A ‘switch’ decoder is any decoder that can be enumerated by PCIe topology and the HDM Decoder Capability. This includes the decoders that sit between Switch Upstream Ports / Switch Downstream Ports and Host Bridges / Root Ports.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM5hj|ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'cxl_endpoint_decoder_alloc (C function)c.cxl_endpoint_decoder_allochNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hPstruct cxl_endpoint_decoder * cxl_endpoint_decoder_alloc (struct cxl_port *port)h]j.)}(hNstruct cxl_endpoint_decoder *cxl_endpoint_decoder_alloc(struct cxl_port *port)h](j)}(hjh]hstruct}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMVubjF)}(h h]h }(hj}hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}hhhj}hMVubh)}(hhh]j])}(hcxl_endpoint_decoderh]hcxl_endpoint_decoder}(hj}hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj}ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj}modnameN classnameNjj)}j]j)}jcxl_endpoint_decoder_allocsbc.cxl_endpoint_decoder_allocasbuh1hhj}hhhj}hMVubjF)}(h h]h }(hj~hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}hhhj}hMVubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhj}hMVubjW)}(hcxl_endpoint_decoder_alloch]j])}(hj}h]hcxl_endpoint_decoder_alloc}(hj~hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj~ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj}hhhj}hMVubjv)}(h(struct cxl_port *port)h]j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hj:~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6~ubjF)}(h h]h }(hjG~hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj6~ubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjX~hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjU~ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjZ~modnameN classnameNjj)}j]j}c.cxl_endpoint_decoder_allocasbuh1hhj6~ubjF)}(h h]h }(hjv~hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj6~ubj)}(hjh]h*}(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6~ubj])}(hporth]hport}(hj~hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj6~ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj2~ubah}(h]h ]h"]h$]h&]hhuh1juhj}hhhj}hMVubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj}hhhj}hMVubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1j'hj}hMVhj}hhubj)}(hhh]j])}(hAllocate an endpoint decoderh]hAllocate an endpoint decoder}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMVhj~hhubah}(h]h ]h"]h$]h&]uh1jhj}hhhj}hMVubeh}(h]h ](jfunctioneh"]h$]h&]jjjj~jj~jjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_port *port`` owning port of this decoder **Return** A new cxl decoder to be registered by cxl_decoder_add()h](j])}(h**Parameters**h]j)}(hj~h]h Parameters}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMZhj~ubjo)}(hhh]jt)}(h6``struct cxl_port *port`` owning port of this decoder h](jz)}(h``struct cxl_port *port``h]j)}(hj~h]hstruct cxl_port *port}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMWhj~ubj)}(hhh]j])}(howning port of this decoderh]howning port of this decoder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMWhjubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jshjhMWhj~ubah}(h]h ]h"]h$]h&]uh1jnhj~ubj])}(h **Return**h]j)}(hj7h]hReturn}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMYhj~ubj])}(h7A new cxl decoder to be registered by cxl_decoder_add()h]h7A new cxl decoder to be registered by cxl_decoder_add()}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMYhj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#cxl_decoder_add_locked (C function)c.cxl_decoder_add_lockedhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hFint cxl_decoder_add_locked (struct cxl_decoder *cxld, int *target_map)h]j.)}(hEint cxl_decoder_add_locked(struct cxl_decoder *cxld, int *target_map)h](j4)}(hinth]hint}(hj|hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjxhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMwubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjxhhhjhMwubjW)}(hcxl_decoder_add_lockedh]j])}(hcxl_decoder_add_lockedh]hcxl_decoder_add_locked}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjxhhhjhMwubjv)}(h+(struct cxl_decoder *cxld, int *target_map)h](j|)}(hstruct cxl_decoder *cxldh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_decoderh]h cxl_decoder}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.cxl_decoder_add_lockedasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxldh]hcxld}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hint *target_maph](j4)}(hinth]hint}(hj+hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj'ubjF)}(h h]h }(hj9hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj'ubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj])}(h target_maph]h target_map}(hjThhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjxhhhjhMwubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjthhhjhMwubah}(h]joah ](jjeh"]h$]h&]jj)jhuh1j'hjhMwhjqhhubj)}(hhh]j])}(hAdd a decoder with targetsh]hAdd a decoder with targets}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMwhj{hhubah}(h]h ]h"]h$]h&]uh1jhjqhhhjhMwubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_decoder *cxld`` The cxl decoder allocated by cxl__decoder_alloc() ``int *target_map`` A list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure. **Description** Certain types of decoders may not have any targets. The main example of this is an endpoint device. A more awkward example is a hostbridge whose root ports get hot added (technically possible, though unlikely). This is the locked variant of cxl_decoder_add(). **Context** Process context. Expects the device lock of the port that owns the **cxld** to be held. **Return** Negative error code if the decoder wasn't properly configured; else returns 0.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM{hjubjo)}(hhh](jt)}(hU``struct cxl_decoder *cxld`` The cxl decoder allocated by cxl__decoder_alloc() h](jz)}(h``struct cxl_decoder *cxld``h]j)}(hjh]hstruct cxl_decoder *cxld}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMxhjubj)}(hhh]j])}(h7The cxl decoder allocated by cxl__decoder_alloc()h]h7The cxl decoder allocated by cxl__decoder_alloc()}(hj؀hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjԀhMxhjՀubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjԀhMxhjubjt)}(h``int *target_map`` A list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure. h](jz)}(h``int *target_map``h]j)}(hjh]hint *target_map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM{hjubj)}(hhh]j])}(hA list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure.h]hA list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMyhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj hM{hjubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h**Description**h]j)}(hj4h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM}hjubj])}(hCertain types of decoders may not have any targets. The main example of this is an endpoint device. A more awkward example is a hostbridge whose root ports get hot added (technically possible, though unlikely).h]hCertain types of decoders may not have any targets. The main example of this is an endpoint device. A more awkward example is a hostbridge whose root ports get hot added (technically possible, though unlikely).}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chM|hjubj])}(h0This is the locked variant of cxl_decoder_add().h]h0This is the locked variant of cxl_decoder_add().}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(h **Context**h]j)}(hjjh]hContext}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(hWProcess context. Expects the device lock of the port that owns the **cxld** to be held.h](hCProcess context. Expects the device lock of the port that owns the }(hjhhhNhNubj)}(h**cxld**h]hcxld}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to be held.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(hNNegative error code if the decoder wasn't properly configured; else returns 0.h]hPNegative error code if the decoder wasn’t properly configured; else returns 0.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_decoder_add (C function)c.cxl_decoder_addhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h?int cxl_decoder_add (struct cxl_decoder *cxld, int *target_map)h]j.)}(h>int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMubjW)}(hcxl_decoder_addh]j])}(hcxl_decoder_addh]hcxl_decoder_add}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMubjv)}(h+(struct cxl_decoder *cxld, int *target_map)h](j|)}(hstruct cxl_decoder *cxldh](j)}(hjh]hstruct}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF)}(h h]h }(hj2hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubh)}(hhh]j])}(h cxl_decoderh]h cxl_decoder}(hjChhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j]j)}jj sbc.cxl_decoder_addasbuh1hhj!ubjF)}(h h]h }(hjchhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubj)}(hjh]h*}(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj])}(hcxldh]hcxld}(hj~hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hint *target_maph](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(h target_maph]h target_map}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhjhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMubah}(h]jہah ](jjeh"]h$]h&]jj)jhuh1j'hjhMhj݁hhubj)}(hhh]j])}(hAdd a decoder with targetsh]hAdd a decoder with targets}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj݁hhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_decoder *cxld`` The cxl decoder allocated by cxl__decoder_alloc() ``int *target_map`` A list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure. **Description** This is the unlocked variant of cxl_decoder_add_locked(). See cxl_decoder_add_locked(). **Context** Process context. Takes and releases the device lock of the port that owns the **cxld**.h](j])}(h**Parameters**h]j)}(hj h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubjo)}(hhh](jt)}(hU``struct cxl_decoder *cxld`` The cxl decoder allocated by cxl__decoder_alloc() h](jz)}(h``struct cxl_decoder *cxld``h]j)}(hj+h]hstruct cxl_decoder *cxld}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj%ubj)}(hhh]j])}(h7The cxl decoder allocated by cxl__decoder_alloc()h]h7The cxl decoder allocated by cxl__decoder_alloc()}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj@hMhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jshj@hMhj"ubjt)}(h``int *target_map`` A list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure. h](jz)}(h``int *target_map``h]j)}(hjdh]hint *target_map}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhj^ubj)}(hhh]j])}(hA list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure.h]hA list of downstream ports that this decoder can direct memory traffic to. These numbers should correspond with the port number in the PCIe Link Capabilities structure.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jshjyhMhj"ubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(hWThis is the unlocked variant of cxl_decoder_add_locked(). See cxl_decoder_add_locked().h]hWThis is the unlocked variant of cxl_decoder_add_locked(). See cxl_decoder_add_locked().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(h **Context**h]j)}(hjǃh]hContext}(hjɃhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjŃubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj])}(hWProcess context. Takes and releases the device lock of the port that owns the **cxld**.h](hNProcess context. Takes and releases the device lock of the port that owns the }(hj݃hhhNhNubj)}(h**cxld**h]hcxld}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj݃ubh.}(hj݃hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"__cxl_driver_register (C function)c.__cxl_driver_registerhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(haint __cxl_driver_register (struct cxl_driver *cxl_drv, struct module *owner, const char *modname)h]j.)}(h`int __cxl_driver_register(struct cxl_driver *cxl_drv, struct module *owner, const char *modname)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMubjF)}(h h]h }(hj-hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhj,hMubjW)}(h__cxl_driver_registerh]j])}(h__cxl_driver_registerh]h__cxl_driver_register}(hj?hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj;ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhj,hMubjv)}(hG(struct cxl_driver *cxl_drv, struct module *owner, const char *modname)h](j|)}(hstruct cxl_driver *cxl_drvh](j)}(hjh]hstruct}(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubjF)}(h h]h }(hjhhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjWubh)}(hhh]j])}(h cxl_driverh]h cxl_driver}(hjyhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjvubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj{modnameN classnameNjj)}j]j)}jjAsbc.__cxl_driver_registerasbuh1hhjWubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj])}(hcxl_drvh]hcxl_drv}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjWubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjSubj|)}(hstruct module *ownerh](j)}(hjh]hstruct}(hj̈́hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɄubjF)}(h h]h }(hjڄhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjɄubh)}(hhh]j])}(hmoduleh]hmodule}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.__cxl_driver_registerasbuh1hhjɄubjF)}(h h]h }(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjɄubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɄubj])}(hownerh]howner}(hj$hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjɄubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjSubj|)}(hconst char *modnameh](j)}(hjUh]hconst}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubjF)}(h h]h }(hjJhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj9ubj4)}(hcharh]hchar}(hjXhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj9ubjF)}(h h]h }(hjfhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj9ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj])}(hmodnameh]hmodname}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj9ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjSubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhj,hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhj,hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hj,hMhjhhubj)}(hhh]j])}(h!register a driver for the cxl bush]h!register a driver for the cxl bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj,hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjÅjjÅjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_driver *cxl_drv`` cxl driver structure to attach ``struct module *owner`` owning module/driver ``const char *modname`` KBUILD_MODNAME for parent driverh](j])}(h**Parameters**h]j)}(hjͅh]h Parameters}(hjυhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˅ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjDžubjo)}(hhh](jt)}(h>``struct cxl_driver *cxl_drv`` cxl driver structure to attach h](jz)}(h``struct cxl_driver *cxl_drv``h]j)}(hjh]hstruct cxl_driver *cxl_drv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj)}(hhh]j])}(hcxl driver structure to attachh]hcxl driver structure to attach}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h.``struct module *owner`` owning module/driver h](jz)}(h``struct module *owner``h]j)}(hj%h]hstruct module *owner}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjubj)}(hhh]j])}(howning module/driverh]howning module/driver}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj:hMhj;ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj:hMhjubjt)}(h8``const char *modname`` KBUILD_MODNAME for parent driverh](jz)}(h``const char *modname``h]j)}(hj^h]hconst char *modname}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjXubj)}(hhh]j])}(h KBUILD_MODNAME for parent driverh]h KBUILD_MODNAME for parent driver}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMhjtubah}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ]h"]h$]h&]uh1jshjshMhjubeh}(h]h ]h"]h$]h&]uh1jnhjDžubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j.cxl_endpoint_get_perf_coordinates (C function)#c.cxl_endpoint_get_perf_coordinateshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h^int cxl_endpoint_get_perf_coordinates (struct cxl_port *port, struct access_coordinate *coord)h]j.)}(h]int cxl_endpoint_get_perf_coordinates(struct cxl_port *port, struct access_coordinate *coord)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMkubjF)}(h h]h }(hjdžhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjƆhMkubjW)}(h!cxl_endpoint_get_perf_coordinatesh]j])}(h!cxl_endpoint_get_perf_coordinatesh]h!cxl_endpoint_get_perf_coordinates}(hjنhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjՆubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjƆhMkubjv)}(h8(struct cxl_port *port, struct access_coordinate *coord)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjۆsb#c.cxl_endpoint_get_perf_coordinatesasbuh1hhjubjF)}(h h]h }(hj3hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hporth]hport}(hjNhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct access_coordinate *coordh](j)}(hjh]hstruct}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubjF)}(h h]h }(hjthhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjcubh)}(hhh]j])}(haccess_coordinateh]haccess_coordinate}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j/#c.cxl_endpoint_get_perf_coordinatesasbuh1hhjcubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj])}(hcoordh]hcoord}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjcubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhjƆhMkubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjƆhMkubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjƆhMkhjhhubj)}(hhh]j])}(h9Retrieve performance numbers stored in dports of CXL pathh]h9Retrieve performance numbers stored in dports of CXL path}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMkhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjƆhMkubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_port *port`` endpoint cxl_port ``struct access_coordinate *coord`` output performance data **Return** errno on failure, 0 on success.h](j])}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMohjubjo)}(hhh](jt)}(h,``struct cxl_port *port`` endpoint cxl_port h](jz)}(h``struct cxl_port *port``h]j)}(hj)h]hstruct cxl_port *port}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMmhj#ubj)}(hhh]j])}(hendpoint cxl_porth]hendpoint cxl_port}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj>hMmhj?ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jshj>hMmhj ubjt)}(h<``struct access_coordinate *coord`` output performance data h](jz)}(h#``struct access_coordinate *coord``h]j)}(hjbh]hstruct access_coordinate *coord}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMnhj\ubj)}(hhh]j])}(houtput performance datah]houtput performance data}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjwhMnhjxubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jshjwhMnhj ubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMphjubj])}(herrno on failure, 0 on success.h]herrno on failure, 0 on success.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:451: ./drivers/cxl/core/port.chMphjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(hCompute Express Link protocols are layered on top of PCIe. CXL core provides a set of helpers for CXL interactions which occur via PCIe.h]hCompute Express Link protocols are layered on top of PCIe. CXL core provides a set of helpers for CXL interactions which occur via PCIe.}(hjɈhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:454: ./drivers/cxl/core/pci.chKhju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j+devm_cxl_port_enumerate_dports (C function) c.devm_cxl_port_enumerate_dportshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h:int devm_cxl_port_enumerate_dports (struct cxl_port *port)h]j.)}(h9int devm_cxl_port_enumerate_dports(struct cxl_port *port)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chKGubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhKGubjW)}(hdevm_cxl_port_enumerate_dportsh]j])}(hdevm_cxl_port_enumerate_dportsh]hdevm_cxl_port_enumerate_dports}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhKGubjv)}(h(struct cxl_port *port)h]j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjF)}(h h]h }(hj;hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj*ubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjLhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjIubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjNmodnameN classnameNjj)}j]j)}jjsb c.devm_cxl_port_enumerate_dportsasbuh1hhj*ubjF)}(h h]h }(hjlhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj*ubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj])}(hporth]hport}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj&ubah}(h]h ]h"]h$]h&]hhuh1juhjhhhjhKGubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhKGubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhKGhjhhubj)}(hhh]j])}(h/enumerate downstream ports of the upstream porth]h/enumerate downstream ports of the upstream port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chKGhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKGubeh}(h]h ](jfunctioneh"]h$]h&]jjjjɉjjɉjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_port *port`` cxl_port whose ->uport_dev is the upstream of dports to be enumerated **Description** Returns a positive number of dports enumerated or a negative error code.h](j])}(h**Parameters**h]j)}(hjӉh]h Parameters}(hjՉhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjщubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chKKhj͉ubjo)}(hhh]jt)}(h```struct cxl_port *port`` cxl_port whose ->uport_dev is the upstream of dports to be enumerated h](jz)}(h``struct cxl_port *port``h]j)}(hjh]hstruct cxl_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chKHhjubj)}(hhh]j])}(hEcxl_port whose ->uport_dev is the upstream of dports to be enumeratedh]hEcxl_port whose ->uport_dev is the upstream of dports to be enumerated}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKHhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKHhjubah}(h]h ]h"]h$]h&]uh1jnhj͉ubj])}(h**Description**h]j)}(hj-h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chKJhj͉ubj])}(hHReturns a positive number of dports enumerated or a negative error code.h]hHReturns a positive number of dports enumerated or a negative error code.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chKIhj͉ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j cxl_hdm_decode_init (C function)c.cxl_hdm_decode_inithNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hsint cxl_hdm_decode_init (struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm, struct cxl_endpoint_dvsec_info *info)h]j.)}(hrint cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm, struct cxl_endpoint_dvsec_info *info)h](j4)}(hinth]hint}(hjrhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjnhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjnhhhjhMubjW)}(hcxl_hdm_decode_inith]j])}(hcxl_hdm_decode_inith]hcxl_hdm_decode_init}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjnhhhjhMubjv)}(h[(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm, struct cxl_endpoint_dvsec_info *info)h](j|)}(hstruct cxl_dev_state *cxldsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_dev_stateh]h cxl_dev_state}(hj͊hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjʊubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjϊmodnameN classnameNjj)}j]j)}jjsbc.cxl_hdm_decode_initasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxldsh]hcxlds}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_hdm *cxlhdmh](j)}(hjh]hstruct}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hj.hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_hdmh]hcxl_hdm}(hj?hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjAmodnameN classnameNjj)}j]jc.cxl_hdm_decode_initasbuh1hhjubjF)}(h h]h }(hj]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxlhdmh]hcxlhdm}(hjxhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(h$struct cxl_endpoint_dvsec_info *infoh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_endpoint_dvsec_infoh]hcxl_endpoint_dvsec_info}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_hdm_decode_initasbuh1hhjubjF)}(h h]h }(hj͋hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjۋhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjnhhhjhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjjhhhjhMubah}(h]jeah ](jjeh"]h$]h&]jj)jhuh1j'hjhMhjghhubj)}(hhh]j])}(h#Setup HDM decoding for the endpointh]h#Setup HDM decoding for the endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjghhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj*jj*jjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_dev_state *cxlds`` Device state ``struct cxl_hdm *cxlhdm`` Mapped HDM decoder Capability ``struct cxl_endpoint_dvsec_info *info`` Cached DVSEC range registers info **Description** Try to enable the endpoint's HDM Decoder Capabilityh](j])}(h**Parameters**h]j)}(hj4h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhj.ubjo)}(hhh](jt)}(h-``struct cxl_dev_state *cxlds`` Device state h](jz)}(h``struct cxl_dev_state *cxlds``h]j)}(hjSh]hstruct cxl_dev_state *cxlds}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjMubj)}(hhh]j])}(h Device stateh]h Device state}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhhMhjiubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jshjhhMhjJubjt)}(h9``struct cxl_hdm *cxlhdm`` Mapped HDM decoder Capability h](jz)}(h``struct cxl_hdm *cxlhdm``h]j)}(hjh]hstruct cxl_hdm *cxlhdm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubj)}(hhh]j])}(hMapped HDM decoder Capabilityh]hMapped HDM decoder Capability}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjJubjt)}(hK``struct cxl_endpoint_dvsec_info *info`` Cached DVSEC range registers info h](jz)}(h(``struct cxl_endpoint_dvsec_info *info``h]j)}(hjŌh]h$struct cxl_endpoint_dvsec_info *info}(hjnjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÌubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubj)}(hhh]j])}(h!Cached DVSEC range registers infoh]h!Cached DVSEC range registers info}(hjތhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjڌhMhjیubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjڌhMhjJubeh}(h]h ]h"]h$]h&]uh1jnhj.ubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhj.ubj])}(h3Try to enable the endpoint's HDM Decoder Capabilityh]h5Try to enable the endpoint’s HDM Decoder Capability}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jread_cdat_data (C function)c.read_cdat_datahNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h+void read_cdat_data (struct cxl_port *port)h]j.)}(h*void read_cdat_data(struct cxl_port *port)h](j4)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjAhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMOubjF)}(h h]h }(hjThhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjAhhhjShMOubjW)}(hread_cdat_datah]j])}(hread_cdat_datah]hread_cdat_data}(hjfhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjbubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjAhhhjShMOubjv)}(h(struct cxl_port *port)h]j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj~ubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjhsbc.read_cdat_dataasbuh1hhj~ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj~ubj)}(hjh]h*}(hj΍hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~ubj])}(hporth]hport}(hjۍhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj~ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjzubah}(h]h ]h"]h$]h&]hhuh1juhjAhhhjShMOubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj=hhhjShMOubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1j'hjShMOhj:hhubj)}(hhh]j])}(hRead the CDAT data on this porth]hRead the CDAT data on this port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMOhjhhubah}(h]h ]h"]h$]h&]uh1jhj:hhhjShMOubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_port *port`` Port to read data from **Description** This call will sleep waiting for responses from the DOE mailbox.h](j])}(h**Parameters**h]j)}(hj'h]h Parameters}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMShj!ubjo)}(hhh]jt)}(h1``struct cxl_port *port`` Port to read data from h](jz)}(h``struct cxl_port *port``h]j)}(hjFh]hstruct cxl_port *port}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMPhj@ubj)}(hhh]j])}(hPort to read data fromh]hPort to read data from}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj[hMPhj\ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jshj[hMPhj=ubah}(h]h ]h"]h$]h&]uh1jnhj!ubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMRhj!ubj])}(h@This call will sleep waiting for responses from the DOE mailbox.h]h@This call will sleep waiting for responses from the DOE mailbox.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMQhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)cxl_dport_init_ras_reporting (C function)c.cxl_dport_init_ras_reportinghNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hPvoid cxl_dport_init_ras_reporting (struct cxl_dport *dport, struct device *host)h]j.)}(hOvoid cxl_dport_init_ras_reporting(struct cxl_dport *dport, struct device *host)h](j4)}(hvoidh]hvoid}(hjƎhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjŽhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chM#ubjF)}(h h]h }(hjՎhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjŽhhhjԎhM#ubjW)}(hcxl_dport_init_ras_reportingh]j])}(hcxl_dport_init_ras_reportingh]hcxl_dport_init_ras_reporting}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjŽhhhjԎhM#ubjv)}(h.(struct cxl_dport *dport, struct device *host)h](j|)}(hstruct cxl_dport *dporth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_dporth]h cxl_dport}(hj!hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj#modnameN classnameNjj)}j]j)}jjsbc.cxl_dport_init_ras_reportingasbuh1hhjubjF)}(h h]h }(hjAhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hdporth]hdport}(hj\hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct device *hosth](j)}(hjh]hstruct}(hjuhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjqubh)}(hhh]j])}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j=c.cxl_dport_init_ras_reportingasbuh1hhjqubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjqubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqubj])}(hhosth]hhost}(hj̏hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjqubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjŽhhhjԎhM#ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjԎhM#ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjԎhM#hjhhubj)}(hhh]j])}(h"Setup CXL RAS report on this dporth]h"Setup CXL RAS report on this dport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chM#hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjԎhM#ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct cxl_dport *dport`` the cxl_dport that needs to be initialized ``struct device *host`` host device for devm operationsh](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chM'hjubjo)}(hhh](jt)}(hG``struct cxl_dport *dport`` the cxl_dport that needs to be initialized h](jz)}(h``struct cxl_dport *dport``h]j)}(hj7h]hstruct cxl_dport *dport}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chM$hj1ubj)}(hhh]j])}(h*the cxl_dport that needs to be initializedh]h*the cxl_dport that needs to be initialized}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjLhM$hjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jshjLhM$hj.ubjt)}(h7``struct device *host`` host device for devm operationsh](jz)}(h``struct device *host``h]j)}(hjph]hstruct device *host}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chM&hjjubj)}(hhh]j])}(hhost device for devm operationsh]hhost device for devm operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chM%hjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jshjhM&hj.ubeh}(h]h ]h"]h$]h&]uh1jnhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j cxl_pci_get_latency (C function)c.cxl_pci_get_latencyhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h/long cxl_pci_get_latency (struct pci_dev *pdev)h]j.)}(h.long cxl_pci_get_latency(struct pci_dev *pdev)h](j4)}(hlongh]hlong}(hjʐhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjƐhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMubjF)}(h h]h }(hjِhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjƐhhhjؐhMubjW)}(hcxl_pci_get_latencyh]j])}(hcxl_pci_get_latencyh]hcxl_pci_get_latency}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjƐhhhjؐhMubjv)}(h(struct pci_dev *pdev)h]j|)}(hstruct pci_dev *pdevh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hpci_devh]hpci_dev}(hj%hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjj)}j]j)}jjsbc.cxl_pci_get_latencyasbuh1hhjubjF)}(h h]h }(hjEhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hpdevh]hpdev}(hj`hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubah}(h]h ]h"]h$]h&]hhuh1juhjƐhhhjؐhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjؐhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjؐhMhjhhubj)}(hhh]j])}(h,calculate the link latency for the PCIe linkh]h,calculate the link latency for the PCIe link}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjؐhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX7**Parameters** ``struct pci_dev *pdev`` PCI device **Return** calculated latency or 0 for no latency **Description** CXL Memory Device SW Guide v1.0 2.11.4 Link latency calculation Link latency = LinkPropagationLatency + FlitLatency + RetimerLatency LinkProgationLatency is negligible, so 0 will be used RetimerLatency is assumed to be negligible and 0 will be used FlitLatency = FlitSize / LinkBandwidth FlitSize is defined by spec. CXL rev3.0 4.2.1. 68B flit is used up to 32GT/s. >32GT/s, 256B flit size is used. The FlitLatency is converted to picoseconds.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubjo)}(hhh]jt)}(h$``struct pci_dev *pdev`` PCI device h](jz)}(h``struct pci_dev *pdev``h]j)}(hjˑh]hstruct pci_dev *pdev}(hj͑hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɑubah}(h]h ]h"]h$]h&]uh1jyhj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjőubj)}(hhh]j])}(h PCI deviceh]h PCI device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjőubeh}(h]h ]h"]h$]h&]uh1jshjhMhj‘ubah}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubj])}(h&calculated latency or 0 for no latencyh]h&calculated latency or 0 for no latency}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubj])}(h**Description**h]j)}(hj-h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubj])}(hXCXL Memory Device SW Guide v1.0 2.11.4 Link latency calculation Link latency = LinkPropagationLatency + FlitLatency + RetimerLatency LinkProgationLatency is negligible, so 0 will be used RetimerLatency is assumed to be negligible and 0 will be used FlitLatency = FlitSize / LinkBandwidth FlitSize is defined by spec. CXL rev3.0 4.2.1. 68B flit is used up to 32GT/s. >32GT/s, 256B flit size is used. The FlitLatency is converted to picoseconds.h]hXCXL Memory Device SW Guide v1.0 2.11.4 Link latency calculation Link latency = LinkPropagationLatency + FlitLatency + RetimerLatency LinkProgationLatency is negligible, so 0 will be used RetimerLatency is assumed to be negligible and 0 will be used FlitLatency = FlitSize / LinkBandwidth FlitSize is defined by spec. CXL rev3.0 4.2.1. 68B flit is used up to 32GT/s. >32GT/s, 256B flit size is used. The FlitLatency is converted to picoseconds.}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:457: ./drivers/cxl/core/pci.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(hXIThe core CXL PMEM infrastructure supports persistent memory provisioning and serves as a bridge to the LIBNVDIMM subsystem. A CXL 'bridge' device is added at the root of a CXL device topology if platform firmware advertises at least one persistent memory capable CXL window. That root-level bridge corresponds to a LIBNVDIMM 'bus' device. Then for each cxl_memdev in the CXL device topology a bridge device is added to host a LIBNVDIMM dimm object. When these bridges are registered native LIBNVDIMM uapis are translated to CXL operations, for example, namespace label access commands.h]hXQThe core CXL PMEM infrastructure supports persistent memory provisioning and serves as a bridge to the LIBNVDIMM subsystem. A CXL ‘bridge’ device is added at the root of a CXL device topology if platform firmware advertises at least one persistent memory capable CXL window. That root-level bridge corresponds to a LIBNVDIMM ‘bus’ device. Then for each cxl_memdev in the CXL device topology a bridge device is added to host a LIBNVDIMM dimm object. When these bridges are registered native LIBNVDIMM uapis are translated to CXL operations, for example, namespace label access commands.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:460: ./drivers/cxl/core/pmem.chK hju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#cxl_find_nvdimm_bridge (C function)c.cxl_find_nvdimm_bridgehNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hIstruct cxl_nvdimm_bridge * cxl_find_nvdimm_bridge (struct cxl_port *port)h]j.)}(hGstruct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_port *port)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK7ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}hhhjhK7ubh)}(hhh]j])}(hcxl_nvdimm_bridgeh]hcxl_nvdimm_bridge}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jcxl_find_nvdimm_bridgesbc.cxl_find_nvdimm_bridgeasbuh1hhj}hhhjhK7ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj}hhhjhK7ubj)}(hjh]h*}(hjϒhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}hhhjhK7ubjW)}(hcxl_find_nvdimm_bridgeh]j])}(hjh]hcxl_find_nvdimm_bridge}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjܒubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj}hhhjhK7ubjv)}(h(struct cxl_port *port)h]j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_find_nvdimm_bridgeasbuh1hhjubjF)}(h h]h }(hj7hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hporth]hport}(hjRhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubah}(h]h ]h"]h$]h&]hhuh1juhj}hhhjhK7ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjyhhhjhK7ubah}(h]jtah ](jjeh"]h$]h&]jj)jhuh1j'hjhK7hjvhhubj)}(hhh]j])}(h'find a bridge device relative to a porth]h'find a bridge device relative to a port}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK7hjyhhubah}(h]h ]h"]h$]h&]uh1jhjvhhhjhK7ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hn**Parameters** ``struct cxl_port *port`` any descendant port of an nvdimm-bridge associated root-cxl-porth](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK;hjubjo)}(hhh]jt)}(hZ``struct cxl_port *port`` any descendant port of an nvdimm-bridge associated root-cxl-porth](jz)}(h``struct cxl_port *port``h]j)}(hjh]hstruct cxl_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK8hjubj)}(hhh]j])}(h@any descendant port of an nvdimm-bridge associated root-cxl-porth]h@any descendant port of an nvdimm-bridge associated root-cxl-port}(hj֓hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjғhK8hjӓubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjғhK8hjubah}(h]h ]h"]h$]h&]uh1jnhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'devm_cxl_add_nvdimm_bridge (C function)c.devm_cxl_add_nvdimm_bridgehNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hbstruct cxl_nvdimm_bridge * devm_cxl_add_nvdimm_bridge (struct device *host, struct cxl_port *port)h]j.)}(h`struct cxl_nvdimm_bridge *devm_cxl_add_nvdimm_bridge(struct device *host, struct cxl_port *port)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKwubjF)}(h h]h }(hj$hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhj#hKwubh)}(hhh]j])}(hcxl_nvdimm_bridgeh]hcxl_nvdimm_bridge}(hj5hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj7modnameN classnameNjj)}j]j)}jdevm_cxl_add_nvdimm_bridgesbc.devm_cxl_add_nvdimm_bridgeasbuh1hhjhhhj#hKwubjF)}(h h]h }(hjVhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhj#hKwubj)}(hjh]h*}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj#hKwubjW)}(hdevm_cxl_add_nvdimm_bridgeh]j])}(hjSh]hdevm_cxl_add_nvdimm_bridge}(hjuhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjqubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhj#hKwubjv)}(h,(struct device *host, struct cxl_port *port)h](j|)}(hstruct device *hosth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jQc.devm_cxl_add_nvdimm_bridgeasbuh1hhjubjF)}(h h]h }(hj̔hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjڔhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hhosth]hhost}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]jQc.devm_cxl_add_nvdimm_bridgeasbuh1hhjubjF)}(h h]h }(hj<hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hporth]hport}(hjWhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhj#hKwubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhj#hKwubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j'hj#hKwhj hhubj)}(hhh]j])}(h$add the root of a LIBNVDIMM topologyh]h$add the root of a LIBNVDIMM topology}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKwhj~hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj#hKwubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(h**Parameters** ``struct device *host`` platform firmware root device ``struct cxl_port *port`` CXL port at the root of a CXL topology **Return** bridge device that can host cxl_nvdimm objectsh](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK{hjubjo)}(hhh](jt)}(h6``struct device *host`` platform firmware root device h](jz)}(h``struct device *host``h]j)}(hj•h]hstruct device *host}(hjĕhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKxhjubj)}(hhh]j])}(hplatform firmware root deviceh]hplatform firmware root device}(hjەhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjוhKxhjؕubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjוhKxhjubjt)}(hA``struct cxl_port *port`` CXL port at the root of a CXL topology h](jz)}(h``struct cxl_port *port``h]j)}(hjh]hstruct cxl_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKyhjubj)}(hhh]j])}(h&CXL port at the root of a CXL topologyh]h&CXL port at the root of a CXL topology}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKyhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKyhjubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Return**h]j)}(hj6h]hReturn}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK{hjubj])}(h.bridge device that can host cxl_nvdimm objectsh]h.bridge device that can host cxl_nvdimm objects}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chK{hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j devm_cxl_add_nvdimm (C function)c.devm_cxl_add_nvdimmhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hPint devm_cxl_add_nvdimm (struct cxl_port *parent_port, struct cxl_memdev *cxlmd)h]j.)}(hOint devm_cxl_add_nvdimm(struct cxl_port *parent_port, struct cxl_memdev *cxlmd)h](j4)}(hinth]hint}(hj{hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjwhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwhhhjhKubjW)}(hdevm_cxl_add_nvdimmh]j])}(hdevm_cxl_add_nvdimmh]hdevm_cxl_add_nvdimm}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjwhhhjhKubjv)}(h8(struct cxl_port *parent_port, struct cxl_memdev *cxlmd)h](j|)}(hstruct cxl_port *parent_porth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjŖhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hj֖hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjӖubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjؖmodnameN classnameNjj)}j]j)}jjsbc.devm_cxl_add_nvdimmasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(h parent_porth]h parent_port}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_memdev *cxlmdh](j)}(hjh]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjF)}(h h]h }(hj7hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&ubh)}(hhh]j])}(h cxl_memdevh]h cxl_memdev}(hjHhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjJmodnameN classnameNjj)}j]jc.devm_cxl_add_nvdimmasbuh1hhj&ubjF)}(h h]h }(hjfhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&ubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj])}(hcxlmdh]hcxlmd}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjwhhhjhKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjshhhjhKubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1j'hjhKhjphhubj)}(hhh]j])}(h/add a bridge between a cxl_memdev and an nvdimmh]h/add a bridge between a cxl_memdev and an nvdimm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjphhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj×jj×jjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_port *parent_port`` parent port for the (to be added) **cxlmd** endpoint port ``struct cxl_memdev *cxlmd`` cxl_memdev instance that will perform LIBNVDIMM operations **Return** 0 on success negative error code on failure.h](j])}(h**Parameters**h]j)}(hj͗h]h Parameters}(hjϗhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj˗ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKhjǗubjo)}(hhh](jt)}(h[``struct cxl_port *parent_port`` parent port for the (to be added) **cxlmd** endpoint port h](jz)}(h ``struct cxl_port *parent_port``h]j)}(hjh]hstruct cxl_port *parent_port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKhjubj)}(hhh]j])}(h9parent port for the (to be added) **cxlmd** endpoint porth](h"parent port for the (to be added) }(hjhhhNhNubj)}(h **cxlmd**h]hcxlmd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh endpoint port}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(hX``struct cxl_memdev *cxlmd`` cxl_memdev instance that will perform LIBNVDIMM operations h](jz)}(h``struct cxl_memdev *cxlmd``h]j)}(hj7h]hstruct cxl_memdev *cxlmd}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKhj1ubj)}(hhh]j])}(h:cxl_memdev instance that will perform LIBNVDIMM operationsh]h:cxl_memdev instance that will perform LIBNVDIMM operations}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjLhKhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jshjLhKhjubeh}(h]h ]h"]h$]h&]uh1jnhjǗubj])}(h **Return**h]j)}(hjrh]hReturn}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKhjǗubj])}(h,0 on success negative error code on failure.h]h,0 on success negative error code on failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:463: ./drivers/cxl/core/pmem.chKhjǗubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(hXvCXL device capabilities are enumerated by PCI DVSEC (Designated Vendor-specific) and / or descriptors provided by platform firmware. They can be defined as a set like the device and component registers mandated by CXL Section 8.1.12.2 Memory Device PCIe Capabilities and Extended Capabilities, or they can be individual capabilities appended to bridged and endpoint devices.h]hXvCXL device capabilities are enumerated by PCI DVSEC (Designated Vendor-specific) and / or descriptors provided by platform firmware. They can be defined as a set like the device and component registers mandated by CXL Section 8.1.12.2 Memory Device PCIe Capabilities and Extended Capabilities, or they can be individual capabilities appended to bridged and endpoint devices.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:466: ./drivers/cxl/core/regs.chKhju.hhubj])}(hVProvide common infrastructure for enumerating and mapping these discrete capabilities.h]hVProvide common infrastructure for enumerating and mapping these discrete capabilities.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:466: ./drivers/cxl/core/regs.chKhju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%cxl_probe_component_regs (C function)c.cxl_probe_component_regshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hivoid cxl_probe_component_regs (struct device *dev, void __iomem *base, struct cxl_component_reg_map *map)h]j.)}(hhvoid cxl_probe_component_regs(struct device *dev, void __iomem *base, struct cxl_component_reg_map *map)h](j4)}(hvoidh]hvoid}(hj՘hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjјhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjјhhhjhKubjW)}(hcxl_probe_component_regsh]j])}(hcxl_probe_component_regsh]hcxl_probe_component_regs}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjјhhhjhKubjv)}(hK(struct device *dev, void __iomem *base, struct cxl_component_reg_map *map)h](j|)}(hstruct device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hdeviceh]hdevice}(hj0hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)}jjsbc.cxl_probe_component_regsasbuh1hhjubjF)}(h h]h }(hjPhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hdevh]hdev}(hjkhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj ubj|)}(hvoid __iomem *baseh](j4)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh__iomem}(hjhhhNhNubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hbaseh]hbase}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj ubj|)}(h!struct cxl_component_reg_map *maph](j)}(hjh]hstruct}(hjؙhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԙubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjԙubh)}(hhh]j])}(hcxl_component_reg_maph]hcxl_component_reg_map}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jLc.cxl_probe_component_regsasbuh1hhjԙubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjԙubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjԙubj])}(hmaph]hmap}(hj/hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjԙubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj ubeh}(h]h ]h"]h$]h&]hhuh1juhjјhhhjhKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj͘hhhjhKubah}(h]jȘah ](jjeh"]h$]h&]jj)jhuh1j'hjhKhjʘhhubj)}(hhh]j])}(h$Detect CXL Component register blocksh]h$Detect CXL Component register blocks}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKhjVhhubah}(h]h ]h"]h$]h&]uh1jhjʘhhhjhKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjqjjqjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct device *dev`` Host device of the **base** mapping ``void __iomem *base`` Mapping containing the HDM Decoder Capability Header ``struct cxl_component_reg_map *map`` Map object describing the register block information found **Description** See CXL 2.0 8.2.4 Component Register Layout and Definition See CXL 2.0 8.2.5.5 CXL Device Register Interface Probe for component register information and return it in map object.h](j])}(h**Parameters**h]j)}(hj{h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chK hjuubjo)}(hhh](jt)}(h;``struct device *dev`` Host device of the **base** mapping h](jz)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKhjubj)}(hhh]j])}(h#Host device of the **base** mappingh](hHost device of the }(hjhhhNhNubj)}(h**base**h]hbase}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh mapping}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(hL``void __iomem *base`` Mapping containing the HDM Decoder Capability Header h](jz)}(h``void __iomem *base``h]j)}(hjh]hvoid __iomem *base}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKhjߚubj)}(hhh]j])}(h4Mapping containing the HDM Decoder Capability Headerh]h4Mapping containing the HDM Decoder Capability Header}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjߚubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(ha``struct cxl_component_reg_map *map`` Map object describing the register block information found h](jz)}(h%``struct cxl_component_reg_map *map``h]j)}(hjh]h!struct cxl_component_reg_map *map}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKhjubj)}(hhh]j])}(h:Map object describing the register block information foundh]h:Map object describing the register block information found}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj3hKhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj3hKhjubeh}(h]h ]h"]h$]h&]uh1jnhjuubj])}(h**Description**h]j)}(hjYh]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chK!hjuubj])}(hlSee CXL 2.0 8.2.4 Component Register Layout and Definition See CXL 2.0 8.2.5.5 CXL Device Register Interfaceh]hlSee CXL 2.0 8.2.4 Component Register Layout and Definition See CXL 2.0 8.2.5.5 CXL Device Register Interface}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chK hjuubj])}(hEProbe for component register information and return it in map object.h]hEProbe for component register information and return it in map object.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chK#hjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"cxl_probe_device_regs (C function)c.cxl_probe_device_regshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hcvoid cxl_probe_device_regs (struct device *dev, void __iomem *base, struct cxl_device_reg_map *map)h]j.)}(hbvoid cxl_probe_device_regs(struct device *dev, void __iomem *base, struct cxl_device_reg_map *map)h](j4)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKpubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhKpubjW)}(hcxl_probe_device_regsh]j])}(hcxl_probe_device_regsh]hcxl_probe_device_regs}(hjΛhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjʛubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhKpubjv)}(hH(struct device *dev, void __iomem *base, struct cxl_device_reg_map *map)h](j|)}(hstruct device *devh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjЛsbc.cxl_probe_device_regsasbuh1hhjubjF)}(h h]h }(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hdevh]hdev}(hjChhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hvoid __iomem *baseh](j4)}(hvoidh]hvoid}(hj\hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjXubjF)}(h h]h }(hjjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjXubh__iomem}(hjXhhhNhNubjF)}(h h]h }(hj|hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjXubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjXubj])}(hbaseh]hbase}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjXubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_device_reg_map *maph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_device_reg_maph]hcxl_device_reg_map}(hjΜhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj˜ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjМmodnameN classnameNjj)}j]j$c.cxl_probe_device_regsasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmaph]hmap}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhjhKpubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhKpubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhKphjhhubj)}(hhh]j])}(h!Detect CXL Device register blocksh]h!Detect CXL Device register blocks}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKphj.hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKpubeh}(h]h ](jfunctioneh"]h$]h&]jjjjIjjIjjjuh1j"hhhju.hNhNubj)}(hXS**Parameters** ``struct device *dev`` Host device of the **base** mapping ``void __iomem *base`` Mapping of CXL 2.0 8.2.8 CXL Device Register Interface ``struct cxl_device_reg_map *map`` Map object describing the register block information found **Description** Probe for device register information and return it in map object.h](j])}(h**Parameters**h]j)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKthjMubjo)}(hhh](jt)}(h;``struct device *dev`` Host device of the **base** mapping h](jz)}(h``struct device *dev``h]j)}(hjrh]hstruct device *dev}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKqhjlubj)}(hhh]j])}(h#Host device of the **base** mappingh](hHost device of the }(hjhhhNhNubj)}(h**base**h]hbase}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh mapping}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjhKqhjubah}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jshjhKqhjiubjt)}(hN``void __iomem *base`` Mapping of CXL 2.0 8.2.8 CXL Device Register Interface h](jz)}(h``void __iomem *base``h]j)}(hjh]hvoid __iomem *base}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKrhjubj)}(hhh]j])}(h6Mapping of CXL 2.0 8.2.8 CXL Device Register Interfaceh]h6Mapping of CXL 2.0 8.2.8 CXL Device Register Interface}(hj֝hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjҝhKrhjӝubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjҝhKrhjiubjt)}(h^``struct cxl_device_reg_map *map`` Map object describing the register block information found h](jz)}(h"``struct cxl_device_reg_map *map``h]j)}(hjh]hstruct cxl_device_reg_map *map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKshjubj)}(hhh]j])}(h:Map object describing the register block information foundh]h:Map object describing the register block information found}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj hKshj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj hKshjiubeh}(h]h ]h"]h$]h&]uh1jnhjMubj])}(h**Description**h]j)}(hj1h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKuhjMubj])}(hBProbe for device register information and return it in map object.h]hBProbe for device register information and return it in map object.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chKthjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'cxl_find_regblock_instance (C function)c.cxl_find_regblock_instancehNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hint cxl_find_regblock_instance (struct pci_dev *pdev, enum cxl_regloc_type type, struct cxl_register_map *map, unsigned int index)h]j.)}(hint cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type, struct cxl_register_map *map, unsigned int index)h](j4)}(hinth]hint}(hjvhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjrhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM\ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjrhhhjhM\ubjW)}(hcxl_find_regblock_instanceh]j])}(hcxl_find_regblock_instanceh]hcxl_find_regblock_instance}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjrhhhjhM\ubjv)}(hc(struct pci_dev *pdev, enum cxl_regloc_type type, struct cxl_register_map *map, unsigned int index)h](j|)}(hstruct pci_dev *pdevh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hpci_devh]hpci_dev}(hjўhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjΞubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjӞmodnameN classnameNjj)}j]j)}jjsbc.cxl_find_regblock_instanceasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hpdevh]hpdev}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(henum cxl_regloc_type typeh](j)}(henumh]henum}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF)}(h h]h }(hj3hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubh)}(hhh]j])}(hcxl_regloc_typeh]hcxl_regloc_type}(hjDhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjAubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjFmodnameN classnameNjj)}j]jc.cxl_find_regblock_instanceasbuh1hhj!ubjF)}(h h]h }(hjbhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubj])}(htypeh]htype}(hjphhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_register_map *maph](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_register_maph]hcxl_register_map}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_find_regblock_instanceasbuh1hhjubjF)}(h h]h }(hjşhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjӟhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmaph]hmap}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hunsigned int indexh](j4)}(hunsignedh]hunsigned}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjubjF)}(h h]h }(hj#hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(hindexh]hindex}(hj1hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjrhhhjhM\ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjnhhhjhM\ubah}(h]jiah ](jjeh"]h$]h&]jj)jhuh1j'hjhM\hjkhhubj)}(hhh]j])}(h'Locate a register block by type / indexh]h'Locate a register block by type / index}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM\hjXhhubah}(h]h ]h"]h$]h&]uh1jhjkhhhjhM\ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjsjjsjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct pci_dev *pdev`` The CXL PCI device to enumerate. ``enum cxl_regloc_type type`` Register Block Indicator id ``struct cxl_register_map *map`` Enumeration output, clobbered on error ``unsigned int index`` Index into which particular instance of a regblock wanted in the order found in register locator DVSEC. **Return** 0 if register block enumerated, negative error code otherwise **Description** A CXL DVSEC may point to one or more register blocks, search for them by **type** and **index**.h](j])}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM`hjwubjo)}(hhh](jt)}(h:``struct pci_dev *pdev`` The CXL PCI device to enumerate. h](jz)}(h``struct pci_dev *pdev``h]j)}(hjh]hstruct pci_dev *pdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM]hjubj)}(hhh]j])}(h The CXL PCI device to enumerate.h]h The CXL PCI device to enumerate.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM]hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhM]hjubjt)}(h:``enum cxl_regloc_type type`` Register Block Indicator id h](jz)}(h``enum cxl_regloc_type type``h]j)}(hjՠh]henum cxl_regloc_type type}(hjנhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjӠubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM^hjϠubj)}(hhh]j])}(hRegister Block Indicator idh]hRegister Block Indicator id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM^hjubah}(h]h ]h"]h$]h&]uh1jhjϠubeh}(h]h ]h"]h$]h&]uh1jshjhM^hjubjt)}(hH``struct cxl_register_map *map`` Enumeration output, clobbered on error h](jz)}(h ``struct cxl_register_map *map``h]j)}(hjh]hstruct cxl_register_map *map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM_hjubj)}(hhh]j])}(h&Enumeration output, clobbered on errorh]h&Enumeration output, clobbered on error}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj#hM_hj$ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj#hM_hjubjt)}(h``unsigned int index`` Index into which particular instance of a regblock wanted in the order found in register locator DVSEC. h](jz)}(h``unsigned int index``h]j)}(hjGh]hunsigned int index}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMahjAubj)}(hhh]j])}(hgIndex into which particular instance of a regblock wanted in the order found in register locator DVSEC.h]hgIndex into which particular instance of a regblock wanted in the order found in register locator DVSEC.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chM`hj]ubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jshj\hMahjubeh}(h]h ]h"]h$]h&]uh1jnhjwubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMchjwubj])}(h=0 if register block enumerated, negative error code otherwiseh]h=0 if register block enumerated, negative error code otherwise}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMchjwubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMehjwubj])}(h`A CXL DVSEC may point to one or more register blocks, search for them by **type** and **index**.h](hIA CXL DVSEC may point to one or more register blocks, search for them by }(hjhhhNhNubj)}(h**type**h]htype}(hjȡhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **index**h]hindex}(hjڡhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMdhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_find_regblock (C function)c.cxl_find_regblockhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(heint cxl_find_regblock (struct pci_dev *pdev, enum cxl_regloc_type type, struct cxl_register_map *map)h]j.)}(hdint cxl_find_regblock(struct pci_dev *pdev, enum cxl_regloc_type type, struct cxl_register_map *map)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMpubjF)}(h h]h }(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhj!hMpubjW)}(hcxl_find_regblockh]j])}(hcxl_find_regblockh]hcxl_find_regblock}(hj4hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj0ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhj!hMpubjv)}(hO(struct pci_dev *pdev, enum cxl_regloc_type type, struct cxl_register_map *map)h](j|)}(hstruct pci_dev *pdevh](j)}(hjh]hstruct}(hjPhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubjF)}(h h]h }(hj]hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjLubh)}(hhh]j])}(hpci_devh]hpci_dev}(hjnhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjkubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjpmodnameN classnameNjj)}j]j)}jj6sbc.cxl_find_regblockasbuh1hhjLubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjLubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLubj])}(hpdevh]hpdev}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjLubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjHubj|)}(henum cxl_regloc_type typeh](j)}(hj'h]henum}(hj¢hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjϢhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_regloc_typeh]hcxl_regloc_type}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjݢubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_find_regblockasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(htypeh]htype}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjHubj|)}(hstruct cxl_register_map *maph](j)}(hjh]hstruct}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF)}(h h]h }(hj2hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubh)}(hhh]j])}(hcxl_register_maph]hcxl_register_map}(hjChhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j]jc.cxl_find_regblockasbuh1hhj!ubjF)}(h h]h }(hjahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj])}(hmaph]hmap}(hj|hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjHubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhj!hMpubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj hhhj!hMpubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hj!hMphjhhubj)}(hhh]j])}(hLocate register blocks by typeh]hLocate register blocks by type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMphjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj!hMpubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct pci_dev *pdev`` The CXL PCI device to enumerate. ``enum cxl_regloc_type type`` Register Block Indicator id ``struct cxl_register_map *map`` Enumeration output, clobbered on error **Return** 0 if register block enumerated, negative error code otherwise **Description** A CXL DVSEC may point to one or more register blocks, search for them by **type**.h](j])}(h**Parameters**h]j)}(hjȣh]h Parameters}(hjʣhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƣubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMthj£ubjo)}(hhh](jt)}(h:``struct pci_dev *pdev`` The CXL PCI device to enumerate. h](jz)}(h``struct pci_dev *pdev``h]j)}(hjh]hstruct pci_dev *pdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMqhjubj)}(hhh]j])}(h The CXL PCI device to enumerate.h]h The CXL PCI device to enumerate.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMqhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMqhjޣubjt)}(h:``enum cxl_regloc_type type`` Register Block Indicator id h](jz)}(h``enum cxl_regloc_type type``h]j)}(hj h]henum cxl_regloc_type type}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMrhjubj)}(hhh]j])}(hRegister Block Indicator idh]hRegister Block Indicator id}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj5hMrhj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj5hMrhjޣubjt)}(hH``struct cxl_register_map *map`` Enumeration output, clobbered on error h](jz)}(h ``struct cxl_register_map *map``h]j)}(hjYh]hstruct cxl_register_map *map}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMshjSubj)}(hhh]j])}(h&Enumeration output, clobbered on errorh]h&Enumeration output, clobbered on error}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjnhMshjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jshjnhMshjޣubeh}(h]h ]h"]h$]h&]uh1jnhj£ubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMuhj£ubj])}(h=0 if register block enumerated, negative error code otherwiseh]h=0 if register block enumerated, negative error code otherwise}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMuhj£ubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMwhj£ubj])}(hRA CXL DVSEC may point to one or more register blocks, search for them by **type**.h](hIA CXL DVSEC may point to one or more register blocks, search for them by }(hjѤhhhNhNubj)}(h**type**h]htype}(hj٤hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjѤubh.}(hjѤhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMvhj£ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_count_regblock (C function)c.cxl_count_regblockhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hHint cxl_count_regblock (struct pci_dev *pdev, enum cxl_regloc_type type)h]j.)}(hGint cxl_count_regblock(struct pci_dev *pdev, enum cxl_regloc_type type)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMubjF)}(h h]h }(hj!hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhj hMubjW)}(hcxl_count_regblockh]j])}(hcxl_count_regblockh]hcxl_count_regblock}(hj3hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj/ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhj hMubjv)}(h1(struct pci_dev *pdev, enum cxl_regloc_type type)h](j|)}(hstruct pci_dev *pdevh](j)}(hjh]hstruct}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubjF)}(h h]h }(hj\hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjKubh)}(hhh]j])}(hpci_devh]hpci_dev}(hjmhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjomodnameN classnameNjj)}j]j)}jj5sbc.cxl_count_regblockasbuh1hhjKubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubj])}(hpdevh]hpdev}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjKubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjGubj|)}(henum cxl_regloc_type typeh](j)}(hj'h]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjΥhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_regloc_typeh]hcxl_regloc_type}(hjߥhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjܥubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_count_regblockasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(htypeh]htype}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjGubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhj hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj hhhj hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hj hMhjhhubj)}(hhh]j])}(h)Count instances of a given regblock type.h]h)Count instances of a given regblock type.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhj2hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjMjjMjjjuh1j"hhhju.hNhNubj)}(hX***Parameters** ``struct pci_dev *pdev`` The CXL PCI device to enumerate. ``enum cxl_regloc_type type`` Register Block Indicator id **Description** Some regblocks may be repeated. Count how many instances. **Return** non-negative count of matching regblocks, negative error code otherwise.h](j])}(h**Parameters**h]j)}(hjWh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjQubjo)}(hhh](jt)}(h:``struct pci_dev *pdev`` The CXL PCI device to enumerate. h](jz)}(h``struct pci_dev *pdev``h]j)}(hjvh]hstruct pci_dev *pdev}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjtubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjpubj)}(hhh]j])}(h The CXL PCI device to enumerate.h]h The CXL PCI device to enumerate.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjpubeh}(h]h ]h"]h$]h&]uh1jshjhMhjmubjt)}(h:``enum cxl_regloc_type type`` Register Block Indicator id h](jz)}(h``enum cxl_regloc_type type``h]j)}(hjh]henum cxl_regloc_type type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjubj)}(hhh]j])}(hRegister Block Indicator idh]hRegister Block Indicator id}(hjȦhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjĦhMhjŦubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjĦhMhjmubeh}(h]h ]h"]h$]h&]uh1jnhjQubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjQubj])}(h9Some regblocks may be repeated. Count how many instances.h]h9Some regblocks may be repeated. Count how many instances.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjQubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjQubj])}(hHnon-negative count of matching regblocks, negative error code otherwise.h]hHnon-negative count of matching regblocks, negative error code otherwise.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:469: ./drivers/cxl/core/regs.chMhjQubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(hXCore implementation of the CXL 2.0 Type-3 Memory Device Mailbox. The implementation is used by the cxl_pci driver to initialize the device and implement the cxl_mem.h IOCTL UAPI. It also implements the backend of the cxl_pmem_ctl() transport for LIBNVDIMM.h]hXCore implementation of the CXL 2.0 Type-3 Memory Device Mailbox. The implementation is used by the cxl_pci driver to initialize the device and implement the cxl_mem.h IOCTL UAPI. It also implements the backend of the cxl_pmem_ctl() transport for LIBNVDIMM.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:472: ./drivers/cxl/core/mbox.chKhju.hhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"cxl_internal_send_cmd (C function)c.cxl_internal_send_cmdhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hWint cxl_internal_send_cmd (struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd)h]j.)}(hVint cxl_internal_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd)h](j4)}(hinth]hint}(hjehhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjahhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKubjF)}(h h]h }(hjthhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjahhhjshKubjW)}(hcxl_internal_send_cmdh]j])}(hcxl_internal_send_cmdh]hcxl_internal_send_cmd}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjahhhjshKubjv)}(h=(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd)h](j|)}(hstruct cxl_mailbox *cxl_mboxh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_mailboxh]h cxl_mailbox}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj§modnameN classnameNjj)}j]j)}jjsbc.cxl_internal_send_cmdasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxl_mboxh]hcxl_mbox}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_mbox_cmd *mbox_cmdh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hj!hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_mbox_cmdh]h cxl_mbox_cmd}(hj2hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj/ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj4modnameN classnameNjj)}j]jܧc.cxl_internal_send_cmdasbuh1hhjubjF)}(h h]h }(hjPhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmbox_cmdh]hmbox_cmd}(hjkhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjahhhjshKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj]hhhjshKubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1j'hjshKhjZhhubj)}(hhh]j])}(h3Kernel internal interface to send a mailbox commandh]h3Kernel internal interface to send a mailbox command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshKubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_mailbox *cxl_mbox`` CXL mailbox context ``struct cxl_mbox_cmd *mbox_cmd`` initialized command to execute **Context** Any context. **Return** * %>=0 - Number of bytes returned in **out**. * ``-E2BIG`` - Payload is too large for hardware. * ``-EBUSY`` - Couldn't acquire exclusive mailbox access. * ``-EFAULT`` - Hardware error occurred. * ``-ENXIO`` - Command completed, but device reported an error. * ``-EIO`` - Unexpected output size. **Description** Mailbox commands may execute successfully yet the device itself reported an error. While this distinction can be useful for commands from userspace, the kernel will only be able to use results when both are successful.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubjo)}(hhh](jt)}(h5``struct cxl_mailbox *cxl_mbox`` CXL mailbox context h](jz)}(h ``struct cxl_mailbox *cxl_mbox``h]j)}(hj֨h]hstruct cxl_mailbox *cxl_mbox}(hjبhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԨubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjШubj)}(hhh]j])}(hCXL mailbox contexth]hCXL mailbox context}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjШubeh}(h]h ]h"]h$]h&]uh1jshjhKhjͨubjt)}(hA``struct cxl_mbox_cmd *mbox_cmd`` initialized command to execute h](jz)}(h!``struct cxl_mbox_cmd *mbox_cmd``h]j)}(hjh]hstruct cxl_mbox_cmd *mbox_cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhj ubj)}(hhh]j])}(hinitialized command to executeh]hinitialized command to execute}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj$hKhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj$hKhjͨubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Context**h]j)}(hjJh]hContext}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubj])}(h Any context.h]h Any context.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubj])}(h **Return**h]j)}(hjqh]hReturn}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubj)}(hhh](j)}(h0%>=0 - Number of bytes returned in **out**.h]j])}(hjh](h(%>=0 - Number of bytes returned in }(hjhhhNhNubj)}(h**out**h]hout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h1``-E2BIG`` - Payload is too large for hardware.h]j])}(hjh](j)}(h ``-E2BIG``h]h-E2BIG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh' - Payload is too large for hardware.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h9``-EBUSY`` - Couldn't acquire exclusive mailbox access.h]j])}(hjܩh](j)}(h ``-EBUSY``h]h-EBUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjީubh1 - Couldn’t acquire exclusive mailbox access.}(hjީhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjکubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h'``-EFAULT`` - Hardware error occurred.h]j])}(hjh](j)}(h ``-EFAULT``h]h-EFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - Hardware error occurred.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h?``-ENXIO`` - Command completed, but device reported an error.h]j])}(hj(h](j)}(h ``-ENXIO``h]h-ENXIO}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh5 - Command completed, but device reported an error.}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhj&ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h'``-EIO`` - Unexpected output size. h]j])}(h&``-EIO`` - Unexpected output size.h](j)}(h``-EIO``h]h-EIO}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh - Unexpected output size.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjLubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjubj])}(h**Description**h]j)}(hj{h]h Description}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubj])}(hMailbox commands may execute successfully yet the device itself reported an error. While this distinction can be useful for commands from userspace, the kernel will only be able to use results when both are successful.h]hMailbox commands may execute successfully yet the device itself reported an error. While this distinction can be useful for commands from userspace, the kernel will only be able to use results when both are successful.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j*cxl_payload_from_user_allowed (C function)c.cxl_payload_from_user_allowedhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hAbool cxl_payload_from_user_allowed (u16 opcode, void *payload_in)h]j.)}(h@bool cxl_payload_from_user_allowed(u16 opcode, void *payload_in)h](j4)}(hj^h]hbool}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM7ubjF)}(h h]h }(hjΪhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjͪhM7ubjW)}(hcxl_payload_from_user_allowedh]j])}(hcxl_payload_from_user_allowedh]hcxl_payload_from_user_allowed}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjܪubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjͪhM7ubjv)}(h(u16 opcode, void *payload_in)h](j|)}(h u16 opcodeh](h)}(hhh]j])}(hu16h]hu16}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.cxl_payload_from_user_allowedasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(hopcodeh]hopcode}(hj-hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hvoid *payload_inh](j4)}(hvoidh]hvoid}(hjFhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjBubjF)}(h h]h }(hjThhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjBubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubj])}(h payload_inh]h payload_in}(hjohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjBubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhjͪhM7ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjͪhM7ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjͪhM7hjhhubj)}(hhh]j])}(hCheck contents of in_payload.h]hCheck contents of in_payload.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM7hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjͪhM7ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``u16 opcode`` The mailbox command opcode. ``void *payload_in`` Pointer to the input payload passed in from user space. **Return** * true - payload_in passes check for **opcode**. * false - payload_in contains invalid or unsupported values. **Description** The driver may inspect payload contents before sending a mailbox command from user space to the device. The intent is to reject commands with input payloads that are known to be unsafe. This check is not intended to replace the users careful selection of mailbox command parameters and makes no guarantee that the user command will succeed, nor that it is appropriate. The specific checks are determined by the opcode.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM;hjubjo)}(hhh](jt)}(h+``u16 opcode`` The mailbox command opcode. h](jz)}(h``u16 opcode``h]j)}(hjګh]h u16 opcode}(hjܫhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjثubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM8hjԫubj)}(hhh]j])}(hThe mailbox command opcode.h]hThe mailbox command opcode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM8hjubah}(h]h ]h"]h$]h&]uh1jhjԫubeh}(h]h ]h"]h$]h&]uh1jshjhM8hjѫubjt)}(hM``void *payload_in`` Pointer to the input payload passed in from user space. h](jz)}(h``void *payload_in``h]j)}(hjh]hvoid *payload_in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM9hj ubj)}(hhh]j])}(h7Pointer to the input payload passed in from user space.h]h7Pointer to the input payload passed in from user space.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj(hM9hj)ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj(hM9hjѫubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Return**h]j)}(hjNh]hReturn}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM;hjubj)}(hhh](j)}(h3true - payload_in passes check for **opcode**.h]j])}(hjih](h(true - payload_in passes check for }(hjkhhhNhNubj)}(h **opcode**h]hopcode}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubh.}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM;hjgubah}(h]h ]h"]h$]h&]uh1jhjdubj)}(h?false - payload_in contains invalid or unsupported values. h]j])}(h>false - payload_in contains invalid or unsupported values.h]h>false - payload_in contains invalid or unsupported values.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM<hjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]jjuh1jhjhM;hjubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM>hjubj])}(hXpThe driver may inspect payload contents before sending a mailbox command from user space to the device. The intent is to reject commands with input payloads that are known to be unsafe. This check is not intended to replace the users careful selection of mailbox command parameters and makes no guarantee that the user command will succeed, nor that it is appropriate.h]hXpThe driver may inspect payload contents before sending a mailbox command from user space to the device. The intent is to reject commands with input payloads that are known to be unsafe. This check is not intended to replace the users careful selection of mailbox command parameters and makes no guarantee that the user command will succeed, nor that it is appropriate.}(hjȬhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM>hjubj])}(h1The specific checks are determined by the opcode.h]h1The specific checks are determined by the opcode.}(hj׬hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMEhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'cxl_validate_cmd_from_user (C function)c.cxl_validate_cmd_from_userhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hint cxl_validate_cmd_from_user (struct cxl_mbox_cmd *mbox_cmd, struct cxl_mailbox *cxl_mbox, const struct cxl_send_command *send_cmd)h]j.)}(hint cxl_validate_cmd_from_user(struct cxl_mbox_cmd *mbox_cmd, struct cxl_mailbox *cxl_mbox, const struct cxl_send_command *send_cmd)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMubjW)}(hcxl_validate_cmd_from_userh]j])}(hcxl_validate_cmd_from_userh]hcxl_validate_cmd_from_user}(hj'hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj#ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMubjv)}(hf(struct cxl_mbox_cmd *mbox_cmd, struct cxl_mailbox *cxl_mbox, const struct cxl_send_command *send_cmd)h](j|)}(hstruct cxl_mbox_cmd *mbox_cmdh](j)}(hjh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubjF)}(h h]h }(hjPhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj?ubh)}(hhh]j])}(h cxl_mbox_cmdh]h cxl_mbox_cmd}(hjahhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj^ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjcmodnameN classnameNjj)}j]j)}jj)sbc.cxl_validate_cmd_from_userasbuh1hhj?ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj?ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubj])}(hmbox_cmdh]hmbox_cmd}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj?ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj;ubj|)}(hstruct cxl_mailbox *cxl_mboxh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hj­hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_mailboxh]h cxl_mailbox}(hjӭhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjЭubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjխmodnameN classnameNjj)}j]j}c.cxl_validate_cmd_from_userasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxl_mboxh]hcxl_mbox}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj;ubj|)}(h'const struct cxl_send_command *send_cmdh](j)}(hjUh]hconst}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF)}(h h]h }(hj2hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubj)}(hjh]hstruct}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubjF)}(h h]h }(hjMhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubh)}(hhh]j])}(hcxl_send_commandh]hcxl_send_command}(hj^hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj[ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj`modnameN classnameNjj)}j]j}c.cxl_validate_cmd_from_userasbuh1hhj!ubjF)}(h h]h }(hj|hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj!ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj])}(hsend_cmdh]hsend_cmd}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj;ubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhjhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhMhjhhubj)}(hhh]j])}(h&Check fields for CXL_MEM_SEND_COMMAND.h]h&Check fields for CXL_MEM_SEND_COMMAND.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjٮjjٮjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_mbox_cmd *mbox_cmd`` Sanitized and populated :c:type:`struct cxl_mbox_cmd `. ``struct cxl_mailbox *cxl_mbox`` CXL mailbox context ``const struct cxl_send_command *send_cmd`` :c:type:`struct cxl_send_command ` copied in from userspace. **Return** * ``0`` - **out_cmd** is ready to send. * ``-ENOTTY`` - Invalid command specified. * ``-EINVAL`` - Reserved fields or invalid values were used. * ``-ENOMEM`` - Input or output buffer wasn't sized properly. * ``-EPERM`` - Attempted to use a protected command. * ``-EBUSY`` - Kernel has claimed exclusive access to this opcode **Description** The result of this command is a fully validated command in **mbox_cmd** that is safe to send to the hardware.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjݮubjo)}(hhh](jt)}(hh``struct cxl_mbox_cmd *mbox_cmd`` Sanitized and populated :c:type:`struct cxl_mbox_cmd `. h](jz)}(h!``struct cxl_mbox_cmd *mbox_cmd``h]j)}(hjh]hstruct cxl_mbox_cmd *mbox_cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubj)}(hhh]j])}(hESanitized and populated :c:type:`struct cxl_mbox_cmd `.h](hSanitized and populated }(hjhhhNhNubh)}(h,:c:type:`struct cxl_mbox_cmd `h]j)}(hj%h]hstruct cxl_mbox_cmd}(hj'hhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]refdoc"driver-api/cxl/theory-of-operation refdomainjreftypetype refexplicitrefwarnjj)}j]sb reftarget cxl_mbox_cmduh1hhjhMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubjt)}(h5``struct cxl_mailbox *cxl_mbox`` CXL mailbox context h](jz)}(h ``struct cxl_mailbox *cxl_mbox``h]j)}(hjdh]hstruct cxl_mailbox *cxl_mbox}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhj^ubj)}(hhh]j])}(hCXL mailbox contexth]hCXL mailbox context}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjyhMhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jshjyhMhjubjt)}(h{``const struct cxl_send_command *send_cmd`` :c:type:`struct cxl_send_command ` copied in from userspace. h](jz)}(h+``const struct cxl_send_command *send_cmd``h]j)}(hjh]h'const struct cxl_send_command *send_cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubj)}(hhh]j])}(hN:c:type:`struct cxl_send_command ` copied in from userspace.h](h)}(h4:c:type:`struct cxl_send_command `h]j)}(hjh]hstruct cxl_send_command}(hjhhhNhNubah}(h]h ](j1jc-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj= refdomainjreftypetype refexplicitrefwarnjjCjFcxl_send_commanduh1hhjhMhjubh copied in from userspace.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubeh}(h]h ]h"]h$]h&]uh1jnhjݮubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjݮubj)}(hhh](j)}(h,``0`` - **out_cmd** is ready to send.h]j])}(hjh](j)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh - }(hjhhhNhNubj)}(h **out_cmd**h]hout_cmd}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is ready to send.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h)``-ENOTTY`` - Invalid command specified.h]j])}(hjJh](j)}(h ``-ENOTTY``h]h-ENOTTY}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh - Invalid command specified.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjHubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h;``-EINVAL`` - Reserved fields or invalid values were used.h]j])}(hjph](j)}(h ``-EINVAL``h]h-EINVAL}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubh0 - Reserved fields or invalid values were used.}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjnubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h<``-ENOMEM`` - Input or output buffer wasn't sized properly.h]j])}(hjh](j)}(h ``-ENOMEM``h]h-ENOMEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh3 - Input or output buffer wasn’t sized properly.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h4``-EPERM`` - Attempted to use a protected command.h]j])}(hjh](j)}(h ``-EPERM``h]h-EPERM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh* - Attempted to use a protected command.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hB``-EBUSY`` - Kernel has claimed exclusive access to this opcode h]j])}(hA``-EBUSY`` - Kernel has claimed exclusive access to this opcodeh](j)}(h ``-EBUSY``h]h-EBUSY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh7 - Kernel has claimed exclusive access to this opcode}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjAhMhjݮubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjݮubj])}(hmThe result of this command is a fully validated command in **mbox_cmd** that is safe to send to the hardware.h](h;The result of this command is a fully validated command in }(hj%hhhNhNubj)}(h **mbox_cmd**h]hmbox_cmd}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh& that is safe to send to the hardware.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjݮubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)handle_mailbox_cmd_from_user (C function)c.handle_mailbox_cmd_from_userhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hint handle_mailbox_cmd_from_user (struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd, u64 out_payload, s32 *size_out, u32 *retval)h]j.)}(hint handle_mailbox_cmd_from_user(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd, u64 out_payload, s32 *size_out, u32 *retval)h](j4)}(hinth]hint}(hjfhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjbhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM7ubjF)}(h h]h }(hjuhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjbhhhjthM7ubjW)}(hhandle_mailbox_cmd_from_userh]j])}(hhandle_mailbox_cmd_from_userh]hhandle_mailbox_cmd_from_user}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjbhhhjthM7ubjv)}(hj(struct cxl_mailbox *cxl_mbox, struct cxl_mbox_cmd *mbox_cmd, u64 out_payload, s32 *size_out, u32 *retval)h](j|)}(hstruct cxl_mailbox *cxl_mboxh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_mailboxh]h cxl_mailbox}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjñmodnameN classnameNjj)}j]j)}jjsbc.handle_mailbox_cmd_from_userasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxl_mboxh]hcxl_mbox}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hstruct cxl_mbox_cmd *mbox_cmdh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_mbox_cmdh]h cxl_mbox_cmd}(hj3hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj0ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj5modnameN classnameNjj)}j]jݱc.handle_mailbox_cmd_from_userasbuh1hhjubjF)}(h h]h }(hjQhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmbox_cmdh]hmbox_cmd}(hjlhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hu64 out_payloadh](h)}(hhh]j])}(hu64h]hu64}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jݱc.handle_mailbox_cmd_from_userasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(h out_payloadh]h out_payload}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(h s32 *size_outh](h)}(hhh]j])}(hs32h]hs32}(hjвhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjͲubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjҲmodnameN classnameNjj)}j]jݱc.handle_mailbox_cmd_from_userasbuh1hhjɲubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjɲubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjɲubj])}(hsize_outh]hsize_out}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjɲubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(h u32 *retvalh](h)}(hhh]j])}(hu32h]hu32}(hj%hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjj)}j]jݱc.handle_mailbox_cmd_from_userasbuh1hhjubjF)}(h h]h }(hjChhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hretvalh]hretval}(hj^hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjbhhhjthM7ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj^hhhjthM7ubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1j'hjthM7hj[hhubj)}(hhh]j])}(h)Dispatch a mailbox command for userspace.h]h)Dispatch a mailbox command for userspace.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM7hjhhubah}(h]h ]h"]h$]h&]uh1jhj[hhhjthM7ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_mailbox *cxl_mbox`` The mailbox context for the operation. ``struct cxl_mbox_cmd *mbox_cmd`` The validated mailbox command. ``u64 out_payload`` Pointer to userspace's output payload. ``s32 *size_out`` (Input) Max payload size to copy out. (Output) Payload size hardware generated. ``u32 *retval`` Hardware generated return code from the operation. **Return** * ``0`` - Mailbox transaction succeeded. This implies the mailbox protocol completed successfully not that the operation itself was successful. * ``-ENOMEM`` - Couldn't allocate a bounce buffer. * ``-EFAULT`` - Something happened with copy_to/from_user. * ``-EINTR`` - Mailbox acquisition interrupted. * ``-EXXX`` - Transaction level failures. **Description** Dispatches a mailbox command on behalf of a userspace request. The output payload is copied to userspace. See cxl_send_cmd().h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM;hjubjo)}(hhh](jt)}(hH``struct cxl_mailbox *cxl_mbox`` The mailbox context for the operation. h](jz)}(h ``struct cxl_mailbox *cxl_mbox``h]j)}(hjɳh]hstruct cxl_mailbox *cxl_mbox}(hj˳hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdzubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM8hjóubj)}(hhh]j])}(h&The mailbox context for the operation.h]h&The mailbox context for the operation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj޳hM8hj߳ubah}(h]h ]h"]h$]h&]uh1jhjóubeh}(h]h ]h"]h$]h&]uh1jshj޳hM8hjubjt)}(hA``struct cxl_mbox_cmd *mbox_cmd`` The validated mailbox command. h](jz)}(h!``struct cxl_mbox_cmd *mbox_cmd``h]j)}(hjh]hstruct cxl_mbox_cmd *mbox_cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM9hjubj)}(hhh]j])}(hThe validated mailbox command.h]hThe validated mailbox command.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM9hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhM9hjubjt)}(h;``u64 out_payload`` Pointer to userspace's output payload. h](jz)}(h``u64 out_payload``h]j)}(hj;h]hu64 out_payload}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM:hj5ubj)}(hhh]j])}(h&Pointer to userspace's output payload.h]h(Pointer to userspace’s output payload.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjPhM:hjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jshjPhM:hjubjt)}(hb``s32 *size_out`` (Input) Max payload size to copy out. (Output) Payload size hardware generated. h](jz)}(h``s32 *size_out``h]j)}(hjth]h s32 *size_out}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM<hjnubj)}(hhh]j])}(hO(Input) Max payload size to copy out. (Output) Payload size hardware generated.h]hO(Input) Max payload size to copy out. (Output) Payload size hardware generated.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM;hjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jshjhM<hjubjt)}(hC``u32 *retval`` Hardware generated return code from the operation. h](jz)}(h``u32 *retval``h]j)}(hjh]h u32 *retval}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM=hjubj)}(hhh]j])}(h2Hardware generated return code from the operation.h]h2Hardware generated return code from the operation.}(hjǴhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjôhM=hjĴubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjôhM=hjubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM?hjubj)}(hhh](j)}(h``0`` - Mailbox transaction succeeded. This implies the mailbox protocol completed successfully not that the operation itself was successful.h]jo)}(hhh]jt)}(h``0`` - Mailbox transaction succeeded. This implies the mailbox protocol completed successfully not that the operation itself was successful.h](jz)}(hF``0`` - Mailbox transaction succeeded. This implies the mailboxh](j)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhA - Mailbox transaction succeeded. This implies the mailbox}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM@hj ubj)}(hhh]j])}(hMprotocol completed successfully not that the operation itself was successful.h]hMprotocol completed successfully not that the operation itself was successful.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj)hM@hj*ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jshj)hM@hjubah}(h]h ]h"]h$]h&]uh1jnhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h1``-ENOMEM`` - Couldn't allocate a bounce buffer.h]j])}(hjUh](j)}(h ``-ENOMEM``h]h-ENOMEM}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh( - Couldn’t allocate a bounce buffer.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMBhjSubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h9``-EFAULT`` - Something happened with copy_to/from_user.h]j])}(hj{h](j)}(h ``-EFAULT``h]h-EFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubh. - Something happened with copy_to/from_user.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMChjyubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h/``-EINTR`` - Mailbox acquisition interrupted.h]j])}(hjh](j)}(h ``-EINTR``h]h-EINTR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh% - Mailbox acquisition interrupted.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMDhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h+``-EXXX`` - Transaction level failures. h]j])}(h*``-EXXX`` - Transaction level failures.h](j)}(h ``-EXXX``h]h-EXXX}(hj͵hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjɵubh! - Transaction level failures.}(hjɵhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMEhjŵubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM?hjubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMGhjubj])}(hiDispatches a mailbox command on behalf of a userspace request. The output payload is copied to userspace.h]hiDispatches a mailbox command on behalf of a userspace request. The output payload is copied to userspace.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMGhjubj])}(hSee cxl_send_cmd().h]hSee cxl_send_cmd().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMJhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_walk_cel (C function)c.cxl_walk_celhNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hFvoid cxl_walk_cel (struct cxl_memdev_state *mds, size_t size, u8 *cel)h]j.)}(hEvoid cxl_walk_cel(struct cxl_memdev_state *mds, size_t size, u8 *cel)h](j4)}(hvoidh]hvoid}(hjIhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjEhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMubjF)}(h h]h }(hjXhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjEhhhjWhMubjW)}(h cxl_walk_celh]j])}(h cxl_walk_celh]h cxl_walk_cel}(hjjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjfubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjEhhhjWhMubjv)}(h4(struct cxl_memdev_state *mds, size_t size, u8 *cel)h](j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjlsbc.cxl_walk_celasbuh1hhjubjF)}(h h]h }(hjĶhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjҶhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmdsh]hmds}(hj߶hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj~ubj|)}(h size_t sizeh](h)}(hhh]j])}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_walk_celasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(hsizeh]hsize}(hj'hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj~ubj|)}(hu8 *celh](h)}(hhh]j])}(hu8h]hu8}(hjChhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j]jc.cxl_walk_celasbuh1hhj<ubjF)}(h h]h }(hjahhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj<ubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj])}(hcelh]hcel}(hj|hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hj~ubeh}(h]h ]h"]h$]h&]hhuh1juhjEhhhjWhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjAhhhjWhMubah}(h]j<ah ](jjeh"]h$]h&]jj)jhuh1j'hjWhMhj>hhubj)}(hhh]j])}(h%Walk through the Command Effects Log.h]h%Walk through the Command Effects Log.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj>hhhjWhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hXH**Parameters** ``struct cxl_memdev_state *mds`` The driver data for the operation ``size_t size`` Length of the Command Effects Log. ``u8 *cel`` CEL **Description** Iterate over each entry in the CEL and determine if the driver supports the command. If so, the command is enabled for the device and can be used later.h](j])}(h**Parameters**h]j)}(hjȷh]h Parameters}(hjʷhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƷubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhj·ubjo)}(hhh](jt)}(hC``struct cxl_memdev_state *mds`` The driver data for the operation h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hjh]hstruct cxl_memdev_state *mds}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubj)}(hhh]j])}(h!The driver data for the operationh]h!The driver data for the operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhj޷ubjt)}(h3``size_t size`` Length of the Command Effects Log. h](jz)}(h``size_t size``h]j)}(hj h]h size_t size}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubj)}(hhh]j])}(h"Length of the Command Effects Log.h]h"Length of the Command Effects Log.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj5hMhj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj5hMhj޷ubjt)}(h``u8 *cel`` CEL h](jz)}(h ``u8 *cel``h]j)}(hjYh]hu8 *cel}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjSubj)}(hhh]j])}(hCELh]hCEL}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjnhMhjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jshjnhMhj޷ubeh}(h]h ]h"]h$]h&]uh1jnhj·ubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhj·ubj])}(hIterate over each entry in the CEL and determine if the driver supports the command. If so, the command is enabled for the device and can be used later.h]hIterate over each entry in the CEL and determine if the driver supports the command. If so, the command is enabled for the device and can be used later.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhj·ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_enumerate_cmds (C function)c.cxl_enumerate_cmdshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h5int cxl_enumerate_cmds (struct cxl_memdev_state *mds)h]j.)}(h4int cxl_enumerate_cmds(struct cxl_memdev_state *mds)h](j4)}(hinth]hint}(hjٸhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjոhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM<ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjոhhhjhM<ubjW)}(hcxl_enumerate_cmdsh]j])}(hcxl_enumerate_cmdsh]hcxl_enumerate_cmds}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjոhhhjhM<ubjv)}(h(struct cxl_memdev_state *mds)h]j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hj#hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hj4hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj1ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]j)}jjsbc.cxl_enumerate_cmdsasbuh1hhjubjF)}(h h]h }(hjThhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmdsh]hmds}(hjohhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubah}(h]h ]h"]h$]h&]hhuh1juhjոhhhjhM<ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjѸhhhjhM<ubah}(h]j̸ah ](jjeh"]h$]h&]jj)jhuh1j'hjhM<hjθhhubj)}(hhh]j])}(h Enumerate commands for a device.h]h Enumerate commands for a device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM<hjhhubah}(h]h ]h"]h$]h&]uh1jhjθhhhjhM<ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hXM**Parameters** ``struct cxl_memdev_state *mds`` The driver data for the operation **Description** Returns 0 if enumerate completed successfully. CXL devices have optional support for certain commands. This function will determine the set of supported commands for the hardware and update the enabled_cmds bitmap in the **mds**.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM@hjubjo)}(hhh]jt)}(hC``struct cxl_memdev_state *mds`` The driver data for the operation h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hjڹh]hstruct cxl_memdev_state *mds}(hjܹhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjعubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM=hjԹubj)}(hhh]j])}(h!The driver data for the operationh]h!The driver data for the operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM=hjubah}(h]h ]h"]h$]h&]uh1jhjԹubeh}(h]h ]h"]h$]h&]uh1jshjhM=hjѹubah}(h]h ]h"]h$]h&]uh1jnhjubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM?hjubj])}(h.Returns 0 if enumerate completed successfully.h]h.Returns 0 if enumerate completed successfully.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM>hjubj])}(hCXL devices have optional support for certain commands. This function will determine the set of supported commands for the hardware and update the enabled_cmds bitmap in the **mds**.h](hCXL devices have optional support for certain commands. This function will determine the set of supported commands for the hardware and update the enabled_cmds bitmap in the }(hj:hhhNhNubj)}(h**mds**h]hmds}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM@hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&cxl_mem_get_event_records (C function)c.cxl_mem_get_event_recordshNtauh1jhju.hhhNhNubj#)}(hhh](j()}(hIvoid cxl_mem_get_event_records (struct cxl_memdev_state *mds, u32 status)h]j.)}(hHvoid cxl_mem_get_event_records(struct cxl_memdev_state *mds, u32 status)h](j4)}(hvoidh]hvoid}(hj{hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjwhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMVubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwhhhjhMVubjW)}(hcxl_mem_get_event_recordsh]j])}(hcxl_mem_get_event_recordsh]hcxl_mem_get_event_records}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjwhhhjhMVubjv)}(h*(struct cxl_memdev_state *mds, u32 status)h](j|)}(hstruct cxl_memdev_state *mdsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjźhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_memdev_stateh]hcxl_memdev_state}(hjֺhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjӺubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjغmodnameN classnameNjj)}j]j)}jjsbc.cxl_mem_get_event_recordsasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hmdsh]hmds}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(h u32 statush](h)}(hhh]j])}(hu32h]hu32}(hj-hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj/modnameN classnameNjj)}j]jc.cxl_mem_get_event_recordsasbuh1hhj&ubjF)}(h h]h }(hjKhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj&ubj])}(hstatush]hstatus}(hjYhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjwhhhjhMVubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjshhhjhMVubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1j'hjhMVhjphhubj)}(hhh]j])}(h!Get Event Records from the deviceh]h!Get Event Records from the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMVhjhhubah}(h]h ]h"]h$]h&]uh1jhjphhhjhMVubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhju.hNhNubj)}(hX**Parameters** ``struct cxl_memdev_state *mds`` The driver data for the operation ``u32 status`` Event Status register value identifying which events are available. **Description** Retrieve all event records available on the device, report them as trace events, and clear them. See CXL rev 3.0 **8.2.9.2.2** Get Event Records See CXL rev 3.0 **8.2.9.2.3** Clear Event Recordsh](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMZhjubjo)}(hhh](jt)}(hC``struct cxl_memdev_state *mds`` The driver data for the operation h](jz)}(h ``struct cxl_memdev_state *mds``h]j)}(hjĻh]hstruct cxl_memdev_state *mds}(hjƻhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj»ubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMWhjubj)}(hhh]j])}(h!The driver data for the operationh]h!The driver data for the operation}(hjݻhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjٻhMWhjڻubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjٻhMWhjubjt)}(hS``u32 status`` Event Status register value identifying which events are available. h](jz)}(h``u32 status``h]j)}(hjh]h u32 status}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMXhjubj)}(hhh]j])}(hCEvent Status register value identifying which events are available.h]hCEvent Status register value identifying which events are available.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMXhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMXhjubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h**Description**h]j)}(hj8h]h Description}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMZhjubj])}(h`Retrieve all event records available on the device, report them as trace events, and clear them.h]h`Retrieve all event records available on the device, report them as trace events, and clear them.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMYhjubj])}(haSee CXL rev 3.0 **8.2.9.2.2** Get Event Records See CXL rev 3.0 **8.2.9.2.3** Clear Event Recordsh](hSee CXL rev 3.0 }(hj]hhhNhNubj)}(h **8.2.9.2.2**h]h 8.2.9.2.2}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubh# Get Event Records See CXL rev 3.0 }(hj]hhhNhNubj)}(h **8.2.9.2.3**h]h 8.2.9.2.3}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubh Clear Event Records}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chM\hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'cxl_mem_get_partition_info (C function)c.cxl_mem_get_partition_infohNtauh1jhju.hhhNhNubj#)}(hhh](j()}(h=int cxl_mem_get_partition_info (struct cxl_memdev_state *mds)h]j.)}(hubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhj/hMubjv)}(h#(struct cxl_memdev *cxlmd, u16 cmd)h](j|)}(hstruct cxl_memdev *cxlmdh](j)}(hjh]hstruct}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubjF)}(h h]h }(hjkhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjZubh)}(hhh]j])}(h cxl_memdevh]h cxl_memdev}(hj|hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjyubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj~modnameN classnameNjj)}j]j)}jjDsbc.cxl_mem_sanitizeasbuh1hhjZubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjZubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj])}(hcxlmdh]hcxlmd}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjZubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjVubj|)}(hu16 cmdh](h)}(hhh]j])}(hu16h]hu16}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.cxl_mem_sanitizeasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(hcmdh]hcmd}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjVubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhj/hMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhj/hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hj/hMhjhhubj)}(hhh]j])}(h*Send a sanitization command to the device.h]h*Send a sanitization command to the device.}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhj&hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj/hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjAjjAjjjuh1j"hhhju.hNhNubj)}(hXF**Parameters** ``struct cxl_memdev *cxlmd`` The device for the operation ``u16 cmd`` The specific sanitization command opcode **Return** 0 if the command was executed successfully, regardless of whether or not the actual security operation is done in the background, such as for the Sanitize case. Error return values can be the result of the mailbox command, -EINVAL when security requirements are not met or invalid contexts, or -EBUSY if the sanitize operation is already in flight. **Description** See CXL 3.0 **8.2.9.8.5.1** Sanitize and **8.2.9.8.5.2** Secure Erase.h](j])}(h**Parameters**h]j)}(hjKh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjEubjo)}(hhh](jt)}(h:``struct cxl_memdev *cxlmd`` The device for the operation h](jz)}(h``struct cxl_memdev *cxlmd``h]j)}(hjjh]hstruct cxl_memdev *cxlmd}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjdubj)}(hhh]j])}(hThe device for the operationh]hThe device for the operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jshjhMhjaubjt)}(h5``u16 cmd`` The specific sanitization command opcode h](jz)}(h ``u16 cmd``h]j)}(hjh]hu16 cmd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjubj)}(hhh]j])}(h(The specific sanitization command opcodeh]h(The specific sanitization command opcode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjaubeh}(h]h ]h"]h$]h&]uh1jnhjEubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjEubj])}(hX\0 if the command was executed successfully, regardless of whether or not the actual security operation is done in the background, such as for the Sanitize case. Error return values can be the result of the mailbox command, -EINVAL when security requirements are not met or invalid contexts, or -EBUSY if the sanitize operation is already in flight.h]hX\0 if the command was executed successfully, regardless of whether or not the actual security operation is done in the background, such as for the Sanitize case. Error return values can be the result of the mailbox command, -EINVAL when security requirements are not met or invalid contexts, or -EBUSY if the sanitize operation is already in flight.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjEubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjEubj])}(hFSee CXL 3.0 **8.2.9.8.5.1** Sanitize and **8.2.9.8.5.2** Secure Erase.h](h See CXL 3.0 }(hjhhhNhNubj)}(h**8.2.9.8.5.1**h]h 8.2.9.8.5.1}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh Sanitize and }(hjhhhNhNubj)}(h**8.2.9.8.5.2**h]h 8.2.9.8.5.2}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh Secure Erase.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hk/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:475: ./drivers/cxl/core/mbox.chMhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhju.hhhNhNubj])}(hCXL Features: A CXL device that includes a mailbox supports commands that allows listing, getting, and setting of optionally defined features such as memory sparing or post package sparing. Vendors may define custom features for the device.h]hCXL Features: A CXL device that includes a mailbox supports commands that allows listing, getting, and setting of optionally defined features such as memory sparing or post package sparing. Vendors may define custom features for the device.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j\ho/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:478: ./drivers/cxl/core/features.chK hju.hhubj])}(h6See :c:func:`devm_cxl_setup_features` for API details.h](hSee }(hjdhhhNhNubh)}(h!:c:func:`devm_cxl_setup_features`h]j)}(hjnh]hdevm_cxl_setup_features()}(hjphhhNhNubah}(h]h ](j1jc-funceh"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]refdocj= refdomainjreftypefunc refexplicitrefwarnjjCjFdevm_cxl_setup_featuresuh1hhhhMhjdubh for API details.}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hhhMhju.hhubeh}(h]cxl-coreah ]h"]cxl coreah$]h&]uh1jGhj/hhhhhMWubjH)}(hhh](jM)}(h CXL Regionsh]h CXL Regions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhMubj])}(hX<CXL Regions represent mapped memory capacity in system physical address space. Whereas the CXL Root Decoders identify the bounds of potential CXL Memory ranges, Regions represent the active mapped capacity by the HDM Decoder Capability structures throughout the Host Bridges, Switches, and Endpoints in the topology.h]hX<CXL Regions represent mapped memory capacity in system physical address space. Whereas the CXL Root Decoders identify the bounds of potential CXL Memory ranges, Regions represent the active mapped capacity by the HDM Decoder Capability structures throughout the Host Bridges, Switches, and Endpoints in the topology.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:485: ./drivers/cxl/core/region.chKhjhhubj])}(hRegion configuration has ordering constraints. UUID may be set at any time but is only visible for persistent regions. 1. Interleave granularity 2. Interleave size 3. Decoder targetsh]hRegion configuration has ordering constraints. UUID may be set at any time but is only visible for persistent regions. 1. Interleave granularity 2. Interleave size 3. Decoder targets}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:485: ./drivers/cxl/core/region.chKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)cxl_port_pick_region_decoder (C function)c.cxl_port_pick_region_decoderhNtauh1jhjhhhNhNubj#)}(hhh](j()}(hstruct cxl_decoder * cxl_port_pick_region_decoder (struct cxl_port *port, struct cxl_endpoint_decoder *cxled, struct cxl_region *cxlr)h]j.)}(hstruct cxl_decoder *cxl_port_pick_region_decoder(struct cxl_port *port, struct cxl_endpoint_decoder *cxled, struct cxl_region *cxlr)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMcubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMcubh)}(hhh]j])}(h cxl_decoderh]h cxl_decoder}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jcxl_port_pick_region_decodersbc.cxl_port_pick_region_decoderasbuh1hhjhhhjhMcubjF)}(h h]h }(hj%hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMcubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMcubjW)}(hcxl_port_pick_region_decoderh]j])}(hj"h]hcxl_port_pick_region_decoder}(hjDhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj@ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMcubjv)}(hT(struct cxl_port *port, struct cxl_endpoint_decoder *cxled, struct cxl_region *cxlr)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubjF)}(h h]h }(hjlhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj[ubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hj}hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjzubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.cxl_port_pick_region_decoderasbuh1hhj[ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj[ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[ubj])}(hporth]hport}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj[ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjWubj|)}(h"struct cxl_endpoint_decoder *cxledh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_endpoint_decoderh]hcxl_endpoint_decoder}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j c.cxl_port_pick_region_decoderasbuh1hhjubjF)}(h h]h }(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxledh]hcxled}(hj&hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjWubj|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubjF)}(h h]h }(hjLhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj;ubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hj]hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjZubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj_modnameN classnameNjj)}j]j c.cxl_port_pick_region_decoderasbuh1hhj;ubjF)}(h h]h }(hj{hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj;ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubj])}(hcxlrh]hcxlr}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj;ubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjWubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhjhMcubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMcubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhMchjhhubj)}(hhh]j])}(h'assign or lookup a decoder for a regionh]h'assign or lookup a decoder for a region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMchjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMcubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhjhNhNubj)}(hX?**Parameters** ``struct cxl_port *port`` a port in the ancestry of the endpoint implied by **cxled** ``struct cxl_endpoint_decoder *cxled`` endpoint decoder to be, or currently, mapped by **port** ``struct cxl_region *cxlr`` region to establish, or validate, decode **port** **Description** In the region creation path cxl_port_pick_region_decoder() is an allocator to find a free port. In the region assembly path, it is recalling the decoder that platform firmware picked for validation purposes. The result is recorded in a 'struct cxl_region_ref' in **port**.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMghjubjo)}(hhh](jt)}(hV``struct cxl_port *port`` a port in the ancestry of the endpoint implied by **cxled** h](jz)}(h``struct cxl_port *port``h]j)}(hjh]hstruct cxl_port *port}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMdhjubj)}(hhh]j])}(h;a port in the ancestry of the endpoint implied by **cxled**h](h2a port in the ancestry of the endpoint implied by }(hjhhhNhNubj)}(h **cxled**h]hcxled}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j\hjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMdhjubjt)}(h```struct cxl_endpoint_decoder *cxled`` endpoint decoder to be, or currently, mapped by **port** h](jz)}(h&``struct cxl_endpoint_decoder *cxled``h]j)}(hjHh]h"struct cxl_endpoint_decoder *cxled}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMehjBubj)}(hhh]j])}(h8endpoint decoder to be, or currently, mapped by **port**h](h0endpoint decoder to be, or currently, mapped by }(hjahhhNhNubj)}(h**port**h]hport}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1j\hj]hMehj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jshj]hMehjubjt)}(hN``struct cxl_region *cxlr`` region to establish, or validate, decode **port** h](jz)}(h``struct cxl_region *cxlr``h]j)}(hjh]hstruct cxl_region *cxlr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMfhjubj)}(hhh]j])}(h1region to establish, or validate, decode **port**h](h)region to establish, or validate, decode }(hjhhhNhNubj)}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j\hjhMfhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMfhjubeh}(h]h ]h"]h$]h&]uh1jnhjubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMhhjubj])}(hIn the region creation path cxl_port_pick_region_decoder() is an allocator to find a free port. In the region assembly path, it is recalling the decoder that platform firmware picked for validation purposes.h]hIn the region creation path cxl_port_pick_region_decoder() is an allocator to find a free port. In the region assembly path, it is recalling the decoder that platform firmware picked for validation purposes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMghjubj])}(h@The result is recorded in a 'struct cxl_region_ref' in **port**.h](h;The result is recorded in a ‘struct cxl_region_ref’ in }(hjhhhNhNubj)}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMlhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#cxl_port_attach_region (C function)c.cxl_port_attach_regionhNtauh1jhjhhhNhNubj#)}(hhh](j()}(hxint cxl_port_attach_region (struct cxl_port *port, struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, int pos)h]j.)}(hwint cxl_port_attach_region(struct cxl_port *port, struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, int pos)h](j4)}(hinth]hint}(hj>hhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hj:hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMubjF)}(h h]h }(hjMhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj:hhhjLhMubjW)}(hcxl_port_attach_regionh]j])}(hcxl_port_attach_regionh]hcxl_port_attach_region}(hj_hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj[ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhj:hhhjLhMubjv)}(h](struct cxl_port *port, struct cxl_region *cxlr, struct cxl_endpoint_decoder *cxled, int pos)h](j|)}(hstruct cxl_port *porth](j)}(hjh]hstruct}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwubh)}(hhh]j])}(hcxl_porth]hcxl_port}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjasbc.cxl_port_attach_regionasbuh1hhjwubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjwubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj])}(hporth]hport}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjwubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjsubj|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]jc.cxl_port_attach_regionasbuh1hhjubjF)}(h h]h }(hj)hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxlrh]hcxlr}(hjDhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjsubj|)}(h"struct cxl_endpoint_decoder *cxledh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubjF)}(h h]h }(hjjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjYubh)}(hhh]j])}(hcxl_endpoint_decoderh]hcxl_endpoint_decoder}(hj{hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjxubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj}modnameN classnameNjj)}j]jc.cxl_port_attach_regionasbuh1hhjYubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjYubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj])}(hcxledh]hcxled}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjYubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjsubj|)}(hint posh](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(hposh]hpos}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjsubeh}(h]h ]h"]h$]h&]hhuh1juhj:hhhjLhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hj6hhhjLhMubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1j'hjLhMhj3hhubj)}(hhh]j])}(h/track a region's interest in a port by endpointh]h1track a region’s interest in a port by endpoint}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj3hhhjLhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+jjjuh1j"hhhjhNhNubj)}(hX**Parameters** ``struct cxl_port *port`` port to add a new region reference 'struct cxl_region_ref' ``struct cxl_region *cxlr`` region to attach to **port** ``struct cxl_endpoint_decoder *cxled`` endpoint decoder used to create or further pin a region reference ``int pos`` interleave position of **cxled** in **cxlr** **Description** The attach event is an opportunity to validate CXL decode setup constraints and record metadata needed for programming HDM decoders, in particular decoder target lists. The steps are: - validate that there are no other regions with a higher HPA already associated with **port** - establish a region reference if one is not already present - additionally allocate a decoder instance that will host **cxlr** on **port** - pin the region reference by the endpoint - account for how many entries in **port**'s target list are needed to cover all of the added endpoints.h](j])}(h**Parameters**h]j)}(hj5h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM#hj/ubjo)}(hhh](jt)}(hU``struct cxl_port *port`` port to add a new region reference 'struct cxl_region_ref' h](jz)}(h``struct cxl_port *port``h]j)}(hjTh]hstruct cxl_port *port}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hjNubj)}(hhh]j])}(h:port to add a new region reference 'struct cxl_region_ref'h]h>port to add a new region reference ‘struct cxl_region_ref’}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjihM hjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jshjihM hjKubjt)}(h9``struct cxl_region *cxlr`` region to attach to **port** h](jz)}(h``struct cxl_region *cxlr``h]j)}(hjh]hstruct cxl_region *cxlr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM!hjubj)}(hhh]j])}(hregion to attach to **port**h](hregion to attach to }(hjhhhNhNubj)}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j\hjhM!hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhM!hjKubjt)}(hi``struct cxl_endpoint_decoder *cxled`` endpoint decoder used to create or further pin a region reference h](jz)}(h&``struct cxl_endpoint_decoder *cxled``h]j)}(hjh]h"struct cxl_endpoint_decoder *cxled}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM"hjubj)}(hhh]j])}(hAendpoint decoder used to create or further pin a region referenceh]hAendpoint decoder used to create or further pin a region reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM"hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhM"hjKubjt)}(h9``int pos`` interleave position of **cxled** in **cxlr** h](jz)}(h ``int pos``h]j)}(hj h]hint pos}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM#hjubj)}(hhh]j])}(h,interleave position of **cxled** in **cxlr**h](hinterleave position of }(hj&hhhNhNubj)}(h **cxled**h]hcxled}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh in }(hj&hhhNhNubj)}(h**cxlr**h]hcxlr}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1j\hj"hM#hj#ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj"hM#hjKubeh}(h]h ]h"]h$]h&]uh1jnhj/ubj])}(h**Description**h]j)}(hjhh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM%hj/ubj])}(hThe attach event is an opportunity to validate CXL decode setup constraints and record metadata needed for programming HDM decoders, in particular decoder target lists.h]hThe attach event is an opportunity to validate CXL decode setup constraints and record metadata needed for programming HDM decoders, in particular decoder target lists.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM$hj/ubj])}(hThe steps are:h]hThe steps are:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM(hj/ubj)}(hhh](j)}(h[validate that there are no other regions with a higher HPA already associated with **port**h]j])}(h[validate that there are no other regions with a higher HPA already associated with **port**h](hSvalidate that there are no other regions with a higher HPA already associated with }(hjhhhNhNubj)}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM*hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hestablish a region reference if one is not already present - additionally allocate a decoder instance that will host **cxlr** on **port** h](j])}(h:establish a region reference if one is not already presenth]h:establish a region reference if one is not already present}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM,hjubj)}(hhh]j)}(hMadditionally allocate a decoder instance that will host **cxlr** on **port** h]j])}(hLadditionally allocate a decoder instance that will host **cxlr** on **port**h](h8additionally allocate a decoder instance that will host }(hjhhhNhNubj)}(h**cxlr**h]hcxlr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on }(hjhhhNhNubj)}(h**port**h]hport}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM.hjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]jjuh1jhjhM.hjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(h(pin the region reference by the endpointh]j])}(hj#h]h(pin the region reference by the endpoint}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM1hj!ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hfaccount for how many entries in **port**'s target list are needed to cover all of the added endpoints.h]j])}(hfaccount for how many entries in **port**'s target list are needed to cover all of the added endpoints.h](h account for how many entries in }(hj=hhhNhNubj)}(h**port**h]hport}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh@’s target list are needed to cover all of the added endpoints.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM2hj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhM*hj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$cxl_calc_interleave_pos (C function)c.cxl_calc_interleave_poshNtauh1jhjhhhNhNubj#)}(hhh](j()}(h@int cxl_calc_interleave_pos (struct cxl_endpoint_decoder *cxled)h]j.)}(h?int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhMubjW)}(hcxl_calc_interleave_posh]j])}(hcxl_calc_interleave_posh]hcxl_calc_interleave_pos}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhMubjv)}(h$(struct cxl_endpoint_decoder *cxled)h]j|)}(h"struct cxl_endpoint_decoder *cxledh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_endpoint_decoderh]hcxl_endpoint_decoder}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.cxl_calc_interleave_posasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxledh]hcxled}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubah}(h]h ]h"]h$]h&]hhuh1juhjhhhjhMubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhMubah}(h]j}ah ](jjeh"]h$]h&]jj)jhuh1j'hjhMhjhhubj)}(hhh]j])}(h*calculate an endpoint position in a regionh]h*calculate an endpoint position in a region}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMhjGhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjbjjbjjjuh1j"hhhjhNhNubj)}(hX**Parameters** ``struct cxl_endpoint_decoder *cxled`` endpoint decoder member of given region **Description** The endpoint position is calculated by traversing the topology from the endpoint to the root decoder and iteratively applying this calculation: position = position * parent_ways + parent_pos; ...where **position** is inferred from switch and root decoder target lists. **Return** position >= 0 on success -ENXIO on failureh](j])}(h**Parameters**h]j)}(hjlh]h Parameters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM"hjfubjo)}(hhh]jt)}(hO``struct cxl_endpoint_decoder *cxled`` endpoint decoder member of given region h](jz)}(h&``struct cxl_endpoint_decoder *cxled``h]j)}(hjh]h"struct cxl_endpoint_decoder *cxled}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMhjubj)}(hhh]j])}(h'endpoint decoder member of given regionh]h'endpoint decoder member of given region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhMhjubah}(h]h ]h"]h$]h&]uh1jnhjfubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM!hjfubj])}(hThe endpoint position is calculated by traversing the topology from the endpoint to the root decoder and iteratively applying this calculation:h]hThe endpoint position is calculated by traversing the topology from the endpoint to the root decoder and iteratively applying this calculation:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hjfubj!)}(h0position = position * parent_ways + parent_pos; h]j])}(h/position = position * parent_ways + parent_pos;h]h/position = position * parent_ways + parent_pos;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM$hjubah}(h]h ]h"]h$]h&]uh1j!hjhM$hjfubj])}(hL...where **position** is inferred from switch and root decoder target lists.h](h ...where }(hjhhhNhNubj)}(h **position**h]hposition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh7 is inferred from switch and root decoder target lists.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM&hjfubj])}(h **Return**h]j)}(hj'h]hReturn}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM(hjfubj])}(h*position >= 0 on success -ENXIO on failureh]h*position >= 0 on success -ENXIO on failure}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM)hjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j devm_cxl_add_region (C function)c.devm_cxl_add_regionhNtauh1jhjhhhNhNubj#)}(hhh](j()}(hstruct cxl_region * devm_cxl_add_region (struct cxl_root_decoder *cxlrd, int id, enum cxl_partition_mode mode, enum cxl_decoder_type type)h]j.)}(hstruct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, int id, enum cxl_partition_mode mode, enum cxl_decoder_type type)h](j)}(hjh]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM ubjF)}(h h]h }(hjzhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhhjyhM ubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jdevm_cxl_add_regionsbc.devm_cxl_add_regionasbuh1hhjhhhhjyhM ubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhhjyhM ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhhjyhM ubjW)}(hdevm_cxl_add_regionh]j])}(hjh]hdevm_cxl_add_region}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhhjyhM ubjv)}(hb(struct cxl_root_decoder *cxlrd, int id, enum cxl_partition_mode mode, enum cxl_decoder_type type)h](j|)}(hstruct cxl_root_decoder *cxlrdh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_root_decoderh]hcxl_root_decoder}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.devm_cxl_add_regionasbuh1hhjubjF)}(h h]h }(hj"hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj])}(hcxlrdh]hcxlrd}(hj=hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(hint idh](j4)}(hinth]hint}(hjVhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjRubjF)}(h h]h }(hjdhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjRubj])}(hidh]hid}(hjrhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjRubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(henum cxl_partition_mode modeh](j)}(hj'h]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_partition_modeh]hcxl_partition_mode}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.devm_cxl_add_regionasbuh1hhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(hmodeh]hmode}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubj|)}(henum cxl_decoder_type typeh](j)}(hj'h]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubh)}(hhh]j])}(hcxl_decoder_typeh]hcxl_decoder_type}(hj hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.devm_cxl_add_regionasbuh1hhjubjF)}(h h]h }(hj*hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjubj])}(htypeh]htype}(hj8hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjubeh}(h]h ]h"]h$]h&]hhuh1juhjhhhhjyhM ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjdhhhjyhM ubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1j'hjyhM hjahhubj)}(hhh]j])}(hAdds a region to a decoderh]hAdds a region to a decoder}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hj_hhubah}(h]h ]h"]h$]h&]uh1jhjahhhjyhM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjzjjzjjjuh1j"hhhjhNhNubj)}(hXl**Parameters** ``struct cxl_root_decoder *cxlrd`` root decoder ``int id`` memregion id to create, or memregion_free() on failure ``enum cxl_partition_mode mode`` mode for the endpoint decoders of this region ``enum cxl_decoder_type type`` select whether this is an expander or accelerator (type-2 or type-3) **Description** This is the second step of region initialization. Regions exist within an address space which is mapped by a **cxlrd**. **Return** 0 if the region was added to the **cxlrd**, else returns negative error code. The region will be named "regionZ" where Z is the unique region number.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hj~ubjo)}(hhh](jt)}(h0``struct cxl_root_decoder *cxlrd`` root decoder h](jz)}(h"``struct cxl_root_decoder *cxlrd``h]j)}(hjh]hstruct cxl_root_decoder *cxlrd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hjubj)}(hhh]j])}(h root decoderh]h root decoder}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhM hjubjt)}(hB``int id`` memregion id to create, or memregion_free() on failure h](jz)}(h ``int id``h]j)}(hjh]hint id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hjubj)}(hhh]j])}(h6memregion id to create, or memregion_free() on failureh]h6memregion id to create, or memregion_free() on failure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhM hjubjt)}(hO``enum cxl_partition_mode mode`` mode for the endpoint decoders of this region h](jz)}(h ``enum cxl_partition_mode mode``h]j)}(hjh]henum cxl_partition_mode mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hjubj)}(hhh]j])}(h-mode for the endpoint decoders of this regionh]h-mode for the endpoint decoders of this region}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj*hM hj+ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj*hM hjubjt)}(hd``enum cxl_decoder_type type`` select whether this is an expander or accelerator (type-2 or type-3) h](jz)}(h``enum cxl_decoder_type type``h]j)}(hjNh]henum cxl_decoder_type type}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hjHubj)}(hhh]j])}(hDselect whether this is an expander or accelerator (type-2 or type-3)h]hDselect whether this is an expander or accelerator (type-2 or type-3)}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjchM hjdubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jshjchM hjubeh}(h]h ]h"]h$]h&]uh1jnhj~ubj])}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hj~ubj])}(hwThis is the second step of region initialization. Regions exist within an address space which is mapped by a **cxlrd**.h](hmThis is the second step of region initialization. Regions exist within an address space which is mapped by a }(hjhhhNhNubj)}(h **cxlrd**h]hcxlrd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hj~ubj])}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hj~ubj])}(h0 if the region was added to the **cxlrd**, else returns negative error code. The region will be named "regionZ" where Z is the unique region number.h](h!0 if the region was added to the }(hjhhhNhNubj)}(h **cxlrd**h]hcxlrd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubho, else returns negative error code. The region will be named “regionZ” where Z is the unique region number.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chM hj~ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%devm_cxl_add_pmem_region (C function)c.devm_cxl_add_pmem_regionhNtauh1jhjhhhNhNubj#)}(hhh](j()}(h6int devm_cxl_add_pmem_region (struct cxl_region *cxlr)h]j.)}(h5int devm_cxl_add_pmem_region(struct cxl_region *cxlr)h](j4)}(hinth]hint}(hjhhhNhNubah}(h]h ]j@ah"]h$]h&]uh1j3hjhhhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMI ubjF)}(h h]h }(hj(hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhj'hMI ubjW)}(hdevm_cxl_add_pmem_regionh]j])}(hdevm_cxl_add_pmem_regionh]hdevm_cxl_add_pmem_region}(hj:hhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hj6ubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhj'hMI ubjv)}(h(struct cxl_region *cxlr)h]j|)}(hstruct cxl_region *cxlrh](j)}(hjh]hstruct}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubjF)}(h h]h }(hjchhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjRubh)}(hhh]j])}(h cxl_regionh]h cxl_region}(hjthhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjqubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjvmodnameN classnameNjj)}j]j)}jj<sbc.devm_cxl_add_pmem_regionasbuh1hhjRubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjRubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj])}(hcxlrh]hcxlr}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjRubeh}(h]h ]h"]h$]h&]noemphhhuh1j{hjNubah}(h]h ]h"]h$]h&]hhuh1juhjhhhj'hMI ubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhj'hMI ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1j'hj'hMI hjhhubj)}(hhh]j])}(h$add a cxl_region-to-nd_region bridgeh]h$add a cxl_region-to-nd_region bridge}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMI hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj'hMI ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1j"hhhjhNhNubj)}(h**Parameters** ``struct cxl_region *cxlr`` parent CXL region for this pmem region bridge device **Return** 0 on success negative error code on failure.h](j])}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMM hjubjo)}(hhh]jt)}(hQ``struct cxl_region *cxlr`` parent CXL region for this pmem region bridge device h](jz)}(h``struct cxl_region *cxlr``h]j)}(hjh]hstruct cxl_region *cxlr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chMJ hjubj)}(hhh]j])}(h4parent CXL region for this pmem region bridge deviceh]h4parent CXL region for this pmem region bridge device}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj/hMJ hj0ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj/hMJ hjubah}(h]h ]h"]h$]h&]uh1jnhjubj])}(h **Return**h]j)}(hjUh]hReturn}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chML hjubj])}(h,0 on success negative error code on failure.h]h,0 on success negative error code on failure.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hm/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:488: ./drivers/cxl/core/region.chML hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h] cxl-regionsah ]h"] cxl regionsah$]h&]uh1jGhj/hhhhhMubeh}(h]driver-infrastructureah ]h"]driver infrastructureah$]h&]uh1jGhjIhhhhhM;ubjH)}(hhh](jM)}(hExternal Interfacesh]hExternal Interfaces}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhMubjH)}(hhh](jM)}(hCXL IOCTL Interfaceh]hCXL IOCTL Interface}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhhhhhMubj])}(hNot all of the commands that the driver supports are available for use by userspace at all times. Userspace can check the result of the QUERY command to determine the live set of commands. Alternatively, it can issue the command and check for failure.h]hNot all of the commands that the driver supports are available for use by userspace at all times. Userspace can check the result of the QUERY command to determine the live set of commands. Alternatively, it can issue the command and check for failure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:497: ./include/uapi/linux/cxl_mem.hhK hjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_command_info (C struct)c.cxl_command_infohNtauh1jhjhhhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhNubj#)}(hhh](j()}(hcxl_command_infoh]j.)}(hstruct cxl_command_infoh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhKubjW)}(hcxl_command_infoh]j])}(hjh]hcxl_command_info}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhKhjhhubj)}(hhh]j])}(h*Command information returned from a query.h]h*Command information returned from a query.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKfhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjj6jj6jjjuh1j"hhhjhjhNubj)}(hX**Definition**:: struct cxl_command_info { __u32 id; __u32 flags; #define CXL_MEM_COMMAND_FLAG_MASK GENMASK(1, 0); #define CXL_MEM_COMMAND_FLAG_ENABLED BIT(0); #define CXL_MEM_COMMAND_FLAG_EXCLUSIVE BIT(1); __u32 size_in; __u32 size_out; }; **Members** ``id`` ID number for the command. ``flags`` Flags that specify command behavior. ``size_in`` Expected input size, or ~0 if variable length. ``size_out`` Expected output size, or ~0 if variable length.h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubh:}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKjhj:ubj)}(hXstruct cxl_command_info { __u32 id; __u32 flags; #define CXL_MEM_COMMAND_FLAG_MASK GENMASK(1, 0); #define CXL_MEM_COMMAND_FLAG_ENABLED BIT(0); #define CXL_MEM_COMMAND_FLAG_EXCLUSIVE BIT(1); __u32 size_in; __u32 size_out; };h]hXstruct cxl_command_info { __u32 id; __u32 flags; #define CXL_MEM_COMMAND_FLAG_MASK GENMASK(1, 0); #define CXL_MEM_COMMAND_FLAG_ENABLED BIT(0); #define CXL_MEM_COMMAND_FLAG_EXCLUSIVE BIT(1); __u32 size_in; __u32 size_out; };}hj[sbah}(h]h ]h"]h$]h&]hhuh1jhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKlhj:ubj])}(h **Members**h]j)}(hjlh]hMembers}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKvhj:ubjo)}(hhh](jt)}(h"``id`` ID number for the command. h](jz)}(h``id``h]j)}(hjh]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhhjubRj)}(hhh]j])}(hID number for the command.h]hID number for the command.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhhjubjt)}(h/``flags`` Flags that specify command behavior. h](jz)}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKihjubj)}(hhh]j])}(h$Flags that specify command behavior.h]h$Flags that specify command behavior.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKihjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKihjubjt)}(h;``size_in`` Expected input size, or ~0 if variable length. h](jz)}(h ``size_in``h]j)}(hjh]hsize_in}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKwhjubj)}(hhh]j])}(h.Expected input size, or ~0 if variable length.h]h.Expected input size, or ~0 if variable length.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKwhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKwhjubjt)}(h<``size_out`` Expected output size, or ~0 if variable length.h](jz)}(h ``size_out``h]j)}(hj6h]hsize_out}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKwhj0ubj)}(hhh]j])}(h/Expected output size, or ~0 if variable length.h]h/Expected output size, or ~0 if variable length.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKxhjLubah}(h]h ]h"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]uh1jshjKhKwhjubeh}(h]h ]h"]h$]h&]uh1jnhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj])}(h**Description**h]j)}(hjyh]h Description}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhK{hjhhubj!)}(hXCXL_MEM_COMMAND_FLAG_USER_ENABLED The given command id is supported by the driver and is supported by a related opcode on the device. CXL_MEM_COMMAND_FLAG_EXCLUSIVE Requests with the given command id will terminate with EBUSY as the kernel actively owns management of the given resource. For example, the label-storage-area can not be written while the kernel is actively managing that space. h](j])}(h!CXL_MEM_COMMAND_FLAG_USER_ENABLEDh]h!CXL_MEM_COMMAND_FLAG_USER_ENABLED}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKihjubj])}(hcThe given command id is supported by the driver and is supported by a related opcode on the device.h]hcThe given command id is supported by the driver and is supported by a related opcode on the device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKkhjubj])}(hCXL_MEM_COMMAND_FLAG_EXCLUSIVEh]hCXL_MEM_COMMAND_FLAG_EXCLUSIVE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKnhjubj])}(hRequests with the given command id will terminate with EBUSY as the kernel actively owns management of the given resource. For example, the label-storage-area can not be written while the kernel is actively managing that space.h]hRequests with the given command id will terminate with EBUSY as the kernel actively owns management of the given resource. For example, the label-storage-area can not be written while the kernel is actively managing that space.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKphjubeh}(h]h ]h"]h$]h&]uh1j!hjhKihjhhubj])}(hRepresents a single command that is supported by both the driver and the hardware. This is returned as part of an array from the query ioctl. The following would be a command that takes a variable length input and returns 0 bytes of output.h]hRepresents a single command that is supported by both the driver and the hardware. This is returned as part of an array from the query ioctl. The following would be a command that takes a variable length input and returns 0 bytes of output.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKvhjhhubj!)}(h_- **id** = 10 - **flags** = CXL_MEM_COMMAND_FLAG_ENABLED - **size_in** = ~0 - **size_out** = 0 h]j)}(hhh](j)}(h **id** = 10h]j])}(hjh](j)}(h**id**h]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh = 10}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhK{hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h(**flags** = CXL_MEM_COMMAND_FLAG_ENABLEDh]j])}(hjh](j)}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh = CXL_MEM_COMMAND_FLAG_ENABLED}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhK|hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**size_in** = ~0h]j])}(hj9h](j)}(h **size_in**h]hsize_in}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh = ~0}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhK}hj7ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**size_out** = 0 h]j])}(h**size_out** = 0h](j)}(h **size_out**h]hsize_out}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh = 0}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhK~hj]ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhj hK{hjubah}(h]h ]h"]h$]h&]uh1j!hj hK{hjhhubj])}(h"See struct cxl_mem_query_commands.h]h"See struct cxl_mem_query_commands.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!cxl_mem_query_commands (C struct)c.cxl_mem_query_commandshNtauh1jhjhhhjhNubj#)}(hhh](j()}(hcxl_mem_query_commandsh]j.)}(hstruct cxl_mem_query_commandsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKubjF)}(h h]h }(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhKubjW)}(hcxl_mem_query_commandsh]j])}(hjh]hcxl_mem_query_commands}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhKhjhhubj)}(hhh]j])}(hQuery supported commands.h]hQuery supported commands.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1j"hhhjhjhNubj)}(hX5**Definition**:: struct cxl_mem_query_commands { __u32 n_commands; __u32 rsvd; struct cxl_command_info __user commands[]; }; **Members** ``n_commands`` In/out parameter. When **n_commands** is > 0, the driver will return min(num_support_commands, n_commands). When **n_commands** is 0, driver will return the number of total supported commands. ``rsvd`` Reserved for future use. ``commands`` Output array of supported commands. This array must be allocated by userspace to be at least min(num_support_commands, **n_commands**)h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hwstruct cxl_mem_query_commands { __u32 n_commands; __u32 rsvd; struct cxl_command_info __user commands[]; };h]hwstruct cxl_mem_query_commands { __u32 n_commands; __u32 rsvd; struct cxl_command_info __user commands[]; };}hj7sbah}(h]h ]h"]h$]h&]hhuh1jhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj])}(h **Members**h]j)}(hjHh]hMembers}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubjo)}(hhh](jt)}(h``n_commands`` In/out parameter. When **n_commands** is > 0, the driver will return min(num_support_commands, n_commands). When **n_commands** is 0, driver will return the number of total supported commands. h](jz)}(h``n_commands``h]j)}(hjgh]h n_commands}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjaubj)}(hhh]j])}(hIn/out parameter. When **n_commands** is > 0, the driver will return min(num_support_commands, n_commands). When **n_commands** is 0, driver will return the number of total supported commands.h](hIn/out parameter. When }(hjhhhNhNubj)}(h**n_commands**h]h n_commands}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhL is > 0, the driver will return min(num_support_commands, n_commands). When }(hjhhhNhNubj)}(h**n_commands**h]h n_commands}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhA is 0, driver will return the number of total supported commands.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhj}ubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jshj|hKhj^ubjt)}(h"``rsvd`` Reserved for future use. h](jz)}(h``rsvd``h]j)}(hjh]hrsvd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(hReserved for future use.h]hReserved for future use.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhj^ubjt)}(h``commands`` Output array of supported commands. This array must be allocated by userspace to be at least min(num_support_commands, **n_commands**)h](jz)}(h ``commands``h]j)}(hjh]hcommands}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(hOutput array of supported commands. This array must be allocated by userspace to be at least min(num_support_commands, **n_commands**)h](hwOutput array of supported commands. This array must be allocated by userspace to be at least min(num_support_commands, }(hjhhhNhNubj)}(h**n_commands**h]h n_commands}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhj^ubeh}(h]h ]h"]h$]h&]uh1jnhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj])}(h**Description**h]j)}(hjRh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubj])}(hAllow userspace to query the available commands supported by both the driver, and the hardware. Commands that aren't supported by either the driver, or the hardware are not returned in the query.h]hAllow userspace to query the available commands supported by both the driver, and the hardware. Commands that aren’t supported by either the driver, or the hardware are not returned in the query.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubj])}(h **Examples**h]j)}(hjyh]hExamples}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubj!)}(h- { .n_commands = 0 } // Get number of supported commands - { .n_commands = 15, .commands = buf } // Return first 15 (or less) supported commands See struct cxl_command_info. h](j)}(hhh](j)}(h7{ .n_commands = 0 } // Get number of supported commandsh]j])}(hjh]h7{ .n_commands = 0 } // Get number of supported commands}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hV{ .n_commands = 15, .commands = buf } // Return first 15 (or less) supported commands h]j])}(hU{ .n_commands = 15, .commands = buf } // Return first 15 (or less) supported commandsh]hU{ .n_commands = 15, .commands = buf } // Return first 15 (or less) supported commands}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjubj])}(hSee struct cxl_command_info.h]hSee struct cxl_command_info.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubeh}(h]h ]h"]h$]h&]uh1j!hjhKhjhhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcxl_send_command (C struct)c.cxl_send_commandhNtauh1jhjhhhjhNubj#)}(hhh](j()}(hcxl_send_commandh]j.)}(hstruct cxl_send_commandh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKubjF)}(h h]h }(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhhjhKubjW)}(hcxl_send_commandh]j])}(hjh]hcxl_send_command}(hjhhhNhNubah}(h]h ]jiah"]h$]h&]uh1j\hjubah}(h]h ](jpjqeh"]h$]h&]hhuh1jVhjhhhjhKubeh}(h]h ]h"]h$]h&]hhj|uh1j-j}j~hjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1j'hjhKhjhhubj)}(hhh]j])}(h"Send a command to a memory device.h]h"Send a command to a memory device.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhj:hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjUjjUjjjuh1j"hhhjhjhNubj)}(hX **Definition**:: struct cxl_send_command { __u32 id; __u32 flags; union { struct { __u16 opcode; __u16 rsvd; } raw; __u32 rsvd; }; __u32 retval; struct { __u32 size; __u32 rsvd; __u64 payload; } in; struct { __u32 size; __u32 rsvd; __u64 payload; } out; }; **Members** ``id`` The command to send to the memory device. This must be one of the commands returned by the query command. ``flags`` Flags for the command (input). ``{unnamed_union}`` anonymous ``raw`` Special fields for raw commands ``raw.opcode`` Opcode passed to hardware when using the RAW command. ``raw.rsvd`` Must be zero. ``rsvd`` Must be zero. ``retval`` Return value from the memory device (output). ``in`` Parameters associated with input payload. ``in.size`` Size of the payload to provide to the device (input). ``in.rsvd`` Must be zero. ``in.payload`` Pointer to memory for payload input, payload is little endian. ``out`` Parameters associated with output payload. ``out.size`` Size of the payload received from the device (input/output). This field is filled in by userspace to let the driver know how much space was allocated for output. It is populated by the driver to let userspace know how large the output payload actually was. ``out.rsvd`` Must be zero. ``out.payload`` Pointer to memory for payload output, payload is little endian.h](j])}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubh:}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjYubj)}(hXsstruct cxl_send_command { __u32 id; __u32 flags; union { struct { __u16 opcode; __u16 rsvd; } raw; __u32 rsvd; }; __u32 retval; struct { __u32 size; __u32 rsvd; __u64 payload; } in; struct { __u32 size; __u32 rsvd; __u64 payload; } out; };h]hXsstruct cxl_send_command { __u32 id; __u32 flags; union { struct { __u16 opcode; __u16 rsvd; } raw; __u32 rsvd; }; __u32 retval; struct { __u32 size; __u32 rsvd; __u64 payload; } in; struct { __u32 size; __u32 rsvd; __u64 payload; } out; };}hjzsbah}(h]h ]h"]h$]h&]hhuh1jhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjYubj])}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjYubjo)}(hhh](jt)}(hq``id`` The command to send to the memory device. This must be one of the commands returned by the query command. h](jz)}(h``id``h]j)}(hjh]hid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(hiThe command to send to the memory device. This must be one of the commands returned by the query command.h]hiThe command to send to the memory device. This must be one of the commands returned by the query command.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h)``flags`` Flags for the command (input). h](jz)}(h ``flags``h]j)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(hFlags for the command (input).h]hFlags for the command (input).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h``{unnamed_union}`` anonymous h](jz)}(h``{unnamed_union}``h]j)}(hjh]h{unnamed_union}}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h anonymoush]h anonymous}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj2hKhj3ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj2hKhjubjt)}(h(``raw`` Special fields for raw commands h](jz)}(h``raw``h]j)}(hjVh]hraw}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjPubj)}(hhh]j])}(hSpecial fields for raw commandsh]hSpecial fields for raw commands}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjkhKhjlubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jshjkhKhjubjt)}(hE``raw.opcode`` Opcode passed to hardware when using the RAW command. h](jz)}(h``raw.opcode``h]j)}(hjh]h raw.opcode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h5Opcode passed to hardware when using the RAW command.h]h5Opcode passed to hardware when using the RAW command.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h``raw.rsvd`` Must be zero. h](jz)}(h ``raw.rsvd``h]j)}(hjh]hraw.rsvd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h Must be zero.h]h Must be zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h``rsvd`` Must be zero. h](jz)}(h``rsvd``h]j)}(hjh]hrsvd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h Must be zero.h]h Must be zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h9``retval`` Return value from the memory device (output). h](jz)}(h ``retval``h]j)}(hj:h]hretval}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhj4ubj)}(hhh]j])}(h-Return value from the memory device (output).h]h-Return value from the memory device (output).}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjOhKhjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jshjOhKhjubjt)}(h1``in`` Parameters associated with input payload. h](jz)}(h``in``h]j)}(hjsh]hin}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjmubj)}(hhh]j])}(h)Parameters associated with input payload.h]h)Parameters associated with input payload.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(hB``in.size`` Size of the payload to provide to the device (input). h](jz)}(h ``in.size``h]j)}(hjh]hin.size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h5Size of the payload to provide to the device (input).h]h5Size of the payload to provide to the device (input).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h``in.rsvd`` Must be zero. h](jz)}(h ``in.rsvd``h]j)}(hjh]hin.rsvd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h Must be zero.h]h Must be zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(hN``in.payload`` Pointer to memory for payload input, payload is little endian. h](jz)}(h``in.payload``h]j)}(hjh]h in.payload}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h>Pointer to memory for payload input, payload is little endian.h]h>Pointer to memory for payload input, payload is little endian.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hj3hKhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshj3hKhjubjt)}(h3``out`` Parameters associated with output payload. h](jz)}(h``out``h]j)}(hjWh]hout}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjQubj)}(hhh]j])}(h*Parameters associated with output payload.h]h*Parameters associated with output payload.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjlhKhjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jshjlhKhjubjt)}(hX``out.size`` Size of the payload received from the device (input/output). This field is filled in by userspace to let the driver know how much space was allocated for output. It is populated by the driver to let userspace know how large the output payload actually was. h](jz)}(h ``out.size``h]j)}(hjh]hout.size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(hXSize of the payload received from the device (input/output). This field is filled in by userspace to let the driver know how much space was allocated for output. It is populated by the driver to let userspace know how large the output payload actually was.h]hXSize of the payload received from the device (input/output). This field is filled in by userspace to let the driver know how much space was allocated for output. It is populated by the driver to let userspace know how large the output payload actually was.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(h``out.rsvd`` Must be zero. h](jz)}(h ``out.rsvd``h]j)}(hjh]hout.rsvd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h Must be zero.h]h Must be zero.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubjt)}(hO``out.payload`` Pointer to memory for payload output, payload is little endian.h](jz)}(h``out.payload``h]j)}(hjh]h out.payload}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jyhp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubj)}(hhh]j])}(h?Pointer to memory for payload output, payload is little endian.h]h?Pointer to memory for payload output, payload is little endian.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jshjhKhjubeh}(h]h ]h"]h$]h&]uh1jnhjYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhjhNubj])}(h**Description**h]j)}(hjFh]h Description}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubj])}(hX/Mechanism for userspace to send a command to the hardware for processing. The driver will do basic validation on the command sizes. In some cases even the payload may be introspected. Userspace is required to allocate large enough buffers for size_out which can be variable length in certain situations.h]hX/Mechanism for userspace to send a command to the hardware for processing. The driver will do basic validation on the command sizes. In some cases even the payload may be introspected. Userspace is required to allocate large enough buffers for size_out which can be variable length in certain situations.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1j\hp/var/lib/git/docbuild/linux/Documentation/driver-api/cxl/theory-of-operation:500: ./include/uapi/linux/cxl_mem.hhKhjhhubeh}(h]cxl-ioctl-interfaceah ]h"]cxl ioctl interfaceah$]h&]uh1jGhjhhhhhMubeh}(h]external-interfacesah ]h"]external interfacesah$]h&]uh1jGhjIhhhhhMubeh}(h]/compute-express-link-driver-theory-of-operationah ]h"]/compute express link driver theory of operationah$]h&]uh1jGhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jLN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}(hhhhhhj jjjj*jj9j-jHj<jWjKjfjZjujijjxjjjjjjjjjjjjjjjjj jjjj)jj8j,jGj;jVjJjejYjtjhjjwjjjjjjjjjjjjjjjjj jjj j(jj7j+jFj:jUjIjdjXjsjgjjvjjjjjjjjjjjjjjjjj jjj j'jj6j*jEj9jTjHjcjWjrjfjjujjjjjjjjjjjjjjjjjjjj j&jj5j)jDj8usubstitution_names}(amphߌaposhasthbrvbarj bsoljcentj*colonj9commajHcommatjWcopyjfcurrenjudarrjdegjdividejdollarjequalsjexcljfrac12jfrac14jfrac18jfrac34j frac38jfrac58j)frac78j8gtjGhalfjVhorbarjehyphenjtiexcljiquestjlaquojlarrjlcubjldquojlowbarjlparjlsqbjlsquoj ltjmicroj(middotj7nbspjFnotjUnumjdohmjsordfjordmjparajpercntjperiodjplusjplusmnjpoundjquestjquotj raquojrarrj'rcubj6rdquojEregjTrparjcrsqbjrrsquojsectjsemijshyjsoljsungjsup1jsup2jsup3jtimesjtradejuarrj&verbarj5yenjDurefnames}refids}nameids}(jj}j,j)jjj).j&.jr.jo.jjjjjxjujpjmu nametypes}(jj,jj).jr.jjjxjpuh}(j}jIj)jljj/j&.jNj j)j j j j jjjjjjjjjjjjj%j*jJ jO j["j`"j$j$j&j&j(j(jT*jY*jy,j~,jo.j,.jju.j.j.j1j1j4j4j6j6j8j8j*;j/;j=j=j>AjCAjFj#Fj`GjeGjjJjoJjLj LjNjNjaPjfPj!Rj&Rj`TjeTjiXjnXjmZjrZj]j]j`j`jcjcjTejYejgjgjijijjjjjnj"njqqjvqjtjtjvjwj'yj,yjm{jr{j}j}jojtjہjjjjjjjjejjj8j=jjjjjtjyj jjnjsjȘj͘jjjijnjj jj jXj]jjjjjYj^j<jAj̸jѸjnjsjjjljqjjjjjjj1j6j}jj_jdj jjujjmjjjjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log]4Documentation/driver-api/cxl/theory-of-operation.rst(NNNNta decorationNhhub.