It's often useful during test, debug, and development to issue path votes from shell. Add a debugfs client for this purpose. Example usage: 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 Allowing userspace to directly enable and set bus rates can be dangerous So, following in the footsteps of the regmap [0] and clk [1] frameworks, keep these userspace controls compile-time disabled without Kconfig options to enable them. Enabling this will require code changes to define INTERCONNECT_ALLOW_WRITE_DEBUGFS. [0] commit 09c6ecd39410 ("regmap: Add support for writing to regmap registers via debugfs") [1] commit 37215da5553e ("clk: Add support for setting clk_rate via debugfs") Signed-off-by: Mike Tipton <quic_mdtipton@quicinc.com> Link: https://lore.kernel.org/r/20230807142914.12480-4-quic_mdtipton@quicinc.com Signed-off-by: Georgi Djakov <djakov@kernel.org>
48 lines
1.3 KiB
C
48 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Interconnect framework internal structs
|
|
*
|
|
* Copyright (c) 2019, Linaro Ltd.
|
|
* Author: Georgi Djakov <georgi.djakov@linaro.org>
|
|
*/
|
|
|
|
#ifndef __DRIVERS_INTERCONNECT_INTERNAL_H
|
|
#define __DRIVERS_INTERCONNECT_INTERNAL_H
|
|
|
|
/**
|
|
* struct icc_req - constraints that are attached to each node
|
|
* @req_node: entry in list of requests for the particular @node
|
|
* @node: the interconnect node to which this constraint applies
|
|
* @dev: reference to the device that sets the constraints
|
|
* @enabled: indicates whether the path with this request is enabled
|
|
* @tag: path tag (optional)
|
|
* @avg_bw: an integer describing the average bandwidth in kBps
|
|
* @peak_bw: an integer describing the peak bandwidth in kBps
|
|
*/
|
|
struct icc_req {
|
|
struct hlist_node req_node;
|
|
struct icc_node *node;
|
|
struct device *dev;
|
|
bool enabled;
|
|
u32 tag;
|
|
u32 avg_bw;
|
|
u32 peak_bw;
|
|
};
|
|
|
|
/**
|
|
* struct icc_path - interconnect path structure
|
|
* @name: a string name of the path (useful for ftrace)
|
|
* @num_nodes: number of hops (nodes)
|
|
* @reqs: array of the requests applicable to this path of nodes
|
|
*/
|
|
struct icc_path {
|
|
const char *name;
|
|
size_t num_nodes;
|
|
struct icc_req reqs[];
|
|
};
|
|
|
|
struct icc_path *icc_get(struct device *dev, const char *src, const char *dst);
|
|
int icc_debugfs_client_init(struct dentry *icc_dir);
|
|
|
|
#endif
|