Lines Matching full:scm

82  * struct qcom_scm_qseecom_resp - QSEECOM SCM call response.
83 * @result: Result or status of the SCM call. See &enum qcom_scm_qseecom_result.
297 if (of_device_is_compatible(__scm ? __scm->dev->of_node : NULL, "qcom,scm-sc7180")) { in __get_convention()
328 * Sends a command to the SCM and waits for the command to finish processing.
342 pr_err("Unknown current SCM calling convention.\n"); in qcom_scm_call()
353 * Sends a command to the SCM and waits for the command to finish processing.
367 pr_err("Unknown current SCM calling convention.\n"); in qcom_scm_call_atomic()
452 * Set the Linux entry point for the SCM to transfer control to when coming
458 /* Fallback to old SCM call */ in qcom_scm_set_warm_boot_addr()
471 /* Fallback to old SCM call */ in qcom_scm_set_cold_boot_addr()
552 static void qcom_scm_set_download_mode(struct qcom_scm *scm, u32 dload_mode) in qcom_scm_set_download_mode() argument
556 if (scm->dload_mode_addr) { in qcom_scm_set_download_mode()
557 ret = qcom_scm_io_rmw(scm->dload_mode_addr, QCOM_DLOAD_MASK, in qcom_scm_set_download_mode()
559 } else if (__qcom_scm_is_call_available(scm->dev, QCOM_SCM_SVC_BOOT, in qcom_scm_set_download_mode()
561 ret = __qcom_scm_set_dload_mode(scm->dev, !!dload_mode); in qcom_scm_set_download_mode()
563 dev_err(scm->dev, in qcom_scm_set_download_mode()
568 dev_err(scm->dev, "failed to set download mode: %d\n", ret); in qcom_scm_set_download_mode()
575 if (scm->minidump_sram && (dload_mode & QCOM_DLOAD_MINIDUMP)) in qcom_scm_set_download_mode()
576 writel_relaxed(minidump_dest, scm->minidump_sram); in qcom_scm_set_download_mode()
669 * During the scm call memory protection will be enabled for the meta in __qcom_scm_pas_init_image2()
1074 * is available via SCM or not
1478 * Return: true iff the SCM calls wrapped by qcom_scm_ice_invalidate_key() and
1495 * doesn't work on these SoCs; only this SCM call does.
1497 * It is assumed that the SoC has only one ICE instance being used, as this SCM
1530 * doesn't work on these SoCs; only this SCM call does.
1532 * It is assumed that the SoC has only one ICE instance being used, as this SCM
1811 * @resp: response buffer passed to SCM
1813 * Write HDCP register(s) through SCM.
1894 * SCM struct device as argument and uses it to pass the call as at the time
1895 * the SHM Bridge is enabled, the SCM is not yet fully set up and doesn't
2084 /* Lock for QSEECOM SCM call executions */
2094 * QSEECOM SCM calls should not be executed concurrently. Therefore, we in __qcom_scm_qseecom_call()
2112 * qcom_scm_qseecom_call() - Perform a QSEECOM SCM call.
2113 * @desc: SCM call descriptor.
2114 * @res: SCM call response (output).
2116 * Performs the QSEECOM SCM call described by @desc, returning the response in
2127 * Note: Multiple QSEECOM SCM calls should not be executed same time, in qcom_scm_qseecom_call()
2141 dev_err(__scm->dev, "qseecom: scm call failed with error %d\n", status); in qcom_scm_qseecom_call()
2163 * Performs the QSEECOM SCM querying the QSEECOM version currently running in
2349 static int qcom_scm_qseecom_init(struct qcom_scm *scm) in qcom_scm_qseecom_init() argument
2370 dev_info(scm->dev, "qseecom: found qseecom with version 0x%x\n", version); in qcom_scm_qseecom_init()
2373 dev_info(scm->dev, "qseecom: untested machine, skipping\n"); in qcom_scm_qseecom_init()
2385 qseecom_dev->dev.parent = scm->dev; in qcom_scm_qseecom_init()
2393 return devm_add_action_or_reset(scm->dev, qcom_scm_qseecom_free, qseecom_dev); in qcom_scm_qseecom_init()
2398 static int qcom_scm_qseecom_init(struct qcom_scm *scm) in qcom_scm_qseecom_init() argument
2497 static void qcom_scm_gunyah_wdt_init(struct qcom_scm *scm) in qcom_scm_gunyah_wdt_init() argument
2531 dev_err(scm->dev, "Failed to register Gunyah watchdog device: %ld\n", in qcom_scm_gunyah_wdt_init()
2536 devm_add_action_or_reset(scm->dev, qcom_scm_gunyah_wdt_free, in qcom_scm_gunyah_wdt_init()
2547 static void qcom_scm_qtee_init(struct qcom_scm *scm) in qcom_scm_qtee_init() argument
2563 qtee_dev = platform_device_register_data(scm->dev, "qcomtee", in qcom_scm_qtee_init()
2568 devm_add_action_or_reset(scm->dev, qcom_scm_qtee_free, qtee_dev); in qcom_scm_qtee_init()
2572 * qcom_scm_is_available() - Checks if SCM is available
2600 static int qcom_scm_query_waitq_count(struct qcom_scm *scm) in qcom_scm_query_waitq_count() argument
2610 ret = qcom_scm_call_atomic(scm->dev, &desc, &res); in qcom_scm_query_waitq_count()
2617 static int qcom_scm_get_waitq_irq(struct qcom_scm *scm) in qcom_scm_get_waitq_irq() argument
2630 ret = qcom_scm_call_atomic(scm->dev, &desc, &res); in qcom_scm_get_waitq_irq()
2639 parent_irq_node = of_irq_find_parent(scm->dev->of_node); in qcom_scm_get_waitq_irq()
2648 static struct completion *qcom_scm_get_completion(struct qcom_scm *scm, u32 wq_ctx) in qcom_scm_get_completion() argument
2650 if (WARN_ON_ONCE(wq_ctx >= scm->wq_cnt)) in qcom_scm_get_completion()
2653 return &scm->waitq_comps[wq_ctx]; in qcom_scm_get_completion()
2658 struct qcom_scm *scm = dev_get_drvdata(dev); in qcom_scm_wait_for_wq_completion() local
2661 wq = qcom_scm_get_completion(scm, wq_ctx); in qcom_scm_wait_for_wq_completion()
2670 static int qcom_scm_waitq_wakeup(struct qcom_scm *scm, unsigned int wq_ctx) in qcom_scm_waitq_wakeup() argument
2674 wq = qcom_scm_get_completion(scm, wq_ctx); in qcom_scm_waitq_wakeup()
2686 struct qcom_scm *scm = data; in qcom_scm_irq_handler() local
2692 dev_err(scm->dev, "GET_WQ_CTX SMC call failed: %d\n", ret); in qcom_scm_irq_handler()
2697 dev_err(scm->dev, "Invalid flags received for wq_ctx: %u\n", flags); in qcom_scm_irq_handler()
2701 ret = qcom_scm_waitq_wakeup(scm, wq_ctx); in qcom_scm_irq_handler()
2720 struct qcom_scm *scm; in set_download_mode() local
2737 scm = smp_load_acquire(&__scm); in set_download_mode()
2738 if (scm) in set_download_mode()
2739 qcom_scm_set_download_mode(scm, download_mode); in set_download_mode()
2765 struct qcom_scm *scm; in set_minidump_dest() local
2778 scm = smp_load_acquire(&__scm); in set_minidump_dest()
2779 if (scm && scm->minidump_sram && (download_mode & QCOM_DLOAD_MINIDUMP)) in set_minidump_dest()
2780 writel_relaxed(minidump_dest, scm->minidump_sram); in set_minidump_dest()
2796 struct qcom_scm *scm; in qcom_scm_probe() local
2800 scm = devm_kzalloc(&pdev->dev, sizeof(*scm), GFP_KERNEL); in qcom_scm_probe()
2801 if (!scm) in qcom_scm_probe()
2804 scm->dev = &pdev->dev; in qcom_scm_probe()
2805 platform_set_drvdata(pdev, scm); in qcom_scm_probe()
2806 ret = qcom_scm_find_dload_address(&pdev->dev, &scm->dload_mode_addr); in qcom_scm_probe()
2811 ret = qcom_scm_map_minidump_sram(&pdev->dev, &scm->minidump_sram); in qcom_scm_probe()
2816 mutex_init(&scm->scm_bw_lock); in qcom_scm_probe()
2818 scm->path = devm_of_icc_get(&pdev->dev, NULL); in qcom_scm_probe()
2819 if (IS_ERR(scm->path)) in qcom_scm_probe()
2820 return dev_err_probe(&pdev->dev, PTR_ERR(scm->path), in qcom_scm_probe()
2823 scm->core_clk = devm_clk_get_optional(&pdev->dev, "core"); in qcom_scm_probe()
2824 if (IS_ERR(scm->core_clk)) in qcom_scm_probe()
2825 return PTR_ERR(scm->core_clk); in qcom_scm_probe()
2827 scm->iface_clk = devm_clk_get_optional(&pdev->dev, "iface"); in qcom_scm_probe()
2828 if (IS_ERR(scm->iface_clk)) in qcom_scm_probe()
2829 return PTR_ERR(scm->iface_clk); in qcom_scm_probe()
2831 scm->bus_clk = devm_clk_get_optional(&pdev->dev, "bus"); in qcom_scm_probe()
2832 if (IS_ERR(scm->bus_clk)) in qcom_scm_probe()
2833 return PTR_ERR(scm->bus_clk); in qcom_scm_probe()
2835 scm->reset.ops = &qcom_scm_pas_reset_ops; in qcom_scm_probe()
2836 scm->reset.nr_resets = 1; in qcom_scm_probe()
2837 scm->reset.of_node = pdev->dev.of_node; in qcom_scm_probe()
2838 ret = devm_reset_controller_register(&pdev->dev, &scm->reset); in qcom_scm_probe()
2843 ret = clk_set_rate(scm->core_clk, INT_MAX); in qcom_scm_probe()
2847 ret = of_reserved_mem_device_init(scm->dev); in qcom_scm_probe()
2849 return dev_err_probe(scm->dev, ret, in qcom_scm_probe()
2852 ret = qcom_tzmem_enable(scm->dev); in qcom_scm_probe()
2854 ret = dev_err_probe(scm->dev, ret, in qcom_scm_probe()
2864 scm->mempool = devm_qcom_tzmem_pool_new(scm->dev, &pool_config); in qcom_scm_probe()
2865 if (IS_ERR(scm->mempool)) { in qcom_scm_probe()
2866 ret = dev_err_probe(scm->dev, PTR_ERR(scm->mempool), in qcom_scm_probe()
2867 "Failed to create the SCM memory pool\n"); in qcom_scm_probe()
2871 ret = qcom_scm_query_waitq_count(scm); in qcom_scm_probe()
2872 scm->wq_cnt = ret < 0 ? QCOM_SCM_DEFAULT_WAITQ_COUNT : ret; in qcom_scm_probe()
2873 scm->waitq_comps = devm_kcalloc(&pdev->dev, scm->wq_cnt, sizeof(*scm->waitq_comps), in qcom_scm_probe()
2875 if (!scm->waitq_comps) in qcom_scm_probe()
2878 for (i = 0; i < scm->wq_cnt; i++) in qcom_scm_probe()
2879 init_completion(&scm->waitq_comps[i]); in qcom_scm_probe()
2881 irq = qcom_scm_get_waitq_irq(scm); in qcom_scm_probe()
2889 ret = devm_request_threaded_irq(scm->dev, irq, NULL, qcom_scm_irq_handler, in qcom_scm_probe()
2890 IRQF_ONESHOT, "qcom-scm", scm); in qcom_scm_probe()
2892 return dev_err_probe(scm->dev, ret, in qcom_scm_probe()
2893 "Failed to request qcom-scm irq\n"); in qcom_scm_probe()
2899 * This marks the SCM API as ready to accept user calls and can only in qcom_scm_probe()
2903 smp_store_release(&__scm, scm); in qcom_scm_probe()
2908 qcom_pas_ops_scm.dev = scm->dev; in qcom_scm_probe()
2917 qcom_scm_set_download_mode(scm, download_mode); in qcom_scm_probe()
2932 * This means that there is no need to bring down the whole SCM driver. in qcom_scm_probe()
2933 * Just log the error instead and let SCM live. in qcom_scm_probe()
2935 ret = qcom_scm_qseecom_init(scm); in qcom_scm_probe()
2939 qcom_scm_qtee_init(scm); in qcom_scm_probe()
2942 qcom_scm_gunyah_wdt_init(scm); in qcom_scm_probe()
2947 of_reserved_mem_device_release(scm->dev); in qcom_scm_probe()
2959 { .compatible = "qcom,scm" },
2962 { .compatible = "qcom,scm-apq8064" },
2963 { .compatible = "qcom,scm-apq8084" },
2964 { .compatible = "qcom,scm-ipq4019" },
2965 { .compatible = "qcom,scm-msm8953" },
2966 { .compatible = "qcom,scm-msm8974" },
2967 { .compatible = "qcom,scm-msm8996" },
2988 MODULE_DESCRIPTION("Qualcomm Technologies, Inc. SCM driver");