Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'icc-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc into char-misc-next

Georgi writes:

interconnect changes for 5.12

Here are the interconnect changes for the 5.12-rc1 merge window
consisting of driver updates.

Driver changes:
- Refactoring and consolidation of drivers.
- New driver for MSM8939 platforms.
- New driver for SDX55 platforms.

Signed-off-by: Georgi Djakov <djakov@kernel.org>

* tag 'icc-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc:
interconnect: qcom: Add SDX55 interconnect provider driver
dt-bindings: interconnect: Add Qualcomm SDX55 DT bindings
interconnect: qcom: Add MSM8939 interconnect provider driver
dt-bindings: interconnect: Add Qualcomm MSM8939 DT bindings
dt-bindings: interconnect: single yaml file for RPM interconnect drivers
interconnect: qcom: qcs404: use shared code
interconnect: qcom: Consolidate interconnect RPM support

+1287 -551
+15 -7
Documentation/devicetree/bindings/interconnect/qcom,msm8916.yaml Documentation/devicetree/bindings/interconnect/qcom,rpm.yaml
··· 1 1 # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 2 %YAML 1.2 3 3 --- 4 - $id: http://devicetree.org/schemas/interconnect/qcom,msm8916.yaml# 4 + $id: http://devicetree.org/schemas/interconnect/qcom,rpm.yaml# 5 5 $schema: http://devicetree.org/meta-schemas/core.yaml# 6 6 7 - title: Qualcomm MSM8916 Network-On-Chip interconnect 7 + title: Qualcomm RPM Network-On-Chip Interconnect 8 8 9 9 maintainers: 10 10 - Georgi Djakov <georgi.djakov@linaro.org> 11 11 12 12 description: | 13 - The Qualcomm MSM8916 interconnect providers support adjusting the 14 - bandwidth requirements between the various NoC fabrics. 13 + RPM interconnect providers support system bandwidth requirements through 14 + RPM processor. The provider is able to communicate with the RPM through 15 + the RPM shared memory device. 15 16 16 17 properties: 18 + reg: 19 + maxItems: 1 20 + 17 21 compatible: 18 22 enum: 19 23 - qcom,msm8916-bimc 20 24 - qcom,msm8916-pcnoc 21 25 - qcom,msm8916-snoc 22 - 23 - reg: 24 - maxItems: 1 26 + - qcom,msm8939-bimc 27 + - qcom,msm8939-pcnoc 28 + - qcom,msm8939-snoc 29 + - qcom,msm8939-snoc-mm 30 + - qcom,qcs404-bimc 31 + - qcom,qcs404-pcnoc 32 + - qcom,qcs404-snoc 25 33 26 34 '#interconnect-cells': 27 35 const: 1
-77
Documentation/devicetree/bindings/interconnect/qcom,qcs404.yaml
··· 1 - # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 - %YAML 1.2 3 - --- 4 - $id: http://devicetree.org/schemas/interconnect/qcom,qcs404.yaml# 5 - $schema: http://devicetree.org/meta-schemas/core.yaml# 6 - 7 - title: Qualcomm QCS404 Network-On-Chip interconnect 8 - 9 - maintainers: 10 - - Georgi Djakov <georgi.djakov@linaro.org> 11 - 12 - description: | 13 - The Qualcomm QCS404 interconnect providers support adjusting the 14 - bandwidth requirements between the various NoC fabrics. 15 - 16 - properties: 17 - reg: 18 - maxItems: 1 19 - 20 - compatible: 21 - enum: 22 - - qcom,qcs404-bimc 23 - - qcom,qcs404-pcnoc 24 - - qcom,qcs404-snoc 25 - 26 - '#interconnect-cells': 27 - const: 1 28 - 29 - clock-names: 30 - items: 31 - - const: bus 32 - - const: bus_a 33 - 34 - clocks: 35 - items: 36 - - description: Bus Clock 37 - - description: Bus A Clock 38 - 39 - required: 40 - - compatible 41 - - reg 42 - - '#interconnect-cells' 43 - - clock-names 44 - - clocks 45 - 46 - additionalProperties: false 47 - 48 - examples: 49 - - | 50 - #include <dt-bindings/clock/qcom,rpmcc.h> 51 - 52 - bimc: interconnect@400000 { 53 - reg = <0x00400000 0x80000>; 54 - compatible = "qcom,qcs404-bimc"; 55 - #interconnect-cells = <1>; 56 - clock-names = "bus", "bus_a"; 57 - clocks = <&rpmcc RPM_SMD_BIMC_CLK>, 58 - <&rpmcc RPM_SMD_BIMC_A_CLK>; 59 - }; 60 - 61 - pnoc: interconnect@500000 { 62 - reg = <0x00500000 0x15080>; 63 - compatible = "qcom,qcs404-pcnoc"; 64 - #interconnect-cells = <1>; 65 - clock-names = "bus", "bus_a"; 66 - clocks = <&rpmcc RPM_SMD_PNOC_CLK>, 67 - <&rpmcc RPM_SMD_PNOC_A_CLK>; 68 - }; 69 - 70 - snoc: interconnect@580000 { 71 - reg = <0x00580000 0x23080>; 72 - compatible = "qcom,qcs404-snoc"; 73 - #interconnect-cells = <1>; 74 - clock-names = "bus", "bus_a"; 75 - clocks = <&rpmcc RPM_SMD_SNOC_CLK>, 76 - <&rpmcc RPM_SMD_SNOC_A_CLK>; 77 - };
+4
Documentation/devicetree/bindings/interconnect/qcom,rpmh.yaml
··· 45 45 - qcom,sdm845-mem-noc 46 46 - qcom,sdm845-mmss-noc 47 47 - qcom,sdm845-system-noc 48 + - qcom,sdx55-ipa-virt 49 + - qcom,sdx55-mc-virt 50 + - qcom,sdx55-mem-noc 51 + - qcom,sdx55-system-noc 48 52 - qcom,sm8150-aggre1-noc 49 53 - qcom,sm8150-aggre2-noc 50 54 - qcom,sm8150-camnoc-noc
+18
drivers/interconnect/qcom/Kconfig
··· 17 17 This is a driver for the Qualcomm Network-on-Chip on msm8916-based 18 18 platforms. 19 19 20 + config INTERCONNECT_QCOM_MSM8939 21 + tristate "Qualcomm MSM8939 interconnect driver" 22 + depends on INTERCONNECT_QCOM 23 + depends on QCOM_SMD_RPM 24 + select INTERCONNECT_QCOM_SMD_RPM 25 + help 26 + This is a driver for the Qualcomm Network-on-Chip on msm8939-based 27 + platforms. 28 + 20 29 config INTERCONNECT_QCOM_MSM8974 21 30 tristate "Qualcomm MSM8974 interconnect driver" 22 31 depends on INTERCONNECT_QCOM ··· 81 72 select INTERCONNECT_QCOM_BCM_VOTER 82 73 help 83 74 This is a driver for the Qualcomm Network-on-Chip on sdm845-based 75 + platforms. 76 + 77 + config INTERCONNECT_QCOM_SDX55 78 + tristate "Qualcomm SDX55 interconnect driver" 79 + depends on INTERCONNECT_QCOM_RPMH_POSSIBLE 80 + select INTERCONNECT_QCOM_RPMH 81 + select INTERCONNECT_QCOM_BCM_VOTER 82 + help 83 + This is a driver for the Qualcomm Network-on-Chip on sdx55-based 84 84 platforms. 85 85 86 86 config INTERCONNECT_QCOM_SM8150
+5 -1
drivers/interconnect/qcom/Makefile
··· 2 2 3 3 icc-bcm-voter-objs := bcm-voter.o 4 4 qnoc-msm8916-objs := msm8916.o 5 + qnoc-msm8939-objs := msm8939.o 5 6 qnoc-msm8974-objs := msm8974.o 6 7 icc-osm-l3-objs := osm-l3.o 7 8 qnoc-qcs404-objs := qcs404.o 8 9 icc-rpmh-obj := icc-rpmh.o 9 10 qnoc-sc7180-objs := sc7180.o 10 11 qnoc-sdm845-objs := sdm845.o 12 + qnoc-sdx55-objs := sdx55.o 11 13 qnoc-sm8150-objs := sm8150.o 12 14 qnoc-sm8250-objs := sm8250.o 13 - icc-smd-rpm-objs := smd-rpm.o 15 + icc-smd-rpm-objs := smd-rpm.o icc-rpm.o 14 16 15 17 obj-$(CONFIG_INTERCONNECT_QCOM_BCM_VOTER) += icc-bcm-voter.o 16 18 obj-$(CONFIG_INTERCONNECT_QCOM_MSM8916) += qnoc-msm8916.o 19 + obj-$(CONFIG_INTERCONNECT_QCOM_MSM8939) += qnoc-msm8939.o 17 20 obj-$(CONFIG_INTERCONNECT_QCOM_MSM8974) += qnoc-msm8974.o 18 21 obj-$(CONFIG_INTERCONNECT_QCOM_OSM_L3) += icc-osm-l3.o 19 22 obj-$(CONFIG_INTERCONNECT_QCOM_QCS404) += qnoc-qcs404.o 20 23 obj-$(CONFIG_INTERCONNECT_QCOM_RPMH) += icc-rpmh.o 21 24 obj-$(CONFIG_INTERCONNECT_QCOM_SC7180) += qnoc-sc7180.o 22 25 obj-$(CONFIG_INTERCONNECT_QCOM_SDM845) += qnoc-sdm845.o 26 + obj-$(CONFIG_INTERCONNECT_QCOM_SDX55) += qnoc-sdx55.o 23 27 obj-$(CONFIG_INTERCONNECT_QCOM_SM8150) += qnoc-sm8150.o 24 28 obj-$(CONFIG_INTERCONNECT_QCOM_SM8250) += qnoc-sm8250.o 25 29 obj-$(CONFIG_INTERCONNECT_QCOM_SMD_RPM) += icc-smd-rpm.o
+191
drivers/interconnect/qcom/icc-rpm.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2020 Linaro Ltd 4 + */ 5 + 6 + #include <linux/clk.h> 7 + #include <linux/device.h> 8 + #include <linux/interconnect-provider.h> 9 + #include <linux/io.h> 10 + #include <linux/module.h> 11 + #include <linux/of_device.h> 12 + #include <linux/of_platform.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/slab.h> 15 + 16 + #include "smd-rpm.h" 17 + #include "icc-rpm.h" 18 + 19 + static int qcom_icc_set(struct icc_node *src, struct icc_node *dst) 20 + { 21 + struct qcom_icc_provider *qp; 22 + struct qcom_icc_node *qn; 23 + struct icc_provider *provider; 24 + struct icc_node *n; 25 + u64 sum_bw; 26 + u64 max_peak_bw; 27 + u64 rate; 28 + u32 agg_avg = 0; 29 + u32 agg_peak = 0; 30 + int ret, i; 31 + 32 + qn = src->data; 33 + provider = src->provider; 34 + qp = to_qcom_provider(provider); 35 + 36 + list_for_each_entry(n, &provider->nodes, node_list) 37 + provider->aggregate(n, 0, n->avg_bw, n->peak_bw, 38 + &agg_avg, &agg_peak); 39 + 40 + sum_bw = icc_units_to_bps(agg_avg); 41 + max_peak_bw = icc_units_to_bps(agg_peak); 42 + 43 + /* send bandwidth request message to the RPM processor */ 44 + if (qn->mas_rpm_id != -1) { 45 + ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE, 46 + RPM_BUS_MASTER_REQ, 47 + qn->mas_rpm_id, 48 + sum_bw); 49 + if (ret) { 50 + pr_err("qcom_icc_rpm_smd_send mas %d error %d\n", 51 + qn->mas_rpm_id, ret); 52 + return ret; 53 + } 54 + } 55 + 56 + if (qn->slv_rpm_id != -1) { 57 + ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE, 58 + RPM_BUS_SLAVE_REQ, 59 + qn->slv_rpm_id, 60 + sum_bw); 61 + if (ret) { 62 + pr_err("qcom_icc_rpm_smd_send slv error %d\n", 63 + ret); 64 + return ret; 65 + } 66 + } 67 + 68 + rate = max(sum_bw, max_peak_bw); 69 + 70 + do_div(rate, qn->buswidth); 71 + 72 + if (qn->rate == rate) 73 + return 0; 74 + 75 + for (i = 0; i < qp->num_clks; i++) { 76 + ret = clk_set_rate(qp->bus_clks[i].clk, rate); 77 + if (ret) { 78 + pr_err("%s clk_set_rate error: %d\n", 79 + qp->bus_clks[i].id, ret); 80 + return ret; 81 + } 82 + } 83 + 84 + qn->rate = rate; 85 + 86 + return 0; 87 + } 88 + 89 + int qnoc_probe(struct platform_device *pdev, size_t cd_size, int cd_num, 90 + const struct clk_bulk_data *cd) 91 + { 92 + struct device *dev = &pdev->dev; 93 + const struct qcom_icc_desc *desc; 94 + struct icc_onecell_data *data; 95 + struct icc_provider *provider; 96 + struct qcom_icc_node **qnodes; 97 + struct qcom_icc_provider *qp; 98 + struct icc_node *node; 99 + size_t num_nodes, i; 100 + int ret; 101 + 102 + /* wait for the RPM proxy */ 103 + if (!qcom_icc_rpm_smd_available()) 104 + return -EPROBE_DEFER; 105 + 106 + desc = of_device_get_match_data(dev); 107 + if (!desc) 108 + return -EINVAL; 109 + 110 + qnodes = desc->nodes; 111 + num_nodes = desc->num_nodes; 112 + 113 + qp = devm_kzalloc(dev, sizeof(*qp), GFP_KERNEL); 114 + if (!qp) 115 + return -ENOMEM; 116 + 117 + data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), 118 + GFP_KERNEL); 119 + if (!data) 120 + return -ENOMEM; 121 + 122 + qp->bus_clks = devm_kmemdup(dev, cd, cd_size, 123 + GFP_KERNEL); 124 + if (!qp->bus_clks) 125 + return -ENOMEM; 126 + 127 + qp->num_clks = cd_num; 128 + ret = devm_clk_bulk_get(dev, qp->num_clks, qp->bus_clks); 129 + if (ret) 130 + return ret; 131 + 132 + ret = clk_bulk_prepare_enable(qp->num_clks, qp->bus_clks); 133 + if (ret) 134 + return ret; 135 + 136 + provider = &qp->provider; 137 + INIT_LIST_HEAD(&provider->nodes); 138 + provider->dev = dev; 139 + provider->set = qcom_icc_set; 140 + provider->aggregate = icc_std_aggregate; 141 + provider->xlate = of_icc_xlate_onecell; 142 + provider->data = data; 143 + 144 + ret = icc_provider_add(provider); 145 + if (ret) { 146 + dev_err(dev, "error adding interconnect provider: %d\n", ret); 147 + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 148 + return ret; 149 + } 150 + 151 + for (i = 0; i < num_nodes; i++) { 152 + size_t j; 153 + 154 + node = icc_node_create(qnodes[i]->id); 155 + if (IS_ERR(node)) { 156 + ret = PTR_ERR(node); 157 + goto err; 158 + } 159 + 160 + node->name = qnodes[i]->name; 161 + node->data = qnodes[i]; 162 + icc_node_add(node, provider); 163 + 164 + for (j = 0; j < qnodes[i]->num_links; j++) 165 + icc_link_create(node, qnodes[i]->links[j]); 166 + 167 + data->nodes[i] = node; 168 + } 169 + data->num_nodes = num_nodes; 170 + 171 + platform_set_drvdata(pdev, qp); 172 + 173 + return 0; 174 + err: 175 + icc_nodes_remove(provider); 176 + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 177 + icc_provider_del(provider); 178 + 179 + return ret; 180 + } 181 + EXPORT_SYMBOL(qnoc_probe); 182 + 183 + int qnoc_remove(struct platform_device *pdev) 184 + { 185 + struct qcom_icc_provider *qp = platform_get_drvdata(pdev); 186 + 187 + icc_nodes_remove(&qp->provider); 188 + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 189 + return icc_provider_del(&qp->provider); 190 + } 191 + EXPORT_SYMBOL(qnoc_remove);
+73
drivers/interconnect/qcom/icc-rpm.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2020 Linaro Ltd 4 + */ 5 + 6 + #ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H 7 + #define __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H 8 + 9 + #define RPM_BUS_MASTER_REQ 0x73616d62 10 + #define RPM_BUS_SLAVE_REQ 0x766c7362 11 + 12 + #define QCOM_MAX_LINKS 12 13 + 14 + #define to_qcom_provider(_provider) \ 15 + container_of(_provider, struct qcom_icc_provider, provider) 16 + 17 + /** 18 + * struct qcom_icc_provider - Qualcomm specific interconnect provider 19 + * @provider: generic interconnect provider 20 + * @bus_clks: the clk_bulk_data table of bus clocks 21 + * @num_clks: the total number of clk_bulk_data entries 22 + */ 23 + struct qcom_icc_provider { 24 + struct icc_provider provider; 25 + struct clk_bulk_data *bus_clks; 26 + int num_clks; 27 + }; 28 + 29 + /** 30 + * struct qcom_icc_node - Qualcomm specific interconnect nodes 31 + * @name: the node name used in debugfs 32 + * @id: a unique node identifier 33 + * @links: an array of nodes where we can go next while traversing 34 + * @num_links: the total number of @links 35 + * @buswidth: width of the interconnect between a node and the bus (bytes) 36 + * @mas_rpm_id: RPM id for devices that are bus masters 37 + * @slv_rpm_id: RPM id for devices that are bus slaves 38 + * @rate: current bus clock rate in Hz 39 + */ 40 + struct qcom_icc_node { 41 + unsigned char *name; 42 + u16 id; 43 + u16 links[QCOM_MAX_LINKS]; 44 + u16 num_links; 45 + u16 buswidth; 46 + int mas_rpm_id; 47 + int slv_rpm_id; 48 + u64 rate; 49 + }; 50 + 51 + struct qcom_icc_desc { 52 + struct qcom_icc_node **nodes; 53 + size_t num_nodes; 54 + }; 55 + 56 + #define DEFINE_QNODE(_name, _id, _buswidth, _mas_rpm_id, _slv_rpm_id, \ 57 + ...) \ 58 + static struct qcom_icc_node _name = { \ 59 + .name = #_name, \ 60 + .id = _id, \ 61 + .buswidth = _buswidth, \ 62 + .mas_rpm_id = _mas_rpm_id, \ 63 + .slv_rpm_id = _slv_rpm_id, \ 64 + .num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \ 65 + .links = { __VA_ARGS__ }, \ 66 + } 67 + 68 + 69 + int qnoc_probe(struct platform_device *pdev, size_t cd_size, int cd_num, 70 + const struct clk_bulk_data *cd); 71 + int qnoc_remove(struct platform_device *pdev); 72 + 73 + #endif
+10 -231
drivers/interconnect/qcom/msm8916.c
··· 15 15 #include <dt-bindings/interconnect/qcom,msm8916.h> 16 16 17 17 #include "smd-rpm.h" 18 - 19 - #define RPM_BUS_MASTER_REQ 0x73616d62 20 - #define RPM_BUS_SLAVE_REQ 0x766c7362 18 + #include "icc-rpm.h" 21 19 22 20 enum { 23 21 MSM8916_BIMC_SNOC_MAS = 1, ··· 105 107 MSM8916_SNOC_PNOC_SLV, 106 108 }; 107 109 108 - #define to_msm8916_provider(_provider) \ 109 - container_of(_provider, struct msm8916_icc_provider, provider) 110 - 111 110 static const struct clk_bulk_data msm8916_bus_clocks[] = { 112 111 { .id = "bus" }, 113 112 { .id = "bus_a" }, 114 113 }; 115 - 116 - /** 117 - * struct msm8916_icc_provider - Qualcomm specific interconnect provider 118 - * @provider: generic interconnect provider 119 - * @bus_clks: the clk_bulk_data table of bus clocks 120 - * @num_clks: the total number of clk_bulk_data entries 121 - */ 122 - struct msm8916_icc_provider { 123 - struct icc_provider provider; 124 - struct clk_bulk_data *bus_clks; 125 - int num_clks; 126 - }; 127 - 128 - #define MSM8916_MAX_LINKS 8 129 - 130 - /** 131 - * struct msm8916_icc_node - Qualcomm specific interconnect nodes 132 - * @name: the node name used in debugfs 133 - * @id: a unique node identifier 134 - * @links: an array of nodes where we can go next while traversing 135 - * @num_links: the total number of @links 136 - * @buswidth: width of the interconnect between a node and the bus (bytes) 137 - * @mas_rpm_id: RPM ID for devices that are bus masters 138 - * @slv_rpm_id: RPM ID for devices that are bus slaves 139 - * @rate: current bus clock rate in Hz 140 - */ 141 - struct msm8916_icc_node { 142 - unsigned char *name; 143 - u16 id; 144 - u16 links[MSM8916_MAX_LINKS]; 145 - u16 num_links; 146 - u16 buswidth; 147 - int mas_rpm_id; 148 - int slv_rpm_id; 149 - u64 rate; 150 - }; 151 - 152 - struct msm8916_icc_desc { 153 - struct msm8916_icc_node **nodes; 154 - size_t num_nodes; 155 - }; 156 - 157 - #define DEFINE_QNODE(_name, _id, _buswidth, _mas_rpm_id, _slv_rpm_id, \ 158 - ...) \ 159 - static struct msm8916_icc_node _name = { \ 160 - .name = #_name, \ 161 - .id = _id, \ 162 - .buswidth = _buswidth, \ 163 - .mas_rpm_id = _mas_rpm_id, \ 164 - .slv_rpm_id = _slv_rpm_id, \ 165 - .num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \ 166 - .links = { __VA_ARGS__ }, \ 167 - } 168 114 169 115 DEFINE_QNODE(bimc_snoc_mas, MSM8916_BIMC_SNOC_MAS, 8, -1, -1, MSM8916_BIMC_SNOC_SLV); 170 116 DEFINE_QNODE(bimc_snoc_slv, MSM8916_BIMC_SNOC_SLV, 8, -1, -1, MSM8916_SNOC_INT_0, MSM8916_SNOC_INT_1); ··· 196 254 DEFINE_QNODE(snoc_pcnoc_mas, MSM8916_SNOC_PNOC_MAS, 8, -1, -1, MSM8916_SNOC_PNOC_SLV); 197 255 DEFINE_QNODE(snoc_pcnoc_slv, MSM8916_SNOC_PNOC_SLV, 8, -1, -1, MSM8916_PNOC_INT_0); 198 256 199 - static struct msm8916_icc_node *msm8916_snoc_nodes[] = { 257 + static struct qcom_icc_node *msm8916_snoc_nodes[] = { 200 258 [BIMC_SNOC_SLV] = &bimc_snoc_slv, 201 259 [MASTER_JPEG] = &mas_jpeg, 202 260 [MASTER_MDP_PORT0] = &mas_mdp, ··· 225 283 [SNOC_QDSS_INT] = &qdss_int, 226 284 }; 227 285 228 - static struct msm8916_icc_desc msm8916_snoc = { 286 + static struct qcom_icc_desc msm8916_snoc = { 229 287 .nodes = msm8916_snoc_nodes, 230 288 .num_nodes = ARRAY_SIZE(msm8916_snoc_nodes), 231 289 }; 232 290 233 - static struct msm8916_icc_node *msm8916_bimc_nodes[] = { 291 + static struct qcom_icc_node *msm8916_bimc_nodes[] = { 234 292 [BIMC_SNOC_MAS] = &bimc_snoc_mas, 235 293 [MASTER_AMPSS_M0] = &mas_apss, 236 294 [MASTER_GRAPHICS_3D] = &mas_gfx, ··· 242 300 [SNOC_BIMC_1_SLV] = &snoc_bimc_1_slv, 243 301 }; 244 302 245 - static struct msm8916_icc_desc msm8916_bimc = { 303 + static struct qcom_icc_desc msm8916_bimc = { 246 304 .nodes = msm8916_bimc_nodes, 247 305 .num_nodes = ARRAY_SIZE(msm8916_bimc_nodes), 248 306 }; 249 307 250 - static struct msm8916_icc_node *msm8916_pcnoc_nodes[] = { 308 + static struct qcom_icc_node *msm8916_pcnoc_nodes[] = { 251 309 [MASTER_BLSP_1] = &mas_blsp_1, 252 310 [MASTER_DEHR] = &mas_dehr, 253 311 [MASTER_LPASS] = &mas_audio, ··· 300 358 [SNOC_PCNOC_SLV] = &snoc_pcnoc_slv, 301 359 }; 302 360 303 - static struct msm8916_icc_desc msm8916_pcnoc = { 361 + static struct qcom_icc_desc msm8916_pcnoc = { 304 362 .nodes = msm8916_pcnoc_nodes, 305 363 .num_nodes = ARRAY_SIZE(msm8916_pcnoc_nodes), 306 364 }; 307 365 308 - static int msm8916_icc_set(struct icc_node *src, struct icc_node *dst) 309 - { 310 - struct msm8916_icc_provider *qp; 311 - struct msm8916_icc_node *qn; 312 - u64 sum_bw, max_peak_bw, rate; 313 - u32 agg_avg = 0, agg_peak = 0; 314 - struct icc_provider *provider; 315 - struct icc_node *n; 316 - int ret, i; 317 - 318 - qn = src->data; 319 - provider = src->provider; 320 - qp = to_msm8916_provider(provider); 321 - 322 - list_for_each_entry(n, &provider->nodes, node_list) 323 - provider->aggregate(n, 0, n->avg_bw, n->peak_bw, 324 - &agg_avg, &agg_peak); 325 - 326 - sum_bw = icc_units_to_bps(agg_avg); 327 - max_peak_bw = icc_units_to_bps(agg_peak); 328 - 329 - /* send bandwidth request message to the RPM processor */ 330 - if (qn->mas_rpm_id != -1) { 331 - ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE, 332 - RPM_BUS_MASTER_REQ, 333 - qn->mas_rpm_id, 334 - sum_bw); 335 - if (ret) { 336 - pr_err("qcom_icc_rpm_smd_send mas %d error %d\n", 337 - qn->mas_rpm_id, ret); 338 - return ret; 339 - } 340 - } 341 - 342 - if (qn->slv_rpm_id != -1) { 343 - ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE, 344 - RPM_BUS_SLAVE_REQ, 345 - qn->slv_rpm_id, 346 - sum_bw); 347 - if (ret) { 348 - pr_err("qcom_icc_rpm_smd_send slv error %d\n", 349 - ret); 350 - return ret; 351 - } 352 - } 353 - 354 - rate = max(sum_bw, max_peak_bw); 355 - 356 - do_div(rate, qn->buswidth); 357 - 358 - if (qn->rate == rate) 359 - return 0; 360 - 361 - for (i = 0; i < qp->num_clks; i++) { 362 - ret = clk_set_rate(qp->bus_clks[i].clk, rate); 363 - if (ret) { 364 - pr_err("%s clk_set_rate error: %d\n", 365 - qp->bus_clks[i].id, ret); 366 - return ret; 367 - } 368 - } 369 - 370 - qn->rate = rate; 371 - 372 - return 0; 373 - } 374 - 375 366 static int msm8916_qnoc_probe(struct platform_device *pdev) 376 367 { 377 - const struct msm8916_icc_desc *desc; 378 - struct msm8916_icc_node **qnodes; 379 - struct msm8916_icc_provider *qp; 380 - struct device *dev = &pdev->dev; 381 - struct icc_onecell_data *data; 382 - struct icc_provider *provider; 383 - struct icc_node *node; 384 - size_t num_nodes, i; 385 - int ret; 386 - 387 - /* wait for the RPM proxy */ 388 - if (!qcom_icc_rpm_smd_available()) 389 - return -EPROBE_DEFER; 390 - 391 - desc = of_device_get_match_data(dev); 392 - if (!desc) 393 - return -EINVAL; 394 - 395 - qnodes = desc->nodes; 396 - num_nodes = desc->num_nodes; 397 - 398 - qp = devm_kzalloc(dev, sizeof(*qp), GFP_KERNEL); 399 - if (!qp) 400 - return -ENOMEM; 401 - 402 - data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), 403 - GFP_KERNEL); 404 - if (!data) 405 - return -ENOMEM; 406 - 407 - qp->bus_clks = devm_kmemdup(dev, msm8916_bus_clocks, 408 - sizeof(msm8916_bus_clocks), GFP_KERNEL); 409 - if (!qp->bus_clks) 410 - return -ENOMEM; 411 - 412 - qp->num_clks = ARRAY_SIZE(msm8916_bus_clocks); 413 - ret = devm_clk_bulk_get(dev, qp->num_clks, qp->bus_clks); 414 - if (ret) 415 - return ret; 416 - 417 - ret = clk_bulk_prepare_enable(qp->num_clks, qp->bus_clks); 418 - if (ret) 419 - return ret; 420 - 421 - provider = &qp->provider; 422 - INIT_LIST_HEAD(&provider->nodes); 423 - provider->dev = dev; 424 - provider->set = msm8916_icc_set; 425 - provider->aggregate = icc_std_aggregate; 426 - provider->xlate = of_icc_xlate_onecell; 427 - provider->data = data; 428 - 429 - ret = icc_provider_add(provider); 430 - if (ret) { 431 - dev_err(dev, "error adding interconnect provider: %d\n", ret); 432 - clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 433 - return ret; 434 - } 435 - 436 - for (i = 0; i < num_nodes; i++) { 437 - size_t j; 438 - 439 - node = icc_node_create(qnodes[i]->id); 440 - if (IS_ERR(node)) { 441 - ret = PTR_ERR(node); 442 - goto err; 443 - } 444 - 445 - node->name = qnodes[i]->name; 446 - node->data = qnodes[i]; 447 - icc_node_add(node, provider); 448 - 449 - for (j = 0; j < qnodes[i]->num_links; j++) 450 - icc_link_create(node, qnodes[i]->links[j]); 451 - 452 - data->nodes[i] = node; 453 - } 454 - data->num_nodes = num_nodes; 455 - 456 - platform_set_drvdata(pdev, qp); 457 - 458 - return 0; 459 - 460 - err: 461 - icc_nodes_remove(provider); 462 - icc_provider_del(provider); 463 - clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 464 - 465 - return ret; 466 - } 467 - 468 - static int msm8916_qnoc_remove(struct platform_device *pdev) 469 - { 470 - struct msm8916_icc_provider *qp = platform_get_drvdata(pdev); 471 - 472 - icc_nodes_remove(&qp->provider); 473 - clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 474 - return icc_provider_del(&qp->provider); 368 + return qnoc_probe(pdev, sizeof(msm8916_bus_clocks), 369 + ARRAY_SIZE(msm8916_bus_clocks), msm8916_bus_clocks); 475 370 } 476 371 477 372 static const struct of_device_id msm8916_noc_of_match[] = { ··· 321 542 322 543 static struct platform_driver msm8916_noc_driver = { 323 544 .probe = msm8916_qnoc_probe, 324 - .remove = msm8916_qnoc_remove, 545 + .remove = qnoc_remove, 325 546 .driver = { 326 547 .name = "qnoc-msm8916", 327 548 .of_match_table = msm8916_noc_of_match,
+355
drivers/interconnect/qcom/msm8939.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2020 Linaro Ltd 4 + * Author: Jun Nie <jun.nie@linaro.org> 5 + * With reference of msm8916 interconnect driver of Georgi Djakov. 6 + */ 7 + 8 + #include <linux/clk.h> 9 + #include <linux/device.h> 10 + #include <linux/interconnect-provider.h> 11 + #include <linux/io.h> 12 + #include <linux/module.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/of_device.h> 15 + 16 + #include <dt-bindings/interconnect/qcom,msm8939.h> 17 + 18 + #include "smd-rpm.h" 19 + #include "icc-rpm.h" 20 + 21 + enum { 22 + MSM8939_BIMC_SNOC_MAS = 1, 23 + MSM8939_BIMC_SNOC_SLV, 24 + MSM8939_MASTER_AMPSS_M0, 25 + MSM8939_MASTER_LPASS, 26 + MSM8939_MASTER_BLSP_1, 27 + MSM8939_MASTER_DEHR, 28 + MSM8939_MASTER_GRAPHICS_3D, 29 + MSM8939_MASTER_JPEG, 30 + MSM8939_MASTER_MDP_PORT0, 31 + MSM8939_MASTER_MDP_PORT1, 32 + MSM8939_MASTER_CPP, 33 + MSM8939_MASTER_CRYPTO_CORE0, 34 + MSM8939_MASTER_SDCC_1, 35 + MSM8939_MASTER_SDCC_2, 36 + MSM8939_MASTER_QDSS_BAM, 37 + MSM8939_MASTER_QDSS_ETR, 38 + MSM8939_MASTER_SNOC_CFG, 39 + MSM8939_MASTER_SPDM, 40 + MSM8939_MASTER_TCU0, 41 + MSM8939_MASTER_USB_HS1, 42 + MSM8939_MASTER_USB_HS2, 43 + MSM8939_MASTER_VFE, 44 + MSM8939_MASTER_VIDEO_P0, 45 + MSM8939_SNOC_MM_INT_0, 46 + MSM8939_SNOC_MM_INT_1, 47 + MSM8939_SNOC_MM_INT_2, 48 + MSM8939_PNOC_INT_0, 49 + MSM8939_PNOC_INT_1, 50 + MSM8939_PNOC_MAS_0, 51 + MSM8939_PNOC_MAS_1, 52 + MSM8939_PNOC_SLV_0, 53 + MSM8939_PNOC_SLV_1, 54 + MSM8939_PNOC_SLV_2, 55 + MSM8939_PNOC_SLV_3, 56 + MSM8939_PNOC_SLV_4, 57 + MSM8939_PNOC_SLV_8, 58 + MSM8939_PNOC_SLV_9, 59 + MSM8939_PNOC_SNOC_MAS, 60 + MSM8939_PNOC_SNOC_SLV, 61 + MSM8939_SNOC_QDSS_INT, 62 + MSM8939_SLAVE_AMPSS_L2, 63 + MSM8939_SLAVE_APSS, 64 + MSM8939_SLAVE_LPASS, 65 + MSM8939_SLAVE_BIMC_CFG, 66 + MSM8939_SLAVE_BLSP_1, 67 + MSM8939_SLAVE_BOOT_ROM, 68 + MSM8939_SLAVE_CAMERA_CFG, 69 + MSM8939_SLAVE_CATS_128, 70 + MSM8939_SLAVE_OCMEM_64, 71 + MSM8939_SLAVE_CLK_CTL, 72 + MSM8939_SLAVE_CRYPTO_0_CFG, 73 + MSM8939_SLAVE_DEHR_CFG, 74 + MSM8939_SLAVE_DISPLAY_CFG, 75 + MSM8939_SLAVE_EBI_CH0, 76 + MSM8939_SLAVE_GRAPHICS_3D_CFG, 77 + MSM8939_SLAVE_IMEM_CFG, 78 + MSM8939_SLAVE_IMEM, 79 + MSM8939_SLAVE_MPM, 80 + MSM8939_SLAVE_MSG_RAM, 81 + MSM8939_SLAVE_MSS, 82 + MSM8939_SLAVE_PDM, 83 + MSM8939_SLAVE_PMIC_ARB, 84 + MSM8939_SLAVE_PNOC_CFG, 85 + MSM8939_SLAVE_PRNG, 86 + MSM8939_SLAVE_QDSS_CFG, 87 + MSM8939_SLAVE_QDSS_STM, 88 + MSM8939_SLAVE_RBCPR_CFG, 89 + MSM8939_SLAVE_SDCC_1, 90 + MSM8939_SLAVE_SDCC_2, 91 + MSM8939_SLAVE_SECURITY, 92 + MSM8939_SLAVE_SNOC_CFG, 93 + MSM8939_SLAVE_SPDM, 94 + MSM8939_SLAVE_SRVC_SNOC, 95 + MSM8939_SLAVE_TCSR, 96 + MSM8939_SLAVE_TLMM, 97 + MSM8939_SLAVE_USB_HS1, 98 + MSM8939_SLAVE_USB_HS2, 99 + MSM8939_SLAVE_VENUS_CFG, 100 + MSM8939_SNOC_BIMC_0_MAS, 101 + MSM8939_SNOC_BIMC_0_SLV, 102 + MSM8939_SNOC_BIMC_1_MAS, 103 + MSM8939_SNOC_BIMC_1_SLV, 104 + MSM8939_SNOC_BIMC_2_MAS, 105 + MSM8939_SNOC_BIMC_2_SLV, 106 + MSM8939_SNOC_INT_0, 107 + MSM8939_SNOC_INT_1, 108 + MSM8939_SNOC_INT_BIMC, 109 + MSM8939_SNOC_PNOC_MAS, 110 + MSM8939_SNOC_PNOC_SLV, 111 + }; 112 + 113 + static const struct clk_bulk_data msm8939_bus_clocks[] = { 114 + { .id = "bus" }, 115 + { .id = "bus_a" }, 116 + }; 117 + 118 + DEFINE_QNODE(bimc_snoc_mas, MSM8939_BIMC_SNOC_MAS, 8, -1, -1, MSM8939_BIMC_SNOC_SLV); 119 + DEFINE_QNODE(bimc_snoc_slv, MSM8939_BIMC_SNOC_SLV, 16, -1, 2, MSM8939_SNOC_INT_0, MSM8939_SNOC_INT_1); 120 + DEFINE_QNODE(mas_apss, MSM8939_MASTER_AMPSS_M0, 16, -1, -1, MSM8939_SLAVE_EBI_CH0, MSM8939_BIMC_SNOC_MAS, MSM8939_SLAVE_AMPSS_L2); 121 + DEFINE_QNODE(mas_audio, MSM8939_MASTER_LPASS, 4, -1, -1, MSM8939_PNOC_MAS_0); 122 + DEFINE_QNODE(mas_blsp_1, MSM8939_MASTER_BLSP_1, 4, -1, -1, MSM8939_PNOC_MAS_1); 123 + DEFINE_QNODE(mas_dehr, MSM8939_MASTER_DEHR, 4, -1, -1, MSM8939_PNOC_MAS_0); 124 + DEFINE_QNODE(mas_gfx, MSM8939_MASTER_GRAPHICS_3D, 16, -1, -1, MSM8939_SLAVE_EBI_CH0, MSM8939_BIMC_SNOC_MAS, MSM8939_SLAVE_AMPSS_L2); 125 + DEFINE_QNODE(mas_jpeg, MSM8939_MASTER_JPEG, 16, -1, -1, MSM8939_SNOC_MM_INT_0, MSM8939_SNOC_MM_INT_2); 126 + DEFINE_QNODE(mas_mdp0, MSM8939_MASTER_MDP_PORT0, 16, -1, -1, MSM8939_SNOC_MM_INT_1, MSM8939_SNOC_MM_INT_2); 127 + DEFINE_QNODE(mas_mdp1, MSM8939_MASTER_MDP_PORT1, 16, -1, -1, MSM8939_SNOC_MM_INT_0, MSM8939_SNOC_MM_INT_2); 128 + DEFINE_QNODE(mas_cpp, MSM8939_MASTER_CPP, 16, -1, -1, MSM8939_SNOC_MM_INT_0, MSM8939_SNOC_MM_INT_2); 129 + DEFINE_QNODE(mas_pcnoc_crypto_0, MSM8939_MASTER_CRYPTO_CORE0, 8, -1, -1, MSM8939_PNOC_INT_1); 130 + DEFINE_QNODE(mas_pcnoc_sdcc_1, MSM8939_MASTER_SDCC_1, 8, -1, -1, MSM8939_PNOC_INT_1); 131 + DEFINE_QNODE(mas_pcnoc_sdcc_2, MSM8939_MASTER_SDCC_2, 8, -1, -1, MSM8939_PNOC_INT_1); 132 + DEFINE_QNODE(mas_qdss_bam, MSM8939_MASTER_QDSS_BAM, 8, -1, -1, MSM8939_SNOC_QDSS_INT); 133 + DEFINE_QNODE(mas_qdss_etr, MSM8939_MASTER_QDSS_ETR, 8, -1, -1, MSM8939_SNOC_QDSS_INT); 134 + DEFINE_QNODE(mas_snoc_cfg, MSM8939_MASTER_SNOC_CFG, 4, 20, -1, MSM8939_SLAVE_SRVC_SNOC); 135 + DEFINE_QNODE(mas_spdm, MSM8939_MASTER_SPDM, 4, -1, -1, MSM8939_PNOC_MAS_0); 136 + DEFINE_QNODE(mas_tcu0, MSM8939_MASTER_TCU0, 16, -1, -1, MSM8939_SLAVE_EBI_CH0, MSM8939_BIMC_SNOC_MAS, MSM8939_SLAVE_AMPSS_L2); 137 + DEFINE_QNODE(mas_usb_hs1, MSM8939_MASTER_USB_HS1, 4, -1, -1, MSM8939_PNOC_MAS_1); 138 + DEFINE_QNODE(mas_usb_hs2, MSM8939_MASTER_USB_HS2, 4, -1, -1, MSM8939_PNOC_MAS_1); 139 + DEFINE_QNODE(mas_vfe, MSM8939_MASTER_VFE, 16, -1, -1, MSM8939_SNOC_MM_INT_1, MSM8939_SNOC_MM_INT_2); 140 + DEFINE_QNODE(mas_video, MSM8939_MASTER_VIDEO_P0, 16, -1, -1, MSM8939_SNOC_MM_INT_0, MSM8939_SNOC_MM_INT_2); 141 + DEFINE_QNODE(mm_int_0, MSM8939_SNOC_MM_INT_0, 16, -1, -1, MSM8939_SNOC_BIMC_2_MAS); 142 + DEFINE_QNODE(mm_int_1, MSM8939_SNOC_MM_INT_1, 16, -1, -1, MSM8939_SNOC_BIMC_1_MAS); 143 + DEFINE_QNODE(mm_int_2, MSM8939_SNOC_MM_INT_2, 16, -1, -1, MSM8939_SNOC_INT_0); 144 + DEFINE_QNODE(pcnoc_int_0, MSM8939_PNOC_INT_0, 8, -1, -1, MSM8939_PNOC_SNOC_MAS, MSM8939_PNOC_SLV_0, MSM8939_PNOC_SLV_1, MSM8939_PNOC_SLV_2, MSM8939_PNOC_SLV_3, MSM8939_PNOC_SLV_4, MSM8939_PNOC_SLV_8, MSM8939_PNOC_SLV_9); 145 + DEFINE_QNODE(pcnoc_int_1, MSM8939_PNOC_INT_1, 8, -1, -1, MSM8939_PNOC_SNOC_MAS); 146 + DEFINE_QNODE(pcnoc_m_0, MSM8939_PNOC_MAS_0, 8, -1, -1, MSM8939_PNOC_INT_0); 147 + DEFINE_QNODE(pcnoc_m_1, MSM8939_PNOC_MAS_1, 8, -1, -1, MSM8939_PNOC_SNOC_MAS); 148 + DEFINE_QNODE(pcnoc_s_0, MSM8939_PNOC_SLV_0, 4, -1, -1, MSM8939_SLAVE_CLK_CTL, MSM8939_SLAVE_TLMM, MSM8939_SLAVE_TCSR, MSM8939_SLAVE_SECURITY, MSM8939_SLAVE_MSS); 149 + DEFINE_QNODE(pcnoc_s_1, MSM8939_PNOC_SLV_1, 4, -1, -1, MSM8939_SLAVE_IMEM_CFG, MSM8939_SLAVE_CRYPTO_0_CFG, MSM8939_SLAVE_MSG_RAM, MSM8939_SLAVE_PDM, MSM8939_SLAVE_PRNG); 150 + DEFINE_QNODE(pcnoc_s_2, MSM8939_PNOC_SLV_2, 4, -1, -1, MSM8939_SLAVE_SPDM, MSM8939_SLAVE_BOOT_ROM, MSM8939_SLAVE_BIMC_CFG, MSM8939_SLAVE_PNOC_CFG, MSM8939_SLAVE_PMIC_ARB); 151 + DEFINE_QNODE(pcnoc_s_3, MSM8939_PNOC_SLV_3, 4, -1, -1, MSM8939_SLAVE_MPM, MSM8939_SLAVE_SNOC_CFG, MSM8939_SLAVE_RBCPR_CFG, MSM8939_SLAVE_QDSS_CFG, MSM8939_SLAVE_DEHR_CFG); 152 + DEFINE_QNODE(pcnoc_s_4, MSM8939_PNOC_SLV_4, 4, -1, -1, MSM8939_SLAVE_VENUS_CFG, MSM8939_SLAVE_CAMERA_CFG, MSM8939_SLAVE_DISPLAY_CFG); 153 + DEFINE_QNODE(pcnoc_s_8, MSM8939_PNOC_SLV_8, 4, -1, -1, MSM8939_SLAVE_USB_HS1, MSM8939_SLAVE_SDCC_1, MSM8939_SLAVE_BLSP_1); 154 + DEFINE_QNODE(pcnoc_s_9, MSM8939_PNOC_SLV_9, 4, -1, -1, MSM8939_SLAVE_SDCC_2, MSM8939_SLAVE_LPASS, MSM8939_SLAVE_USB_HS2); 155 + DEFINE_QNODE(pcnoc_snoc_mas, MSM8939_PNOC_SNOC_MAS, 8, 29, -1, MSM8939_PNOC_SNOC_SLV); 156 + DEFINE_QNODE(pcnoc_snoc_slv, MSM8939_PNOC_SNOC_SLV, 8, -1, 45, MSM8939_SNOC_INT_0, MSM8939_SNOC_INT_BIMC, MSM8939_SNOC_INT_1); 157 + DEFINE_QNODE(qdss_int, MSM8939_SNOC_QDSS_INT, 8, -1, -1, MSM8939_SNOC_INT_0, MSM8939_SNOC_INT_BIMC); 158 + DEFINE_QNODE(slv_apps_l2, MSM8939_SLAVE_AMPSS_L2, 16, -1, -1, 0); 159 + DEFINE_QNODE(slv_apss, MSM8939_SLAVE_APSS, 4, -1, 20, 0); 160 + DEFINE_QNODE(slv_audio, MSM8939_SLAVE_LPASS, 4, -1, -1, 0); 161 + DEFINE_QNODE(slv_bimc_cfg, MSM8939_SLAVE_BIMC_CFG, 4, -1, -1, 0); 162 + DEFINE_QNODE(slv_blsp_1, MSM8939_SLAVE_BLSP_1, 4, -1, -1, 0); 163 + DEFINE_QNODE(slv_boot_rom, MSM8939_SLAVE_BOOT_ROM, 4, -1, -1, 0); 164 + DEFINE_QNODE(slv_camera_cfg, MSM8939_SLAVE_CAMERA_CFG, 4, -1, -1, 0); 165 + DEFINE_QNODE(slv_cats_0, MSM8939_SLAVE_CATS_128, 16, -1, 106, 0); 166 + DEFINE_QNODE(slv_cats_1, MSM8939_SLAVE_OCMEM_64, 8, -1, 107, 0); 167 + DEFINE_QNODE(slv_clk_ctl, MSM8939_SLAVE_CLK_CTL, 4, -1, -1, 0); 168 + DEFINE_QNODE(slv_crypto_0_cfg, MSM8939_SLAVE_CRYPTO_0_CFG, 4, -1, -1, 0); 169 + DEFINE_QNODE(slv_dehr_cfg, MSM8939_SLAVE_DEHR_CFG, 4, -1, -1, 0); 170 + DEFINE_QNODE(slv_display_cfg, MSM8939_SLAVE_DISPLAY_CFG, 4, -1, -1, 0); 171 + DEFINE_QNODE(slv_ebi_ch0, MSM8939_SLAVE_EBI_CH0, 16, -1, 0, 0); 172 + DEFINE_QNODE(slv_gfx_cfg, MSM8939_SLAVE_GRAPHICS_3D_CFG, 4, -1, -1, 0); 173 + DEFINE_QNODE(slv_imem_cfg, MSM8939_SLAVE_IMEM_CFG, 4, -1, -1, 0); 174 + DEFINE_QNODE(slv_imem, MSM8939_SLAVE_IMEM, 8, -1, 26, 0); 175 + DEFINE_QNODE(slv_mpm, MSM8939_SLAVE_MPM, 4, -1, -1, 0); 176 + DEFINE_QNODE(slv_msg_ram, MSM8939_SLAVE_MSG_RAM, 4, -1, -1, 0); 177 + DEFINE_QNODE(slv_mss, MSM8939_SLAVE_MSS, 4, -1, -1, 0); 178 + DEFINE_QNODE(slv_pdm, MSM8939_SLAVE_PDM, 4, -1, -1, 0); 179 + DEFINE_QNODE(slv_pmic_arb, MSM8939_SLAVE_PMIC_ARB, 4, -1, -1, 0); 180 + DEFINE_QNODE(slv_pcnoc_cfg, MSM8939_SLAVE_PNOC_CFG, 4, -1, -1, 0); 181 + DEFINE_QNODE(slv_prng, MSM8939_SLAVE_PRNG, 4, -1, -1, 0); 182 + DEFINE_QNODE(slv_qdss_cfg, MSM8939_SLAVE_QDSS_CFG, 4, -1, -1, 0); 183 + DEFINE_QNODE(slv_qdss_stm, MSM8939_SLAVE_QDSS_STM, 4, -1, 30, 0); 184 + DEFINE_QNODE(slv_rbcpr_cfg, MSM8939_SLAVE_RBCPR_CFG, 4, -1, -1, 0); 185 + DEFINE_QNODE(slv_sdcc_1, MSM8939_SLAVE_SDCC_1, 4, -1, -1, 0); 186 + DEFINE_QNODE(slv_sdcc_2, MSM8939_SLAVE_SDCC_2, 4, -1, -1, 0); 187 + DEFINE_QNODE(slv_security, MSM8939_SLAVE_SECURITY, 4, -1, -1, 0); 188 + DEFINE_QNODE(slv_snoc_cfg, MSM8939_SLAVE_SNOC_CFG, 4, -1, -1, 0); 189 + DEFINE_QNODE(slv_spdm, MSM8939_SLAVE_SPDM, 4, -1, -1, 0); 190 + DEFINE_QNODE(slv_srvc_snoc, MSM8939_SLAVE_SRVC_SNOC, 8, -1, 29, 0); 191 + DEFINE_QNODE(slv_tcsr, MSM8939_SLAVE_TCSR, 4, -1, -1, 0); 192 + DEFINE_QNODE(slv_tlmm, MSM8939_SLAVE_TLMM, 4, -1, -1, 0); 193 + DEFINE_QNODE(slv_usb_hs1, MSM8939_SLAVE_USB_HS1, 4, -1, -1, 0); 194 + DEFINE_QNODE(slv_usb_hs2, MSM8939_SLAVE_USB_HS2, 4, -1, -1, 0); 195 + DEFINE_QNODE(slv_venus_cfg, MSM8939_SLAVE_VENUS_CFG, 4, -1, -1, 0); 196 + DEFINE_QNODE(snoc_bimc_0_mas, MSM8939_SNOC_BIMC_0_MAS, 16, 3, -1, MSM8939_SNOC_BIMC_0_SLV); 197 + DEFINE_QNODE(snoc_bimc_0_slv, MSM8939_SNOC_BIMC_0_SLV, 16, -1, 24, MSM8939_SLAVE_EBI_CH0); 198 + DEFINE_QNODE(snoc_bimc_1_mas, MSM8939_SNOC_BIMC_1_MAS, 16, 76, -1, MSM8939_SNOC_BIMC_1_SLV); 199 + DEFINE_QNODE(snoc_bimc_1_slv, MSM8939_SNOC_BIMC_1_SLV, 16, -1, 104, MSM8939_SLAVE_EBI_CH0); 200 + DEFINE_QNODE(snoc_bimc_2_mas, MSM8939_SNOC_BIMC_2_MAS, 16, -1, -1, MSM8939_SNOC_BIMC_2_SLV); 201 + DEFINE_QNODE(snoc_bimc_2_slv, MSM8939_SNOC_BIMC_2_SLV, 16, -1, -1, MSM8939_SLAVE_EBI_CH0); 202 + DEFINE_QNODE(snoc_int_0, MSM8939_SNOC_INT_0, 8, 99, 130, MSM8939_SLAVE_QDSS_STM, MSM8939_SLAVE_IMEM, MSM8939_SNOC_PNOC_MAS); 203 + DEFINE_QNODE(snoc_int_1, MSM8939_SNOC_INT_1, 8, 100, 131, MSM8939_SLAVE_APSS, MSM8939_SLAVE_CATS_128, MSM8939_SLAVE_OCMEM_64); 204 + DEFINE_QNODE(snoc_int_bimc, MSM8939_SNOC_INT_BIMC, 8, 101, 132, MSM8939_SNOC_BIMC_1_MAS); 205 + DEFINE_QNODE(snoc_pcnoc_mas, MSM8939_SNOC_PNOC_MAS, 8, -1, -1, MSM8939_SNOC_PNOC_SLV); 206 + DEFINE_QNODE(snoc_pcnoc_slv, MSM8939_SNOC_PNOC_SLV, 8, -1, -1, MSM8939_PNOC_INT_0); 207 + 208 + static struct qcom_icc_node *msm8939_snoc_nodes[] = { 209 + [BIMC_SNOC_SLV] = &bimc_snoc_slv, 210 + [MASTER_QDSS_BAM] = &mas_qdss_bam, 211 + [MASTER_QDSS_ETR] = &mas_qdss_etr, 212 + [MASTER_SNOC_CFG] = &mas_snoc_cfg, 213 + [PCNOC_SNOC_SLV] = &pcnoc_snoc_slv, 214 + [SLAVE_APSS] = &slv_apss, 215 + [SLAVE_CATS_128] = &slv_cats_0, 216 + [SLAVE_OCMEM_64] = &slv_cats_1, 217 + [SLAVE_IMEM] = &slv_imem, 218 + [SLAVE_QDSS_STM] = &slv_qdss_stm, 219 + [SLAVE_SRVC_SNOC] = &slv_srvc_snoc, 220 + [SNOC_BIMC_0_MAS] = &snoc_bimc_0_mas, 221 + [SNOC_BIMC_1_MAS] = &snoc_bimc_1_mas, 222 + [SNOC_BIMC_2_MAS] = &snoc_bimc_2_mas, 223 + [SNOC_INT_0] = &snoc_int_0, 224 + [SNOC_INT_1] = &snoc_int_1, 225 + [SNOC_INT_BIMC] = &snoc_int_bimc, 226 + [SNOC_PCNOC_MAS] = &snoc_pcnoc_mas, 227 + [SNOC_QDSS_INT] = &qdss_int, 228 + }; 229 + 230 + static struct qcom_icc_desc msm8939_snoc = { 231 + .nodes = msm8939_snoc_nodes, 232 + .num_nodes = ARRAY_SIZE(msm8939_snoc_nodes), 233 + }; 234 + 235 + static struct qcom_icc_node *msm8939_snoc_mm_nodes[] = { 236 + [MASTER_VIDEO_P0] = &mas_video, 237 + [MASTER_JPEG] = &mas_jpeg, 238 + [MASTER_VFE] = &mas_vfe, 239 + [MASTER_MDP_PORT0] = &mas_mdp0, 240 + [MASTER_MDP_PORT1] = &mas_mdp1, 241 + [MASTER_CPP] = &mas_cpp, 242 + [SNOC_MM_INT_0] = &mm_int_0, 243 + [SNOC_MM_INT_1] = &mm_int_1, 244 + [SNOC_MM_INT_2] = &mm_int_2, 245 + }; 246 + 247 + static struct qcom_icc_desc msm8939_snoc_mm = { 248 + .nodes = msm8939_snoc_mm_nodes, 249 + .num_nodes = ARRAY_SIZE(msm8939_snoc_mm_nodes), 250 + }; 251 + 252 + static struct qcom_icc_node *msm8939_bimc_nodes[] = { 253 + [BIMC_SNOC_MAS] = &bimc_snoc_mas, 254 + [MASTER_AMPSS_M0] = &mas_apss, 255 + [MASTER_GRAPHICS_3D] = &mas_gfx, 256 + [MASTER_TCU0] = &mas_tcu0, 257 + [SLAVE_AMPSS_L2] = &slv_apps_l2, 258 + [SLAVE_EBI_CH0] = &slv_ebi_ch0, 259 + [SNOC_BIMC_0_SLV] = &snoc_bimc_0_slv, 260 + [SNOC_BIMC_1_SLV] = &snoc_bimc_1_slv, 261 + [SNOC_BIMC_2_SLV] = &snoc_bimc_2_slv, 262 + }; 263 + 264 + static struct qcom_icc_desc msm8939_bimc = { 265 + .nodes = msm8939_bimc_nodes, 266 + .num_nodes = ARRAY_SIZE(msm8939_bimc_nodes), 267 + }; 268 + 269 + static struct qcom_icc_node *msm8939_pcnoc_nodes[] = { 270 + [MASTER_BLSP_1] = &mas_blsp_1, 271 + [MASTER_DEHR] = &mas_dehr, 272 + [MASTER_LPASS] = &mas_audio, 273 + [MASTER_CRYPTO_CORE0] = &mas_pcnoc_crypto_0, 274 + [MASTER_SDCC_1] = &mas_pcnoc_sdcc_1, 275 + [MASTER_SDCC_2] = &mas_pcnoc_sdcc_2, 276 + [MASTER_SPDM] = &mas_spdm, 277 + [MASTER_USB_HS1] = &mas_usb_hs1, 278 + [MASTER_USB_HS2] = &mas_usb_hs2, 279 + [PCNOC_INT_0] = &pcnoc_int_0, 280 + [PCNOC_INT_1] = &pcnoc_int_1, 281 + [PCNOC_MAS_0] = &pcnoc_m_0, 282 + [PCNOC_MAS_1] = &pcnoc_m_1, 283 + [PCNOC_SLV_0] = &pcnoc_s_0, 284 + [PCNOC_SLV_1] = &pcnoc_s_1, 285 + [PCNOC_SLV_2] = &pcnoc_s_2, 286 + [PCNOC_SLV_3] = &pcnoc_s_3, 287 + [PCNOC_SLV_4] = &pcnoc_s_4, 288 + [PCNOC_SLV_8] = &pcnoc_s_8, 289 + [PCNOC_SLV_9] = &pcnoc_s_9, 290 + [PCNOC_SNOC_MAS] = &pcnoc_snoc_mas, 291 + [SLAVE_BIMC_CFG] = &slv_bimc_cfg, 292 + [SLAVE_BLSP_1] = &slv_blsp_1, 293 + [SLAVE_BOOT_ROM] = &slv_boot_rom, 294 + [SLAVE_CAMERA_CFG] = &slv_camera_cfg, 295 + [SLAVE_CLK_CTL] = &slv_clk_ctl, 296 + [SLAVE_CRYPTO_0_CFG] = &slv_crypto_0_cfg, 297 + [SLAVE_DEHR_CFG] = &slv_dehr_cfg, 298 + [SLAVE_DISPLAY_CFG] = &slv_display_cfg, 299 + [SLAVE_GRAPHICS_3D_CFG] = &slv_gfx_cfg, 300 + [SLAVE_IMEM_CFG] = &slv_imem_cfg, 301 + [SLAVE_LPASS] = &slv_audio, 302 + [SLAVE_MPM] = &slv_mpm, 303 + [SLAVE_MSG_RAM] = &slv_msg_ram, 304 + [SLAVE_MSS] = &slv_mss, 305 + [SLAVE_PDM] = &slv_pdm, 306 + [SLAVE_PMIC_ARB] = &slv_pmic_arb, 307 + [SLAVE_PCNOC_CFG] = &slv_pcnoc_cfg, 308 + [SLAVE_PRNG] = &slv_prng, 309 + [SLAVE_QDSS_CFG] = &slv_qdss_cfg, 310 + [SLAVE_RBCPR_CFG] = &slv_rbcpr_cfg, 311 + [SLAVE_SDCC_1] = &slv_sdcc_1, 312 + [SLAVE_SDCC_2] = &slv_sdcc_2, 313 + [SLAVE_SECURITY] = &slv_security, 314 + [SLAVE_SNOC_CFG] = &slv_snoc_cfg, 315 + [SLAVE_SPDM] = &slv_spdm, 316 + [SLAVE_TCSR] = &slv_tcsr, 317 + [SLAVE_TLMM] = &slv_tlmm, 318 + [SLAVE_USB_HS1] = &slv_usb_hs1, 319 + [SLAVE_USB_HS2] = &slv_usb_hs2, 320 + [SLAVE_VENUS_CFG] = &slv_venus_cfg, 321 + [SNOC_PCNOC_SLV] = &snoc_pcnoc_slv, 322 + }; 323 + 324 + static struct qcom_icc_desc msm8939_pcnoc = { 325 + .nodes = msm8939_pcnoc_nodes, 326 + .num_nodes = ARRAY_SIZE(msm8939_pcnoc_nodes), 327 + }; 328 + 329 + static int msm8939_qnoc_probe(struct platform_device *pdev) 330 + { 331 + return qnoc_probe(pdev, sizeof(msm8939_bus_clocks), 332 + ARRAY_SIZE(msm8939_bus_clocks), msm8939_bus_clocks); 333 + } 334 + 335 + static const struct of_device_id msm8939_noc_of_match[] = { 336 + { .compatible = "qcom,msm8939-bimc", .data = &msm8939_bimc }, 337 + { .compatible = "qcom,msm8939-pcnoc", .data = &msm8939_pcnoc }, 338 + { .compatible = "qcom,msm8939-snoc", .data = &msm8939_snoc }, 339 + { .compatible = "qcom,msm8939-snoc-mm", .data = &msm8939_snoc_mm }, 340 + { } 341 + }; 342 + MODULE_DEVICE_TABLE(of, msm8939_noc_of_match); 343 + 344 + static struct platform_driver msm8939_noc_driver = { 345 + .probe = msm8939_qnoc_probe, 346 + .remove = qnoc_remove, 347 + .driver = { 348 + .name = "qnoc-msm8939", 349 + .of_match_table = msm8939_noc_of_match, 350 + }, 351 + }; 352 + module_platform_driver(msm8939_noc_driver); 353 + MODULE_AUTHOR("Jun Nie <jun.nie@linaro.org>"); 354 + MODULE_DESCRIPTION("Qualcomm MSM8939 NoC driver"); 355 + MODULE_LICENSE("GPL v2");
+9 -235
drivers/interconnect/qcom/qcs404.c
··· 9 9 #include <linux/interconnect-provider.h> 10 10 #include <linux/io.h> 11 11 #include <linux/module.h> 12 - #include <linux/of_device.h> 13 - #include <linux/of_platform.h> 14 12 #include <linux/platform_device.h> 15 - #include <linux/slab.h> 13 + #include <linux/of_device.h> 14 + 16 15 17 16 #include "smd-rpm.h" 18 - 19 - #define RPM_BUS_MASTER_REQ 0x73616d62 20 - #define RPM_BUS_SLAVE_REQ 0x766c7362 17 + #include "icc-rpm.h" 21 18 22 19 enum { 23 20 QCS404_MASTER_AMPSS_M0 = 1, ··· 92 95 QCS404_SLAVE_LPASS, 93 96 }; 94 97 95 - #define to_qcom_provider(_provider) \ 96 - container_of(_provider, struct qcom_icc_provider, provider) 97 - 98 - static const struct clk_bulk_data bus_clocks[] = { 98 + static const struct clk_bulk_data qcs404_bus_clocks[] = { 99 99 { .id = "bus" }, 100 100 { .id = "bus_a" }, 101 101 }; 102 - 103 - /** 104 - * struct qcom_icc_provider - Qualcomm specific interconnect provider 105 - * @provider: generic interconnect provider 106 - * @bus_clks: the clk_bulk_data table of bus clocks 107 - * @num_clks: the total number of clk_bulk_data entries 108 - */ 109 - struct qcom_icc_provider { 110 - struct icc_provider provider; 111 - struct clk_bulk_data *bus_clks; 112 - int num_clks; 113 - }; 114 - 115 - #define QCS404_MAX_LINKS 12 116 - 117 - /** 118 - * struct qcom_icc_node - Qualcomm specific interconnect nodes 119 - * @name: the node name used in debugfs 120 - * @id: a unique node identifier 121 - * @links: an array of nodes where we can go next while traversing 122 - * @num_links: the total number of @links 123 - * @buswidth: width of the interconnect between a node and the bus (bytes) 124 - * @mas_rpm_id: RPM id for devices that are bus masters 125 - * @slv_rpm_id: RPM id for devices that are bus slaves 126 - * @rate: current bus clock rate in Hz 127 - */ 128 - struct qcom_icc_node { 129 - unsigned char *name; 130 - u16 id; 131 - u16 links[QCS404_MAX_LINKS]; 132 - u16 num_links; 133 - u16 buswidth; 134 - int mas_rpm_id; 135 - int slv_rpm_id; 136 - u64 rate; 137 - }; 138 - 139 - struct qcom_icc_desc { 140 - struct qcom_icc_node **nodes; 141 - size_t num_nodes; 142 - }; 143 - 144 - #define DEFINE_QNODE(_name, _id, _buswidth, _mas_rpm_id, _slv_rpm_id, \ 145 - ...) \ 146 - static struct qcom_icc_node _name = { \ 147 - .name = #_name, \ 148 - .id = _id, \ 149 - .buswidth = _buswidth, \ 150 - .mas_rpm_id = _mas_rpm_id, \ 151 - .slv_rpm_id = _slv_rpm_id, \ 152 - .num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \ 153 - .links = { __VA_ARGS__ }, \ 154 - } 155 102 156 103 DEFINE_QNODE(mas_apps_proc, QCS404_MASTER_AMPSS_M0, 8, 0, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV); 157 104 DEFINE_QNODE(mas_oxili, QCS404_MASTER_GRAPHICS_3D, 8, -1, -1, QCS404_SLAVE_EBI_CH0, QCS404_BIMC_SNOC_SLV); ··· 268 327 .num_nodes = ARRAY_SIZE(qcs404_snoc_nodes), 269 328 }; 270 329 271 - static int qcom_icc_set(struct icc_node *src, struct icc_node *dst) 330 + 331 + static int qcs404_qnoc_probe(struct platform_device *pdev) 272 332 { 273 - struct qcom_icc_provider *qp; 274 - struct qcom_icc_node *qn; 275 - struct icc_provider *provider; 276 - struct icc_node *n; 277 - u64 sum_bw; 278 - u64 max_peak_bw; 279 - u64 rate; 280 - u32 agg_avg = 0; 281 - u32 agg_peak = 0; 282 - int ret, i; 283 - 284 - qn = src->data; 285 - provider = src->provider; 286 - qp = to_qcom_provider(provider); 287 - 288 - list_for_each_entry(n, &provider->nodes, node_list) 289 - provider->aggregate(n, 0, n->avg_bw, n->peak_bw, 290 - &agg_avg, &agg_peak); 291 - 292 - sum_bw = icc_units_to_bps(agg_avg); 293 - max_peak_bw = icc_units_to_bps(agg_peak); 294 - 295 - /* send bandwidth request message to the RPM processor */ 296 - if (qn->mas_rpm_id != -1) { 297 - ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE, 298 - RPM_BUS_MASTER_REQ, 299 - qn->mas_rpm_id, 300 - sum_bw); 301 - if (ret) { 302 - pr_err("qcom_icc_rpm_smd_send mas %d error %d\n", 303 - qn->mas_rpm_id, ret); 304 - return ret; 305 - } 306 - } 307 - 308 - if (qn->slv_rpm_id != -1) { 309 - ret = qcom_icc_rpm_smd_send(QCOM_SMD_RPM_ACTIVE_STATE, 310 - RPM_BUS_SLAVE_REQ, 311 - qn->slv_rpm_id, 312 - sum_bw); 313 - if (ret) { 314 - pr_err("qcom_icc_rpm_smd_send slv error %d\n", 315 - ret); 316 - return ret; 317 - } 318 - } 319 - 320 - rate = max(sum_bw, max_peak_bw); 321 - 322 - do_div(rate, qn->buswidth); 323 - 324 - if (qn->rate == rate) 325 - return 0; 326 - 327 - for (i = 0; i < qp->num_clks; i++) { 328 - ret = clk_set_rate(qp->bus_clks[i].clk, rate); 329 - if (ret) { 330 - pr_err("%s clk_set_rate error: %d\n", 331 - qp->bus_clks[i].id, ret); 332 - return ret; 333 - } 334 - } 335 - 336 - qn->rate = rate; 337 - 338 - return 0; 339 - } 340 - 341 - static int qnoc_probe(struct platform_device *pdev) 342 - { 343 - struct device *dev = &pdev->dev; 344 - const struct qcom_icc_desc *desc; 345 - struct icc_onecell_data *data; 346 - struct icc_provider *provider; 347 - struct qcom_icc_node **qnodes; 348 - struct qcom_icc_provider *qp; 349 - struct icc_node *node; 350 - size_t num_nodes, i; 351 - int ret; 352 - 353 - /* wait for the RPM proxy */ 354 - if (!qcom_icc_rpm_smd_available()) 355 - return -EPROBE_DEFER; 356 - 357 - desc = of_device_get_match_data(dev); 358 - if (!desc) 359 - return -EINVAL; 360 - 361 - qnodes = desc->nodes; 362 - num_nodes = desc->num_nodes; 363 - 364 - qp = devm_kzalloc(dev, sizeof(*qp), GFP_KERNEL); 365 - if (!qp) 366 - return -ENOMEM; 367 - 368 - data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), 369 - GFP_KERNEL); 370 - if (!data) 371 - return -ENOMEM; 372 - 373 - qp->bus_clks = devm_kmemdup(dev, bus_clocks, sizeof(bus_clocks), 374 - GFP_KERNEL); 375 - if (!qp->bus_clks) 376 - return -ENOMEM; 377 - 378 - qp->num_clks = ARRAY_SIZE(bus_clocks); 379 - ret = devm_clk_bulk_get(dev, qp->num_clks, qp->bus_clks); 380 - if (ret) 381 - return ret; 382 - 383 - ret = clk_bulk_prepare_enable(qp->num_clks, qp->bus_clks); 384 - if (ret) 385 - return ret; 386 - 387 - provider = &qp->provider; 388 - INIT_LIST_HEAD(&provider->nodes); 389 - provider->dev = dev; 390 - provider->set = qcom_icc_set; 391 - provider->aggregate = icc_std_aggregate; 392 - provider->xlate = of_icc_xlate_onecell; 393 - provider->data = data; 394 - 395 - ret = icc_provider_add(provider); 396 - if (ret) { 397 - dev_err(dev, "error adding interconnect provider: %d\n", ret); 398 - clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 399 - return ret; 400 - } 401 - 402 - for (i = 0; i < num_nodes; i++) { 403 - size_t j; 404 - 405 - node = icc_node_create(qnodes[i]->id); 406 - if (IS_ERR(node)) { 407 - ret = PTR_ERR(node); 408 - goto err; 409 - } 410 - 411 - node->name = qnodes[i]->name; 412 - node->data = qnodes[i]; 413 - icc_node_add(node, provider); 414 - 415 - dev_dbg(dev, "registered node %s\n", node->name); 416 - 417 - /* populate links */ 418 - for (j = 0; j < qnodes[i]->num_links; j++) 419 - icc_link_create(node, qnodes[i]->links[j]); 420 - 421 - data->nodes[i] = node; 422 - } 423 - data->num_nodes = num_nodes; 424 - 425 - platform_set_drvdata(pdev, qp); 426 - 427 - return 0; 428 - err: 429 - icc_nodes_remove(provider); 430 - clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 431 - icc_provider_del(provider); 432 - 433 - return ret; 434 - } 435 - 436 - static int qnoc_remove(struct platform_device *pdev) 437 - { 438 - struct qcom_icc_provider *qp = platform_get_drvdata(pdev); 439 - 440 - icc_nodes_remove(&qp->provider); 441 - clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); 442 - return icc_provider_del(&qp->provider); 333 + return qnoc_probe(pdev, sizeof(qcs404_bus_clocks), 334 + ARRAY_SIZE(qcs404_bus_clocks), qcs404_bus_clocks); 443 335 } 444 336 445 337 static const struct of_device_id qcs404_noc_of_match[] = { ··· 284 510 MODULE_DEVICE_TABLE(of, qcs404_noc_of_match); 285 511 286 512 static struct platform_driver qcs404_noc_driver = { 287 - .probe = qnoc_probe, 513 + .probe = qcs404_qnoc_probe, 288 514 .remove = qnoc_remove, 289 515 .driver = { 290 516 .name = "qnoc-qcs404",
+356
drivers/interconnect/qcom/sdx55.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Qualcomm SDX55 interconnect driver 4 + * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 5 + * 6 + * Copyright (c) 2021, Linaro Ltd. 7 + * 8 + */ 9 + 10 + #include <linux/device.h> 11 + #include <linux/interconnect.h> 12 + #include <linux/interconnect-provider.h> 13 + #include <linux/module.h> 14 + #include <linux/of_platform.h> 15 + #include <dt-bindings/interconnect/qcom,sdx55.h> 16 + 17 + #include "bcm-voter.h" 18 + #include "icc-rpmh.h" 19 + #include "sdx55.h" 20 + 21 + DEFINE_QNODE(ipa_core_master, SDX55_MASTER_IPA_CORE, 1, 8, SDX55_SLAVE_IPA_CORE); 22 + DEFINE_QNODE(llcc_mc, SDX55_MASTER_LLCC, 4, 4, SDX55_SLAVE_EBI_CH0); 23 + DEFINE_QNODE(acm_tcu, SDX55_MASTER_TCU_0, 1, 8, SDX55_SLAVE_LLCC, SDX55_SLAVE_MEM_NOC_SNOC, SDX55_SLAVE_MEM_NOC_PCIE_SNOC); 24 + DEFINE_QNODE(qnm_snoc_gc, SDX55_MASTER_SNOC_GC_MEM_NOC, 1, 8, SDX55_SLAVE_LLCC); 25 + DEFINE_QNODE(xm_apps_rdwr, SDX55_MASTER_AMPSS_M0, 1, 16, SDX55_SLAVE_LLCC, SDX55_SLAVE_MEM_NOC_SNOC, SDX55_SLAVE_MEM_NOC_PCIE_SNOC); 26 + DEFINE_QNODE(qhm_audio, SDX55_MASTER_AUDIO, 1, 4, SDX55_SLAVE_ANOC_SNOC); 27 + DEFINE_QNODE(qhm_blsp1, SDX55_MASTER_BLSP_1, 1, 4, SDX55_SLAVE_ANOC_SNOC); 28 + DEFINE_QNODE(qhm_qdss_bam, SDX55_MASTER_QDSS_BAM, 1, 4, SDX55_SLAVE_SNOC_CFG, SDX55_SLAVE_EMAC_CFG, SDX55_SLAVE_USB3, SDX55_SLAVE_TLMM, SDX55_SLAVE_SPMI_FETCHER, SDX55_SLAVE_QDSS_CFG, SDX55_SLAVE_PDM, SDX55_SLAVE_SNOC_MEM_NOC_GC, SDX55_SLAVE_TCSR, SDX55_SLAVE_CNOC_DDRSS, SDX55_SLAVE_SPMI_VGI_COEX, SDX55_SLAVE_QPIC, SDX55_SLAVE_OCIMEM, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_USB3_PHY_CFG, SDX55_SLAVE_AOP, SDX55_SLAVE_BLSP_1, SDX55_SLAVE_SDCC_1, SDX55_SLAVE_CNOC_MSS, SDX55_SLAVE_PCIE_PARF, SDX55_SLAVE_ECC_CFG, SDX55_SLAVE_AUDIO, SDX55_SLAVE_AOSS, SDX55_SLAVE_PRNG, SDX55_SLAVE_CRYPTO_0_CFG, SDX55_SLAVE_TCU, SDX55_SLAVE_CLK_CTL, SDX55_SLAVE_IMEM_CFG); 29 + DEFINE_QNODE(qhm_qpic, SDX55_MASTER_QPIC, 1, 4, SDX55_SLAVE_AOSS, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_ANOC_SNOC, SDX55_SLAVE_AOP, SDX55_SLAVE_AUDIO); 30 + DEFINE_QNODE(qhm_snoc_cfg, SDX55_MASTER_SNOC_CFG, 1, 4, SDX55_SLAVE_SERVICE_SNOC); 31 + DEFINE_QNODE(qhm_spmi_fetcher1, SDX55_MASTER_SPMI_FETCHER, 1, 4, SDX55_SLAVE_AOSS, SDX55_SLAVE_ANOC_SNOC, SDX55_SLAVE_AOP); 32 + DEFINE_QNODE(qnm_aggre_noc, SDX55_MASTER_ANOC_SNOC, 1, 8, SDX55_SLAVE_PCIE_0, SDX55_SLAVE_SNOC_CFG, SDX55_SLAVE_SDCC_1, SDX55_SLAVE_TLMM, SDX55_SLAVE_SPMI_FETCHER, SDX55_SLAVE_QDSS_CFG, SDX55_SLAVE_PDM, SDX55_SLAVE_SNOC_MEM_NOC_GC, SDX55_SLAVE_TCSR, SDX55_SLAVE_CNOC_DDRSS, SDX55_SLAVE_SPMI_VGI_COEX, SDX55_SLAVE_QDSS_STM, SDX55_SLAVE_QPIC, SDX55_SLAVE_OCIMEM, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_USB3_PHY_CFG, SDX55_SLAVE_AOP, SDX55_SLAVE_BLSP_1, SDX55_SLAVE_USB3, SDX55_SLAVE_CNOC_MSS, SDX55_SLAVE_PCIE_PARF, SDX55_SLAVE_ECC_CFG, SDX55_SLAVE_APPSS, SDX55_SLAVE_AUDIO, SDX55_SLAVE_AOSS, SDX55_SLAVE_PRNG, SDX55_SLAVE_CRYPTO_0_CFG, SDX55_SLAVE_TCU, SDX55_SLAVE_CLK_CTL, SDX55_SLAVE_IMEM_CFG); 33 + DEFINE_QNODE(qnm_ipa, SDX55_MASTER_IPA, 1, 8, SDX55_SLAVE_SNOC_CFG, SDX55_SLAVE_EMAC_CFG, SDX55_SLAVE_USB3, SDX55_SLAVE_AOSS, SDX55_SLAVE_SPMI_FETCHER, SDX55_SLAVE_QDSS_CFG, SDX55_SLAVE_PDM, SDX55_SLAVE_SNOC_MEM_NOC_GC, SDX55_SLAVE_TCSR, SDX55_SLAVE_CNOC_DDRSS, SDX55_SLAVE_QDSS_STM, SDX55_SLAVE_QPIC, SDX55_SLAVE_OCIMEM, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_USB3_PHY_CFG, SDX55_SLAVE_AOP, SDX55_SLAVE_BLSP_1, SDX55_SLAVE_SDCC_1, SDX55_SLAVE_CNOC_MSS, SDX55_SLAVE_PCIE_PARF, SDX55_SLAVE_ECC_CFG, SDX55_SLAVE_AUDIO, SDX55_SLAVE_TLMM, SDX55_SLAVE_PRNG, SDX55_SLAVE_CRYPTO_0_CFG, SDX55_SLAVE_CLK_CTL, SDX55_SLAVE_IMEM_CFG); 34 + DEFINE_QNODE(qnm_memnoc, SDX55_MASTER_MEM_NOC_SNOC, 1, 8, SDX55_SLAVE_SNOC_CFG, SDX55_SLAVE_EMAC_CFG, SDX55_SLAVE_USB3, SDX55_SLAVE_TLMM, SDX55_SLAVE_SPMI_FETCHER, SDX55_SLAVE_QDSS_CFG, SDX55_SLAVE_PDM, SDX55_SLAVE_TCSR, SDX55_SLAVE_CNOC_DDRSS, SDX55_SLAVE_SPMI_VGI_COEX, SDX55_SLAVE_QDSS_STM, SDX55_SLAVE_QPIC, SDX55_SLAVE_OCIMEM, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_USB3_PHY_CFG, SDX55_SLAVE_AOP, SDX55_SLAVE_BLSP_1, SDX55_SLAVE_SDCC_1, SDX55_SLAVE_CNOC_MSS, SDX55_SLAVE_PCIE_PARF, SDX55_SLAVE_ECC_CFG, SDX55_SLAVE_APPSS, SDX55_SLAVE_AUDIO, SDX55_SLAVE_AOSS, SDX55_SLAVE_PRNG, SDX55_SLAVE_CRYPTO_0_CFG, SDX55_SLAVE_TCU, SDX55_SLAVE_CLK_CTL, SDX55_SLAVE_IMEM_CFG); 35 + DEFINE_QNODE(qnm_memnoc_pcie, SDX55_MASTER_MEM_NOC_PCIE_SNOC, 1, 8, SDX55_SLAVE_PCIE_0); 36 + DEFINE_QNODE(qxm_crypto, SDX55_MASTER_CRYPTO_CORE_0, 1, 8, SDX55_SLAVE_AOSS, SDX55_SLAVE_ANOC_SNOC, SDX55_SLAVE_AOP); 37 + DEFINE_QNODE(xm_emac, SDX55_MASTER_EMAC, 1, 8, SDX55_SLAVE_ANOC_SNOC); 38 + DEFINE_QNODE(xm_ipa2pcie_slv, SDX55_MASTER_IPA_PCIE, 1, 8, SDX55_SLAVE_PCIE_0); 39 + DEFINE_QNODE(xm_pcie, SDX55_MASTER_PCIE, 1, 8, SDX55_SLAVE_ANOC_SNOC); 40 + DEFINE_QNODE(xm_qdss_etr, SDX55_MASTER_QDSS_ETR, 1, 8, SDX55_SLAVE_SNOC_CFG, SDX55_SLAVE_EMAC_CFG, SDX55_SLAVE_USB3, SDX55_SLAVE_AOSS, SDX55_SLAVE_SPMI_FETCHER, SDX55_SLAVE_QDSS_CFG, SDX55_SLAVE_PDM, SDX55_SLAVE_SNOC_MEM_NOC_GC, SDX55_SLAVE_TCSR, SDX55_SLAVE_CNOC_DDRSS, SDX55_SLAVE_SPMI_VGI_COEX, SDX55_SLAVE_QPIC, SDX55_SLAVE_OCIMEM, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_USB3_PHY_CFG, SDX55_SLAVE_AOP, SDX55_SLAVE_BLSP_1, SDX55_SLAVE_SDCC_1, SDX55_SLAVE_CNOC_MSS, SDX55_SLAVE_PCIE_PARF, SDX55_SLAVE_ECC_CFG, SDX55_SLAVE_AUDIO, SDX55_SLAVE_AOSS, SDX55_SLAVE_PRNG, SDX55_SLAVE_CRYPTO_0_CFG, SDX55_SLAVE_TCU, SDX55_SLAVE_CLK_CTL, SDX55_SLAVE_IMEM_CFG); 41 + DEFINE_QNODE(xm_sdc1, SDX55_MASTER_SDCC_1, 1, 8, SDX55_SLAVE_AOSS, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_ANOC_SNOC, SDX55_SLAVE_AOP, SDX55_SLAVE_AUDIO); 42 + DEFINE_QNODE(xm_usb3, SDX55_MASTER_USB3, 1, 8, SDX55_SLAVE_ANOC_SNOC); 43 + DEFINE_QNODE(ipa_core_slave, SDX55_SLAVE_IPA_CORE, 1, 8); 44 + DEFINE_QNODE(ebi, SDX55_SLAVE_EBI_CH0, 1, 4); 45 + DEFINE_QNODE(qns_llcc, SDX55_SLAVE_LLCC, 1, 16, SDX55_SLAVE_EBI_CH0); 46 + DEFINE_QNODE(qns_memnoc_snoc, SDX55_SLAVE_MEM_NOC_SNOC, 1, 8, SDX55_MASTER_MEM_NOC_SNOC); 47 + DEFINE_QNODE(qns_sys_pcie, SDX55_SLAVE_MEM_NOC_PCIE_SNOC, 1, 8, SDX55_MASTER_MEM_NOC_PCIE_SNOC); 48 + DEFINE_QNODE(qhs_aop, SDX55_SLAVE_AOP, 1, 4); 49 + DEFINE_QNODE(qhs_aoss, SDX55_SLAVE_AOSS, 1, 4); 50 + DEFINE_QNODE(qhs_apss, SDX55_SLAVE_APPSS, 1, 4); 51 + DEFINE_QNODE(qhs_audio, SDX55_SLAVE_AUDIO, 1, 4); 52 + DEFINE_QNODE(qhs_blsp1, SDX55_SLAVE_BLSP_1, 1, 4); 53 + DEFINE_QNODE(qhs_clk_ctl, SDX55_SLAVE_CLK_CTL, 1, 4); 54 + DEFINE_QNODE(qhs_crypto0_cfg, SDX55_SLAVE_CRYPTO_0_CFG, 1, 4); 55 + DEFINE_QNODE(qhs_ddrss_cfg, SDX55_SLAVE_CNOC_DDRSS, 1, 4); 56 + DEFINE_QNODE(qhs_ecc_cfg, SDX55_SLAVE_ECC_CFG, 1, 4); 57 + DEFINE_QNODE(qhs_emac_cfg, SDX55_SLAVE_EMAC_CFG, 1, 4); 58 + DEFINE_QNODE(qhs_imem_cfg, SDX55_SLAVE_IMEM_CFG, 1, 4); 59 + DEFINE_QNODE(qhs_ipa, SDX55_SLAVE_IPA_CFG, 1, 4); 60 + DEFINE_QNODE(qhs_mss_cfg, SDX55_SLAVE_CNOC_MSS, 1, 4); 61 + DEFINE_QNODE(qhs_pcie_parf, SDX55_SLAVE_PCIE_PARF, 1, 4); 62 + DEFINE_QNODE(qhs_pdm, SDX55_SLAVE_PDM, 1, 4); 63 + DEFINE_QNODE(qhs_prng, SDX55_SLAVE_PRNG, 1, 4); 64 + DEFINE_QNODE(qhs_qdss_cfg, SDX55_SLAVE_QDSS_CFG, 1, 4); 65 + DEFINE_QNODE(qhs_qpic, SDX55_SLAVE_QPIC, 1, 4); 66 + DEFINE_QNODE(qhs_sdc1, SDX55_SLAVE_SDCC_1, 1, 4); 67 + DEFINE_QNODE(qhs_snoc_cfg, SDX55_SLAVE_SNOC_CFG, 1, 4, SDX55_MASTER_SNOC_CFG); 68 + DEFINE_QNODE(qhs_spmi_fetcher, SDX55_SLAVE_SPMI_FETCHER, 1, 4); 69 + DEFINE_QNODE(qhs_spmi_vgi_coex, SDX55_SLAVE_SPMI_VGI_COEX, 1, 4); 70 + DEFINE_QNODE(qhs_tcsr, SDX55_SLAVE_TCSR, 1, 4); 71 + DEFINE_QNODE(qhs_tlmm, SDX55_SLAVE_TLMM, 1, 4); 72 + DEFINE_QNODE(qhs_usb3, SDX55_SLAVE_USB3, 1, 4); 73 + DEFINE_QNODE(qhs_usb3_phy, SDX55_SLAVE_USB3_PHY_CFG, 1, 4); 74 + DEFINE_QNODE(qns_aggre_noc, SDX55_SLAVE_ANOC_SNOC, 1, 8, SDX55_MASTER_ANOC_SNOC); 75 + DEFINE_QNODE(qns_snoc_memnoc, SDX55_SLAVE_SNOC_MEM_NOC_GC, 1, 8, SDX55_MASTER_SNOC_GC_MEM_NOC); 76 + DEFINE_QNODE(qxs_imem, SDX55_SLAVE_OCIMEM, 1, 8); 77 + DEFINE_QNODE(srvc_snoc, SDX55_SLAVE_SERVICE_SNOC, 1, 4); 78 + DEFINE_QNODE(xs_pcie, SDX55_SLAVE_PCIE_0, 1, 8); 79 + DEFINE_QNODE(xs_qdss_stm, SDX55_SLAVE_QDSS_STM, 1, 4); 80 + DEFINE_QNODE(xs_sys_tcu_cfg, SDX55_SLAVE_TCU, 1, 8); 81 + 82 + DEFINE_QBCM(bcm_mc0, "MC0", true, &ebi); 83 + DEFINE_QBCM(bcm_sh0, "SH0", true, &qns_llcc); 84 + DEFINE_QBCM(bcm_ce0, "CE0", false, &qxm_crypto); 85 + DEFINE_QBCM(bcm_ip0, "IP0", false, &ipa_core_slave); 86 + DEFINE_QBCM(bcm_pn0, "PN0", false, &qhm_snoc_cfg); 87 + DEFINE_QBCM(bcm_sh3, "SH3", false, &xm_apps_rdwr); 88 + DEFINE_QBCM(bcm_sh4, "SH4", false, &qns_memnoc_snoc, &qns_sys_pcie); 89 + DEFINE_QBCM(bcm_sn0, "SN0", true, &qns_snoc_memnoc); 90 + DEFINE_QBCM(bcm_sn1, "SN1", false, &qxs_imem); 91 + DEFINE_QBCM(bcm_pn1, "PN1", false, &xm_sdc1); 92 + DEFINE_QBCM(bcm_pn2, "PN2", false, &qhm_audio, &qhm_spmi_fetcher1); 93 + DEFINE_QBCM(bcm_sn3, "SN3", false, &xs_qdss_stm); 94 + DEFINE_QBCM(bcm_pn3, "PN3", false, &qhm_blsp1, &qhm_qpic); 95 + DEFINE_QBCM(bcm_sn4, "SN4", false, &xs_sys_tcu_cfg); 96 + DEFINE_QBCM(bcm_pn5, "PN5", false, &qxm_crypto); 97 + DEFINE_QBCM(bcm_sn6, "SN6", false, &xs_pcie); 98 + DEFINE_QBCM(bcm_sn7, "SN7", false, &qnm_aggre_noc, &xm_emac, &xm_emac, &xm_usb3, 99 + &qns_aggre_noc); 100 + DEFINE_QBCM(bcm_sn8, "SN8", false, &qhm_qdss_bam, &xm_qdss_etr); 101 + DEFINE_QBCM(bcm_sn9, "SN9", false, &qnm_memnoc); 102 + DEFINE_QBCM(bcm_sn10, "SN10", false, &qnm_memnoc_pcie); 103 + DEFINE_QBCM(bcm_sn11, "SN11", false, &qnm_ipa, &xm_ipa2pcie_slv); 104 + 105 + static struct qcom_icc_bcm *mc_virt_bcms[] = { 106 + &bcm_mc0, 107 + }; 108 + 109 + static struct qcom_icc_node *mc_virt_nodes[] = { 110 + [MASTER_LLCC] = &llcc_mc, 111 + [SLAVE_EBI_CH0] = &ebi, 112 + }; 113 + 114 + static const struct qcom_icc_desc sdx55_mc_virt = { 115 + .nodes = mc_virt_nodes, 116 + .num_nodes = ARRAY_SIZE(mc_virt_nodes), 117 + .bcms = mc_virt_bcms, 118 + .num_bcms = ARRAY_SIZE(mc_virt_bcms), 119 + }; 120 + 121 + static struct qcom_icc_bcm *mem_noc_bcms[] = { 122 + &bcm_sh0, 123 + &bcm_sh3, 124 + &bcm_sh4, 125 + }; 126 + 127 + static struct qcom_icc_node *mem_noc_nodes[] = { 128 + [MASTER_TCU_0] = &acm_tcu, 129 + [MASTER_SNOC_GC_MEM_NOC] = &qnm_snoc_gc, 130 + [MASTER_AMPSS_M0] = &xm_apps_rdwr, 131 + [SLAVE_LLCC] = &qns_llcc, 132 + [SLAVE_MEM_NOC_SNOC] = &qns_memnoc_snoc, 133 + [SLAVE_MEM_NOC_PCIE_SNOC] = &qns_sys_pcie, 134 + }; 135 + 136 + static const struct qcom_icc_desc sdx55_mem_noc = { 137 + .nodes = mem_noc_nodes, 138 + .num_nodes = ARRAY_SIZE(mem_noc_nodes), 139 + .bcms = mem_noc_bcms, 140 + .num_bcms = ARRAY_SIZE(mem_noc_bcms), 141 + }; 142 + 143 + static struct qcom_icc_bcm *system_noc_bcms[] = { 144 + &bcm_ce0, 145 + &bcm_pn0, 146 + &bcm_pn1, 147 + &bcm_pn2, 148 + &bcm_pn3, 149 + &bcm_pn5, 150 + &bcm_sn0, 151 + &bcm_sn1, 152 + &bcm_sn3, 153 + &bcm_sn4, 154 + &bcm_sn6, 155 + &bcm_sn7, 156 + &bcm_sn8, 157 + &bcm_sn9, 158 + &bcm_sn10, 159 + &bcm_sn11, 160 + }; 161 + 162 + static struct qcom_icc_node *system_noc_nodes[] = { 163 + [MASTER_AUDIO] = &qhm_audio, 164 + [MASTER_BLSP_1] = &qhm_blsp1, 165 + [MASTER_QDSS_BAM] = &qhm_qdss_bam, 166 + [MASTER_QPIC] = &qhm_qpic, 167 + [MASTER_SNOC_CFG] = &qhm_snoc_cfg, 168 + [MASTER_SPMI_FETCHER] = &qhm_spmi_fetcher1, 169 + [MASTER_ANOC_SNOC] = &qnm_aggre_noc, 170 + [MASTER_IPA] = &qnm_ipa, 171 + [MASTER_MEM_NOC_SNOC] = &qnm_memnoc, 172 + [MASTER_MEM_NOC_PCIE_SNOC] = &qnm_memnoc_pcie, 173 + [MASTER_CRYPTO_CORE_0] = &qxm_crypto, 174 + [MASTER_EMAC] = &xm_emac, 175 + [MASTER_IPA_PCIE] = &xm_ipa2pcie_slv, 176 + [MASTER_PCIE] = &xm_pcie, 177 + [MASTER_QDSS_ETR] = &xm_qdss_etr, 178 + [MASTER_SDCC_1] = &xm_sdc1, 179 + [MASTER_USB3] = &xm_usb3, 180 + [SLAVE_AOP] = &qhs_aop, 181 + [SLAVE_AOSS] = &qhs_aoss, 182 + [SLAVE_APPSS] = &qhs_apss, 183 + [SLAVE_AUDIO] = &qhs_audio, 184 + [SLAVE_BLSP_1] = &qhs_blsp1, 185 + [SLAVE_CLK_CTL] = &qhs_clk_ctl, 186 + [SLAVE_CRYPTO_0_CFG] = &qhs_crypto0_cfg, 187 + [SLAVE_CNOC_DDRSS] = &qhs_ddrss_cfg, 188 + [SLAVE_ECC_CFG] = &qhs_ecc_cfg, 189 + [SLAVE_EMAC_CFG] = &qhs_emac_cfg, 190 + [SLAVE_IMEM_CFG] = &qhs_imem_cfg, 191 + [SLAVE_IPA_CFG] = &qhs_ipa, 192 + [SLAVE_CNOC_MSS] = &qhs_mss_cfg, 193 + [SLAVE_PCIE_PARF] = &qhs_pcie_parf, 194 + [SLAVE_PDM] = &qhs_pdm, 195 + [SLAVE_PRNG] = &qhs_prng, 196 + [SLAVE_QDSS_CFG] = &qhs_qdss_cfg, 197 + [SLAVE_QPIC] = &qhs_qpic, 198 + [SLAVE_SDCC_1] = &qhs_sdc1, 199 + [SLAVE_SNOC_CFG] = &qhs_snoc_cfg, 200 + [SLAVE_SPMI_FETCHER] = &qhs_spmi_fetcher, 201 + [SLAVE_SPMI_VGI_COEX] = &qhs_spmi_vgi_coex, 202 + [SLAVE_TCSR] = &qhs_tcsr, 203 + [SLAVE_TLMM] = &qhs_tlmm, 204 + [SLAVE_USB3] = &qhs_usb3, 205 + [SLAVE_USB3_PHY_CFG] = &qhs_usb3_phy, 206 + [SLAVE_ANOC_SNOC] = &qns_aggre_noc, 207 + [SLAVE_SNOC_MEM_NOC_GC] = &qns_snoc_memnoc, 208 + [SLAVE_OCIMEM] = &qxs_imem, 209 + [SLAVE_SERVICE_SNOC] = &srvc_snoc, 210 + [SLAVE_PCIE_0] = &xs_pcie, 211 + [SLAVE_QDSS_STM] = &xs_qdss_stm, 212 + [SLAVE_TCU] = &xs_sys_tcu_cfg, 213 + }; 214 + 215 + static const struct qcom_icc_desc sdx55_system_noc = { 216 + .nodes = system_noc_nodes, 217 + .num_nodes = ARRAY_SIZE(system_noc_nodes), 218 + .bcms = system_noc_bcms, 219 + .num_bcms = ARRAY_SIZE(system_noc_bcms), 220 + }; 221 + 222 + static struct qcom_icc_bcm *ipa_virt_bcms[] = { 223 + &bcm_ip0, 224 + }; 225 + 226 + static struct qcom_icc_node *ipa_virt_nodes[] = { 227 + [MASTER_IPA_CORE] = &ipa_core_master, 228 + [SLAVE_IPA_CORE] = &ipa_core_slave, 229 + }; 230 + 231 + static const struct qcom_icc_desc sdx55_ipa_virt = { 232 + .nodes = ipa_virt_nodes, 233 + .num_nodes = ARRAY_SIZE(ipa_virt_nodes), 234 + .bcms = ipa_virt_bcms, 235 + .num_bcms = ARRAY_SIZE(ipa_virt_bcms), 236 + }; 237 + 238 + static int qnoc_probe(struct platform_device *pdev) 239 + { 240 + const struct qcom_icc_desc *desc; 241 + struct icc_onecell_data *data; 242 + struct icc_provider *provider; 243 + struct qcom_icc_node **qnodes; 244 + struct qcom_icc_provider *qp; 245 + struct icc_node *node; 246 + size_t num_nodes, i; 247 + int ret; 248 + 249 + desc = device_get_match_data(&pdev->dev); 250 + if (!desc) 251 + return -EINVAL; 252 + 253 + qnodes = desc->nodes; 254 + num_nodes = desc->num_nodes; 255 + 256 + qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL); 257 + if (!qp) 258 + return -ENOMEM; 259 + 260 + data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL); 261 + if (!data) 262 + return -ENOMEM; 263 + 264 + provider = &qp->provider; 265 + provider->dev = &pdev->dev; 266 + provider->set = qcom_icc_set; 267 + provider->pre_aggregate = qcom_icc_pre_aggregate; 268 + provider->aggregate = qcom_icc_aggregate; 269 + provider->xlate = of_icc_xlate_onecell; 270 + INIT_LIST_HEAD(&provider->nodes); 271 + provider->data = data; 272 + 273 + qp->dev = &pdev->dev; 274 + qp->bcms = desc->bcms; 275 + qp->num_bcms = desc->num_bcms; 276 + 277 + qp->voter = of_bcm_voter_get(qp->dev, NULL); 278 + if (IS_ERR(qp->voter)) 279 + return PTR_ERR(qp->voter); 280 + 281 + ret = icc_provider_add(provider); 282 + if (ret) { 283 + dev_err(&pdev->dev, "error adding interconnect provider\n"); 284 + return ret; 285 + } 286 + 287 + for (i = 0; i < qp->num_bcms; i++) 288 + qcom_icc_bcm_init(qp->bcms[i], &pdev->dev); 289 + 290 + for (i = 0; i < num_nodes; i++) { 291 + size_t j; 292 + 293 + if (!qnodes[i]) 294 + continue; 295 + 296 + node = icc_node_create(qnodes[i]->id); 297 + if (IS_ERR(node)) { 298 + ret = PTR_ERR(node); 299 + goto err; 300 + } 301 + 302 + node->name = qnodes[i]->name; 303 + node->data = qnodes[i]; 304 + icc_node_add(node, provider); 305 + 306 + for (j = 0; j < qnodes[i]->num_links; j++) 307 + icc_link_create(node, qnodes[i]->links[j]); 308 + 309 + data->nodes[i] = node; 310 + } 311 + data->num_nodes = num_nodes; 312 + 313 + platform_set_drvdata(pdev, qp); 314 + 315 + return 0; 316 + err: 317 + icc_nodes_remove(provider); 318 + icc_provider_del(provider); 319 + return ret; 320 + } 321 + 322 + static int qnoc_remove(struct platform_device *pdev) 323 + { 324 + struct qcom_icc_provider *qp = platform_get_drvdata(pdev); 325 + 326 + icc_nodes_remove(&qp->provider); 327 + return icc_provider_del(&qp->provider); 328 + } 329 + 330 + static const struct of_device_id qnoc_of_match[] = { 331 + { .compatible = "qcom,sdx55-mc-virt", 332 + .data = &sdx55_mc_virt}, 333 + { .compatible = "qcom,sdx55-mem-noc", 334 + .data = &sdx55_mem_noc}, 335 + { .compatible = "qcom,sdx55-system-noc", 336 + .data = &sdx55_system_noc}, 337 + { .compatible = "qcom,sdx55-ipa-virt", 338 + .data = &sdx55_ipa_virt}, 339 + { } 340 + }; 341 + MODULE_DEVICE_TABLE(of, qnoc_of_match); 342 + 343 + static struct platform_driver qnoc_driver = { 344 + .probe = qnoc_probe, 345 + .remove = qnoc_remove, 346 + .driver = { 347 + .name = "qnoc-sdx55", 348 + .of_match_table = qnoc_of_match, 349 + .sync_state = icc_sync_state, 350 + }, 351 + }; 352 + module_platform_driver(qnoc_driver); 353 + 354 + MODULE_DESCRIPTION("Qualcomm SDX55 NoC driver"); 355 + MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>"); 356 + MODULE_LICENSE("GPL v2");
+70
drivers/interconnect/qcom/sdx55.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2021, Linaro Ltd. 4 + */ 5 + 6 + #ifndef __DRIVERS_INTERCONNECT_QCOM_SDX55_H 7 + #define __DRIVERS_INTERCONNECT_QCOM_SDX55_H 8 + 9 + #define SDX55_MASTER_IPA_CORE 0 10 + #define SDX55_MASTER_LLCC 1 11 + #define SDX55_MASTER_TCU_0 2 12 + #define SDX55_MASTER_SNOC_GC_MEM_NOC 3 13 + #define SDX55_MASTER_AMPSS_M0 4 14 + #define SDX55_MASTER_AUDIO 5 15 + #define SDX55_MASTER_BLSP_1 6 16 + #define SDX55_MASTER_QDSS_BAM 7 17 + #define SDX55_MASTER_QPIC 8 18 + #define SDX55_MASTER_SNOC_CFG 9 19 + #define SDX55_MASTER_SPMI_FETCHER 10 20 + #define SDX55_MASTER_ANOC_SNOC 11 21 + #define SDX55_MASTER_IPA 12 22 + #define SDX55_MASTER_MEM_NOC_SNOC 13 23 + #define SDX55_MASTER_MEM_NOC_PCIE_SNOC 14 24 + #define SDX55_MASTER_CRYPTO_CORE_0 15 25 + #define SDX55_MASTER_EMAC 16 26 + #define SDX55_MASTER_IPA_PCIE 17 27 + #define SDX55_MASTER_PCIE 18 28 + #define SDX55_MASTER_QDSS_ETR 19 29 + #define SDX55_MASTER_SDCC_1 20 30 + #define SDX55_MASTER_USB3 21 31 + #define SDX55_SLAVE_IPA_CORE 22 32 + #define SDX55_SLAVE_EBI_CH0 23 33 + #define SDX55_SLAVE_LLCC 24 34 + #define SDX55_SLAVE_MEM_NOC_SNOC 25 35 + #define SDX55_SLAVE_MEM_NOC_PCIE_SNOC 26 36 + #define SDX55_SLAVE_ANOC_SNOC 27 37 + #define SDX55_SLAVE_SNOC_CFG 28 38 + #define SDX55_SLAVE_EMAC_CFG 29 39 + #define SDX55_SLAVE_USB3 30 40 + #define SDX55_SLAVE_TLMM 31 41 + #define SDX55_SLAVE_SPMI_FETCHER 32 42 + #define SDX55_SLAVE_QDSS_CFG 33 43 + #define SDX55_SLAVE_PDM 34 44 + #define SDX55_SLAVE_SNOC_MEM_NOC_GC 35 45 + #define SDX55_SLAVE_TCSR 36 46 + #define SDX55_SLAVE_CNOC_DDRSS 37 47 + #define SDX55_SLAVE_SPMI_VGI_COEX 38 48 + #define SDX55_SLAVE_QPIC 39 49 + #define SDX55_SLAVE_OCIMEM 40 50 + #define SDX55_SLAVE_IPA_CFG 41 51 + #define SDX55_SLAVE_USB3_PHY_CFG 42 52 + #define SDX55_SLAVE_AOP 43 53 + #define SDX55_SLAVE_BLSP_1 44 54 + #define SDX55_SLAVE_SDCC_1 45 55 + #define SDX55_SLAVE_CNOC_MSS 46 56 + #define SDX55_SLAVE_PCIE_PARF 47 57 + #define SDX55_SLAVE_ECC_CFG 48 58 + #define SDX55_SLAVE_AUDIO 49 59 + #define SDX55_SLAVE_AOSS 51 60 + #define SDX55_SLAVE_PRNG 52 61 + #define SDX55_SLAVE_CRYPTO_0_CFG 53 62 + #define SDX55_SLAVE_TCU 54 63 + #define SDX55_SLAVE_CLK_CTL 55 64 + #define SDX55_SLAVE_IMEM_CFG 56 65 + #define SDX55_SLAVE_SERVICE_SNOC 57 66 + #define SDX55_SLAVE_PCIE_0 58 67 + #define SDX55_SLAVE_QDSS_STM 59 68 + #define SDX55_SLAVE_APPSS 60 69 + 70 + #endif
+105
include/dt-bindings/interconnect/qcom,msm8939.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Qualcomm interconnect IDs 4 + * 5 + * Copyright (c) 2020, Linaro Ltd. 6 + * Author: Jun Nie <jun.nie@linaro.org> 7 + */ 8 + 9 + #ifndef __DT_BINDINGS_INTERCONNECT_QCOM_MSM8939_H 10 + #define __DT_BINDINGS_INTERCONNECT_QCOM_MSM8939_H 11 + 12 + #define BIMC_SNOC_SLV 0 13 + #define MASTER_QDSS_BAM 1 14 + #define MASTER_QDSS_ETR 2 15 + #define MASTER_SNOC_CFG 3 16 + #define PCNOC_SNOC_SLV 4 17 + #define SLAVE_APSS 5 18 + #define SLAVE_CATS_128 6 19 + #define SLAVE_OCMEM_64 7 20 + #define SLAVE_IMEM 8 21 + #define SLAVE_QDSS_STM 9 22 + #define SLAVE_SRVC_SNOC 10 23 + #define SNOC_BIMC_0_MAS 11 24 + #define SNOC_BIMC_1_MAS 12 25 + #define SNOC_BIMC_2_MAS 13 26 + #define SNOC_INT_0 14 27 + #define SNOC_INT_1 15 28 + #define SNOC_INT_BIMC 16 29 + #define SNOC_PCNOC_MAS 17 30 + #define SNOC_QDSS_INT 18 31 + 32 + #define MASTER_VIDEO_P0 0 33 + #define MASTER_JPEG 1 34 + #define MASTER_VFE 2 35 + #define MASTER_MDP_PORT0 3 36 + #define MASTER_MDP_PORT1 4 37 + #define MASTER_CPP 5 38 + #define SNOC_MM_INT_0 6 39 + #define SNOC_MM_INT_1 7 40 + #define SNOC_MM_INT_2 8 41 + 42 + #define BIMC_SNOC_MAS 0 43 + #define MASTER_AMPSS_M0 1 44 + #define MASTER_GRAPHICS_3D 2 45 + #define MASTER_TCU0 3 46 + #define SLAVE_AMPSS_L2 4 47 + #define SLAVE_EBI_CH0 5 48 + #define SNOC_BIMC_0_SLV 6 49 + #define SNOC_BIMC_1_SLV 7 50 + #define SNOC_BIMC_2_SLV 8 51 + 52 + #define MASTER_BLSP_1 0 53 + #define MASTER_DEHR 1 54 + #define MASTER_LPASS 2 55 + #define MASTER_CRYPTO_CORE0 3 56 + #define MASTER_SDCC_1 4 57 + #define MASTER_SDCC_2 5 58 + #define MASTER_SPDM 6 59 + #define MASTER_USB_HS1 7 60 + #define MASTER_USB_HS2 8 61 + #define PCNOC_INT_0 9 62 + #define PCNOC_INT_1 10 63 + #define PCNOC_MAS_0 11 64 + #define PCNOC_MAS_1 12 65 + #define PCNOC_SLV_0 13 66 + #define PCNOC_SLV_1 14 67 + #define PCNOC_SLV_2 15 68 + #define PCNOC_SLV_3 16 69 + #define PCNOC_SLV_4 17 70 + #define PCNOC_SLV_8 18 71 + #define PCNOC_SLV_9 19 72 + #define PCNOC_SNOC_MAS 20 73 + #define SLAVE_BIMC_CFG 21 74 + #define SLAVE_BLSP_1 22 75 + #define SLAVE_BOOT_ROM 23 76 + #define SLAVE_CAMERA_CFG 24 77 + #define SLAVE_CLK_CTL 25 78 + #define SLAVE_CRYPTO_0_CFG 26 79 + #define SLAVE_DEHR_CFG 27 80 + #define SLAVE_DISPLAY_CFG 28 81 + #define SLAVE_GRAPHICS_3D_CFG 29 82 + #define SLAVE_IMEM_CFG 30 83 + #define SLAVE_LPASS 31 84 + #define SLAVE_MPM 32 85 + #define SLAVE_MSG_RAM 33 86 + #define SLAVE_MSS 34 87 + #define SLAVE_PDM 35 88 + #define SLAVE_PMIC_ARB 36 89 + #define SLAVE_PCNOC_CFG 37 90 + #define SLAVE_PRNG 38 91 + #define SLAVE_QDSS_CFG 39 92 + #define SLAVE_RBCPR_CFG 40 93 + #define SLAVE_SDCC_1 41 94 + #define SLAVE_SDCC_2 42 95 + #define SLAVE_SECURITY 43 96 + #define SLAVE_SNOC_CFG 44 97 + #define SLAVE_SPDM 45 98 + #define SLAVE_TCSR 46 99 + #define SLAVE_TLMM 47 100 + #define SLAVE_USB_HS1 48 101 + #define SLAVE_USB_HS2 49 102 + #define SLAVE_VENUS_CFG 50 103 + #define SNOC_PCNOC_SLV 51 104 + 105 + #endif
+76
include/dt-bindings/interconnect/qcom,sdx55.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Qualcomm SDX55 interconnect IDs 4 + * 5 + * Copyright (c) 2021, Linaro Ltd. 6 + * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 7 + */ 8 + 9 + #ifndef __DT_BINDINGS_INTERCONNECT_QCOM_SDX55_H 10 + #define __DT_BINDINGS_INTERCONNECT_QCOM_SDX55_H 11 + 12 + #define MASTER_LLCC 0 13 + #define SLAVE_EBI_CH0 1 14 + 15 + #define MASTER_TCU_0 0 16 + #define MASTER_SNOC_GC_MEM_NOC 1 17 + #define MASTER_AMPSS_M0 2 18 + #define SLAVE_LLCC 3 19 + #define SLAVE_MEM_NOC_SNOC 4 20 + #define SLAVE_MEM_NOC_PCIE_SNOC 5 21 + 22 + #define MASTER_AUDIO 0 23 + #define MASTER_BLSP_1 1 24 + #define MASTER_QDSS_BAM 2 25 + #define MASTER_QPIC 3 26 + #define MASTER_SNOC_CFG 4 27 + #define MASTER_SPMI_FETCHER 5 28 + #define MASTER_ANOC_SNOC 6 29 + #define MASTER_IPA 7 30 + #define MASTER_MEM_NOC_SNOC 8 31 + #define MASTER_MEM_NOC_PCIE_SNOC 9 32 + #define MASTER_CRYPTO_CORE_0 10 33 + #define MASTER_EMAC 11 34 + #define MASTER_IPA_PCIE 12 35 + #define MASTER_PCIE 13 36 + #define MASTER_QDSS_ETR 14 37 + #define MASTER_SDCC_1 15 38 + #define MASTER_USB3 16 39 + #define SLAVE_AOP 17 40 + #define SLAVE_AOSS 18 41 + #define SLAVE_APPSS 19 42 + #define SLAVE_AUDIO 20 43 + #define SLAVE_BLSP_1 21 44 + #define SLAVE_CLK_CTL 22 45 + #define SLAVE_CRYPTO_0_CFG 23 46 + #define SLAVE_CNOC_DDRSS 24 47 + #define SLAVE_ECC_CFG 25 48 + #define SLAVE_EMAC_CFG 26 49 + #define SLAVE_IMEM_CFG 27 50 + #define SLAVE_IPA_CFG 28 51 + #define SLAVE_CNOC_MSS 29 52 + #define SLAVE_PCIE_PARF 30 53 + #define SLAVE_PDM 31 54 + #define SLAVE_PRNG 32 55 + #define SLAVE_QDSS_CFG 33 56 + #define SLAVE_QPIC 34 57 + #define SLAVE_SDCC_1 35 58 + #define SLAVE_SNOC_CFG 36 59 + #define SLAVE_SPMI_FETCHER 37 60 + #define SLAVE_SPMI_VGI_COEX 38 61 + #define SLAVE_TCSR 39 62 + #define SLAVE_TLMM 40 63 + #define SLAVE_USB3 41 64 + #define SLAVE_USB3_PHY_CFG 42 65 + #define SLAVE_ANOC_SNOC 43 66 + #define SLAVE_SNOC_MEM_NOC_GC 44 67 + #define SLAVE_OCIMEM 45 68 + #define SLAVE_SERVICE_SNOC 46 69 + #define SLAVE_PCIE_0 47 70 + #define SLAVE_QDSS_STM 48 71 + #define SLAVE_TCU 49 72 + 73 + #define MASTER_IPA_CORE 0 74 + #define SLAVE_IPA_CORE 1 75 + 76 + #endif