1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2020, The Linux Foundation. All rights reserved. 4 */ 5 6 #ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__ 7 #define __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__ 8 9 #include <dt-bindings/interconnect/qcom,icc.h> 10 11 #define to_qcom_provider(_provider) \ 12 container_of(_provider, struct qcom_icc_provider, provider) 13 14 /** 15 * struct qcom_icc_provider - Qualcomm specific interconnect provider 16 * @provider: generic interconnect provider 17 * @dev: reference to the NoC device 18 * @bcms: list of bcms that maps to the provider 19 * @num_bcms: number of @bcms 20 * @voter: bcm voter targeted by this provider 21 */ 22 struct qcom_icc_provider { 23 struct icc_provider provider; 24 struct device *dev; 25 struct qcom_icc_bcm * const *bcms; 26 size_t num_bcms; 27 struct bcm_voter *voter; 28 }; 29 30 /** 31 * struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager (BCM) 32 * @unit: divisor used to convert bytes/sec bw value to an RPMh msg 33 * @width: multiplier used to convert bytes/sec bw value to an RPMh msg 34 * @vcd: virtual clock domain that this bcm belongs to 35 * @reserved: reserved field 36 */ 37 struct bcm_db { 38 __le32 unit; 39 __le16 width; 40 u8 vcd; 41 u8 reserved; 42 }; 43 44 #define MAX_LINKS 128 45 #define MAX_BCMS 64 46 #define MAX_BCM_PER_NODE 3 47 #define MAX_VCD 10 48 49 /** 50 * struct qcom_icc_node - Qualcomm specific interconnect nodes 51 * @name: the node name used in debugfs 52 * @links: an array of nodes where we can go next while traversing 53 * @id: a unique node identifier 54 * @num_links: the total number of @links 55 * @channels: num of channels at this node 56 * @buswidth: width of the interconnect between a node and the bus 57 * @sum_avg: current sum aggregate value of all avg bw requests 58 * @max_peak: current max aggregate value of all peak bw requests 59 * @bcms: list of bcms associated with this logical node 60 * @num_bcms: num of @bcms 61 */ 62 struct qcom_icc_node { 63 const char *name; 64 u16 links[MAX_LINKS]; 65 u16 id; 66 u16 num_links; 67 u16 channels; 68 u16 buswidth; 69 u64 sum_avg[QCOM_ICC_NUM_BUCKETS]; 70 u64 max_peak[QCOM_ICC_NUM_BUCKETS]; 71 struct qcom_icc_bcm *bcms[MAX_BCM_PER_NODE]; 72 size_t num_bcms; 73 }; 74 75 /** 76 * struct qcom_icc_bcm - Qualcomm specific hardware accelerator nodes 77 * known as Bus Clock Manager (BCM) 78 * @name: the bcm node name used to fetch BCM data from command db 79 * @type: latency or bandwidth bcm 80 * @addr: address offsets used when voting to RPMH 81 * @vote_x: aggregated threshold values, represents sum_bw when @type is bw bcm 82 * @vote_y: aggregated threshold values, represents peak_bw when @type is bw bcm 83 * @vote_scale: scaling factor for vote_x and vote_y 84 * @enable_mask: optional mask to send as vote instead of vote_x/vote_y 85 * @dirty: flag used to indicate whether the bcm needs to be committed 86 * @keepalive: flag used to indicate whether a keepalive is required 87 * @aux_data: auxiliary data used when calculating threshold values and 88 * communicating with RPMh 89 * @list: used to link to other bcms when compiling lists for commit 90 * @ws_list: used to keep track of bcms that may transition between wake/sleep 91 * @num_nodes: total number of @num_nodes 92 * @nodes: list of qcom_icc_nodes that this BCM encapsulates 93 */ 94 struct qcom_icc_bcm { 95 const char *name; 96 u32 type; 97 u32 addr; 98 u64 vote_x[QCOM_ICC_NUM_BUCKETS]; 99 u64 vote_y[QCOM_ICC_NUM_BUCKETS]; 100 u64 vote_scale; 101 u32 enable_mask; 102 bool dirty; 103 bool keepalive; 104 struct bcm_db aux_data; 105 struct list_head list; 106 struct list_head ws_list; 107 size_t num_nodes; 108 struct qcom_icc_node *nodes[]; 109 }; 110 111 struct qcom_icc_fabric { 112 struct qcom_icc_node **nodes; 113 size_t num_nodes; 114 }; 115 116 struct qcom_icc_desc { 117 struct qcom_icc_node * const *nodes; 118 size_t num_nodes; 119 struct qcom_icc_bcm * const *bcms; 120 size_t num_bcms; 121 }; 122 123 #define DEFINE_QNODE(_name, _id, _channels, _buswidth, ...) \ 124 static struct qcom_icc_node _name = { \ 125 .id = _id, \ 126 .name = #_name, \ 127 .channels = _channels, \ 128 .buswidth = _buswidth, \ 129 .num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \ 130 .links = { __VA_ARGS__ }, \ 131 } 132 133 int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, 134 u32 peak_bw, u32 *agg_avg, u32 *agg_peak); 135 int qcom_icc_set(struct icc_node *src, struct icc_node *dst); 136 int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev); 137 void qcom_icc_pre_aggregate(struct icc_node *node); 138 int qcom_icc_rpmh_probe(struct platform_device *pdev); 139 int qcom_icc_rpmh_remove(struct platform_device *pdev); 140 141 #endif 142