Lines Matching full:path
170 struct icc_path *path; in path_init() local
173 path = kzalloc(struct_size(path, reqs, num_nodes), GFP_KERNEL); in path_init()
174 if (!path) in path_init()
177 path->num_nodes = num_nodes; in path_init()
181 hlist_add_head(&path->reqs[i].req_node, &node->req_list); in path_init()
182 path->reqs[i].node = node; in path_init()
183 path->reqs[i].dev = dev; in path_init()
184 path->reqs[i].enabled = true; in path_init()
185 /* reference to previous node was saved during path traversal */ in path_init()
189 return path; in path_init()
195 struct icc_path *path = ERR_PTR(-EPROBE_DEFER); in path_find() local
222 path = ERR_PTR(-ENOENT); in path_find()
253 path = path_init(dev, dst, depth); in path_find()
255 return path; in path_find()
259 * We want the path to honor all bandwidth requests, so the average and peak
298 static int apply_constraints(struct icc_path *path) in apply_constraints() argument
305 for (i = 0; i < path->num_nodes; i++) { in apply_constraints()
306 next = path->reqs[i].node; in apply_constraints()
422 struct icc_path **ptr, *path; in devm_of_icc_get() local
428 path = of_icc_get(dev, name); in devm_of_icc_get()
429 if (!IS_ERR(path)) { in devm_of_icc_get()
430 *ptr = path; in devm_of_icc_get()
436 return path; in devm_of_icc_get()
441 * of_icc_get_by_index() - get a path handle from a DT node based on index
443 * @idx: interconnect path index
445 * This function will search for a path between two endpoints and return an
457 struct icc_path *path; in of_icc_get_by_index() local
470 * return a NULL path to skip setting constraints. in of_icc_get_by_index()
512 path = path_find(dev, src_data->node, dst_data->node); in of_icc_get_by_index()
514 if (IS_ERR(path)) { in of_icc_get_by_index()
515 dev_err(dev, "%s: invalid path=%ld\n", __func__, PTR_ERR(path)); in of_icc_get_by_index()
520 icc_set_tag(path, src_data->tag); in of_icc_get_by_index()
522 path->name = kasprintf(GFP_KERNEL, "%s-%s", in of_icc_get_by_index()
524 if (!path->name) { in of_icc_get_by_index()
525 kfree(path); in of_icc_get_by_index()
526 path = ERR_PTR(-ENOMEM); in of_icc_get_by_index()
532 return path; in of_icc_get_by_index()
537 * of_icc_get() - get a path handle from a DT node based on name
539 * @name: interconnect path name
541 * This function will search for a path between two endpoints and return an
563 * return a NULL path to skip setting constraints. in of_icc_get()
584 * icc_get() - get a path handle between two endpoints
589 * This function will search for a path between two endpoints and return an
599 struct icc_path *path = ERR_PTR(-EPROBE_DEFER); in icc_get() local
615 path = path_find(dev, src_node, dst_node); in icc_get()
616 if (IS_ERR(path)) { in icc_get()
617 dev_err(dev, "%s: invalid path=%ld\n", __func__, PTR_ERR(path)); in icc_get()
621 path->name = kasprintf(GFP_KERNEL, "%s-%s", src_node->name, dst_node->name); in icc_get()
622 if (!path->name) { in icc_get()
623 kfree(path); in icc_get()
624 path = ERR_PTR(-ENOMEM); in icc_get()
628 return path; in icc_get()
632 * icc_set_tag() - set an optional tag on a path
633 * @path: the path we want to tag
637 * with a path, so that a different aggregation could be done based on this tag.
639 void icc_set_tag(struct icc_path *path, u32 tag) in icc_set_tag() argument
643 if (!path) in icc_set_tag()
648 for (i = 0; i < path->num_nodes; i++) in icc_set_tag()
649 path->reqs[i].tag = tag; in icc_set_tag()
656 * icc_get_name() - Get name of the icc path
657 * @path: interconnect path
660 * path.
664 const char *icc_get_name(struct icc_path *path) in icc_get_name() argument
666 if (!path) in icc_get_name()
669 return path->name; in icc_get_name()
674 * icc_set_bw() - set bandwidth constraints on an interconnect path
675 * @path: interconnect path
680 * in terms of bandwidth for a previously requested path between two endpoints.
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,
688 int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw) in icc_set_bw() argument
695 if (!path) in icc_set_bw()
698 if (WARN_ON(IS_ERR(path) || !path->num_nodes)) in icc_set_bw()
703 old_avg = path->reqs[0].avg_bw; in icc_set_bw()
704 old_peak = path->reqs[0].peak_bw; in icc_set_bw()
706 for (i = 0; i < path->num_nodes; i++) { in icc_set_bw()
707 node = path->reqs[i].node; in icc_set_bw()
709 /* update the consumer request for this path */ in icc_set_bw()
710 path->reqs[i].avg_bw = avg_bw; in icc_set_bw()
711 path->reqs[i].peak_bw = peak_bw; in icc_set_bw()
716 trace_icc_set_bw(path, node, i, avg_bw, peak_bw); in icc_set_bw()
719 ret = apply_constraints(path); in icc_set_bw()
724 for (i = 0; i < path->num_nodes; i++) { in icc_set_bw()
725 node = path->reqs[i].node; in icc_set_bw()
726 path->reqs[i].avg_bw = old_avg; in icc_set_bw()
727 path->reqs[i].peak_bw = old_peak; in icc_set_bw()
730 apply_constraints(path); in icc_set_bw()
735 trace_icc_set_bw_end(path, ret); in icc_set_bw()
741 static int __icc_enable(struct icc_path *path, bool enable) in __icc_enable() argument
745 if (!path) in __icc_enable()
748 if (WARN_ON(IS_ERR(path) || !path->num_nodes)) in __icc_enable()
753 for (i = 0; i < path->num_nodes; i++) in __icc_enable()
754 path->reqs[i].enabled = enable; in __icc_enable()
758 return icc_set_bw(path, path->reqs[0].avg_bw, in __icc_enable()
759 path->reqs[0].peak_bw); in __icc_enable()
762 int icc_enable(struct icc_path *path) in icc_enable() argument
764 return __icc_enable(path, true); in icc_enable()
768 int icc_disable(struct icc_path *path) in icc_disable() argument
770 return __icc_enable(path, false); in icc_disable()
776 * @path: interconnect path
778 * Use this function to release the constraints on a path when the path is
781 void icc_put(struct icc_path *path) in icc_put() argument
787 if (!path || WARN_ON(IS_ERR(path))) in icc_put()
790 ret = icc_set_bw(path, 0, 0); in icc_put()
795 for (i = 0; i < path->num_nodes; i++) { in icc_put()
796 node = path->reqs[i].node; in icc_put()
797 hlist_del(&path->reqs[i].req_node); in icc_put()
803 kfree_const(path->name); in icc_put()
804 kfree(path); in icc_put()