sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget+/translations/zh_CN/driver-api/interconnectmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/driver-api/interconnectmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/driver-api/interconnectmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/driver-api/interconnectmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/driver-api/interconnectmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/driver-api/interconnectmodnameN 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:spacepreserveuh1hhhhhhE/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect.rsthKubhsection)}(hhh](htitle)}(h%Generic System Interconnect Subsystemh]h%Generic System Interconnect Subsystem}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXHThis framework is designed to provide a standard kernel interface to control the settings of the interconnects on an SoC. These settings can be throughput, latency and priority between multiple interconnected devices or functional blocks. This can be controlled dynamically in order to save power or provide maximum performance.h]hXHThis framework is designed to provide a standard kernel interface to control the settings of the interconnects on an SoC. These settings can be throughput, latency and priority between multiple interconnected devices or functional blocks. This can be controlled dynamically in order to save power or provide maximum performance.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hXSThe interconnect bus is hardware with configurable parameters, which can be set on a data path according to the requests received from various drivers. An example of interconnect buses are the interconnects between various components or functional blocks in chipsets. There can be multiple interconnects on an SoC that can be multi-tiered.h]hXSThe interconnect bus is hardware with configurable parameters, which can be set on a data path according to the requests received from various drivers. An example of interconnect buses are the interconnects between various components or functional blocks in chipsets. There can be multiple interconnects on an SoC that can be multi-tiered.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hLBelow is a simplified diagram of a real-world SoC interconnect bus topology.h]hLBelow is a simplified diagram of a real-world SoC interconnect bus topology.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh literal_block)}(hX+----------------+ +----------------+ | HW Accelerator |--->| M NoC |<---------------+ +----------------+ +----------------+ | | | +------------+ +-----+ +-------------+ V +------+ | | | DDR | | +--------+ | PCIe | | | +-----+ | | Slaves | +------+ | | ^ ^ | +--------+ | | C NoC | | | V V | | +------------------+ +------------------------+ | | +-----+ | |-->| |-->| |-->| CPU | | |-->| |<--| | +-----+ | Mem NoC | | S NoC | +------------+ | |<--| |---------+ | | |<--| |<------+ | | +--------+ +------------------+ +------------------------+ | | +-->| Slaves | ^ ^ ^ ^ ^ | | +--------+ | | | | | | V +------+ | +-----+ +-----+ +---------+ +----------------+ +--------+ | CPUs | | | GPU | | DSP | | Masters |-->| P NoC |-->| Slaves | +------+ | +-----+ +-----+ +---------+ +----------------+ +--------+ | +-------+ | Modem | +-------+h]hX+----------------+ +----------------+ | HW Accelerator |--->| M NoC |<---------------+ +----------------+ +----------------+ | | | +------------+ +-----+ +-------------+ V +------+ | | | DDR | | +--------+ | PCIe | | | +-----+ | | Slaves | +------+ | | ^ ^ | +--------+ | | C NoC | | | V V | | +------------------+ +------------------------+ | | +-----+ | |-->| |-->| |-->| CPU | | |-->| |<--| | +-----+ | Mem NoC | | S NoC | +------------+ | |<--| |---------+ | | |<--| |<------+ | | +--------+ +------------------+ +------------------------+ | | +-->| Slaves | ^ ^ ^ ^ ^ | | +--------+ | | | | | | V +------+ | +-----+ +-----+ +---------+ +----------------+ +--------+ | CPUs | | | GPU | | DSP | | Masters |-->| P NoC |-->| Slaves | +------+ | +-----+ +-----+ +---------+ +----------------+ +--------+ | +-------+ | Modem | +-------+}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Terminologyh]h Terminology}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK5ubh)}(hInterconnect provider is the software definition of the interconnect hardware. The interconnect providers on the above diagram are M NoC, S NoC, C NoC, P NoC and Mem NoC.h]hInterconnect provider is the software definition of the interconnect hardware. The interconnect providers on the above diagram are M NoC, S NoC, C NoC, P NoC and Mem NoC.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjhhubh)}(hXyInterconnect node is the software definition of the interconnect hardware port. Each interconnect provider consists of multiple interconnect nodes, which are connected to other SoC components including other interconnect providers. The point on the diagram where the CPUs connect to the memory is called an interconnect node, which belongs to the Mem NoC interconnect provider.h]hXyInterconnect node is the software definition of the interconnect hardware port. Each interconnect provider consists of multiple interconnect nodes, which are connected to other SoC components including other interconnect providers. The point on the diagram where the CPUs connect to the memory is called an interconnect node, which belongs to the Mem NoC interconnect provider.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjhhubh)}(hInterconnect endpoints are the first or the last element of the path. Every endpoint is a node, but not every node is an endpoint.h]hInterconnect endpoints are the first or the last element of the path. Every endpoint is a node, but not every node is an endpoint.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjhhubh)}(hInterconnect path is everything between two endpoints including all the nodes that have to be traversed to reach from a source to destination node. It may include multiple master-slave pairs across several interconnect providers.h]hInterconnect path is everything between two endpoints including all the nodes that have to be traversed to reach from a source to destination node. It may include multiple master-slave pairs across several interconnect providers.}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubh)}(hXnInterconnect consumers are the entities which make use of the data paths exposed by the providers. The consumers send requests to providers requesting various throughput, latency and priority. Usually the consumers are device drivers, that send request based on their needs. An example for a consumer is a video decoder that supports various formats and image sizes.h]hXnInterconnect consumers are the entities which make use of the data paths exposed by the providers. The consumers send requests to providers requesting various throughput, latency and priority. Usually the consumers are device drivers, that send request based on their needs. An example for a consumer is a video decoder that supports various formats and image sizes.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjhhubeh}(h] terminologyah ]h"] terminologyah$]h&]uh1hhhhhhhhK5ubh)}(hhh](h)}(hInterconnect providersh]hInterconnect providers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hhhhhKOubh)}(hInterconnect provider is an entity that implements methods to initialize and configure interconnect bus hardware. The interconnect provider drivers should be registered with the interconnect provider core.h]hInterconnect provider is an entity that implements methods to initialize and configure interconnect bus hardware. The interconnect provider drivers should be registered with the interconnect provider core.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhj}hhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleicc_node_data (C struct)c.icc_node_datahNtauh1jhj}hhhNhNubhdesc)}(hhh](hdesc_signature)}(h icc_node_datah]hdesc_signature_line)}(hstruct icc_node_datah](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(h icc_node_datah]h desc_sig_name)}(hjh]h icc_node_data}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(h icc node datah]h icc node data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](cstructeh"]h$]h&]domainj0objtypej1desctypej1noindex noindexentrynocontentsentryuh1jhhhj}hNhNubh container)}(h**Definition**:: struct icc_node_data { struct icc_node *node; u32 tag; }; **Members** ``node`` icc node ``tag`` tagh](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjAubh:}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhj=ubj)}(hAstruct icc_node_data { struct icc_node *node; u32 tag; };h]hAstruct icc_node_data { struct icc_node *node; u32 tag; };}hj`sbah}(h]h ]h"]h$]h&]hhuh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhj=ubh)}(h **Members**h]jF)}(hjqh]hMembers}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjoubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhj=ubhdefinition_list)}(hhh](hdefinition_list_item)}(h``node`` icc node h](hterm)}(h``node``h]hliteral)}(hjh]hnode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhjubh definition)}(hhh]h)}(hicc nodeh]hicc node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h ``tag`` tagh](j)}(h``tag``h]j)}(hjh]htag}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhjubj)}(hhh]h)}(htagh]htag}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hj}hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jicc_onecell_data (C struct)c.icc_onecell_datahNtauh1jhj}hhhNhNubj)}(hhh](j)}(hicc_onecell_datah]j)}(hstruct icc_onecell_datah](j)}(hjh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)hhhj:hKubj)}(hicc_onecell_datah]j)}(hj'h]hicc_onecell_data}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](jjeh"]h$]h&]hhuh1jhj)hhhj:hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj%hhhj:hKubah}(h]j ah ](j j eh"]h$]h&]jj)jhuh1jhj:hKhj"hhubj)}(hhh]h)}(h.driver data for onecell interconnect providersh]h.driver data for onecell interconnect providers}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKhjlhhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj:hKubeh}(h]h ](j0structeh"]h$]h&]j5j0j6jj7jj8j9j:uh1jhhhj}hNhNubj<)}(h**Definition**:: struct icc_onecell_data { unsigned int num_nodes; struct icc_node *nodes[] ; }; **Members** ``num_nodes`` number of nodes in this device ``nodes`` array of pointers to the nodes in this deviceh](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK!hjubj)}(hWstruct icc_onecell_data { unsigned int num_nodes; struct icc_node *nodes[] ; };h]hWstruct icc_onecell_data { unsigned int num_nodes; struct icc_node *nodes[] ; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK#hjubh)}(h **Members**h]jF)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK(hjubj)}(hhh](j)}(h-``num_nodes`` number of nodes in this device h](j)}(h ``num_nodes``h]j)}(hjh]h num_nodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK hjubj)}(hhh]h)}(hnumber of nodes in this deviceh]hnumber of nodes in this device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK hjubj)}(h7``nodes`` array of pointers to the nodes in this deviceh](j)}(h ``nodes``h]j)}(hjh]hnodes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK hjubj)}(hhh]h)}(h-array of pointers to the nodes in this deviceh]h-array of pointers to the nodes in this device}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK!hj+ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj*hK hjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hj}hhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jicc_provider (C struct)c.icc_providerhNtauh1jhj}hhhNhNubj)}(hhh](j)}(h icc_providerh]j)}(hstruct icc_providerh](j)}(hjh]hstruct}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK'ubj)}(h h]h }(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjkhhhj|hK'ubj)}(h icc_providerh]j)}(hjih]h icc_provider}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjkhhhj|hK'ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjghhhj|hK'ubah}(h]jbah ](j j eh"]h$]h&]jj)jhuh1jhj|hK'hjdhhubj)}(hhh]h)}(h[interconnect provider (controller) entity that might provide multiple interconnect controlsh]h[interconnect provider (controller) entity that might provide multiple interconnect controls}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK+hjhhubah}(h]h ]h"]h$]h&]uh1jhjdhhhj|hK'ubeh}(h]h ](j0structeh"]h$]h&]j5j0j6jj7jj8j9j:uh1jhhhj}hNhNubj<)}(hX**Definition**:: struct icc_provider { struct list_head provider_list; struct list_head nodes; int (*set)(struct icc_node *src, struct icc_node *dst); int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw, u32 peak_bw, u32 *agg_avg, u32 *agg_peak); void (*pre_aggregate)(struct icc_node *node); int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak); struct icc_node* (*xlate)(const struct of_phandle_args *spec, void *data); struct icc_node_data* (*xlate_extended)(const struct of_phandle_args *spec, void *data); struct device *dev; int users; bool inter_set; void *data; }; **Members** ``provider_list`` list of the registered interconnect providers ``nodes`` internal list of the interconnect provider nodes ``set`` pointer to device specific set operation function ``aggregate`` pointer to device specific aggregate operation function ``pre_aggregate`` pointer to device specific function that is called before the aggregation begins (optional) ``get_bw`` pointer to device specific function to get current bandwidth ``xlate`` provider-specific callback for mapping nodes from phandle arguments ``xlate_extended`` vendor-specific callback for mapping node data from phandle arguments ``dev`` the device this interconnect provider belongs to ``users`` count of active users ``inter_set`` whether inter-provider pairs will be configured with **set** ``data`` pointer to private datah](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK/hjubj)}(hXstruct icc_provider { struct list_head provider_list; struct list_head nodes; int (*set)(struct icc_node *src, struct icc_node *dst); int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw, u32 peak_bw, u32 *agg_avg, u32 *agg_peak); void (*pre_aggregate)(struct icc_node *node); int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak); struct icc_node* (*xlate)(const struct of_phandle_args *spec, void *data); struct icc_node_data* (*xlate_extended)(const struct of_phandle_args *spec, void *data); struct device *dev; int users; bool inter_set; void *data; };h]hXstruct icc_provider { struct list_head provider_list; struct list_head nodes; int (*set)(struct icc_node *src, struct icc_node *dst); int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw, u32 peak_bw, u32 *agg_avg, u32 *agg_peak); void (*pre_aggregate)(struct icc_node *node); int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak); struct icc_node* (*xlate)(const struct of_phandle_args *spec, void *data); struct icc_node_data* (*xlate_extended)(const struct of_phandle_args *spec, void *data); struct device *dev; int users; bool inter_set; void *data; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK1hjubh)}(h **Members**h]jF)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK@hjubj)}(hhh](j)}(h@``provider_list`` list of the registered interconnect providers h](j)}(h``provider_list``h]j)}(hjh]h provider_list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK/hjubj)}(hhh]h)}(h-list of the registered interconnect providersh]h-list of the registered interconnect providers}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hK/hj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hK/hjubj)}(h;``nodes`` internal list of the interconnect provider nodes h](j)}(h ``nodes``h]j)}(hjWh]hnodes}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK0hjQubj)}(hhh]h)}(h0internal list of the interconnect provider nodesh]h0internal list of the interconnect provider nodes}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjlhK0hjmubah}(h]h ]h"]h$]h&]uh1jhjQubeh}(h]h ]h"]h$]h&]uh1jhjlhK0hjubj)}(h:``set`` pointer to device specific set operation function h](j)}(h``set``h]j)}(hjh]hset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK1hjubj)}(hhh]h)}(h1pointer to device specific set operation functionh]h1pointer to device specific set operation function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK1hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK1hjubj)}(hF``aggregate`` pointer to device specific aggregate operation function h](j)}(h ``aggregate``h]j)}(hjh]h aggregate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK2hjubj)}(hhh]h)}(h7pointer to device specific aggregate operation functionh]h7pointer to device specific aggregate operation function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK2hjubj)}(hn``pre_aggregate`` pointer to device specific function that is called before the aggregation begins (optional) h](j)}(h``pre_aggregate``h]j)}(hjh]h pre_aggregate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK4hjubj)}(hhh]h)}(h[pointer to device specific function that is called before the aggregation begins (optional)h]h[pointer to device specific function that is called before the aggregation begins (optional)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK3hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK4hjubj)}(hH``get_bw`` pointer to device specific function to get current bandwidth h](j)}(h ``get_bw``h]j)}(hj<h]hget_bw}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK5hj6ubj)}(hhh]h)}(h``provider`` points to the interconnect provider of this node h](j)}(h ``provider``h]j)}(hj h]hprovider}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKUhj ubj)}(hhh]h)}(h0points to the interconnect provider of this nodeh]h0points to the interconnect provider of this node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKUhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKUhjubj)}(hC``node_list`` the list entry in the parent provider's "nodes" list h](j)}(h ``node_list``h]j)}(hj h]h node_list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKVhj ubj)}(hhh]h)}(h4the list entry in the parent provider's "nodes" listh]h:the list entry in the parent provider’s “nodes” list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKVhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKVhjubj)}(h7``search_list`` list used when walking the nodes graph h](j)}(h``search_list``h]j)}(hj h]h search_list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKWhj ubj)}(hhh]h)}(h&list used when walking the nodes graphh]h&list used when walking the nodes graph}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKWhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKWhjubj)}(hB``reverse`` pointer to previous node when walking the nodes graph h](j)}(h ``reverse``h]j)}(hj8 h]hreverse}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKXhj2 ubj)}(hhh]h)}(h5pointer to previous node when walking the nodes graphh]h5pointer to previous node when walking the nodes graph}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjM hKXhjN ubah}(h]h ]h"]h$]h&]uh1jhj2 ubeh}(h]h ]h"]h$]h&]uh1jhjM hKXhjubj)}(h@``is_traversed`` flag that is used when walking the nodes graph h](j)}(h``is_traversed``h]j)}(hjq h]h is_traversed}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKYhjk ubj)}(hhh]h)}(h.flag that is used when walking the nodes graphh]h.flag that is used when walking the nodes graph}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKYhj ubah}(h]h ]h"]h$]h&]uh1jhjk ubeh}(h]h ]h"]h$]h&]uh1jhj hKYhjubj)}(hI``req_list`` a list of QoS constraint requests associated with this node h](j)}(h ``req_list``h]j)}(hj h]hreq_list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhKZhj ubj)}(hhh]h)}(h;a list of QoS constraint requests associated with this nodeh]h;a list of QoS constraint requests associated with this node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKZhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKZhjubj)}(hM``avg_bw`` aggregated value of average bandwidth requests from all consumers h](j)}(h ``avg_bw``h]j)}(hj h]havg_bw}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK[hj ubj)}(hhh]h)}(hAaggregated value of average bandwidth requests from all consumersh]hAaggregated value of average bandwidth requests from all consumers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK[hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK[hjubj)}(hK``peak_bw`` aggregated value of peak bandwidth requests from all consumers h](j)}(h ``peak_bw``h]j)}(hj h]hpeak_bw}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK\hj ubj)}(hhh]h)}(h>aggregated value of peak bandwidth requests from all consumersh]h>aggregated value of peak bandwidth requests from all consumers}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1 hK\hj2 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj1 hK\hjubj)}(hP``init_avg`` average bandwidth value that is read from the hardware during init h](j)}(h ``init_avg``h]j)}(hjU h]hinit_avg}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK]hjO ubj)}(hhh]h)}(hBaverage bandwidth value that is read from the hardware during inith]hBaverage bandwidth value that is read from the hardware during init}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjj hK]hjk ubah}(h]h ]h"]h$]h&]uh1jhjO ubeh}(h]h ]h"]h$]h&]uh1jhjj hK]hjubj)}(hN``init_peak`` peak bandwidth value that is read from the hardware during init h](j)}(h ``init_peak``h]j)}(hj h]h init_peak}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK^hj ubj)}(hhh]h)}(h?peak bandwidth value that is read from the hardware during inith]h?peak bandwidth value that is read from the hardware during init}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hK^hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK^hjubj)}(h ``data`` pointer to private datah](j)}(h``data``h]j)}(hj h]hdata}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK^hj ubj)}(hhh]h)}(hpointer to private datah]hpointer to private data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhm/var/lib/git/docbuild/linux/Documentation/driver-api/interconnect:85: ./include/linux/interconnect-provider.hhK_hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK^hjubeh}(h]h ]h"]h$]h&]uh1jhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hj}hhhNhNubeh}(h]interconnect-providersah ]h"]interconnect providersah$]h&]uh1hhhhhhhhKOubh)}(hhh](h)}(hInterconnect consumersh]hInterconnect consumers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKXubh)}(hInterconnect consumers are the clients which use the interconnect APIs to get paths between endpoints and set their bandwidth/latency/QoS requirements for these interconnect paths. These interfaces are not currently documented.h]hInterconnect consumers are the clients which use the interconnect APIs to get paths between endpoints and set their bandwidth/latency/QoS requirements for these interconnect paths. These interfaces are not currently documented.}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhj hhubeh}(h]interconnect-consumersah ]h"]interconnect consumersah$]h&]uh1hhhhhhhhKXubh)}(hhh](h)}(hInterconnect debugfs interfacesh]hInterconnect debugfs interfaces}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7 hhhhhK`ubh)}(hLike several other subsystems interconnect will create some files for debugging and introspection. Files in debugfs are not considered ABI so application software shouldn't rely on format details change between kernel versions.h]hLike several other subsystems interconnect will create some files for debugging and introspection. Files in debugfs are not considered ABI so application software shouldn’t rely on format details change between kernel versions.}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhj7 hhubh)}(h8``/sys/kernel/debug/interconnect/interconnect_summary``:h](j)}(h7``/sys/kernel/debug/interconnect/interconnect_summary``h]h3/sys/kernel/debug/interconnect/interconnect_summary}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjV ubh:}(hjV hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKfhj7 hhubh)}(hShow all interconnect nodes in the system with their aggregated bandwidth request. Indented under each node show bandwidth requests from each device.h]hShow all interconnect nodes in the system with their aggregated bandwidth request. Indented under each node show bandwidth requests from each device.}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhj7 hhubh)}(h6``/sys/kernel/debug/interconnect/interconnect_graph``:h](j)}(h5``/sys/kernel/debug/interconnect/interconnect_graph``h]h1/sys/kernel/debug/interconnect/interconnect_graph}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKkhj7 hhubh)}(hXShow the interconnect graph in the graphviz dot format. It shows all interconnect nodes and links in the system and groups together nodes from the same provider as subgraphs. The format is human-readable and can also be piped through dot to generate diagrams in many graphical formats::h]hXShow the interconnect graph in the graphviz dot format. It shows all interconnect nodes and links in the system and groups together nodes from the same provider as subgraphs. The format is human-readable and can also be piped through dot to generate diagrams in many graphical formats:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKmhj7 hhubj)}(hf$ cat /sys/kernel/debug/interconnect/interconnect_graph | \ dot -Tsvg > interconnect_graph.svgh]hf$ cat /sys/kernel/debug/interconnect/interconnect_graph | \ dot -Tsvg > interconnect_graph.svg}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhKrhj7 hhubh)}(hX%The ``test-client`` directory provides interfaces for issuing BW requests to any arbitrary path. Note that for safety reasons, this feature is disabled by default without a Kconfig to enable it. Enabling it requires code changes to ``#define INTERCONNECT_ALLOW_WRITE_DEBUGFS``. Example usage::h](hThe }(hj hhhNhNubj)}(h``test-client``h]h test-client}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh directory provides interfaces for issuing BW requests to any arbitrary path. Note that for safety reasons, this feature is disabled by default without a Kconfig to enable it. Enabling it requires code changes to }(hj hhhNhNubj)}(h,``#define INTERCONNECT_ALLOW_WRITE_DEBUGFS``h]h(#define INTERCONNECT_ALLOW_WRITE_DEBUGFS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh. Example usage:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKuhj7 hhubj)}(hX'cd /sys/kernel/debug/interconnect/test-client/ # Configure node endpoints for the path from CPU to DDR on # qcom/sm8550. echo chm_apps > src_node echo ebi > dst_node # Get path between src_node and dst_node. This is only # necessary after updating the node endpoints. echo 1 > get # Set desired BW to 1GBps avg and 2GBps peak. echo 1000000 > avg_bw echo 2000000 > peak_bw # Vote for avg_bw and peak_bw on the latest path from "get". # Voting for multiple paths is possible by repeating this # process for different nodes endpoints. echo 1 > commith]hX'cd /sys/kernel/debug/interconnect/test-client/ # Configure node endpoints for the path from CPU to DDR on # qcom/sm8550. echo chm_apps > src_node echo ebi > dst_node # Get path between src_node and dst_node. This is only # necessary after updating the node endpoints. echo 1 > get # Set desired BW to 1GBps avg and 2GBps peak. echo 1000000 > avg_bw echo 2000000 > peak_bw # Vote for avg_bw and peak_bw on the latest path from "get". # Voting for multiple paths is possible by repeating this # process for different nodes endpoints. echo 1 > commit}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhKzhj7 hhubeh}(h]interconnect-debugfs-interfacesah ]h"]interconnect debugfs interfacesah$]h&]uh1hhhhhhhhK`ubeh}(h]%generic-system-interconnect-subsystemah ]h"]%generic system interconnect subsystemah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN 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_handlerj+ error_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}substitution_names}refnames}refids}nameids}(j j jjjzjwj j j4 j1 j j u nametypes}(j jjzj j4 j uh}(j hjhjwjj j}jjj j%jbjgjjj1 j j j7 u 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] decorationNhhub.