Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.16-rc3 172 lines 5.5 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (c) 2020, The Linux Foundation. All rights reserved. 4 * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7#ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__ 8#define __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__ 9 10#include <dt-bindings/interconnect/qcom,icc.h> 11#include <linux/regmap.h> 12 13#define to_qcom_provider(_provider) \ 14 container_of(_provider, struct qcom_icc_provider, provider) 15 16/** 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 28 */ 29struct qcom_icc_provider { 30 struct icc_provider provider; 31 struct device *dev; 32 struct qcom_icc_bcm * const *bcms; 33 size_t num_bcms; 34 struct bcm_voter *voter; 35 struct qcom_icc_node * const *nodes; 36 size_t num_nodes; 37 struct regmap *regmap; 38 struct clk_bulk_data *clks; 39 int num_clks; 40}; 41 42/** 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 48 */ 49struct bcm_db { 50 __le32 unit; 51 __le16 width; 52 u8 vcd; 53 u8 reserved; 54}; 55 56#define MAX_PORTS 2 57 58/** 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 64 * override by @prio 65 * @num_ports: number of @ports 66 * @port_offsets: qos register offsets 67 */ 68struct qcom_icc_qosbox { 69 const u32 prio; 70 const bool urg_fwd; 71 const bool prio_fwd_disable; 72 const u32 num_ports; 73 const u32 port_offsets[MAX_PORTS]; 74}; 75 76#define MAX_LINKS 128 77#define MAX_BCMS 64 78#define MAX_BCM_PER_NODE 3 79#define MAX_VCD 10 80 81/** 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 * @link_nodes: links associated with this node 87 * @node: icc_node associated with this node 88 * @num_links: the total number of @links 89 * @channels: num of channels at this node 90 * @buswidth: width of the interconnect between a node and the bus 91 * @sum_avg: current sum aggregate value of all avg bw requests 92 * @max_peak: current max aggregate value of all peak bw requests 93 * @bcms: list of bcms associated with this logical node 94 * @num_bcms: num of @bcms 95 * @qosbox: QoS config data associated with node 96 */ 97struct qcom_icc_node { 98 const char *name; 99 u16 links[MAX_LINKS]; 100 u16 id; 101 struct qcom_icc_node **link_nodes; 102 struct icc_node *node; 103 u16 num_links; 104 u16 channels; 105 u16 buswidth; 106 u64 sum_avg[QCOM_ICC_NUM_BUCKETS]; 107 u64 max_peak[QCOM_ICC_NUM_BUCKETS]; 108 struct qcom_icc_bcm *bcms[MAX_BCM_PER_NODE]; 109 size_t num_bcms; 110 const struct qcom_icc_qosbox *qosbox; 111}; 112 113/** 114 * struct qcom_icc_bcm - Qualcomm specific hardware accelerator nodes 115 * known as Bus Clock Manager (BCM) 116 * @name: the bcm node name used to fetch BCM data from command db 117 * @type: latency or bandwidth bcm 118 * @addr: address offsets used when voting to RPMH 119 * @vote_x: aggregated threshold values, represents sum_bw when @type is bw bcm 120 * @vote_y: aggregated threshold values, represents peak_bw when @type is bw bcm 121 * @vote_scale: scaling factor for vote_x and vote_y 122 * @enable_mask: optional mask to send as vote instead of vote_x/vote_y 123 * @dirty: flag used to indicate whether the bcm needs to be committed 124 * @keepalive: flag used to indicate whether a keepalive is required 125 * @aux_data: auxiliary data used when calculating threshold values and 126 * communicating with RPMh 127 * @list: used to link to other bcms when compiling lists for commit 128 * @ws_list: used to keep track of bcms that may transition between wake/sleep 129 * @num_nodes: total number of @num_nodes 130 * @nodes: list of qcom_icc_nodes that this BCM encapsulates 131 */ 132struct qcom_icc_bcm { 133 const char *name; 134 u32 type; 135 u32 addr; 136 u64 vote_x[QCOM_ICC_NUM_BUCKETS]; 137 u64 vote_y[QCOM_ICC_NUM_BUCKETS]; 138 u64 vote_scale; 139 u32 enable_mask; 140 bool dirty; 141 bool keepalive; 142 struct bcm_db aux_data; 143 struct list_head list; 144 struct list_head ws_list; 145 size_t num_nodes; 146 struct qcom_icc_node *nodes[]; 147}; 148 149struct qcom_icc_fabric { 150 struct qcom_icc_node **nodes; 151 size_t num_nodes; 152}; 153 154struct qcom_icc_desc { 155 const struct regmap_config *config; 156 struct qcom_icc_node * const *nodes; 157 size_t num_nodes; 158 struct qcom_icc_bcm * const *bcms; 159 size_t num_bcms; 160 bool qos_requires_clocks; 161 bool alloc_dyn_id; 162}; 163 164int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, 165 u32 peak_bw, u32 *agg_avg, u32 *agg_peak); 166int qcom_icc_set(struct icc_node *src, struct icc_node *dst); 167int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev); 168void qcom_icc_pre_aggregate(struct icc_node *node); 169int qcom_icc_rpmh_probe(struct platform_device *pdev); 170void qcom_icc_rpmh_remove(struct platform_device *pdev); 171 172#endif