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

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

Georgi writes:

interconnect changes for 5.20

Here are the interconnect changes for the 5.20-rc1 merge window consisting
of two new drivers, misc driver improvements and new device managed API.

Core change:
- Add device managed bulk API

Driver changes:
- New driver for NXP i.MX8MP platforms
- New driver for Qualcomm SM6350 platforms
- Multiple bucket support for Qualcomm RPM-based drivers.

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

* tag 'icc-5.20-rc1-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc:
PM / devfreq: imx: Register i.MX8MP interconnect device
interconnect: imx: Add platform driver for imx8mp
interconnect: imx: configure NoC mode/prioriry/ext_control
interconnect: imx: introduce imx_icc_provider
interconnect: imx: set src node
interconnect: imx: fix max_node_id
interconnect: qcom: icc-rpm: Set bandwidth and clock for bucket values
interconnect: qcom: icc-rpm: Support multiple buckets
interconnect: qcom: icc-rpm: Change to use qcom_icc_xlate_extended()
interconnect: qcom: Move qcom_icc_xlate_extended() to a common file
dt-bindings: interconnect: Update property for icc-rpm path tag
interconnect: icc-rpm: Set destination bandwidth as well as source bandwidth
interconnect: qcom: msm8939: Use icc_sync_state
interconnect: add device managed bulk API
dt-bindings: interconnect: add fsl,imx8mp.h
dt-bindings: interconnect: imx8m: Add bindings for imx8mp noc
interconnect: qcom: Add SM6350 driver support
dt-bindings: interconnect: Add Qualcomm SM6350 NoC support
dt-bindings: interconnect: qcom: Split out rpmh-common bindings
interconnect: qcom: icc-rpmh: Support child NoC device probe

+1629 -95
+4 -2
Documentation/devicetree/bindings/interconnect/fsl,imx8m-noc.yaml
··· 26 26 oneOf: 27 27 - items: 28 28 - enum: 29 - - fsl,imx8mn-nic 30 29 - fsl,imx8mm-nic 30 + - fsl,imx8mn-nic 31 + - fsl,imx8mp-nic 31 32 - fsl,imx8mq-nic 32 33 - const: fsl,imx8m-nic 33 34 - items: 34 35 - enum: 35 - - fsl,imx8mn-noc 36 36 - fsl,imx8mm-noc 37 + - fsl,imx8mn-noc 38 + - fsl,imx8mp-noc 37 39 - fsl,imx8mq-noc 38 40 - const: fsl,imx8m-noc 39 41 - const: fsl,imx8m-nic
+5 -1
Documentation/devicetree/bindings/interconnect/qcom,rpm.yaml
··· 45 45 - qcom,sdm660-snoc 46 46 47 47 '#interconnect-cells': 48 - const: 1 48 + description: | 49 + Value: <1> is one cell in an interconnect specifier for the 50 + interconnect node id, <2> requires the interconnect node id and an 51 + extra path tag. 52 + enum: [ 1, 2 ] 49 53 50 54 clocks: 51 55 minItems: 2
+43
Documentation/devicetree/bindings/interconnect/qcom,rpmh-common.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,rpmh-common.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm RPMh Network-On-Chip Interconnect 8 + 9 + maintainers: 10 + - Georgi Djakov <djakov@kernel.org> 11 + - Bjorn Andersson <bjorn.andersson@linaro.org> 12 + 13 + description: 14 + RPMh interconnect providers support system bandwidth requirements through 15 + RPMh hardware accelerators known as Bus Clock Manager (BCM). The provider is 16 + able to communicate with the BCM through the Resource State Coordinator (RSC) 17 + associated with each execution environment. Provider nodes must point to at 18 + least one RPMh device child node pertaining to their RSC and each provider 19 + can map to multiple RPMh resources. 20 + 21 + properties: 22 + '#interconnect-cells': 23 + enum: [ 1, 2 ] 24 + 25 + qcom,bcm-voters: 26 + $ref: /schemas/types.yaml#/definitions/phandle-array 27 + items: 28 + maxItems: 1 29 + maxItems: 2 30 + description: 31 + List of phandles to qcom,bcm-voter nodes that are required by 32 + this interconnect to send RPMh commands. 33 + 34 + qcom,bcm-voter-names: 35 + maxItems: 2 36 + description: 37 + Names for each of the qcom,bcm-voters specified. 38 + 39 + required: 40 + - '#interconnect-cells' 41 + - qcom,bcm-voters 42 + 43 + additionalProperties: true
+5 -17
Documentation/devicetree/bindings/interconnect/qcom,rpmh.yaml
··· 18 18 least one RPMh device child node pertaining to their RSC and each provider 19 19 can map to multiple RPMh resources. 20 20 21 + allOf: 22 + - $ref: qcom,rpmh-common.yaml# 23 + 21 24 properties: 22 25 reg: 23 26 maxItems: 1 ··· 133 130 - qcom,sm8450-pcie-anoc 134 131 - qcom,sm8450-system-noc 135 132 136 - '#interconnect-cells': 137 - enum: [ 1, 2 ] 138 - 139 - qcom,bcm-voters: 140 - $ref: /schemas/types.yaml#/definitions/phandle-array 141 - items: 142 - maxItems: 1 143 - description: | 144 - List of phandles to qcom,bcm-voter nodes that are required by 145 - this interconnect to send RPMh commands. 146 - 147 - qcom,bcm-voter-names: 148 - description: | 149 - Names for each of the qcom,bcm-voters specified. 133 + '#interconnect-cells': true 150 134 151 135 required: 152 136 - compatible 153 137 - reg 154 - - '#interconnect-cells' 155 - - qcom,bcm-voters 156 138 157 - additionalProperties: false 139 + unevaluatedProperties: false 158 140 159 141 examples: 160 142 - |
+82
Documentation/devicetree/bindings/interconnect/qcom,sm6350-rpmh.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,sm6350-rpmh.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SM6350 RPMh Network-On-Chip Interconnect 8 + 9 + maintainers: 10 + - Luca Weiss <luca.weiss@fairphone.com> 11 + 12 + description: 13 + Qualcomm RPMh-based interconnect provider on SM6350. 14 + 15 + allOf: 16 + - $ref: qcom,rpmh-common.yaml# 17 + 18 + properties: 19 + compatible: 20 + enum: 21 + - qcom,sm6350-aggre1-noc 22 + - qcom,sm6350-aggre2-noc 23 + - qcom,sm6350-config-noc 24 + - qcom,sm6350-dc-noc 25 + - qcom,sm6350-gem-noc 26 + - qcom,sm6350-mmss-noc 27 + - qcom,sm6350-npu-noc 28 + - qcom,sm6350-system-noc 29 + 30 + reg: 31 + maxItems: 1 32 + 33 + '#interconnect-cells': true 34 + 35 + patternProperties: 36 + '^interconnect-[a-z0-9\-]+$': 37 + type: object 38 + description: 39 + The interconnect providers do not have a separate QoS register space, 40 + but share parent's space. 41 + $ref: qcom,rpmh-common.yaml# 42 + 43 + properties: 44 + compatible: 45 + enum: 46 + - qcom,sm6350-clk-virt 47 + - qcom,sm6350-compute-noc 48 + 49 + '#interconnect-cells': true 50 + 51 + required: 52 + - compatible 53 + 54 + unevaluatedProperties: false 55 + 56 + required: 57 + - compatible 58 + - reg 59 + 60 + unevaluatedProperties: false 61 + 62 + examples: 63 + - | 64 + config_noc: interconnect@1500000 { 65 + compatible = "qcom,sm6350-config-noc"; 66 + reg = <0x01500000 0x28000>; 67 + #interconnect-cells = <2>; 68 + qcom,bcm-voters = <&apps_bcm_voter>; 69 + }; 70 + 71 + system_noc: interconnect@1620000 { 72 + compatible = "qcom,sm6350-system-noc"; 73 + reg = <0x01620000 0x17080>; 74 + #interconnect-cells = <2>; 75 + qcom,bcm-voters = <&apps_bcm_voter>; 76 + 77 + clk_virt: interconnect-clk-virt { 78 + compatible = "qcom,sm6350-clk-virt"; 79 + #interconnect-cells = <2>; 80 + qcom,bcm-voters = <&apps_bcm_voter>; 81 + }; 82 + };
+1
drivers/devfreq/imx-bus.c
··· 145 145 { .compatible = "fsl,imx8mq-noc", .data = "imx8mq-interconnect", }, 146 146 { .compatible = "fsl,imx8mm-noc", .data = "imx8mm-interconnect", }, 147 147 { .compatible = "fsl,imx8mn-noc", .data = "imx8mn-interconnect", }, 148 + { .compatible = "fsl,imx8mp-noc", .data = "imx8mp-interconnect", }, 148 149 { .compatible = "fsl,imx8m-noc", }, 149 150 { .compatible = "fsl,imx8m-nic", }, 150 151 { /* sentinel */ },
+42
drivers/interconnect/bulk.c
··· 115 115 icc_disable(paths[num_paths].path); 116 116 } 117 117 EXPORT_SYMBOL_GPL(icc_bulk_disable); 118 + 119 + struct icc_bulk_devres { 120 + struct icc_bulk_data *paths; 121 + int num_paths; 122 + }; 123 + 124 + static void devm_icc_bulk_release(struct device *dev, void *res) 125 + { 126 + struct icc_bulk_devres *devres = res; 127 + 128 + icc_bulk_put(devres->num_paths, devres->paths); 129 + } 130 + 131 + /** 132 + * devm_of_icc_bulk_get() - resource managed of_icc_bulk_get 133 + * @dev: the device requesting the path 134 + * @num_paths: the number of icc_bulk_data 135 + * @paths: the table with the paths we want to get 136 + * 137 + * Returns 0 on success or negative errno otherwise. 138 + */ 139 + int devm_of_icc_bulk_get(struct device *dev, int num_paths, struct icc_bulk_data *paths) 140 + { 141 + struct icc_bulk_devres *devres; 142 + int ret; 143 + 144 + devres = devres_alloc(devm_icc_bulk_release, sizeof(*devres), GFP_KERNEL); 145 + if (!devres) 146 + return -ENOMEM; 147 + 148 + ret = of_icc_bulk_get(dev, num_paths, paths); 149 + if (!ret) { 150 + devres->paths = paths; 151 + devres->num_paths = num_paths; 152 + devres_add(dev, devres); 153 + } else { 154 + devres_free(devres); 155 + } 156 + 157 + return ret; 158 + } 159 + EXPORT_SYMBOL_GPL(devm_of_icc_bulk_get);
+4
drivers/interconnect/imx/Kconfig
··· 15 15 config INTERCONNECT_IMX8MQ 16 16 tristate "i.MX8MQ interconnect driver" 17 17 depends on INTERCONNECT_IMX 18 + 19 + config INTERCONNECT_IMX8MP 20 + tristate "i.MX8MP interconnect driver" 21 + depends on INTERCONNECT_IMX
+2
drivers/interconnect/imx/Makefile
··· 2 2 imx8mm-interconnect-objs := imx8mm.o 3 3 imx8mq-interconnect-objs := imx8mq.o 4 4 imx8mn-interconnect-objs := imx8mn.o 5 + imx8mp-interconnect-objs := imx8mp.o 5 6 6 7 obj-$(CONFIG_INTERCONNECT_IMX) += imx-interconnect.o 7 8 obj-$(CONFIG_INTERCONNECT_IMX8MM) += imx8mm-interconnect.o 8 9 obj-$(CONFIG_INTERCONNECT_IMX8MQ) += imx8mq-interconnect.o 9 10 obj-$(CONFIG_INTERCONNECT_IMX8MN) += imx8mn-interconnect.o 11 + obj-$(CONFIG_INTERCONNECT_IMX8MP) += imx8mp-interconnect.o
+67 -17
drivers/interconnect/imx/imx.c
··· 10 10 11 11 #include <linux/device.h> 12 12 #include <linux/interconnect-provider.h> 13 + #include <linux/io.h> 13 14 #include <linux/module.h> 14 15 #include <linux/of.h> 15 16 #include <linux/of_platform.h> ··· 22 21 /* private icc_node data */ 23 22 struct imx_icc_node { 24 23 const struct imx_icc_node_desc *desc; 24 + const struct imx_icc_noc_setting *setting; 25 25 struct device *qos_dev; 26 26 struct dev_pm_qos_request qos_req; 27 + struct imx_icc_provider *imx_provider; 27 28 }; 28 29 29 30 static int imx_icc_get_bw(struct icc_node *node, u32 *avg, u32 *peak) ··· 40 37 { 41 38 struct device *dev = node->provider->dev; 42 39 struct imx_icc_node *node_data = node->data; 40 + void __iomem *base; 41 + u32 prio; 43 42 u64 freq; 43 + 44 + if (node_data->setting && node->peak_bw) { 45 + base = node_data->setting->reg + node_data->imx_provider->noc_base; 46 + if (node_data->setting->mode == IMX_NOC_MODE_FIXED) { 47 + prio = node_data->setting->prio_level; 48 + prio = PRIORITY_COMP_MARK | (prio << 8) | prio; 49 + writel(prio, base + IMX_NOC_PRIO_REG); 50 + writel(node_data->setting->mode, base + IMX_NOC_MODE_REG); 51 + writel(node_data->setting->ext_control, base + IMX_NOC_EXT_CTL_REG); 52 + dev_dbg(dev, "%s: mode: 0x%x, prio: 0x%x, ext_control: 0x%x\n", 53 + node_data->desc->name, node_data->setting->mode, prio, 54 + node_data->setting->ext_control); 55 + } else if (node_data->setting->mode == IMX_NOC_MODE_UNCONFIGURED) { 56 + dev_dbg(dev, "%s: mode not unconfigured\n", node_data->desc->name); 57 + } else { 58 + dev_info(dev, "%s: mode: %d not supported\n", 59 + node_data->desc->name, node_data->setting->mode); 60 + return -EOPNOTSUPP; 61 + } 62 + } 44 63 45 64 if (!node_data->qos_dev) 46 65 return 0; ··· 86 61 87 62 static int imx_icc_set(struct icc_node *src, struct icc_node *dst) 88 63 { 64 + int ret; 65 + 66 + ret = imx_icc_node_set(src); 67 + if (ret) 68 + return ret; 69 + 89 70 return imx_icc_node_set(dst); 90 71 } 91 72 ··· 159 128 DEV_PM_QOS_MIN_FREQUENCY, 0); 160 129 } 161 130 162 - static struct icc_node *imx_icc_node_add(struct icc_provider *provider, 163 - const struct imx_icc_node_desc *node_desc) 131 + static struct icc_node *imx_icc_node_add(struct imx_icc_provider *imx_provider, 132 + const struct imx_icc_node_desc *node_desc, 133 + const struct imx_icc_noc_setting *setting) 164 134 { 135 + struct icc_provider *provider = &imx_provider->provider; 165 136 struct device *dev = provider->dev; 166 137 struct imx_icc_node *node_data; 167 138 struct icc_node *node; ··· 190 157 node->name = node_desc->name; 191 158 node->data = node_data; 192 159 node_data->desc = node_desc; 160 + node_data->setting = setting; 161 + node_data->imx_provider = imx_provider; 193 162 icc_node_add(node, provider); 194 163 195 164 if (node_desc->adj) { ··· 213 178 imx_icc_node_destroy(node); 214 179 } 215 180 216 - static int imx_icc_register_nodes(struct icc_provider *provider, 181 + static int imx_icc_register_nodes(struct imx_icc_provider *imx_provider, 217 182 const struct imx_icc_node_desc *descs, 218 - int count) 183 + int count, 184 + const struct imx_icc_noc_setting *settings) 219 185 { 186 + struct icc_provider *provider = &imx_provider->provider; 220 187 struct icc_onecell_data *provider_data = provider->data; 221 188 int ret; 222 189 int i; ··· 228 191 const struct imx_icc_node_desc *node_desc = &descs[i]; 229 192 size_t j; 230 193 231 - node = imx_icc_node_add(provider, node_desc); 194 + node = imx_icc_node_add(imx_provider, node_desc, 195 + settings ? &settings[node_desc->id] : NULL); 232 196 if (IS_ERR(node)) { 233 197 ret = dev_err_probe(provider->dev, PTR_ERR(node), 234 198 "failed to add %s\n", node_desc->name); ··· 267 229 } 268 230 269 231 int imx_icc_register(struct platform_device *pdev, 270 - struct imx_icc_node_desc *nodes, int nodes_count) 232 + struct imx_icc_node_desc *nodes, int nodes_count, 233 + struct imx_icc_noc_setting *settings) 271 234 { 272 235 struct device *dev = &pdev->dev; 273 236 struct icc_onecell_data *data; 237 + struct imx_icc_provider *imx_provider; 274 238 struct icc_provider *provider; 275 - int max_node_id; 239 + int num_nodes; 276 240 int ret; 277 241 278 242 /* icc_onecell_data is indexed by node_id, unlike nodes param */ 279 - max_node_id = get_max_node_id(nodes, nodes_count); 280 - data = devm_kzalloc(dev, struct_size(data, nodes, max_node_id), 243 + num_nodes = get_max_node_id(nodes, nodes_count) + 1; 244 + data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), 281 245 GFP_KERNEL); 282 246 if (!data) 283 247 return -ENOMEM; 284 - data->num_nodes = max_node_id; 248 + data->num_nodes = num_nodes; 285 249 286 - provider = devm_kzalloc(dev, sizeof(*provider), GFP_KERNEL); 287 - if (!provider) 250 + imx_provider = devm_kzalloc(dev, sizeof(*imx_provider), GFP_KERNEL); 251 + if (!imx_provider) 288 252 return -ENOMEM; 253 + provider = &imx_provider->provider; 289 254 provider->set = imx_icc_set; 290 255 provider->get_bw = imx_icc_get_bw; 291 256 provider->aggregate = icc_std_aggregate; 292 257 provider->xlate = of_icc_xlate_onecell; 293 258 provider->data = data; 294 259 provider->dev = dev->parent; 295 - platform_set_drvdata(pdev, provider); 260 + platform_set_drvdata(pdev, imx_provider); 261 + 262 + if (settings) { 263 + imx_provider->noc_base = devm_of_iomap(dev, provider->dev->of_node, 0, NULL); 264 + if (IS_ERR(imx_provider->noc_base)) { 265 + ret = PTR_ERR(imx_provider->noc_base); 266 + dev_err(dev, "Error mapping NoC: %d\n", ret); 267 + return ret; 268 + } 269 + } 296 270 297 271 ret = icc_provider_add(provider); 298 272 if (ret) { ··· 312 262 return ret; 313 263 } 314 264 315 - ret = imx_icc_register_nodes(provider, nodes, nodes_count); 265 + ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); 316 266 if (ret) 317 267 goto provider_del; 318 268 ··· 326 276 327 277 int imx_icc_unregister(struct platform_device *pdev) 328 278 { 329 - struct icc_provider *provider = platform_get_drvdata(pdev); 279 + struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev); 330 280 331 - imx_icc_unregister_nodes(provider); 281 + imx_icc_unregister_nodes(&imx_provider->provider); 332 282 333 - return icc_provider_del(provider); 283 + return icc_provider_del(&imx_provider->provider); 334 284 } 335 285 EXPORT_SYMBOL_GPL(imx_icc_unregister); 336 286
+48 -1
drivers/interconnect/imx/imx.h
··· 10 10 #ifndef __DRIVERS_INTERCONNECT_IMX_H 11 11 #define __DRIVERS_INTERCONNECT_IMX_H 12 12 13 + #include <linux/interconnect-provider.h> 13 14 #include <linux/kernel.h> 14 15 15 16 #define IMX_ICC_MAX_LINKS 4 17 + 18 + /* 19 + * High throughput priority level in Regulator mode 20 + * Read Priority in Fixed/Limiter mode 21 + */ 22 + #define PRIORITY0_SHIFT 0 23 + /* 24 + * Low throughput priority level in Regulator mode 25 + * Write Priority in Fixed/Limiter mode 26 + */ 27 + #define PRIORITY1_SHIFT 8 28 + #define PRIORITY_MASK 0x7 29 + 30 + #define PRIORITY_COMP_MARK BIT(31) /* Must set */ 31 + 32 + #define IMX_NOC_MODE_FIXED 0 33 + #define IMX_NOC_MODE_LIMITER 1 34 + #define IMX_NOC_MODE_BYPASS 2 35 + #define IMX_NOC_MODE_REGULATOR 3 36 + #define IMX_NOC_MODE_UNCONFIGURED 0xFF 37 + 38 + #define IMX_NOC_PRIO_REG 0x8 39 + #define IMX_NOC_MODE_REG 0xC 40 + #define IMX_NOC_BANDWIDTH_REG 0x10 41 + #define IMX_NOC_SATURATION 0x14 42 + #define IMX_NOC_EXT_CTL_REG 0x18 43 + 44 + struct imx_icc_provider { 45 + void __iomem *noc_base; 46 + struct icc_provider provider; 47 + }; 16 48 17 49 /* 18 50 * struct imx_icc_node_adj - Describe a dynamic adjustable node ··· 70 38 const struct imx_icc_node_adj_desc *adj; 71 39 }; 72 40 41 + /* 42 + * struct imx_icc_noc_setting - Describe an interconnect node setting 43 + * @reg: register offset inside the NoC 44 + * @prio_level: priority level 45 + * @mode: functional mode 46 + * @ext_control: external input control 47 + */ 48 + struct imx_icc_noc_setting { 49 + u32 reg; 50 + u32 prio_level; 51 + u32 mode; 52 + u32 ext_control; 53 + }; 54 + 73 55 #define DEFINE_BUS_INTERCONNECT(_name, _id, _adj, ...) \ 74 56 { \ 75 57 .id = _id, \ ··· 101 55 102 56 int imx_icc_register(struct platform_device *pdev, 103 57 struct imx_icc_node_desc *nodes, 104 - int nodes_count); 58 + int nodes_count, 59 + struct imx_icc_noc_setting *noc_settings); 105 60 int imx_icc_unregister(struct platform_device *pdev); 106 61 107 62 #endif /* __DRIVERS_INTERCONNECT_IMX_H */
+1 -1
drivers/interconnect/imx/imx8mm.c
··· 83 83 84 84 static int imx8mm_icc_probe(struct platform_device *pdev) 85 85 { 86 - return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes)); 86 + return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL); 87 87 } 88 88 89 89 static int imx8mm_icc_remove(struct platform_device *pdev)
+1 -1
drivers/interconnect/imx/imx8mn.c
··· 72 72 73 73 static int imx8mn_icc_probe(struct platform_device *pdev) 74 74 { 75 - return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes)); 75 + return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL); 76 76 } 77 77 78 78 static int imx8mn_icc_remove(struct platform_device *pdev)
+259
drivers/interconnect/imx/imx8mp.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Interconnect framework driver for i.MX8MP SoC 4 + * 5 + * Copyright 2022 NXP 6 + * Peng Fan <peng.fan@nxp.com> 7 + */ 8 + 9 + #include <linux/module.h> 10 + #include <linux/of_device.h> 11 + #include <linux/platform_device.h> 12 + #include <dt-bindings/interconnect/fsl,imx8mp.h> 13 + 14 + #include "imx.h" 15 + 16 + static const struct imx_icc_node_adj_desc imx8mp_noc_adj = { 17 + .bw_mul = 1, 18 + .bw_div = 16, 19 + .main_noc = true, 20 + }; 21 + 22 + static struct imx_icc_noc_setting noc_setting_nodes[] = { 23 + [IMX8MP_ICM_MLMIX] = { 24 + .reg = 0x180, 25 + .mode = IMX_NOC_MODE_FIXED, 26 + .prio_level = 3, 27 + }, 28 + [IMX8MP_ICM_DSP] = { 29 + .reg = 0x200, 30 + .mode = IMX_NOC_MODE_FIXED, 31 + .prio_level = 3, 32 + }, 33 + [IMX8MP_ICM_SDMA2PER] = { 34 + .reg = 0x280, 35 + .mode = IMX_NOC_MODE_FIXED, 36 + .prio_level = 4, 37 + }, 38 + [IMX8MP_ICM_SDMA2BURST] = { 39 + .reg = 0x300, 40 + .mode = IMX_NOC_MODE_FIXED, 41 + .prio_level = 4, 42 + }, 43 + [IMX8MP_ICM_SDMA3PER] = { 44 + .reg = 0x380, 45 + .mode = IMX_NOC_MODE_FIXED, 46 + .prio_level = 4, 47 + }, 48 + [IMX8MP_ICM_SDMA3BURST] = { 49 + .reg = 0x400, 50 + .mode = IMX_NOC_MODE_FIXED, 51 + .prio_level = 4, 52 + }, 53 + [IMX8MP_ICM_EDMA] = { 54 + .reg = 0x480, 55 + .mode = IMX_NOC_MODE_FIXED, 56 + .prio_level = 4, 57 + }, 58 + [IMX8MP_ICM_GPU3D] = { 59 + .reg = 0x500, 60 + .mode = IMX_NOC_MODE_FIXED, 61 + .prio_level = 3, 62 + }, 63 + [IMX8MP_ICM_GPU2D] = { 64 + .reg = 0x580, 65 + .mode = IMX_NOC_MODE_FIXED, 66 + .prio_level = 3, 67 + }, 68 + [IMX8MP_ICM_HRV] = { 69 + .reg = 0x600, 70 + .mode = IMX_NOC_MODE_FIXED, 71 + .prio_level = 2, 72 + .ext_control = 1, 73 + }, 74 + [IMX8MP_ICM_LCDIF_HDMI] = { 75 + .reg = 0x680, 76 + .mode = IMX_NOC_MODE_FIXED, 77 + .prio_level = 2, 78 + .ext_control = 1, 79 + }, 80 + [IMX8MP_ICM_HDCP] = { 81 + .reg = 0x700, 82 + .mode = IMX_NOC_MODE_FIXED, 83 + .prio_level = 5, 84 + }, 85 + [IMX8MP_ICM_NOC_PCIE] = { 86 + .reg = 0x780, 87 + .mode = IMX_NOC_MODE_FIXED, 88 + .prio_level = 3, 89 + }, 90 + [IMX8MP_ICM_USB1] = { 91 + .reg = 0x800, 92 + .mode = IMX_NOC_MODE_FIXED, 93 + .prio_level = 3, 94 + }, 95 + [IMX8MP_ICM_USB2] = { 96 + .reg = 0x880, 97 + .mode = IMX_NOC_MODE_FIXED, 98 + .prio_level = 3, 99 + }, 100 + [IMX8MP_ICM_PCIE] = { 101 + .reg = 0x900, 102 + .mode = IMX_NOC_MODE_FIXED, 103 + .prio_level = 3, 104 + }, 105 + [IMX8MP_ICM_LCDIF_RD] = { 106 + .reg = 0x980, 107 + .mode = IMX_NOC_MODE_FIXED, 108 + .prio_level = 2, 109 + .ext_control = 1, 110 + }, 111 + [IMX8MP_ICM_LCDIF_WR] = { 112 + .reg = 0xa00, 113 + .mode = IMX_NOC_MODE_FIXED, 114 + .prio_level = 2, 115 + .ext_control = 1, 116 + }, 117 + [IMX8MP_ICM_ISI0] = { 118 + .reg = 0xa80, 119 + .mode = IMX_NOC_MODE_FIXED, 120 + .prio_level = 2, 121 + .ext_control = 1, 122 + }, 123 + [IMX8MP_ICM_ISI1] = { 124 + .reg = 0xb00, 125 + .mode = IMX_NOC_MODE_FIXED, 126 + .prio_level = 2, 127 + .ext_control = 1, 128 + }, 129 + [IMX8MP_ICM_ISI2] = { 130 + .reg = 0xb80, 131 + .mode = IMX_NOC_MODE_FIXED, 132 + .prio_level = 2, 133 + .ext_control = 1, 134 + }, 135 + [IMX8MP_ICM_ISP0] = { 136 + .reg = 0xc00, 137 + .mode = IMX_NOC_MODE_FIXED, 138 + .prio_level = 7, 139 + }, 140 + [IMX8MP_ICM_ISP1] = { 141 + .reg = 0xc80, 142 + .mode = IMX_NOC_MODE_FIXED, 143 + .prio_level = 7, 144 + }, 145 + [IMX8MP_ICM_DWE] = { 146 + .reg = 0xd00, 147 + .mode = IMX_NOC_MODE_FIXED, 148 + .prio_level = 7, 149 + }, 150 + [IMX8MP_ICM_VPU_G1] = { 151 + .reg = 0xd80, 152 + .mode = IMX_NOC_MODE_FIXED, 153 + .prio_level = 3, 154 + }, 155 + [IMX8MP_ICM_VPU_G2] = { 156 + .reg = 0xe00, 157 + .mode = IMX_NOC_MODE_FIXED, 158 + .prio_level = 3, 159 + }, 160 + [IMX8MP_ICM_VPU_H1] = { 161 + .reg = 0xe80, 162 + .mode = IMX_NOC_MODE_FIXED, 163 + .prio_level = 3, 164 + }, 165 + [IMX8MP_ICN_MEDIA] = { 166 + .mode = IMX_NOC_MODE_UNCONFIGURED, 167 + }, 168 + [IMX8MP_ICN_VIDEO] = { 169 + .mode = IMX_NOC_MODE_UNCONFIGURED, 170 + }, 171 + [IMX8MP_ICN_AUDIO] = { 172 + .mode = IMX_NOC_MODE_UNCONFIGURED, 173 + }, 174 + [IMX8MP_ICN_HDMI] = { 175 + .mode = IMX_NOC_MODE_UNCONFIGURED, 176 + }, 177 + [IMX8MP_ICN_GPU] = { 178 + .mode = IMX_NOC_MODE_UNCONFIGURED, 179 + }, 180 + [IMX8MP_ICN_HSIO] = { 181 + .mode = IMX_NOC_MODE_UNCONFIGURED, 182 + }, 183 + }; 184 + 185 + /* Describe bus masters, slaves and connections between them */ 186 + static struct imx_icc_node_desc nodes[] = { 187 + DEFINE_BUS_INTERCONNECT("NOC", IMX8MP_ICN_NOC, &imx8mp_noc_adj, 188 + IMX8MP_ICS_DRAM, IMX8MP_ICN_MAIN), 189 + 190 + DEFINE_BUS_SLAVE("OCRAM", IMX8MP_ICS_OCRAM, NULL), 191 + DEFINE_BUS_SLAVE("DRAM", IMX8MP_ICS_DRAM, NULL), 192 + DEFINE_BUS_MASTER("A53", IMX8MP_ICM_A53, IMX8MP_ICN_NOC), 193 + DEFINE_BUS_MASTER("SUPERMIX", IMX8MP_ICM_SUPERMIX, IMX8MP_ICN_NOC), 194 + DEFINE_BUS_MASTER("GIC", IMX8MP_ICM_GIC, IMX8MP_ICN_NOC), 195 + DEFINE_BUS_MASTER("MLMIX", IMX8MP_ICM_MLMIX, IMX8MP_ICN_NOC), 196 + 197 + DEFINE_BUS_INTERCONNECT("NOC_AUDIO", IMX8MP_ICN_AUDIO, NULL, IMX8MP_ICN_NOC), 198 + DEFINE_BUS_MASTER("DSP", IMX8MP_ICM_DSP, IMX8MP_ICN_AUDIO), 199 + DEFINE_BUS_MASTER("SDMA2PER", IMX8MP_ICM_SDMA2PER, IMX8MP_ICN_AUDIO), 200 + DEFINE_BUS_MASTER("SDMA2BURST", IMX8MP_ICM_SDMA2BURST, IMX8MP_ICN_AUDIO), 201 + DEFINE_BUS_MASTER("SDMA3PER", IMX8MP_ICM_SDMA3PER, IMX8MP_ICN_AUDIO), 202 + DEFINE_BUS_MASTER("SDMA3BURST", IMX8MP_ICM_SDMA3BURST, IMX8MP_ICN_AUDIO), 203 + DEFINE_BUS_MASTER("EDMA", IMX8MP_ICM_EDMA, IMX8MP_ICN_AUDIO), 204 + 205 + DEFINE_BUS_INTERCONNECT("NOC_GPU", IMX8MP_ICN_GPU, NULL, IMX8MP_ICN_NOC), 206 + DEFINE_BUS_MASTER("GPU 2D", IMX8MP_ICM_GPU2D, IMX8MP_ICN_GPU), 207 + DEFINE_BUS_MASTER("GPU 3D", IMX8MP_ICM_GPU3D, IMX8MP_ICN_GPU), 208 + 209 + DEFINE_BUS_INTERCONNECT("NOC_HDMI", IMX8MP_ICN_HDMI, NULL, IMX8MP_ICN_NOC), 210 + DEFINE_BUS_MASTER("HRV", IMX8MP_ICM_HRV, IMX8MP_ICN_HDMI), 211 + DEFINE_BUS_MASTER("LCDIF_HDMI", IMX8MP_ICM_LCDIF_HDMI, IMX8MP_ICN_HDMI), 212 + DEFINE_BUS_MASTER("HDCP", IMX8MP_ICM_HDCP, IMX8MP_ICN_HDMI), 213 + 214 + DEFINE_BUS_INTERCONNECT("NOC_HSIO", IMX8MP_ICN_HSIO, NULL, IMX8MP_ICN_NOC), 215 + DEFINE_BUS_MASTER("NOC_PCIE", IMX8MP_ICM_NOC_PCIE, IMX8MP_ICN_HSIO), 216 + DEFINE_BUS_MASTER("USB1", IMX8MP_ICM_USB1, IMX8MP_ICN_HSIO), 217 + DEFINE_BUS_MASTER("USB2", IMX8MP_ICM_USB2, IMX8MP_ICN_HSIO), 218 + DEFINE_BUS_MASTER("PCIE", IMX8MP_ICM_PCIE, IMX8MP_ICN_HSIO), 219 + 220 + DEFINE_BUS_INTERCONNECT("NOC_MEDIA", IMX8MP_ICN_MEDIA, NULL, IMX8MP_ICN_NOC), 221 + DEFINE_BUS_MASTER("LCDIF_RD", IMX8MP_ICM_LCDIF_RD, IMX8MP_ICN_MEDIA), 222 + DEFINE_BUS_MASTER("LCDIF_WR", IMX8MP_ICM_LCDIF_WR, IMX8MP_ICN_MEDIA), 223 + DEFINE_BUS_MASTER("ISI0", IMX8MP_ICM_ISI0, IMX8MP_ICN_MEDIA), 224 + DEFINE_BUS_MASTER("ISI1", IMX8MP_ICM_ISI1, IMX8MP_ICN_MEDIA), 225 + DEFINE_BUS_MASTER("ISI2", IMX8MP_ICM_ISI2, IMX8MP_ICN_MEDIA), 226 + DEFINE_BUS_MASTER("ISP0", IMX8MP_ICM_ISP0, IMX8MP_ICN_MEDIA), 227 + DEFINE_BUS_MASTER("ISP1", IMX8MP_ICM_ISP1, IMX8MP_ICN_MEDIA), 228 + DEFINE_BUS_MASTER("DWE", IMX8MP_ICM_DWE, IMX8MP_ICN_MEDIA), 229 + 230 + DEFINE_BUS_INTERCONNECT("NOC_VIDEO", IMX8MP_ICN_VIDEO, NULL, IMX8MP_ICN_NOC), 231 + DEFINE_BUS_MASTER("VPU G1", IMX8MP_ICM_VPU_G1, IMX8MP_ICN_VIDEO), 232 + DEFINE_BUS_MASTER("VPU G2", IMX8MP_ICM_VPU_G2, IMX8MP_ICN_VIDEO), 233 + DEFINE_BUS_MASTER("VPU H1", IMX8MP_ICM_VPU_H1, IMX8MP_ICN_VIDEO), 234 + DEFINE_BUS_INTERCONNECT("PL301_MAIN", IMX8MP_ICN_MAIN, NULL, 235 + IMX8MP_ICN_NOC, IMX8MP_ICS_OCRAM), 236 + }; 237 + 238 + static int imx8mp_icc_probe(struct platform_device *pdev) 239 + { 240 + return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), noc_setting_nodes); 241 + } 242 + 243 + static int imx8mp_icc_remove(struct platform_device *pdev) 244 + { 245 + return imx_icc_unregister(pdev); 246 + } 247 + 248 + static struct platform_driver imx8mp_icc_driver = { 249 + .probe = imx8mp_icc_probe, 250 + .remove = imx8mp_icc_remove, 251 + .driver = { 252 + .name = "imx8mp-interconnect", 253 + }, 254 + }; 255 + 256 + module_platform_driver(imx8mp_icc_driver); 257 + MODULE_AUTHOR("Peng Fan <peng.fan@nxp.com>"); 258 + MODULE_LICENSE("GPL"); 259 + MODULE_ALIAS("platform:imx8mp-interconnect");
+1 -1
drivers/interconnect/imx/imx8mq.c
··· 82 82 83 83 static int imx8mq_icc_probe(struct platform_device *pdev) 84 84 { 85 - return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes)); 85 + return imx_icc_register(pdev, nodes, ARRAY_SIZE(nodes), NULL); 86 86 } 87 87 88 88 static int imx8mq_icc_remove(struct platform_device *pdev)
+9
drivers/interconnect/qcom/Kconfig
··· 155 155 This is a driver for the Qualcomm Network-on-Chip on sdx65-based 156 156 platforms. 157 157 158 + config INTERCONNECT_QCOM_SM6350 159 + tristate "Qualcomm SM6350 interconnect driver" 160 + depends on INTERCONNECT_QCOM_RPMH_POSSIBLE 161 + select INTERCONNECT_QCOM_RPMH 162 + select INTERCONNECT_QCOM_BCM_VOTER 163 + help 164 + This is a driver for the Qualcomm Network-on-Chip on sm6350-based 165 + platforms. 166 + 158 167 config INTERCONNECT_QCOM_SM8150 159 168 tristate "Qualcomm SM8150 interconnect driver" 160 169 depends on INTERCONNECT_QCOM_RPMH_POSSIBLE
+5
drivers/interconnect/qcom/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 2 3 + obj-$(CONFIG_INTERCONNECT_QCOM) += interconnect_qcom.o 4 + 5 + interconnect_qcom-y := icc-common.o 3 6 icc-bcm-voter-objs := bcm-voter.o 4 7 qnoc-msm8916-objs := msm8916.o 5 8 qnoc-msm8939-objs := msm8939.o ··· 20 17 qnoc-sdm845-objs := sdm845.o 21 18 qnoc-sdx55-objs := sdx55.o 22 19 qnoc-sdx65-objs := sdx65.o 20 + qnoc-sm6350-objs := sm6350.o 23 21 qnoc-sm8150-objs := sm8150.o 24 22 qnoc-sm8250-objs := sm8250.o 25 23 qnoc-sm8350-objs := sm8350.o ··· 44 40 obj-$(CONFIG_INTERCONNECT_QCOM_SDM845) += qnoc-sdm845.o 45 41 obj-$(CONFIG_INTERCONNECT_QCOM_SDX55) += qnoc-sdx55.o 46 42 obj-$(CONFIG_INTERCONNECT_QCOM_SDX65) += qnoc-sdx65.o 43 + obj-$(CONFIG_INTERCONNECT_QCOM_SM6350) += qnoc-sm6350.o 47 44 obj-$(CONFIG_INTERCONNECT_QCOM_SM8150) += qnoc-sm8150.o 48 45 obj-$(CONFIG_INTERCONNECT_QCOM_SM8250) += qnoc-sm8250.o 49 46 obj-$(CONFIG_INTERCONNECT_QCOM_SM8350) += qnoc-sm8350.o
+34
drivers/interconnect/qcom/icc-common.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2022 Linaro Ltd. 4 + */ 5 + 6 + #include <linux/of.h> 7 + #include <linux/slab.h> 8 + 9 + #include "icc-common.h" 10 + 11 + struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data) 12 + { 13 + struct icc_node_data *ndata; 14 + struct icc_node *node; 15 + 16 + node = of_icc_xlate_onecell(spec, data); 17 + if (IS_ERR(node)) 18 + return ERR_CAST(node); 19 + 20 + ndata = kzalloc(sizeof(*ndata), GFP_KERNEL); 21 + if (!ndata) 22 + return ERR_PTR(-ENOMEM); 23 + 24 + ndata->node = node; 25 + 26 + if (spec->args_count == 2) 27 + ndata->tag = spec->args[1]; 28 + 29 + if (spec->args_count > 2) 30 + pr_warn("%pOF: Too many arguments, path tag is not parsed\n", spec->np); 31 + 32 + return ndata; 33 + } 34 + EXPORT_SYMBOL_GPL(qcom_icc_xlate_extended);
+13
drivers/interconnect/qcom/icc-common.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2022 Linaro Ltd. 4 + */ 5 + 6 + #ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_COMMON_H__ 7 + #define __DRIVERS_INTERCONNECT_QCOM_ICC_COMMON_H__ 8 + 9 + #include <linux/interconnect-provider.h> 10 + 11 + struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data); 12 + 13 + #endif
+144 -28
drivers/interconnect/qcom/icc-rpm.c
··· 16 16 #include <linux/slab.h> 17 17 18 18 #include "smd-rpm.h" 19 + #include "icc-common.h" 19 20 #include "icc-rpm.h" 20 21 21 22 /* QNOC QoS */ ··· 234 233 return ret; 235 234 } 236 235 237 - static int qcom_icc_set(struct icc_node *src, struct icc_node *dst) 236 + static int __qcom_icc_set(struct icc_node *n, struct qcom_icc_node *qn, 237 + u64 sum_bw) 238 238 { 239 - struct qcom_icc_provider *qp; 240 - struct qcom_icc_node *qn; 241 - struct icc_provider *provider; 242 - struct icc_node *n; 243 - u64 sum_bw; 244 - u64 max_peak_bw; 245 - u64 rate; 246 - u32 agg_avg = 0; 247 - u32 agg_peak = 0; 248 - int ret, i; 249 - 250 - qn = src->data; 251 - provider = src->provider; 252 - qp = to_qcom_provider(provider); 253 - 254 - list_for_each_entry(n, &provider->nodes, node_list) 255 - provider->aggregate(n, 0, n->avg_bw, n->peak_bw, 256 - &agg_avg, &agg_peak); 257 - 258 - sum_bw = icc_units_to_bps(agg_avg); 259 - max_peak_bw = icc_units_to_bps(agg_peak); 239 + int ret; 260 240 261 241 if (!qn->qos.ap_owned) { 262 242 /* send bandwidth request message to the RPM processor */ ··· 246 264 return ret; 247 265 } else if (qn->qos.qos_mode != -1) { 248 266 /* set bandwidth directly from the AP */ 249 - ret = qcom_icc_qos_set(src, sum_bw); 267 + ret = qcom_icc_qos_set(n, sum_bw); 250 268 if (ret) 251 269 return ret; 252 270 } 253 271 254 - rate = max(sum_bw, max_peak_bw); 272 + return 0; 273 + } 255 274 256 - do_div(rate, qn->buswidth); 257 - rate = min_t(u64, rate, LONG_MAX); 275 + /** 276 + * qcom_icc_pre_bw_aggregate - cleans up values before re-aggregate requests 277 + * @node: icc node to operate on 278 + */ 279 + static void qcom_icc_pre_bw_aggregate(struct icc_node *node) 280 + { 281 + struct qcom_icc_node *qn; 282 + size_t i; 283 + 284 + qn = node->data; 285 + for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) { 286 + qn->sum_avg[i] = 0; 287 + qn->max_peak[i] = 0; 288 + } 289 + } 290 + 291 + /** 292 + * qcom_icc_bw_aggregate - aggregate bw for buckets indicated by tag 293 + * @node: node to aggregate 294 + * @tag: tag to indicate which buckets to aggregate 295 + * @avg_bw: new bw to sum aggregate 296 + * @peak_bw: new bw to max aggregate 297 + * @agg_avg: existing aggregate avg bw val 298 + * @agg_peak: existing aggregate peak bw val 299 + */ 300 + static int qcom_icc_bw_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, 301 + u32 peak_bw, u32 *agg_avg, u32 *agg_peak) 302 + { 303 + size_t i; 304 + struct qcom_icc_node *qn; 305 + 306 + qn = node->data; 307 + 308 + if (!tag) 309 + tag = QCOM_ICC_TAG_ALWAYS; 310 + 311 + for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) { 312 + if (tag & BIT(i)) { 313 + qn->sum_avg[i] += avg_bw; 314 + qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_bw); 315 + } 316 + } 317 + 318 + *agg_avg += avg_bw; 319 + *agg_peak = max_t(u32, *agg_peak, peak_bw); 320 + return 0; 321 + } 322 + 323 + /** 324 + * qcom_icc_bus_aggregate - aggregate bandwidth by traversing all nodes 325 + * @provider: generic interconnect provider 326 + * @agg_avg: an array for aggregated average bandwidth of buckets 327 + * @agg_peak: an array for aggregated peak bandwidth of buckets 328 + * @max_agg_avg: pointer to max value of aggregated average bandwidth 329 + */ 330 + static void qcom_icc_bus_aggregate(struct icc_provider *provider, 331 + u64 *agg_avg, u64 *agg_peak, 332 + u64 *max_agg_avg) 333 + { 334 + struct icc_node *node; 335 + struct qcom_icc_node *qn; 336 + int i; 337 + 338 + /* Initialise aggregate values */ 339 + for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) { 340 + agg_avg[i] = 0; 341 + agg_peak[i] = 0; 342 + } 343 + 344 + *max_agg_avg = 0; 345 + 346 + /* 347 + * Iterate nodes on the interconnect and aggregate bandwidth 348 + * requests for every bucket. 349 + */ 350 + list_for_each_entry(node, &provider->nodes, node_list) { 351 + qn = node->data; 352 + for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) { 353 + agg_avg[i] += qn->sum_avg[i]; 354 + agg_peak[i] = max_t(u64, agg_peak[i], qn->max_peak[i]); 355 + } 356 + } 357 + 358 + /* Find maximum values across all buckets */ 359 + for (i = 0; i < QCOM_ICC_NUM_BUCKETS; i++) 360 + *max_agg_avg = max_t(u64, *max_agg_avg, agg_avg[i]); 361 + } 362 + 363 + static int qcom_icc_set(struct icc_node *src, struct icc_node *dst) 364 + { 365 + struct qcom_icc_provider *qp; 366 + struct qcom_icc_node *src_qn = NULL, *dst_qn = NULL; 367 + struct icc_provider *provider; 368 + u64 sum_bw; 369 + u64 rate; 370 + u64 agg_avg[QCOM_ICC_NUM_BUCKETS], agg_peak[QCOM_ICC_NUM_BUCKETS]; 371 + u64 max_agg_avg; 372 + int ret, i; 373 + int bucket; 374 + 375 + src_qn = src->data; 376 + if (dst) 377 + dst_qn = dst->data; 378 + provider = src->provider; 379 + qp = to_qcom_provider(provider); 380 + 381 + qcom_icc_bus_aggregate(provider, agg_avg, agg_peak, &max_agg_avg); 382 + 383 + sum_bw = icc_units_to_bps(max_agg_avg); 384 + 385 + ret = __qcom_icc_set(src, src_qn, sum_bw); 386 + if (ret) 387 + return ret; 388 + if (dst_qn) { 389 + ret = __qcom_icc_set(dst, dst_qn, sum_bw); 390 + if (ret) 391 + return ret; 392 + } 258 393 259 394 for (i = 0; i < qp->num_clks; i++) { 395 + /* 396 + * Use WAKE bucket for active clock, otherwise, use SLEEP bucket 397 + * for other clocks. If a platform doesn't set interconnect 398 + * path tags, by default use sleep bucket for all clocks. 399 + * 400 + * Note, AMC bucket is not supported yet. 401 + */ 402 + if (!strcmp(qp->bus_clks[i].id, "bus_a")) 403 + bucket = QCOM_ICC_BUCKET_WAKE; 404 + else 405 + bucket = QCOM_ICC_BUCKET_SLEEP; 406 + 407 + rate = icc_units_to_bps(max(agg_avg[bucket], agg_peak[bucket])); 408 + do_div(rate, src_qn->buswidth); 409 + rate = min_t(u64, rate, LONG_MAX); 410 + 260 411 if (qp->bus_clk_rate[i] == rate) 261 412 continue; 262 413 ··· 509 394 INIT_LIST_HEAD(&provider->nodes); 510 395 provider->dev = dev; 511 396 provider->set = qcom_icc_set; 512 - provider->aggregate = icc_std_aggregate; 513 - provider->xlate = of_icc_xlate_onecell; 397 + provider->pre_aggregate = qcom_icc_pre_bw_aggregate; 398 + provider->aggregate = qcom_icc_bw_aggregate; 399 + provider->xlate_extended = qcom_icc_xlate_extended; 514 400 provider->data = data; 515 401 516 402 ret = icc_provider_add(provider);
+6
drivers/interconnect/qcom/icc-rpm.h
··· 6 6 #ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H 7 7 #define __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H 8 8 9 + #include <dt-bindings/interconnect/qcom,icc.h> 10 + 9 11 #define RPM_BUS_MASTER_REQ 0x73616d62 10 12 #define RPM_BUS_SLAVE_REQ 0x766c7362 11 13 ··· 67 65 * @links: an array of nodes where we can go next while traversing 68 66 * @num_links: the total number of @links 69 67 * @buswidth: width of the interconnect between a node and the bus (bytes) 68 + * @sum_avg: current sum aggregate value of all avg bw requests 69 + * @max_peak: current max aggregate value of all peak bw requests 70 70 * @mas_rpm_id: RPM id for devices that are bus masters 71 71 * @slv_rpm_id: RPM id for devices that are bus slaves 72 72 * @qos: NoC QoS setting parameters ··· 79 75 const u16 *links; 80 76 u16 num_links; 81 77 u16 buswidth; 78 + u64 sum_avg[QCOM_ICC_NUM_BUCKETS]; 79 + u64 max_peak[QCOM_ICC_NUM_BUCKETS]; 82 80 int mas_rpm_id; 83 81 int slv_rpm_id; 84 82 struct qcom_icc_qos qos;
+5 -25
drivers/interconnect/qcom/icc-rpmh.c
··· 11 11 #include <linux/slab.h> 12 12 13 13 #include "bcm-voter.h" 14 + #include "icc-common.h" 14 15 #include "icc-rpmh.h" 15 16 16 17 /** ··· 100 99 return 0; 101 100 } 102 101 EXPORT_SYMBOL_GPL(qcom_icc_set); 103 - 104 - struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data) 105 - { 106 - struct icc_node_data *ndata; 107 - struct icc_node *node; 108 - 109 - node = of_icc_xlate_onecell(spec, data); 110 - if (IS_ERR(node)) 111 - return ERR_CAST(node); 112 - 113 - ndata = kzalloc(sizeof(*ndata), GFP_KERNEL); 114 - if (!ndata) 115 - return ERR_PTR(-ENOMEM); 116 - 117 - ndata->node = node; 118 - 119 - if (spec->args_count == 2) 120 - ndata->tag = spec->args[1]; 121 - 122 - if (spec->args_count > 2) 123 - pr_warn("%pOF: Too many arguments, path tag is not parsed\n", spec->np); 124 - 125 - return ndata; 126 - } 127 - EXPORT_SYMBOL_GPL(qcom_icc_xlate_extended); 128 102 129 103 /** 130 104 * qcom_icc_bcm_init - populates bcm aux data and connect qnodes ··· 233 257 234 258 data->num_nodes = num_nodes; 235 259 platform_set_drvdata(pdev, qp); 260 + 261 + /* Populate child NoC devices if any */ 262 + if (of_get_child_count(dev->of_node) > 0) 263 + return of_platform_populate(dev->of_node, NULL, NULL, dev); 236 264 237 265 return 0; 238 266 err:
-1
drivers/interconnect/qcom/icc-rpmh.h
··· 131 131 int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw, 132 132 u32 peak_bw, u32 *agg_avg, u32 *agg_peak); 133 133 int qcom_icc_set(struct icc_node *src, struct icc_node *dst); 134 - struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data); 135 134 int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev); 136 135 void qcom_icc_pre_aggregate(struct icc_node *node); 137 136 int qcom_icc_rpmh_probe(struct platform_device *pdev);
+1
drivers/interconnect/qcom/msm8939.c
··· 1423 1423 .driver = { 1424 1424 .name = "qnoc-msm8939", 1425 1425 .of_match_table = msm8939_noc_of_match, 1426 + .sync_state = icc_sync_state, 1426 1427 }, 1427 1428 }; 1428 1429 module_platform_driver(msm8939_noc_driver);
+493
drivers/interconnect/qcom/sm6350.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2022 Luca Weiss <luca.weiss@fairphone.com> 4 + */ 5 + 6 + #include <linux/device.h> 7 + #include <linux/interconnect.h> 8 + #include <linux/interconnect-provider.h> 9 + #include <linux/module.h> 10 + #include <linux/of_platform.h> 11 + #include <dt-bindings/interconnect/qcom,sm6350.h> 12 + 13 + #include "bcm-voter.h" 14 + #include "icc-rpmh.h" 15 + #include "sm6350.h" 16 + 17 + DEFINE_QNODE(qhm_a1noc_cfg, SM6350_MASTER_A1NOC_CFG, 1, 4, SM6350_SLAVE_SERVICE_A1NOC); 18 + DEFINE_QNODE(qhm_qup_0, SM6350_MASTER_QUP_0, 1, 4, SM6350_A1NOC_SNOC_SLV); 19 + DEFINE_QNODE(xm_emmc, SM6350_MASTER_EMMC, 1, 8, SM6350_A1NOC_SNOC_SLV); 20 + DEFINE_QNODE(xm_ufs_mem, SM6350_MASTER_UFS_MEM, 1, 8, SM6350_A1NOC_SNOC_SLV); 21 + DEFINE_QNODE(qhm_a2noc_cfg, SM6350_MASTER_A2NOC_CFG, 1, 4, SM6350_SLAVE_SERVICE_A2NOC); 22 + DEFINE_QNODE(qhm_qdss_bam, SM6350_MASTER_QDSS_BAM, 1, 4, SM6350_A2NOC_SNOC_SLV); 23 + DEFINE_QNODE(qhm_qup_1, SM6350_MASTER_QUP_1, 1, 4, SM6350_A2NOC_SNOC_SLV); 24 + DEFINE_QNODE(qxm_crypto, SM6350_MASTER_CRYPTO_CORE_0, 1, 8, SM6350_A2NOC_SNOC_SLV); 25 + DEFINE_QNODE(qxm_ipa, SM6350_MASTER_IPA, 1, 8, SM6350_A2NOC_SNOC_SLV); 26 + DEFINE_QNODE(xm_qdss_etr, SM6350_MASTER_QDSS_ETR, 1, 8, SM6350_A2NOC_SNOC_SLV); 27 + DEFINE_QNODE(xm_sdc2, SM6350_MASTER_SDCC_2, 1, 8, SM6350_A2NOC_SNOC_SLV); 28 + DEFINE_QNODE(xm_usb3_0, SM6350_MASTER_USB3, 1, 8, SM6350_A2NOC_SNOC_SLV); 29 + DEFINE_QNODE(qxm_camnoc_hf0_uncomp, SM6350_MASTER_CAMNOC_HF0_UNCOMP, 2, 32, SM6350_SLAVE_CAMNOC_UNCOMP); 30 + DEFINE_QNODE(qxm_camnoc_icp_uncomp, SM6350_MASTER_CAMNOC_ICP_UNCOMP, 1, 32, SM6350_SLAVE_CAMNOC_UNCOMP); 31 + DEFINE_QNODE(qxm_camnoc_sf_uncomp, SM6350_MASTER_CAMNOC_SF_UNCOMP, 1, 32, SM6350_SLAVE_CAMNOC_UNCOMP); 32 + DEFINE_QNODE(qup0_core_master, SM6350_MASTER_QUP_CORE_0, 1, 4, SM6350_SLAVE_QUP_CORE_0); 33 + DEFINE_QNODE(qup1_core_master, SM6350_MASTER_QUP_CORE_1, 1, 4, SM6350_SLAVE_QUP_CORE_1); 34 + DEFINE_QNODE(qnm_npu, SM6350_MASTER_NPU, 2, 32, SM6350_SLAVE_CDSP_GEM_NOC); 35 + DEFINE_QNODE(qxm_npu_dsp, SM6350_MASTER_NPU_PROC, 1, 8, SM6350_SLAVE_CDSP_GEM_NOC); 36 + DEFINE_QNODE(qnm_snoc, SM6350_SNOC_CNOC_MAS, 1, 8, SM6350_SLAVE_CAMERA_CFG, SM6350_SLAVE_SDCC_2, SM6350_SLAVE_CNOC_MNOC_CFG, SM6350_SLAVE_UFS_MEM_CFG, SM6350_SLAVE_QM_CFG, SM6350_SLAVE_SNOC_CFG, SM6350_SLAVE_QM_MPU_CFG, SM6350_SLAVE_GLM, SM6350_SLAVE_PDM, SM6350_SLAVE_CAMERA_NRT_THROTTLE_CFG, SM6350_SLAVE_A2NOC_CFG, SM6350_SLAVE_QDSS_CFG, SM6350_SLAVE_VSENSE_CTRL_CFG, SM6350_SLAVE_CAMERA_RT_THROTTLE_CFG, SM6350_SLAVE_DISPLAY_CFG, SM6350_SLAVE_TCSR, SM6350_SLAVE_DCC_CFG, SM6350_SLAVE_CNOC_DDRSS, SM6350_SLAVE_DISPLAY_THROTTLE_CFG, SM6350_SLAVE_NPU_CFG, SM6350_SLAVE_AHB2PHY, SM6350_SLAVE_GRAPHICS_3D_CFG, SM6350_SLAVE_BOOT_ROM, SM6350_SLAVE_VENUS_CFG, SM6350_SLAVE_IPA_CFG, SM6350_SLAVE_SECURITY, SM6350_SLAVE_IMEM_CFG, SM6350_SLAVE_CNOC_MSS, SM6350_SLAVE_SERVICE_CNOC, SM6350_SLAVE_USB3, SM6350_SLAVE_VENUS_THROTTLE_CFG, SM6350_SLAVE_RBCPR_CX_CFG, SM6350_SLAVE_A1NOC_CFG, SM6350_SLAVE_AOSS, SM6350_SLAVE_PRNG, SM6350_SLAVE_EMMC_CFG, SM6350_SLAVE_CRYPTO_0_CFG, SM6350_SLAVE_PIMEM_CFG, SM6350_SLAVE_RBCPR_MX_CFG, SM6350_SLAVE_QUP_0, SM6350_SLAVE_QUP_1, SM6350_SLAVE_CLK_CTL); 37 + DEFINE_QNODE(xm_qdss_dap, SM6350_MASTER_QDSS_DAP, 1, 8, SM6350_SLAVE_CAMERA_CFG, SM6350_SLAVE_SDCC_2, SM6350_SLAVE_CNOC_MNOC_CFG, SM6350_SLAVE_UFS_MEM_CFG, SM6350_SLAVE_QM_CFG, SM6350_SLAVE_SNOC_CFG, SM6350_SLAVE_QM_MPU_CFG, SM6350_SLAVE_GLM, SM6350_SLAVE_PDM, SM6350_SLAVE_CAMERA_NRT_THROTTLE_CFG, SM6350_SLAVE_A2NOC_CFG, SM6350_SLAVE_QDSS_CFG, SM6350_SLAVE_VSENSE_CTRL_CFG, SM6350_SLAVE_CAMERA_RT_THROTTLE_CFG, SM6350_SLAVE_DISPLAY_CFG, SM6350_SLAVE_TCSR, SM6350_SLAVE_DCC_CFG, SM6350_SLAVE_CNOC_DDRSS, SM6350_SLAVE_DISPLAY_THROTTLE_CFG, SM6350_SLAVE_NPU_CFG, SM6350_SLAVE_AHB2PHY, SM6350_SLAVE_GRAPHICS_3D_CFG, SM6350_SLAVE_BOOT_ROM, SM6350_SLAVE_VENUS_CFG, SM6350_SLAVE_IPA_CFG, SM6350_SLAVE_SECURITY, SM6350_SLAVE_IMEM_CFG, SM6350_SLAVE_CNOC_MSS, SM6350_SLAVE_SERVICE_CNOC, SM6350_SLAVE_USB3, SM6350_SLAVE_VENUS_THROTTLE_CFG, SM6350_SLAVE_RBCPR_CX_CFG, SM6350_SLAVE_A1NOC_CFG, SM6350_SLAVE_AOSS, SM6350_SLAVE_PRNG, SM6350_SLAVE_EMMC_CFG, SM6350_SLAVE_CRYPTO_0_CFG, SM6350_SLAVE_PIMEM_CFG, SM6350_SLAVE_RBCPR_MX_CFG, SM6350_SLAVE_QUP_0, SM6350_SLAVE_QUP_1, SM6350_SLAVE_CLK_CTL); 38 + DEFINE_QNODE(qhm_cnoc_dc_noc, SM6350_MASTER_CNOC_DC_NOC, 1, 4, SM6350_SLAVE_LLCC_CFG, SM6350_SLAVE_GEM_NOC_CFG); 39 + DEFINE_QNODE(acm_apps, SM6350_MASTER_AMPSS_M0, 1, 16, SM6350_SLAVE_LLCC, SM6350_SLAVE_GEM_NOC_SNOC); 40 + DEFINE_QNODE(acm_sys_tcu, SM6350_MASTER_SYS_TCU, 1, 8, SM6350_SLAVE_LLCC, SM6350_SLAVE_GEM_NOC_SNOC); 41 + DEFINE_QNODE(qhm_gemnoc_cfg, SM6350_MASTER_GEM_NOC_CFG, 1, 4, SM6350_SLAVE_MCDMA_MS_MPU_CFG, SM6350_SLAVE_SERVICE_GEM_NOC, SM6350_SLAVE_MSS_PROC_MS_MPU_CFG); 42 + DEFINE_QNODE(qnm_cmpnoc, SM6350_MASTER_COMPUTE_NOC, 1, 32, SM6350_SLAVE_LLCC, SM6350_SLAVE_GEM_NOC_SNOC); 43 + DEFINE_QNODE(qnm_mnoc_hf, SM6350_MASTER_MNOC_HF_MEM_NOC, 1, 32, SM6350_SLAVE_LLCC, SM6350_SLAVE_GEM_NOC_SNOC); 44 + DEFINE_QNODE(qnm_mnoc_sf, SM6350_MASTER_MNOC_SF_MEM_NOC, 1, 32, SM6350_SLAVE_LLCC, SM6350_SLAVE_GEM_NOC_SNOC); 45 + DEFINE_QNODE(qnm_snoc_gc, SM6350_MASTER_SNOC_GC_MEM_NOC, 1, 8, SM6350_SLAVE_LLCC); 46 + DEFINE_QNODE(qnm_snoc_sf, SM6350_MASTER_SNOC_SF_MEM_NOC, 1, 16, SM6350_SLAVE_LLCC); 47 + DEFINE_QNODE(qxm_gpu, SM6350_MASTER_GRAPHICS_3D, 2, 32, SM6350_SLAVE_LLCC, SM6350_SLAVE_GEM_NOC_SNOC); 48 + DEFINE_QNODE(llcc_mc, SM6350_MASTER_LLCC, 2, 4, SM6350_SLAVE_EBI_CH0); 49 + DEFINE_QNODE(qhm_mnoc_cfg, SM6350_MASTER_CNOC_MNOC_CFG, 1, 4, SM6350_SLAVE_SERVICE_MNOC); 50 + DEFINE_QNODE(qnm_video0, SM6350_MASTER_VIDEO_P0, 1, 32, SM6350_SLAVE_MNOC_SF_MEM_NOC); 51 + DEFINE_QNODE(qnm_video_cvp, SM6350_MASTER_VIDEO_PROC, 1, 8, SM6350_SLAVE_MNOC_SF_MEM_NOC); 52 + DEFINE_QNODE(qxm_camnoc_hf, SM6350_MASTER_CAMNOC_HF, 2, 32, SM6350_SLAVE_MNOC_HF_MEM_NOC); 53 + DEFINE_QNODE(qxm_camnoc_icp, SM6350_MASTER_CAMNOC_ICP, 1, 8, SM6350_SLAVE_MNOC_SF_MEM_NOC); 54 + DEFINE_QNODE(qxm_camnoc_sf, SM6350_MASTER_CAMNOC_SF, 1, 32, SM6350_SLAVE_MNOC_SF_MEM_NOC); 55 + DEFINE_QNODE(qxm_mdp0, SM6350_MASTER_MDP_PORT0, 1, 32, SM6350_SLAVE_MNOC_HF_MEM_NOC); 56 + DEFINE_QNODE(amm_npu_sys, SM6350_MASTER_NPU_SYS, 2, 32, SM6350_SLAVE_NPU_COMPUTE_NOC); 57 + DEFINE_QNODE(qhm_npu_cfg, SM6350_MASTER_NPU_NOC_CFG, 1, 4, SM6350_SLAVE_SERVICE_NPU_NOC, SM6350_SLAVE_ISENSE_CFG, SM6350_SLAVE_NPU_LLM_CFG, SM6350_SLAVE_NPU_INT_DMA_BWMON_CFG, SM6350_SLAVE_NPU_CP, SM6350_SLAVE_NPU_TCM, SM6350_SLAVE_NPU_CAL_DP0, SM6350_SLAVE_NPU_DPM); 58 + DEFINE_QNODE(qhm_snoc_cfg, SM6350_MASTER_SNOC_CFG, 1, 4, SM6350_SLAVE_SERVICE_SNOC); 59 + DEFINE_QNODE(qnm_aggre1_noc, SM6350_A1NOC_SNOC_MAS, 1, 16, SM6350_SLAVE_SNOC_GEM_NOC_SF, SM6350_SLAVE_PIMEM, SM6350_SLAVE_OCIMEM, SM6350_SLAVE_APPSS, SM6350_SNOC_CNOC_SLV, SM6350_SLAVE_QDSS_STM); 60 + DEFINE_QNODE(qnm_aggre2_noc, SM6350_A2NOC_SNOC_MAS, 1, 16, SM6350_SLAVE_SNOC_GEM_NOC_SF, SM6350_SLAVE_PIMEM, SM6350_SLAVE_OCIMEM, SM6350_SLAVE_APPSS, SM6350_SNOC_CNOC_SLV, SM6350_SLAVE_TCU, SM6350_SLAVE_QDSS_STM); 61 + DEFINE_QNODE(qnm_gemnoc, SM6350_MASTER_GEM_NOC_SNOC, 1, 8, SM6350_SLAVE_PIMEM, SM6350_SLAVE_OCIMEM, SM6350_SLAVE_APPSS, SM6350_SNOC_CNOC_SLV, SM6350_SLAVE_TCU, SM6350_SLAVE_QDSS_STM); 62 + DEFINE_QNODE(qxm_pimem, SM6350_MASTER_PIMEM, 1, 8, SM6350_SLAVE_SNOC_GEM_NOC_GC, SM6350_SLAVE_OCIMEM); 63 + DEFINE_QNODE(xm_gic, SM6350_MASTER_GIC, 1, 8, SM6350_SLAVE_SNOC_GEM_NOC_GC); 64 + DEFINE_QNODE(qns_a1noc_snoc, SM6350_A1NOC_SNOC_SLV, 1, 16, SM6350_A1NOC_SNOC_MAS); 65 + DEFINE_QNODE(srvc_aggre1_noc, SM6350_SLAVE_SERVICE_A1NOC, 1, 4); 66 + DEFINE_QNODE(qns_a2noc_snoc, SM6350_A2NOC_SNOC_SLV, 1, 16, SM6350_A2NOC_SNOC_MAS); 67 + DEFINE_QNODE(srvc_aggre2_noc, SM6350_SLAVE_SERVICE_A2NOC, 1, 4); 68 + DEFINE_QNODE(qns_camnoc_uncomp, SM6350_SLAVE_CAMNOC_UNCOMP, 1, 32); 69 + DEFINE_QNODE(qup0_core_slave, SM6350_SLAVE_QUP_CORE_0, 1, 4); 70 + DEFINE_QNODE(qup1_core_slave, SM6350_SLAVE_QUP_CORE_1, 1, 4); 71 + DEFINE_QNODE(qns_cdsp_gemnoc, SM6350_SLAVE_CDSP_GEM_NOC, 1, 32, SM6350_MASTER_COMPUTE_NOC); 72 + DEFINE_QNODE(qhs_a1_noc_cfg, SM6350_SLAVE_A1NOC_CFG, 1, 4, SM6350_MASTER_A1NOC_CFG); 73 + DEFINE_QNODE(qhs_a2_noc_cfg, SM6350_SLAVE_A2NOC_CFG, 1, 4, SM6350_MASTER_A2NOC_CFG); 74 + DEFINE_QNODE(qhs_ahb2phy0, SM6350_SLAVE_AHB2PHY, 1, 4); 75 + DEFINE_QNODE(qhs_ahb2phy2, SM6350_SLAVE_AHB2PHY_2, 1, 4); 76 + DEFINE_QNODE(qhs_aoss, SM6350_SLAVE_AOSS, 1, 4); 77 + DEFINE_QNODE(qhs_boot_rom, SM6350_SLAVE_BOOT_ROM, 1, 4); 78 + DEFINE_QNODE(qhs_camera_cfg, SM6350_SLAVE_CAMERA_CFG, 1, 4); 79 + DEFINE_QNODE(qhs_camera_nrt_thrott_cfg, SM6350_SLAVE_CAMERA_NRT_THROTTLE_CFG, 1, 4); 80 + DEFINE_QNODE(qhs_camera_rt_throttle_cfg, SM6350_SLAVE_CAMERA_RT_THROTTLE_CFG, 1, 4); 81 + DEFINE_QNODE(qhs_clk_ctl, SM6350_SLAVE_CLK_CTL, 1, 4); 82 + DEFINE_QNODE(qhs_cpr_cx, SM6350_SLAVE_RBCPR_CX_CFG, 1, 4); 83 + DEFINE_QNODE(qhs_cpr_mx, SM6350_SLAVE_RBCPR_MX_CFG, 1, 4); 84 + DEFINE_QNODE(qhs_crypto0_cfg, SM6350_SLAVE_CRYPTO_0_CFG, 1, 4); 85 + DEFINE_QNODE(qhs_dcc_cfg, SM6350_SLAVE_DCC_CFG, 1, 4); 86 + DEFINE_QNODE(qhs_ddrss_cfg, SM6350_SLAVE_CNOC_DDRSS, 1, 4, SM6350_MASTER_CNOC_DC_NOC); 87 + DEFINE_QNODE(qhs_display_cfg, SM6350_SLAVE_DISPLAY_CFG, 1, 4); 88 + DEFINE_QNODE(qhs_display_throttle_cfg, SM6350_SLAVE_DISPLAY_THROTTLE_CFG, 1, 4); 89 + DEFINE_QNODE(qhs_emmc_cfg, SM6350_SLAVE_EMMC_CFG, 1, 4); 90 + DEFINE_QNODE(qhs_glm, SM6350_SLAVE_GLM, 1, 4); 91 + DEFINE_QNODE(qhs_gpuss_cfg, SM6350_SLAVE_GRAPHICS_3D_CFG, 1, 8); 92 + DEFINE_QNODE(qhs_imem_cfg, SM6350_SLAVE_IMEM_CFG, 1, 4); 93 + DEFINE_QNODE(qhs_ipa, SM6350_SLAVE_IPA_CFG, 1, 4); 94 + DEFINE_QNODE(qhs_mnoc_cfg, SM6350_SLAVE_CNOC_MNOC_CFG, 1, 4, SM6350_MASTER_CNOC_MNOC_CFG); 95 + DEFINE_QNODE(qhs_mss_cfg, SM6350_SLAVE_CNOC_MSS, 1, 4); 96 + DEFINE_QNODE(qhs_npu_cfg, SM6350_SLAVE_NPU_CFG, 1, 4, SM6350_MASTER_NPU_NOC_CFG); 97 + DEFINE_QNODE(qhs_pdm, SM6350_SLAVE_PDM, 1, 4); 98 + DEFINE_QNODE(qhs_pimem_cfg, SM6350_SLAVE_PIMEM_CFG, 1, 4); 99 + DEFINE_QNODE(qhs_prng, SM6350_SLAVE_PRNG, 1, 4); 100 + DEFINE_QNODE(qhs_qdss_cfg, SM6350_SLAVE_QDSS_CFG, 1, 4); 101 + DEFINE_QNODE(qhs_qm_cfg, SM6350_SLAVE_QM_CFG, 1, 4); 102 + DEFINE_QNODE(qhs_qm_mpu_cfg, SM6350_SLAVE_QM_MPU_CFG, 1, 4); 103 + DEFINE_QNODE(qhs_qup0, SM6350_SLAVE_QUP_0, 1, 4); 104 + DEFINE_QNODE(qhs_qup1, SM6350_SLAVE_QUP_1, 1, 4); 105 + DEFINE_QNODE(qhs_sdc2, SM6350_SLAVE_SDCC_2, 1, 4); 106 + DEFINE_QNODE(qhs_security, SM6350_SLAVE_SECURITY, 1, 4); 107 + DEFINE_QNODE(qhs_snoc_cfg, SM6350_SLAVE_SNOC_CFG, 1, 4, SM6350_MASTER_SNOC_CFG); 108 + DEFINE_QNODE(qhs_tcsr, SM6350_SLAVE_TCSR, 1, 4); 109 + DEFINE_QNODE(qhs_ufs_mem_cfg, SM6350_SLAVE_UFS_MEM_CFG, 1, 4); 110 + DEFINE_QNODE(qhs_usb3_0, SM6350_SLAVE_USB3, 1, 4); 111 + DEFINE_QNODE(qhs_venus_cfg, SM6350_SLAVE_VENUS_CFG, 1, 4); 112 + DEFINE_QNODE(qhs_venus_throttle_cfg, SM6350_SLAVE_VENUS_THROTTLE_CFG, 1, 4); 113 + DEFINE_QNODE(qhs_vsense_ctrl_cfg, SM6350_SLAVE_VSENSE_CTRL_CFG, 1, 4); 114 + DEFINE_QNODE(srvc_cnoc, SM6350_SLAVE_SERVICE_CNOC, 1, 4); 115 + DEFINE_QNODE(qhs_gemnoc, SM6350_SLAVE_GEM_NOC_CFG, 1, 4, SM6350_MASTER_GEM_NOC_CFG); 116 + DEFINE_QNODE(qhs_llcc, SM6350_SLAVE_LLCC_CFG, 1, 4); 117 + DEFINE_QNODE(qhs_mcdma_ms_mpu_cfg, SM6350_SLAVE_MCDMA_MS_MPU_CFG, 1, 4); 118 + DEFINE_QNODE(qhs_mdsp_ms_mpu_cfg, SM6350_SLAVE_MSS_PROC_MS_MPU_CFG, 1, 4); 119 + DEFINE_QNODE(qns_gem_noc_snoc, SM6350_SLAVE_GEM_NOC_SNOC, 1, 8, SM6350_MASTER_GEM_NOC_SNOC); 120 + DEFINE_QNODE(qns_llcc, SM6350_SLAVE_LLCC, 1, 16, SM6350_MASTER_LLCC); 121 + DEFINE_QNODE(srvc_gemnoc, SM6350_SLAVE_SERVICE_GEM_NOC, 1, 4); 122 + DEFINE_QNODE(ebi, SM6350_SLAVE_EBI_CH0, 2, 4); 123 + DEFINE_QNODE(qns_mem_noc_hf, SM6350_SLAVE_MNOC_HF_MEM_NOC, 1, 32, SM6350_MASTER_MNOC_HF_MEM_NOC); 124 + DEFINE_QNODE(qns_mem_noc_sf, SM6350_SLAVE_MNOC_SF_MEM_NOC, 1, 32, SM6350_MASTER_MNOC_SF_MEM_NOC); 125 + DEFINE_QNODE(srvc_mnoc, SM6350_SLAVE_SERVICE_MNOC, 1, 4); 126 + DEFINE_QNODE(qhs_cal_dp0, SM6350_SLAVE_NPU_CAL_DP0, 1, 4); 127 + DEFINE_QNODE(qhs_cp, SM6350_SLAVE_NPU_CP, 1, 4); 128 + DEFINE_QNODE(qhs_dma_bwmon, SM6350_SLAVE_NPU_INT_DMA_BWMON_CFG, 1, 4); 129 + DEFINE_QNODE(qhs_dpm, SM6350_SLAVE_NPU_DPM, 1, 4); 130 + DEFINE_QNODE(qhs_isense, SM6350_SLAVE_ISENSE_CFG, 1, 4); 131 + DEFINE_QNODE(qhs_llm, SM6350_SLAVE_NPU_LLM_CFG, 1, 4); 132 + DEFINE_QNODE(qhs_tcm, SM6350_SLAVE_NPU_TCM, 1, 4); 133 + DEFINE_QNODE(qns_npu_sys, SM6350_SLAVE_NPU_COMPUTE_NOC, 2, 32); 134 + DEFINE_QNODE(srvc_noc, SM6350_SLAVE_SERVICE_NPU_NOC, 1, 4); 135 + DEFINE_QNODE(qhs_apss, SM6350_SLAVE_APPSS, 1, 8); 136 + DEFINE_QNODE(qns_cnoc, SM6350_SNOC_CNOC_SLV, 1, 8, SM6350_SNOC_CNOC_MAS); 137 + DEFINE_QNODE(qns_gemnoc_gc, SM6350_SLAVE_SNOC_GEM_NOC_GC, 1, 8, SM6350_MASTER_SNOC_GC_MEM_NOC); 138 + DEFINE_QNODE(qns_gemnoc_sf, SM6350_SLAVE_SNOC_GEM_NOC_SF, 1, 16, SM6350_MASTER_SNOC_SF_MEM_NOC); 139 + DEFINE_QNODE(qxs_imem, SM6350_SLAVE_OCIMEM, 1, 8); 140 + DEFINE_QNODE(qxs_pimem, SM6350_SLAVE_PIMEM, 1, 8); 141 + DEFINE_QNODE(srvc_snoc, SM6350_SLAVE_SERVICE_SNOC, 1, 4); 142 + DEFINE_QNODE(xs_qdss_stm, SM6350_SLAVE_QDSS_STM, 1, 4); 143 + DEFINE_QNODE(xs_sys_tcu_cfg, SM6350_SLAVE_TCU, 1, 8); 144 + 145 + DEFINE_QBCM(bcm_acv, "ACV", false, &ebi); 146 + DEFINE_QBCM(bcm_ce0, "CE0", false, &qxm_crypto); 147 + DEFINE_QBCM(bcm_cn0, "CN0", true, &qnm_snoc, &xm_qdss_dap, &qhs_a1_noc_cfg, &qhs_a2_noc_cfg, &qhs_ahb2phy0, &qhs_aoss, &qhs_boot_rom, &qhs_camera_cfg, &qhs_camera_nrt_thrott_cfg, &qhs_camera_rt_throttle_cfg, &qhs_clk_ctl, &qhs_cpr_cx, &qhs_cpr_mx, &qhs_crypto0_cfg, &qhs_dcc_cfg, &qhs_ddrss_cfg, &qhs_display_cfg, &qhs_display_throttle_cfg, &qhs_glm, &qhs_gpuss_cfg, &qhs_imem_cfg, &qhs_ipa, &qhs_mnoc_cfg, &qhs_mss_cfg, &qhs_npu_cfg, &qhs_pimem_cfg, &qhs_prng, &qhs_qdss_cfg, &qhs_qm_cfg, &qhs_qm_mpu_cfg, &qhs_qup0, &qhs_qup1, &qhs_security, &qhs_snoc_cfg, &qhs_tcsr, &qhs_ufs_mem_cfg, &qhs_usb3_0, &qhs_venus_cfg, &qhs_venus_throttle_cfg, &qhs_vsense_ctrl_cfg, &srvc_cnoc); 148 + DEFINE_QBCM(bcm_cn1, "CN1", false, &xm_emmc, &xm_sdc2, &qhs_ahb2phy2, &qhs_emmc_cfg, &qhs_pdm, &qhs_sdc2); 149 + DEFINE_QBCM(bcm_co0, "CO0", false, &qns_cdsp_gemnoc); 150 + DEFINE_QBCM(bcm_co2, "CO2", false, &qnm_npu); 151 + DEFINE_QBCM(bcm_co3, "CO3", false, &qxm_npu_dsp); 152 + DEFINE_QBCM(bcm_mc0, "MC0", true, &ebi); 153 + DEFINE_QBCM(bcm_mm0, "MM0", true, &qns_mem_noc_hf); 154 + DEFINE_QBCM(bcm_mm1, "MM1", true, &qxm_camnoc_hf0_uncomp, &qxm_camnoc_icp_uncomp, &qxm_camnoc_sf_uncomp, &qxm_camnoc_hf, &qxm_mdp0); 155 + DEFINE_QBCM(bcm_mm2, "MM2", false, &qns_mem_noc_sf); 156 + DEFINE_QBCM(bcm_mm3, "MM3", false, &qhm_mnoc_cfg, &qnm_video0, &qnm_video_cvp, &qxm_camnoc_sf); 157 + DEFINE_QBCM(bcm_qup0, "QUP0", false, &qup0_core_master, &qup1_core_master, &qup0_core_slave, &qup1_core_slave); 158 + DEFINE_QBCM(bcm_sh0, "SH0", true, &qns_llcc); 159 + DEFINE_QBCM(bcm_sh2, "SH2", false, &acm_sys_tcu); 160 + DEFINE_QBCM(bcm_sh3, "SH3", false, &qnm_cmpnoc); 161 + DEFINE_QBCM(bcm_sh4, "SH4", false, &acm_apps); 162 + DEFINE_QBCM(bcm_sn0, "SN0", true, &qns_gemnoc_sf); 163 + DEFINE_QBCM(bcm_sn1, "SN1", false, &qxs_imem); 164 + DEFINE_QBCM(bcm_sn2, "SN2", false, &qns_gemnoc_gc); 165 + DEFINE_QBCM(bcm_sn3, "SN3", false, &qxs_pimem); 166 + DEFINE_QBCM(bcm_sn4, "SN4", false, &xs_qdss_stm); 167 + DEFINE_QBCM(bcm_sn5, "SN5", false, &qnm_aggre1_noc); 168 + DEFINE_QBCM(bcm_sn6, "SN6", false, &qnm_aggre2_noc); 169 + DEFINE_QBCM(bcm_sn10, "SN10", false, &qnm_gemnoc); 170 + 171 + static struct qcom_icc_bcm * const aggre1_noc_bcms[] = { 172 + &bcm_cn1, 173 + }; 174 + 175 + static struct qcom_icc_node * const aggre1_noc_nodes[] = { 176 + [MASTER_A1NOC_CFG] = &qhm_a1noc_cfg, 177 + [MASTER_QUP_0] = &qhm_qup_0, 178 + [MASTER_EMMC] = &xm_emmc, 179 + [MASTER_UFS_MEM] = &xm_ufs_mem, 180 + [A1NOC_SNOC_SLV] = &qns_a1noc_snoc, 181 + [SLAVE_SERVICE_A1NOC] = &srvc_aggre1_noc, 182 + }; 183 + 184 + static const struct qcom_icc_desc sm6350_aggre1_noc = { 185 + .nodes = aggre1_noc_nodes, 186 + .num_nodes = ARRAY_SIZE(aggre1_noc_nodes), 187 + .bcms = aggre1_noc_bcms, 188 + .num_bcms = ARRAY_SIZE(aggre1_noc_bcms), 189 + }; 190 + 191 + static struct qcom_icc_bcm * const aggre2_noc_bcms[] = { 192 + &bcm_ce0, 193 + &bcm_cn1, 194 + }; 195 + 196 + static struct qcom_icc_node * const aggre2_noc_nodes[] = { 197 + [MASTER_A2NOC_CFG] = &qhm_a2noc_cfg, 198 + [MASTER_QDSS_BAM] = &qhm_qdss_bam, 199 + [MASTER_QUP_1] = &qhm_qup_1, 200 + [MASTER_CRYPTO_CORE_0] = &qxm_crypto, 201 + [MASTER_IPA] = &qxm_ipa, 202 + [MASTER_QDSS_ETR] = &xm_qdss_etr, 203 + [MASTER_SDCC_2] = &xm_sdc2, 204 + [MASTER_USB3] = &xm_usb3_0, 205 + [A2NOC_SNOC_SLV] = &qns_a2noc_snoc, 206 + [SLAVE_SERVICE_A2NOC] = &srvc_aggre2_noc, 207 + }; 208 + 209 + static const struct qcom_icc_desc sm6350_aggre2_noc = { 210 + .nodes = aggre2_noc_nodes, 211 + .num_nodes = ARRAY_SIZE(aggre2_noc_nodes), 212 + .bcms = aggre2_noc_bcms, 213 + .num_bcms = ARRAY_SIZE(aggre2_noc_bcms), 214 + }; 215 + 216 + static struct qcom_icc_bcm * const clk_virt_bcms[] = { 217 + &bcm_acv, 218 + &bcm_mc0, 219 + &bcm_mm1, 220 + &bcm_qup0, 221 + }; 222 + 223 + static struct qcom_icc_node * const clk_virt_nodes[] = { 224 + [MASTER_CAMNOC_HF0_UNCOMP] = &qxm_camnoc_hf0_uncomp, 225 + [MASTER_CAMNOC_ICP_UNCOMP] = &qxm_camnoc_icp_uncomp, 226 + [MASTER_CAMNOC_SF_UNCOMP] = &qxm_camnoc_sf_uncomp, 227 + [MASTER_QUP_CORE_0] = &qup0_core_master, 228 + [MASTER_QUP_CORE_1] = &qup1_core_master, 229 + [MASTER_LLCC] = &llcc_mc, 230 + [SLAVE_CAMNOC_UNCOMP] = &qns_camnoc_uncomp, 231 + [SLAVE_QUP_CORE_0] = &qup0_core_slave, 232 + [SLAVE_QUP_CORE_1] = &qup1_core_slave, 233 + [SLAVE_EBI_CH0] = &ebi, 234 + }; 235 + 236 + static const struct qcom_icc_desc sm6350_clk_virt = { 237 + .nodes = clk_virt_nodes, 238 + .num_nodes = ARRAY_SIZE(clk_virt_nodes), 239 + .bcms = clk_virt_bcms, 240 + .num_bcms = ARRAY_SIZE(clk_virt_bcms), 241 + }; 242 + 243 + static struct qcom_icc_bcm * const compute_noc_bcms[] = { 244 + &bcm_co0, 245 + &bcm_co2, 246 + &bcm_co3, 247 + }; 248 + 249 + static struct qcom_icc_node * const compute_noc_nodes[] = { 250 + [MASTER_NPU] = &qnm_npu, 251 + [MASTER_NPU_PROC] = &qxm_npu_dsp, 252 + [SLAVE_CDSP_GEM_NOC] = &qns_cdsp_gemnoc, 253 + }; 254 + 255 + static const struct qcom_icc_desc sm6350_compute_noc = { 256 + .nodes = compute_noc_nodes, 257 + .num_nodes = ARRAY_SIZE(compute_noc_nodes), 258 + .bcms = compute_noc_bcms, 259 + .num_bcms = ARRAY_SIZE(compute_noc_bcms), 260 + }; 261 + 262 + static struct qcom_icc_bcm * const config_noc_bcms[] = { 263 + &bcm_cn0, 264 + &bcm_cn1, 265 + }; 266 + 267 + static struct qcom_icc_node * const config_noc_nodes[] = { 268 + [SNOC_CNOC_MAS] = &qnm_snoc, 269 + [MASTER_QDSS_DAP] = &xm_qdss_dap, 270 + [SLAVE_A1NOC_CFG] = &qhs_a1_noc_cfg, 271 + [SLAVE_A2NOC_CFG] = &qhs_a2_noc_cfg, 272 + [SLAVE_AHB2PHY] = &qhs_ahb2phy0, 273 + [SLAVE_AHB2PHY_2] = &qhs_ahb2phy2, 274 + [SLAVE_AOSS] = &qhs_aoss, 275 + [SLAVE_BOOT_ROM] = &qhs_boot_rom, 276 + [SLAVE_CAMERA_CFG] = &qhs_camera_cfg, 277 + [SLAVE_CAMERA_NRT_THROTTLE_CFG] = &qhs_camera_nrt_thrott_cfg, 278 + [SLAVE_CAMERA_RT_THROTTLE_CFG] = &qhs_camera_rt_throttle_cfg, 279 + [SLAVE_CLK_CTL] = &qhs_clk_ctl, 280 + [SLAVE_RBCPR_CX_CFG] = &qhs_cpr_cx, 281 + [SLAVE_RBCPR_MX_CFG] = &qhs_cpr_mx, 282 + [SLAVE_CRYPTO_0_CFG] = &qhs_crypto0_cfg, 283 + [SLAVE_DCC_CFG] = &qhs_dcc_cfg, 284 + [SLAVE_CNOC_DDRSS] = &qhs_ddrss_cfg, 285 + [SLAVE_DISPLAY_CFG] = &qhs_display_cfg, 286 + [SLAVE_DISPLAY_THROTTLE_CFG] = &qhs_display_throttle_cfg, 287 + [SLAVE_EMMC_CFG] = &qhs_emmc_cfg, 288 + [SLAVE_GLM] = &qhs_glm, 289 + [SLAVE_GRAPHICS_3D_CFG] = &qhs_gpuss_cfg, 290 + [SLAVE_IMEM_CFG] = &qhs_imem_cfg, 291 + [SLAVE_IPA_CFG] = &qhs_ipa, 292 + [SLAVE_CNOC_MNOC_CFG] = &qhs_mnoc_cfg, 293 + [SLAVE_CNOC_MSS] = &qhs_mss_cfg, 294 + [SLAVE_NPU_CFG] = &qhs_npu_cfg, 295 + [SLAVE_PDM] = &qhs_pdm, 296 + [SLAVE_PIMEM_CFG] = &qhs_pimem_cfg, 297 + [SLAVE_PRNG] = &qhs_prng, 298 + [SLAVE_QDSS_CFG] = &qhs_qdss_cfg, 299 + [SLAVE_QM_CFG] = &qhs_qm_cfg, 300 + [SLAVE_QM_MPU_CFG] = &qhs_qm_mpu_cfg, 301 + [SLAVE_QUP_0] = &qhs_qup0, 302 + [SLAVE_QUP_1] = &qhs_qup1, 303 + [SLAVE_SDCC_2] = &qhs_sdc2, 304 + [SLAVE_SECURITY] = &qhs_security, 305 + [SLAVE_SNOC_CFG] = &qhs_snoc_cfg, 306 + [SLAVE_TCSR] = &qhs_tcsr, 307 + [SLAVE_UFS_MEM_CFG] = &qhs_ufs_mem_cfg, 308 + [SLAVE_USB3] = &qhs_usb3_0, 309 + [SLAVE_VENUS_CFG] = &qhs_venus_cfg, 310 + [SLAVE_VENUS_THROTTLE_CFG] = &qhs_venus_throttle_cfg, 311 + [SLAVE_VSENSE_CTRL_CFG] = &qhs_vsense_ctrl_cfg, 312 + [SLAVE_SERVICE_CNOC] = &srvc_cnoc, 313 + }; 314 + 315 + static const struct qcom_icc_desc sm6350_config_noc = { 316 + .nodes = config_noc_nodes, 317 + .num_nodes = ARRAY_SIZE(config_noc_nodes), 318 + .bcms = config_noc_bcms, 319 + .num_bcms = ARRAY_SIZE(config_noc_bcms), 320 + }; 321 + 322 + static struct qcom_icc_bcm * const dc_noc_bcms[] = { 323 + }; 324 + 325 + static struct qcom_icc_node * const dc_noc_nodes[] = { 326 + [MASTER_CNOC_DC_NOC] = &qhm_cnoc_dc_noc, 327 + [SLAVE_GEM_NOC_CFG] = &qhs_gemnoc, 328 + [SLAVE_LLCC_CFG] = &qhs_llcc, 329 + }; 330 + 331 + static const struct qcom_icc_desc sm6350_dc_noc = { 332 + .nodes = dc_noc_nodes, 333 + .num_nodes = ARRAY_SIZE(dc_noc_nodes), 334 + .bcms = dc_noc_bcms, 335 + .num_bcms = ARRAY_SIZE(dc_noc_bcms), 336 + }; 337 + 338 + static struct qcom_icc_bcm * const gem_noc_bcms[] = { 339 + &bcm_sh0, 340 + &bcm_sh2, 341 + &bcm_sh3, 342 + &bcm_sh4, 343 + }; 344 + 345 + static struct qcom_icc_node * const gem_noc_nodes[] = { 346 + [MASTER_AMPSS_M0] = &acm_apps, 347 + [MASTER_SYS_TCU] = &acm_sys_tcu, 348 + [MASTER_GEM_NOC_CFG] = &qhm_gemnoc_cfg, 349 + [MASTER_COMPUTE_NOC] = &qnm_cmpnoc, 350 + [MASTER_MNOC_HF_MEM_NOC] = &qnm_mnoc_hf, 351 + [MASTER_MNOC_SF_MEM_NOC] = &qnm_mnoc_sf, 352 + [MASTER_SNOC_GC_MEM_NOC] = &qnm_snoc_gc, 353 + [MASTER_SNOC_SF_MEM_NOC] = &qnm_snoc_sf, 354 + [MASTER_GRAPHICS_3D] = &qxm_gpu, 355 + [SLAVE_MCDMA_MS_MPU_CFG] = &qhs_mcdma_ms_mpu_cfg, 356 + [SLAVE_MSS_PROC_MS_MPU_CFG] = &qhs_mdsp_ms_mpu_cfg, 357 + [SLAVE_GEM_NOC_SNOC] = &qns_gem_noc_snoc, 358 + [SLAVE_LLCC] = &qns_llcc, 359 + [SLAVE_SERVICE_GEM_NOC] = &srvc_gemnoc, 360 + }; 361 + 362 + static const struct qcom_icc_desc sm6350_gem_noc = { 363 + .nodes = gem_noc_nodes, 364 + .num_nodes = ARRAY_SIZE(gem_noc_nodes), 365 + .bcms = gem_noc_bcms, 366 + .num_bcms = ARRAY_SIZE(gem_noc_bcms), 367 + }; 368 + 369 + static struct qcom_icc_bcm * const mmss_noc_bcms[] = { 370 + &bcm_mm0, 371 + &bcm_mm1, 372 + &bcm_mm2, 373 + &bcm_mm3, 374 + }; 375 + 376 + static struct qcom_icc_node * const mmss_noc_nodes[] = { 377 + [MASTER_CNOC_MNOC_CFG] = &qhm_mnoc_cfg, 378 + [MASTER_VIDEO_P0] = &qnm_video0, 379 + [MASTER_VIDEO_PROC] = &qnm_video_cvp, 380 + [MASTER_CAMNOC_HF] = &qxm_camnoc_hf, 381 + [MASTER_CAMNOC_ICP] = &qxm_camnoc_icp, 382 + [MASTER_CAMNOC_SF] = &qxm_camnoc_sf, 383 + [MASTER_MDP_PORT0] = &qxm_mdp0, 384 + [SLAVE_MNOC_HF_MEM_NOC] = &qns_mem_noc_hf, 385 + [SLAVE_MNOC_SF_MEM_NOC] = &qns_mem_noc_sf, 386 + [SLAVE_SERVICE_MNOC] = &srvc_mnoc, 387 + }; 388 + 389 + static const struct qcom_icc_desc sm6350_mmss_noc = { 390 + .nodes = mmss_noc_nodes, 391 + .num_nodes = ARRAY_SIZE(mmss_noc_nodes), 392 + .bcms = mmss_noc_bcms, 393 + .num_bcms = ARRAY_SIZE(mmss_noc_bcms), 394 + }; 395 + 396 + static struct qcom_icc_bcm * const npu_noc_bcms[] = { 397 + }; 398 + 399 + static struct qcom_icc_node * const npu_noc_nodes[] = { 400 + [MASTER_NPU_SYS] = &amm_npu_sys, 401 + [MASTER_NPU_NOC_CFG] = &qhm_npu_cfg, 402 + [SLAVE_NPU_CAL_DP0] = &qhs_cal_dp0, 403 + [SLAVE_NPU_CP] = &qhs_cp, 404 + [SLAVE_NPU_INT_DMA_BWMON_CFG] = &qhs_dma_bwmon, 405 + [SLAVE_NPU_DPM] = &qhs_dpm, 406 + [SLAVE_ISENSE_CFG] = &qhs_isense, 407 + [SLAVE_NPU_LLM_CFG] = &qhs_llm, 408 + [SLAVE_NPU_TCM] = &qhs_tcm, 409 + [SLAVE_NPU_COMPUTE_NOC] = &qns_npu_sys, 410 + [SLAVE_SERVICE_NPU_NOC] = &srvc_noc, 411 + }; 412 + 413 + static const struct qcom_icc_desc sm6350_npu_noc = { 414 + .nodes = npu_noc_nodes, 415 + .num_nodes = ARRAY_SIZE(npu_noc_nodes), 416 + .bcms = npu_noc_bcms, 417 + .num_bcms = ARRAY_SIZE(npu_noc_bcms), 418 + }; 419 + 420 + static struct qcom_icc_bcm * const system_noc_bcms[] = { 421 + &bcm_sn0, 422 + &bcm_sn1, 423 + &bcm_sn10, 424 + &bcm_sn2, 425 + &bcm_sn3, 426 + &bcm_sn4, 427 + &bcm_sn5, 428 + &bcm_sn6, 429 + }; 430 + 431 + static struct qcom_icc_node * const system_noc_nodes[] = { 432 + [MASTER_SNOC_CFG] = &qhm_snoc_cfg, 433 + [A1NOC_SNOC_MAS] = &qnm_aggre1_noc, 434 + [A2NOC_SNOC_MAS] = &qnm_aggre2_noc, 435 + [MASTER_GEM_NOC_SNOC] = &qnm_gemnoc, 436 + [MASTER_PIMEM] = &qxm_pimem, 437 + [MASTER_GIC] = &xm_gic, 438 + [SLAVE_APPSS] = &qhs_apss, 439 + [SNOC_CNOC_SLV] = &qns_cnoc, 440 + [SLAVE_SNOC_GEM_NOC_GC] = &qns_gemnoc_gc, 441 + [SLAVE_SNOC_GEM_NOC_SF] = &qns_gemnoc_sf, 442 + [SLAVE_OCIMEM] = &qxs_imem, 443 + [SLAVE_PIMEM] = &qxs_pimem, 444 + [SLAVE_SERVICE_SNOC] = &srvc_snoc, 445 + [SLAVE_QDSS_STM] = &xs_qdss_stm, 446 + [SLAVE_TCU] = &xs_sys_tcu_cfg, 447 + }; 448 + 449 + static const struct qcom_icc_desc sm6350_system_noc = { 450 + .nodes = system_noc_nodes, 451 + .num_nodes = ARRAY_SIZE(system_noc_nodes), 452 + .bcms = system_noc_bcms, 453 + .num_bcms = ARRAY_SIZE(system_noc_bcms), 454 + }; 455 + 456 + static const struct of_device_id qnoc_of_match[] = { 457 + { .compatible = "qcom,sm6350-aggre1-noc", 458 + .data = &sm6350_aggre1_noc}, 459 + { .compatible = "qcom,sm6350-aggre2-noc", 460 + .data = &sm6350_aggre2_noc}, 461 + { .compatible = "qcom,sm6350-clk-virt", 462 + .data = &sm6350_clk_virt}, 463 + { .compatible = "qcom,sm6350-compute-noc", 464 + .data = &sm6350_compute_noc}, 465 + { .compatible = "qcom,sm6350-config-noc", 466 + .data = &sm6350_config_noc}, 467 + { .compatible = "qcom,sm6350-dc-noc", 468 + .data = &sm6350_dc_noc}, 469 + { .compatible = "qcom,sm6350-gem-noc", 470 + .data = &sm6350_gem_noc}, 471 + { .compatible = "qcom,sm6350-mmss-noc", 472 + .data = &sm6350_mmss_noc}, 473 + { .compatible = "qcom,sm6350-npu-noc", 474 + .data = &sm6350_npu_noc}, 475 + { .compatible = "qcom,sm6350-system-noc", 476 + .data = &sm6350_system_noc}, 477 + { } 478 + }; 479 + MODULE_DEVICE_TABLE(of, qnoc_of_match); 480 + 481 + static struct platform_driver qnoc_driver = { 482 + .probe = qcom_icc_rpmh_probe, 483 + .remove = qcom_icc_rpmh_remove, 484 + .driver = { 485 + .name = "qnoc-sm6350", 486 + .of_match_table = qnoc_of_match, 487 + .sync_state = icc_sync_state, 488 + }, 489 + }; 490 + module_platform_driver(qnoc_driver); 491 + 492 + MODULE_DESCRIPTION("Qualcomm SM6350 NoC driver"); 493 + MODULE_LICENSE("GPL v2");
+139
drivers/interconnect/qcom/sm6350.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Qualcomm #define SM6350 interconnect IDs 4 + * 5 + * Copyright (C) 2022 Luca Weiss <luca.weiss@fairphone.com> 6 + */ 7 + 8 + #ifndef __DRIVERS_INTERCONNECT_QCOM_SM6350_H 9 + #define __DRIVERS_INTERCONNECT_QCOM_SM6350_H 10 + 11 + #define SM6350_A1NOC_SNOC_MAS 0 12 + #define SM6350_A1NOC_SNOC_SLV 1 13 + #define SM6350_A2NOC_SNOC_MAS 2 14 + #define SM6350_A2NOC_SNOC_SLV 3 15 + #define SM6350_MASTER_A1NOC_CFG 4 16 + #define SM6350_MASTER_A2NOC_CFG 5 17 + #define SM6350_MASTER_AMPSS_M0 6 18 + #define SM6350_MASTER_CAMNOC_HF 7 19 + #define SM6350_MASTER_CAMNOC_HF0_UNCOMP 8 20 + #define SM6350_MASTER_CAMNOC_ICP 9 21 + #define SM6350_MASTER_CAMNOC_ICP_UNCOMP 10 22 + #define SM6350_MASTER_CAMNOC_SF 11 23 + #define SM6350_MASTER_CAMNOC_SF_UNCOMP 12 24 + #define SM6350_MASTER_CNOC_DC_NOC 13 25 + #define SM6350_MASTER_CNOC_MNOC_CFG 14 26 + #define SM6350_MASTER_COMPUTE_NOC 15 27 + #define SM6350_MASTER_CRYPTO_CORE_0 16 28 + #define SM6350_MASTER_EMMC 17 29 + #define SM6350_MASTER_GEM_NOC_CFG 18 30 + #define SM6350_MASTER_GEM_NOC_SNOC 19 31 + #define SM6350_MASTER_GIC 20 32 + #define SM6350_MASTER_GRAPHICS_3D 21 33 + #define SM6350_MASTER_IPA 22 34 + #define SM6350_MASTER_LLCC 23 35 + #define SM6350_MASTER_MDP_PORT0 24 36 + #define SM6350_MASTER_MNOC_HF_MEM_NOC 25 37 + #define SM6350_MASTER_MNOC_SF_MEM_NOC 26 38 + #define SM6350_MASTER_NPU 27 39 + #define SM6350_MASTER_NPU_NOC_CFG 28 40 + #define SM6350_MASTER_NPU_PROC 29 41 + #define SM6350_MASTER_NPU_SYS 30 42 + #define SM6350_MASTER_PIMEM 31 43 + #define SM6350_MASTER_QDSS_BAM 32 44 + #define SM6350_MASTER_QDSS_DAP 33 45 + #define SM6350_MASTER_QDSS_ETR 34 46 + #define SM6350_MASTER_QUP_0 35 47 + #define SM6350_MASTER_QUP_1 36 48 + #define SM6350_MASTER_QUP_CORE_0 37 49 + #define SM6350_MASTER_QUP_CORE_1 38 50 + #define SM6350_MASTER_SDCC_2 39 51 + #define SM6350_MASTER_SNOC_CFG 40 52 + #define SM6350_MASTER_SNOC_GC_MEM_NOC 41 53 + #define SM6350_MASTER_SNOC_SF_MEM_NOC 42 54 + #define SM6350_MASTER_SYS_TCU 43 55 + #define SM6350_MASTER_UFS_MEM 44 56 + #define SM6350_MASTER_USB3 45 57 + #define SM6350_MASTER_VIDEO_P0 46 58 + #define SM6350_MASTER_VIDEO_PROC 47 59 + #define SM6350_SLAVE_A1NOC_CFG 48 60 + #define SM6350_SLAVE_A2NOC_CFG 49 61 + #define SM6350_SLAVE_AHB2PHY 50 62 + #define SM6350_SLAVE_AHB2PHY_2 51 63 + #define SM6350_SLAVE_AOSS 52 64 + #define SM6350_SLAVE_APPSS 53 65 + #define SM6350_SLAVE_BOOT_ROM 54 66 + #define SM6350_SLAVE_CAMERA_CFG 55 67 + #define SM6350_SLAVE_CAMERA_NRT_THROTTLE_CFG 56 68 + #define SM6350_SLAVE_CAMERA_RT_THROTTLE_CFG 57 69 + #define SM6350_SLAVE_CAMNOC_UNCOMP 58 70 + #define SM6350_SLAVE_CDSP_GEM_NOC 59 71 + #define SM6350_SLAVE_CLK_CTL 60 72 + #define SM6350_SLAVE_CNOC_DDRSS 61 73 + #define SM6350_SLAVE_CNOC_MNOC_CFG 62 74 + #define SM6350_SLAVE_CNOC_MSS 63 75 + #define SM6350_SLAVE_CRYPTO_0_CFG 64 76 + #define SM6350_SLAVE_DCC_CFG 65 77 + #define SM6350_SLAVE_DISPLAY_CFG 66 78 + #define SM6350_SLAVE_DISPLAY_THROTTLE_CFG 67 79 + #define SM6350_SLAVE_EBI_CH0 68 80 + #define SM6350_SLAVE_EMMC_CFG 69 81 + #define SM6350_SLAVE_GEM_NOC_CFG 70 82 + #define SM6350_SLAVE_GEM_NOC_SNOC 71 83 + #define SM6350_SLAVE_GLM 72 84 + #define SM6350_SLAVE_GRAPHICS_3D_CFG 73 85 + #define SM6350_SLAVE_IMEM_CFG 74 86 + #define SM6350_SLAVE_IPA_CFG 75 87 + #define SM6350_SLAVE_ISENSE_CFG 76 88 + #define SM6350_SLAVE_LLCC 77 89 + #define SM6350_SLAVE_LLCC_CFG 78 90 + #define SM6350_SLAVE_MCDMA_MS_MPU_CFG 79 91 + #define SM6350_SLAVE_MNOC_HF_MEM_NOC 80 92 + #define SM6350_SLAVE_MNOC_SF_MEM_NOC 81 93 + #define SM6350_SLAVE_MSS_PROC_MS_MPU_CFG 82 94 + #define SM6350_SLAVE_NPU_CAL_DP0 83 95 + #define SM6350_SLAVE_NPU_CFG 84 96 + #define SM6350_SLAVE_NPU_COMPUTE_NOC 85 97 + #define SM6350_SLAVE_NPU_CP 86 98 + #define SM6350_SLAVE_NPU_DPM 87 99 + #define SM6350_SLAVE_NPU_INT_DMA_BWMON_CFG 88 100 + #define SM6350_SLAVE_NPU_LLM_CFG 89 101 + #define SM6350_SLAVE_NPU_TCM 90 102 + #define SM6350_SLAVE_OCIMEM 91 103 + #define SM6350_SLAVE_PDM 92 104 + #define SM6350_SLAVE_PIMEM 93 105 + #define SM6350_SLAVE_PIMEM_CFG 94 106 + #define SM6350_SLAVE_PRNG 95 107 + #define SM6350_SLAVE_QDSS_CFG 96 108 + #define SM6350_SLAVE_QDSS_STM 97 109 + #define SM6350_SLAVE_QM_CFG 98 110 + #define SM6350_SLAVE_QM_MPU_CFG 99 111 + #define SM6350_SLAVE_QUP_0 100 112 + #define SM6350_SLAVE_QUP_1 101 113 + #define SM6350_SLAVE_QUP_CORE_0 102 114 + #define SM6350_SLAVE_QUP_CORE_1 103 115 + #define SM6350_SLAVE_RBCPR_CX_CFG 104 116 + #define SM6350_SLAVE_RBCPR_MX_CFG 105 117 + #define SM6350_SLAVE_SDCC_2 106 118 + #define SM6350_SLAVE_SECURITY 107 119 + #define SM6350_SLAVE_SERVICE_A1NOC 108 120 + #define SM6350_SLAVE_SERVICE_A2NOC 109 121 + #define SM6350_SLAVE_SERVICE_CNOC 110 122 + #define SM6350_SLAVE_SERVICE_GEM_NOC 111 123 + #define SM6350_SLAVE_SERVICE_MNOC 112 124 + #define SM6350_SLAVE_SERVICE_NPU_NOC 113 125 + #define SM6350_SLAVE_SERVICE_SNOC 114 126 + #define SM6350_SLAVE_SNOC_CFG 115 127 + #define SM6350_SLAVE_SNOC_GEM_NOC_GC 116 128 + #define SM6350_SLAVE_SNOC_GEM_NOC_SF 117 129 + #define SM6350_SLAVE_TCSR 118 130 + #define SM6350_SLAVE_TCU 119 131 + #define SM6350_SLAVE_UFS_MEM_CFG 120 132 + #define SM6350_SLAVE_USB3 121 133 + #define SM6350_SLAVE_VENUS_CFG 122 134 + #define SM6350_SLAVE_VENUS_THROTTLE_CFG 123 135 + #define SM6350_SLAVE_VSENSE_CTRL_CFG 124 136 + #define SM6350_SNOC_CNOC_MAS 125 137 + #define SM6350_SNOC_CNOC_SLV 126 138 + 139 + #endif
+1
drivers/interconnect/qcom/sm8450.c
··· 12 12 #include <dt-bindings/interconnect/qcom,sm8450.h> 13 13 14 14 #include "bcm-voter.h" 15 + #include "icc-common.h" 15 16 #include "icc-rpmh.h" 16 17 #include "sm8450.h" 17 18
+59
include/dt-bindings/interconnect/fsl,imx8mp.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 + /* 3 + * Interconnect framework driver for i.MX SoC 4 + * 5 + * Copyright 2022 NXP 6 + * Peng Fan <peng.fan@nxp.com> 7 + */ 8 + 9 + #ifndef __DT_BINDINGS_INTERCONNECT_IMX8MP_H 10 + #define __DT_BINDINGS_INTERCONNECT_IMX8MP_H 11 + 12 + #define IMX8MP_ICN_NOC 0 13 + #define IMX8MP_ICN_MAIN 1 14 + #define IMX8MP_ICS_DRAM 2 15 + #define IMX8MP_ICS_OCRAM 3 16 + #define IMX8MP_ICM_A53 4 17 + #define IMX8MP_ICM_SUPERMIX 5 18 + #define IMX8MP_ICM_GIC 6 19 + #define IMX8MP_ICM_MLMIX 7 20 + 21 + #define IMX8MP_ICN_AUDIO 8 22 + #define IMX8MP_ICM_DSP 9 23 + #define IMX8MP_ICM_SDMA2PER 10 24 + #define IMX8MP_ICM_SDMA2BURST 11 25 + #define IMX8MP_ICM_SDMA3PER 12 26 + #define IMX8MP_ICM_SDMA3BURST 13 27 + #define IMX8MP_ICM_EDMA 14 28 + 29 + #define IMX8MP_ICN_GPU 15 30 + #define IMX8MP_ICM_GPU2D 16 31 + #define IMX8MP_ICM_GPU3D 17 32 + 33 + #define IMX8MP_ICN_HDMI 18 34 + #define IMX8MP_ICM_HRV 19 35 + #define IMX8MP_ICM_LCDIF_HDMI 20 36 + #define IMX8MP_ICM_HDCP 21 37 + 38 + #define IMX8MP_ICN_HSIO 22 39 + #define IMX8MP_ICM_NOC_PCIE 23 40 + #define IMX8MP_ICM_USB1 24 41 + #define IMX8MP_ICM_USB2 25 42 + #define IMX8MP_ICM_PCIE 26 43 + 44 + #define IMX8MP_ICN_MEDIA 27 45 + #define IMX8MP_ICM_LCDIF_RD 28 46 + #define IMX8MP_ICM_LCDIF_WR 29 47 + #define IMX8MP_ICM_ISI0 30 48 + #define IMX8MP_ICM_ISI1 31 49 + #define IMX8MP_ICM_ISI2 32 50 + #define IMX8MP_ICM_ISP0 33 51 + #define IMX8MP_ICM_ISP1 34 52 + #define IMX8MP_ICM_DWE 35 53 + 54 + #define IMX8MP_ICN_VIDEO 36 55 + #define IMX8MP_ICM_VPU_G1 37 56 + #define IMX8MP_ICM_VPU_G2 38 57 + #define IMX8MP_ICM_VPU_H1 39 58 + 59 + #endif /* __DT_BINDINGS_INTERCONNECT_IMX8MP_H */
+148
include/dt-bindings/interconnect/qcom,sm6350.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2 + /* 3 + * Qualcomm SM6350 interconnect IDs 4 + * 5 + * Copyright (C) 2022 Luca Weiss <luca.weiss@fairphone.com> 6 + */ 7 + 8 + #ifndef __DT_BINDINGS_INTERCONNECT_QCOM_SM6350_H 9 + #define __DT_BINDINGS_INTERCONNECT_QCOM_SM6350_H 10 + 11 + #define MASTER_A1NOC_CFG 0 12 + #define MASTER_QUP_0 1 13 + #define MASTER_EMMC 2 14 + #define MASTER_UFS_MEM 3 15 + #define A1NOC_SNOC_SLV 4 16 + #define SLAVE_SERVICE_A1NOC 5 17 + 18 + #define MASTER_A2NOC_CFG 0 19 + #define MASTER_QDSS_BAM 1 20 + #define MASTER_QUP_1 2 21 + #define MASTER_CRYPTO_CORE_0 3 22 + #define MASTER_IPA 4 23 + #define MASTER_QDSS_ETR 5 24 + #define MASTER_SDCC_2 6 25 + #define MASTER_USB3 7 26 + #define A2NOC_SNOC_SLV 8 27 + #define SLAVE_SERVICE_A2NOC 9 28 + 29 + #define MASTER_CAMNOC_HF0_UNCOMP 0 30 + #define MASTER_CAMNOC_ICP_UNCOMP 1 31 + #define MASTER_CAMNOC_SF_UNCOMP 2 32 + #define MASTER_QUP_CORE_0 3 33 + #define MASTER_QUP_CORE_1 4 34 + #define MASTER_LLCC 5 35 + #define SLAVE_CAMNOC_UNCOMP 6 36 + #define SLAVE_QUP_CORE_0 7 37 + #define SLAVE_QUP_CORE_1 8 38 + #define SLAVE_EBI_CH0 9 39 + 40 + #define MASTER_NPU 0 41 + #define MASTER_NPU_PROC 1 42 + #define SLAVE_CDSP_GEM_NOC 2 43 + 44 + #define SNOC_CNOC_MAS 0 45 + #define MASTER_QDSS_DAP 1 46 + #define SLAVE_A1NOC_CFG 2 47 + #define SLAVE_A2NOC_CFG 3 48 + #define SLAVE_AHB2PHY 4 49 + #define SLAVE_AHB2PHY_2 5 50 + #define SLAVE_AOSS 6 51 + #define SLAVE_BOOT_ROM 7 52 + #define SLAVE_CAMERA_CFG 8 53 + #define SLAVE_CAMERA_NRT_THROTTLE_CFG 9 54 + #define SLAVE_CAMERA_RT_THROTTLE_CFG 10 55 + #define SLAVE_CLK_CTL 11 56 + #define SLAVE_RBCPR_CX_CFG 12 57 + #define SLAVE_RBCPR_MX_CFG 13 58 + #define SLAVE_CRYPTO_0_CFG 14 59 + #define SLAVE_DCC_CFG 15 60 + #define SLAVE_CNOC_DDRSS 16 61 + #define SLAVE_DISPLAY_CFG 17 62 + #define SLAVE_DISPLAY_THROTTLE_CFG 18 63 + #define SLAVE_EMMC_CFG 19 64 + #define SLAVE_GLM 20 65 + #define SLAVE_GRAPHICS_3D_CFG 21 66 + #define SLAVE_IMEM_CFG 22 67 + #define SLAVE_IPA_CFG 23 68 + #define SLAVE_CNOC_MNOC_CFG 24 69 + #define SLAVE_CNOC_MSS 25 70 + #define SLAVE_NPU_CFG 26 71 + #define SLAVE_PDM 27 72 + #define SLAVE_PIMEM_CFG 28 73 + #define SLAVE_PRNG 29 74 + #define SLAVE_QDSS_CFG 30 75 + #define SLAVE_QM_CFG 31 76 + #define SLAVE_QM_MPU_CFG 32 77 + #define SLAVE_QUP_0 33 78 + #define SLAVE_QUP_1 34 79 + #define SLAVE_SDCC_2 35 80 + #define SLAVE_SECURITY 36 81 + #define SLAVE_SNOC_CFG 37 82 + #define SLAVE_TCSR 38 83 + #define SLAVE_UFS_MEM_CFG 39 84 + #define SLAVE_USB3 40 85 + #define SLAVE_VENUS_CFG 41 86 + #define SLAVE_VENUS_THROTTLE_CFG 42 87 + #define SLAVE_VSENSE_CTRL_CFG 43 88 + #define SLAVE_SERVICE_CNOC 44 89 + 90 + #define MASTER_CNOC_DC_NOC 0 91 + #define SLAVE_GEM_NOC_CFG 1 92 + #define SLAVE_LLCC_CFG 2 93 + 94 + #define MASTER_AMPSS_M0 0 95 + #define MASTER_SYS_TCU 1 96 + #define MASTER_GEM_NOC_CFG 2 97 + #define MASTER_COMPUTE_NOC 3 98 + #define MASTER_MNOC_HF_MEM_NOC 4 99 + #define MASTER_MNOC_SF_MEM_NOC 5 100 + #define MASTER_SNOC_GC_MEM_NOC 6 101 + #define MASTER_SNOC_SF_MEM_NOC 7 102 + #define MASTER_GRAPHICS_3D 8 103 + #define SLAVE_MCDMA_MS_MPU_CFG 9 104 + #define SLAVE_MSS_PROC_MS_MPU_CFG 10 105 + #define SLAVE_GEM_NOC_SNOC 11 106 + #define SLAVE_LLCC 12 107 + #define SLAVE_SERVICE_GEM_NOC 13 108 + 109 + #define MASTER_CNOC_MNOC_CFG 0 110 + #define MASTER_VIDEO_P0 1 111 + #define MASTER_VIDEO_PROC 2 112 + #define MASTER_CAMNOC_HF 3 113 + #define MASTER_CAMNOC_ICP 4 114 + #define MASTER_CAMNOC_SF 5 115 + #define MASTER_MDP_PORT0 6 116 + #define SLAVE_MNOC_HF_MEM_NOC 7 117 + #define SLAVE_MNOC_SF_MEM_NOC 8 118 + #define SLAVE_SERVICE_MNOC 9 119 + 120 + #define MASTER_NPU_SYS 0 121 + #define MASTER_NPU_NOC_CFG 1 122 + #define SLAVE_NPU_CAL_DP0 2 123 + #define SLAVE_NPU_CP 3 124 + #define SLAVE_NPU_INT_DMA_BWMON_CFG 4 125 + #define SLAVE_NPU_DPM 5 126 + #define SLAVE_ISENSE_CFG 6 127 + #define SLAVE_NPU_LLM_CFG 7 128 + #define SLAVE_NPU_TCM 8 129 + #define SLAVE_NPU_COMPUTE_NOC 9 130 + #define SLAVE_SERVICE_NPU_NOC 10 131 + 132 + #define MASTER_SNOC_CFG 0 133 + #define A1NOC_SNOC_MAS 1 134 + #define A2NOC_SNOC_MAS 2 135 + #define MASTER_GEM_NOC_SNOC 3 136 + #define MASTER_PIMEM 4 137 + #define MASTER_GIC 5 138 + #define SLAVE_APPSS 6 139 + #define SNOC_CNOC_SLV 7 140 + #define SLAVE_SNOC_GEM_NOC_GC 8 141 + #define SLAVE_SNOC_GEM_NOC_SF 9 142 + #define SLAVE_OCIMEM 10 143 + #define SLAVE_PIMEM 11 144 + #define SLAVE_SERVICE_SNOC 12 145 + #define SLAVE_QDSS_STM 13 146 + #define SLAVE_TCU 14 147 + 148 + #endif
+7
include/linux/interconnect.h
··· 44 44 const int dst_id); 45 45 struct icc_path *of_icc_get(struct device *dev, const char *name); 46 46 struct icc_path *devm_of_icc_get(struct device *dev, const char *name); 47 + int devm_of_icc_bulk_get(struct device *dev, int num_paths, struct icc_bulk_data *paths); 47 48 struct icc_path *of_icc_get_by_index(struct device *dev, int idx); 48 49 void icc_put(struct icc_path *path); 49 50 int icc_enable(struct icc_path *path); ··· 113 112 } 114 113 115 114 static inline int of_icc_bulk_get(struct device *dev, int num_paths, struct icc_bulk_data *paths) 115 + { 116 + return 0; 117 + } 118 + 119 + static inline int devm_of_icc_bulk_get(struct device *dev, int num_paths, 120 + struct icc_bulk_data *paths) 116 121 { 117 122 return 0; 118 123 }