Lines Matching +full:msm8974 +full:- +full:ocmem
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/dma-mapping.h>
17 #include <linux/reset-controller.h>
18 #include <linux/arm-smccc.h>
87 ret = clk_prepare_enable(__scm->core_clk); in qcom_scm_clk_enable()
91 ret = clk_prepare_enable(__scm->iface_clk); in qcom_scm_clk_enable()
95 ret = clk_prepare_enable(__scm->bus_clk); in qcom_scm_clk_enable()
102 clk_disable_unprepare(__scm->iface_clk); in qcom_scm_clk_enable()
104 clk_disable_unprepare(__scm->core_clk); in qcom_scm_clk_enable()
111 clk_disable_unprepare(__scm->core_clk); in qcom_scm_clk_disable()
112 clk_disable_unprepare(__scm->iface_clk); in qcom_scm_clk_disable()
113 clk_disable_unprepare(__scm->bus_clk); in qcom_scm_clk_disable()
140 * Device isn't required as there is only one argument - no device in __get_convention()
155 if (of_device_is_compatible(__scm ? __scm->dev->of_node : NULL, "qcom,scm-sc7180")) { in __get_convention()
180 * qcom_scm_call() - Invoke a syscall in the secure world
187 * This should *only* be called in pre-emptible context.
201 return -EINVAL; in qcom_scm_call()
206 * qcom_scm_call_atomic() - atomic variation of qcom_scm_call()
228 return -EINVAL; in qcom_scm_call_atomic()
255 return -EINVAL; in __qcom_scm_is_call_available()
264 * qcom_scm_set_warm_boot_addr() - Set the warm boot address for cpus
299 ret = qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_set_warm_boot_addr()
310 * qcom_scm_set_cold_boot_addr() - Set the cold boot address for cpus
335 return -EINVAL; in qcom_scm_set_cold_boot_addr()
347 return qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL); in qcom_scm_set_cold_boot_addr()
352 * qcom_scm_cpu_power_down() - Power down the cpu
353 * @flags - Flags to flush cache
369 qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL); in qcom_scm_cpu_power_down()
386 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_set_remote_state()
404 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); in __qcom_scm_set_dload_mode()
412 avail = __qcom_scm_is_call_available(__scm->dev, in qcom_scm_set_download_mode()
416 ret = __qcom_scm_set_dload_mode(__scm->dev, enable); in qcom_scm_set_download_mode()
417 } else if (__scm->dload_mode_addr) { in qcom_scm_set_download_mode()
418 ret = qcom_scm_io_writel(__scm->dload_mode_addr, in qcom_scm_set_download_mode()
421 dev_err(__scm->dev, in qcom_scm_set_download_mode()
426 dev_err(__scm->dev, "failed to set download mode: %d\n", ret); in qcom_scm_set_download_mode()
430 * qcom_scm_pas_init_image() - Initialize peripheral authentication service
458 * non-cachable to avoid XPU violations. in qcom_scm_pas_init_image()
460 mdata_buf = dma_alloc_coherent(__scm->dev, size, &mdata_phys, in qcom_scm_pas_init_image()
463 dev_err(__scm->dev, "Allocation of metadata buffer failed.\n"); in qcom_scm_pas_init_image()
464 return -ENOMEM; in qcom_scm_pas_init_image()
474 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_pas_init_image()
479 dma_free_coherent(__scm->dev, size, mdata_buf, mdata_phys); in qcom_scm_pas_init_image()
486 * qcom_scm_pas_mem_setup() - Prepare the memory related to a given peripheral
512 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_pas_mem_setup()
520 * qcom_scm_pas_auth_and_reset() - Authenticate the given peripheral firmware
542 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_pas_auth_and_reset()
550 * qcom_scm_pas_shutdown() - Shut down the remote processor
571 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_pas_shutdown()
580 * qcom_scm_pas_supported() - Check if the peripheral authentication service is
598 if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_PIL, in qcom_scm_pas_supported()
602 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_pas_supported()
621 ret = qcom_scm_call(__scm->dev, &desc, &res); in __qcom_scm_pas_mss_reset()
630 return -EINVAL; in qcom_scm_pas_reset_assert()
632 return __qcom_scm_pas_mss_reset(__scm->dev, 1); in qcom_scm_pas_reset_assert()
639 return -EINVAL; in qcom_scm_pas_reset_deassert()
641 return __qcom_scm_pas_mss_reset(__scm->dev, 0); in qcom_scm_pas_reset_deassert()
662 ret = qcom_scm_call_atomic(__scm->dev, &desc, &res); in qcom_scm_io_readl()
681 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); in qcom_scm_io_writel()
686 * qcom_scm_restore_sec_cfg_available() - Check if secure environment
689 * Return true if restore-cfg interface is supported, false if not.
693 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP, in qcom_scm_restore_sec_cfg_available()
711 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_restore_sec_cfg()
729 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_iommu_secure_ptbl_size()
758 ret = qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_iommu_secure_ptbl_init()
761 if (ret == -EPERM) in qcom_scm_iommu_secure_ptbl_init()
786 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_mem_protect_video_var()
820 * qcom_scm_assign_mem() - Make a secure call to reassign memory ownership
857 ptr = dma_alloc_coherent(__scm->dev, ptr_sz, &ptr_phys, GFP_KERNEL); in qcom_scm_assign_mem()
859 return -ENOMEM; in qcom_scm_assign_mem()
870 mem_to_map->mem_addr = cpu_to_le64(mem_addr); in qcom_scm_assign_mem()
871 mem_to_map->mem_size = cpu_to_le64(mem_sz); in qcom_scm_assign_mem()
878 destvm->vmid = cpu_to_le32(newvm->vmid); in qcom_scm_assign_mem()
879 destvm->perm = cpu_to_le32(newvm->perm); in qcom_scm_assign_mem()
880 destvm->ctx = 0; in qcom_scm_assign_mem()
881 destvm->ctx_size = 0; in qcom_scm_assign_mem()
882 next_vm |= BIT(newvm->vmid); in qcom_scm_assign_mem()
885 ret = __qcom_scm_assign_mem(__scm->dev, mem_to_map_phys, mem_to_map_sz, in qcom_scm_assign_mem()
887 dma_free_coherent(__scm->dev, ptr_sz, ptr, ptr_phys); in qcom_scm_assign_mem()
889 dev_err(__scm->dev, in qcom_scm_assign_mem()
891 return -EINVAL; in qcom_scm_assign_mem()
900 * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available
904 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_OCMEM, in qcom_scm_ocmem_lock_available()
910 * qcom_scm_ocmem_lock() - call OCMEM lock interface to assign an OCMEM
914 * @offset: OCMEM offset
915 * @size: OCMEM size
931 return qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_ocmem_lock()
936 * qcom_scm_ocmem_unlock() - call OCMEM unlock interface to release an OCMEM
940 * @offset: OCMEM offset
941 * @size: OCMEM size
954 return qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_ocmem_unlock()
959 * qcom_scm_ice_available() - Is the ICE key programming interface available?
966 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, in qcom_scm_ice_available()
968 __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, in qcom_scm_ice_available()
974 * qcom_scm_ice_invalidate_key() - Invalidate an inline encryption key
983 * Return: 0 on success; -errno on failure.
995 return qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_ice_invalidate_key()
1000 * qcom_scm_ice_set_key() - Set an inline encryption key
1006 * individual plaintext and ciphertext. Given in 512-byte
1018 * Return: 0 on success; -errno on failure.
1046 * keys is normally rare and thus not performance-critical. in qcom_scm_ice_set_key()
1049 keybuf = dma_alloc_coherent(__scm->dev, key_size, &key_phys, in qcom_scm_ice_set_key()
1052 return -ENOMEM; in qcom_scm_ice_set_key()
1056 ret = qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_ice_set_key()
1060 dma_free_coherent(__scm->dev, key_size, keybuf, key_phys); in qcom_scm_ice_set_key()
1066 * qcom_scm_hdcp_available() - Check if secure environment supports HDCP.
1078 avail = __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_HDCP, in qcom_scm_hdcp_available()
1088 * qcom_scm_hdcp_req() - Send HDCP request.
1119 return -ERANGE; in qcom_scm_hdcp_req()
1125 ret = qcom_scm_call(__scm->dev, &desc, &res); in qcom_scm_hdcp_req()
1146 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); in qcom_scm_qsmmu500_wait_safe_toggle()
1152 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_LMH, QCOM_SCM_LMH_LIMIT_DCVSH); in qcom_scm_lmh_dcvsh_available()
1166 return qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_lmh_profile_change()
1189 payload_buf = dma_alloc_coherent(__scm->dev, payload_size, &payload_phys, GFP_KERNEL); in qcom_scm_lmh_dcvsh()
1191 return -ENOMEM; in qcom_scm_lmh_dcvsh()
1201 ret = qcom_scm_call(__scm->dev, &desc, NULL); in qcom_scm_lmh_dcvsh()
1203 dma_free_coherent(__scm->dev, payload_size, payload_buf, payload_phys); in qcom_scm_lmh_dcvsh()
1211 struct device_node *np = dev->of_node; in qcom_scm_find_dload_address()
1216 tcsr = of_parse_phandle(np, "qcom,dload-mode", 0); in qcom_scm_find_dload_address()
1225 ret = of_property_read_u32_index(np, "qcom,dload-mode", 1, &offset); in qcom_scm_find_dload_address()
1235 * qcom_scm_is_available() - Checks if SCM is available
1249 scm = devm_kzalloc(&pdev->dev, sizeof(*scm), GFP_KERNEL); in qcom_scm_probe()
1251 return -ENOMEM; in qcom_scm_probe()
1253 ret = qcom_scm_find_dload_address(&pdev->dev, &scm->dload_mode_addr); in qcom_scm_probe()
1257 clks = (unsigned long)of_device_get_match_data(&pdev->dev); in qcom_scm_probe()
1259 scm->core_clk = devm_clk_get(&pdev->dev, "core"); in qcom_scm_probe()
1260 if (IS_ERR(scm->core_clk)) { in qcom_scm_probe()
1261 if (PTR_ERR(scm->core_clk) == -EPROBE_DEFER) in qcom_scm_probe()
1262 return PTR_ERR(scm->core_clk); in qcom_scm_probe()
1265 dev_err(&pdev->dev, "failed to acquire core clk\n"); in qcom_scm_probe()
1266 return PTR_ERR(scm->core_clk); in qcom_scm_probe()
1269 scm->core_clk = NULL; in qcom_scm_probe()
1272 scm->iface_clk = devm_clk_get(&pdev->dev, "iface"); in qcom_scm_probe()
1273 if (IS_ERR(scm->iface_clk)) { in qcom_scm_probe()
1274 if (PTR_ERR(scm->iface_clk) == -EPROBE_DEFER) in qcom_scm_probe()
1275 return PTR_ERR(scm->iface_clk); in qcom_scm_probe()
1278 dev_err(&pdev->dev, "failed to acquire iface clk\n"); in qcom_scm_probe()
1279 return PTR_ERR(scm->iface_clk); in qcom_scm_probe()
1282 scm->iface_clk = NULL; in qcom_scm_probe()
1285 scm->bus_clk = devm_clk_get(&pdev->dev, "bus"); in qcom_scm_probe()
1286 if (IS_ERR(scm->bus_clk)) { in qcom_scm_probe()
1287 if (PTR_ERR(scm->bus_clk) == -EPROBE_DEFER) in qcom_scm_probe()
1288 return PTR_ERR(scm->bus_clk); in qcom_scm_probe()
1291 dev_err(&pdev->dev, "failed to acquire bus clk\n"); in qcom_scm_probe()
1292 return PTR_ERR(scm->bus_clk); in qcom_scm_probe()
1295 scm->bus_clk = NULL; in qcom_scm_probe()
1298 scm->reset.ops = &qcom_scm_pas_reset_ops; in qcom_scm_probe()
1299 scm->reset.nr_resets = 1; in qcom_scm_probe()
1300 scm->reset.of_node = pdev->dev.of_node; in qcom_scm_probe()
1301 ret = devm_reset_controller_register(&pdev->dev, &scm->reset); in qcom_scm_probe()
1306 ret = clk_set_rate(scm->core_clk, INT_MAX); in qcom_scm_probe()
1311 __scm->dev = &pdev->dev; in qcom_scm_probe()
1334 { .compatible = "qcom,scm-apq8064",
1337 { .compatible = "qcom,scm-apq8084", .data = (void *)(SCM_HAS_CORE_CLK |
1341 { .compatible = "qcom,scm-ipq4019" },
1342 { .compatible = "qcom,scm-mdm9607", .data = (void *)(SCM_HAS_CORE_CLK |
1345 { .compatible = "qcom,scm-msm8660", .data = (void *) SCM_HAS_CORE_CLK },
1346 { .compatible = "qcom,scm-msm8960", .data = (void *) SCM_HAS_CORE_CLK },
1347 { .compatible = "qcom,scm-msm8916", .data = (void *)(SCM_HAS_CORE_CLK |
1351 { .compatible = "qcom,scm-msm8974", .data = (void *)(SCM_HAS_CORE_CLK |
1355 { .compatible = "qcom,scm-msm8994" },
1356 { .compatible = "qcom,scm-msm8996" },