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:
parent
eb4eadf52a
commit
ce21cb3900
1
arch/arm64/configs/vendor/waipio_GKI.config
vendored
1
arch/arm64/configs/vendor/waipio_GKI.config
vendored
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user