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