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.19' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into soc/drivers

Qualcomm driver updates for v6.19

Support for hardware-keymanager v1 support for wrapped keys is introduce
in the ICE driver.

Support for the new Kaanapali mobile platform is added to last-level
cache controller, pd-mapper, and UBWC drivers.

UBWC driver gains support for the Monaco and Glymur platforms.

The PMIC GLINK driver is extended to handle the differences found in
targets where the related firmware runs on the SoCCP.

Support for running on targets without initialized SMEM is provided, by
reworking the SMEM driver to differentiate between "not yet probed" and
"probed but there was no SMEM". An unwanted WARN_ON() that triggered if
clients asked for a SMEM item beyond the currently running system's
limit, was removed, to allow new use cases to gracefully fail on old
targets.

The Qualcomm socinfo driver is extended with support for version 20
through 23 and support for providing version information about more than
32 remote processors. Identifiers for QCS6490 and SM8850 are also added.

Additionally, a number of smaller bug fixes and cleanups in PBS, OCMEM,
GSBI, TZMEM, and MDT-loader are included.

* tag 'qcom-drivers-for-6.19' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (31 commits)
soc: qcom: mdt_loader: rename 'firmware' parameter of qcom_mdt_load()
soc: qcom: mdt_loader: merge __qcom_mdt_load() and qcom_mdt_load_no_init()
soc: qcom: socinfo: Add reserve field to support future extension
soc: qcom: socinfo: Add support for new fields in revision 20
dt-bindings: firmware: qcom,scm: Document SCM on Kaanapali SOC
soc: qcom: socinfo: add support to extract more than 32 image versions
soc: qcom: smem: drop the WARN_ON() on SMEM item validation
soc: qcom: ubwc: Add config for Kaanapali
soc: qcom: socinfo: Add SoC ID for QCS6490
dt-bindings: arm: qcom,ids: Add SoC ID for QCS6490
soc: qcom: ice: Add HWKM v1 support for wrapped keys
soc: qcom: smem: better track SMEM uninitialized state
err.h: add INIT_ERR_PTR() macro
soc: qcom: smem: fix hwspinlock resource leak in probe error paths
dt-bindings: soc: qcom,aoss-qmp: Document the Glymur AOSS side channel
dt-bindings: soc: qcom,aoss-qmp: Document the Kaanapali AOSS channel
soc: qcom: ubwc: Add QCS8300 UBWC cfg
dt-bindings: firmware: qcom,scm: Document Glymur scm
soc: qcom: socinfo: Add SM8850 SoC ID
dt-bindings: arm: qcom,ids: Add SoC ID for SM8850
...

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+647 -97
+2
Documentation/devicetree/bindings/cache/qcom,llcc.yaml
··· 21 21 compatible: 22 22 enum: 23 23 - qcom,ipq5424-llcc 24 + - qcom,kaanapali-llcc 24 25 - qcom,qcs615-llcc 25 26 - qcom,qcs8300-llcc 26 27 - qcom,qdu1000-llcc ··· 273 272 compatible: 274 273 contains: 275 274 enum: 275 + - qcom,kaanapali-llcc 276 276 - qcom,sm8450-llcc 277 277 - qcom,sm8550-llcc 278 278 - qcom,sm8650-llcc
+3
Documentation/devicetree/bindings/firmware/qcom,scm.yaml
··· 23 23 - enum: 24 24 - qcom,scm-apq8064 25 25 - qcom,scm-apq8084 26 + - qcom,scm-glymur 26 27 - qcom,scm-ipq4019 27 28 - qcom,scm-ipq5018 28 29 - qcom,scm-ipq5332 ··· 32 31 - qcom,scm-ipq806x 33 32 - qcom,scm-ipq8074 34 33 - qcom,scm-ipq9574 34 + - qcom,scm-kaanapali 35 35 - qcom,scm-mdm9607 36 36 - qcom,scm-milos 37 37 - qcom,scm-msm8226 ··· 204 202 compatible: 205 203 contains: 206 204 enum: 205 + - qcom,scm-kaanapali 207 206 - qcom,scm-milos 208 207 - qcom,scm-sm8450 209 208 - qcom,scm-sm8550
+2
Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.yaml
··· 25 25 compatible: 26 26 items: 27 27 - enum: 28 + - qcom,glymur-aoss-qmp 29 + - qcom,kaanapali-aoss-qmp 28 30 - qcom,milos-aoss-qmp 29 31 - qcom,qcs615-aoss-qmp 30 32 - qcom,qcs8300-aoss-qmp
+58 -23
drivers/soc/qcom/ice.c
··· 22 22 #include <soc/qcom/ice.h> 23 23 24 24 #define AES_256_XTS_KEY_SIZE 64 /* for raw keys only */ 25 - #define QCOM_ICE_HWKM_WRAPPED_KEY_SIZE 100 /* assuming HWKM v2 */ 25 + 26 + #define QCOM_ICE_HWKM_V1 1 /* HWKM version 1 */ 27 + #define QCOM_ICE_HWKM_V2 2 /* HWKM version 2 */ 28 + 29 + #define QCOM_ICE_HWKM_MAX_WRAPPED_KEY_SIZE 100 /* Maximum HWKM wrapped key size */ 30 + 31 + /* 32 + * Wrapped key size depends upon HWKM version: 33 + * HWKM version 1 supports 68 bytes 34 + * HWKM version 2 supports 100 bytes 35 + */ 36 + #define QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(v) ((v) == QCOM_ICE_HWKM_V1 ? 68 : 100) 26 37 27 38 /* QCOM ICE registers */ 28 39 ··· 73 62 74 63 #define QCOM_ICE_REG_HWKM_TZ_KM_CTL (HWKM_OFFSET + 0x1000) 75 64 #define QCOM_ICE_HWKM_DISABLE_CRC_CHECKS_VAL (BIT(1) | BIT(2)) 65 + /* In HWKM v1 the ICE legacy mode is controlled from HWKM register space */ 66 + #define QCOM_ICE_HWKM_ICE_LEGACY_MODE_ENABLED BIT(5) 76 67 77 68 #define QCOM_ICE_REG_HWKM_TZ_KM_STATUS (HWKM_OFFSET + 0x1004) 78 69 #define QCOM_ICE_HWKM_KT_CLEAR_DONE BIT(0) 79 70 #define QCOM_ICE_HWKM_BOOT_CMD_LIST0_DONE BIT(1) 80 71 #define QCOM_ICE_HWKM_BOOT_CMD_LIST1_DONE BIT(2) 81 - #define QCOM_ICE_HWKM_CRYPTO_BIST_DONE_V2 BIT(7) 82 - #define QCOM_ICE_HWKM_BIST_DONE_V2 BIT(9) 72 + #define QCOM_ICE_HWKM_CRYPTO_BIST_DONE(v) (((v) == QCOM_ICE_HWKM_V1) ? BIT(14) : BIT(7)) 73 + #define QCOM_ICE_HWKM_BIST_DONE(v) (((v) == QCOM_ICE_HWKM_V1) ? BIT(16) : BIT(9)) 83 74 84 75 #define QCOM_ICE_REG_HWKM_BANK0_BANKN_IRQ_STATUS (HWKM_OFFSET + 0x2008) 85 76 #define QCOM_ICE_HWKM_RSP_FIFO_CLEAR_VAL BIT(3) ··· 110 97 struct clk *core_clk; 111 98 bool use_hwkm; 112 99 bool hwkm_init_complete; 100 + u8 hwkm_version; 113 101 }; 114 102 115 103 static bool qcom_ice_check_supported(struct qcom_ice *ice) ··· 128 114 return false; 129 115 } 130 116 117 + /* HWKM version v2 is present from ICE 3.2.1 onwards while version v1 118 + * is present only in ICE 3.2.0. Earlier ICE version don't have HWKM. 119 + */ 120 + if (major > 3 || 121 + (major == 3 && (minor >= 3 || (minor == 2 && step >= 1)))) 122 + ice->hwkm_version = QCOM_ICE_HWKM_V2; 123 + else if ((major == 3) && (minor == 2)) 124 + ice->hwkm_version = QCOM_ICE_HWKM_V1; 125 + else 126 + ice->hwkm_version = 0; 127 + 131 128 dev_info(dev, "Found QC Inline Crypto Engine (ICE) v%d.%d.%d\n", 132 129 major, minor, step); 130 + 131 + if (ice->hwkm_version) 132 + dev_info(dev, "QC Hardware Key Manager (HWKM) version v%d\n", 133 + ice->hwkm_version); 133 134 134 135 /* If fuses are blown, ICE might not work in the standard way. */ 135 136 regval = qcom_ice_readl(ice, QCOM_ICE_REG_FUSE_SETTING); ··· 160 131 * v3.2.1 and later have HWKM v2. ICE v3.2.0 has HWKM v1. Earlier ICE 161 132 * versions don't have HWKM at all. However, for HWKM to be fully 162 133 * usable by Linux, the TrustZone software also needs to support certain 163 - * SCM calls including the ones to generate and prepare keys. That 164 - * effectively makes the earliest supported SoC be SM8650, which has 165 - * HWKM v2. Therefore, this driver doesn't include support for HWKM v1, 166 - * and it checks for the SCM call support before it decides to use HWKM. 134 + * SCM calls including the ones to generate and prepare keys. Support 135 + * for these SCM calls is present for SoCs with HWKM v2 and is being 136 + * added for SoCs with HWKM v1 as well but not every SoC with HWKM v1 137 + * currently supports this. So, this driver checks for the SCM call 138 + * support before it decides to use HWKM. 167 139 * 168 140 * Also, since HWKM and legacy mode are mutually exclusive, and 169 141 * ICE-capable storage driver(s) need to know early on whether to 170 142 * advertise support for raw keys or wrapped keys, HWKM cannot be used 171 143 * unconditionally. A module parameter is used to opt into using it. 172 144 */ 173 - if ((major >= 4 || 174 - (major == 3 && (minor >= 3 || (minor == 2 && step >= 1)))) && 175 - qcom_scm_has_wrapped_key_support()) { 145 + if (ice->hwkm_version && qcom_scm_has_wrapped_key_support()) { 176 146 if (qcom_ice_use_wrapped_keys) { 177 147 dev_info(dev, "Using HWKM. Supporting wrapped keys only.\n"); 178 148 ice->use_hwkm = true; ··· 240 212 (QCOM_ICE_HWKM_KT_CLEAR_DONE | 241 213 QCOM_ICE_HWKM_BOOT_CMD_LIST0_DONE | 242 214 QCOM_ICE_HWKM_BOOT_CMD_LIST1_DONE | 243 - QCOM_ICE_HWKM_CRYPTO_BIST_DONE_V2 | 244 - QCOM_ICE_HWKM_BIST_DONE_V2)) { 215 + QCOM_ICE_HWKM_CRYPTO_BIST_DONE(ice->hwkm_version) | 216 + QCOM_ICE_HWKM_BIST_DONE(ice->hwkm_version))) { 245 217 dev_err(ice->dev, "HWKM self-test error!\n"); 246 218 /* 247 219 * Too late to revoke use_hwkm here, as it was already ··· 258 230 if (!ice->use_hwkm) 259 231 return; 260 232 261 - BUILD_BUG_ON(QCOM_ICE_HWKM_WRAPPED_KEY_SIZE > 233 + BUILD_BUG_ON(QCOM_ICE_HWKM_MAX_WRAPPED_KEY_SIZE > 262 234 BLK_CRYPTO_MAX_HW_WRAPPED_KEY_SIZE); 263 235 /* 264 236 * When ICE is in HWKM mode, it only supports wrapped keys. ··· 266 238 * 267 239 * Put ICE in HWKM mode. ICE defaults to legacy mode. 268 240 */ 269 - regval = qcom_ice_readl(ice, QCOM_ICE_REG_CONTROL); 270 - regval &= ~QCOM_ICE_LEGACY_MODE_ENABLED; 271 - qcom_ice_writel(ice, regval, QCOM_ICE_REG_CONTROL); 241 + if (ice->hwkm_version == QCOM_ICE_HWKM_V2) { 242 + regval = qcom_ice_readl(ice, QCOM_ICE_REG_CONTROL); 243 + regval &= ~QCOM_ICE_LEGACY_MODE_ENABLED; 244 + qcom_ice_writel(ice, regval, QCOM_ICE_REG_CONTROL); 245 + } else if (ice->hwkm_version == QCOM_ICE_HWKM_V1) { 246 + regval = qcom_ice_readl(ice, QCOM_ICE_REG_HWKM_TZ_KM_CTL); 247 + regval &= ~QCOM_ICE_HWKM_ICE_LEGACY_MODE_ENABLED; 248 + qcom_ice_writel(ice, regval, QCOM_ICE_REG_HWKM_TZ_KM_CTL); 249 + } 272 250 273 251 /* Disable CRC checks. This HWKM feature is not used. */ 274 252 qcom_ice_writel(ice, QCOM_ICE_HWKM_DISABLE_CRC_CHECKS_VAL, ··· 332 298 333 299 static unsigned int translate_hwkm_slot(struct qcom_ice *ice, unsigned int slot) 334 300 { 335 - return slot * 2; 301 + return ice->hwkm_version == QCOM_ICE_HWKM_V1 ? slot : slot * 2; 336 302 } 337 303 338 304 static int qcom_ice_program_wrapped_key(struct qcom_ice *ice, unsigned int slot, ··· 485 451 { 486 452 int err; 487 453 488 - err = qcom_scm_generate_ice_key(lt_key, QCOM_ICE_HWKM_WRAPPED_KEY_SIZE); 454 + err = qcom_scm_generate_ice_key(lt_key, 455 + QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(ice->hwkm_version)); 489 456 if (err) 490 457 return err; 491 458 492 - return QCOM_ICE_HWKM_WRAPPED_KEY_SIZE; 459 + return QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(ice->hwkm_version); 493 460 } 494 461 EXPORT_SYMBOL_GPL(qcom_ice_generate_key); 495 462 ··· 513 478 int err; 514 479 515 480 err = qcom_scm_prepare_ice_key(lt_key, lt_key_size, 516 - eph_key, QCOM_ICE_HWKM_WRAPPED_KEY_SIZE); 481 + eph_key, QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(ice->hwkm_version)); 517 482 if (err == -EIO || err == -EINVAL) 518 483 err = -EBADMSG; /* probably invalid key */ 519 484 if (err) 520 485 return err; 521 486 522 - return QCOM_ICE_HWKM_WRAPPED_KEY_SIZE; 487 + return QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(ice->hwkm_version); 523 488 } 524 489 EXPORT_SYMBOL_GPL(qcom_ice_prepare_key); 525 490 ··· 541 506 int err; 542 507 543 508 err = qcom_scm_import_ice_key(raw_key, raw_key_size, 544 - lt_key, QCOM_ICE_HWKM_WRAPPED_KEY_SIZE); 509 + lt_key, QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(ice->hwkm_version)); 545 510 if (err) 546 511 return err; 547 512 548 - return QCOM_ICE_HWKM_WRAPPED_KEY_SIZE; 513 + return QCOM_ICE_HWKM_WRAPPED_KEY_SIZE(ice->hwkm_version); 549 514 } 550 515 EXPORT_SYMBOL_GPL(qcom_ice_import_key); 551 516
+373
drivers/soc/qcom/llcc-qcom.c
··· 214 214 }, 215 215 }; 216 216 217 + static const struct llcc_slice_config kaanapali_data[] = { 218 + { 219 + .usecase_id = LLCC_CPUSS, 220 + .slice_id = 1, 221 + .max_cap = 5120, 222 + .priority = 1, 223 + .bonus_ways = 0xffffffff, 224 + .activate_on_init = true, 225 + .write_scid_en = true, 226 + .stale_en = true, 227 + .mru_uncap_en = true, 228 + .vict_prio = true, 229 + }, { 230 + .usecase_id = LLCC_VIDSC0, 231 + .slice_id = 2, 232 + .max_cap = 512, 233 + .priority = 4, 234 + .fixed_size = true, 235 + .bonus_ways = 0xffffffff, 236 + .mru_uncap_en = true, 237 + .vict_prio = true, 238 + }, { 239 + .usecase_id = LLCC_AUDIO, 240 + .slice_id = 35, 241 + .max_cap = 512, 242 + .priority = 1, 243 + .fixed_size = true, 244 + .bonus_ways = 0xffffffff, 245 + .mru_uncap_en = true, 246 + .vict_prio = true, 247 + }, { 248 + .usecase_id = LLCC_MDMHPGRW, 249 + .slice_id = 25, 250 + .max_cap = 1024, 251 + .priority = 5, 252 + .bonus_ways = 0xffffffff, 253 + .mru_uncap_en = true, 254 + .vict_prio = true, 255 + }, { 256 + .usecase_id = LLCC_CMPT, 257 + .slice_id = 34, 258 + .max_cap = 4096, 259 + .priority = 1, 260 + .fixed_size = true, 261 + .bonus_ways = 0xffffffff, 262 + .mru_uncap_en = true, 263 + .vict_prio = true, 264 + }, { 265 + .usecase_id = LLCC_GPUHTW, 266 + .slice_id = 11, 267 + .max_cap = 512, 268 + .priority = 1, 269 + .fixed_size = true, 270 + .bonus_ways = 0xffffffff, 271 + .mru_uncap_en = true, 272 + .vict_prio = true, 273 + }, { 274 + .usecase_id = LLCC_GPU, 275 + .slice_id = 9, 276 + .max_cap = 5632, 277 + .priority = 1, 278 + .fixed_size = true, 279 + .bonus_ways = 0xffffffff, 280 + .write_scid_cacheable_en = true, 281 + .mru_uncap_en = true, 282 + .vict_prio = true, 283 + }, { 284 + .usecase_id = LLCC_MMUHWT, 285 + .slice_id = 18, 286 + .max_cap = 768, 287 + .priority = 1, 288 + .fixed_size = true, 289 + .bonus_ways = 0xffffffff, 290 + .activate_on_init = true, 291 + .mru_uncap_en = true, 292 + .vict_prio = true, 293 + }, { 294 + .usecase_id = LLCC_DISP, 295 + .slice_id = 16, 296 + .max_cap = 7168, 297 + .priority = 1, 298 + .fixed_size = true, 299 + .bonus_ways = 0xffffffff, 300 + .cache_mode = 2, 301 + .stale_en = true, 302 + .mru_uncap_en = true, 303 + .vict_prio = true, 304 + }, { 305 + .usecase_id = LLCC_MDMHPFX, 306 + .slice_id = 24, 307 + .max_cap = 1024, 308 + .priority = 5, 309 + .fixed_size = true, 310 + .bonus_ways = 0xffffffff, 311 + .mru_uncap_en = true, 312 + .vict_prio = true, 313 + }, { 314 + .usecase_id = LLCC_MDMPNG, 315 + .slice_id = 27, 316 + .max_cap = 256, 317 + .priority = 5, 318 + .bonus_ways = 0xfffff, 319 + .mru_uncap_en = true, 320 + .vict_prio = true, 321 + }, { 322 + .usecase_id = LLCC_CVP, 323 + .slice_id = 8, 324 + .max_cap = 800, 325 + .priority = 5, 326 + .fixed_size = true, 327 + .bonus_ways = 0xffffffff, 328 + .mru_uncap_en = true, 329 + .ovcap_en = true, 330 + .vict_prio = true, 331 + .parent_slice_id = 33, 332 + }, { 333 + .usecase_id = LLCC_MODPE, 334 + .slice_id = 29, 335 + .max_cap = 256, 336 + .priority = 1, 337 + .fixed_size = true, 338 + .bonus_ways = 0xf0000000, 339 + .mru_uncap_en = true, 340 + .alloc_oneway_en = true, 341 + .vict_prio = true, 342 + }, { 343 + .usecase_id = LLCC_WRCACHE, 344 + .slice_id = 31, 345 + .max_cap = 512, 346 + .priority = 1, 347 + .fixed_size = true, 348 + .bonus_ways = 0xffffffff, 349 + .activate_on_init = true, 350 + .mru_uncap_en = true, 351 + .vict_prio = true, 352 + }, { 353 + .usecase_id = LLCC_CVPFW, 354 + .slice_id = 19, 355 + .max_cap = 512, 356 + .priority = 5, 357 + .fixed_size = true, 358 + .bonus_ways = 0xffffffff, 359 + .mru_uncap_en = true, 360 + .vict_prio = true, 361 + .parent_slice_id = 33, 362 + }, { 363 + .usecase_id = LLCC_CPUMTE, 364 + .slice_id = 7, 365 + .max_cap = 256, 366 + .priority = 1, 367 + .fixed_size = true, 368 + .bonus_ways = 0xffffffff, 369 + .mru_uncap_en = true, 370 + .vict_prio = true, 371 + }, { 372 + .usecase_id = LLCC_CMPTHCP, 373 + .slice_id = 15, 374 + .max_cap = 256, 375 + .priority = 4, 376 + .fixed_size = true, 377 + .bonus_ways = 0xffffffff, 378 + .mru_uncap_en = true, 379 + .vict_prio = true, 380 + }, { 381 + .usecase_id = LLCC_LCPDARE, 382 + .slice_id = 30, 383 + .max_cap = 128, 384 + .priority = 5, 385 + .fixed_size = true, 386 + .bonus_ways = 0xffffffff, 387 + .activate_on_init = true, 388 + .mru_uncap_en = true, 389 + .alloc_oneway_en = true, 390 + .vict_prio = true, 391 + }, { 392 + .usecase_id = LLCC_AENPU, 393 + .slice_id = 3, 394 + .max_cap = 3072, 395 + .priority = 1, 396 + .fixed_size = true, 397 + .bonus_ways = 0xffffffff, 398 + .cache_mode = 2, 399 + .mru_uncap_en = true, 400 + .vict_prio = true, 401 + }, { 402 + .usecase_id = LLCC_ISLAND1, 403 + .slice_id = 12, 404 + .max_cap = 7936, 405 + .priority = 7, 406 + .fixed_size = true, 407 + .bonus_ways = 0x7fffffff, 408 + .mru_uncap_en = true, 409 + .vict_prio = true, 410 + }, { 411 + .usecase_id = LLCC_DISP_WB, 412 + .slice_id = 23, 413 + .max_cap = 512, 414 + .priority = 4, 415 + .fixed_size = true, 416 + .bonus_ways = 0xffffffff, 417 + .mru_uncap_en = true, 418 + .vict_prio = true, 419 + }, { 420 + .usecase_id = LLCC_VIDVSP, 421 + .slice_id = 4, 422 + .max_cap = 256, 423 + .priority = 4, 424 + .fixed_size = true, 425 + .bonus_ways = 0xffffffff, 426 + .mru_uncap_en = true, 427 + .vict_prio = true, 428 + }, { 429 + .usecase_id = LLCC_VIDDEC, 430 + .slice_id = 5, 431 + .max_cap = 512, 432 + .priority = 4, 433 + .fixed_size = true, 434 + .bonus_ways = 0xffffffff, 435 + .cache_mode = 2, 436 + .mru_uncap_en = true, 437 + .ovcap_en = true, 438 + .vict_prio = true, 439 + .parent_slice_id = 33, 440 + }, { 441 + .usecase_id = LLCC_CAMOFE, 442 + .slice_id = 33, 443 + .max_cap = 6144, 444 + .priority = 4, 445 + .fixed_size = true, 446 + .bonus_ways = 0xffffffff, 447 + .stale_en = true, 448 + .mru_uncap_en = true, 449 + .ovcap_en = true, 450 + .vict_prio = true, 451 + .parent_slice_id = 33, 452 + }, { 453 + .usecase_id = LLCC_CAMRTIP, 454 + .slice_id = 13, 455 + .max_cap = 6144, 456 + .priority = 4, 457 + .fixed_size = true, 458 + .bonus_ways = 0xffffffff, 459 + .stale_en = true, 460 + .mru_uncap_en = true, 461 + .ovcap_en = true, 462 + .vict_prio = true, 463 + .parent_slice_id = 33, 464 + }, { 465 + .usecase_id = LLCC_CAMRTRF, 466 + .slice_id = 10, 467 + .max_cap = 3584, 468 + .priority = 3, 469 + .fixed_size = true, 470 + .bonus_ways = 0xffffffff, 471 + .stale_en = true, 472 + .mru_uncap_en = true, 473 + .ovcap_en = true, 474 + .vict_prio = true, 475 + .parent_slice_id = 33, 476 + }, { 477 + .usecase_id = LLCC_CAMSRTRF, 478 + .slice_id = 21, 479 + .max_cap = 6144, 480 + .priority = 1, 481 + .fixed_size = true, 482 + .bonus_ways = 0xffffffff, 483 + .stale_en = true, 484 + .mru_uncap_en = true, 485 + .ovcap_en = true, 486 + .vict_prio = true, 487 + .parent_slice_id = 33, 488 + }, { 489 + .usecase_id = LLCC_VIDEO_APV, 490 + .slice_id = 6, 491 + .max_cap = 768, 492 + .priority = 4, 493 + .fixed_size = true, 494 + .bonus_ways = 0xffffffff, 495 + .mru_uncap_en = true, 496 + .vict_prio = true, 497 + }, { 498 + .usecase_id = LLCC_COMPUTE1, 499 + .slice_id = 22, 500 + .max_cap = 4096, 501 + .priority = 1, 502 + .fixed_size = true, 503 + .bonus_ways = 0xffffffff, 504 + .mru_uncap_en = true, 505 + .vict_prio = true, 506 + }, { 507 + .usecase_id = LLCC_CPUSS_OPP, 508 + .slice_id = 32, 509 + .max_cap = 0, 510 + .priority = 0, 511 + .fixed_size = true, 512 + .bonus_ways = 0, 513 + .activate_on_init = true, 514 + .write_scid_en = true, 515 + .mru_uncap_en = true, 516 + .vict_prio = true, 517 + }, { 518 + .usecase_id = LLCC_CPUSSMPAM, 519 + .slice_id = 17, 520 + .max_cap = 2048, 521 + .priority = 1, 522 + .fixed_size = true, 523 + .bonus_ways = 0xffffffff, 524 + .activate_on_init = true, 525 + .write_scid_en = true, 526 + .stale_en = true, 527 + .mru_uncap_en = true, 528 + .vict_prio = true, 529 + }, { 530 + .usecase_id = LLCC_CAM_IPE_STROV, 531 + .slice_id = 14, 532 + .max_cap = 400, 533 + .priority = 5, 534 + .fixed_size = true, 535 + .bonus_ways = 0xffffffff, 536 + .mru_uncap_en = true, 537 + .ovcap_en = true, 538 + .vict_prio = true, 539 + .parent_slice_id = 33, 540 + }, { 541 + .usecase_id = LLCC_CAM_OFE_STROV, 542 + .slice_id = 20, 543 + .max_cap = 400, 544 + .priority = 5, 545 + .fixed_size = true, 546 + .bonus_ways = 0xffffffff, 547 + .mru_uncap_en = true, 548 + .ovcap_en = true, 549 + .vict_prio = true, 550 + .parent_slice_id = 33, 551 + }, { 552 + .usecase_id = LLCC_CPUSS_HEU, 553 + .slice_id = 28, 554 + .max_cap = 0, 555 + .priority = 0, 556 + .fixed_size = true, 557 + .bonus_ways = 0, 558 + .mru_uncap_en = true, 559 + .ovcap_en = true, 560 + .vict_prio = true, 561 + }, { 562 + .usecase_id = LLCC_MDM_PNG_FIXED, 563 + .slice_id = 26, 564 + .max_cap = 256, 565 + .priority = 5, 566 + .fixed_size = true, 567 + .bonus_ways = 0xff000000, 568 + .activate_on_init = true, 569 + .write_scid_en = true, 570 + .mru_uncap_en = true, 571 + .vict_prio = true, 572 + }, 573 + }; 574 + 217 575 static const struct llcc_slice_config sa8775p_data[] = { 218 576 { 219 577 .usecase_id = LLCC_CPUSS, ··· 3863 3505 [LLCC_TRP_WRS_CACHEABLE_EN] = 0x00042088, 3864 3506 }; 3865 3507 3508 + static const struct qcom_llcc_config kaanapali_cfg[] = { 3509 + { 3510 + .sct_data = kaanapali_data, 3511 + .size = ARRAY_SIZE(kaanapali_data), 3512 + .reg_offset = llcc_v6_reg_offset, 3513 + .edac_reg_offset = &llcc_v6_edac_reg_offset, 3514 + }, 3515 + }; 3516 + 3866 3517 static const struct qcom_llcc_config qcs615_cfg[] = { 3867 3518 { 3868 3519 .sct_data = qcs615_data, ··· 4096 3729 .edac_reg_offset = &llcc_v2_1_edac_reg_offset, 4097 3730 .irq_configured = true, 4098 3731 }, 3732 + }; 3733 + 3734 + static const struct qcom_sct_config kaanapali_cfgs = { 3735 + .llcc_config = kaanapali_cfg, 3736 + .num_config = ARRAY_SIZE(kaanapali_cfg), 4099 3737 }; 4100 3738 4101 3739 static const struct qcom_sct_config qcs615_cfgs = { ··· 4942 4570 4943 4571 static const struct of_device_id qcom_llcc_of_match[] = { 4944 4572 { .compatible = "qcom,ipq5424-llcc", .data = &ipq5424_cfgs}, 4573 + { .compatible = "qcom,kaanapali-llcc", .data = &kaanapali_cfgs}, 4945 4574 { .compatible = "qcom,qcs615-llcc", .data = &qcs615_cfgs}, 4946 4575 { .compatible = "qcom,qcs8300-llcc", .data = &qcs8300_cfgs}, 4947 4576 { .compatible = "qcom,qdu1000-llcc", .data = &qdu1000_cfgs},
+22 -30
drivers/soc/qcom/mdt_loader.c
··· 332 332 return false; 333 333 } 334 334 335 - static int __qcom_mdt_load(struct device *dev, const struct firmware *fw, 336 - const char *fw_name, void *mem_region, 337 - phys_addr_t mem_phys, size_t mem_size, 338 - phys_addr_t *reloc_base) 335 + /** 336 + * qcom_mdt_load_no_init() - load the firmware which header is loaded as fw 337 + * @dev: device handle to associate resources with 338 + * @fw: firmware object for the mdt file 339 + * @fw_name: name of the firmware, for construction of segment file names 340 + * @mem_region: allocated memory region to load firmware into 341 + * @mem_phys: physical address of allocated memory region 342 + * @mem_size: size of the allocated memory region 343 + * @reloc_base: adjusted physical address after relocation 344 + * 345 + * Returns 0 on success, negative errno otherwise. 346 + */ 347 + int qcom_mdt_load_no_init(struct device *dev, const struct firmware *fw, 348 + const char *fw_name, void *mem_region, 349 + phys_addr_t mem_phys, size_t mem_size, 350 + phys_addr_t *reloc_base) 339 351 { 340 352 const struct elf32_phdr *phdrs; 341 353 const struct elf32_phdr *phdr; ··· 447 435 448 436 return ret; 449 437 } 438 + EXPORT_SYMBOL_GPL(qcom_mdt_load_no_init); 450 439 451 440 /** 452 441 * qcom_mdt_load() - load the firmware which header is loaded as fw 453 442 * @dev: device handle to associate resources with 454 443 * @fw: firmware object for the mdt file 455 - * @firmware: name of the firmware, for construction of segment file names 444 + * @fw_name: name of the firmware, for construction of segment file names 456 445 * @pas_id: PAS identifier 457 446 * @mem_region: allocated memory region to load firmware into 458 447 * @mem_phys: physical address of allocated memory region ··· 463 450 * Returns 0 on success, negative errno otherwise. 464 451 */ 465 452 int qcom_mdt_load(struct device *dev, const struct firmware *fw, 466 - const char *firmware, int pas_id, void *mem_region, 453 + const char *fw_name, int pas_id, void *mem_region, 467 454 phys_addr_t mem_phys, size_t mem_size, 468 455 phys_addr_t *reloc_base) 469 456 { 470 457 int ret; 471 458 472 - ret = qcom_mdt_pas_init(dev, fw, firmware, pas_id, mem_phys, NULL); 459 + ret = qcom_mdt_pas_init(dev, fw, fw_name, pas_id, mem_phys, NULL); 473 460 if (ret) 474 461 return ret; 475 462 476 - return __qcom_mdt_load(dev, fw, firmware, mem_region, mem_phys, 477 - mem_size, reloc_base); 463 + return qcom_mdt_load_no_init(dev, fw, fw_name, mem_region, mem_phys, 464 + mem_size, reloc_base); 478 465 } 479 466 EXPORT_SYMBOL_GPL(qcom_mdt_load); 480 - 481 - /** 482 - * qcom_mdt_load_no_init() - load the firmware which header is loaded as fw 483 - * @dev: device handle to associate resources with 484 - * @fw: firmware object for the mdt file 485 - * @firmware: name of the firmware, for construction of segment file names 486 - * @mem_region: allocated memory region to load firmware into 487 - * @mem_phys: physical address of allocated memory region 488 - * @mem_size: size of the allocated memory region 489 - * @reloc_base: adjusted physical address after relocation 490 - * 491 - * Returns 0 on success, negative errno otherwise. 492 - */ 493 - int qcom_mdt_load_no_init(struct device *dev, const struct firmware *fw, 494 - const char *firmware, void *mem_region, phys_addr_t mem_phys, 495 - size_t mem_size, phys_addr_t *reloc_base) 496 - { 497 - return __qcom_mdt_load(dev, fw, firmware, mem_region, mem_phys, 498 - mem_size, reloc_base); 499 - } 500 - EXPORT_SYMBOL_GPL(qcom_mdt_load_no_init); 501 467 502 468 MODULE_DESCRIPTION("Firmware parser for Qualcomm MDT format"); 503 469 MODULE_LICENSE("GPL v2");
+1 -1
drivers/soc/qcom/ocmem.c
··· 202 202 } 203 203 204 204 ocmem = platform_get_drvdata(pdev); 205 + put_device(&pdev->dev); 205 206 if (!ocmem) { 206 207 dev_err(dev, "Cannot get ocmem\n"); 207 - put_device(&pdev->dev); 208 208 return ERR_PTR(-ENODEV); 209 209 } 210 210 return ocmem;
+8 -1
drivers/soc/qcom/pmic_glink.c
··· 39 39 struct mutex state_lock; 40 40 unsigned int client_state; 41 41 unsigned int pdr_state; 42 + bool pdr_available; 42 43 43 44 /* serializing clients list updates */ 44 45 spinlock_t client_lock; ··· 247 246 return dev_err_probe(&rpdev->dev, -ENODEV, "no pmic_glink device to attach to\n"); 248 247 249 248 dev_set_drvdata(&rpdev->dev, pg); 249 + pg->pdr_available = rpdev->id.driver_data; 250 250 251 251 guard(mutex)(&pg->state_lock); 252 252 pg->ept = rpdev->ept; 253 + if (!pg->pdr_available) 254 + pg->pdr_state = SERVREG_SERVICE_STATE_UP; 253 255 pmic_glink_state_notify_clients(pg); 254 256 255 257 return 0; ··· 269 265 270 266 guard(mutex)(&pg->state_lock); 271 267 pg->ept = NULL; 268 + if (!pg->pdr_available) 269 + pg->pdr_state = SERVREG_SERVICE_STATE_DOWN; 272 270 pmic_glink_state_notify_clients(pg); 273 271 } 274 272 275 273 static const struct rpmsg_device_id pmic_glink_rpmsg_id_match[] = { 276 - { "PMIC_RTR_ADSP_APPS" }, 274 + {.name = "PMIC_RTR_ADSP_APPS", .driver_data = true }, 275 + {.name = "PMIC_RTR_SOCCP_APPS", .driver_data = false }, 277 276 {} 278 277 }; 279 278
+2
drivers/soc/qcom/qcom-pbs.c
··· 173 173 return ERR_PTR(-EINVAL); 174 174 } 175 175 176 + platform_device_put(pdev); 177 + 176 178 return pbs; 177 179 } 178 180 EXPORT_SYMBOL_GPL(get_pbs_client_device);
-8
drivers/soc/qcom/qcom_gsbi.c
··· 212 212 return of_platform_populate(node, NULL, NULL, &pdev->dev); 213 213 } 214 214 215 - static void gsbi_remove(struct platform_device *pdev) 216 - { 217 - struct gsbi_info *gsbi = platform_get_drvdata(pdev); 218 - 219 - clk_disable_unprepare(gsbi->hclk); 220 - } 221 - 222 215 static const struct of_device_id gsbi_dt_match[] = { 223 216 { .compatible = "qcom,gsbi-v1.0.0", }, 224 217 { }, ··· 225 232 .of_match_table = gsbi_dt_match, 226 233 }, 227 234 .probe = gsbi_probe, 228 - .remove = gsbi_remove, 229 235 }; 230 236 231 237 module_platform_driver(gsbi_driver);
+10
drivers/soc/qcom/qcom_pd_mapper.c
··· 360 360 }, 361 361 }; 362 362 363 + static const struct qcom_pdm_domain_data *kaanapali_domains[] = { 364 + &adsp_audio_pd, 365 + &adsp_root_pd, 366 + &adsp_sensor_pd, 367 + &cdsp_root_pd, 368 + &mpss_root_pd_gps, 369 + NULL, 370 + }; 371 + 363 372 static const struct qcom_pdm_domain_data *msm8996_domains[] = { 364 373 &msm8996_adsp_audio_pd, 365 374 &msm8996_adsp_root_pd, ··· 561 552 { .compatible = "qcom,apq8074", .data = NULL, }, 562 553 { .compatible = "qcom,apq8084", .data = NULL, }, 563 554 { .compatible = "qcom,apq8096", .data = msm8996_domains, }, 555 + { .compatible = "qcom,kaanapali", .data = kaanapali_domains, }, 564 556 { .compatible = "qcom,msm8226", .data = NULL, }, 565 557 { .compatible = "qcom,msm8909", .data = NULL, }, 566 558 { .compatible = "qcom,msm8916", .data = NULL, },
+18 -15
drivers/soc/qcom/smem.c
··· 353 353 return p - le32_to_cpu(e->size); 354 354 } 355 355 356 - /* Pointer to the one and only smem handle */ 357 - static struct qcom_smem *__smem; 356 + /* 357 + * Pointer to the one and only smem handle. 358 + * Init to -EPROBE_DEFER to signal SMEM still has to be probed. 359 + * Can be set to -ENODEV if SMEM is not initialized by SBL. 360 + */ 361 + static struct qcom_smem *__smem = INIT_ERR_PTR(-EPROBE_DEFER); 358 362 359 363 /* Timeout (ms) for the trylock of remote spinlocks */ 360 364 #define HWSPINLOCK_TIMEOUT 1000 ··· 512 508 unsigned long flags; 513 509 int ret; 514 510 515 - if (!__smem) 516 - return -EPROBE_DEFER; 511 + if (IS_ERR(__smem)) 512 + return PTR_ERR(__smem); 517 513 518 514 if (item < SMEM_ITEM_LAST_FIXED) { 519 515 dev_err(__smem->dev, ··· 521 517 return -EINVAL; 522 518 } 523 519 524 - if (WARN_ON(item >= __smem->item_count)) 520 + if (item >= __smem->item_count) 525 521 return -EINVAL; 526 522 527 523 ret = hwspin_lock_timeout_irqsave(__smem->hwlock, ··· 689 685 void *qcom_smem_get(unsigned host, unsigned item, size_t *size) 690 686 { 691 687 struct smem_partition *part; 692 - void *ptr = ERR_PTR(-EPROBE_DEFER); 688 + void *ptr; 693 689 694 - if (!__smem) 695 - return ptr; 690 + if (IS_ERR(__smem)) 691 + return __smem; 696 692 697 - if (WARN_ON(item >= __smem->item_count)) 693 + if (item >= __smem->item_count) 698 694 return ERR_PTR(-EINVAL); 699 695 700 696 if (host < SMEM_HOST_COUNT && __smem->partitions[host].virt_base) { ··· 727 723 struct smem_header *header; 728 724 unsigned ret; 729 725 730 - if (!__smem) 731 - return -EPROBE_DEFER; 726 + if (IS_ERR(__smem)) 727 + return PTR_ERR(__smem); 732 728 733 729 if (host < SMEM_HOST_COUNT && __smem->partitions[host].virt_base) { 734 730 part = &__smem->partitions[host]; ··· 1185 1181 header = smem->regions[0].virt_base; 1186 1182 if (le32_to_cpu(header->initialized) != 1 || 1187 1183 le32_to_cpu(header->reserved)) { 1188 - dev_err(&pdev->dev, "SMEM is not initialized by SBL\n"); 1189 - return -EINVAL; 1184 + __smem = ERR_PTR(-ENODEV); 1185 + return dev_err_probe(&pdev->dev, PTR_ERR(__smem), "SMEM is not initialized by SBL\n"); 1190 1186 } 1191 1187 1192 1188 hwlock_id = of_hwspin_lock_get_id(pdev->dev.of_node, 0); ··· 1194 1190 return dev_err_probe(&pdev->dev, hwlock_id, 1195 1191 "failed to retrieve hwlock\n"); 1196 1192 1197 - smem->hwlock = hwspin_lock_request_specific(hwlock_id); 1193 + smem->hwlock = devm_hwspin_lock_request_specific(&pdev->dev, hwlock_id); 1198 1194 if (!smem->hwlock) 1199 1195 return -ENXIO; 1200 1196 ··· 1247 1243 { 1248 1244 platform_device_unregister(__smem->socinfo); 1249 1245 1250 - hwspin_lock_free(__smem->hwlock); 1251 1246 __smem = NULL; 1252 1247 } 1253 1248
+90 -16
drivers/soc/qcom/socinfo.c
··· 37 37 */ 38 38 #define SMEM_IMAGE_TABLE_BOOT_INDEX 0 39 39 #define SMEM_IMAGE_TABLE_TZ_INDEX 1 40 + #define SMEM_IMAGE_TABLE_TZSECAPP_INDEX 2 40 41 #define SMEM_IMAGE_TABLE_RPM_INDEX 3 42 + #define SMEM_IMAGE_TABLE_SDI_INDEX 4 43 + #define SMEM_IMAGE_TABLE_HYP_INDEX 5 44 + #define SMEM_IMAGE_TABLE_ADSP1_INDEX 6 45 + #define SMEM_IMAGE_TABLE_ADSP2_INDEX 7 46 + #define SMEM_IMAGE_TABLE_CDSP2_INDEX 8 41 47 #define SMEM_IMAGE_TABLE_APPSBL_INDEX 9 42 48 #define SMEM_IMAGE_TABLE_APPS_INDEX 10 43 49 #define SMEM_IMAGE_TABLE_MPSS_INDEX 11 ··· 52 46 #define SMEM_IMAGE_TABLE_VIDEO_INDEX 14 53 47 #define SMEM_IMAGE_TABLE_DSPS_INDEX 15 54 48 #define SMEM_IMAGE_TABLE_CDSP_INDEX 16 49 + #define SMEM_IMAGE_TABLE_NPU_INDEX 17 50 + #define SMEM_IMAGE_TABLE_WPSS_INDEX 18 55 51 #define SMEM_IMAGE_TABLE_CDSP1_INDEX 19 56 52 #define SMEM_IMAGE_TABLE_GPDSP_INDEX 20 57 53 #define SMEM_IMAGE_TABLE_GPDSP1_INDEX 21 54 + #define SMEM_IMAGE_TABLE_SENSORPD_INDEX 22 55 + #define SMEM_IMAGE_TABLE_AUDIOPD_INDEX 23 56 + #define SMEM_IMAGE_TABLE_OEMPD_INDEX 24 57 + #define SMEM_IMAGE_TABLE_CHARGERPD_INDEX 25 58 + #define SMEM_IMAGE_TABLE_OISPD_INDEX 26 59 + #define SMEM_IMAGE_TABLE_SOCCP_INDEX 27 58 60 #define SMEM_IMAGE_TABLE_TME_INDEX 28 61 + #define SMEM_IMAGE_TABLE_GEARVM_INDEX 29 62 + #define SMEM_IMAGE_TABLE_UEFI_INDEX 30 63 + #define SMEM_IMAGE_TABLE_CDSP3_INDEX 31 64 + #define SMEM_IMAGE_TABLE_AUDIOPD_ADSP1_INDEX 32 65 + #define SMEM_IMAGE_TABLE_AUDIOPD_ADSP2_INDEX 33 66 + #define SMEM_IMAGE_TABLE_DCP_INDEX 34 67 + #define SMEM_IMAGE_TABLE_OOBS_INDEX 35 68 + #define SMEM_IMAGE_TABLE_OOBNS_INDEX 36 69 + #define SMEM_IMAGE_TABLE_DEVCFG_INDEX 37 70 + #define SMEM_IMAGE_TABLE_BTPD_INDEX 38 71 + #define SMEM_IMAGE_TABLE_QECP_INDEX 39 72 + 59 73 #define SMEM_IMAGE_VERSION_TABLE 469 74 + #define SMEM_IMAGE_VERSION_TABLE_2 667 60 75 61 76 /* 62 77 * SMEM Image table names 63 78 */ 64 79 static const char *const socinfo_image_names[] = { 80 + [SMEM_IMAGE_TABLE_ADSP1_INDEX] = "adsp1", 81 + [SMEM_IMAGE_TABLE_ADSP2_INDEX] = "adsp2", 65 82 [SMEM_IMAGE_TABLE_ADSP_INDEX] = "adsp", 66 83 [SMEM_IMAGE_TABLE_APPSBL_INDEX] = "appsbl", 67 84 [SMEM_IMAGE_TABLE_APPS_INDEX] = "apps", 85 + [SMEM_IMAGE_TABLE_AUDIOPD_INDEX] = "audiopd", 86 + [SMEM_IMAGE_TABLE_AUDIOPD_ADSP1_INDEX] = "audiopd_adsp1", 87 + [SMEM_IMAGE_TABLE_AUDIOPD_ADSP2_INDEX] = "audiopd_adsp2", 68 88 [SMEM_IMAGE_TABLE_BOOT_INDEX] = "boot", 69 - [SMEM_IMAGE_TABLE_CNSS_INDEX] = "cnss", 70 - [SMEM_IMAGE_TABLE_MPSS_INDEX] = "mpss", 71 - [SMEM_IMAGE_TABLE_RPM_INDEX] = "rpm", 72 - [SMEM_IMAGE_TABLE_TZ_INDEX] = "tz", 73 - [SMEM_IMAGE_TABLE_VIDEO_INDEX] = "video", 74 - [SMEM_IMAGE_TABLE_DSPS_INDEX] = "dsps", 75 - [SMEM_IMAGE_TABLE_CDSP_INDEX] = "cdsp", 89 + [SMEM_IMAGE_TABLE_BTPD_INDEX] = "btpd", 76 90 [SMEM_IMAGE_TABLE_CDSP1_INDEX] = "cdsp1", 77 - [SMEM_IMAGE_TABLE_GPDSP_INDEX] = "gpdsp", 91 + [SMEM_IMAGE_TABLE_CDSP2_INDEX] = "cdsp2", 92 + [SMEM_IMAGE_TABLE_CDSP3_INDEX] = "cdsp3", 93 + [SMEM_IMAGE_TABLE_CDSP_INDEX] = "cdsp", 94 + [SMEM_IMAGE_TABLE_CHARGERPD_INDEX] = "chargerpd", 95 + [SMEM_IMAGE_TABLE_CNSS_INDEX] = "cnss", 96 + [SMEM_IMAGE_TABLE_DCP_INDEX] = "dcp", 97 + [SMEM_IMAGE_TABLE_DEVCFG_INDEX] = "devcfg", 98 + [SMEM_IMAGE_TABLE_DSPS_INDEX] = "dsps", 99 + [SMEM_IMAGE_TABLE_GEARVM_INDEX] = "gearvm", 78 100 [SMEM_IMAGE_TABLE_GPDSP1_INDEX] = "gpdsp1", 101 + [SMEM_IMAGE_TABLE_GPDSP_INDEX] = "gpdsp", 102 + [SMEM_IMAGE_TABLE_HYP_INDEX] = "hyp", 103 + [SMEM_IMAGE_TABLE_MPSS_INDEX] = "mpss", 104 + [SMEM_IMAGE_TABLE_NPU_INDEX] = "npu", 105 + [SMEM_IMAGE_TABLE_OEMPD_INDEX] = "oempd", 106 + [SMEM_IMAGE_TABLE_OISPD_INDEX] = "oispd", 107 + [SMEM_IMAGE_TABLE_OOBNS_INDEX] = "oobns", 108 + [SMEM_IMAGE_TABLE_OOBS_INDEX] = "oobs", 109 + [SMEM_IMAGE_TABLE_QECP_INDEX] = "qecp", 110 + [SMEM_IMAGE_TABLE_RPM_INDEX] = "rpm", 111 + [SMEM_IMAGE_TABLE_SDI_INDEX] = "sdi", 112 + [SMEM_IMAGE_TABLE_SENSORPD_INDEX] = "sensorpd", 113 + [SMEM_IMAGE_TABLE_SOCCP_INDEX] = "soccp", 79 114 [SMEM_IMAGE_TABLE_TME_INDEX] = "tme", 115 + [SMEM_IMAGE_TABLE_TZ_INDEX] = "tz", 116 + [SMEM_IMAGE_TABLE_TZSECAPP_INDEX] = "tzsecapp", 117 + [SMEM_IMAGE_TABLE_UEFI_INDEX] = "uefi", 118 + [SMEM_IMAGE_TABLE_VIDEO_INDEX] = "video", 119 + [SMEM_IMAGE_TABLE_WPSS_INDEX] = "wpss", 80 120 }; 81 121 82 122 static const char *const pmic_models[] = { ··· 213 161 u32 num_func_clusters; 214 162 u32 boot_cluster; 215 163 u32 boot_core; 164 + u32 raw_package_type; 216 165 }; 217 166 218 167 struct smem_image_version { ··· 468 415 { qcom_board_id(SC7280) }, 469 416 { qcom_board_id(SC7180P) }, 470 417 { qcom_board_id(QCM6490) }, 418 + { qcom_board_id(QCS6490) }, 471 419 { qcom_board_id(SM7325P) }, 472 420 { qcom_board_id(IPQ5000) }, 473 421 { qcom_board_id(IPQ0509) }, ··· 515 461 { qcom_board_id(IPQ5424) }, 516 462 { qcom_board_id(QCM6690) }, 517 463 { qcom_board_id(QCS6690) }, 464 + { qcom_board_id(SM8850) }, 518 465 { qcom_board_id(IPQ5404) }, 519 466 { qcom_board_id(QCS9100) }, 520 467 { qcom_board_id(QCS8300) }, ··· 664 609 struct smem_image_version *versions; 665 610 struct dentry *dentry; 666 611 size_t size; 667 - int i; 612 + int i, j; 668 613 unsigned int num_pmics; 669 614 unsigned int pmic_array_offset; 670 615 ··· 676 621 &qcom_socinfo->info.fmt); 677 622 678 623 switch (qcom_socinfo->info.fmt) { 624 + case SOCINFO_VERSION(0, 23): 625 + case SOCINFO_VERSION(0, 22): 626 + case SOCINFO_VERSION(0, 21): 627 + case SOCINFO_VERSION(0, 20): 628 + qcom_socinfo->info.raw_package_type = __le32_to_cpu(info->raw_package_type); 629 + debugfs_create_u32("raw_package_type", 0444, qcom_socinfo->dbg_root, 630 + &qcom_socinfo->info.raw_package_type); 631 + fallthrough; 679 632 case SOCINFO_VERSION(0, 19): 680 633 qcom_socinfo->info.num_func_clusters = __le32_to_cpu(info->num_func_clusters); 681 634 qcom_socinfo->info.boot_cluster = __le32_to_cpu(info->boot_cluster); ··· 816 753 break; 817 754 } 818 755 819 - versions = qcom_smem_get(QCOM_SMEM_HOST_ANY, SMEM_IMAGE_VERSION_TABLE, 820 - &size); 821 - 822 - for (i = 0; i < ARRAY_SIZE(socinfo_image_names); i++) { 756 + for (i = 0, j = 0; i < ARRAY_SIZE(socinfo_image_names); i++, j++) { 823 757 if (!socinfo_image_names[i]) 824 758 continue; 825 759 760 + if (i == 0) { 761 + versions = qcom_smem_get(QCOM_SMEM_HOST_ANY, 762 + SMEM_IMAGE_VERSION_TABLE, 763 + &size); 764 + } else if (i == 32) { 765 + versions = qcom_smem_get(QCOM_SMEM_HOST_ANY, 766 + SMEM_IMAGE_VERSION_TABLE_2, 767 + &size); 768 + if (IS_ERR(versions)) 769 + break; 770 + 771 + j = 0; 772 + } 773 + 826 774 dentry = debugfs_create_dir(socinfo_image_names[i], 827 775 qcom_socinfo->dbg_root); 828 - debugfs_create_file("name", 0444, dentry, &versions[i], 776 + debugfs_create_file("name", 0444, dentry, &versions[j], 829 777 &qcom_image_name_ops); 830 - debugfs_create_file("variant", 0444, dentry, &versions[i], 778 + debugfs_create_file("variant", 0444, dentry, &versions[j], 831 779 &qcom_image_variant_ops); 832 - debugfs_create_file("oem", 0444, dentry, &versions[i], 780 + debugfs_create_file("oem", 0444, dentry, &versions[j], 833 781 &qcom_image_oem_ops); 834 782 } 835 783 }
+24
drivers/soc/qcom/ubwc_config.c
··· 16 16 /* no UBWC, no HBB */ 17 17 }; 18 18 19 + static const struct qcom_ubwc_cfg_data kaanapali_data = { 20 + .ubwc_enc_version = UBWC_6_0, 21 + .ubwc_dec_version = UBWC_6_0, 22 + .ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 | 23 + UBWC_SWIZZLE_ENABLE_LVL3, 24 + .ubwc_bank_spread = true, 25 + .highest_bank_bit = 16, 26 + .macrotile_mode = true, 27 + }; 28 + 19 29 static const struct qcom_ubwc_cfg_data msm8937_data = { 20 30 .ubwc_enc_version = UBWC_1_0, 21 31 .ubwc_dec_version = UBWC_1_0, ··· 228 218 .macrotile_mode = true, 229 219 }; 230 220 221 + static const struct qcom_ubwc_cfg_data glymur_data = { 222 + .ubwc_enc_version = UBWC_5_0, 223 + .ubwc_dec_version = UBWC_5_0, 224 + .ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 | 225 + UBWC_SWIZZLE_ENABLE_LVL3, 226 + .ubwc_bank_spread = true, 227 + /* TODO: highest_bank_bit = 15 for LP_DDR4 */ 228 + .highest_bank_bit = 16, 229 + .macrotile_mode = true, 230 + }; 231 + 231 232 static const struct of_device_id qcom_ubwc_configs[] __maybe_unused = { 232 233 { .compatible = "qcom,apq8016", .data = &no_ubwc_data }, 233 234 { .compatible = "qcom,apq8026", .data = &no_ubwc_data }, 234 235 { .compatible = "qcom,apq8074", .data = &no_ubwc_data }, 235 236 { .compatible = "qcom,apq8096", .data = &msm8998_data }, 237 + { .compatible = "qcom,kaanapali", .data = &kaanapali_data, }, 238 + { .compatible = "qcom,glymur", .data = &glymur_data}, 236 239 { .compatible = "qcom,msm8226", .data = &no_ubwc_data }, 237 240 { .compatible = "qcom,msm8916", .data = &no_ubwc_data }, 238 241 { .compatible = "qcom,msm8917", .data = &no_ubwc_data }, ··· 260 237 { .compatible = "qcom,msm8998", .data = &msm8998_data }, 261 238 { .compatible = "qcom,qcm2290", .data = &qcm2290_data, }, 262 239 { .compatible = "qcom,qcm6490", .data = &sc7280_data, }, 240 + { .compatible = "qcom,qcs8300", .data = &sc8280xp_data, }, 263 241 { .compatible = "qcom,sa8155p", .data = &sm8150_data, }, 264 242 { .compatible = "qcom,sa8540p", .data = &sc8280xp_data, }, 265 243 { .compatible = "qcom,sa8775p", .data = &sa8775p_data, },
+2
include/dt-bindings/arm/qcom,ids.h
··· 240 240 #define QCOM_ID_SC7280 487 241 241 #define QCOM_ID_SC7180P 495 242 242 #define QCOM_ID_QCM6490 497 243 + #define QCOM_ID_QCS6490 498 243 244 #define QCOM_ID_SM7325P 499 244 245 #define QCOM_ID_IPQ5000 503 245 246 #define QCOM_ID_IPQ0509 504 ··· 287 286 #define QCOM_ID_IPQ5424 651 288 287 #define QCOM_ID_QCM6690 657 289 288 #define QCOM_ID_QCS6690 658 289 + #define QCOM_ID_SM8850 660 290 290 #define QCOM_ID_IPQ5404 671 291 291 #define QCOM_ID_QCS9100 667 292 292 #define QCOM_ID_QCS8300 674
+8
include/linux/err.h
··· 41 41 return (void *) error; 42 42 } 43 43 44 + /** 45 + * INIT_ERR_PTR - Init a const error pointer. 46 + * @error: A negative error code. 47 + * 48 + * Like ERR_PTR(), but usable to initialize static variables. 49 + */ 50 + #define INIT_ERR_PTR(error) ((void *)(error)) 51 + 44 52 /* Return the pointer in the percpu address space. */ 45 53 #define ERR_PTR_PCPU(error) ((void __percpu *)(unsigned long)ERR_PTR(error)) 46 54
+12 -3
include/linux/firmware/qcom/qcom_tzmem.h
··· 17 17 * enum qcom_tzmem_policy - Policy for pool growth. 18 18 */ 19 19 enum qcom_tzmem_policy { 20 - /**< Static pool, never grow above initial size. */ 20 + /** 21 + * @QCOM_TZMEM_POLICY_STATIC: Static pool, 22 + * never grow above initial size. 23 + */ 21 24 QCOM_TZMEM_POLICY_STATIC = 1, 22 - /**< When out of memory, add increment * current size of memory. */ 25 + /** 26 + * @QCOM_TZMEM_POLICY_MULTIPLIER: When out of memory, 27 + * add increment * current size of memory. 28 + */ 23 29 QCOM_TZMEM_POLICY_MULTIPLIER, 24 - /**< When out of memory add as much as is needed until max_size. */ 30 + /** 31 + * @QCOM_TZMEM_POLICY_ON_DEMAND: When out of memory 32 + * add as much as is needed until max_size. 33 + */ 25 34 QCOM_TZMEM_POLICY_ON_DEMAND, 26 35 }; 27 36
+7
include/linux/soc/qcom/llcc-qcom.h
··· 74 74 #define LLCC_CAMSRTIP 73 75 75 #define LLCC_CAMRTRF 74 76 76 #define LLCC_CAMSRTRF 75 77 + #define LLCC_VIDEO_APV 83 78 + #define LLCC_COMPUTE1 87 79 + #define LLCC_CPUSS_OPP 88 77 80 #define LLCC_CPUSSMPAM 89 81 + #define LLCC_CAM_IPE_STROV 92 82 + #define LLCC_CAM_OFE_STROV 93 83 + #define LLCC_CPUSS_HEU 94 84 + #define LLCC_MDM_PNG_FIXED 100 78 85 79 86 /** 80 87 * struct llcc_slice_desc - Cache slice descriptor
+4
include/linux/soc/qcom/socinfo.h
··· 82 82 __le32 num_func_clusters; 83 83 __le32 boot_cluster; 84 84 __le32 boot_core; 85 + /* Version 20 */ 86 + __le32 raw_package_type; 87 + /* Version 21, 22, 23 */ 88 + __le32 reserve1[4]; 85 89 }; 86 90 87 91 /* Internal feature codes */
+1
include/linux/soc/qcom/ubwc.h
··· 52 52 #define UBWC_4_0 0x40000000 53 53 #define UBWC_4_3 0x40030000 54 54 #define UBWC_5_0 0x50000000 55 + #define UBWC_6_0 0x60000000 55 56 56 57 #if IS_ENABLED(CONFIG_QCOM_UBWC_CONFIG) 57 58 const struct qcom_ubwc_cfg_data *qcom_ubwc_config_get_data(void);