sched/doc: Update documentation for base_slice_ns and CONFIG_HZ relation
[sfrench/cifs-2.6.git] / drivers / interconnect / core.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Interconnect framework core driver
4  *
5  * Copyright (c) 2017-2019, Linaro Ltd.
6  * Author: Georgi Djakov <georgi.djakov@linaro.org>
7  */
8
9 #include <linux/debugfs.h>
10 #include <linux/device.h>
11 #include <linux/idr.h>
12 #include <linux/init.h>
13 #include <linux/interconnect.h>
14 #include <linux/interconnect-provider.h>
15 #include <linux/list.h>
16 #include <linux/mutex.h>
17 #include <linux/slab.h>
18 #include <linux/of.h>
19 #include <linux/overflow.h>
20
21 #include "internal.h"
22
23 #define CREATE_TRACE_POINTS
24 #include "trace.h"
25
26 static DEFINE_IDR(icc_idr);
27 static LIST_HEAD(icc_providers);
28 static int providers_count;
29 static bool synced_state;
30 static DEFINE_MUTEX(icc_lock);
31 static DEFINE_MUTEX(icc_bw_lock);
32 static struct dentry *icc_debugfs_dir;
33
34 static void icc_summary_show_one(struct seq_file *s, struct icc_node *n)
35 {
36         if (!n)
37                 return;
38
39         seq_printf(s, "%-42s %12u %12u\n",
40                    n->name, n->avg_bw, n->peak_bw);
41 }
42
43 static int icc_summary_show(struct seq_file *s, void *data)
44 {
45         struct icc_provider *provider;
46
47         seq_puts(s, " node                                  tag          avg         peak\n");
48         seq_puts(s, "--------------------------------------------------------------------\n");
49
50         mutex_lock(&icc_lock);
51
52         list_for_each_entry(provider, &icc_providers, provider_list) {
53                 struct icc_node *n;
54
55                 list_for_each_entry(n, &provider->nodes, node_list) {
56                         struct icc_req *r;
57
58                         icc_summary_show_one(s, n);
59                         hlist_for_each_entry(r, &n->req_list, req_node) {
60                                 u32 avg_bw = 0, peak_bw = 0;
61
62                                 if (!r->dev)
63                                         continue;
64
65                                 if (r->enabled) {
66                                         avg_bw = r->avg_bw;
67                                         peak_bw = r->peak_bw;
68                                 }
69
70                                 seq_printf(s, "  %-27s %12u %12u %12u\n",
71                                            dev_name(r->dev), r->tag, avg_bw, peak_bw);
72                         }
73                 }
74         }
75
76         mutex_unlock(&icc_lock);
77
78         return 0;
79 }
80 DEFINE_SHOW_ATTRIBUTE(icc_summary);
81
82 static void icc_graph_show_link(struct seq_file *s, int level,
83                                 struct icc_node *n, struct icc_node *m)
84 {
85         seq_printf(s, "%s\"%d:%s\" -> \"%d:%s\"\n",
86                    level == 2 ? "\t\t" : "\t",
87                    n->id, n->name, m->id, m->name);
88 }
89
90 static void icc_graph_show_node(struct seq_file *s, struct icc_node *n)
91 {
92         seq_printf(s, "\t\t\"%d:%s\" [label=\"%d:%s",
93                    n->id, n->name, n->id, n->name);
94         seq_printf(s, "\n\t\t\t|avg_bw=%ukBps", n->avg_bw);
95         seq_printf(s, "\n\t\t\t|peak_bw=%ukBps", n->peak_bw);
96         seq_puts(s, "\"]\n");
97 }
98
99 static int icc_graph_show(struct seq_file *s, void *data)
100 {
101         struct icc_provider *provider;
102         struct icc_node *n;
103         int cluster_index = 0;
104         int i;
105
106         seq_puts(s, "digraph {\n\trankdir = LR\n\tnode [shape = record]\n");
107         mutex_lock(&icc_lock);
108
109         /* draw providers as cluster subgraphs */
110         cluster_index = 0;
111         list_for_each_entry(provider, &icc_providers, provider_list) {
112                 seq_printf(s, "\tsubgraph cluster_%d {\n", ++cluster_index);
113                 if (provider->dev)
114                         seq_printf(s, "\t\tlabel = \"%s\"\n",
115                                    dev_name(provider->dev));
116
117                 /* draw nodes */
118                 list_for_each_entry(n, &provider->nodes, node_list)
119                         icc_graph_show_node(s, n);
120
121                 /* draw internal links */
122                 list_for_each_entry(n, &provider->nodes, node_list)
123                         for (i = 0; i < n->num_links; ++i)
124                                 if (n->provider == n->links[i]->provider)
125                                         icc_graph_show_link(s, 2, n,
126                                                             n->links[i]);
127
128                 seq_puts(s, "\t}\n");
129         }
130
131         /* draw external links */
132         list_for_each_entry(provider, &icc_providers, provider_list)
133                 list_for_each_entry(n, &provider->nodes, node_list)
134                         for (i = 0; i < n->num_links; ++i)
135                                 if (n->provider != n->links[i]->provider)
136                                         icc_graph_show_link(s, 1, n,
137                                                             n->links[i]);
138
139         mutex_unlock(&icc_lock);
140         seq_puts(s, "}");
141
142         return 0;
143 }
144 DEFINE_SHOW_ATTRIBUTE(icc_graph);
145
146 static struct icc_node *node_find(const int id)
147 {
148         return idr_find(&icc_idr, id);
149 }
150
151 static struct icc_node *node_find_by_name(const char *name)
152 {
153         struct icc_provider *provider;
154         struct icc_node *n;
155
156         list_for_each_entry(provider, &icc_providers, provider_list) {
157                 list_for_each_entry(n, &provider->nodes, node_list) {
158                         if (!strcmp(n->name, name))
159                                 return n;
160                 }
161         }
162
163         return NULL;
164 }
165
166 static struct icc_path *path_init(struct device *dev, struct icc_node *dst,
167                                   ssize_t num_nodes)
168 {
169         struct icc_node *node = dst;
170         struct icc_path *path;
171         int i;
172
173         path = kzalloc(struct_size(path, reqs, num_nodes), GFP_KERNEL);
174         if (!path)
175                 return ERR_PTR(-ENOMEM);
176
177         path->num_nodes = num_nodes;
178
179         for (i = num_nodes - 1; i >= 0; i--) {
180                 node->provider->users++;
181                 hlist_add_head(&path->reqs[i].req_node, &node->req_list);
182                 path->reqs[i].node = node;
183                 path->reqs[i].dev = dev;
184                 path->reqs[i].enabled = true;
185                 /* reference to previous node was saved during path traversal */
186                 node = node->reverse;
187         }
188
189         return path;
190 }
191
192 static struct icc_path *path_find(struct device *dev, struct icc_node *src,
193                                   struct icc_node *dst)
194 {
195         struct icc_path *path = ERR_PTR(-EPROBE_DEFER);
196         struct icc_node *n, *node = NULL;
197         struct list_head traverse_list;
198         struct list_head edge_list;
199         struct list_head visited_list;
200         size_t i, depth = 1;
201         bool found = false;
202
203         INIT_LIST_HEAD(&traverse_list);
204         INIT_LIST_HEAD(&edge_list);
205         INIT_LIST_HEAD(&visited_list);
206
207         list_add(&src->search_list, &traverse_list);
208         src->reverse = NULL;
209
210         do {
211                 list_for_each_entry_safe(node, n, &traverse_list, search_list) {
212                         if (node == dst) {
213                                 found = true;
214                                 list_splice_init(&edge_list, &visited_list);
215                                 list_splice_init(&traverse_list, &visited_list);
216                                 break;
217                         }
218                         for (i = 0; i < node->num_links; i++) {
219                                 struct icc_node *tmp = node->links[i];
220
221                                 if (!tmp) {
222                                         path = ERR_PTR(-ENOENT);
223                                         goto out;
224                                 }
225
226                                 if (tmp->is_traversed)
227                                         continue;
228
229                                 tmp->is_traversed = true;
230                                 tmp->reverse = node;
231                                 list_add_tail(&tmp->search_list, &edge_list);
232                         }
233                 }
234
235                 if (found)
236                         break;
237
238                 list_splice_init(&traverse_list, &visited_list);
239                 list_splice_init(&edge_list, &traverse_list);
240
241                 /* count the hops including the source */
242                 depth++;
243
244         } while (!list_empty(&traverse_list));
245
246 out:
247
248         /* reset the traversed state */
249         list_for_each_entry_reverse(n, &visited_list, search_list)
250                 n->is_traversed = false;
251
252         if (found)
253                 path = path_init(dev, dst, depth);
254
255         return path;
256 }
257
258 /*
259  * We want the path to honor all bandwidth requests, so the average and peak
260  * bandwidth requirements from each consumer are aggregated at each node.
261  * The aggregation is platform specific, so each platform can customize it by
262  * implementing its own aggregate() function.
263  */
264
265 static int aggregate_requests(struct icc_node *node)
266 {
267         struct icc_provider *p = node->provider;
268         struct icc_req *r;
269         u32 avg_bw, peak_bw;
270
271         node->avg_bw = 0;
272         node->peak_bw = 0;
273
274         if (p->pre_aggregate)
275                 p->pre_aggregate(node);
276
277         hlist_for_each_entry(r, &node->req_list, req_node) {
278                 if (r->enabled) {
279                         avg_bw = r->avg_bw;
280                         peak_bw = r->peak_bw;
281                 } else {
282                         avg_bw = 0;
283                         peak_bw = 0;
284                 }
285                 p->aggregate(node, r->tag, avg_bw, peak_bw,
286                              &node->avg_bw, &node->peak_bw);
287
288                 /* during boot use the initial bandwidth as a floor value */
289                 if (!synced_state) {
290                         node->avg_bw = max(node->avg_bw, node->init_avg);
291                         node->peak_bw = max(node->peak_bw, node->init_peak);
292                 }
293         }
294
295         return 0;
296 }
297
298 static int apply_constraints(struct icc_path *path)
299 {
300         struct icc_node *next, *prev = NULL;
301         struct icc_provider *p;
302         int ret = -EINVAL;
303         int i;
304
305         for (i = 0; i < path->num_nodes; i++) {
306                 next = path->reqs[i].node;
307                 p = next->provider;
308
309                 /* both endpoints should be valid master-slave pairs */
310                 if (!prev || (p != prev->provider && !p->inter_set)) {
311                         prev = next;
312                         continue;
313                 }
314
315                 /* set the constraints */
316                 ret = p->set(prev, next);
317                 if (ret)
318                         goto out;
319
320                 prev = next;
321         }
322 out:
323         return ret;
324 }
325
326 int icc_std_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
327                       u32 peak_bw, u32 *agg_avg, u32 *agg_peak)
328 {
329         *agg_avg += avg_bw;
330         *agg_peak = max(*agg_peak, peak_bw);
331
332         return 0;
333 }
334 EXPORT_SYMBOL_GPL(icc_std_aggregate);
335
336 /* of_icc_xlate_onecell() - Translate function using a single index.
337  * @spec: OF phandle args to map into an interconnect node.
338  * @data: private data (pointer to struct icc_onecell_data)
339  *
340  * This is a generic translate function that can be used to model simple
341  * interconnect providers that have one device tree node and provide
342  * multiple interconnect nodes. A single cell is used as an index into
343  * an array of icc nodes specified in the icc_onecell_data struct when
344  * registering the provider.
345  */
346 struct icc_node *of_icc_xlate_onecell(struct of_phandle_args *spec,
347                                       void *data)
348 {
349         struct icc_onecell_data *icc_data = data;
350         unsigned int idx = spec->args[0];
351
352         if (idx >= icc_data->num_nodes) {
353                 pr_err("%s: invalid index %u\n", __func__, idx);
354                 return ERR_PTR(-EINVAL);
355         }
356
357         return icc_data->nodes[idx];
358 }
359 EXPORT_SYMBOL_GPL(of_icc_xlate_onecell);
360
361 /**
362  * of_icc_get_from_provider() - Look-up interconnect node
363  * @spec: OF phandle args to use for look-up
364  *
365  * Looks for interconnect provider under the node specified by @spec and if
366  * found, uses xlate function of the provider to map phandle args to node.
367  *
368  * Returns a valid pointer to struct icc_node_data on success or ERR_PTR()
369  * on failure.
370  */
371 struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec)
372 {
373         struct icc_node *node = ERR_PTR(-EPROBE_DEFER);
374         struct icc_node_data *data = NULL;
375         struct icc_provider *provider;
376
377         if (!spec)
378                 return ERR_PTR(-EINVAL);
379
380         mutex_lock(&icc_lock);
381         list_for_each_entry(provider, &icc_providers, provider_list) {
382                 if (provider->dev->of_node == spec->np) {
383                         if (provider->xlate_extended) {
384                                 data = provider->xlate_extended(spec, provider->data);
385                                 if (!IS_ERR(data)) {
386                                         node = data->node;
387                                         break;
388                                 }
389                         } else {
390                                 node = provider->xlate(spec, provider->data);
391                                 if (!IS_ERR(node))
392                                         break;
393                         }
394                 }
395         }
396         mutex_unlock(&icc_lock);
397
398         if (!node)
399                 return ERR_PTR(-EINVAL);
400
401         if (IS_ERR(node))
402                 return ERR_CAST(node);
403
404         if (!data) {
405                 data = kzalloc(sizeof(*data), GFP_KERNEL);
406                 if (!data)
407                         return ERR_PTR(-ENOMEM);
408                 data->node = node;
409         }
410
411         return data;
412 }
413 EXPORT_SYMBOL_GPL(of_icc_get_from_provider);
414
415 static void devm_icc_release(struct device *dev, void *res)
416 {
417         icc_put(*(struct icc_path **)res);
418 }
419
420 struct icc_path *devm_of_icc_get(struct device *dev, const char *name)
421 {
422         struct icc_path **ptr, *path;
423
424         ptr = devres_alloc(devm_icc_release, sizeof(*ptr), GFP_KERNEL);
425         if (!ptr)
426                 return ERR_PTR(-ENOMEM);
427
428         path = of_icc_get(dev, name);
429         if (!IS_ERR(path)) {
430                 *ptr = path;
431                 devres_add(dev, ptr);
432         } else {
433                 devres_free(ptr);
434         }
435
436         return path;
437 }
438 EXPORT_SYMBOL_GPL(devm_of_icc_get);
439
440 /**
441  * of_icc_get_by_index() - get a path handle from a DT node based on index
442  * @dev: device pointer for the consumer device
443  * @idx: interconnect path index
444  *
445  * This function will search for a path between two endpoints and return an
446  * icc_path handle on success. Use icc_put() to release constraints when they
447  * are not needed anymore.
448  * If the interconnect API is disabled, NULL is returned and the consumer
449  * drivers will still build. Drivers are free to handle this specifically,
450  * but they don't have to.
451  *
452  * Return: icc_path pointer on success or ERR_PTR() on error. NULL is returned
453  * when the API is disabled or the "interconnects" DT property is missing.
454  */
455 struct icc_path *of_icc_get_by_index(struct device *dev, int idx)
456 {
457         struct icc_path *path;
458         struct icc_node_data *src_data, *dst_data;
459         struct device_node *np;
460         struct of_phandle_args src_args, dst_args;
461         int ret;
462
463         if (!dev || !dev->of_node)
464                 return ERR_PTR(-ENODEV);
465
466         np = dev->of_node;
467
468         /*
469          * When the consumer DT node do not have "interconnects" property
470          * return a NULL path to skip setting constraints.
471          */
472         if (!of_property_present(np, "interconnects"))
473                 return NULL;
474
475         /*
476          * We use a combination of phandle and specifier for endpoint. For now
477          * lets support only global ids and extend this in the future if needed
478          * without breaking DT compatibility.
479          */
480         ret = of_parse_phandle_with_args(np, "interconnects",
481                                          "#interconnect-cells", idx * 2,
482                                          &src_args);
483         if (ret)
484                 return ERR_PTR(ret);
485
486         of_node_put(src_args.np);
487
488         ret = of_parse_phandle_with_args(np, "interconnects",
489                                          "#interconnect-cells", idx * 2 + 1,
490                                          &dst_args);
491         if (ret)
492                 return ERR_PTR(ret);
493
494         of_node_put(dst_args.np);
495
496         src_data = of_icc_get_from_provider(&src_args);
497
498         if (IS_ERR(src_data)) {
499                 dev_err_probe(dev, PTR_ERR(src_data), "error finding src node\n");
500                 return ERR_CAST(src_data);
501         }
502
503         dst_data = of_icc_get_from_provider(&dst_args);
504
505         if (IS_ERR(dst_data)) {
506                 dev_err_probe(dev, PTR_ERR(dst_data), "error finding dst node\n");
507                 kfree(src_data);
508                 return ERR_CAST(dst_data);
509         }
510
511         mutex_lock(&icc_lock);
512         path = path_find(dev, src_data->node, dst_data->node);
513         mutex_unlock(&icc_lock);
514         if (IS_ERR(path)) {
515                 dev_err(dev, "%s: invalid path=%ld\n", __func__, PTR_ERR(path));
516                 goto free_icc_data;
517         }
518
519         if (src_data->tag && src_data->tag == dst_data->tag)
520                 icc_set_tag(path, src_data->tag);
521
522         path->name = kasprintf(GFP_KERNEL, "%s-%s",
523                                src_data->node->name, dst_data->node->name);
524         if (!path->name) {
525                 kfree(path);
526                 path = ERR_PTR(-ENOMEM);
527         }
528
529 free_icc_data:
530         kfree(src_data);
531         kfree(dst_data);
532         return path;
533 }
534 EXPORT_SYMBOL_GPL(of_icc_get_by_index);
535
536 /**
537  * of_icc_get() - get a path handle from a DT node based on name
538  * @dev: device pointer for the consumer device
539  * @name: interconnect path name
540  *
541  * This function will search for a path between two endpoints and return an
542  * icc_path handle on success. Use icc_put() to release constraints when they
543  * are not needed anymore.
544  * If the interconnect API is disabled, NULL is returned and the consumer
545  * drivers will still build. Drivers are free to handle this specifically,
546  * but they don't have to.
547  *
548  * Return: icc_path pointer on success or ERR_PTR() on error. NULL is returned
549  * when the API is disabled or the "interconnects" DT property is missing.
550  */
551 struct icc_path *of_icc_get(struct device *dev, const char *name)
552 {
553         struct device_node *np;
554         int idx = 0;
555
556         if (!dev || !dev->of_node)
557                 return ERR_PTR(-ENODEV);
558
559         np = dev->of_node;
560
561         /*
562          * When the consumer DT node do not have "interconnects" property
563          * return a NULL path to skip setting constraints.
564          */
565         if (!of_property_present(np, "interconnects"))
566                 return NULL;
567
568         /*
569          * We use a combination of phandle and specifier for endpoint. For now
570          * lets support only global ids and extend this in the future if needed
571          * without breaking DT compatibility.
572          */
573         if (name) {
574                 idx = of_property_match_string(np, "interconnect-names", name);
575                 if (idx < 0)
576                         return ERR_PTR(idx);
577         }
578
579         return of_icc_get_by_index(dev, idx);
580 }
581 EXPORT_SYMBOL_GPL(of_icc_get);
582
583 /**
584  * icc_get() - get a path handle between two endpoints
585  * @dev: device pointer for the consumer device
586  * @src: source node name
587  * @dst: destination node name
588  *
589  * This function will search for a path between two endpoints and return an
590  * icc_path handle on success. Use icc_put() to release constraints when they
591  * are not needed anymore.
592  *
593  * Return: icc_path pointer on success or ERR_PTR() on error. NULL is returned
594  * when the API is disabled.
595  */
596 struct icc_path *icc_get(struct device *dev, const char *src, const char *dst)
597 {
598         struct icc_node *src_node, *dst_node;
599         struct icc_path *path = ERR_PTR(-EPROBE_DEFER);
600
601         mutex_lock(&icc_lock);
602
603         src_node = node_find_by_name(src);
604         if (!src_node) {
605                 dev_err(dev, "%s: invalid src=%s\n", __func__, src);
606                 goto out;
607         }
608
609         dst_node = node_find_by_name(dst);
610         if (!dst_node) {
611                 dev_err(dev, "%s: invalid dst=%s\n", __func__, dst);
612                 goto out;
613         }
614
615         path = path_find(dev, src_node, dst_node);
616         if (IS_ERR(path)) {
617                 dev_err(dev, "%s: invalid path=%ld\n", __func__, PTR_ERR(path));
618                 goto out;
619         }
620
621         path->name = kasprintf(GFP_KERNEL, "%s-%s", src_node->name, dst_node->name);
622         if (!path->name) {
623                 kfree(path);
624                 path = ERR_PTR(-ENOMEM);
625         }
626 out:
627         mutex_unlock(&icc_lock);
628         return path;
629 }
630
631 /**
632  * icc_set_tag() - set an optional tag on a path
633  * @path: the path we want to tag
634  * @tag: the tag value
635  *
636  * This function allows consumers to append a tag to the requests associated
637  * with a path, so that a different aggregation could be done based on this tag.
638  */
639 void icc_set_tag(struct icc_path *path, u32 tag)
640 {
641         int i;
642
643         if (!path)
644                 return;
645
646         mutex_lock(&icc_lock);
647
648         for (i = 0; i < path->num_nodes; i++)
649                 path->reqs[i].tag = tag;
650
651         mutex_unlock(&icc_lock);
652 }
653 EXPORT_SYMBOL_GPL(icc_set_tag);
654
655 /**
656  * icc_get_name() - Get name of the icc path
657  * @path: interconnect path
658  *
659  * This function is used by an interconnect consumer to get the name of the icc
660  * path.
661  *
662  * Returns a valid pointer on success, or NULL otherwise.
663  */
664 const char *icc_get_name(struct icc_path *path)
665 {
666         if (!path)
667                 return NULL;
668
669         return path->name;
670 }
671 EXPORT_SYMBOL_GPL(icc_get_name);
672
673 /**
674  * icc_set_bw() - set bandwidth constraints on an interconnect path
675  * @path: interconnect path
676  * @avg_bw: average bandwidth in kilobytes per second
677  * @peak_bw: peak bandwidth in kilobytes per second
678  *
679  * This function is used by an interconnect consumer to express its own needs
680  * in terms of bandwidth for a previously requested path between two endpoints.
681  * The requests are aggregated and each node is updated accordingly. The entire
682  * path is locked by a mutex to ensure that the set() is completed.
683  * The @path can be NULL when the "interconnects" DT properties is missing,
684  * which will mean that no constraints will be set.
685  *
686  * Returns 0 on success, or an appropriate error code otherwise.
687  */
688 int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw)
689 {
690         struct icc_node *node;
691         u32 old_avg, old_peak;
692         size_t i;
693         int ret;
694
695         if (!path)
696                 return 0;
697
698         if (WARN_ON(IS_ERR(path) || !path->num_nodes))
699                 return -EINVAL;
700
701         mutex_lock(&icc_bw_lock);
702
703         old_avg = path->reqs[0].avg_bw;
704         old_peak = path->reqs[0].peak_bw;
705
706         for (i = 0; i < path->num_nodes; i++) {
707                 node = path->reqs[i].node;
708
709                 /* update the consumer request for this path */
710                 path->reqs[i].avg_bw = avg_bw;
711                 path->reqs[i].peak_bw = peak_bw;
712
713                 /* aggregate requests for this node */
714                 aggregate_requests(node);
715
716                 trace_icc_set_bw(path, node, i, avg_bw, peak_bw);
717         }
718
719         ret = apply_constraints(path);
720         if (ret) {
721                 pr_debug("interconnect: error applying constraints (%d)\n",
722                          ret);
723
724                 for (i = 0; i < path->num_nodes; i++) {
725                         node = path->reqs[i].node;
726                         path->reqs[i].avg_bw = old_avg;
727                         path->reqs[i].peak_bw = old_peak;
728                         aggregate_requests(node);
729                 }
730                 apply_constraints(path);
731         }
732
733         mutex_unlock(&icc_bw_lock);
734
735         trace_icc_set_bw_end(path, ret);
736
737         return ret;
738 }
739 EXPORT_SYMBOL_GPL(icc_set_bw);
740
741 static int __icc_enable(struct icc_path *path, bool enable)
742 {
743         int i;
744
745         if (!path)
746                 return 0;
747
748         if (WARN_ON(IS_ERR(path) || !path->num_nodes))
749                 return -EINVAL;
750
751         mutex_lock(&icc_lock);
752
753         for (i = 0; i < path->num_nodes; i++)
754                 path->reqs[i].enabled = enable;
755
756         mutex_unlock(&icc_lock);
757
758         return icc_set_bw(path, path->reqs[0].avg_bw,
759                           path->reqs[0].peak_bw);
760 }
761
762 int icc_enable(struct icc_path *path)
763 {
764         return __icc_enable(path, true);
765 }
766 EXPORT_SYMBOL_GPL(icc_enable);
767
768 int icc_disable(struct icc_path *path)
769 {
770         return __icc_enable(path, false);
771 }
772 EXPORT_SYMBOL_GPL(icc_disable);
773
774 /**
775  * icc_put() - release the reference to the icc_path
776  * @path: interconnect path
777  *
778  * Use this function to release the constraints on a path when the path is
779  * no longer needed. The constraints will be re-aggregated.
780  */
781 void icc_put(struct icc_path *path)
782 {
783         struct icc_node *node;
784         size_t i;
785         int ret;
786
787         if (!path || WARN_ON(IS_ERR(path)))
788                 return;
789
790         ret = icc_set_bw(path, 0, 0);
791         if (ret)
792                 pr_err("%s: error (%d)\n", __func__, ret);
793
794         mutex_lock(&icc_lock);
795         for (i = 0; i < path->num_nodes; i++) {
796                 node = path->reqs[i].node;
797                 hlist_del(&path->reqs[i].req_node);
798                 if (!WARN_ON(!node->provider->users))
799                         node->provider->users--;
800         }
801         mutex_unlock(&icc_lock);
802
803         kfree_const(path->name);
804         kfree(path);
805 }
806 EXPORT_SYMBOL_GPL(icc_put);
807
808 static struct icc_node *icc_node_create_nolock(int id)
809 {
810         struct icc_node *node;
811
812         /* check if node already exists */
813         node = node_find(id);
814         if (node)
815                 return node;
816
817         node = kzalloc(sizeof(*node), GFP_KERNEL);
818         if (!node)
819                 return ERR_PTR(-ENOMEM);
820
821         id = idr_alloc(&icc_idr, node, id, id + 1, GFP_KERNEL);
822         if (id < 0) {
823                 WARN(1, "%s: couldn't get idr\n", __func__);
824                 kfree(node);
825                 return ERR_PTR(id);
826         }
827
828         node->id = id;
829
830         return node;
831 }
832
833 /**
834  * icc_node_create() - create a node
835  * @id: node id
836  *
837  * Return: icc_node pointer on success, or ERR_PTR() on error
838  */
839 struct icc_node *icc_node_create(int id)
840 {
841         struct icc_node *node;
842
843         mutex_lock(&icc_lock);
844
845         node = icc_node_create_nolock(id);
846
847         mutex_unlock(&icc_lock);
848
849         return node;
850 }
851 EXPORT_SYMBOL_GPL(icc_node_create);
852
853 /**
854  * icc_node_destroy() - destroy a node
855  * @id: node id
856  */
857 void icc_node_destroy(int id)
858 {
859         struct icc_node *node;
860
861         mutex_lock(&icc_lock);
862
863         node = node_find(id);
864         if (node) {
865                 idr_remove(&icc_idr, node->id);
866                 WARN_ON(!hlist_empty(&node->req_list));
867         }
868
869         mutex_unlock(&icc_lock);
870
871         if (!node)
872                 return;
873
874         kfree(node->links);
875         kfree(node);
876 }
877 EXPORT_SYMBOL_GPL(icc_node_destroy);
878
879 /**
880  * icc_link_create() - create a link between two nodes
881  * @node: source node id
882  * @dst_id: destination node id
883  *
884  * Create a link between two nodes. The nodes might belong to different
885  * interconnect providers and the @dst_id node might not exist (if the
886  * provider driver has not probed yet). So just create the @dst_id node
887  * and when the actual provider driver is probed, the rest of the node
888  * data is filled.
889  *
890  * Return: 0 on success, or an error code otherwise
891  */
892 int icc_link_create(struct icc_node *node, const int dst_id)
893 {
894         struct icc_node *dst;
895         struct icc_node **new;
896         int ret = 0;
897
898         if (!node->provider)
899                 return -EINVAL;
900
901         mutex_lock(&icc_lock);
902
903         dst = node_find(dst_id);
904         if (!dst) {
905                 dst = icc_node_create_nolock(dst_id);
906
907                 if (IS_ERR(dst)) {
908                         ret = PTR_ERR(dst);
909                         goto out;
910                 }
911         }
912
913         new = krealloc(node->links,
914                        (node->num_links + 1) * sizeof(*node->links),
915                        GFP_KERNEL);
916         if (!new) {
917                 ret = -ENOMEM;
918                 goto out;
919         }
920
921         node->links = new;
922         node->links[node->num_links++] = dst;
923
924 out:
925         mutex_unlock(&icc_lock);
926
927         return ret;
928 }
929 EXPORT_SYMBOL_GPL(icc_link_create);
930
931 /**
932  * icc_node_add() - add interconnect node to interconnect provider
933  * @node: pointer to the interconnect node
934  * @provider: pointer to the interconnect provider
935  */
936 void icc_node_add(struct icc_node *node, struct icc_provider *provider)
937 {
938         if (WARN_ON(node->provider))
939                 return;
940
941         mutex_lock(&icc_lock);
942         mutex_lock(&icc_bw_lock);
943
944         node->provider = provider;
945         list_add_tail(&node->node_list, &provider->nodes);
946
947         /* get the initial bandwidth values and sync them with hardware */
948         if (provider->get_bw) {
949                 provider->get_bw(node, &node->init_avg, &node->init_peak);
950         } else {
951                 node->init_avg = INT_MAX;
952                 node->init_peak = INT_MAX;
953         }
954         node->avg_bw = node->init_avg;
955         node->peak_bw = node->init_peak;
956
957         if (node->avg_bw || node->peak_bw) {
958                 if (provider->pre_aggregate)
959                         provider->pre_aggregate(node);
960
961                 if (provider->aggregate)
962                         provider->aggregate(node, 0, node->init_avg, node->init_peak,
963                                             &node->avg_bw, &node->peak_bw);
964                 if (provider->set)
965                         provider->set(node, node);
966         }
967
968         node->avg_bw = 0;
969         node->peak_bw = 0;
970
971         mutex_unlock(&icc_bw_lock);
972         mutex_unlock(&icc_lock);
973 }
974 EXPORT_SYMBOL_GPL(icc_node_add);
975
976 /**
977  * icc_node_del() - delete interconnect node from interconnect provider
978  * @node: pointer to the interconnect node
979  */
980 void icc_node_del(struct icc_node *node)
981 {
982         mutex_lock(&icc_lock);
983
984         list_del(&node->node_list);
985
986         mutex_unlock(&icc_lock);
987 }
988 EXPORT_SYMBOL_GPL(icc_node_del);
989
990 /**
991  * icc_nodes_remove() - remove all previously added nodes from provider
992  * @provider: the interconnect provider we are removing nodes from
993  *
994  * Return: 0 on success, or an error code otherwise
995  */
996 int icc_nodes_remove(struct icc_provider *provider)
997 {
998         struct icc_node *n, *tmp;
999
1000         if (WARN_ON(IS_ERR_OR_NULL(provider)))
1001                 return -EINVAL;
1002
1003         list_for_each_entry_safe_reverse(n, tmp, &provider->nodes, node_list) {
1004                 icc_node_del(n);
1005                 icc_node_destroy(n->id);
1006         }
1007
1008         return 0;
1009 }
1010 EXPORT_SYMBOL_GPL(icc_nodes_remove);
1011
1012 /**
1013  * icc_provider_init() - initialize a new interconnect provider
1014  * @provider: the interconnect provider to initialize
1015  *
1016  * Must be called before adding nodes to the provider.
1017  */
1018 void icc_provider_init(struct icc_provider *provider)
1019 {
1020         WARN_ON(!provider->set);
1021
1022         INIT_LIST_HEAD(&provider->nodes);
1023 }
1024 EXPORT_SYMBOL_GPL(icc_provider_init);
1025
1026 /**
1027  * icc_provider_register() - register a new interconnect provider
1028  * @provider: the interconnect provider to register
1029  *
1030  * Return: 0 on success, or an error code otherwise
1031  */
1032 int icc_provider_register(struct icc_provider *provider)
1033 {
1034         if (WARN_ON(!provider->xlate && !provider->xlate_extended))
1035                 return -EINVAL;
1036
1037         mutex_lock(&icc_lock);
1038         list_add_tail(&provider->provider_list, &icc_providers);
1039         mutex_unlock(&icc_lock);
1040
1041         dev_dbg(provider->dev, "interconnect provider registered\n");
1042
1043         return 0;
1044 }
1045 EXPORT_SYMBOL_GPL(icc_provider_register);
1046
1047 /**
1048  * icc_provider_deregister() - deregister an interconnect provider
1049  * @provider: the interconnect provider to deregister
1050  */
1051 void icc_provider_deregister(struct icc_provider *provider)
1052 {
1053         mutex_lock(&icc_lock);
1054         WARN_ON(provider->users);
1055
1056         list_del(&provider->provider_list);
1057         mutex_unlock(&icc_lock);
1058 }
1059 EXPORT_SYMBOL_GPL(icc_provider_deregister);
1060
1061 static const struct of_device_id __maybe_unused ignore_list[] = {
1062         { .compatible = "qcom,sc7180-ipa-virt" },
1063         { .compatible = "qcom,sc8180x-ipa-virt" },
1064         { .compatible = "qcom,sdx55-ipa-virt" },
1065         { .compatible = "qcom,sm8150-ipa-virt" },
1066         { .compatible = "qcom,sm8250-ipa-virt" },
1067         {}
1068 };
1069
1070 static int of_count_icc_providers(struct device_node *np)
1071 {
1072         struct device_node *child;
1073         int count = 0;
1074
1075         for_each_available_child_of_node(np, child) {
1076                 if (of_property_read_bool(child, "#interconnect-cells") &&
1077                     likely(!of_match_node(ignore_list, child)))
1078                         count++;
1079                 count += of_count_icc_providers(child);
1080         }
1081
1082         return count;
1083 }
1084
1085 void icc_sync_state(struct device *dev)
1086 {
1087         struct icc_provider *p;
1088         struct icc_node *n;
1089         static int count;
1090
1091         count++;
1092
1093         if (count < providers_count)
1094                 return;
1095
1096         mutex_lock(&icc_lock);
1097         mutex_lock(&icc_bw_lock);
1098         synced_state = true;
1099         list_for_each_entry(p, &icc_providers, provider_list) {
1100                 dev_dbg(p->dev, "interconnect provider is in synced state\n");
1101                 list_for_each_entry(n, &p->nodes, node_list) {
1102                         if (n->init_avg || n->init_peak) {
1103                                 n->init_avg = 0;
1104                                 n->init_peak = 0;
1105                                 aggregate_requests(n);
1106                                 p->set(n, n);
1107                         }
1108                 }
1109         }
1110         mutex_unlock(&icc_bw_lock);
1111         mutex_unlock(&icc_lock);
1112 }
1113 EXPORT_SYMBOL_GPL(icc_sync_state);
1114
1115 static int __init icc_init(void)
1116 {
1117         struct device_node *root;
1118
1119         /* Teach lockdep about lock ordering wrt. shrinker: */
1120         fs_reclaim_acquire(GFP_KERNEL);
1121         might_lock(&icc_bw_lock);
1122         fs_reclaim_release(GFP_KERNEL);
1123
1124         root = of_find_node_by_path("/");
1125
1126         providers_count = of_count_icc_providers(root);
1127         of_node_put(root);
1128
1129         icc_debugfs_dir = debugfs_create_dir("interconnect", NULL);
1130         debugfs_create_file("interconnect_summary", 0444,
1131                             icc_debugfs_dir, NULL, &icc_summary_fops);
1132         debugfs_create_file("interconnect_graph", 0444,
1133                             icc_debugfs_dir, NULL, &icc_graph_fops);
1134
1135         icc_debugfs_client_init(icc_debugfs_dir);
1136
1137         return 0;
1138 }
1139
1140 device_initcall(icc_init);