1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright (c) 2010,2015,2019 The Linux Foundation. All rights reserved. 3 * Copyright (C) 2015 Linaro Ltd. 4 */ 5 6 #include <linux/arm-smccc.h> 7 #include <linux/bitfield.h> 8 #include <linux/bits.h> 9 #include <linux/clk.h> 10 #include <linux/completion.h> 11 #include <linux/cpumask.h> 12 #include <linux/dma-mapping.h> 13 #include <linux/export.h> 14 #include <linux/firmware/qcom/qcom_scm.h> 15 #include <linux/init.h> 16 #include <linux/interconnect.h> 17 #include <linux/interrupt.h> 18 #include <linux/module.h> 19 #include <linux/of.h> 20 #include <linux/of_address.h> 21 #include <linux/of_irq.h> 22 #include <linux/of_platform.h> 23 #include <linux/platform_device.h> 24 #include <linux/reset-controller.h> 25 #include <linux/types.h> 26 27 #include "qcom_scm.h" 28 29 static bool download_mode = IS_ENABLED(CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT); 30 module_param(download_mode, bool, 0); 31 32 struct qcom_scm { 33 struct device *dev; 34 struct clk *core_clk; 35 struct clk *iface_clk; 36 struct clk *bus_clk; 37 struct icc_path *path; 38 struct completion waitq_comp; 39 struct reset_controller_dev reset; 40 41 /* control access to the interconnect path */ 42 struct mutex scm_bw_lock; 43 int scm_vote_count; 44 45 u64 dload_mode_addr; 46 }; 47 48 struct qcom_scm_current_perm_info { 49 __le32 vmid; 50 __le32 perm; 51 __le64 ctx; 52 __le32 ctx_size; 53 __le32 unused; 54 }; 55 56 struct qcom_scm_mem_map_info { 57 __le64 mem_addr; 58 __le64 mem_size; 59 }; 60 61 /** 62 * struct qcom_scm_qseecom_resp - QSEECOM SCM call response. 63 * @result: Result or status of the SCM call. See &enum qcom_scm_qseecom_result. 64 * @resp_type: Type of the response. See &enum qcom_scm_qseecom_resp_type. 65 * @data: Response data. The type of this data is given in @resp_type. 66 */ 67 struct qcom_scm_qseecom_resp { 68 u64 result; 69 u64 resp_type; 70 u64 data; 71 }; 72 73 enum qcom_scm_qseecom_result { 74 QSEECOM_RESULT_SUCCESS = 0, 75 QSEECOM_RESULT_INCOMPLETE = 1, 76 QSEECOM_RESULT_BLOCKED_ON_LISTENER = 2, 77 QSEECOM_RESULT_FAILURE = 0xFFFFFFFF, 78 }; 79 80 enum qcom_scm_qseecom_resp_type { 81 QSEECOM_SCM_RES_APP_ID = 0xEE01, 82 QSEECOM_SCM_RES_QSEOS_LISTENER_ID = 0xEE02, 83 }; 84 85 enum qcom_scm_qseecom_tz_owner { 86 QSEECOM_TZ_OWNER_SIP = 2, 87 QSEECOM_TZ_OWNER_TZ_APPS = 48, 88 QSEECOM_TZ_OWNER_QSEE_OS = 50 89 }; 90 91 enum qcom_scm_qseecom_tz_svc { 92 QSEECOM_TZ_SVC_APP_ID_PLACEHOLDER = 0, 93 QSEECOM_TZ_SVC_APP_MGR = 1, 94 QSEECOM_TZ_SVC_INFO = 6, 95 }; 96 97 enum qcom_scm_qseecom_tz_cmd_app { 98 QSEECOM_TZ_CMD_APP_SEND = 1, 99 QSEECOM_TZ_CMD_APP_LOOKUP = 3, 100 }; 101 102 enum qcom_scm_qseecom_tz_cmd_info { 103 QSEECOM_TZ_CMD_INFO_VERSION = 3, 104 }; 105 106 #define QSEECOM_MAX_APP_NAME_SIZE 64 107 108 /* Each bit configures cold/warm boot address for one of the 4 CPUs */ 109 static const u8 qcom_scm_cpu_cold_bits[QCOM_SCM_BOOT_MAX_CPUS] = { 110 0, BIT(0), BIT(3), BIT(5) 111 }; 112 static const u8 qcom_scm_cpu_warm_bits[QCOM_SCM_BOOT_MAX_CPUS] = { 113 BIT(2), BIT(1), BIT(4), BIT(6) 114 }; 115 116 #define QCOM_SMC_WAITQ_FLAG_WAKE_ONE BIT(0) 117 #define QCOM_SMC_WAITQ_FLAG_WAKE_ALL BIT(1) 118 119 #define QCOM_DLOAD_MASK GENMASK(5, 4) 120 #define QCOM_DLOAD_NODUMP 0 121 #define QCOM_DLOAD_FULLDUMP 1 122 123 static const char * const qcom_scm_convention_names[] = { 124 [SMC_CONVENTION_UNKNOWN] = "unknown", 125 [SMC_CONVENTION_ARM_32] = "smc arm 32", 126 [SMC_CONVENTION_ARM_64] = "smc arm 64", 127 [SMC_CONVENTION_LEGACY] = "smc legacy", 128 }; 129 130 static struct qcom_scm *__scm; 131 132 static int qcom_scm_clk_enable(void) 133 { 134 int ret; 135 136 ret = clk_prepare_enable(__scm->core_clk); 137 if (ret) 138 goto bail; 139 140 ret = clk_prepare_enable(__scm->iface_clk); 141 if (ret) 142 goto disable_core; 143 144 ret = clk_prepare_enable(__scm->bus_clk); 145 if (ret) 146 goto disable_iface; 147 148 return 0; 149 150 disable_iface: 151 clk_disable_unprepare(__scm->iface_clk); 152 disable_core: 153 clk_disable_unprepare(__scm->core_clk); 154 bail: 155 return ret; 156 } 157 158 static void qcom_scm_clk_disable(void) 159 { 160 clk_disable_unprepare(__scm->core_clk); 161 clk_disable_unprepare(__scm->iface_clk); 162 clk_disable_unprepare(__scm->bus_clk); 163 } 164 165 static int qcom_scm_bw_enable(void) 166 { 167 int ret = 0; 168 169 if (!__scm->path) 170 return 0; 171 172 mutex_lock(&__scm->scm_bw_lock); 173 if (!__scm->scm_vote_count) { 174 ret = icc_set_bw(__scm->path, 0, UINT_MAX); 175 if (ret < 0) { 176 dev_err(__scm->dev, "failed to set bandwidth request\n"); 177 goto err_bw; 178 } 179 } 180 __scm->scm_vote_count++; 181 err_bw: 182 mutex_unlock(&__scm->scm_bw_lock); 183 184 return ret; 185 } 186 187 static void qcom_scm_bw_disable(void) 188 { 189 if (!__scm->path) 190 return; 191 192 mutex_lock(&__scm->scm_bw_lock); 193 if (__scm->scm_vote_count-- == 1) 194 icc_set_bw(__scm->path, 0, 0); 195 mutex_unlock(&__scm->scm_bw_lock); 196 } 197 198 enum qcom_scm_convention qcom_scm_convention = SMC_CONVENTION_UNKNOWN; 199 static DEFINE_SPINLOCK(scm_query_lock); 200 201 static enum qcom_scm_convention __get_convention(void) 202 { 203 unsigned long flags; 204 struct qcom_scm_desc desc = { 205 .svc = QCOM_SCM_SVC_INFO, 206 .cmd = QCOM_SCM_INFO_IS_CALL_AVAIL, 207 .args[0] = SCM_SMC_FNID(QCOM_SCM_SVC_INFO, 208 QCOM_SCM_INFO_IS_CALL_AVAIL) | 209 (ARM_SMCCC_OWNER_SIP << ARM_SMCCC_OWNER_SHIFT), 210 .arginfo = QCOM_SCM_ARGS(1), 211 .owner = ARM_SMCCC_OWNER_SIP, 212 }; 213 struct qcom_scm_res res; 214 enum qcom_scm_convention probed_convention; 215 int ret; 216 bool forced = false; 217 218 if (likely(qcom_scm_convention != SMC_CONVENTION_UNKNOWN)) 219 return qcom_scm_convention; 220 221 /* 222 * Per the "SMC calling convention specification", the 64-bit calling 223 * convention can only be used when the client is 64-bit, otherwise 224 * system will encounter the undefined behaviour. 225 */ 226 #if IS_ENABLED(CONFIG_ARM64) 227 /* 228 * Device isn't required as there is only one argument - no device 229 * needed to dma_map_single to secure world 230 */ 231 probed_convention = SMC_CONVENTION_ARM_64; 232 ret = __scm_smc_call(NULL, &desc, probed_convention, &res, true); 233 if (!ret && res.result[0] == 1) 234 goto found; 235 236 /* 237 * Some SC7180 firmwares didn't implement the 238 * QCOM_SCM_INFO_IS_CALL_AVAIL call, so we fallback to forcing ARM_64 239 * calling conventions on these firmwares. Luckily we don't make any 240 * early calls into the firmware on these SoCs so the device pointer 241 * will be valid here to check if the compatible matches. 242 */ 243 if (of_device_is_compatible(__scm ? __scm->dev->of_node : NULL, "qcom,scm-sc7180")) { 244 forced = true; 245 goto found; 246 } 247 #endif 248 249 probed_convention = SMC_CONVENTION_ARM_32; 250 ret = __scm_smc_call(NULL, &desc, probed_convention, &res, true); 251 if (!ret && res.result[0] == 1) 252 goto found; 253 254 probed_convention = SMC_CONVENTION_LEGACY; 255 found: 256 spin_lock_irqsave(&scm_query_lock, flags); 257 if (probed_convention != qcom_scm_convention) { 258 qcom_scm_convention = probed_convention; 259 pr_info("qcom_scm: convention: %s%s\n", 260 qcom_scm_convention_names[qcom_scm_convention], 261 forced ? " (forced)" : ""); 262 } 263 spin_unlock_irqrestore(&scm_query_lock, flags); 264 265 return qcom_scm_convention; 266 } 267 268 /** 269 * qcom_scm_call() - Invoke a syscall in the secure world 270 * @dev: device 271 * @desc: Descriptor structure containing arguments and return values 272 * @res: Structure containing results from SMC/HVC call 273 * 274 * Sends a command to the SCM and waits for the command to finish processing. 275 * This should *only* be called in pre-emptible context. 276 */ 277 static int qcom_scm_call(struct device *dev, const struct qcom_scm_desc *desc, 278 struct qcom_scm_res *res) 279 { 280 might_sleep(); 281 switch (__get_convention()) { 282 case SMC_CONVENTION_ARM_32: 283 case SMC_CONVENTION_ARM_64: 284 return scm_smc_call(dev, desc, res, false); 285 case SMC_CONVENTION_LEGACY: 286 return scm_legacy_call(dev, desc, res); 287 default: 288 pr_err("Unknown current SCM calling convention.\n"); 289 return -EINVAL; 290 } 291 } 292 293 /** 294 * qcom_scm_call_atomic() - atomic variation of qcom_scm_call() 295 * @dev: device 296 * @desc: Descriptor structure containing arguments and return values 297 * @res: Structure containing results from SMC/HVC call 298 * 299 * Sends a command to the SCM and waits for the command to finish processing. 300 * This can be called in atomic context. 301 */ 302 static int qcom_scm_call_atomic(struct device *dev, 303 const struct qcom_scm_desc *desc, 304 struct qcom_scm_res *res) 305 { 306 switch (__get_convention()) { 307 case SMC_CONVENTION_ARM_32: 308 case SMC_CONVENTION_ARM_64: 309 return scm_smc_call(dev, desc, res, true); 310 case SMC_CONVENTION_LEGACY: 311 return scm_legacy_call_atomic(dev, desc, res); 312 default: 313 pr_err("Unknown current SCM calling convention.\n"); 314 return -EINVAL; 315 } 316 } 317 318 static bool __qcom_scm_is_call_available(struct device *dev, u32 svc_id, 319 u32 cmd_id) 320 { 321 int ret; 322 struct qcom_scm_desc desc = { 323 .svc = QCOM_SCM_SVC_INFO, 324 .cmd = QCOM_SCM_INFO_IS_CALL_AVAIL, 325 .owner = ARM_SMCCC_OWNER_SIP, 326 }; 327 struct qcom_scm_res res; 328 329 desc.arginfo = QCOM_SCM_ARGS(1); 330 switch (__get_convention()) { 331 case SMC_CONVENTION_ARM_32: 332 case SMC_CONVENTION_ARM_64: 333 desc.args[0] = SCM_SMC_FNID(svc_id, cmd_id) | 334 (ARM_SMCCC_OWNER_SIP << ARM_SMCCC_OWNER_SHIFT); 335 break; 336 case SMC_CONVENTION_LEGACY: 337 desc.args[0] = SCM_LEGACY_FNID(svc_id, cmd_id); 338 break; 339 default: 340 pr_err("Unknown SMC convention being used\n"); 341 return false; 342 } 343 344 ret = qcom_scm_call(dev, &desc, &res); 345 346 return ret ? false : !!res.result[0]; 347 } 348 349 static int qcom_scm_set_boot_addr(void *entry, const u8 *cpu_bits) 350 { 351 int cpu; 352 unsigned int flags = 0; 353 struct qcom_scm_desc desc = { 354 .svc = QCOM_SCM_SVC_BOOT, 355 .cmd = QCOM_SCM_BOOT_SET_ADDR, 356 .arginfo = QCOM_SCM_ARGS(2), 357 .owner = ARM_SMCCC_OWNER_SIP, 358 }; 359 360 for_each_present_cpu(cpu) { 361 if (cpu >= QCOM_SCM_BOOT_MAX_CPUS) 362 return -EINVAL; 363 flags |= cpu_bits[cpu]; 364 } 365 366 desc.args[0] = flags; 367 desc.args[1] = virt_to_phys(entry); 368 369 return qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL); 370 } 371 372 static int qcom_scm_set_boot_addr_mc(void *entry, unsigned int flags) 373 { 374 struct qcom_scm_desc desc = { 375 .svc = QCOM_SCM_SVC_BOOT, 376 .cmd = QCOM_SCM_BOOT_SET_ADDR_MC, 377 .owner = ARM_SMCCC_OWNER_SIP, 378 .arginfo = QCOM_SCM_ARGS(6), 379 .args = { 380 virt_to_phys(entry), 381 /* Apply to all CPUs in all affinity levels */ 382 ~0ULL, ~0ULL, ~0ULL, ~0ULL, 383 flags, 384 }, 385 }; 386 387 /* Need a device for DMA of the additional arguments */ 388 if (!__scm || __get_convention() == SMC_CONVENTION_LEGACY) 389 return -EOPNOTSUPP; 390 391 return qcom_scm_call(__scm->dev, &desc, NULL); 392 } 393 394 /** 395 * qcom_scm_set_warm_boot_addr() - Set the warm boot address for all cpus 396 * @entry: Entry point function for the cpus 397 * 398 * Set the Linux entry point for the SCM to transfer control to when coming 399 * out of a power down. CPU power down may be executed on cpuidle or hotplug. 400 */ 401 int qcom_scm_set_warm_boot_addr(void *entry) 402 { 403 if (qcom_scm_set_boot_addr_mc(entry, QCOM_SCM_BOOT_MC_FLAG_WARMBOOT)) 404 /* Fallback to old SCM call */ 405 return qcom_scm_set_boot_addr(entry, qcom_scm_cpu_warm_bits); 406 return 0; 407 } 408 EXPORT_SYMBOL_GPL(qcom_scm_set_warm_boot_addr); 409 410 /** 411 * qcom_scm_set_cold_boot_addr() - Set the cold boot address for all cpus 412 * @entry: Entry point function for the cpus 413 */ 414 int qcom_scm_set_cold_boot_addr(void *entry) 415 { 416 if (qcom_scm_set_boot_addr_mc(entry, QCOM_SCM_BOOT_MC_FLAG_COLDBOOT)) 417 /* Fallback to old SCM call */ 418 return qcom_scm_set_boot_addr(entry, qcom_scm_cpu_cold_bits); 419 return 0; 420 } 421 EXPORT_SYMBOL_GPL(qcom_scm_set_cold_boot_addr); 422 423 /** 424 * qcom_scm_cpu_power_down() - Power down the cpu 425 * @flags: Flags to flush cache 426 * 427 * This is an end point to power down cpu. If there was a pending interrupt, 428 * the control would return from this function, otherwise, the cpu jumps to the 429 * warm boot entry point set for this cpu upon reset. 430 */ 431 void qcom_scm_cpu_power_down(u32 flags) 432 { 433 struct qcom_scm_desc desc = { 434 .svc = QCOM_SCM_SVC_BOOT, 435 .cmd = QCOM_SCM_BOOT_TERMINATE_PC, 436 .args[0] = flags & QCOM_SCM_FLUSH_FLAG_MASK, 437 .arginfo = QCOM_SCM_ARGS(1), 438 .owner = ARM_SMCCC_OWNER_SIP, 439 }; 440 441 qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL); 442 } 443 EXPORT_SYMBOL_GPL(qcom_scm_cpu_power_down); 444 445 int qcom_scm_set_remote_state(u32 state, u32 id) 446 { 447 struct qcom_scm_desc desc = { 448 .svc = QCOM_SCM_SVC_BOOT, 449 .cmd = QCOM_SCM_BOOT_SET_REMOTE_STATE, 450 .arginfo = QCOM_SCM_ARGS(2), 451 .args[0] = state, 452 .args[1] = id, 453 .owner = ARM_SMCCC_OWNER_SIP, 454 }; 455 struct qcom_scm_res res; 456 int ret; 457 458 ret = qcom_scm_call(__scm->dev, &desc, &res); 459 460 return ret ? : res.result[0]; 461 } 462 EXPORT_SYMBOL_GPL(qcom_scm_set_remote_state); 463 464 static int qcom_scm_disable_sdi(void) 465 { 466 int ret; 467 struct qcom_scm_desc desc = { 468 .svc = QCOM_SCM_SVC_BOOT, 469 .cmd = QCOM_SCM_BOOT_SDI_CONFIG, 470 .args[0] = 1, /* Disable watchdog debug */ 471 .args[1] = 0, /* Disable SDI */ 472 .arginfo = QCOM_SCM_ARGS(2), 473 .owner = ARM_SMCCC_OWNER_SIP, 474 }; 475 struct qcom_scm_res res; 476 477 ret = qcom_scm_clk_enable(); 478 if (ret) 479 return ret; 480 ret = qcom_scm_call(__scm->dev, &desc, &res); 481 482 qcom_scm_clk_disable(); 483 484 return ret ? : res.result[0]; 485 } 486 487 static int __qcom_scm_set_dload_mode(struct device *dev, bool enable) 488 { 489 struct qcom_scm_desc desc = { 490 .svc = QCOM_SCM_SVC_BOOT, 491 .cmd = QCOM_SCM_BOOT_SET_DLOAD_MODE, 492 .arginfo = QCOM_SCM_ARGS(2), 493 .args[0] = QCOM_SCM_BOOT_SET_DLOAD_MODE, 494 .owner = ARM_SMCCC_OWNER_SIP, 495 }; 496 497 desc.args[1] = enable ? QCOM_SCM_BOOT_SET_DLOAD_MODE : 0; 498 499 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); 500 } 501 502 static int qcom_scm_io_rmw(phys_addr_t addr, unsigned int mask, unsigned int val) 503 { 504 unsigned int old; 505 unsigned int new; 506 int ret; 507 508 ret = qcom_scm_io_readl(addr, &old); 509 if (ret) 510 return ret; 511 512 new = (old & ~mask) | (val & mask); 513 514 return qcom_scm_io_writel(addr, new); 515 } 516 517 static void qcom_scm_set_download_mode(bool enable) 518 { 519 u32 val = enable ? QCOM_DLOAD_FULLDUMP : QCOM_DLOAD_NODUMP; 520 int ret = 0; 521 522 if (__scm->dload_mode_addr) { 523 ret = qcom_scm_io_rmw(__scm->dload_mode_addr, QCOM_DLOAD_MASK, 524 FIELD_PREP(QCOM_DLOAD_MASK, val)); 525 } else if (__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_BOOT, 526 QCOM_SCM_BOOT_SET_DLOAD_MODE)) { 527 ret = __qcom_scm_set_dload_mode(__scm->dev, enable); 528 } else { 529 dev_err(__scm->dev, 530 "No available mechanism for setting download mode\n"); 531 } 532 533 if (ret) 534 dev_err(__scm->dev, "failed to set download mode: %d\n", ret); 535 } 536 537 /** 538 * qcom_scm_pas_init_image() - Initialize peripheral authentication service 539 * state machine for a given peripheral, using the 540 * metadata 541 * @peripheral: peripheral id 542 * @metadata: pointer to memory containing ELF header, program header table 543 * and optional blob of data used for authenticating the metadata 544 * and the rest of the firmware 545 * @size: size of the metadata 546 * @ctx: optional metadata context 547 * 548 * Return: 0 on success. 549 * 550 * Upon successful return, the PAS metadata context (@ctx) will be used to 551 * track the metadata allocation, this needs to be released by invoking 552 * qcom_scm_pas_metadata_release() by the caller. 553 */ 554 int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size, 555 struct qcom_scm_pas_metadata *ctx) 556 { 557 dma_addr_t mdata_phys; 558 void *mdata_buf; 559 int ret; 560 struct qcom_scm_desc desc = { 561 .svc = QCOM_SCM_SVC_PIL, 562 .cmd = QCOM_SCM_PIL_PAS_INIT_IMAGE, 563 .arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_VAL, QCOM_SCM_RW), 564 .args[0] = peripheral, 565 .owner = ARM_SMCCC_OWNER_SIP, 566 }; 567 struct qcom_scm_res res; 568 569 /* 570 * During the scm call memory protection will be enabled for the meta 571 * data blob, so make sure it's physically contiguous, 4K aligned and 572 * non-cachable to avoid XPU violations. 573 */ 574 mdata_buf = dma_alloc_coherent(__scm->dev, size, &mdata_phys, 575 GFP_KERNEL); 576 if (!mdata_buf) 577 return -ENOMEM; 578 579 memcpy(mdata_buf, metadata, size); 580 581 ret = qcom_scm_clk_enable(); 582 if (ret) 583 goto out; 584 585 ret = qcom_scm_bw_enable(); 586 if (ret) 587 goto disable_clk; 588 589 desc.args[1] = mdata_phys; 590 591 ret = qcom_scm_call(__scm->dev, &desc, &res); 592 qcom_scm_bw_disable(); 593 594 disable_clk: 595 qcom_scm_clk_disable(); 596 597 out: 598 if (ret < 0 || !ctx) { 599 dma_free_coherent(__scm->dev, size, mdata_buf, mdata_phys); 600 } else if (ctx) { 601 ctx->ptr = mdata_buf; 602 ctx->phys = mdata_phys; 603 ctx->size = size; 604 } 605 606 return ret ? : res.result[0]; 607 } 608 EXPORT_SYMBOL_GPL(qcom_scm_pas_init_image); 609 610 /** 611 * qcom_scm_pas_metadata_release() - release metadata context 612 * @ctx: metadata context 613 */ 614 void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx) 615 { 616 if (!ctx->ptr) 617 return; 618 619 dma_free_coherent(__scm->dev, ctx->size, ctx->ptr, ctx->phys); 620 621 ctx->ptr = NULL; 622 ctx->phys = 0; 623 ctx->size = 0; 624 } 625 EXPORT_SYMBOL_GPL(qcom_scm_pas_metadata_release); 626 627 /** 628 * qcom_scm_pas_mem_setup() - Prepare the memory related to a given peripheral 629 * for firmware loading 630 * @peripheral: peripheral id 631 * @addr: start address of memory area to prepare 632 * @size: size of the memory area to prepare 633 * 634 * Returns 0 on success. 635 */ 636 int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size) 637 { 638 int ret; 639 struct qcom_scm_desc desc = { 640 .svc = QCOM_SCM_SVC_PIL, 641 .cmd = QCOM_SCM_PIL_PAS_MEM_SETUP, 642 .arginfo = QCOM_SCM_ARGS(3), 643 .args[0] = peripheral, 644 .args[1] = addr, 645 .args[2] = size, 646 .owner = ARM_SMCCC_OWNER_SIP, 647 }; 648 struct qcom_scm_res res; 649 650 ret = qcom_scm_clk_enable(); 651 if (ret) 652 return ret; 653 654 ret = qcom_scm_bw_enable(); 655 if (ret) 656 goto disable_clk; 657 658 ret = qcom_scm_call(__scm->dev, &desc, &res); 659 qcom_scm_bw_disable(); 660 661 disable_clk: 662 qcom_scm_clk_disable(); 663 664 return ret ? : res.result[0]; 665 } 666 EXPORT_SYMBOL_GPL(qcom_scm_pas_mem_setup); 667 668 /** 669 * qcom_scm_pas_auth_and_reset() - Authenticate the given peripheral firmware 670 * and reset the remote processor 671 * @peripheral: peripheral id 672 * 673 * Return 0 on success. 674 */ 675 int qcom_scm_pas_auth_and_reset(u32 peripheral) 676 { 677 int ret; 678 struct qcom_scm_desc desc = { 679 .svc = QCOM_SCM_SVC_PIL, 680 .cmd = QCOM_SCM_PIL_PAS_AUTH_AND_RESET, 681 .arginfo = QCOM_SCM_ARGS(1), 682 .args[0] = peripheral, 683 .owner = ARM_SMCCC_OWNER_SIP, 684 }; 685 struct qcom_scm_res res; 686 687 ret = qcom_scm_clk_enable(); 688 if (ret) 689 return ret; 690 691 ret = qcom_scm_bw_enable(); 692 if (ret) 693 goto disable_clk; 694 695 ret = qcom_scm_call(__scm->dev, &desc, &res); 696 qcom_scm_bw_disable(); 697 698 disable_clk: 699 qcom_scm_clk_disable(); 700 701 return ret ? : res.result[0]; 702 } 703 EXPORT_SYMBOL_GPL(qcom_scm_pas_auth_and_reset); 704 705 /** 706 * qcom_scm_pas_shutdown() - Shut down the remote processor 707 * @peripheral: peripheral id 708 * 709 * Returns 0 on success. 710 */ 711 int qcom_scm_pas_shutdown(u32 peripheral) 712 { 713 int ret; 714 struct qcom_scm_desc desc = { 715 .svc = QCOM_SCM_SVC_PIL, 716 .cmd = QCOM_SCM_PIL_PAS_SHUTDOWN, 717 .arginfo = QCOM_SCM_ARGS(1), 718 .args[0] = peripheral, 719 .owner = ARM_SMCCC_OWNER_SIP, 720 }; 721 struct qcom_scm_res res; 722 723 ret = qcom_scm_clk_enable(); 724 if (ret) 725 return ret; 726 727 ret = qcom_scm_bw_enable(); 728 if (ret) 729 goto disable_clk; 730 731 ret = qcom_scm_call(__scm->dev, &desc, &res); 732 qcom_scm_bw_disable(); 733 734 disable_clk: 735 qcom_scm_clk_disable(); 736 737 return ret ? : res.result[0]; 738 } 739 EXPORT_SYMBOL_GPL(qcom_scm_pas_shutdown); 740 741 /** 742 * qcom_scm_pas_supported() - Check if the peripheral authentication service is 743 * available for the given peripherial 744 * @peripheral: peripheral id 745 * 746 * Returns true if PAS is supported for this peripheral, otherwise false. 747 */ 748 bool qcom_scm_pas_supported(u32 peripheral) 749 { 750 int ret; 751 struct qcom_scm_desc desc = { 752 .svc = QCOM_SCM_SVC_PIL, 753 .cmd = QCOM_SCM_PIL_PAS_IS_SUPPORTED, 754 .arginfo = QCOM_SCM_ARGS(1), 755 .args[0] = peripheral, 756 .owner = ARM_SMCCC_OWNER_SIP, 757 }; 758 struct qcom_scm_res res; 759 760 if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_PIL, 761 QCOM_SCM_PIL_PAS_IS_SUPPORTED)) 762 return false; 763 764 ret = qcom_scm_call(__scm->dev, &desc, &res); 765 766 return ret ? false : !!res.result[0]; 767 } 768 EXPORT_SYMBOL_GPL(qcom_scm_pas_supported); 769 770 static int __qcom_scm_pas_mss_reset(struct device *dev, bool reset) 771 { 772 struct qcom_scm_desc desc = { 773 .svc = QCOM_SCM_SVC_PIL, 774 .cmd = QCOM_SCM_PIL_PAS_MSS_RESET, 775 .arginfo = QCOM_SCM_ARGS(2), 776 .args[0] = reset, 777 .args[1] = 0, 778 .owner = ARM_SMCCC_OWNER_SIP, 779 }; 780 struct qcom_scm_res res; 781 int ret; 782 783 ret = qcom_scm_call(__scm->dev, &desc, &res); 784 785 return ret ? : res.result[0]; 786 } 787 788 static int qcom_scm_pas_reset_assert(struct reset_controller_dev *rcdev, 789 unsigned long idx) 790 { 791 if (idx != 0) 792 return -EINVAL; 793 794 return __qcom_scm_pas_mss_reset(__scm->dev, 1); 795 } 796 797 static int qcom_scm_pas_reset_deassert(struct reset_controller_dev *rcdev, 798 unsigned long idx) 799 { 800 if (idx != 0) 801 return -EINVAL; 802 803 return __qcom_scm_pas_mss_reset(__scm->dev, 0); 804 } 805 806 static const struct reset_control_ops qcom_scm_pas_reset_ops = { 807 .assert = qcom_scm_pas_reset_assert, 808 .deassert = qcom_scm_pas_reset_deassert, 809 }; 810 811 int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val) 812 { 813 struct qcom_scm_desc desc = { 814 .svc = QCOM_SCM_SVC_IO, 815 .cmd = QCOM_SCM_IO_READ, 816 .arginfo = QCOM_SCM_ARGS(1), 817 .args[0] = addr, 818 .owner = ARM_SMCCC_OWNER_SIP, 819 }; 820 struct qcom_scm_res res; 821 int ret; 822 823 824 ret = qcom_scm_call_atomic(__scm->dev, &desc, &res); 825 if (ret >= 0) 826 *val = res.result[0]; 827 828 return ret < 0 ? ret : 0; 829 } 830 EXPORT_SYMBOL_GPL(qcom_scm_io_readl); 831 832 int qcom_scm_io_writel(phys_addr_t addr, unsigned int val) 833 { 834 struct qcom_scm_desc desc = { 835 .svc = QCOM_SCM_SVC_IO, 836 .cmd = QCOM_SCM_IO_WRITE, 837 .arginfo = QCOM_SCM_ARGS(2), 838 .args[0] = addr, 839 .args[1] = val, 840 .owner = ARM_SMCCC_OWNER_SIP, 841 }; 842 843 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); 844 } 845 EXPORT_SYMBOL_GPL(qcom_scm_io_writel); 846 847 /** 848 * qcom_scm_restore_sec_cfg_available() - Check if secure environment 849 * supports restore security config interface. 850 * 851 * Return true if restore-cfg interface is supported, false if not. 852 */ 853 bool qcom_scm_restore_sec_cfg_available(void) 854 { 855 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP, 856 QCOM_SCM_MP_RESTORE_SEC_CFG); 857 } 858 EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg_available); 859 860 int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare) 861 { 862 struct qcom_scm_desc desc = { 863 .svc = QCOM_SCM_SVC_MP, 864 .cmd = QCOM_SCM_MP_RESTORE_SEC_CFG, 865 .arginfo = QCOM_SCM_ARGS(2), 866 .args[0] = device_id, 867 .args[1] = spare, 868 .owner = ARM_SMCCC_OWNER_SIP, 869 }; 870 struct qcom_scm_res res; 871 int ret; 872 873 ret = qcom_scm_call(__scm->dev, &desc, &res); 874 875 return ret ? : res.result[0]; 876 } 877 EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg); 878 879 int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size) 880 { 881 struct qcom_scm_desc desc = { 882 .svc = QCOM_SCM_SVC_MP, 883 .cmd = QCOM_SCM_MP_IOMMU_SECURE_PTBL_SIZE, 884 .arginfo = QCOM_SCM_ARGS(1), 885 .args[0] = spare, 886 .owner = ARM_SMCCC_OWNER_SIP, 887 }; 888 struct qcom_scm_res res; 889 int ret; 890 891 ret = qcom_scm_call(__scm->dev, &desc, &res); 892 893 if (size) 894 *size = res.result[0]; 895 896 return ret ? : res.result[1]; 897 } 898 EXPORT_SYMBOL_GPL(qcom_scm_iommu_secure_ptbl_size); 899 900 int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare) 901 { 902 struct qcom_scm_desc desc = { 903 .svc = QCOM_SCM_SVC_MP, 904 .cmd = QCOM_SCM_MP_IOMMU_SECURE_PTBL_INIT, 905 .arginfo = QCOM_SCM_ARGS(3, QCOM_SCM_RW, QCOM_SCM_VAL, 906 QCOM_SCM_VAL), 907 .args[0] = addr, 908 .args[1] = size, 909 .args[2] = spare, 910 .owner = ARM_SMCCC_OWNER_SIP, 911 }; 912 int ret; 913 914 ret = qcom_scm_call(__scm->dev, &desc, NULL); 915 916 /* the pg table has been initialized already, ignore the error */ 917 if (ret == -EPERM) 918 ret = 0; 919 920 return ret; 921 } 922 EXPORT_SYMBOL_GPL(qcom_scm_iommu_secure_ptbl_init); 923 924 int qcom_scm_iommu_set_cp_pool_size(u32 spare, u32 size) 925 { 926 struct qcom_scm_desc desc = { 927 .svc = QCOM_SCM_SVC_MP, 928 .cmd = QCOM_SCM_MP_IOMMU_SET_CP_POOL_SIZE, 929 .arginfo = QCOM_SCM_ARGS(2), 930 .args[0] = size, 931 .args[1] = spare, 932 .owner = ARM_SMCCC_OWNER_SIP, 933 }; 934 935 return qcom_scm_call(__scm->dev, &desc, NULL); 936 } 937 EXPORT_SYMBOL_GPL(qcom_scm_iommu_set_cp_pool_size); 938 939 int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size, 940 u32 cp_nonpixel_start, 941 u32 cp_nonpixel_size) 942 { 943 int ret; 944 struct qcom_scm_desc desc = { 945 .svc = QCOM_SCM_SVC_MP, 946 .cmd = QCOM_SCM_MP_VIDEO_VAR, 947 .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_VAL, QCOM_SCM_VAL, 948 QCOM_SCM_VAL, QCOM_SCM_VAL), 949 .args[0] = cp_start, 950 .args[1] = cp_size, 951 .args[2] = cp_nonpixel_start, 952 .args[3] = cp_nonpixel_size, 953 .owner = ARM_SMCCC_OWNER_SIP, 954 }; 955 struct qcom_scm_res res; 956 957 ret = qcom_scm_call(__scm->dev, &desc, &res); 958 959 return ret ? : res.result[0]; 960 } 961 EXPORT_SYMBOL_GPL(qcom_scm_mem_protect_video_var); 962 963 static int __qcom_scm_assign_mem(struct device *dev, phys_addr_t mem_region, 964 size_t mem_sz, phys_addr_t src, size_t src_sz, 965 phys_addr_t dest, size_t dest_sz) 966 { 967 int ret; 968 struct qcom_scm_desc desc = { 969 .svc = QCOM_SCM_SVC_MP, 970 .cmd = QCOM_SCM_MP_ASSIGN, 971 .arginfo = QCOM_SCM_ARGS(7, QCOM_SCM_RO, QCOM_SCM_VAL, 972 QCOM_SCM_RO, QCOM_SCM_VAL, QCOM_SCM_RO, 973 QCOM_SCM_VAL, QCOM_SCM_VAL), 974 .args[0] = mem_region, 975 .args[1] = mem_sz, 976 .args[2] = src, 977 .args[3] = src_sz, 978 .args[4] = dest, 979 .args[5] = dest_sz, 980 .args[6] = 0, 981 .owner = ARM_SMCCC_OWNER_SIP, 982 }; 983 struct qcom_scm_res res; 984 985 ret = qcom_scm_call(dev, &desc, &res); 986 987 return ret ? : res.result[0]; 988 } 989 990 /** 991 * qcom_scm_assign_mem() - Make a secure call to reassign memory ownership 992 * @mem_addr: mem region whose ownership need to be reassigned 993 * @mem_sz: size of the region. 994 * @srcvm: vmid for current set of owners, each set bit in 995 * flag indicate a unique owner 996 * @newvm: array having new owners and corresponding permission 997 * flags 998 * @dest_cnt: number of owners in next set. 999 * 1000 * Return negative errno on failure or 0 on success with @srcvm updated. 1001 */ 1002 int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, 1003 u64 *srcvm, 1004 const struct qcom_scm_vmperm *newvm, 1005 unsigned int dest_cnt) 1006 { 1007 struct qcom_scm_current_perm_info *destvm; 1008 struct qcom_scm_mem_map_info *mem_to_map; 1009 phys_addr_t mem_to_map_phys; 1010 phys_addr_t dest_phys; 1011 dma_addr_t ptr_phys; 1012 size_t mem_to_map_sz; 1013 size_t dest_sz; 1014 size_t src_sz; 1015 size_t ptr_sz; 1016 int next_vm; 1017 __le32 *src; 1018 void *ptr; 1019 int ret, i, b; 1020 u64 srcvm_bits = *srcvm; 1021 1022 src_sz = hweight64(srcvm_bits) * sizeof(*src); 1023 mem_to_map_sz = sizeof(*mem_to_map); 1024 dest_sz = dest_cnt * sizeof(*destvm); 1025 ptr_sz = ALIGN(src_sz, SZ_64) + ALIGN(mem_to_map_sz, SZ_64) + 1026 ALIGN(dest_sz, SZ_64); 1027 1028 ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL); 1029 if (!ptr) 1030 return -ENOMEM; 1031 1032 /* Fill source vmid detail */ 1033 src = ptr; 1034 i = 0; 1035 for (b = 0; b < BITS_PER_TYPE(u64); b++) { 1036 if (srcvm_bits & BIT(b)) 1037 src[i++] = cpu_to_le32(b); 1038 } 1039 1040 /* Fill details of mem buff to map */ 1041 mem_to_map = ptr + ALIGN(src_sz, SZ_64); 1042 mem_to_map_phys = ptr_phys + ALIGN(src_sz, SZ_64); 1043 mem_to_map->mem_addr = cpu_to_le64(mem_addr); 1044 mem_to_map->mem_size = cpu_to_le64(mem_sz); 1045 1046 next_vm = 0; 1047 /* Fill details of next vmid detail */ 1048 destvm = ptr + ALIGN(mem_to_map_sz, SZ_64) + ALIGN(src_sz, SZ_64); 1049 dest_phys = ptr_phys + ALIGN(mem_to_map_sz, SZ_64) + ALIGN(src_sz, SZ_64); 1050 for (i = 0; i < dest_cnt; i++, destvm++, newvm++) { 1051 destvm->vmid = cpu_to_le32(newvm->vmid); 1052 destvm->perm = cpu_to_le32(newvm->perm); 1053 destvm->ctx = 0; 1054 destvm->ctx_size = 0; 1055 next_vm |= BIT(newvm->vmid); 1056 } 1057 1058 ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz, 1059 ptr_phys, src_sz, dest_phys, dest_sz); 1060 dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys); 1061 if (ret) { 1062 dev_err(__scm->dev, 1063 "Assign memory protection call failed %d\n", ret); 1064 return -EINVAL; 1065 } 1066 1067 *srcvm = next_vm; 1068 return 0; 1069 } 1070 EXPORT_SYMBOL_GPL(qcom_scm_assign_mem); 1071 1072 /** 1073 * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available 1074 */ 1075 bool qcom_scm_ocmem_lock_available(void) 1076 { 1077 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_OCMEM, 1078 QCOM_SCM_OCMEM_LOCK_CMD); 1079 } 1080 EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock_available); 1081 1082 /** 1083 * qcom_scm_ocmem_lock() - call OCMEM lock interface to assign an OCMEM 1084 * region to the specified initiator 1085 * 1086 * @id: tz initiator id 1087 * @offset: OCMEM offset 1088 * @size: OCMEM size 1089 * @mode: access mode (WIDE/NARROW) 1090 */ 1091 int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset, u32 size, 1092 u32 mode) 1093 { 1094 struct qcom_scm_desc desc = { 1095 .svc = QCOM_SCM_SVC_OCMEM, 1096 .cmd = QCOM_SCM_OCMEM_LOCK_CMD, 1097 .args[0] = id, 1098 .args[1] = offset, 1099 .args[2] = size, 1100 .args[3] = mode, 1101 .arginfo = QCOM_SCM_ARGS(4), 1102 }; 1103 1104 return qcom_scm_call(__scm->dev, &desc, NULL); 1105 } 1106 EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock); 1107 1108 /** 1109 * qcom_scm_ocmem_unlock() - call OCMEM unlock interface to release an OCMEM 1110 * region from the specified initiator 1111 * 1112 * @id: tz initiator id 1113 * @offset: OCMEM offset 1114 * @size: OCMEM size 1115 */ 1116 int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size) 1117 { 1118 struct qcom_scm_desc desc = { 1119 .svc = QCOM_SCM_SVC_OCMEM, 1120 .cmd = QCOM_SCM_OCMEM_UNLOCK_CMD, 1121 .args[0] = id, 1122 .args[1] = offset, 1123 .args[2] = size, 1124 .arginfo = QCOM_SCM_ARGS(3), 1125 }; 1126 1127 return qcom_scm_call(__scm->dev, &desc, NULL); 1128 } 1129 EXPORT_SYMBOL_GPL(qcom_scm_ocmem_unlock); 1130 1131 /** 1132 * qcom_scm_ice_available() - Is the ICE key programming interface available? 1133 * 1134 * Return: true iff the SCM calls wrapped by qcom_scm_ice_invalidate_key() and 1135 * qcom_scm_ice_set_key() are available. 1136 */ 1137 bool qcom_scm_ice_available(void) 1138 { 1139 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1140 QCOM_SCM_ES_INVALIDATE_ICE_KEY) && 1141 __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1142 QCOM_SCM_ES_CONFIG_SET_ICE_KEY); 1143 } 1144 EXPORT_SYMBOL_GPL(qcom_scm_ice_available); 1145 1146 /** 1147 * qcom_scm_ice_invalidate_key() - Invalidate an inline encryption key 1148 * @index: the keyslot to invalidate 1149 * 1150 * The UFSHCI and eMMC standards define a standard way to do this, but it 1151 * doesn't work on these SoCs; only this SCM call does. 1152 * 1153 * It is assumed that the SoC has only one ICE instance being used, as this SCM 1154 * call doesn't specify which ICE instance the keyslot belongs to. 1155 * 1156 * Return: 0 on success; -errno on failure. 1157 */ 1158 int qcom_scm_ice_invalidate_key(u32 index) 1159 { 1160 struct qcom_scm_desc desc = { 1161 .svc = QCOM_SCM_SVC_ES, 1162 .cmd = QCOM_SCM_ES_INVALIDATE_ICE_KEY, 1163 .arginfo = QCOM_SCM_ARGS(1), 1164 .args[0] = index, 1165 .owner = ARM_SMCCC_OWNER_SIP, 1166 }; 1167 1168 return qcom_scm_call(__scm->dev, &desc, NULL); 1169 } 1170 EXPORT_SYMBOL_GPL(qcom_scm_ice_invalidate_key); 1171 1172 /** 1173 * qcom_scm_ice_set_key() - Set an inline encryption key 1174 * @index: the keyslot into which to set the key 1175 * @key: the key to program 1176 * @key_size: the size of the key in bytes 1177 * @cipher: the encryption algorithm the key is for 1178 * @data_unit_size: the encryption data unit size, i.e. the size of each 1179 * individual plaintext and ciphertext. Given in 512-byte 1180 * units, e.g. 1 = 512 bytes, 8 = 4096 bytes, etc. 1181 * 1182 * Program a key into a keyslot of Qualcomm ICE (Inline Crypto Engine), where it 1183 * can then be used to encrypt/decrypt UFS or eMMC I/O requests inline. 1184 * 1185 * The UFSHCI and eMMC standards define a standard way to do this, but it 1186 * doesn't work on these SoCs; only this SCM call does. 1187 * 1188 * It is assumed that the SoC has only one ICE instance being used, as this SCM 1189 * call doesn't specify which ICE instance the keyslot belongs to. 1190 * 1191 * Return: 0 on success; -errno on failure. 1192 */ 1193 int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size, 1194 enum qcom_scm_ice_cipher cipher, u32 data_unit_size) 1195 { 1196 struct qcom_scm_desc desc = { 1197 .svc = QCOM_SCM_SVC_ES, 1198 .cmd = QCOM_SCM_ES_CONFIG_SET_ICE_KEY, 1199 .arginfo = QCOM_SCM_ARGS(5, QCOM_SCM_VAL, QCOM_SCM_RW, 1200 QCOM_SCM_VAL, QCOM_SCM_VAL, 1201 QCOM_SCM_VAL), 1202 .args[0] = index, 1203 .args[2] = key_size, 1204 .args[3] = cipher, 1205 .args[4] = data_unit_size, 1206 .owner = ARM_SMCCC_OWNER_SIP, 1207 }; 1208 void *keybuf; 1209 dma_addr_t key_phys; 1210 int ret; 1211 1212 /* 1213 * 'key' may point to vmalloc()'ed memory, but we need to pass a 1214 * physical address that's been properly flushed. The sanctioned way to 1215 * do this is by using the DMA API. But as is best practice for crypto 1216 * keys, we also must wipe the key after use. This makes kmemdup() + 1217 * dma_map_single() not clearly correct, since the DMA API can use 1218 * bounce buffers. Instead, just use dma_alloc_coherent(). Programming 1219 * keys is normally rare and thus not performance-critical. 1220 */ 1221 1222 keybuf = dma_alloc_coherent(__scm->dev, key_size, &key_phys, 1223 GFP_KERNEL); 1224 if (!keybuf) 1225 return -ENOMEM; 1226 memcpy(keybuf, key, key_size); 1227 desc.args[1] = key_phys; 1228 1229 ret = qcom_scm_call(__scm->dev, &desc, NULL); 1230 1231 memzero_explicit(keybuf, key_size); 1232 1233 dma_free_coherent(__scm->dev, key_size, keybuf, key_phys); 1234 return ret; 1235 } 1236 EXPORT_SYMBOL_GPL(qcom_scm_ice_set_key); 1237 1238 /** 1239 * qcom_scm_hdcp_available() - Check if secure environment supports HDCP. 1240 * 1241 * Return true if HDCP is supported, false if not. 1242 */ 1243 bool qcom_scm_hdcp_available(void) 1244 { 1245 bool avail; 1246 int ret = qcom_scm_clk_enable(); 1247 1248 if (ret) 1249 return ret; 1250 1251 avail = __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_HDCP, 1252 QCOM_SCM_HDCP_INVOKE); 1253 1254 qcom_scm_clk_disable(); 1255 1256 return avail; 1257 } 1258 EXPORT_SYMBOL_GPL(qcom_scm_hdcp_available); 1259 1260 /** 1261 * qcom_scm_hdcp_req() - Send HDCP request. 1262 * @req: HDCP request array 1263 * @req_cnt: HDCP request array count 1264 * @resp: response buffer passed to SCM 1265 * 1266 * Write HDCP register(s) through SCM. 1267 */ 1268 int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp) 1269 { 1270 int ret; 1271 struct qcom_scm_desc desc = { 1272 .svc = QCOM_SCM_SVC_HDCP, 1273 .cmd = QCOM_SCM_HDCP_INVOKE, 1274 .arginfo = QCOM_SCM_ARGS(10), 1275 .args = { 1276 req[0].addr, 1277 req[0].val, 1278 req[1].addr, 1279 req[1].val, 1280 req[2].addr, 1281 req[2].val, 1282 req[3].addr, 1283 req[3].val, 1284 req[4].addr, 1285 req[4].val 1286 }, 1287 .owner = ARM_SMCCC_OWNER_SIP, 1288 }; 1289 struct qcom_scm_res res; 1290 1291 if (req_cnt > QCOM_SCM_HDCP_MAX_REQ_CNT) 1292 return -ERANGE; 1293 1294 ret = qcom_scm_clk_enable(); 1295 if (ret) 1296 return ret; 1297 1298 ret = qcom_scm_call(__scm->dev, &desc, &res); 1299 *resp = res.result[0]; 1300 1301 qcom_scm_clk_disable(); 1302 1303 return ret; 1304 } 1305 EXPORT_SYMBOL_GPL(qcom_scm_hdcp_req); 1306 1307 int qcom_scm_iommu_set_pt_format(u32 sec_id, u32 ctx_num, u32 pt_fmt) 1308 { 1309 struct qcom_scm_desc desc = { 1310 .svc = QCOM_SCM_SVC_SMMU_PROGRAM, 1311 .cmd = QCOM_SCM_SMMU_PT_FORMAT, 1312 .arginfo = QCOM_SCM_ARGS(3), 1313 .args[0] = sec_id, 1314 .args[1] = ctx_num, 1315 .args[2] = pt_fmt, /* 0: LPAE AArch32 - 1: AArch64 */ 1316 .owner = ARM_SMCCC_OWNER_SIP, 1317 }; 1318 1319 return qcom_scm_call(__scm->dev, &desc, NULL); 1320 } 1321 EXPORT_SYMBOL_GPL(qcom_scm_iommu_set_pt_format); 1322 1323 int qcom_scm_qsmmu500_wait_safe_toggle(bool en) 1324 { 1325 struct qcom_scm_desc desc = { 1326 .svc = QCOM_SCM_SVC_SMMU_PROGRAM, 1327 .cmd = QCOM_SCM_SMMU_CONFIG_ERRATA1, 1328 .arginfo = QCOM_SCM_ARGS(2), 1329 .args[0] = QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL, 1330 .args[1] = en, 1331 .owner = ARM_SMCCC_OWNER_SIP, 1332 }; 1333 1334 1335 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); 1336 } 1337 EXPORT_SYMBOL_GPL(qcom_scm_qsmmu500_wait_safe_toggle); 1338 1339 bool qcom_scm_lmh_dcvsh_available(void) 1340 { 1341 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_LMH, QCOM_SCM_LMH_LIMIT_DCVSH); 1342 } 1343 EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available); 1344 1345 int qcom_scm_lmh_profile_change(u32 profile_id) 1346 { 1347 struct qcom_scm_desc desc = { 1348 .svc = QCOM_SCM_SVC_LMH, 1349 .cmd = QCOM_SCM_LMH_LIMIT_PROFILE_CHANGE, 1350 .arginfo = QCOM_SCM_ARGS(1, QCOM_SCM_VAL), 1351 .args[0] = profile_id, 1352 .owner = ARM_SMCCC_OWNER_SIP, 1353 }; 1354 1355 return qcom_scm_call(__scm->dev, &desc, NULL); 1356 } 1357 EXPORT_SYMBOL_GPL(qcom_scm_lmh_profile_change); 1358 1359 int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val, 1360 u64 limit_node, u32 node_id, u64 version) 1361 { 1362 dma_addr_t payload_phys; 1363 u32 *payload_buf; 1364 int ret, payload_size = 5 * sizeof(u32); 1365 1366 struct qcom_scm_desc desc = { 1367 .svc = QCOM_SCM_SVC_LMH, 1368 .cmd = QCOM_SCM_LMH_LIMIT_DCVSH, 1369 .arginfo = QCOM_SCM_ARGS(5, QCOM_SCM_RO, QCOM_SCM_VAL, QCOM_SCM_VAL, 1370 QCOM_SCM_VAL, QCOM_SCM_VAL), 1371 .args[1] = payload_size, 1372 .args[2] = limit_node, 1373 .args[3] = node_id, 1374 .args[4] = version, 1375 .owner = ARM_SMCCC_OWNER_SIP, 1376 }; 1377 1378 payload_buf = dma_alloc_coherent(__scm->dev, payload_size, &payload_phys, GFP_KERNEL); 1379 if (!payload_buf) 1380 return -ENOMEM; 1381 1382 payload_buf[0] = payload_fn; 1383 payload_buf[1] = 0; 1384 payload_buf[2] = payload_reg; 1385 payload_buf[3] = 1; 1386 payload_buf[4] = payload_val; 1387 1388 desc.args[0] = payload_phys; 1389 1390 ret = qcom_scm_call(__scm->dev, &desc, NULL); 1391 1392 dma_free_coherent(__scm->dev, payload_size, payload_buf, payload_phys); 1393 return ret; 1394 } 1395 EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh); 1396 1397 int qcom_scm_gpu_init_regs(u32 gpu_req) 1398 { 1399 struct qcom_scm_desc desc = { 1400 .svc = QCOM_SCM_SVC_GPU, 1401 .cmd = QCOM_SCM_SVC_GPU_INIT_REGS, 1402 .arginfo = QCOM_SCM_ARGS(1), 1403 .args[0] = gpu_req, 1404 .owner = ARM_SMCCC_OWNER_SIP, 1405 }; 1406 1407 return qcom_scm_call(__scm->dev, &desc, NULL); 1408 } 1409 EXPORT_SYMBOL_GPL(qcom_scm_gpu_init_regs); 1410 1411 static int qcom_scm_find_dload_address(struct device *dev, u64 *addr) 1412 { 1413 struct device_node *tcsr; 1414 struct device_node *np = dev->of_node; 1415 struct resource res; 1416 u32 offset; 1417 int ret; 1418 1419 tcsr = of_parse_phandle(np, "qcom,dload-mode", 0); 1420 if (!tcsr) 1421 return 0; 1422 1423 ret = of_address_to_resource(tcsr, 0, &res); 1424 of_node_put(tcsr); 1425 if (ret) 1426 return ret; 1427 1428 ret = of_property_read_u32_index(np, "qcom,dload-mode", 1, &offset); 1429 if (ret < 0) 1430 return ret; 1431 1432 *addr = res.start + offset; 1433 1434 return 0; 1435 } 1436 1437 #ifdef CONFIG_QCOM_QSEECOM 1438 1439 /* Lock for QSEECOM SCM call executions */ 1440 static DEFINE_MUTEX(qcom_scm_qseecom_call_lock); 1441 1442 static int __qcom_scm_qseecom_call(const struct qcom_scm_desc *desc, 1443 struct qcom_scm_qseecom_resp *res) 1444 { 1445 struct qcom_scm_res scm_res = {}; 1446 int status; 1447 1448 /* 1449 * QSEECOM SCM calls should not be executed concurrently. Therefore, we 1450 * require the respective call lock to be held. 1451 */ 1452 lockdep_assert_held(&qcom_scm_qseecom_call_lock); 1453 1454 status = qcom_scm_call(__scm->dev, desc, &scm_res); 1455 1456 res->result = scm_res.result[0]; 1457 res->resp_type = scm_res.result[1]; 1458 res->data = scm_res.result[2]; 1459 1460 if (status) 1461 return status; 1462 1463 return 0; 1464 } 1465 1466 /** 1467 * qcom_scm_qseecom_call() - Perform a QSEECOM SCM call. 1468 * @desc: SCM call descriptor. 1469 * @res: SCM call response (output). 1470 * 1471 * Performs the QSEECOM SCM call described by @desc, returning the response in 1472 * @rsp. 1473 * 1474 * Return: Zero on success, nonzero on failure. 1475 */ 1476 static int qcom_scm_qseecom_call(const struct qcom_scm_desc *desc, 1477 struct qcom_scm_qseecom_resp *res) 1478 { 1479 int status; 1480 1481 /* 1482 * Note: Multiple QSEECOM SCM calls should not be executed same time, 1483 * so lock things here. This needs to be extended to callback/listener 1484 * handling when support for that is implemented. 1485 */ 1486 1487 mutex_lock(&qcom_scm_qseecom_call_lock); 1488 status = __qcom_scm_qseecom_call(desc, res); 1489 mutex_unlock(&qcom_scm_qseecom_call_lock); 1490 1491 dev_dbg(__scm->dev, "%s: owner=%x, svc=%x, cmd=%x, result=%lld, type=%llx, data=%llx\n", 1492 __func__, desc->owner, desc->svc, desc->cmd, res->result, 1493 res->resp_type, res->data); 1494 1495 if (status) { 1496 dev_err(__scm->dev, "qseecom: scm call failed with error %d\n", status); 1497 return status; 1498 } 1499 1500 /* 1501 * TODO: Handle incomplete and blocked calls: 1502 * 1503 * Incomplete and blocked calls are not supported yet. Some devices 1504 * and/or commands require those, some don't. Let's warn about them 1505 * prominently in case someone attempts to try these commands with a 1506 * device/command combination that isn't supported yet. 1507 */ 1508 WARN_ON(res->result == QSEECOM_RESULT_INCOMPLETE); 1509 WARN_ON(res->result == QSEECOM_RESULT_BLOCKED_ON_LISTENER); 1510 1511 return 0; 1512 } 1513 1514 /** 1515 * qcom_scm_qseecom_get_version() - Query the QSEECOM version. 1516 * @version: Pointer where the QSEECOM version will be stored. 1517 * 1518 * Performs the QSEECOM SCM querying the QSEECOM version currently running in 1519 * the TrustZone. 1520 * 1521 * Return: Zero on success, nonzero on failure. 1522 */ 1523 static int qcom_scm_qseecom_get_version(u32 *version) 1524 { 1525 struct qcom_scm_desc desc = {}; 1526 struct qcom_scm_qseecom_resp res = {}; 1527 u32 feature = 10; 1528 int ret; 1529 1530 desc.owner = QSEECOM_TZ_OWNER_SIP; 1531 desc.svc = QSEECOM_TZ_SVC_INFO; 1532 desc.cmd = QSEECOM_TZ_CMD_INFO_VERSION; 1533 desc.arginfo = QCOM_SCM_ARGS(1, QCOM_SCM_VAL); 1534 desc.args[0] = feature; 1535 1536 ret = qcom_scm_qseecom_call(&desc, &res); 1537 if (ret) 1538 return ret; 1539 1540 *version = res.result; 1541 return 0; 1542 } 1543 1544 /** 1545 * qcom_scm_qseecom_app_get_id() - Query the app ID for a given QSEE app name. 1546 * @app_name: The name of the app. 1547 * @app_id: The returned app ID. 1548 * 1549 * Query and return the application ID of the SEE app identified by the given 1550 * name. This returned ID is the unique identifier of the app required for 1551 * subsequent communication. 1552 * 1553 * Return: Zero on success, nonzero on failure, -ENOENT if the app has not been 1554 * loaded or could not be found. 1555 */ 1556 int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id) 1557 { 1558 unsigned long name_buf_size = QSEECOM_MAX_APP_NAME_SIZE; 1559 unsigned long app_name_len = strlen(app_name); 1560 struct qcom_scm_desc desc = {}; 1561 struct qcom_scm_qseecom_resp res = {}; 1562 dma_addr_t name_buf_phys; 1563 char *name_buf; 1564 int status; 1565 1566 if (app_name_len >= name_buf_size) 1567 return -EINVAL; 1568 1569 name_buf = kzalloc(name_buf_size, GFP_KERNEL); 1570 if (!name_buf) 1571 return -ENOMEM; 1572 1573 memcpy(name_buf, app_name, app_name_len); 1574 1575 name_buf_phys = dma_map_single(__scm->dev, name_buf, name_buf_size, DMA_TO_DEVICE); 1576 status = dma_mapping_error(__scm->dev, name_buf_phys); 1577 if (status) { 1578 kfree(name_buf); 1579 dev_err(__scm->dev, "qseecom: failed to map dma address\n"); 1580 return status; 1581 } 1582 1583 desc.owner = QSEECOM_TZ_OWNER_QSEE_OS; 1584 desc.svc = QSEECOM_TZ_SVC_APP_MGR; 1585 desc.cmd = QSEECOM_TZ_CMD_APP_LOOKUP; 1586 desc.arginfo = QCOM_SCM_ARGS(2, QCOM_SCM_RW, QCOM_SCM_VAL); 1587 desc.args[0] = name_buf_phys; 1588 desc.args[1] = app_name_len; 1589 1590 status = qcom_scm_qseecom_call(&desc, &res); 1591 dma_unmap_single(__scm->dev, name_buf_phys, name_buf_size, DMA_TO_DEVICE); 1592 kfree(name_buf); 1593 1594 if (status) 1595 return status; 1596 1597 if (res.result == QSEECOM_RESULT_FAILURE) 1598 return -ENOENT; 1599 1600 if (res.result != QSEECOM_RESULT_SUCCESS) 1601 return -EINVAL; 1602 1603 if (res.resp_type != QSEECOM_SCM_RES_APP_ID) 1604 return -EINVAL; 1605 1606 *app_id = res.data; 1607 return 0; 1608 } 1609 EXPORT_SYMBOL_GPL(qcom_scm_qseecom_app_get_id); 1610 1611 /** 1612 * qcom_scm_qseecom_app_send() - Send to and receive data from a given QSEE app. 1613 * @app_id: The ID of the target app. 1614 * @req: DMA address of the request buffer sent to the app. 1615 * @req_size: Size of the request buffer. 1616 * @rsp: DMA address of the response buffer, written to by the app. 1617 * @rsp_size: Size of the response buffer. 1618 * 1619 * Sends a request to the QSEE app associated with the given ID and read back 1620 * its response. The caller must provide two DMA memory regions, one for the 1621 * request and one for the response, and fill out the @req region with the 1622 * respective (app-specific) request data. The QSEE app reads this and returns 1623 * its response in the @rsp region. 1624 * 1625 * Return: Zero on success, nonzero on failure. 1626 */ 1627 int qcom_scm_qseecom_app_send(u32 app_id, dma_addr_t req, size_t req_size, 1628 dma_addr_t rsp, size_t rsp_size) 1629 { 1630 struct qcom_scm_qseecom_resp res = {}; 1631 struct qcom_scm_desc desc = {}; 1632 int status; 1633 1634 desc.owner = QSEECOM_TZ_OWNER_TZ_APPS; 1635 desc.svc = QSEECOM_TZ_SVC_APP_ID_PLACEHOLDER; 1636 desc.cmd = QSEECOM_TZ_CMD_APP_SEND; 1637 desc.arginfo = QCOM_SCM_ARGS(5, QCOM_SCM_VAL, 1638 QCOM_SCM_RW, QCOM_SCM_VAL, 1639 QCOM_SCM_RW, QCOM_SCM_VAL); 1640 desc.args[0] = app_id; 1641 desc.args[1] = req; 1642 desc.args[2] = req_size; 1643 desc.args[3] = rsp; 1644 desc.args[4] = rsp_size; 1645 1646 status = qcom_scm_qseecom_call(&desc, &res); 1647 1648 if (status) 1649 return status; 1650 1651 if (res.result != QSEECOM_RESULT_SUCCESS) 1652 return -EIO; 1653 1654 return 0; 1655 } 1656 EXPORT_SYMBOL_GPL(qcom_scm_qseecom_app_send); 1657 1658 /* 1659 * We do not yet support re-entrant calls via the qseecom interface. To prevent 1660 + any potential issues with this, only allow validated machines for now. 1661 */ 1662 static const struct of_device_id qcom_scm_qseecom_allowlist[] __maybe_unused = { 1663 { .compatible = "lenovo,flex-5g" }, 1664 { .compatible = "lenovo,thinkpad-x13s", }, 1665 { .compatible = "qcom,sc8180x-primus" }, 1666 { } 1667 }; 1668 1669 static bool qcom_scm_qseecom_machine_is_allowed(void) 1670 { 1671 struct device_node *np; 1672 bool match; 1673 1674 np = of_find_node_by_path("/"); 1675 if (!np) 1676 return false; 1677 1678 match = of_match_node(qcom_scm_qseecom_allowlist, np); 1679 of_node_put(np); 1680 1681 return match; 1682 } 1683 1684 static void qcom_scm_qseecom_free(void *data) 1685 { 1686 struct platform_device *qseecom_dev = data; 1687 1688 platform_device_del(qseecom_dev); 1689 platform_device_put(qseecom_dev); 1690 } 1691 1692 static int qcom_scm_qseecom_init(struct qcom_scm *scm) 1693 { 1694 struct platform_device *qseecom_dev; 1695 u32 version; 1696 int ret; 1697 1698 /* 1699 * Note: We do two steps of validation here: First, we try to query the 1700 * QSEECOM version as a check to see if the interface exists on this 1701 * device. Second, we check against known good devices due to current 1702 * driver limitations (see comment in qcom_scm_qseecom_allowlist). 1703 * 1704 * Note that we deliberately do the machine check after the version 1705 * check so that we can log potentially supported devices. This should 1706 * be safe as downstream sources indicate that the version query is 1707 * neither blocking nor reentrant. 1708 */ 1709 ret = qcom_scm_qseecom_get_version(&version); 1710 if (ret) 1711 return 0; 1712 1713 dev_info(scm->dev, "qseecom: found qseecom with version 0x%x\n", version); 1714 1715 if (!qcom_scm_qseecom_machine_is_allowed()) { 1716 dev_info(scm->dev, "qseecom: untested machine, skipping\n"); 1717 return 0; 1718 } 1719 1720 /* 1721 * Set up QSEECOM interface device. All application clients will be 1722 * set up and managed by the corresponding driver for it. 1723 */ 1724 qseecom_dev = platform_device_alloc("qcom_qseecom", -1); 1725 if (!qseecom_dev) 1726 return -ENOMEM; 1727 1728 qseecom_dev->dev.parent = scm->dev; 1729 1730 ret = platform_device_add(qseecom_dev); 1731 if (ret) { 1732 platform_device_put(qseecom_dev); 1733 return ret; 1734 } 1735 1736 return devm_add_action_or_reset(scm->dev, qcom_scm_qseecom_free, qseecom_dev); 1737 } 1738 1739 #else /* CONFIG_QCOM_QSEECOM */ 1740 1741 static int qcom_scm_qseecom_init(struct qcom_scm *scm) 1742 { 1743 return 0; 1744 } 1745 1746 #endif /* CONFIG_QCOM_QSEECOM */ 1747 1748 /** 1749 * qcom_scm_is_available() - Checks if SCM is available 1750 */ 1751 bool qcom_scm_is_available(void) 1752 { 1753 return !!READ_ONCE(__scm); 1754 } 1755 EXPORT_SYMBOL_GPL(qcom_scm_is_available); 1756 1757 static int qcom_scm_assert_valid_wq_ctx(u32 wq_ctx) 1758 { 1759 /* FW currently only supports a single wq_ctx (zero). 1760 * TODO: Update this logic to include dynamic allocation and lookup of 1761 * completion structs when FW supports more wq_ctx values. 1762 */ 1763 if (wq_ctx != 0) { 1764 dev_err(__scm->dev, "Firmware unexpectedly passed non-zero wq_ctx\n"); 1765 return -EINVAL; 1766 } 1767 1768 return 0; 1769 } 1770 1771 int qcom_scm_wait_for_wq_completion(u32 wq_ctx) 1772 { 1773 int ret; 1774 1775 ret = qcom_scm_assert_valid_wq_ctx(wq_ctx); 1776 if (ret) 1777 return ret; 1778 1779 wait_for_completion(&__scm->waitq_comp); 1780 1781 return 0; 1782 } 1783 1784 static int qcom_scm_waitq_wakeup(unsigned int wq_ctx) 1785 { 1786 int ret; 1787 1788 ret = qcom_scm_assert_valid_wq_ctx(wq_ctx); 1789 if (ret) 1790 return ret; 1791 1792 complete(&__scm->waitq_comp); 1793 1794 return 0; 1795 } 1796 1797 static irqreturn_t qcom_scm_irq_handler(int irq, void *data) 1798 { 1799 int ret; 1800 struct qcom_scm *scm = data; 1801 u32 wq_ctx, flags, more_pending = 0; 1802 1803 do { 1804 ret = scm_get_wq_ctx(&wq_ctx, &flags, &more_pending); 1805 if (ret) { 1806 dev_err(scm->dev, "GET_WQ_CTX SMC call failed: %d\n", ret); 1807 goto out; 1808 } 1809 1810 if (flags != QCOM_SMC_WAITQ_FLAG_WAKE_ONE && 1811 flags != QCOM_SMC_WAITQ_FLAG_WAKE_ALL) { 1812 dev_err(scm->dev, "Invalid flags found for wq_ctx: %u\n", flags); 1813 goto out; 1814 } 1815 1816 ret = qcom_scm_waitq_wakeup(wq_ctx); 1817 if (ret) 1818 goto out; 1819 } while (more_pending); 1820 1821 out: 1822 return IRQ_HANDLED; 1823 } 1824 1825 static int qcom_scm_probe(struct platform_device *pdev) 1826 { 1827 struct qcom_scm *scm; 1828 int irq, ret; 1829 1830 scm = devm_kzalloc(&pdev->dev, sizeof(*scm), GFP_KERNEL); 1831 if (!scm) 1832 return -ENOMEM; 1833 1834 scm->dev = &pdev->dev; 1835 ret = qcom_scm_find_dload_address(&pdev->dev, &scm->dload_mode_addr); 1836 if (ret < 0) 1837 return ret; 1838 1839 init_completion(&scm->waitq_comp); 1840 mutex_init(&scm->scm_bw_lock); 1841 1842 scm->path = devm_of_icc_get(&pdev->dev, NULL); 1843 if (IS_ERR(scm->path)) 1844 return dev_err_probe(&pdev->dev, PTR_ERR(scm->path), 1845 "failed to acquire interconnect path\n"); 1846 1847 scm->core_clk = devm_clk_get_optional(&pdev->dev, "core"); 1848 if (IS_ERR(scm->core_clk)) 1849 return PTR_ERR(scm->core_clk); 1850 1851 scm->iface_clk = devm_clk_get_optional(&pdev->dev, "iface"); 1852 if (IS_ERR(scm->iface_clk)) 1853 return PTR_ERR(scm->iface_clk); 1854 1855 scm->bus_clk = devm_clk_get_optional(&pdev->dev, "bus"); 1856 if (IS_ERR(scm->bus_clk)) 1857 return PTR_ERR(scm->bus_clk); 1858 1859 scm->reset.ops = &qcom_scm_pas_reset_ops; 1860 scm->reset.nr_resets = 1; 1861 scm->reset.of_node = pdev->dev.of_node; 1862 ret = devm_reset_controller_register(&pdev->dev, &scm->reset); 1863 if (ret) 1864 return ret; 1865 1866 /* vote for max clk rate for highest performance */ 1867 ret = clk_set_rate(scm->core_clk, INT_MAX); 1868 if (ret) 1869 return ret; 1870 1871 /* Let all above stores be available after this */ 1872 smp_store_release(&__scm, scm); 1873 1874 irq = platform_get_irq_optional(pdev, 0); 1875 if (irq < 0) { 1876 if (irq != -ENXIO) 1877 return irq; 1878 } else { 1879 ret = devm_request_threaded_irq(__scm->dev, irq, NULL, qcom_scm_irq_handler, 1880 IRQF_ONESHOT, "qcom-scm", __scm); 1881 if (ret < 0) 1882 return dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n"); 1883 } 1884 1885 __get_convention(); 1886 1887 /* 1888 * If requested enable "download mode", from this point on warmboot 1889 * will cause the boot stages to enter download mode, unless 1890 * disabled below by a clean shutdown/reboot. 1891 */ 1892 if (download_mode) 1893 qcom_scm_set_download_mode(true); 1894 1895 1896 /* 1897 * Disable SDI if indicated by DT that it is enabled by default. 1898 */ 1899 if (of_property_read_bool(pdev->dev.of_node, "qcom,sdi-enabled")) 1900 qcom_scm_disable_sdi(); 1901 1902 /* 1903 * Initialize the QSEECOM interface. 1904 * 1905 * Note: QSEECOM is fairly self-contained and this only adds the 1906 * interface device (the driver of which does most of the heavy 1907 * lifting). So any errors returned here should be either -ENOMEM or 1908 * -EINVAL (with the latter only in case there's a bug in our code). 1909 * This means that there is no need to bring down the whole SCM driver. 1910 * Just log the error instead and let SCM live. 1911 */ 1912 ret = qcom_scm_qseecom_init(scm); 1913 WARN(ret < 0, "failed to initialize qseecom: %d\n", ret); 1914 1915 return 0; 1916 } 1917 1918 static void qcom_scm_shutdown(struct platform_device *pdev) 1919 { 1920 /* Clean shutdown, disable download mode to allow normal restart */ 1921 qcom_scm_set_download_mode(false); 1922 } 1923 1924 static const struct of_device_id qcom_scm_dt_match[] = { 1925 { .compatible = "qcom,scm" }, 1926 1927 /* Legacy entries kept for backwards compatibility */ 1928 { .compatible = "qcom,scm-apq8064" }, 1929 { .compatible = "qcom,scm-apq8084" }, 1930 { .compatible = "qcom,scm-ipq4019" }, 1931 { .compatible = "qcom,scm-msm8953" }, 1932 { .compatible = "qcom,scm-msm8974" }, 1933 { .compatible = "qcom,scm-msm8996" }, 1934 {} 1935 }; 1936 MODULE_DEVICE_TABLE(of, qcom_scm_dt_match); 1937 1938 static struct platform_driver qcom_scm_driver = { 1939 .driver = { 1940 .name = "qcom_scm", 1941 .of_match_table = qcom_scm_dt_match, 1942 .suppress_bind_attrs = true, 1943 }, 1944 .probe = qcom_scm_probe, 1945 .shutdown = qcom_scm_shutdown, 1946 }; 1947 1948 static int __init qcom_scm_init(void) 1949 { 1950 return platform_driver_register(&qcom_scm_driver); 1951 } 1952 subsys_initcall(qcom_scm_init); 1953 1954 MODULE_DESCRIPTION("Qualcomm Technologies, Inc. SCM driver"); 1955 MODULE_LICENSE("GPL v2"); 1956