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

Merge branch 'icc-sm8250-qup' into icc-next

SM8250 (like SM8150 but unlike all other QUP-equipped SoCs) doesn't
provide a qup-core path. Adjust the bindings and drivers as necessary,
and then describe the icc paths in the device tree. This makes it possible
for interconnect sync_state succeed so long as you don't use UFS.

* icc-sm8250-qup
dt-bindings: interconnect: qcom,rpmh: Add SM8250 QUP virt
dt-bindings: interconnect: qcom,sm8250: Add QUP virt
interconnect: qcom: sm8250: Fix QUP0 nodes

Link: https://lore.kernel.org/r/20230703-topic-8250_qup_icc-v2-0-9ba0a9460be2@linaro.org
Signed-off-by: Georgi Djakov <djakov@kernel.org>

+98 -7
+14 -4
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 - 24 21 properties: 25 22 reg: 26 23 maxItems: 1 ··· 88 91 - qcom,sm8250-mc-virt 89 92 - qcom,sm8250-mmss-noc 90 93 - qcom,sm8250-npu-noc 94 + - qcom,sm8250-qup-virt 91 95 - qcom,sm8250-system-noc 92 96 - qcom,sm8350-aggre1-noc 93 97 - qcom,sm8350-aggre2-noc ··· 105 107 106 108 required: 107 109 - compatible 108 - - reg 110 + 111 + allOf: 112 + - $ref: qcom,rpmh-common.yaml# 113 + - if: 114 + not: 115 + properties: 116 + compatible: 117 + enum: 118 + - qcom,sm8250-qup-virt 119 + then: 120 + required: 121 + - reg 122 + 109 123 110 124 unevaluatedProperties: false 111 125
+71 -3
drivers/interconnect/qcom/sm8250.c
··· 165 165 DEFINE_QNODE(xs_qdss_stm, SM8250_SLAVE_QDSS_STM, 1, 4); 166 166 DEFINE_QNODE(xs_sys_tcu_cfg, SM8250_SLAVE_TCU, 1, 8); 167 167 168 + static struct qcom_icc_node qup0_core_master = { 169 + .name = "qup0_core_master", 170 + .id = SM8250_MASTER_QUP_CORE_0, 171 + .channels = 1, 172 + .buswidth = 4, 173 + .num_links = 1, 174 + .links = { SM8250_SLAVE_QUP_CORE_0 }, 175 + }; 176 + 177 + static struct qcom_icc_node qup1_core_master = { 178 + .name = "qup1_core_master", 179 + .id = SM8250_MASTER_QUP_CORE_1, 180 + .channels = 1, 181 + .buswidth = 4, 182 + .num_links = 1, 183 + .links = { SM8250_SLAVE_QUP_CORE_1 }, 184 + }; 185 + 186 + static struct qcom_icc_node qup2_core_master = { 187 + .name = "qup2_core_master", 188 + .id = SM8250_MASTER_QUP_CORE_2, 189 + .channels = 1, 190 + .buswidth = 4, 191 + .num_links = 1, 192 + .links = { SM8250_SLAVE_QUP_CORE_2 }, 193 + }; 194 + 195 + static struct qcom_icc_node qup0_core_slave = { 196 + .name = "qup0_core_slave", 197 + .id = SM8250_SLAVE_QUP_CORE_0, 198 + .channels = 1, 199 + .buswidth = 4, 200 + }; 201 + 202 + static struct qcom_icc_node qup1_core_slave = { 203 + .name = "qup1_core_slave", 204 + .id = SM8250_SLAVE_QUP_CORE_1, 205 + .channels = 1, 206 + .buswidth = 4, 207 + }; 208 + 209 + static struct qcom_icc_node qup2_core_slave = { 210 + .name = "qup2_core_slave", 211 + .id = SM8250_SLAVE_QUP_CORE_2, 212 + .channels = 1, 213 + .buswidth = 4, 214 + }; 215 + 168 216 DEFINE_QBCM(bcm_acv, "ACV", false, &ebi); 169 217 DEFINE_QBCM(bcm_mc0, "MC0", true, &ebi); 170 218 DEFINE_QBCM(bcm_sh0, "SH0", true, &qns_llcc); ··· 221 173 DEFINE_QBCM(bcm_mm1, "MM1", false, &qnm_camnoc_hf, &qxm_mdp0, &qxm_mdp1); 222 174 DEFINE_QBCM(bcm_sh2, "SH2", false, &alm_gpu_tcu, &alm_sys_tcu); 223 175 DEFINE_QBCM(bcm_mm2, "MM2", false, &qns_mem_noc_sf); 224 - DEFINE_QBCM(bcm_qup0, "QUP0", false, &qhm_qup1, &qhm_qup2, &qhm_qup0); 176 + DEFINE_QBCM(bcm_qup0, "QUP0", false, &qup0_core_master, &qup1_core_master, &qup2_core_master); 225 177 DEFINE_QBCM(bcm_sh3, "SH3", false, &qnm_cmpnoc); 226 178 DEFINE_QBCM(bcm_mm3, "MM3", false, &qnm_camnoc_icp, &qnm_camnoc_sf, &qnm_video0, &qnm_video1, &qnm_video_cvp); 227 179 DEFINE_QBCM(bcm_sh4, "SH4", false, &chm_apps); ··· 242 194 DEFINE_QBCM(bcm_sn12, "SN12", false, &qns_pcie_modem_mem_noc, &qns_pcie_mem_noc); 243 195 244 196 static struct qcom_icc_bcm * const aggre1_noc_bcms[] = { 245 - &bcm_qup0, 246 197 &bcm_sn12, 247 198 }; 248 199 ··· 270 223 271 224 static struct qcom_icc_bcm * const aggre2_noc_bcms[] = { 272 225 &bcm_ce0, 273 - &bcm_qup0, 274 226 &bcm_sn12, 227 + }; 228 + 229 + static struct qcom_icc_bcm * const qup_virt_bcms[] = { 230 + &bcm_qup0, 231 + }; 232 + 233 + static struct qcom_icc_node *qup_virt_nodes[] = { 234 + [MASTER_QUP_CORE_0] = &qup0_core_master, 235 + [MASTER_QUP_CORE_1] = &qup1_core_master, 236 + [MASTER_QUP_CORE_2] = &qup2_core_master, 237 + [SLAVE_QUP_CORE_0] = &qup0_core_slave, 238 + [SLAVE_QUP_CORE_1] = &qup1_core_slave, 239 + [SLAVE_QUP_CORE_2] = &qup2_core_slave, 240 + }; 241 + 242 + static const struct qcom_icc_desc sm8250_qup_virt = { 243 + .nodes = qup_virt_nodes, 244 + .num_nodes = ARRAY_SIZE(qup_virt_nodes), 245 + .bcms = qup_virt_bcms, 246 + .num_bcms = ARRAY_SIZE(qup_virt_bcms), 275 247 }; 276 248 277 249 static struct qcom_icc_node * const aggre2_noc_nodes[] = { ··· 585 519 .data = &sm8250_mmss_noc}, 586 520 { .compatible = "qcom,sm8250-npu-noc", 587 521 .data = &sm8250_npu_noc}, 522 + { .compatible = "qcom,sm8250-qup-virt", 523 + .data = &sm8250_qup_virt }, 588 524 { .compatible = "qcom,sm8250-system-noc", 589 525 .data = &sm8250_system_noc}, 590 526 { }
+6
drivers/interconnect/qcom/sm8250.h
··· 158 158 #define SM8250_SLAVE_VSENSE_CTRL_CFG 147 159 159 #define SM8250_SNOC_CNOC_MAS 148 160 160 #define SM8250_SNOC_CNOC_SLV 149 161 + #define SM8250_MASTER_QUP_CORE_0 150 162 + #define SM8250_MASTER_QUP_CORE_1 151 163 + #define SM8250_MASTER_QUP_CORE_2 152 164 + #define SM8250_SLAVE_QUP_CORE_0 153 165 + #define SM8250_SLAVE_QUP_CORE_1 154 166 + #define SM8250_SLAVE_QUP_CORE_2 155 161 167 162 168 #endif
+7
include/dt-bindings/interconnect/qcom,sm8250.h
··· 166 166 #define SLAVE_QDSS_STM 17 167 167 #define SLAVE_TCU 18 168 168 169 + #define MASTER_QUP_CORE_0 0 170 + #define MASTER_QUP_CORE_1 1 171 + #define MASTER_QUP_CORE_2 2 172 + #define SLAVE_QUP_CORE_0 3 173 + #define SLAVE_QUP_CORE_1 4 174 + #define SLAVE_QUP_CORE_2 5 175 + 169 176 #endif