1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
7 #ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__
8 #define __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__
10 #include <dt-bindings/interconnect/qcom,icc.h>
11 #include <linux/regmap.h>
13 #define to_qcom_provider(_provider) \
14 container_of(_provider, struct qcom_icc_provider, provider)
17 * struct qcom_icc_provider - Qualcomm specific interconnect provider
18 * @provider: generic interconnect provider
19 * @dev: reference to the NoC device
20 * @bcms: list of bcms that maps to the provider
21 * @num_bcms: number of @bcms
22 * @voter: bcm voter targeted by this provider
23 * @nodes: list of icc nodes that maps to the provider
24 * @num_nodes: number of @nodes
25 * @regmap: used for QoS, register access
26 * @clks : clks required for register access
27 * @num_clks: number of @clks
29 struct qcom_icc_provider
{
30 struct icc_provider provider
;
32 struct qcom_icc_bcm
* const *bcms
;
34 struct bcm_voter
*voter
;
35 struct qcom_icc_node
* const *nodes
;
37 struct regmap
*regmap
;
38 struct clk_bulk_data
*clks
;
43 * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager (BCM)
44 * @unit: divisor used to convert bytes/sec bw value to an RPMh msg
45 * @width: multiplier used to convert bytes/sec bw value to an RPMh msg
46 * @vcd: virtual clock domain that this bcm belongs to
47 * @reserved: reserved field
59 * struct qcom_icc_qosbox - Qualcomm specific QoS config
60 * @prio: priority value assigned to requests on the node
61 * @urg_fwd: whether to forward the urgency promotion issued by master
62 * (endpoint), or discard
63 * @prio_fwd_disable: whether to forward the priority driven by master, or
65 * @num_ports: number of @ports
66 * @port_offsets: qos register offsets
68 struct qcom_icc_qosbox
{
71 const bool prio_fwd_disable
;
73 const u32 port_offsets
[MAX_PORTS
];
78 #define MAX_BCM_PER_NODE 3
82 * struct qcom_icc_node - Qualcomm specific interconnect nodes
83 * @name: the node name used in debugfs
84 * @links: an array of nodes where we can go next while traversing
85 * @id: a unique node identifier
86 * @num_links: the total number of @links
87 * @channels: num of channels at this node
88 * @buswidth: width of the interconnect between a node and the bus
89 * @sum_avg: current sum aggregate value of all avg bw requests
90 * @max_peak: current max aggregate value of all peak bw requests
91 * @bcms: list of bcms associated with this logical node
92 * @num_bcms: num of @bcms
93 * @qosbox: QoS config data associated with node
95 struct qcom_icc_node
{
102 u64 sum_avg
[QCOM_ICC_NUM_BUCKETS
];
103 u64 max_peak
[QCOM_ICC_NUM_BUCKETS
];
104 struct qcom_icc_bcm
*bcms
[MAX_BCM_PER_NODE
];
106 const struct qcom_icc_qosbox
*qosbox
;
110 * struct qcom_icc_bcm - Qualcomm specific hardware accelerator nodes
111 * known as Bus Clock Manager (BCM)
112 * @name: the bcm node name used to fetch BCM data from command db
113 * @type: latency or bandwidth bcm
114 * @addr: address offsets used when voting to RPMH
115 * @vote_x: aggregated threshold values, represents sum_bw when @type is bw bcm
116 * @vote_y: aggregated threshold values, represents peak_bw when @type is bw bcm
117 * @vote_scale: scaling factor for vote_x and vote_y
118 * @enable_mask: optional mask to send as vote instead of vote_x/vote_y
119 * @dirty: flag used to indicate whether the bcm needs to be committed
120 * @keepalive: flag used to indicate whether a keepalive is required
121 * @aux_data: auxiliary data used when calculating threshold values and
122 * communicating with RPMh
123 * @list: used to link to other bcms when compiling lists for commit
124 * @ws_list: used to keep track of bcms that may transition between wake/sleep
125 * @num_nodes: total number of @num_nodes
126 * @nodes: list of qcom_icc_nodes that this BCM encapsulates
128 struct qcom_icc_bcm
{
132 u64 vote_x
[QCOM_ICC_NUM_BUCKETS
];
133 u64 vote_y
[QCOM_ICC_NUM_BUCKETS
];
138 struct bcm_db aux_data
;
139 struct list_head list
;
140 struct list_head ws_list
;
142 struct qcom_icc_node
*nodes
[];
145 struct qcom_icc_fabric
{
146 struct qcom_icc_node
**nodes
;
150 struct qcom_icc_desc
{
151 const struct regmap_config
*config
;
152 struct qcom_icc_node
* const *nodes
;
154 struct qcom_icc_bcm
* const *bcms
;
156 bool qos_requires_clocks
;
159 int qcom_icc_aggregate(struct icc_node
*node
, u32 tag
, u32 avg_bw
,
160 u32 peak_bw
, u32
*agg_avg
, u32
*agg_peak
);
161 int qcom_icc_set(struct icc_node
*src
, struct icc_node
*dst
);
162 int qcom_icc_bcm_init(struct qcom_icc_bcm
*bcm
, struct device
*dev
);
163 void qcom_icc_pre_aggregate(struct icc_node
*node
);
164 int qcom_icc_rpmh_probe(struct platform_device
*pdev
);
165 void qcom_icc_rpmh_remove(struct platform_device
*pdev
);