Skip to content

Commit c446e40

Browse files
committed
Merge tag 'icc-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc into char-misc-next
Georgi writes: interconnect changes for 5.15 Here are changes for the 5.15-rc1 merge window consisting of interconnect core and driver updates. Framework change: - Add sanity check to detect if node is already added to provider. Driver changes: - RPMh drivers probe function consolidation - Add driver for SC8180x platforms - Add support for SC8180x OSM L3 - Use driver-specific naming in OSM L3 Signed-off-by: Georgi Djakov <[email protected]> * tag 'icc-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc: interconnect: qcom: osm-l3: Use driver-specific naming interconnect: qcom: osm-l3: Add sc8180x support dt-bindings: interconnect: Add SC8180x to OSM L3 DT binding interconnect: qcom: Add SC8180x providers dt-bindings: interconnect: Add Qualcomm SC8180x DT bindings interconnect: Sanity check that node isn't already on list interconnect: qcom: icc-rpmh: Consolidate probe functions
2 parents 637d095 + 8bf5d31 commit c446e40

File tree

18 files changed

+1159
-683
lines changed

18 files changed

+1159
-683
lines changed

Documentation/devicetree/bindings/interconnect/qcom,osm-l3.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ properties:
1818
compatible:
1919
enum:
2020
- qcom,sc7180-osm-l3
21+
- qcom,sc8180x-osm-l3
2122
- qcom,sdm845-osm-l3
2223
- qcom,sm8150-osm-l3
2324
- qcom,sm8250-epss-l3

Documentation/devicetree/bindings/interconnect/qcom,rpmh.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ properties:
4949
- qcom,sc7280-mmss-noc
5050
- qcom,sc7280-nsp-noc
5151
- qcom,sc7280-system-noc
52+
- qcom,sc8180x-aggre1-noc
53+
- qcom,sc8180x-aggre2-noc
54+
- qcom,sc8180x-camnoc-virt
55+
- qcom,sc8180x-compute-noc
56+
- qcom,sc8180x-config-noc
57+
- qcom,sc8180x-dc-noc
58+
- qcom,sc8180x-gem-noc
59+
- qcom,sc8180x-ipa-virt
60+
- qcom,sc8180x-mc-virt
61+
- qcom,sc8180x-mmss-noc
62+
- qcom,sc8180x-system-noc
5263
- qcom,sdm845-aggre1-noc
5364
- qcom,sdm845-aggre2-noc
5465
- qcom,sdm845-config-noc

drivers/interconnect/core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,9 @@ EXPORT_SYMBOL_GPL(icc_link_destroy);
959959
*/
960960
void icc_node_add(struct icc_node *node, struct icc_provider *provider)
961961
{
962+
if (WARN_ON(node->provider))
963+
return;
964+
962965
mutex_lock(&icc_lock);
963966

964967
node->provider = provider;

drivers/interconnect/qcom/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ config INTERCONNECT_QCOM_SC7280
8383
This is a driver for the Qualcomm Network-on-Chip on sc7280-based
8484
platforms.
8585

86+
config INTERCONNECT_QCOM_SC8180X
87+
tristate "Qualcomm SC8180X interconnect driver"
88+
depends on INTERCONNECT_QCOM_RPMH_POSSIBLE
89+
select INTERCONNECT_QCOM_RPMH
90+
select INTERCONNECT_QCOM_BCM_VOTER
91+
help
92+
This is a driver for the Qualcomm Network-on-Chip on sc8180x-based
93+
platforms.
94+
8695
config INTERCONNECT_QCOM_SDM660
8796
tristate "Qualcomm SDM660 interconnect driver"
8897
depends on INTERCONNECT_QCOM

drivers/interconnect/qcom/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ qnoc-qcs404-objs := qcs404.o
99
icc-rpmh-obj := icc-rpmh.o
1010
qnoc-sc7180-objs := sc7180.o
1111
qnoc-sc7280-objs := sc7280.o
12+
qnoc-sc8180x-objs := sc8180x.o
1213
qnoc-sdm660-objs := sdm660.o
1314
qnoc-sdm845-objs := sdm845.o
1415
qnoc-sdx55-objs := sdx55.o
@@ -26,6 +27,7 @@ obj-$(CONFIG_INTERCONNECT_QCOM_QCS404) += qnoc-qcs404.o
2627
obj-$(CONFIG_INTERCONNECT_QCOM_RPMH) += icc-rpmh.o
2728
obj-$(CONFIG_INTERCONNECT_QCOM_SC7180) += qnoc-sc7180.o
2829
obj-$(CONFIG_INTERCONNECT_QCOM_SC7280) += qnoc-sc7280.o
30+
obj-$(CONFIG_INTERCONNECT_QCOM_SC8180X) += qnoc-sc8180x.o
2931
obj-$(CONFIG_INTERCONNECT_QCOM_SDM660) += qnoc-sdm660.o
3032
obj-$(CONFIG_INTERCONNECT_QCOM_SDM845) += qnoc-sdm845.o
3133
obj-$(CONFIG_INTERCONNECT_QCOM_SDX55) += qnoc-sdx55.o

drivers/interconnect/qcom/icc-rpmh.c

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/interconnect-provider.h>
88
#include <linux/module.h>
99
#include <linux/of.h>
10+
#include <linux/of_device.h>
1011
#include <linux/slab.h>
1112

1213
#include "bcm-voter.h"
@@ -182,4 +183,96 @@ int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev)
182183
}
183184
EXPORT_SYMBOL_GPL(qcom_icc_bcm_init);
184185

186+
int qcom_icc_rpmh_probe(struct platform_device *pdev)
187+
{
188+
const struct qcom_icc_desc *desc;
189+
struct device *dev = &pdev->dev;
190+
struct icc_onecell_data *data;
191+
struct icc_provider *provider;
192+
struct qcom_icc_node **qnodes, *qn;
193+
struct qcom_icc_provider *qp;
194+
struct icc_node *node;
195+
size_t num_nodes, i, j;
196+
int ret;
197+
198+
desc = of_device_get_match_data(dev);
199+
if (!desc)
200+
return -EINVAL;
201+
202+
qnodes = desc->nodes;
203+
num_nodes = desc->num_nodes;
204+
205+
qp = devm_kzalloc(dev, sizeof(*qp), GFP_KERNEL);
206+
if (!qp)
207+
return -ENOMEM;
208+
209+
data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), GFP_KERNEL);
210+
if (!data)
211+
return -ENOMEM;
212+
213+
provider = &qp->provider;
214+
provider->dev = dev;
215+
provider->set = qcom_icc_set;
216+
provider->pre_aggregate = qcom_icc_pre_aggregate;
217+
provider->aggregate = qcom_icc_aggregate;
218+
provider->xlate_extended = qcom_icc_xlate_extended;
219+
INIT_LIST_HEAD(&provider->nodes);
220+
provider->data = data;
221+
222+
qp->dev = dev;
223+
qp->bcms = desc->bcms;
224+
qp->num_bcms = desc->num_bcms;
225+
226+
qp->voter = of_bcm_voter_get(qp->dev, NULL);
227+
if (IS_ERR(qp->voter))
228+
return PTR_ERR(qp->voter);
229+
230+
ret = icc_provider_add(provider);
231+
if (ret)
232+
return ret;
233+
234+
for (i = 0; i < qp->num_bcms; i++)
235+
qcom_icc_bcm_init(qp->bcms[i], dev);
236+
237+
for (i = 0; i < num_nodes; i++) {
238+
qn = qnodes[i];
239+
if (!qn)
240+
continue;
241+
242+
node = icc_node_create(qn->id);
243+
if (IS_ERR(node)) {
244+
ret = PTR_ERR(node);
245+
goto err;
246+
}
247+
248+
node->name = qn->name;
249+
node->data = qn;
250+
icc_node_add(node, provider);
251+
252+
for (j = 0; j < qn->num_links; j++)
253+
icc_link_create(node, qn->links[j]);
254+
255+
data->nodes[i] = node;
256+
}
257+
258+
data->num_nodes = num_nodes;
259+
platform_set_drvdata(pdev, qp);
260+
261+
return 0;
262+
err:
263+
icc_nodes_remove(provider);
264+
icc_provider_del(provider);
265+
return ret;
266+
}
267+
EXPORT_SYMBOL_GPL(qcom_icc_rpmh_probe);
268+
269+
int qcom_icc_rpmh_remove(struct platform_device *pdev)
270+
{
271+
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
272+
273+
icc_nodes_remove(&qp->provider);
274+
return icc_provider_del(&qp->provider);
275+
}
276+
EXPORT_SYMBOL_GPL(qcom_icc_rpmh_remove);
277+
185278
MODULE_LICENSE("GPL v2");

drivers/interconnect/qcom/icc-rpmh.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,5 +134,7 @@ int qcom_icc_set(struct icc_node *src, struct icc_node *dst);
134134
struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data);
135135
int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev);
136136
void qcom_icc_pre_aggregate(struct icc_node *node);
137+
int qcom_icc_rpmh_probe(struct platform_device *pdev);
138+
int qcom_icc_rpmh_remove(struct platform_device *pdev);
137139

138140
#endif

drivers/interconnect/qcom/osm-l3.c

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <dt-bindings/interconnect/qcom,osm-l3.h>
1616

1717
#include "sc7180.h"
18+
#include "sc8180x.h"
1819
#include "sdm845.h"
1920
#include "sm8150.h"
2021
#include "sm8250.h"
@@ -37,7 +38,7 @@
3738

3839
#define OSM_L3_MAX_LINKS 1
3940

40-
#define to_qcom_provider(_provider) \
41+
#define to_osm_l3_provider(_provider) \
4142
container_of(_provider, struct qcom_osm_l3_icc_provider, provider)
4243

4344
struct qcom_osm_l3_icc_provider {
@@ -49,31 +50,31 @@ struct qcom_osm_l3_icc_provider {
4950
};
5051

5152
/**
52-
* struct qcom_icc_node - Qualcomm specific interconnect nodes
53+
* struct qcom_osm_l3_node - Qualcomm specific interconnect nodes
5354
* @name: the node name used in debugfs
5455
* @links: an array of nodes where we can go next while traversing
5556
* @id: a unique node identifier
5657
* @num_links: the total number of @links
5758
* @buswidth: width of the interconnect between a node and the bus
5859
*/
59-
struct qcom_icc_node {
60+
struct qcom_osm_l3_node {
6061
const char *name;
6162
u16 links[OSM_L3_MAX_LINKS];
6263
u16 id;
6364
u16 num_links;
6465
u16 buswidth;
6566
};
6667

67-
struct qcom_icc_desc {
68-
const struct qcom_icc_node **nodes;
68+
struct qcom_osm_l3_desc {
69+
const struct qcom_osm_l3_node **nodes;
6970
size_t num_nodes;
7071
unsigned int lut_row_size;
7172
unsigned int reg_freq_lut;
7273
unsigned int reg_perf_state;
7374
};
7475

7576
#define DEFINE_QNODE(_name, _id, _buswidth, ...) \
76-
static const struct qcom_icc_node _name = { \
77+
static const struct qcom_osm_l3_node _name = { \
7778
.name = #_name, \
7879
.id = _id, \
7980
.buswidth = _buswidth, \
@@ -84,12 +85,12 @@ struct qcom_icc_desc {
8485
DEFINE_QNODE(sdm845_osm_apps_l3, SDM845_MASTER_OSM_L3_APPS, 16, SDM845_SLAVE_OSM_L3);
8586
DEFINE_QNODE(sdm845_osm_l3, SDM845_SLAVE_OSM_L3, 16);
8687

87-
static const struct qcom_icc_node *sdm845_osm_l3_nodes[] = {
88+
static const struct qcom_osm_l3_node *sdm845_osm_l3_nodes[] = {
8889
[MASTER_OSM_L3_APPS] = &sdm845_osm_apps_l3,
8990
[SLAVE_OSM_L3] = &sdm845_osm_l3,
9091
};
9192

92-
static const struct qcom_icc_desc sdm845_icc_osm_l3 = {
93+
static const struct qcom_osm_l3_desc sdm845_icc_osm_l3 = {
9394
.nodes = sdm845_osm_l3_nodes,
9495
.num_nodes = ARRAY_SIZE(sdm845_osm_l3_nodes),
9596
.lut_row_size = OSM_LUT_ROW_SIZE,
@@ -100,28 +101,44 @@ static const struct qcom_icc_desc sdm845_icc_osm_l3 = {
100101
DEFINE_QNODE(sc7180_osm_apps_l3, SC7180_MASTER_OSM_L3_APPS, 16, SC7180_SLAVE_OSM_L3);
101102
DEFINE_QNODE(sc7180_osm_l3, SC7180_SLAVE_OSM_L3, 16);
102103

103-
static const struct qcom_icc_node *sc7180_osm_l3_nodes[] = {
104+
static const struct qcom_osm_l3_node *sc7180_osm_l3_nodes[] = {
104105
[MASTER_OSM_L3_APPS] = &sc7180_osm_apps_l3,
105106
[SLAVE_OSM_L3] = &sc7180_osm_l3,
106107
};
107108

108-
static const struct qcom_icc_desc sc7180_icc_osm_l3 = {
109+
static const struct qcom_osm_l3_desc sc7180_icc_osm_l3 = {
109110
.nodes = sc7180_osm_l3_nodes,
110111
.num_nodes = ARRAY_SIZE(sc7180_osm_l3_nodes),
111112
.lut_row_size = OSM_LUT_ROW_SIZE,
112113
.reg_freq_lut = OSM_REG_FREQ_LUT,
113114
.reg_perf_state = OSM_REG_PERF_STATE,
114115
};
115116

117+
DEFINE_QNODE(sc8180x_osm_apps_l3, SC8180X_MASTER_OSM_L3_APPS, 32, SC8180X_SLAVE_OSM_L3);
118+
DEFINE_QNODE(sc8180x_osm_l3, SC8180X_SLAVE_OSM_L3, 32);
119+
120+
static const struct qcom_osm_l3_node *sc8180x_osm_l3_nodes[] = {
121+
[MASTER_OSM_L3_APPS] = &sc8180x_osm_apps_l3,
122+
[SLAVE_OSM_L3] = &sc8180x_osm_l3,
123+
};
124+
125+
static const struct qcom_osm_l3_desc sc8180x_icc_osm_l3 = {
126+
.nodes = sc8180x_osm_l3_nodes,
127+
.num_nodes = ARRAY_SIZE(sc8180x_osm_l3_nodes),
128+
.lut_row_size = OSM_LUT_ROW_SIZE,
129+
.reg_freq_lut = OSM_REG_FREQ_LUT,
130+
.reg_perf_state = OSM_REG_PERF_STATE,
131+
};
132+
116133
DEFINE_QNODE(sm8150_osm_apps_l3, SM8150_MASTER_OSM_L3_APPS, 32, SM8150_SLAVE_OSM_L3);
117134
DEFINE_QNODE(sm8150_osm_l3, SM8150_SLAVE_OSM_L3, 32);
118135

119-
static const struct qcom_icc_node *sm8150_osm_l3_nodes[] = {
136+
static const struct qcom_osm_l3_node *sm8150_osm_l3_nodes[] = {
120137
[MASTER_OSM_L3_APPS] = &sm8150_osm_apps_l3,
121138
[SLAVE_OSM_L3] = &sm8150_osm_l3,
122139
};
123140

124-
static const struct qcom_icc_desc sm8150_icc_osm_l3 = {
141+
static const struct qcom_osm_l3_desc sm8150_icc_osm_l3 = {
125142
.nodes = sm8150_osm_l3_nodes,
126143
.num_nodes = ARRAY_SIZE(sm8150_osm_l3_nodes),
127144
.lut_row_size = OSM_LUT_ROW_SIZE,
@@ -132,24 +149,24 @@ static const struct qcom_icc_desc sm8150_icc_osm_l3 = {
132149
DEFINE_QNODE(sm8250_epss_apps_l3, SM8250_MASTER_EPSS_L3_APPS, 32, SM8250_SLAVE_EPSS_L3);
133150
DEFINE_QNODE(sm8250_epss_l3, SM8250_SLAVE_EPSS_L3, 32);
134151

135-
static const struct qcom_icc_node *sm8250_epss_l3_nodes[] = {
152+
static const struct qcom_osm_l3_node *sm8250_epss_l3_nodes[] = {
136153
[MASTER_EPSS_L3_APPS] = &sm8250_epss_apps_l3,
137154
[SLAVE_EPSS_L3_SHARED] = &sm8250_epss_l3,
138155
};
139156

140-
static const struct qcom_icc_desc sm8250_icc_epss_l3 = {
157+
static const struct qcom_osm_l3_desc sm8250_icc_epss_l3 = {
141158
.nodes = sm8250_epss_l3_nodes,
142159
.num_nodes = ARRAY_SIZE(sm8250_epss_l3_nodes),
143160
.lut_row_size = EPSS_LUT_ROW_SIZE,
144161
.reg_freq_lut = EPSS_REG_FREQ_LUT,
145162
.reg_perf_state = EPSS_REG_PERF_STATE,
146163
};
147164

148-
static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
165+
static int qcom_osm_l3_set(struct icc_node *src, struct icc_node *dst)
149166
{
150167
struct qcom_osm_l3_icc_provider *qp;
151168
struct icc_provider *provider;
152-
const struct qcom_icc_node *qn;
169+
const struct qcom_osm_l3_node *qn;
153170
struct icc_node *n;
154171
unsigned int index;
155172
u32 agg_peak = 0;
@@ -158,7 +175,7 @@ static int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
158175

159176
qn = src->data;
160177
provider = src->provider;
161-
qp = to_qcom_provider(provider);
178+
qp = to_osm_l3_provider(provider);
162179

163180
list_for_each_entry(n, &provider->nodes, node_list)
164181
provider->aggregate(n, 0, n->avg_bw, n->peak_bw,
@@ -191,10 +208,10 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
191208
u32 info, src, lval, i, prev_freq = 0, freq;
192209
static unsigned long hw_rate, xo_rate;
193210
struct qcom_osm_l3_icc_provider *qp;
194-
const struct qcom_icc_desc *desc;
211+
const struct qcom_osm_l3_desc *desc;
195212
struct icc_onecell_data *data;
196213
struct icc_provider *provider;
197-
const struct qcom_icc_node **qnodes;
214+
const struct qcom_osm_l3_node **qnodes;
198215
struct icc_node *node;
199216
size_t num_nodes;
200217
struct clk *clk;
@@ -264,7 +281,7 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
264281

265282
provider = &qp->provider;
266283
provider->dev = &pdev->dev;
267-
provider->set = qcom_icc_set;
284+
provider->set = qcom_osm_l3_set;
268285
provider->aggregate = icc_std_aggregate;
269286
provider->xlate = of_icc_xlate_onecell;
270287
INIT_LIST_HEAD(&provider->nodes);
@@ -286,7 +303,7 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
286303
}
287304

288305
node->name = qnodes[i]->name;
289-
/* Cast away const and add it back in qcom_icc_set() */
306+
/* Cast away const and add it back in qcom_osm_l3_set() */
290307
node->data = (void *)qnodes[i];
291308
icc_node_add(node, provider);
292309

@@ -311,6 +328,7 @@ static const struct of_device_id osm_l3_of_match[] = {
311328
{ .compatible = "qcom,sc7180-osm-l3", .data = &sc7180_icc_osm_l3 },
312329
{ .compatible = "qcom,sdm845-osm-l3", .data = &sdm845_icc_osm_l3 },
313330
{ .compatible = "qcom,sm8150-osm-l3", .data = &sm8150_icc_osm_l3 },
331+
{ .compatible = "qcom,sc8180x-osm-l3", .data = &sc8180x_icc_osm_l3 },
314332
{ .compatible = "qcom,sm8250-epss-l3", .data = &sm8250_icc_epss_l3 },
315333
{ }
316334
};

0 commit comments

Comments
 (0)