From ce21cb39003b9d645ba7c2dccead640f3f84261b Mon Sep 17 00:00:00 2001 From: Dinesh K Garg Date: Sun, 24 Jan 2021 11:57:51 -0800 Subject: [PATCH] qseecom: enable support for QSEECom Adding changes to port QSEECom driver to kernel 5.10 Change-Id: I840b485439b9fd8872e9411238ac07c89ac588f5 Signed-off-by: Dinesh K Garg --- arch/arm64/configs/vendor/waipio_GKI.config | 1 + drivers/firmware/qtee_shmbridge.c | 45 ++++++++++++++++----- drivers/misc/Makefile | 2 +- drivers/misc/qseecom.c | 41 +++++++------------ modules.list.msm.waipio | 1 + 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/arch/arm64/configs/vendor/waipio_GKI.config b/arch/arm64/configs/vendor/waipio_GKI.config index 0e1b6d00c320..044b51916bf5 100644 --- a/arch/arm64/configs/vendor/waipio_GKI.config +++ b/arch/arm64/configs/vendor/waipio_GKI.config @@ -184,6 +184,7 @@ CONFIG_QRTR_HAVEN=m CONFIG_QRTR_MHI=m CONFIG_QRTR_SMD=m CONFIG_QSEE_IPC_IRQ_BRIDGE=m +CONFIG_QSEECOM=m CONFIG_QTI_ADC_TM=m CONFIG_QTI_ALTMODE_GLINK=m CONFIG_QTI_BATTERY_CHARGER=m diff --git a/drivers/firmware/qtee_shmbridge.c b/drivers/firmware/qtee_shmbridge.c index 3b712b22cc9e..7ddd2257d8a6 100644 --- a/drivers/firmware/qtee_shmbridge.c +++ b/drivers/firmware/qtee_shmbridge.c @@ -2,7 +2,7 @@ /* * QTI TEE shared memory bridge driver * - * Copyright (c) 2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2021, The Linux Foundation. All rights reserved. */ #include @@ -280,6 +280,30 @@ int32_t qtee_shmbridge_allocate_shm(size_t size, struct qtee_shm *shm) int32_t ret = 0; unsigned long va; + if (IS_ERR_OR_NULL(shm)) { + pr_err("qtee_shm is NULL\n"); + ret = -EINVAL; + goto exit; + } + + if (!qtee_shmbridge_is_enabled()) { + void *buf = NULL; + dma_addr_t coh_pmem; + + pr_err("shmbridge is not enabled, allocating via dma_aloc\n"); + + size = (size + PAGE_SIZE) & PAGE_MASK; + buf = dma_alloc_coherent(default_bridge.dev, size, &coh_pmem, GFP_KERNEL); + + if (buf == NULL) + return -ENOMEM; + + shm->vaddr = buf; + shm->paddr = coh_pmem; + shm->size = size; + goto exit; + } + if (size > DEFAULT_BRIDGE_SIZE) { pr_err("requestd size %zu is larger than bridge size %d\n", size, DEFAULT_BRIDGE_SIZE); @@ -287,11 +311,6 @@ int32_t qtee_shmbridge_allocate_shm(size_t size, struct qtee_shm *shm) goto exit; } - if (IS_ERR_OR_NULL(shm)) { - pr_err("qtee_shm is NULL\n"); - ret = -EINVAL; - goto exit; - } size = roundup(size, 1 << default_bridge.min_alloc_order); va = gen_pool_alloc(default_bridge.genpool, size); @@ -320,14 +339,19 @@ void qtee_shmbridge_free_shm(struct qtee_shm *shm) { if (IS_ERR_OR_NULL(shm) || !shm->vaddr) return; - gen_pool_free(default_bridge.genpool, (unsigned long)shm->vaddr, - shm->size); + if (!qtee_shmbridge_is_enabled()) + dma_free_coherent(default_bridge.dev, shm->size, shm->vaddr, shm->paddr); + else + gen_pool_free(default_bridge.genpool, (unsigned long)shm->vaddr, + shm->size); } EXPORT_SYMBOL(qtee_shmbridge_free_shm); /* cache clean operation for buffer sub-allocated from default bridge */ void qtee_shmbridge_flush_shm_buf(struct qtee_shm *shm) { + if (!qtee_shmbridge_is_enabled()) + return; if (shm) return dma_sync_single_for_device(default_bridge.dev, shm->paddr, shm->size, DMA_TO_DEVICE); @@ -337,6 +361,8 @@ EXPORT_SYMBOL(qtee_shmbridge_flush_shm_buf); /* cache invalidation operation for buffer sub-allocated from default bridge */ void qtee_shmbridge_inv_shm_buf(struct qtee_shm *shm) { + if (!qtee_shmbridge_is_enabled()) + return; if (shm) return dma_sync_single_for_cpu(default_bridge.dev, shm->paddr, shm->size, DMA_FROM_DEVICE); @@ -363,7 +389,7 @@ static int qtee_shmbridge_init(struct platform_device *pdev) ns_vm_ids = ns_vm_ids_hlos; if (default_bridge.vaddr) { - pr_warn("qtee shmbridge is already initialized\n"); + pr_err("qtee shmbridge is already initialized\n"); return 0; } @@ -373,6 +399,7 @@ static int qtee_shmbridge_init(struct platform_device *pdev) get_order(default_bridge.size)); if (!default_bridge.vaddr) return -ENOMEM; + default_bridge.paddr = dma_map_single(&pdev->dev, default_bridge.vaddr, default_bridge.size, DMA_TO_DEVICE); diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 36f603dde537..9e8efa06c3f1 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -60,6 +60,6 @@ obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o obj-$(CONFIG_UID_SYS_STATS) += uid_sys_stats.o obj-$(CONFIG_QSEECOM) += qseecom-mod.o -qseecom-mod-y := qseecom.o +qseecom-mod-$(CONFIG_QSEECOM) := qseecom.o qseecom-mod-$(CONFIG_COMPAT) += compat_qseecom.o obj-$(CONFIG_WIGIG_SENSING_SPI) += wigig_sensing.o diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 094b84b6b65a..bd3b97a1533f 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2,7 +2,7 @@ /* * QTI Secure Execution Environment Communicator (QSEECOM) driver * - * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "QSEECOM: %s: " fmt, __func__ @@ -9524,70 +9524,57 @@ static int qseecom_create_kthreads(void) return 0; } -static int qseecom_register_heap_shmbridge(uint32_t heapid, uint64_t *handle) +static int qseecom_register_heap_shmbridge(struct platform_device *pdev, + char *heap_mem_region_name, + uint64_t *handle) { phys_addr_t heap_pa = 0; size_t heap_size = 0; - struct device *ion_dev = NULL; struct device_node *node = NULL; struct reserved_mem *rmem = NULL; uint32_t ns_vmids[] = {VMID_HLOS}; uint32_t ns_vm_perms[] = {PERM_READ | PERM_WRITE}; - int ret = 0; - ion_dev = msm_ion_heap_device_by_id(heapid); - ret = PTR_ERR_OR_ZERO(ion_dev); - if (ret) { - pr_err("Failed to find node for heap %d, ret = %d\n", - heapid, ret); - return ret; - } - - node = of_parse_phandle(ion_dev->of_node, "memory-region", 0); + node = of_parse_phandle(pdev->dev.of_node, heap_mem_region_name, 0); if (!node) { - pr_err("unable to parse memory-region of heap %d\n", heapid); + pr_err("unable to parse memory-region of heap %d\n", heap_mem_region_name); return -EINVAL; } rmem = of_reserved_mem_lookup(node); if (!rmem) { - pr_err("unable to acquire memory-region of heap %d\n", heapid); + pr_err("unable to acquire memory-region of heap %d\n", heap_mem_region_name); return -EINVAL; } - ret = of_reserved_mem_device_init_by_idx(ion_dev, ion_dev->of_node, 0); - of_node_put(node); - if (ret) { - pr_err("Failed to initialize reserved mem, ret %d\n", ret); - return ret; - } + heap_pa = rmem->base; heap_size = (size_t)rmem->size; - pr_debug("get heap %d info: shmbridge created\n", heapid); + pr_debug("get heap %d info: shmbridge created\n", heap_mem_region_name); return qtee_shmbridge_register(heap_pa, heap_size, ns_vmids, ns_vm_perms, 1, PERM_READ | PERM_WRITE, handle); } -static int qseecom_register_shmbridge(void) +static int qseecom_register_shmbridge(struct platform_device *pdev) { int ret = 0; if (!qtee_shmbridge_is_enabled()) return 0; - ret = qseecom_register_heap_shmbridge(ION_QSECOM_TA_HEAP_ID, + ret = qseecom_register_heap_shmbridge(pdev, "qseecom_ta_mem", &qseecom.ta_bridge_handle); if (ret) return ret; - ret = qseecom_register_heap_shmbridge(ION_QSECOM_HEAP_ID, + ret = qseecom_register_heap_shmbridge(pdev, "qseecom_mem", &qseecom.qseecom_bridge_handle); if (ret) { qtee_shmbridge_deregister(qseecom.ta_bridge_handle); return ret; } - ret = qseecom_register_heap_shmbridge(ION_USER_CONTIG_HEAP_ID, + ret = qseecom_register_heap_shmbridge(pdev, "user_contig_mem", &qseecom.user_contig_bridge_handle); if (ret) { qtee_shmbridge_deregister(qseecom.qseecom_bridge_handle); @@ -9609,7 +9596,7 @@ static int qseecom_probe(struct platform_device *pdev) { int rc; - rc = qseecom_register_shmbridge(); + rc = qseecom_register_shmbridge(pdev); if (rc) return rc; diff --git a/modules.list.msm.waipio b/modules.list.msm.waipio index 2e0d1961bc3b..b7190b112311 100644 --- a/modules.list.msm.waipio +++ b/modules.list.msm.waipio @@ -188,5 +188,6 @@ ddr_cdev.ko msm_lmh_dcvs.ko cpu_hotplug.ko tz_log.ko +qseecom-mod.ko bcl_soc.ko bcl_pmic5.ko