qseecom: enable support for QSEECom

Adding changes to port QSEECom driver to kernel 5.10

Change-Id: I840b485439b9fd8872e9411238ac07c89ac588f5
Signed-off-by: Dinesh K Garg <dineshg@codeaurora.org>
This commit is contained in:
Dinesh K Garg 2021-01-24 11:57:51 -08:00
parent eb4eadf52a
commit ce21cb3900
5 changed files with 53 additions and 37 deletions

View File

@ -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

View File

@ -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 <linux/module.h>
@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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