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 */
22struct 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 */
37struct 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 */
62struct 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 */
94struct 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
111struct qcom_icc_fabric {
112 struct qcom_icc_node **nodes;
113 size_t num_nodes;
114};
115
116struct 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
123int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
124 u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
125int qcom_icc_set(struct icc_node *src, struct icc_node *dst);
126int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev);
127void qcom_icc_pre_aggregate(struct icc_node *node);
128int qcom_icc_rpmh_probe(struct platform_device *pdev);
129void qcom_icc_rpmh_remove(struct platform_device *pdev);
130
131#endif
132

source code of linux/drivers/interconnect/qcom/icc-rpmh.h