Loading drivers/firmware/qtee_shmbridge.c +27 −5 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ /* * QTI TEE shared memory bridge driver * * Copyright (c) 2019, The Linux Foundation. All rights reserved. * Copyright (c) 2020, The Linux Foundation. All rights reserved. */ #include <linux/module.h> Loading @@ -15,6 +15,7 @@ #include <linux/dma-mapping.h> #include <soc/qcom/qseecomi.h> #include <linux/qtee_shmbridge.h> #include <linux/of_platform.h> #include "qtee_shmbridge_internal.h" Loading Loading @@ -80,6 +81,7 @@ struct bridge_list_entry { static struct bridge_info default_bridge; static struct bridge_list bridge_list_head; static bool qtee_shmbridge_enabled; static bool support_hyp; /* enable shared memory bridge mechanism in HYP */ static int32_t qtee_shmbridge_enable(bool enable) Loading Loading @@ -206,6 +208,11 @@ int32_t qtee_shmbridge_register( ipfn_and_s_perm_flags = UPDATE_IPFN_AND_S_PERM_FLAGS(paddr, tz_perm); size_and_flags = UPDATE_SIZE_AND_FLAGS(size, ns_vmid_num); if (support_hyp) { size_and_flags |= SELF_OWNER_BIT << 1; size_and_flags |= (VM_PERM_R | VM_PERM_W) << 2; } pr_debug("%s: desc.args[0] %llx, args[1] %llx, args[2] %llx, args[3] %llx\n", __func__, pfn_and_ns_perm_flags, ipfn_and_s_perm_flags, size_and_flags, ns_vmids); Loading Loading @@ -328,9 +335,18 @@ EXPORT_SYMBOL(qtee_shmbridge_inv_shm_buf); static int qtee_shmbridge_init(struct platform_device *pdev) { int ret = 0; uint32_t ns_vm_ids[] = {VMID_HLOS}; uint32_t *ns_vm_ids; uint32_t ns_vm_ids_hlos[] = {VMID_HLOS}; uint32_t ns_vm_ids_hyp[] = {}; uint32_t ns_vm_perms[] = {VM_PERM_R|VM_PERM_W}; support_hyp = of_property_read_bool((&pdev->dev)->of_node, "qcom,support-hypervisor"); if (support_hyp) ns_vm_ids = ns_vm_ids_hyp; else ns_vm_ids = ns_vm_ids_hlos; if (default_bridge.vaddr) { pr_warn("qtee shmbridge is already initialized\n"); return 0; Loading Loading @@ -374,8 +390,7 @@ static int qtee_shmbridge_init(struct platform_device *pdev) mutex_init(&bridge_list_head.lock); INIT_LIST_HEAD(&bridge_list_head.head); /* temporarily disable shm bridge mechanism */ ret = qtee_shmbridge_enable(false); ret = qtee_shmbridge_enable(true); if (ret) { /* keep the mem pool and return if failed to enable bridge */ ret = 0; Loading @@ -383,10 +398,17 @@ static int qtee_shmbridge_init(struct platform_device *pdev) } /*register default bridge*/ if (support_hyp) ret = qtee_shmbridge_register(default_bridge.paddr, default_bridge.size, ns_vm_ids, ns_vm_perms, 0, VM_PERM_R|VM_PERM_W, &default_bridge.handle); else ret = qtee_shmbridge_register(default_bridge.paddr, default_bridge.size, ns_vm_ids, ns_vm_perms, 1, VM_PERM_R|VM_PERM_W, &default_bridge.handle); if (ret) { pr_err("Failed to register default bridge, size %zu\n", default_bridge.size); Loading drivers/misc/qseecom.c +13 −13 Original line number Diff line number Diff line Loading @@ -1286,14 +1286,14 @@ static int qseecom_create_bridge_for_secbuf(int ion_fd, struct dma_buf *dmabuf, pr_debug("bridge exists\n"); return 0; } /* * nelems = ion_get_flags_num_vm_elems(dma_buf_flags); * if (nelems == 0) { * pr_err("failed to get vm num from flag = %x\n", dma_buf_flags); * ret = -EINVAL; * goto exit; * } */ nelems = ion_get_flags_num_vm_elems(dma_buf_flags); if (nelems == 0) { pr_err("failed to get vm num from flag = %x\n", dma_buf_flags); ret = -EINVAL; goto exit; } vmid_list = kcalloc(nelems, sizeof(*vmid_list), GFP_KERNEL); if (!vmid_list) { Loading @@ -1301,11 +1301,11 @@ static int qseecom_create_bridge_for_secbuf(int ion_fd, struct dma_buf *dmabuf, goto exit; } /* * ret = ion_populate_vm_list(dma_buf_flags, vmid_list, nelems); * if (ret) * goto exit_free_vmid_list; */ ret = ion_populate_vm_list(dma_buf_flags, vmid_list, nelems); if (ret) goto exit_free_vmid_list; perms_list = kcalloc(nelems, sizeof(*perms_list), GFP_KERNEL); if (!perms_list) { Loading Loading
drivers/firmware/qtee_shmbridge.c +27 −5 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ /* * QTI TEE shared memory bridge driver * * Copyright (c) 2019, The Linux Foundation. All rights reserved. * Copyright (c) 2020, The Linux Foundation. All rights reserved. */ #include <linux/module.h> Loading @@ -15,6 +15,7 @@ #include <linux/dma-mapping.h> #include <soc/qcom/qseecomi.h> #include <linux/qtee_shmbridge.h> #include <linux/of_platform.h> #include "qtee_shmbridge_internal.h" Loading Loading @@ -80,6 +81,7 @@ struct bridge_list_entry { static struct bridge_info default_bridge; static struct bridge_list bridge_list_head; static bool qtee_shmbridge_enabled; static bool support_hyp; /* enable shared memory bridge mechanism in HYP */ static int32_t qtee_shmbridge_enable(bool enable) Loading Loading @@ -206,6 +208,11 @@ int32_t qtee_shmbridge_register( ipfn_and_s_perm_flags = UPDATE_IPFN_AND_S_PERM_FLAGS(paddr, tz_perm); size_and_flags = UPDATE_SIZE_AND_FLAGS(size, ns_vmid_num); if (support_hyp) { size_and_flags |= SELF_OWNER_BIT << 1; size_and_flags |= (VM_PERM_R | VM_PERM_W) << 2; } pr_debug("%s: desc.args[0] %llx, args[1] %llx, args[2] %llx, args[3] %llx\n", __func__, pfn_and_ns_perm_flags, ipfn_and_s_perm_flags, size_and_flags, ns_vmids); Loading Loading @@ -328,9 +335,18 @@ EXPORT_SYMBOL(qtee_shmbridge_inv_shm_buf); static int qtee_shmbridge_init(struct platform_device *pdev) { int ret = 0; uint32_t ns_vm_ids[] = {VMID_HLOS}; uint32_t *ns_vm_ids; uint32_t ns_vm_ids_hlos[] = {VMID_HLOS}; uint32_t ns_vm_ids_hyp[] = {}; uint32_t ns_vm_perms[] = {VM_PERM_R|VM_PERM_W}; support_hyp = of_property_read_bool((&pdev->dev)->of_node, "qcom,support-hypervisor"); if (support_hyp) ns_vm_ids = ns_vm_ids_hyp; else ns_vm_ids = ns_vm_ids_hlos; if (default_bridge.vaddr) { pr_warn("qtee shmbridge is already initialized\n"); return 0; Loading Loading @@ -374,8 +390,7 @@ static int qtee_shmbridge_init(struct platform_device *pdev) mutex_init(&bridge_list_head.lock); INIT_LIST_HEAD(&bridge_list_head.head); /* temporarily disable shm bridge mechanism */ ret = qtee_shmbridge_enable(false); ret = qtee_shmbridge_enable(true); if (ret) { /* keep the mem pool and return if failed to enable bridge */ ret = 0; Loading @@ -383,10 +398,17 @@ static int qtee_shmbridge_init(struct platform_device *pdev) } /*register default bridge*/ if (support_hyp) ret = qtee_shmbridge_register(default_bridge.paddr, default_bridge.size, ns_vm_ids, ns_vm_perms, 0, VM_PERM_R|VM_PERM_W, &default_bridge.handle); else ret = qtee_shmbridge_register(default_bridge.paddr, default_bridge.size, ns_vm_ids, ns_vm_perms, 1, VM_PERM_R|VM_PERM_W, &default_bridge.handle); if (ret) { pr_err("Failed to register default bridge, size %zu\n", default_bridge.size); Loading
drivers/misc/qseecom.c +13 −13 Original line number Diff line number Diff line Loading @@ -1286,14 +1286,14 @@ static int qseecom_create_bridge_for_secbuf(int ion_fd, struct dma_buf *dmabuf, pr_debug("bridge exists\n"); return 0; } /* * nelems = ion_get_flags_num_vm_elems(dma_buf_flags); * if (nelems == 0) { * pr_err("failed to get vm num from flag = %x\n", dma_buf_flags); * ret = -EINVAL; * goto exit; * } */ nelems = ion_get_flags_num_vm_elems(dma_buf_flags); if (nelems == 0) { pr_err("failed to get vm num from flag = %x\n", dma_buf_flags); ret = -EINVAL; goto exit; } vmid_list = kcalloc(nelems, sizeof(*vmid_list), GFP_KERNEL); if (!vmid_list) { Loading @@ -1301,11 +1301,11 @@ static int qseecom_create_bridge_for_secbuf(int ion_fd, struct dma_buf *dmabuf, goto exit; } /* * ret = ion_populate_vm_list(dma_buf_flags, vmid_list, nelems); * if (ret) * goto exit_free_vmid_list; */ ret = ion_populate_vm_list(dma_buf_flags, vmid_list, nelems); if (ret) goto exit_free_vmid_list; perms_list = kcalloc(nelems, sizeof(*perms_list), GFP_KERNEL); if (!perms_list) { Loading