Skip to content

Commit

Permalink
interconnect: Add support for path tags
Browse files Browse the repository at this point in the history
Consumers may have use cases with different bandwidth requirements based
on the system or driver state. The consumer driver can append a specific
tag to the path and pass this information to the interconnect platform
driver to do the aggregation based on this state.

Introduce icc_set_tag() function that will allow the consumers to append
an optional tag to each path. The aggregation of these tagged paths is
platform specific.

Reviewed-by: Evan Green <[email protected]>
Signed-off-by: Georgi Djakov <[email protected]>
  • Loading branch information
Georgi Djakov committed Aug 13, 2019
1 parent d45331b commit 127ab2c
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 4 deletions.
24 changes: 23 additions & 1 deletion drivers/interconnect/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@ static struct dentry *icc_debugfs_dir;
* @req_node: entry in list of requests for the particular @node
* @node: the interconnect node to which this constraint applies
* @dev: reference to the device that sets the constraints
* @tag: path tag (optional)
* @avg_bw: an integer describing the average bandwidth in kBps
* @peak_bw: an integer describing the peak bandwidth in kBps
*/
struct icc_req {
struct hlist_node req_node;
struct icc_node *node;
struct device *dev;
u32 tag;
u32 avg_bw;
u32 peak_bw;
};
Expand Down Expand Up @@ -204,7 +206,7 @@ static int aggregate_requests(struct icc_node *node)
node->peak_bw = 0;

hlist_for_each_entry(r, &node->req_list, req_node)
p->aggregate(node, r->avg_bw, r->peak_bw,
p->aggregate(node, r->tag, r->avg_bw, r->peak_bw,
&node->avg_bw, &node->peak_bw);

return 0;
Expand Down Expand Up @@ -385,6 +387,26 @@ struct icc_path *of_icc_get(struct device *dev, const char *name)
}
EXPORT_SYMBOL_GPL(of_icc_get);

/**
* icc_set_tag() - set an optional tag on a path
* @path: the path we want to tag
* @tag: the tag value
*
* This function allows consumers to append a tag to the requests associated
* with a path, so that a different aggregation could be done based on this tag.
*/
void icc_set_tag(struct icc_path *path, u32 tag)
{
int i;

if (!path)
return;

for (i = 0; i < path->num_nodes; i++)
path->reqs[i].tag = tag;
}
EXPORT_SYMBOL_GPL(icc_set_tag);

/**
* icc_set_bw() - set bandwidth constraints on an interconnect path
* @path: reference to the path returned by icc_get()
Expand Down
2 changes: 1 addition & 1 deletion drivers/interconnect/qcom/sdm845.c
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,7 @@ static void bcm_aggregate(struct qcom_icc_bcm *bcm)
bcm->dirty = false;
}

static int qcom_icc_aggregate(struct icc_node *node, u32 avg_bw,
static int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
u32 peak_bw, u32 *agg_avg, u32 *agg_peak)
{
size_t i;
Expand Down
4 changes: 2 additions & 2 deletions include/linux/interconnect-provider.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ struct icc_provider {
struct list_head provider_list;
struct list_head nodes;
int (*set)(struct icc_node *src, struct icc_node *dst);
int (*aggregate)(struct icc_node *node, u32 avg_bw, u32 peak_bw,
u32 *agg_avg, u32 *agg_peak);
int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw,
u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
struct icc_node* (*xlate)(struct of_phandle_args *spec, void *data);
struct device *dev;
int users;
Expand Down
5 changes: 5 additions & 0 deletions include/linux/interconnect.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct icc_path *icc_get(struct device *dev, const int src_id,
struct icc_path *of_icc_get(struct device *dev, const char *name);
void icc_put(struct icc_path *path);
int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw);
void icc_set_tag(struct icc_path *path, u32 tag);

#else

Expand All @@ -54,6 +55,10 @@ static inline int icc_set_bw(struct icc_path *path, u32 avg_bw, u32 peak_bw)
return 0;
}

static inline void icc_set_tag(struct icc_path *path, u32 tag)
{
}

#endif /* CONFIG_INTERCONNECT */

#endif /* __LINUX_INTERCONNECT_H */

0 comments on commit 127ab2c

Please sign in to comment.