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

Merge tag 'qcom-drivers-for-6.14' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into soc/drivers

Qualcomm driver updates for v6.14

The Qualcomm SCM drivers gains a number of fixes and improvements
related to race conditions during initialization. QSEECOM and the EFI
variable service therein is enabled for a few 8cx Gen 3 and X Elite
boards.

LLCC driver gains configuration for IPQ5424 and WRCACHE is enabled on X
Elite.

The BCM_TCS_CMD() macro is corrected and is cleaned up.

Support for SM7225 and X 1 Plus are added to the pd-mapper.

pmic_glink and the associated altmode driver are simplied using guards.

socinfo is added for QCS9075 and serial number readout on MSM8916
devices is corrected.

* tag 'qcom-drivers-for-6.14' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (29 commits)
firmware: qcom: scm: add calls for wrapped key support
soc: qcom: pd_mapper: Add SM7225 compatible
dt-bindings: firmware: qcom,scm: Document ipq5424 SCM
soc: qcom: llcc: Update configuration data for IPQ5424
dt-bindings: cache: qcom,llcc: Add IPQ5424 compatible
firmware: qcom: scm: smc: Narrow 'mempool' variable scope
firmware: qcom: scm: smc: Handle missing SCM device
firmware: qcom: scm: Cleanup global '__scm' on probe failures
firmware: qcom: scm: Fix missing read barrier in qcom_scm_get_tzmem_pool()
firmware: qcom: scm: Fix missing read barrier in qcom_scm_is_available()
soc: qcom: socinfo: add QCS9075 SoC ID
dt-bindings: arm: qcom,ids: add SoC ID for QCS9075
soc: qcom: socinfo: Avoid out of bounds read of serial number
firmware: qcom: scm: Allow QSEECOM on Huawei Matebook E Go (sc8280xp)
firmware: qcom: scm: Allow QSEECOM for Windows Dev Kit 2023
firmware: qcom: scm: Allow QSEECOM for HP Omnibook X14
soc: qcom: rmtfs: constify rmtfs_class
soc: qcom: rmtfs: allow building the module with COMPILE_TEST=y
soc: qcom: pmic_glink_altmode: simplify locking with guard()
soc: qcom: Rework BCM_TCS_CMD macro
...

Link: https://lore.kernel.org/r/20250111172901.391774-1-andersson@kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+407 -87
+18 -2
Documentation/devicetree/bindings/cache/qcom,llcc.yaml
··· 20 20 properties: 21 21 compatible: 22 22 enum: 23 + - qcom,ipq5424-llcc 23 24 - qcom,qcs615-llcc 24 25 - qcom,qcs8300-llcc 25 26 - qcom,qdu1000-llcc ··· 43 42 - qcom,x1e80100-llcc 44 43 45 44 reg: 46 - minItems: 2 45 + minItems: 1 47 46 maxItems: 10 48 47 49 48 reg-names: 50 - minItems: 2 49 + minItems: 1 51 50 maxItems: 10 52 51 53 52 interrupts: ··· 67 66 - reg-names 68 67 69 68 allOf: 69 + - if: 70 + properties: 71 + compatible: 72 + contains: 73 + enum: 74 + - qcom,ipq5424-llcc 75 + then: 76 + properties: 77 + reg: 78 + items: 79 + - description: LLCC0 base register region 80 + reg-names: 81 + items: 82 + - const: llcc0_base 83 + 70 84 - if: 71 85 properties: 72 86 compatible:
+2
Documentation/devicetree/bindings/firmware/qcom,scm.yaml
··· 26 26 - qcom,scm-ipq4019 27 27 - qcom,scm-ipq5018 28 28 - qcom,scm-ipq5332 29 + - qcom,scm-ipq5424 29 30 - qcom,scm-ipq6018 30 31 - qcom,scm-ipq806x 31 32 - qcom,scm-ipq8074 ··· 43 42 - qcom,scm-msm8996 44 43 - qcom,scm-msm8998 45 44 - qcom,scm-qcm2290 45 + - qcom,scm-qcs615 46 46 - qcom,scm-qcs8300 47 47 - qcom,scm-qdu1000 48 48 - qcom,scm-sa8255p
+2
Documentation/devicetree/bindings/interconnect/qcom,msm8998-bwmon.yaml
··· 26 26 - items: 27 27 - enum: 28 28 - qcom,qcm2290-cpu-bwmon 29 + - qcom,qcs615-cpu-bwmon 29 30 - qcom,qcs8300-cpu-bwmon 30 31 - qcom,sa8775p-cpu-bwmon 31 32 - qcom,sc7180-cpu-bwmon ··· 42 41 - const: qcom,sdm845-bwmon # BWMON v4, unified register space 43 42 - items: 44 43 - enum: 44 + - qcom,qcs615-llcc-bwmon 45 45 - qcom,qcs8300-llcc-bwmon 46 46 - qcom,sa8775p-llcc-bwmon 47 47 - qcom,sc7180-llcc-bwmon
+1
Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.yaml
··· 25 25 compatible: 26 26 items: 27 27 - enum: 28 + - qcom,qcs615-aoss-qmp 28 29 - qcom,qcs8300-aoss-qmp 29 30 - qcom,qdu1000-aoss-qmp 30 31 - qcom,sa8255p-aoss-qmp
+5 -1
drivers/firmware/qcom/qcom_scm-smc.c
··· 152 152 enum qcom_scm_convention qcom_convention, 153 153 struct qcom_scm_res *res, bool atomic) 154 154 { 155 - struct qcom_tzmem_pool *mempool = qcom_scm_get_tzmem_pool(); 156 155 int arglen = desc->arginfo & 0xf; 157 156 int i, ret; 158 157 void *args_virt __free(qcom_tzmem) = NULL; ··· 172 173 smc.args[i + SCM_SMC_FIRST_REG_IDX] = desc->args[i]; 173 174 174 175 if (unlikely(arglen > SCM_SMC_N_REG_ARGS)) { 176 + struct qcom_tzmem_pool *mempool = qcom_scm_get_tzmem_pool(); 177 + 178 + if (!mempool) 179 + return -EINVAL; 180 + 175 181 args_virt = qcom_tzmem_alloc(mempool, 176 182 SCM_SMC_N_EXT_ARGS * sizeof(u64), 177 183 flag);
+255 -16
drivers/firmware/qcom/qcom_scm.c
··· 217 217 218 218 struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void) 219 219 { 220 - return __scm ? __scm->mempool : NULL; 220 + if (!qcom_scm_is_available()) 221 + return NULL; 222 + 223 + return __scm->mempool; 221 224 } 222 225 223 226 static enum qcom_scm_convention __get_convention(void) ··· 1282 1279 } 1283 1280 EXPORT_SYMBOL_GPL(qcom_scm_ice_set_key); 1284 1281 1282 + bool qcom_scm_has_wrapped_key_support(void) 1283 + { 1284 + return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1285 + QCOM_SCM_ES_DERIVE_SW_SECRET) && 1286 + __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1287 + QCOM_SCM_ES_GENERATE_ICE_KEY) && 1288 + __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1289 + QCOM_SCM_ES_PREPARE_ICE_KEY) && 1290 + __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1291 + QCOM_SCM_ES_IMPORT_ICE_KEY); 1292 + } 1293 + EXPORT_SYMBOL_GPL(qcom_scm_has_wrapped_key_support); 1294 + 1295 + /** 1296 + * qcom_scm_derive_sw_secret() - Derive software secret from wrapped key 1297 + * @eph_key: an ephemerally-wrapped key 1298 + * @eph_key_size: size of @eph_key in bytes 1299 + * @sw_secret: output buffer for the software secret 1300 + * @sw_secret_size: size of the software secret to derive in bytes 1301 + * 1302 + * Derive a software secret from an ephemerally-wrapped key for software crypto 1303 + * operations. This is done by calling into the secure execution environment, 1304 + * which then calls into the hardware to unwrap and derive the secret. 1305 + * 1306 + * For more information on sw_secret, see the "Hardware-wrapped keys" section of 1307 + * Documentation/block/inline-encryption.rst. 1308 + * 1309 + * Return: 0 on success; -errno on failure. 1310 + */ 1311 + int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size, 1312 + u8 *sw_secret, size_t sw_secret_size) 1313 + { 1314 + struct qcom_scm_desc desc = { 1315 + .svc = QCOM_SCM_SVC_ES, 1316 + .cmd = QCOM_SCM_ES_DERIVE_SW_SECRET, 1317 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, 1318 + QCOM_SCM_RW, QCOM_SCM_VAL), 1319 + .owner = ARM_SMCCC_OWNER_SIP, 1320 + }; 1321 + int ret; 1322 + 1323 + void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1324 + eph_key_size, 1325 + GFP_KERNEL); 1326 + if (!eph_key_buf) 1327 + return -ENOMEM; 1328 + 1329 + void *sw_secret_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1330 + sw_secret_size, 1331 + GFP_KERNEL); 1332 + if (!sw_secret_buf) 1333 + return -ENOMEM; 1334 + 1335 + memcpy(eph_key_buf, eph_key, eph_key_size); 1336 + desc.args[0] = qcom_tzmem_to_phys(eph_key_buf); 1337 + desc.args[1] = eph_key_size; 1338 + desc.args[2] = qcom_tzmem_to_phys(sw_secret_buf); 1339 + desc.args[3] = sw_secret_size; 1340 + 1341 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1342 + if (!ret) 1343 + memcpy(sw_secret, sw_secret_buf, sw_secret_size); 1344 + 1345 + memzero_explicit(eph_key_buf, eph_key_size); 1346 + memzero_explicit(sw_secret_buf, sw_secret_size); 1347 + return ret; 1348 + } 1349 + EXPORT_SYMBOL_GPL(qcom_scm_derive_sw_secret); 1350 + 1351 + /** 1352 + * qcom_scm_generate_ice_key() - Generate a wrapped key for storage encryption 1353 + * @lt_key: output buffer for the long-term wrapped key 1354 + * @lt_key_size: size of @lt_key in bytes. Must be the exact wrapped key size 1355 + * used by the SoC. 1356 + * 1357 + * Generate a key using the built-in HW module in the SoC. The resulting key is 1358 + * returned wrapped with the platform-specific Key Encryption Key. 1359 + * 1360 + * Return: 0 on success; -errno on failure. 1361 + */ 1362 + int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size) 1363 + { 1364 + struct qcom_scm_desc desc = { 1365 + .svc = QCOM_SCM_SVC_ES, 1366 + .cmd = QCOM_SCM_ES_GENERATE_ICE_KEY, 1367 + .arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL), 1368 + .owner = ARM_SMCCC_OWNER_SIP, 1369 + }; 1370 + int ret; 1371 + 1372 + void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1373 + lt_key_size, 1374 + GFP_KERNEL); 1375 + if (!lt_key_buf) 1376 + return -ENOMEM; 1377 + 1378 + desc.args[0] = qcom_tzmem_to_phys(lt_key_buf); 1379 + desc.args[1] = lt_key_size; 1380 + 1381 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1382 + if (!ret) 1383 + memcpy(lt_key, lt_key_buf, lt_key_size); 1384 + 1385 + memzero_explicit(lt_key_buf, lt_key_size); 1386 + return ret; 1387 + } 1388 + EXPORT_SYMBOL_GPL(qcom_scm_generate_ice_key); 1389 + 1390 + /** 1391 + * qcom_scm_prepare_ice_key() - Re-wrap a key with the per-boot ephemeral key 1392 + * @lt_key: a long-term wrapped key 1393 + * @lt_key_size: size of @lt_key in bytes 1394 + * @eph_key: output buffer for the ephemerally-wrapped key 1395 + * @eph_key_size: size of @eph_key in bytes. Must be the exact wrapped key size 1396 + * used by the SoC. 1397 + * 1398 + * Given a long-term wrapped key, re-wrap it with the per-boot ephemeral key for 1399 + * added protection. The resulting key will only be valid for the current boot. 1400 + * 1401 + * Return: 0 on success; -errno on failure. 1402 + */ 1403 + int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size, 1404 + u8 *eph_key, size_t eph_key_size) 1405 + { 1406 + struct qcom_scm_desc desc = { 1407 + .svc = QCOM_SCM_SVC_ES, 1408 + .cmd = QCOM_SCM_ES_PREPARE_ICE_KEY, 1409 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RO, QCOM_SCM_VAL, 1410 + QCOM_SCM_RW, QCOM_SCM_VAL), 1411 + .owner = ARM_SMCCC_OWNER_SIP, 1412 + }; 1413 + int ret; 1414 + 1415 + void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1416 + lt_key_size, 1417 + GFP_KERNEL); 1418 + if (!lt_key_buf) 1419 + return -ENOMEM; 1420 + 1421 + void *eph_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1422 + eph_key_size, 1423 + GFP_KERNEL); 1424 + if (!eph_key_buf) 1425 + return -ENOMEM; 1426 + 1427 + memcpy(lt_key_buf, lt_key, lt_key_size); 1428 + desc.args[0] = qcom_tzmem_to_phys(lt_key_buf); 1429 + desc.args[1] = lt_key_size; 1430 + desc.args[2] = qcom_tzmem_to_phys(eph_key_buf); 1431 + desc.args[3] = eph_key_size; 1432 + 1433 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1434 + if (!ret) 1435 + memcpy(eph_key, eph_key_buf, eph_key_size); 1436 + 1437 + memzero_explicit(lt_key_buf, lt_key_size); 1438 + memzero_explicit(eph_key_buf, eph_key_size); 1439 + return ret; 1440 + } 1441 + EXPORT_SYMBOL_GPL(qcom_scm_prepare_ice_key); 1442 + 1443 + /** 1444 + * qcom_scm_import_ice_key() - Import key for storage encryption 1445 + * @raw_key: the raw key to import 1446 + * @raw_key_size: size of @raw_key in bytes 1447 + * @lt_key: output buffer for the long-term wrapped key 1448 + * @lt_key_size: size of @lt_key in bytes. Must be the exact wrapped key size 1449 + * used by the SoC. 1450 + * 1451 + * Import a raw key and return a long-term wrapped key. Uses the SoC's HWKM to 1452 + * wrap the raw key using the platform-specific Key Encryption Key. 1453 + * 1454 + * Return: 0 on success; -errno on failure. 1455 + */ 1456 + int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size, 1457 + u8 *lt_key, size_t lt_key_size) 1458 + { 1459 + struct qcom_scm_desc desc = { 1460 + .svc = QCOM_SCM_SVC_ES, 1461 + .cmd = QCOM_SCM_ES_IMPORT_ICE_KEY, 1462 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RO, QCOM_SCM_VAL, 1463 + QCOM_SCM_RW, QCOM_SCM_VAL), 1464 + .owner = ARM_SMCCC_OWNER_SIP, 1465 + }; 1466 + int ret; 1467 + 1468 + void *raw_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1469 + raw_key_size, 1470 + GFP_KERNEL); 1471 + if (!raw_key_buf) 1472 + return -ENOMEM; 1473 + 1474 + void *lt_key_buf __free(qcom_tzmem) = qcom_tzmem_alloc(__scm->mempool, 1475 + lt_key_size, 1476 + GFP_KERNEL); 1477 + if (!lt_key_buf) 1478 + return -ENOMEM; 1479 + 1480 + memcpy(raw_key_buf, raw_key, raw_key_size); 1481 + desc.args[0] = qcom_tzmem_to_phys(raw_key_buf); 1482 + desc.args[1] = raw_key_size; 1483 + desc.args[2] = qcom_tzmem_to_phys(lt_key_buf); 1484 + desc.args[3] = lt_key_size; 1485 + 1486 + ret = qcom_scm_call(__scm->dev, &desc, NULL); 1487 + if (!ret) 1488 + memcpy(lt_key, lt_key_buf, lt_key_size); 1489 + 1490 + memzero_explicit(raw_key_buf, raw_key_size); 1491 + memzero_explicit(lt_key_buf, lt_key_size); 1492 + return ret; 1493 + } 1494 + EXPORT_SYMBOL_GPL(qcom_scm_import_ice_key); 1495 + 1285 1496 /** 1286 1497 * qcom_scm_hdcp_available() - Check if secure environment supports HDCP. 1287 1498 * ··· 1985 1768 + any potential issues with this, only allow validated machines for now. 1986 1769 */ 1987 1770 static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = { 1771 + { .compatible = "asus,vivobook-s15" }, 1988 1772 { .compatible = "dell,xps13-9345" }, 1773 + { .compatible = "hp,omnibook-x14" }, 1774 + { .compatible = "huawei,gaokun3" }, 1989 1775 { .compatible = "lenovo,flex-5g" }, 1990 1776 { .compatible = "lenovo,thinkpad-t14s" }, 1991 1777 { .compatible = "lenovo,thinkpad-x13s", }, 1992 1778 { .compatible = "lenovo,yoga-slim7x" }, 1993 1779 { .compatible = "microsoft,arcata", }, 1780 + { .compatible = "microsoft,blackrock" }, 1994 1781 { .compatible = "microsoft,romulus13", }, 1995 1782 { .compatible = "microsoft,romulus15", }, 1996 1783 { .compatible = "qcom,sc8180x-primus" }, 1997 1784 { .compatible = "qcom,x1e001de-devkit" }, 1998 1785 { .compatible = "qcom,x1e80100-crd" }, 1999 1786 { .compatible = "qcom,x1e80100-qcp" }, 1787 + { .compatible = "qcom,x1p42100-crd" }, 2000 1788 { } 2001 1789 }; 2002 1790 ··· 2089 1867 */ 2090 1868 bool qcom_scm_is_available(void) 2091 1869 { 2092 - return !!READ_ONCE(__scm); 1870 + /* Paired with smp_store_release() in qcom_scm_probe */ 1871 + return !!smp_load_acquire(&__scm); 2093 1872 } 2094 1873 EXPORT_SYMBOL_GPL(qcom_scm_is_available); 2095 1874 ··· 2247 2024 if (ret) 2248 2025 return ret; 2249 2026 2250 - /* Let all above stores be available after this */ 2027 + /* Paired with smp_load_acquire() in qcom_scm_is_available(). */ 2251 2028 smp_store_release(&__scm, scm); 2252 2029 2253 2030 irq = platform_get_irq_optional(pdev, 0); 2254 2031 if (irq < 0) { 2255 - if (irq != -ENXIO) 2256 - return irq; 2032 + if (irq != -ENXIO) { 2033 + ret = irq; 2034 + goto err; 2035 + } 2257 2036 } else { 2258 2037 ret = devm_request_threaded_irq(__scm->dev, irq, NULL, qcom_scm_irq_handler, 2259 2038 IRQF_ONESHOT, "qcom-scm", __scm); 2260 - if (ret < 0) 2261 - return dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n"); 2039 + if (ret < 0) { 2040 + dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n"); 2041 + goto err; 2042 + } 2262 2043 } 2263 2044 2264 2045 __get_convention(); ··· 2281 2054 qcom_scm_disable_sdi(); 2282 2055 2283 2056 ret = of_reserved_mem_device_init(__scm->dev); 2284 - if (ret && ret != -ENODEV) 2285 - return dev_err_probe(__scm->dev, ret, 2286 - "Failed to setup the reserved memory region for TZ mem\n"); 2057 + if (ret && ret != -ENODEV) { 2058 + dev_err_probe(__scm->dev, ret, 2059 + "Failed to setup the reserved memory region for TZ mem\n"); 2060 + goto err; 2061 + } 2287 2062 2288 2063 ret = qcom_tzmem_enable(__scm->dev); 2289 - if (ret) 2290 - return dev_err_probe(__scm->dev, ret, 2291 - "Failed to enable the TrustZone memory allocator\n"); 2064 + if (ret) { 2065 + dev_err_probe(__scm->dev, ret, 2066 + "Failed to enable the TrustZone memory allocator\n"); 2067 + goto err; 2068 + } 2292 2069 2293 2070 memset(&pool_config, 0, sizeof(pool_config)); 2294 2071 pool_config.initial_size = 0; ··· 2300 2069 pool_config.max_size = SZ_256K; 2301 2070 2302 2071 __scm->mempool = devm_qcom_tzmem_pool_new(__scm->dev, &pool_config); 2303 - if (IS_ERR(__scm->mempool)) 2304 - return dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool), 2305 - "Failed to create the SCM memory pool\n"); 2072 + if (IS_ERR(__scm->mempool)) { 2073 + dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool), 2074 + "Failed to create the SCM memory pool\n"); 2075 + goto err; 2076 + } 2306 2077 2307 2078 /* 2308 2079 * Initialize the QSEECOM interface. ··· 2320 2087 WARN(ret < 0, "failed to initialize qseecom: %d\n", ret); 2321 2088 2322 2089 return 0; 2090 + 2091 + err: 2092 + /* Paired with smp_load_acquire() in qcom_scm_is_available(). */ 2093 + smp_store_release(&__scm, NULL); 2094 + 2095 + return ret; 2323 2096 } 2324 2097 2325 2098 static void qcom_scm_shutdown(struct platform_device *pdev)
+4
drivers/firmware/qcom/qcom_scm.h
··· 128 128 #define QCOM_SCM_SVC_ES 0x10 /* Enterprise Security */ 129 129 #define QCOM_SCM_ES_INVALIDATE_ICE_KEY 0x03 130 130 #define QCOM_SCM_ES_CONFIG_SET_ICE_KEY 0x04 131 + #define QCOM_SCM_ES_DERIVE_SW_SECRET 0x07 132 + #define QCOM_SCM_ES_GENERATE_ICE_KEY 0x08 133 + #define QCOM_SCM_ES_PREPARE_ICE_KEY 0x09 134 + #define QCOM_SCM_ES_IMPORT_ICE_KEY 0x0a 131 135 132 136 #define QCOM_SCM_SVC_HDCP 0x11 133 137 #define QCOM_SCM_HDCP_INVOKE 0x01
+1 -1
drivers/soc/qcom/Kconfig
··· 139 139 140 140 config QCOM_RMTFS_MEM 141 141 tristate "Qualcomm Remote Filesystem memory driver" 142 - depends on ARCH_QCOM 142 + depends on ARCH_QCOM || COMPILE_TEST 143 143 select QCOM_SCM 144 144 help 145 145 The Qualcomm remote filesystem memory driver is used for allocating
+56 -2
drivers/soc/qcom/llcc-qcom.c
··· 142 142 bool skip_llcc_cfg; 143 143 bool no_edac; 144 144 bool irq_configured; 145 + bool no_broadcast_register; 145 146 }; 146 147 147 148 struct qcom_sct_config { ··· 153 152 enum llcc_reg_offset { 154 153 LLCC_COMMON_HW_INFO, 155 154 LLCC_COMMON_STATUS0, 155 + }; 156 + 157 + static const struct llcc_slice_config ipq5424_data[] = { 158 + { 159 + .usecase_id = LLCC_CPUSS, 160 + .slice_id = 1, 161 + .max_cap = 768, 162 + .priority = 1, 163 + .bonus_ways = 0xFFFF, 164 + .retain_on_pc = true, 165 + .activate_on_init = true, 166 + .write_scid_cacheable_en = true, 167 + .stale_en = true, 168 + .stale_cap_en = true, 169 + .alloc_oneway_en = true, 170 + .ovcap_en = true, 171 + .ovcap_prio = true, 172 + .vict_prio = true, 173 + }, 174 + { 175 + .usecase_id = LLCC_VIDSC0, 176 + .slice_id = 2, 177 + .max_cap = 256, 178 + .priority = 2, 179 + .fixed_size = true, 180 + .bonus_ways = 0xF000, 181 + .retain_on_pc = true, 182 + .activate_on_init = true, 183 + .write_scid_cacheable_en = true, 184 + .stale_en = true, 185 + .stale_cap_en = true, 186 + }, 156 187 }; 157 188 158 189 static const struct llcc_slice_config sa8775p_data[] = { ··· 3037 3004 .fixed_size = true, 3038 3005 .bonus_ways = 0xfff, 3039 3006 .cache_mode = 0, 3007 + .activate_on_init = true, 3040 3008 }, { 3041 3009 .usecase_id = LLCC_CAMEXP0, 3042 3010 .slice_id = 4, ··· 3219 3185 }, 3220 3186 }; 3221 3187 3188 + static const struct qcom_llcc_config ipq5424_cfg[] = { 3189 + { 3190 + .sct_data = ipq5424_data, 3191 + .size = ARRAY_SIZE(ipq5424_data), 3192 + .reg_offset = llcc_v2_1_reg_offset, 3193 + .edac_reg_offset = &llcc_v2_1_edac_reg_offset, 3194 + .no_broadcast_register = true, 3195 + }, 3196 + }; 3197 + 3222 3198 static const struct qcom_llcc_config sa8775p_cfg[] = { 3223 3199 { 3224 3200 .sct_data = sa8775p_data, ··· 3402 3358 static const struct qcom_sct_config qdu1000_cfgs = { 3403 3359 .llcc_config = qdu1000_cfg, 3404 3360 .num_config = ARRAY_SIZE(qdu1000_cfg), 3361 + }; 3362 + 3363 + static const struct qcom_sct_config ipq5424_cfgs = { 3364 + .llcc_config = ipq5424_cfg, 3365 + .num_config = ARRAY_SIZE(ipq5424_cfg), 3405 3366 }; 3406 3367 3407 3368 static const struct qcom_sct_config sa8775p_cfgs = { ··· 4006 3957 4007 3958 drv_data->bcast_regmap = qcom_llcc_init_mmio(pdev, i, "llcc_broadcast_base"); 4008 3959 if (IS_ERR(drv_data->bcast_regmap)) { 4009 - ret = PTR_ERR(drv_data->bcast_regmap); 4010 - goto err; 3960 + if (cfg->no_broadcast_register) { 3961 + drv_data->bcast_regmap = regmap; 3962 + } else { 3963 + ret = PTR_ERR(drv_data->bcast_regmap); 3964 + goto err; 3965 + } 4011 3966 } 4012 3967 4013 3968 /* Extract version of the IP */ ··· 4082 4029 } 4083 4030 4084 4031 static const struct of_device_id qcom_llcc_of_match[] = { 4032 + { .compatible = "qcom,ipq5424-llcc", .data = &ipq5424_cfgs}, 4085 4033 { .compatible = "qcom,qcs615-llcc", .data = &qcs615_cfgs}, 4086 4034 { .compatible = "qcom,qcs8300-llcc", .data = &qcs8300_cfgs}, 4087 4035 { .compatible = "qcom,qdu1000-llcc", .data = &qdu1000_cfgs},
+30 -42
drivers/soc/qcom/pmic_glink.c
··· 4 4 * Copyright (c) 2022, Linaro Ltd 5 5 */ 6 6 #include <linux/auxiliary_bus.h> 7 + #include <linux/cleanup.h> 7 8 #include <linux/delay.h> 8 9 #include <linux/module.h> 9 10 #include <linux/of.h> ··· 101 100 struct pmic_glink *pg = client->pg; 102 101 unsigned long flags; 103 102 104 - mutex_lock(&pg->state_lock); 103 + guard(mutex)(&pg->state_lock); 105 104 spin_lock_irqsave(&pg->client_lock, flags); 106 105 107 106 list_add(&client->node, &pg->clients); 108 107 client->pdr_notify(client->priv, pg->client_state); 109 108 110 109 spin_unlock_irqrestore(&pg->client_lock, flags); 111 - mutex_unlock(&pg->state_lock); 112 - 113 110 } 114 111 EXPORT_SYMBOL_GPL(pmic_glink_client_register); 115 112 ··· 118 119 unsigned long start; 119 120 int ret; 120 121 121 - mutex_lock(&pg->state_lock); 122 + guard(mutex)(&pg->state_lock); 122 123 if (!pg->ept) { 123 - ret = -ECONNRESET; 124 - } else { 125 - start = jiffies; 126 - for (;;) { 127 - ret = rpmsg_send(pg->ept, data, len); 128 - if (ret != -EAGAIN) 129 - break; 130 - 131 - if (timeout_reached) { 132 - ret = -ETIMEDOUT; 133 - break; 134 - } 135 - 136 - usleep_range(1000, 5000); 137 - timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT); 138 - } 124 + return -ECONNRESET; 139 125 } 140 - mutex_unlock(&pg->state_lock); 126 + 127 + start = jiffies; 128 + for (;;) { 129 + ret = rpmsg_send(pg->ept, data, len); 130 + if (ret != -EAGAIN) 131 + break; 132 + 133 + if (timeout_reached) { 134 + ret = -ETIMEDOUT; 135 + break; 136 + } 137 + 138 + usleep_range(1000, 5000); 139 + timeout_reached = time_after(jiffies, start + PMIC_GLINK_SEND_TIMEOUT); 140 + } 141 141 142 142 return ret; 143 143 } ··· 225 227 { 226 228 struct pmic_glink *pg = priv; 227 229 228 - mutex_lock(&pg->state_lock); 230 + guard(mutex)(&pg->state_lock); 229 231 pg->pdr_state = state; 230 232 231 233 pmic_glink_state_notify_clients(pg); 232 - mutex_unlock(&pg->state_lock); 233 234 } 234 235 235 236 static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev) 236 237 { 237 238 struct pmic_glink *pg = __pmic_glink; 238 - int ret = 0; 239 239 240 - mutex_lock(&__pmic_glink_lock); 241 - if (!pg) { 242 - ret = dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n"); 243 - goto out_unlock; 244 - } 240 + guard(mutex)(&__pmic_glink_lock); 241 + pg = __pmic_glink; 242 + if (!pg) 243 + return dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n"); 245 244 246 245 dev_set_drvdata(&rpdev->dev, pg); 247 246 248 - mutex_lock(&pg->state_lock); 247 + guard(mutex)(&pg->state_lock); 249 248 pg->ept = rpdev->ept; 250 249 pmic_glink_state_notify_clients(pg); 251 - mutex_unlock(&pg->state_lock); 252 250 253 - out_unlock: 254 - mutex_unlock(&__pmic_glink_lock); 255 - return ret; 251 + return 0; 256 252 } 257 253 258 254 static void pmic_glink_rpmsg_remove(struct rpmsg_device *rpdev) 259 255 { 260 256 struct pmic_glink *pg; 261 257 262 - mutex_lock(&__pmic_glink_lock); 258 + guard(mutex)(&__pmic_glink_lock); 263 259 pg = __pmic_glink; 264 260 if (!pg) 265 - goto out_unlock; 261 + return; 266 262 267 - mutex_lock(&pg->state_lock); 263 + guard(mutex)(&pg->state_lock); 268 264 pg->ept = NULL; 269 265 pmic_glink_state_notify_clients(pg); 270 - mutex_unlock(&pg->state_lock); 271 - out_unlock: 272 - mutex_unlock(&__pmic_glink_lock); 273 266 } 274 267 275 268 static const struct rpmsg_device_id pmic_glink_rpmsg_id_match[] = { ··· 367 378 if (pg->client_mask & BIT(PMIC_GLINK_CLIENT_UCSI)) 368 379 pmic_glink_del_aux_device(pg, &pg->ucsi_aux); 369 380 370 - mutex_lock(&__pmic_glink_lock); 381 + guard(mutex)(&__pmic_glink_lock); 371 382 __pmic_glink = NULL; 372 - mutex_unlock(&__pmic_glink_lock); 373 383 } 374 384 375 385 static const unsigned long pmic_glink_sc8280xp_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
+2
drivers/soc/qcom/qcom_pd_mapper.c
··· 553 553 { .compatible = "qcom,sm4250", .data = sm6115_domains, }, 554 554 { .compatible = "qcom,sm6115", .data = sm6115_domains, }, 555 555 { .compatible = "qcom,sm6350", .data = sm6350_domains, }, 556 + { .compatible = "qcom,sm7225", .data = sm6350_domains, }, 556 557 { .compatible = "qcom,sm7325", .data = sc7280_domains, }, 557 558 { .compatible = "qcom,sm8150", .data = sm8150_domains, }, 558 559 { .compatible = "qcom,sm8250", .data = sm8250_domains, }, ··· 562 561 { .compatible = "qcom,sm8550", .data = sm8550_domains, }, 563 562 { .compatible = "qcom,sm8650", .data = sm8550_domains, }, 564 563 { .compatible = "qcom,x1e80100", .data = x1e80100_domains, }, 564 + { .compatible = "qcom,x1p42100", .data = x1e80100_domains, }, 565 565 {}, 566 566 }; 567 567
+1 -1
drivers/soc/qcom/rmtfs_mem.c
··· 125 125 return 0; 126 126 } 127 127 128 - static struct class rmtfs_class = { 128 + static const struct class rmtfs_class = { 129 129 .name = "rmtfs", 130 130 }; 131 131
+2 -1
drivers/soc/qcom/smem_state.c
··· 112 112 113 113 if (args.args_count != 1) { 114 114 dev_err(dev, "invalid #qcom,smem-state-cells\n"); 115 - return ERR_PTR(-EINVAL); 115 + state = ERR_PTR(-EINVAL); 116 + goto put; 116 117 } 117 118 118 119 state = of_node_to_state(args.np);
+2 -1
drivers/soc/qcom/socinfo.c
··· 451 451 { qcom_board_id(QCS9100) }, 452 452 { qcom_board_id(QCS8300) }, 453 453 { qcom_board_id(QCS8275) }, 454 + { qcom_board_id(QCS9075) }, 454 455 { qcom_board_id(QCS615) }, 455 456 }; 456 457 ··· 797 796 if (!qs->attr.soc_id || !qs->attr.revision) 798 797 return -ENOMEM; 799 798 800 - if (offsetof(struct socinfo, serial_num) <= item_size) { 799 + if (offsetofend(struct socinfo, serial_num) <= item_size) { 801 800 qs->attr.serial_number = devm_kasprintf(&pdev->dev, GFP_KERNEL, 802 801 "%u", 803 802 le32_to_cpu(info->serial_num));
+1
include/dt-bindings/arm/qcom,ids.h
··· 284 284 #define QCOM_ID_QCS9100 667 285 285 #define QCOM_ID_QCS8300 674 286 286 #define QCOM_ID_QCS8275 675 287 + #define QCOM_ID_QCS9075 676 287 288 #define QCOM_ID_QCS615 680 288 289 289 290 /*
+8
include/linux/firmware/qcom/qcom_scm.h
··· 105 105 int qcom_scm_ice_invalidate_key(u32 index); 106 106 int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size, 107 107 enum qcom_scm_ice_cipher cipher, u32 data_unit_size); 108 + bool qcom_scm_has_wrapped_key_support(void); 109 + int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size, 110 + u8 *sw_secret, size_t sw_secret_size); 111 + int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size); 112 + int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size, 113 + u8 *eph_key, size_t eph_key_size); 114 + int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size, 115 + u8 *lt_key, size_t lt_key_size); 108 116 109 117 bool qcom_scm_hdcp_available(void); 110 118 int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp);
+12 -14
include/soc/qcom/tcs.h
··· 6 6 #ifndef __SOC_QCOM_TCS_H__ 7 7 #define __SOC_QCOM_TCS_H__ 8 8 9 + #include <linux/bitfield.h> 10 + #include <linux/bits.h> 11 + 9 12 #define MAX_RPMH_PAYLOAD 16 10 13 11 14 /** ··· 63 60 struct tcs_cmd *cmds; 64 61 }; 65 62 66 - #define BCM_TCS_CMD_COMMIT_SHFT 30 67 - #define BCM_TCS_CMD_COMMIT_MASK 0x40000000 68 - #define BCM_TCS_CMD_VALID_SHFT 29 69 - #define BCM_TCS_CMD_VALID_MASK 0x20000000 70 - #define BCM_TCS_CMD_VOTE_X_SHFT 14 71 - #define BCM_TCS_CMD_VOTE_MASK 0x3fff 72 - #define BCM_TCS_CMD_VOTE_Y_SHFT 0 73 - #define BCM_TCS_CMD_VOTE_Y_MASK 0xfffc000 63 + #define BCM_TCS_CMD_COMMIT_MASK BIT(30) 64 + #define BCM_TCS_CMD_VALID_MASK BIT(29) 65 + #define BCM_TCS_CMD_VOTE_MASK GENMASK(13, 0) 66 + #define BCM_TCS_CMD_VOTE_Y_MASK GENMASK(13, 0) 67 + #define BCM_TCS_CMD_VOTE_X_MASK GENMASK(27, 14) 74 68 75 69 /* Construct a Bus Clock Manager (BCM) specific TCS command */ 76 70 #define BCM_TCS_CMD(commit, valid, vote_x, vote_y) \ 77 - (((commit) << BCM_TCS_CMD_COMMIT_SHFT) | \ 78 - ((valid) << BCM_TCS_CMD_VALID_SHFT) | \ 79 - ((cpu_to_le32(vote_x) & \ 80 - BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_X_SHFT) | \ 81 - ((cpu_to_le32(vote_y) & \ 82 - BCM_TCS_CMD_VOTE_MASK) << BCM_TCS_CMD_VOTE_Y_SHFT)) 71 + (u32_encode_bits(commit, BCM_TCS_CMD_COMMIT_MASK) | \ 72 + u32_encode_bits(valid, BCM_TCS_CMD_VALID_MASK) | \ 73 + u32_encode_bits(vote_x, BCM_TCS_CMD_VOTE_X_MASK) | \ 74 + u32_encode_bits(vote_y, BCM_TCS_CMD_VOTE_Y_MASK)) 83 75 84 76 #endif /* __SOC_QCOM_TCS_H__ */