replace common qcom sources with samsung ones
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user