162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2020 Linaro Ltd 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H 762306a36Sopenharmony_ci#define __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/soc/qcom/smd-rpm.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <dt-bindings/interconnect/qcom,rpm-icc.h> 1262306a36Sopenharmony_ci#include <linux/clk.h> 1362306a36Sopenharmony_ci#include <linux/interconnect-provider.h> 1462306a36Sopenharmony_ci#include <linux/platform_device.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define RPM_BUS_MASTER_REQ 0x73616d62 1762306a36Sopenharmony_ci#define RPM_BUS_SLAVE_REQ 0x766c7362 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define to_qcom_provider(_provider) \ 2062306a36Sopenharmony_ci container_of(_provider, struct qcom_icc_provider, provider) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cienum qcom_icc_type { 2362306a36Sopenharmony_ci QCOM_ICC_NOC, 2462306a36Sopenharmony_ci QCOM_ICC_BIMC, 2562306a36Sopenharmony_ci QCOM_ICC_QNOC, 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/** 2962306a36Sopenharmony_ci * struct rpm_clk_resource - RPM bus clock resource 3062306a36Sopenharmony_ci * @resource_type: RPM resource type of the clock resource 3162306a36Sopenharmony_ci * @clock_id: index of the clock resource of a specific resource type 3262306a36Sopenharmony_ci * @branch: whether the resource represents a branch clock 3362306a36Sopenharmony_ci*/ 3462306a36Sopenharmony_cistruct rpm_clk_resource { 3562306a36Sopenharmony_ci u32 resource_type; 3662306a36Sopenharmony_ci u32 clock_id; 3762306a36Sopenharmony_ci bool branch; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/** 4162306a36Sopenharmony_ci * struct qcom_icc_provider - Qualcomm specific interconnect provider 4262306a36Sopenharmony_ci * @provider: generic interconnect provider 4362306a36Sopenharmony_ci * @num_intf_clks: the total number of intf_clks clk_bulk_data entries 4462306a36Sopenharmony_ci * @type: the ICC provider type 4562306a36Sopenharmony_ci * @regmap: regmap for QoS registers read/write access 4662306a36Sopenharmony_ci * @qos_offset: offset to QoS registers 4762306a36Sopenharmony_ci * @bus_clk_rate: bus clock rate in Hz 4862306a36Sopenharmony_ci * @bus_clk_desc: a pointer to a rpm_clk_resource description of bus clocks 4962306a36Sopenharmony_ci * @bus_clk: a pointer to a HLOS-owned bus clock 5062306a36Sopenharmony_ci * @intf_clks: a clk_bulk_data array of interface clocks 5162306a36Sopenharmony_ci * @keep_alive: whether to always keep a minimum vote on the bus clocks 5262306a36Sopenharmony_ci * @is_on: whether the bus is powered on 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_cistruct qcom_icc_provider { 5562306a36Sopenharmony_ci struct icc_provider provider; 5662306a36Sopenharmony_ci int num_intf_clks; 5762306a36Sopenharmony_ci enum qcom_icc_type type; 5862306a36Sopenharmony_ci struct regmap *regmap; 5962306a36Sopenharmony_ci unsigned int qos_offset; 6062306a36Sopenharmony_ci u32 bus_clk_rate[QCOM_SMD_RPM_STATE_NUM]; 6162306a36Sopenharmony_ci const struct rpm_clk_resource *bus_clk_desc; 6262306a36Sopenharmony_ci struct clk *bus_clk; 6362306a36Sopenharmony_ci struct clk_bulk_data *intf_clks; 6462306a36Sopenharmony_ci bool keep_alive; 6562306a36Sopenharmony_ci bool is_on; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/** 6962306a36Sopenharmony_ci * struct qcom_icc_qos - Qualcomm specific interconnect QoS parameters 7062306a36Sopenharmony_ci * @areq_prio: node requests priority 7162306a36Sopenharmony_ci * @prio_level: priority level for bus communication 7262306a36Sopenharmony_ci * @limit_commands: activate/deactivate limiter mode during runtime 7362306a36Sopenharmony_ci * @ap_owned: indicates if the node is owned by the AP or by the RPM 7462306a36Sopenharmony_ci * @qos_mode: default qos mode for this node 7562306a36Sopenharmony_ci * @qos_port: qos port number for finding qos registers of this node 7662306a36Sopenharmony_ci * @urg_fwd_en: enable urgent forwarding 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_cistruct qcom_icc_qos { 7962306a36Sopenharmony_ci u32 areq_prio; 8062306a36Sopenharmony_ci u32 prio_level; 8162306a36Sopenharmony_ci bool limit_commands; 8262306a36Sopenharmony_ci bool ap_owned; 8362306a36Sopenharmony_ci int qos_mode; 8462306a36Sopenharmony_ci int qos_port; 8562306a36Sopenharmony_ci bool urg_fwd_en; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/** 8962306a36Sopenharmony_ci * struct qcom_icc_node - Qualcomm specific interconnect nodes 9062306a36Sopenharmony_ci * @name: the node name used in debugfs 9162306a36Sopenharmony_ci * @id: a unique node identifier 9262306a36Sopenharmony_ci * @links: an array of nodes where we can go next while traversing 9362306a36Sopenharmony_ci * @num_links: the total number of @links 9462306a36Sopenharmony_ci * @channels: number of channels at this node (e.g. DDR channels) 9562306a36Sopenharmony_ci * @buswidth: width of the interconnect between a node and the bus (bytes) 9662306a36Sopenharmony_ci * @sum_avg: current sum aggregate value of all avg bw requests 9762306a36Sopenharmony_ci * @max_peak: current max aggregate value of all peak bw requests 9862306a36Sopenharmony_ci * @mas_rpm_id: RPM id for devices that are bus masters 9962306a36Sopenharmony_ci * @slv_rpm_id: RPM id for devices that are bus slaves 10062306a36Sopenharmony_ci * @qos: NoC QoS setting parameters 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_cistruct qcom_icc_node { 10362306a36Sopenharmony_ci unsigned char *name; 10462306a36Sopenharmony_ci u16 id; 10562306a36Sopenharmony_ci const u16 *links; 10662306a36Sopenharmony_ci u16 num_links; 10762306a36Sopenharmony_ci u16 channels; 10862306a36Sopenharmony_ci u16 buswidth; 10962306a36Sopenharmony_ci u64 sum_avg[QCOM_SMD_RPM_STATE_NUM]; 11062306a36Sopenharmony_ci u64 max_peak[QCOM_SMD_RPM_STATE_NUM]; 11162306a36Sopenharmony_ci int mas_rpm_id; 11262306a36Sopenharmony_ci int slv_rpm_id; 11362306a36Sopenharmony_ci struct qcom_icc_qos qos; 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct qcom_icc_desc { 11762306a36Sopenharmony_ci struct qcom_icc_node * const *nodes; 11862306a36Sopenharmony_ci size_t num_nodes; 11962306a36Sopenharmony_ci const struct rpm_clk_resource *bus_clk_desc; 12062306a36Sopenharmony_ci const char * const *intf_clocks; 12162306a36Sopenharmony_ci size_t num_intf_clocks; 12262306a36Sopenharmony_ci bool keep_alive; 12362306a36Sopenharmony_ci enum qcom_icc_type type; 12462306a36Sopenharmony_ci const struct regmap_config *regmap_cfg; 12562306a36Sopenharmony_ci unsigned int qos_offset; 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/* Valid for all bus types */ 12962306a36Sopenharmony_cienum qos_mode { 13062306a36Sopenharmony_ci NOC_QOS_MODE_INVALID = 0, 13162306a36Sopenharmony_ci NOC_QOS_MODE_FIXED, 13262306a36Sopenharmony_ci NOC_QOS_MODE_BYPASS, 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ciextern const struct rpm_clk_resource aggre1_clk; 13662306a36Sopenharmony_ciextern const struct rpm_clk_resource aggre2_clk; 13762306a36Sopenharmony_ciextern const struct rpm_clk_resource bimc_clk; 13862306a36Sopenharmony_ciextern const struct rpm_clk_resource bus_0_clk; 13962306a36Sopenharmony_ciextern const struct rpm_clk_resource bus_1_clk; 14062306a36Sopenharmony_ciextern const struct rpm_clk_resource bus_2_clk; 14162306a36Sopenharmony_ciextern const struct rpm_clk_resource mmaxi_0_clk; 14262306a36Sopenharmony_ciextern const struct rpm_clk_resource mmaxi_1_clk; 14362306a36Sopenharmony_ciextern const struct rpm_clk_resource qup_clk; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ciextern const struct rpm_clk_resource aggre1_branch_clk; 14662306a36Sopenharmony_ciextern const struct rpm_clk_resource aggre2_branch_clk; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciint qnoc_probe(struct platform_device *pdev); 14962306a36Sopenharmony_ciint qnoc_remove(struct platform_device *pdev); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cibool qcom_icc_rpm_smd_available(void); 15262306a36Sopenharmony_ciint qcom_icc_rpm_smd_send(int ctx, int rsc_type, int id, u32 val); 15362306a36Sopenharmony_ciint qcom_icc_rpm_set_bus_rate(const struct rpm_clk_resource *clk, int ctx, u32 rate); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#endif 156