linux/include/linux/interconnect-provider.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (c) 2018, Linaro Ltd.
   4 * Author: Georgi Djakov <georgi.djakov@linaro.org>
   5 */
   6
   7#ifndef __LINUX_INTERCONNECT_PROVIDER_H
   8#define __LINUX_INTERCONNECT_PROVIDER_H
   9
  10#include <linux/interconnect.h>
  11
  12#define icc_units_to_bps(bw)  ((bw) * 1000ULL)
  13
  14struct icc_node;
  15struct of_phandle_args;
  16
  17/**
  18 * struct icc_node_data - icc node data
  19 *
  20 * @node: icc node
  21 * @tag: tag
  22 */
  23struct icc_node_data {
  24        struct icc_node *node;
  25        u32 tag;
  26};
  27
  28/**
  29 * struct icc_onecell_data - driver data for onecell interconnect providers
  30 *
  31 * @num_nodes: number of nodes in this device
  32 * @nodes: array of pointers to the nodes in this device
  33 */
  34struct icc_onecell_data {
  35        unsigned int num_nodes;
  36        struct icc_node *nodes[];
  37};
  38
  39struct icc_node *of_icc_xlate_onecell(struct of_phandle_args *spec,
  40                                      void *data);
  41
  42/**
  43 * struct icc_provider - interconnect provider (controller) entity that might
  44 * provide multiple interconnect controls
  45 *
  46 * @provider_list: list of the registered interconnect providers
  47 * @nodes: internal list of the interconnect provider nodes
  48 * @set: pointer to device specific set operation function
  49 * @aggregate: pointer to device specific aggregate operation function
  50 * @pre_aggregate: pointer to device specific function that is called
  51 *                 before the aggregation begins (optional)
  52 * @get_bw: pointer to device specific function to get current bandwidth
  53 * @xlate: provider-specific callback for mapping nodes from phandle arguments
  54 * @xlate_extended: vendor-specific callback for mapping node data from phandle arguments
  55 * @dev: the device this interconnect provider belongs to
  56 * @users: count of active users
  57 * @inter_set: whether inter-provider pairs will be configured with @set
  58 * @data: pointer to private data
  59 */
  60struct icc_provider {
  61        struct list_head        provider_list;
  62        struct list_head        nodes;
  63        int (*set)(struct icc_node *src, struct icc_node *dst);
  64        int (*aggregate)(struct icc_node *node, u32 tag, u32 avg_bw,
  65                         u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
  66        void (*pre_aggregate)(struct icc_node *node);
  67        int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak);
  68        struct icc_node* (*xlate)(struct of_phandle_args *spec, void *data);
  69        struct icc_node_data* (*xlate_extended)(struct of_phandle_args *spec, void *data);
  70        struct device           *dev;
  71        int                     users;
  72        bool                    inter_set;
  73        void                    *data;
  74};
  75
  76/**
  77 * struct icc_node - entity that is part of the interconnect topology
  78 *
  79 * @id: platform specific node id
  80 * @name: node name used in debugfs
  81 * @links: a list of targets pointing to where we can go next when traversing
  82 * @num_links: number of links to other interconnect nodes
  83 * @provider: points to the interconnect provider of this node
  84 * @node_list: the list entry in the parent provider's "nodes" list
  85 * @search_list: list used when walking the nodes graph
  86 * @reverse: pointer to previous node when walking the nodes graph
  87 * @is_traversed: flag that is used when walking the nodes graph
  88 * @req_list: a list of QoS constraint requests associated with this node
  89 * @avg_bw: aggregated value of average bandwidth requests from all consumers
  90 * @peak_bw: aggregated value of peak bandwidth requests from all consumers
  91 * @init_avg: average bandwidth value that is read from the hardware during init
  92 * @init_peak: peak bandwidth value that is read from the hardware during init
  93 * @data: pointer to private data
  94 */
  95struct icc_node {
  96        int                     id;
  97        const char              *name;
  98        struct icc_node         **links;
  99        size_t                  num_links;
 100
 101        struct icc_provider     *provider;
 102        struct list_head        node_list;
 103        struct list_head        search_list;
 104        struct icc_node         *reverse;
 105        u8                      is_traversed:1;
 106        struct hlist_head       req_list;
 107        u32                     avg_bw;
 108        u32                     peak_bw;
 109        u32                     init_avg;
 110        u32                     init_peak;
 111        void                    *data;
 112};
 113
 114#if IS_ENABLED(CONFIG_INTERCONNECT)
 115
 116int icc_std_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
 117                      u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
 118struct icc_node *icc_node_create(int id);
 119void icc_node_destroy(int id);
 120int icc_link_create(struct icc_node *node, const int dst_id);
 121int icc_link_destroy(struct icc_node *src, struct icc_node *dst);
 122void icc_node_add(struct icc_node *node, struct icc_provider *provider);
 123void icc_node_del(struct icc_node *node);
 124int icc_nodes_remove(struct icc_provider *provider);
 125int icc_provider_add(struct icc_provider *provider);
 126int icc_provider_del(struct icc_provider *provider);
 127struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec);
 128void icc_sync_state(struct device *dev);
 129
 130#else
 131
 132static inline int icc_std_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
 133                                    u32 peak_bw, u32 *agg_avg, u32 *agg_peak)
 134{
 135        return -ENOTSUPP;
 136}
 137
 138static inline struct icc_node *icc_node_create(int id)
 139{
 140        return ERR_PTR(-ENOTSUPP);
 141}
 142
 143static inline void icc_node_destroy(int id)
 144{
 145}
 146
 147static inline int icc_link_create(struct icc_node *node, const int dst_id)
 148{
 149        return -ENOTSUPP;
 150}
 151
 152static inline int icc_link_destroy(struct icc_node *src, struct icc_node *dst)
 153{
 154        return -ENOTSUPP;
 155}
 156
 157static inline void icc_node_add(struct icc_node *node, struct icc_provider *provider)
 158{
 159}
 160
 161static inline void icc_node_del(struct icc_node *node)
 162{
 163}
 164
 165static inline int icc_nodes_remove(struct icc_provider *provider)
 166{
 167        return -ENOTSUPP;
 168}
 169
 170static inline int icc_provider_add(struct icc_provider *provider)
 171{
 172        return -ENOTSUPP;
 173}
 174
 175static inline int icc_provider_del(struct icc_provider *provider)
 176{
 177        return -ENOTSUPP;
 178}
 179
 180static inline struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec)
 181{
 182        return ERR_PTR(-ENOTSUPP);
 183}
 184
 185#endif /* CONFIG_INTERCONNECT */
 186
 187#endif /* __LINUX_INTERCONNECT_PROVIDER_H */
 188