replace common qcom sources with samsung ones

This commit is contained in:
SaschaNes
2025-08-12 22:13:00 +02:00
parent ba24dcded9
commit 6f7753de11
5682 changed files with 2450203 additions and 103634 deletions

View File

@@ -3,7 +3,7 @@
* QTI Secure Execution Environment Communicator (QSEECOM) driver
*
* Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#define pr_fmt(fmt) "QSEECOM: %s: " fmt, __func__
@@ -153,14 +153,6 @@ enum qseecom_bandwidth_request_mode {
MEDIUM,
HIGH,
};
/**
* For requests that get TZ busy, qseecom will
* put them on hold and re-send them after TZ
* free. The timeout for waiting TZ free is
* 30 seconds.
*/
#define TZ_BUSY_TIMEOUT_MSECS (30*1000)
#define K_COPY_FROM_USER(err, dst, src, size) \
do {\
if (!(is_compat_task()))\
@@ -558,7 +550,7 @@ static void __qseecom_free_coherent_buf(uint32_t size,
static int __qseecom_scm_call2_locked(uint32_t smc_id, struct qseecom_scm_desc *desc)
{
int ret = 0;
unsigned long tz_busy_timeout = msecs_to_jiffies(TZ_BUSY_TIMEOUT_MSECS);
int retry_count = 0;
if (!desc) {
pr_err("Invalid buffer pointer\n");
@@ -567,45 +559,15 @@ static int __qseecom_scm_call2_locked(uint32_t smc_id, struct qseecom_scm_desc *
do {
ret = qcom_scm_qseecom_call(smc_id, desc, false);
if (ret != -EBUSY && desc->ret[0] != -QSEE_RESULT_FAIL_APP_BUSY) {
break;
}
if(qseecom.app_block_ref_cnt == 0){
if ((ret == -EBUSY) || (desc && (desc->ret[0] == -QSEE_RESULT_FAIL_APP_BUSY))) {
mutex_unlock(&app_access_lock);
msleep(QSEECOM_SCM_EBUSY_WAIT_MS);
mutex_lock(&app_access_lock);
if(tz_busy_timeout >= msecs_to_jiffies(QSEECOM_SCM_EBUSY_WAIT_MS)){
tz_busy_timeout -= msecs_to_jiffies(QSEECOM_SCM_EBUSY_WAIT_MS);
} else {
tz_busy_timeout = 0;
}
} else {
mutex_unlock(&app_access_lock);
/* wait until no listener is active, or timeout/interrupted */
ret = wait_event_interruptible_timeout(qseecom.app_block_wq,
(!qseecom.app_block_ref_cnt), tz_busy_timeout);
mutex_lock(&app_access_lock);
/* no listner is active: re-send */
if(ret > 0){
tz_busy_timeout = ret;
}
/* interrupted or error */
else if (ret < 0){
pr_err("Waiting for TZ free is interrupted");
return ret;
} else {
/* timed out */
tz_busy_timeout = 0;
}
}
if(tz_busy_timeout == 0){
pr_err("Secure World has been busy for 30 seconds!");
ret = -EBUSY;
desc->ret[0] = -QSEE_RESULT_FAIL_APP_BUSY;
break;
}
pr_info_ratelimited("re-sending syscall with TZ busy");
} while (true);
if (retry_count == 33)
pr_warn("secure world has been busy for 1 second!\n");
} while (((ret == -EBUSY) || (desc && (desc->ret[0] == -QSEE_RESULT_FAIL_APP_BUSY))) &&
(retry_count++ < QSEECOM_SCM_EBUSY_MAX_RETRY));
return ret;
}
@@ -1885,48 +1847,39 @@ static void __qseecom_processing_pending_lsnr_unregister(void)
int ret = 0;
mutex_lock(&listener_access_lock);
if (!list_empty(&qseecom.unregister_lsnr_pending_list_head)) {
while (!list_empty(&qseecom.unregister_lsnr_pending_list_head)) {
pos = qseecom.unregister_lsnr_pending_list_head.next;
do {
entry = list_entry(pos,
entry = list_entry(pos,
struct qseecom_unregister_pending_list, list);
if (entry && entry->data) {
pr_debug("process pending unregister %d\n",
entry->data->listener.id);
/* don't process the entry if qseecom_release is not called*/
if (!entry->data->listener.release_called) {
pr_err("listener release yet to be called for lstnr :%d\n",
entry->data->listener.id);
pos = pos->next;
continue;
}
ptr_svc = __qseecom_find_svc(
entry->data->listener.id);
pr_debug("Unregistering listener %d\n", entry->data->listener.id);
if (ptr_svc) {
ret = __qseecom_unregister_listener(
entry->data, ptr_svc);
if (ret) {
pr_debug("unregister %d pending again\n",
entry->data->listener.id);
mutex_unlock(&listener_access_lock);
return;
}
} else
pr_err("invalid listener %d\n",
entry->data->listener.id);
__qseecom_free_tzbuf(&entry->data->sglistinfo_shm);
kfree_sensitive(entry->data);
if (entry && entry->data) {
pr_debug("process pending unregister %d\n",
entry->data->listener.id);
/* don't process the entry if qseecom_release is not called*/
if (!entry->data->listener.release_called) {
list_del(pos);
list_add_tail(&entry->list,
&qseecom.unregister_lsnr_pending_list_head);
break;
}
pos = pos->next;
list_del(pos->prev);
kfree_sensitive(entry);
} while (!list_is_head(pos, &qseecom.unregister_lsnr_pending_list_head));
ptr_svc = __qseecom_find_svc(
entry->data->listener.id);
if (ptr_svc) {
ret = __qseecom_unregister_listener(
entry->data, ptr_svc);
if (ret) {
pr_debug("unregister %d pending again\n",
entry->data->listener.id);
mutex_unlock(&listener_access_lock);
return;
}
} else
pr_err("invalid listener %d\n",
entry->data->listener.id);
__qseecom_free_tzbuf(&entry->data->sglistinfo_shm);
kfree_sensitive(entry->data);
}
list_del(pos);
kfree_sensitive(entry);
}
mutex_unlock(&listener_access_lock);
wake_up_interruptible(&qseecom.register_lsnr_pending_wq);
@@ -3277,6 +3230,11 @@ static int qseecom_unload_app(struct qseecom_dev_handle *data,
goto unload_exit;
}
if (!memcmp(data->client.app_name, "tz_hdm", strlen("tz_hdm"))) {
pr_debug("Do not unload tz_hdm app from tz\n");
goto unload_exit;
}
ret = __qseecom_cleanup_app(data);
if (ret && !app_crash) {
pr_err("cleanup app failed, pending ioctl:%d\n", data->ioctl_count.counter);
@@ -3351,15 +3309,6 @@ static int qseecom_prepare_unload_app(struct qseecom_dev_handle *data)
if (!memcmp(data->client.app_name, "keymaste", strlen("keymaste"))) {
pr_debug("Do not add keymaster app from tz to unload list\n");
/* release the associated dma-buf */
if (data->client.dmabuf) {
qseecom_vaddr_unmap(data->client.sb_virt, data->client.sgt,
data->client.attach, data->client.dmabuf);
MAKE_NULL(data->client.sgt,
data->client.attach, data->client.dmabuf);
}
data->released = true;
__qseecom_free_tzbuf(&data->sglistinfo_shm);
return 0;
}
@@ -9910,11 +9859,8 @@ exit_unregister_bridge:
return rc;
}
#if KERNEL_VERSION(6, 10, 0) > LINUX_VERSION_CODE
static int qseecom_remove(struct platform_device *pdev)
#else
static void qseecom_remove(struct platform_device *pdev)
#endif
{
struct qseecom_registered_kclient_list *kclient = NULL;
struct qseecom_registered_kclient_list *kclient_tmp = NULL;
@@ -9958,9 +9904,7 @@ static void qseecom_remove(struct platform_device *pdev)
qseecom_deinit_clk();
qseecom_release_ce_data();
qseecom_deinit_dev();
#if KERNEL_VERSION(6, 10, 0) > LINUX_VERSION_CODE
return ret;
#endif
}
static int qseecom_suspend(struct platform_device *pdev, pm_message_t state)