mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.3 KiB
140 lines
4.3 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* |
|
* Copyright (c) 2020, The Linux Foundation. All rights reserved. |
|
*/ |
|
|
|
#ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__ |
|
#define __DRIVERS_INTERCONNECT_QCOM_ICC_RPMH_H__ |
|
|
|
#include <dt-bindings/interconnect/qcom,icc.h> |
|
|
|
#define to_qcom_provider(_provider) \ |
|
container_of(_provider, struct qcom_icc_provider, provider) |
|
|
|
/** |
|
* struct qcom_icc_provider - Qualcomm specific interconnect provider |
|
* @provider: generic interconnect provider |
|
* @dev: reference to the NoC device |
|
* @bcms: list of bcms that maps to the provider |
|
* @num_bcms: number of @bcms |
|
* @voter: bcm voter targeted by this provider |
|
*/ |
|
struct qcom_icc_provider { |
|
struct icc_provider provider; |
|
struct device *dev; |
|
struct qcom_icc_bcm **bcms; |
|
size_t num_bcms; |
|
struct bcm_voter *voter; |
|
}; |
|
|
|
/** |
|
* struct bcm_db - Auxiliary data pertaining to each Bus Clock Manager (BCM) |
|
* @unit: divisor used to convert bytes/sec bw value to an RPMh msg |
|
* @width: multiplier used to convert bytes/sec bw value to an RPMh msg |
|
* @vcd: virtual clock domain that this bcm belongs to |
|
* @reserved: reserved field |
|
*/ |
|
struct bcm_db { |
|
__le32 unit; |
|
__le16 width; |
|
u8 vcd; |
|
u8 reserved; |
|
}; |
|
|
|
#define MAX_LINKS 128 |
|
#define MAX_BCMS 64 |
|
#define MAX_BCM_PER_NODE 3 |
|
#define MAX_VCD 10 |
|
|
|
/** |
|
* struct qcom_icc_node - Qualcomm specific interconnect nodes |
|
* @name: the node name used in debugfs |
|
* @links: an array of nodes where we can go next while traversing |
|
* @id: a unique node identifier |
|
* @num_links: the total number of @links |
|
* @channels: num of channels at this node |
|
* @buswidth: width of the interconnect between a node and the bus |
|
* @sum_avg: current sum aggregate value of all avg bw requests |
|
* @max_peak: current max aggregate value of all peak bw requests |
|
* @bcms: list of bcms associated with this logical node |
|
* @num_bcms: num of @bcms |
|
*/ |
|
struct qcom_icc_node { |
|
const char *name; |
|
u16 links[MAX_LINKS]; |
|
u16 id; |
|
u16 num_links; |
|
u16 channels; |
|
u16 buswidth; |
|
u64 sum_avg[QCOM_ICC_NUM_BUCKETS]; |
|
u64 max_peak[QCOM_ICC_NUM_BUCKETS]; |
|
struct qcom_icc_bcm *bcms[MAX_BCM_PER_NODE]; |
|
size_t num_bcms; |
|
}; |
|
|
|
/** |
|
* struct qcom_icc_bcm - Qualcomm specific hardware accelerator nodes |
|
* known as Bus Clock Manager (BCM) |
|
* @name: the bcm node name used to fetch BCM data from command db |
|
* @type: latency or bandwidth bcm |
|
* @addr: address offsets used when voting to RPMH |
|
* @vote_x: aggregated threshold values, represents sum_bw when @type is bw bcm |
|
* @vote_y: aggregated threshold values, represents peak_bw when @type is bw bcm |
|
* @vote_scale: scaling factor for vote_x and vote_y |
|
* @dirty: flag used to indicate whether the bcm needs to be committed |
|
* @keepalive: flag used to indicate whether a keepalive is required |
|
* @aux_data: auxiliary data used when calculating threshold values and |
|
* communicating with RPMh |
|
* @list: used to link to other bcms when compiling lists for commit |
|
* @ws_list: used to keep track of bcms that may transition between wake/sleep |
|
* @num_nodes: total number of @num_nodes |
|
* @nodes: list of qcom_icc_nodes that this BCM encapsulates |
|
*/ |
|
struct qcom_icc_bcm { |
|
const char *name; |
|
u32 type; |
|
u32 addr; |
|
u64 vote_x[QCOM_ICC_NUM_BUCKETS]; |
|
u64 vote_y[QCOM_ICC_NUM_BUCKETS]; |
|
u64 vote_scale; |
|
bool dirty; |
|
bool keepalive; |
|
struct bcm_db aux_data; |
|
struct list_head list; |
|
struct list_head ws_list; |
|
size_t num_nodes; |
|
struct qcom_icc_node *nodes[]; |
|
}; |
|
|
|
struct qcom_icc_fabric { |
|
struct qcom_icc_node **nodes; |
|
size_t num_nodes; |
|
}; |
|
|
|
struct qcom_icc_desc { |
|
struct qcom_icc_node **nodes; |
|
size_t num_nodes; |
|
struct qcom_icc_bcm **bcms; |
|
size_t num_bcms; |
|
}; |
|
|
|
#define DEFINE_QNODE(_name, _id, _channels, _buswidth, ...) \ |
|
static struct qcom_icc_node _name = { \ |
|
.id = _id, \ |
|
.name = #_name, \ |
|
.channels = _channels, \ |
|
.buswidth = _buswidth, \ |
|
.num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \ |
|
.links = { __VA_ARGS__ }, \ |
|
} |
|
|
|
int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, |
|
u32 peak_bw, u32 *agg_avg, u32 *agg_peak); |
|
int qcom_icc_set(struct icc_node *src, struct icc_node *dst); |
|
struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data); |
|
int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev); |
|
void qcom_icc_pre_aggregate(struct icc_node *node); |
|
int qcom_icc_rpmh_probe(struct platform_device *pdev); |
|
int qcom_icc_rpmh_remove(struct platform_device *pdev); |
|
|
|
#endif
|
|
|