Merge "qseecom: add compat_qseecom to support 32bit process"

This commit is contained in:
qctecmdr 2020-02-07 18:53:35 -08:00 • committed by Gerrit - the friendly Code Review server
commit 2648fff13a
4 changed files with 1266 additions and 2 deletions

View file

@ -58,4 +58,6 @@ obj-$(CONFIG_PVPANIC) += pvpanic.o
obj-$(CONFIG_HABANA_AI) += habanalabs/
obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o
obj-$(CONFIG_UID_SYS_STATS) += uid_sys_stats.o
obj-$(CONFIG_QSEECOM) += qseecom.o
obj-$(CONFIG_QSEECOM) += qseecom-mod.o
qseecom-mod-y := qseecom.o
qseecom-mod-$(CONFIG_COMPAT) += compat_qseecom.o

View file

@ -0,0 +1,920 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2014-2018, 2020, The Linux Foundation. All rights reserved.
*/
#include <linux/debugfs.h>
#include <linux/uaccess.h>
#include <linux/qseecom.h>
#include <linux/compat.h>
#include "compat_qseecom.h"
static int compat_get_qseecom_register_listener_req(
struct compat_qseecom_register_listener_req __user *data32,
struct qseecom_register_listener_req __user *data)
{
int err;
compat_ulong_t listener_id;
compat_long_t ifd_data_fd;
compat_uptr_t virt_sb_base;
compat_ulong_t sb_size;
err = get_user(listener_id, &data32->listener_id);
err |= put_user(listener_id, &data->listener_id);
err |= get_user(ifd_data_fd, &data32->ifd_data_fd);
err |= put_user(ifd_data_fd, &data->ifd_data_fd);
err |= get_user(virt_sb_base, &data32->virt_sb_base);
/* upper bits won't get set, zero them */
err |= put_user(NULL, &data->virt_sb_base);
err |= put_user(virt_sb_base,
(compat_uptr_t __user *)&data->virt_sb_base);
err |= get_user(sb_size, &data32->sb_size);
err |= put_user(sb_size, &data->sb_size);
return err;
}
static int compat_get_qseecom_load_img_req(
struct compat_qseecom_load_img_req __user *data32,
struct qseecom_load_img_req __user *data)
{
int err;
compat_ulong_t mdt_len;
compat_ulong_t img_len;
compat_long_t ifd_data_fd;
compat_ulong_t app_arch;
compat_uint_t app_id;
err = get_user(mdt_len, &data32->mdt_len);
err |= put_user(mdt_len, &data->mdt_len);
err |= get_user(img_len, &data32->img_len);
err |= put_user(img_len, &data->img_len);
err |= get_user(ifd_data_fd, &data32->ifd_data_fd);
err |= put_user(ifd_data_fd, &data->ifd_data_fd);
err |= copy_in_user(data->img_name, data32->img_name,
MAX_APP_NAME_SIZE);
err |= get_user(app_arch, &data32->app_arch);
err |= put_user(app_arch, &data->app_arch);
err |= get_user(app_id, &data32->app_id);
err |= put_user(app_id, &data->app_id);
return err;
}
static int compat_get_qseecom_send_cmd_req(
struct compat_qseecom_send_cmd_req __user *data32,
struct qseecom_send_cmd_req __user *data)
{
int err;
compat_uptr_t cmd_req_buf;
compat_uint_t cmd_req_len;
compat_uptr_t resp_buf;
compat_uint_t resp_len;
err = get_user(cmd_req_buf, &data32->cmd_req_buf);
err |= put_user(NULL, &data->cmd_req_buf);
err |= put_user(cmd_req_buf,
(compat_uptr_t __user *)&data->cmd_req_buf);
err |= get_user(cmd_req_len, &data32->cmd_req_len);
err |= put_user(cmd_req_len, &data->cmd_req_len);
err |= get_user(resp_buf, &data32->resp_buf);
err |= put_user(NULL, &data->resp_buf);
err |= put_user(resp_buf, (compat_uptr_t __user *)&data->resp_buf);
err |= get_user(resp_len, &data32->resp_len);
err |= put_user(resp_len, &data->resp_len);
return err;
}
static int compat_get_qseecom_send_modfd_cmd_req(
struct compat_qseecom_send_modfd_cmd_req __user *data32,
struct qseecom_send_modfd_cmd_req __user *data)
{
int err;
unsigned int i;
compat_uptr_t cmd_req_buf;
compat_uint_t cmd_req_len;
compat_uptr_t resp_buf;
compat_uint_t resp_len;
compat_long_t fd;
compat_ulong_t cmd_buf_offset;
err = get_user(cmd_req_buf, &data32->cmd_req_buf);
err |= put_user(NULL, &data->cmd_req_buf);
err |= put_user(cmd_req_buf,
(compat_uptr_t __user *)&data->cmd_req_buf);
err |= get_user(cmd_req_len, &data32->cmd_req_len);
err |= put_user(cmd_req_len, &data->cmd_req_len);
err |= get_user(resp_buf, &data32->resp_buf);
err |= put_user(NULL, &data->resp_buf);
err |= put_user(resp_buf, (compat_uptr_t __user *)&data->resp_buf);
err |= get_user(resp_len, &data32->resp_len);
err |= put_user(resp_len, &data->resp_len);
for (i = 0; i < MAX_ION_FD; i++) {
err |= get_user(fd, &data32->ifd_data[i].fd);
err |= put_user(fd, &data->ifd_data[i].fd);
err |= get_user(cmd_buf_offset,
&data32->ifd_data[i].cmd_buf_offset);
err |= put_user(cmd_buf_offset,
&data->ifd_data[i].cmd_buf_offset);
}
return err;
}
static int compat_get_qseecom_set_sb_mem_param_req(
struct compat_qseecom_set_sb_mem_param_req __user *data32,
struct qseecom_set_sb_mem_param_req __user *data)
{
int err;
compat_long_t ifd_data_fd;
compat_uptr_t virt_sb_base;
compat_ulong_t sb_len;
err = get_user(ifd_data_fd, &data32->ifd_data_fd);
err |= put_user(ifd_data_fd, &data->ifd_data_fd);
err |= get_user(virt_sb_base, &data32->virt_sb_base);
err |= put_user(NULL, &data->virt_sb_base);
err |= put_user(virt_sb_base,
(compat_uptr_t __user *)&data->virt_sb_base);
err |= get_user(sb_len, &data32->sb_len);
err |= put_user(sb_len, &data->sb_len);
return err;
}
static int compat_get_qseecom_qseos_version_req(
struct compat_qseecom_qseos_version_req __user *data32,
struct qseecom_qseos_version_req __user *data)
{
int err;
compat_uint_t qseos_version;
err = get_user(qseos_version, &data32->qseos_version);
err |= put_user(qseos_version, &data->qseos_version);
return err;
}
static int compat_get_qseecom_qseos_app_load_query(
struct compat_qseecom_qseos_app_load_query __user *data32,
struct qseecom_qseos_app_load_query __user *data)
{
int err = 0;
unsigned int i;
compat_uint_t app_id;
char app_name;
compat_ulong_t app_arch;
for (i = 0; i < MAX_APP_NAME_SIZE; i++) {
err |= get_user(app_name, &(data32->app_name[i]));
err |= put_user(app_name, &(data->app_name[i]));
}
err |= get_user(app_id, &data32->app_id);
err |= put_user(app_id, &data->app_id);
err |= get_user(app_arch, &data32->app_arch);
err |= put_user(app_arch, &data->app_arch);
return err;
}
static int compat_get_qseecom_send_svc_cmd_req(
struct compat_qseecom_send_svc_cmd_req __user *data32,
struct qseecom_send_svc_cmd_req __user *data)
{
int err;
compat_ulong_t cmd_id;
compat_uptr_t cmd_req_buf;
compat_uint_t cmd_req_len;
compat_uptr_t resp_buf;
compat_uint_t resp_len;
err = get_user(cmd_id, &data32->cmd_id);
err |= put_user(cmd_id, &data->cmd_id);
err |= get_user(cmd_req_buf, &data32->cmd_req_buf);
err |= put_user(NULL, &data->cmd_req_buf);
err |= put_user(cmd_req_buf,
(compat_uptr_t __user *)&data->cmd_req_buf);
err |= get_user(cmd_req_len, &data32->cmd_req_len);
err |= put_user(cmd_req_len, &data->cmd_req_len);
err |= get_user(resp_buf, &data32->resp_buf);
err |= put_user(NULL, &data->resp_buf);
err |= put_user(resp_buf, (compat_uptr_t __user *)&data->resp_buf);
err |= get_user(resp_len, &data32->resp_len);
err |= put_user(resp_len, &data->resp_len);
return err;
}
static int compat_get_qseecom_create_key_req(
struct compat_qseecom_create_key_req __user *data32,
struct qseecom_create_key_req __user *data)
{
int err;
compat_uint_t usage;
err = copy_in_user(data->hash32, data32->hash32, QSEECOM_HASH_SIZE);
err |= get_user(usage, &data32->usage);
err |= put_user(usage, &data->usage);
return err;
}
static int compat_get_qseecom_wipe_key_req(
struct compat_qseecom_wipe_key_req __user *data32,
struct qseecom_wipe_key_req __user *data)
{
int err;
compat_uint_t usage;
compat_int_t wipe_key_flag;
err = get_user(usage, &data32->usage);
err |= put_user(usage, &data->usage);
err |= get_user(wipe_key_flag, &data32->wipe_key_flag);
err |= put_user(wipe_key_flag, &data->wipe_key_flag);
return err;
}
static int compat_get_qseecom_update_key_userinfo_req(
struct compat_qseecom_update_key_userinfo_req __user *data32,
struct qseecom_update_key_userinfo_req __user *data)
{
int err = 0;
compat_uint_t usage;
err = copy_in_user(data->current_hash32, data32->current_hash32,
QSEECOM_HASH_SIZE);
err |= copy_in_user(data->new_hash32, data32->new_hash32,
QSEECOM_HASH_SIZE);
err |= get_user(usage, &data32->usage);
err |= put_user(usage, &data->usage);
return err;
}
static int compat_get_qseecom_save_partition_hash_req(
struct compat_qseecom_save_partition_hash_req __user *data32,
struct qseecom_save_partition_hash_req __user *data)
{
int err;
compat_int_t partition_id;
err = get_user(partition_id, &data32->partition_id);
err |= put_user(partition_id, &data->partition_id);
err |= copy_in_user(data->digest, data32->digest,
SHA256_DIGEST_LENGTH);
return err;
}
static int compat_get_qseecom_is_es_activated_req(
struct compat_qseecom_is_es_activated_req __user *data32,
struct qseecom_is_es_activated_req __user *data)
{
compat_int_t is_activated;
int err;
err = get_user(is_activated, &data32->is_activated);
err |= put_user(is_activated, &data->is_activated);
return err;
}
static int compat_get_qseecom_mdtp_cipher_dip_req(
struct compat_qseecom_mdtp_cipher_dip_req __user *data32,
struct qseecom_mdtp_cipher_dip_req __user *data)
{
int err;
compat_int_t in_buf_size;
compat_uptr_t in_buf;
compat_int_t out_buf_size;
compat_uptr_t out_buf;
compat_int_t direction;
err = get_user(in_buf_size, &data32->in_buf_size);
err |= put_user(in_buf_size, &data->in_buf_size);
err |= get_user(out_buf_size, &data32->out_buf_size);
err |= put_user(out_buf_size, &data->out_buf_size);
err |= get_user(direction, &data32->direction);
err |= put_user(direction, &data->direction);
err |= get_user(in_buf, &data32->in_buf);
err |= put_user(NULL, &data->in_buf);
err |= put_user(in_buf, (compat_uptr_t __user *)&data->in_buf);
err |= get_user(out_buf, &data32->out_buf);
err |= put_user(NULL, &data->out_buf);
err |= put_user(out_buf, (compat_uptr_t __user *)&data->out_buf);
return err;
}
static int compat_get_qseecom_send_modfd_listener_resp(
struct compat_qseecom_send_modfd_listener_resp __user *data32,
struct qseecom_send_modfd_listener_resp __user *data)
{
int err;
unsigned int i;
compat_uptr_t resp_buf_ptr;
compat_uint_t resp_len;
compat_long_t fd;
compat_ulong_t cmd_buf_offset;
err = get_user(resp_buf_ptr, &data32->resp_buf_ptr);
err |= put_user(NULL, &data->resp_buf_ptr);
err |= put_user(resp_buf_ptr,
(compat_uptr_t __user *)&data->resp_buf_ptr);
err |= get_user(resp_len, &data32->resp_len);
err |= put_user(resp_len, &data->resp_len);
for (i = 0; i < MAX_ION_FD; i++) {
err |= get_user(fd, &data32->ifd_data[i].fd);
err |= put_user(fd, &data->ifd_data[i].fd);
err |= get_user(cmd_buf_offset,
&data32->ifd_data[i].cmd_buf_offset);
err |= put_user(cmd_buf_offset,
&data->ifd_data[i].cmd_buf_offset);
}
return err;
}
static int compat_get_qseecom_qteec_req(
struct compat_qseecom_qteec_req __user *data32,
struct qseecom_qteec_req __user *data)
{
compat_uptr_t req_ptr;
compat_ulong_t req_len;
compat_uptr_t resp_ptr;
compat_ulong_t resp_len;
int err;
err = get_user(req_ptr, &data32->req_ptr);
err |= put_user(NULL, &data->req_ptr);
err |= put_user(req_ptr, (compat_uptr_t __user *)&data->req_ptr);
err |= get_user(req_len, &data32->req_len);
err |= put_user(req_len, &data->req_len);
err |= get_user(resp_ptr, &data32->resp_ptr);
err |= put_user(NULL, &data->resp_ptr);
err |= put_user(resp_ptr, (compat_uptr_t __user *)&data->resp_ptr);
err |= get_user(resp_len, &data32->resp_len);
err |= put_user(resp_len, &data->resp_len);
return err;
}
static int compat_get_qseecom_qteec_modfd_req(
struct compat_qseecom_qteec_modfd_req __user *data32,
struct qseecom_qteec_modfd_req __user *data)
{
compat_uptr_t req_ptr;
compat_ulong_t req_len;
compat_uptr_t resp_ptr;
compat_ulong_t resp_len;
compat_long_t fd;
compat_ulong_t cmd_buf_offset;
int err, i;
err = get_user(req_ptr, &data32->req_ptr);
err |= put_user(NULL, &data->req_ptr);
err |= put_user(req_ptr, (compat_uptr_t __user *)&data->req_ptr);
err |= get_user(req_len, &data32->req_len);
err |= put_user(req_len, &data->req_len);
err |= get_user(resp_ptr, &data32->resp_ptr);
err |= put_user(NULL, &data->resp_ptr);
err |= put_user(resp_ptr, (compat_uptr_t __user *)&data->resp_ptr);
err |= get_user(resp_len, &data32->resp_len);
err |= put_user(resp_len, &data->resp_len);
for (i = 0; i < MAX_ION_FD; i++) {
err |= get_user(fd, &data32->ifd_data[i].fd);
err |= put_user(fd, &data->ifd_data[i].fd);
err |= get_user(cmd_buf_offset,
&data32->ifd_data[i].cmd_buf_offset);
err |= put_user(cmd_buf_offset,
&data->ifd_data[i].cmd_buf_offset);
}
return err;
}
static int compat_get_int(compat_int_t __user *data32,
int __user *data)
{
compat_int_t x;
int err;
err = get_user(x, data32);
err |= put_user(x, data);
return err;
}
static int compat_put_qseecom_load_img_req(
struct compat_qseecom_load_img_req __user *data32,
struct qseecom_load_img_req __user *data)
{
int err;
compat_ulong_t mdt_len;
compat_ulong_t img_len;
compat_long_t ifd_data_fd;
compat_ulong_t app_arch;
compat_int_t app_id;
err = get_user(mdt_len, &data->mdt_len);
err |= put_user(mdt_len, &data32->mdt_len);
err |= get_user(img_len, &data->img_len);
err |= put_user(img_len, &data32->img_len);
err |= get_user(ifd_data_fd, &data->ifd_data_fd);
err |= put_user(ifd_data_fd, &data32->ifd_data_fd);
err |= copy_in_user(data32->img_name, data->img_name,
MAX_APP_NAME_SIZE);
err |= get_user(app_arch, &data->app_arch);
err |= put_user(app_arch, &data32->app_arch);
err |= get_user(app_id, &data->app_id);
err |= put_user(app_id, &data32->app_id);
return err;
}
static int compat_put_qseecom_qseos_version_req(
struct compat_qseecom_qseos_version_req __user *data32,
struct qseecom_qseos_version_req __user *data)
{
compat_uint_t qseos_version;
int err;
err = get_user(qseos_version, &data->qseos_version);
err |= put_user(qseos_version, &data32->qseos_version);
return err;
}
static int compat_put_qseecom_qseos_app_load_query(
struct compat_qseecom_qseos_app_load_query __user *data32,
struct qseecom_qseos_app_load_query __user *data)
{
int err = 0;
unsigned int i;
compat_int_t app_id;
compat_ulong_t app_arch;
char app_name;
for (i = 0; i < MAX_APP_NAME_SIZE; i++) {
err |= get_user(app_name, &(data->app_name[i]));
err |= put_user(app_name, &(data32->app_name[i]));
}
err |= get_user(app_id, &data->app_id);
err |= put_user(app_id, &data32->app_id);
err |= get_user(app_arch, &data->app_arch);
err |= put_user(app_arch, &data32->app_arch);
return err;
}
static int compat_put_qseecom_is_es_activated_req(
struct compat_qseecom_is_es_activated_req __user *data32,
struct qseecom_is_es_activated_req __user *data)
{
compat_int_t is_activated;
int err;
err = get_user(is_activated, &data->is_activated);
err |= put_user(is_activated, &data32->is_activated);
return err;
}
static unsigned int convert_cmd(unsigned int cmd)
{
switch (cmd) {
case COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ:
return QSEECOM_IOCTL_REGISTER_LISTENER_REQ;
case COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ:
return QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ;
case COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ:
return QSEECOM_IOCTL_LOAD_APP_REQ;
case COMPAT_QSEECOM_IOCTL_RECEIVE_REQ:
return QSEECOM_IOCTL_RECEIVE_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ:
return QSEECOM_IOCTL_SEND_RESP_REQ;
case COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ:
return QSEECOM_IOCTL_UNLOAD_APP_REQ;
case COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ:
return QSEECOM_IOCTL_PERF_ENABLE_REQ;
case COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ:
return QSEECOM_IOCTL_PERF_DISABLE_REQ;
case COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ:
return QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ;
case COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ:
return QSEECOM_IOCTL_SET_BUS_SCALING_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ:
return QSEECOM_IOCTL_SEND_CMD_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ:
return QSEECOM_IOCTL_SEND_MODFD_CMD_REQ;
case COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ:
return QSEECOM_IOCTL_SET_MEM_PARAM_REQ;
case COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ:
return QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ;
case COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ:
return QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ;
case COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ:
return QSEECOM_IOCTL_APP_LOADED_QUERY_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ:
return QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ;
case COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ:
return QSEECOM_IOCTL_CREATE_KEY_REQ;
case COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ:
return QSEECOM_IOCTL_WIPE_KEY_REQ;
case COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ:
return QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ;
case COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ:
return QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ;
case COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ:
return QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP:
return QSEECOM_IOCTL_SEND_MODFD_RESP;
case COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ:
return QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ;
case COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ:
return QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ;
case COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ:
return QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ;
case COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ:
return QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ;
case COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ:
return QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ:
return QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ;
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64:
return QSEECOM_IOCTL_SEND_MODFD_RESP_64;
default:
return cmd;
}
}
long compat_qseecom_ioctl(struct file *file,
unsigned int cmd, unsigned long arg)
{
long ret;
switch (cmd) {
case COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ:
case COMPAT_QSEECOM_IOCTL_RECEIVE_REQ:
case COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ:
case COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ:
case COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ:
case COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ:
case COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ: {
return qseecom_ioctl(file, convert_cmd(cmd), 0);
}
break;
case COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ: {
struct compat_qseecom_register_listener_req __user *data32;
struct qseecom_register_listener_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_register_listener_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ: {
struct compat_qseecom_load_img_req __user *data32;
struct qseecom_load_img_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_load_img_req(data32, data);
if (err)
return err;
ret = qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
err = compat_put_qseecom_load_img_req(data32, data);
return ret ? ret : err;
}
break;
case COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ: {
struct compat_qseecom_send_cmd_req __user *data32;
struct qseecom_send_cmd_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_send_cmd_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ:
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ: {
struct compat_qseecom_send_modfd_cmd_req __user *data32;
struct qseecom_send_modfd_cmd_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_send_modfd_cmd_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ: {
struct compat_qseecom_set_sb_mem_param_req __user *data32;
struct qseecom_set_sb_mem_param_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_set_sb_mem_param_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ: {
struct compat_qseecom_qseos_version_req __user *data32;
struct qseecom_qseos_version_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_qseos_version_req(data32, data);
if (err)
return err;
ret = qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
err = compat_put_qseecom_qseos_version_req(data32, data);
return ret ? ret : err;
}
break;
case COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ: {
compat_int_t __user *data32;
int __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_int(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ: {
struct compat_qseecom_load_img_req __user *data32;
struct qseecom_load_img_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_load_img_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ: {
struct compat_qseecom_qseos_app_load_query __user *data32;
struct qseecom_qseos_app_load_query __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_qseos_app_load_query(data32, data);
if (err)
return err;
ret = qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
err = compat_put_qseecom_qseos_app_load_query(data32, data);
return ret ? ret : err;
}
break;
case COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ: {
struct compat_qseecom_send_svc_cmd_req __user *data32;
struct qseecom_send_svc_cmd_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_send_svc_cmd_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ: {
struct compat_qseecom_create_key_req __user *data32;
struct qseecom_create_key_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_create_key_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ: {
struct compat_qseecom_wipe_key_req __user *data32;
struct qseecom_wipe_key_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_wipe_key_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ: {
struct compat_qseecom_update_key_userinfo_req __user *data32;
struct qseecom_update_key_userinfo_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_update_key_userinfo_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ: {
struct compat_qseecom_save_partition_hash_req __user *data32;
struct qseecom_save_partition_hash_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_save_partition_hash_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ: {
struct compat_qseecom_is_es_activated_req __user *data32;
struct qseecom_is_es_activated_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_is_es_activated_req(data32, data);
if (err)
return err;
ret = qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
err = compat_put_qseecom_is_es_activated_req(data32, data);
return ret ? ret : err;
}
break;
case COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ: {
struct compat_qseecom_mdtp_cipher_dip_req __user *data32;
struct qseecom_mdtp_cipher_dip_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_mdtp_cipher_dip_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP:
case COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64: {
struct compat_qseecom_send_modfd_listener_resp __user *data32;
struct qseecom_send_modfd_listener_resp __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_send_modfd_listener_resp(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ: {
struct compat_qseecom_qteec_req __user *data32;
struct qseecom_qteec_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_qteec_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
case COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ:
case COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ:
case COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ: {
struct compat_qseecom_qteec_modfd_req __user *data32;
struct qseecom_qteec_modfd_req __user *data;
int err;
data32 = compat_ptr(arg);
data = compat_alloc_user_space(sizeof(*data));
if (data == NULL)
return -EFAULT;
err = compat_get_qseecom_qteec_modfd_req(data32, data);
if (err)
return err;
return qseecom_ioctl(file, convert_cmd(cmd),
(unsigned long)data);
}
break;
default:
return -ENOIOCTLCMD;
break;
}
return 0;
}

View file

@ -0,0 +1,340 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2017, 2019-2020, The Linux Foundation. All rights reserved.
*/
#ifndef _UAPI_COMPAT_QSEECOM_H_
#define _UAPI_COMPAT_QSEECOM_H_
#include <linux/types.h>
#include <linux/ioctl.h>
#if IS_ENABLED(CONFIG_COMPAT)
#include <linux/compat.h>
/*
* struct compat_qseecom_register_listener_req -
* for register listener ioctl request
* @listener_id - service id (shared between userspace and QSE)
* @ifd_data_fd - ion handle
* @virt_sb_base - shared buffer base in user space
* @sb_size - shared buffer size
*/
struct compat_qseecom_register_listener_req {
compat_ulong_t listener_id; /* in */
compat_long_t ifd_data_fd; /* in */
compat_uptr_t virt_sb_base; /* in */
compat_ulong_t sb_size; /* in */
};
/*
* struct compat_qseecom_send_cmd_req - for send command ioctl request
* @cmd_req_len - command buffer length
* @cmd_req_buf - command buffer
* @resp_len - response buffer length
* @resp_buf - response buffer
*/
struct compat_qseecom_send_cmd_req {
compat_uptr_t cmd_req_buf; /* in */
compat_uint_t cmd_req_len; /* in */
compat_uptr_t resp_buf; /* in/out */
compat_uint_t resp_len; /* in/out */
};
/*
* struct qseecom_ion_fd_info - ion fd handle data information
* @fd - ion handle to some memory allocated in user space
* @cmd_buf_offset - command buffer offset
*/
struct compat_qseecom_ion_fd_info {
compat_long_t fd;
compat_ulong_t cmd_buf_offset;
};
/*
* struct qseecom_send_modfd_cmd_req - for send command ioctl request
* @cmd_req_len - command buffer length
* @cmd_req_buf - command buffer
* @resp_len - response buffer length
* @resp_buf - response buffer
* @ifd_data_fd - ion handle to memory allocated in user space
* @cmd_buf_offset - command buffer offset
*/
struct compat_qseecom_send_modfd_cmd_req {
compat_uptr_t cmd_req_buf; /* in */
compat_uint_t cmd_req_len; /* in */
compat_uptr_t resp_buf; /* in/out */
compat_uint_t resp_len; /* in/out */
struct compat_qseecom_ion_fd_info ifd_data[MAX_ION_FD];
};
/*
* struct compat_qseecom_listener_send_resp_req
* signal to continue the send_cmd req.
* Used as a trigger from HLOS service to notify QSEECOM that it's done with its
* operation and provide the response for QSEECOM can continue the incomplete
* command execution
* @resp_len - Length of the response
* @resp_buf - Response buffer where the response of the cmd should go.
*/
struct compat_qseecom_send_resp_req {
compat_uptr_t resp_buf; /* in */
compat_uint_t resp_len; /* in */
};
/*
* struct compat_qseecom_load_img_data
* for sending image length information and
* ion file descriptor to the qseecom driver. ion file descriptor is used
* for retrieving the ion file handle and in turn the physical address of
* the image location.
* @mdt_len - Length of the .mdt file in bytes.
* @img_len - Length of the .mdt + .b00 +..+.bxx images files in bytes
* @ion_fd - Ion file descriptor used when allocating memory.
* @img_name - Name of the image.
*/
struct compat_qseecom_load_img_req {
compat_ulong_t mdt_len; /* in */
compat_ulong_t img_len; /* in */
compat_long_t ifd_data_fd; /* in */
char img_name[MAX_APP_NAME_SIZE]; /* in */
compat_ulong_t app_arch; /* in */
compat_uint_t app_id; /* out*/
};
struct compat_qseecom_set_sb_mem_param_req {
compat_long_t ifd_data_fd; /* in */
compat_uptr_t virt_sb_base; /* in */
compat_ulong_t sb_len; /* in */
};
/*
* struct compat_qseecom_qseos_version_req - get qseos version
* @qseos_version - version number
*/
struct compat_qseecom_qseos_version_req {
compat_uint_t qseos_version; /* in */
};
/*
* struct compat_qseecom_qseos_app_load_query - verify if app is loaded in qsee
* @app_name[MAX_APP_NAME_SIZE]- name of the app.
* @app_id - app id.
*/
struct compat_qseecom_qseos_app_load_query {
char app_name[MAX_APP_NAME_SIZE]; /* in */
compat_uint_t app_id; /* out */
compat_ulong_t app_arch;
};
struct compat_qseecom_send_svc_cmd_req {
compat_ulong_t cmd_id;
compat_uptr_t cmd_req_buf; /* in */
compat_uint_t cmd_req_len; /* in */
compat_uptr_t resp_buf; /* in/out */
compat_uint_t resp_len; /* in/out */
};
struct compat_qseecom_create_key_req {
unsigned char hash32[QSEECOM_HASH_SIZE];
enum qseecom_key_management_usage_type usage;
};
struct compat_qseecom_wipe_key_req {
enum qseecom_key_management_usage_type usage;
compat_int_t wipe_key_flag;
};
struct compat_qseecom_update_key_userinfo_req {
unsigned char current_hash32[QSEECOM_HASH_SIZE];
unsigned char new_hash32[QSEECOM_HASH_SIZE];
enum qseecom_key_management_usage_type usage;
};
/*
* struct compat_qseecom_save_partition_hash_req
* @partition_id - partition id.
* @hash[SHA256_DIGEST_LENGTH] - sha256 digest.
*/
struct compat_qseecom_save_partition_hash_req {
compat_int_t partition_id; /* in */
char digest[SHA256_DIGEST_LENGTH]; /* in */
};
/*
* struct compat_qseecom_is_es_activated_req
* @is_activated - 1=true , 0=false
*/
struct compat_qseecom_is_es_activated_req {
compat_int_t is_activated; /* out */
};
/*
* struct compat_qseecom_mdtp_cipher_dip_req
* @in_buf - input buffer
* @in_buf_size - input buffer size
* @out_buf - output buffer
* @out_buf_size - output buffer size
* @direction - 0=encrypt, 1=decrypt
*/
struct compat_qseecom_mdtp_cipher_dip_req {
compat_uptr_t in_buf;
compat_uint_t in_buf_size;
compat_uptr_t out_buf;
compat_uint_t out_buf_size;
compat_uint_t direction;
};
/*
* struct qseecom_send_modfd_resp - for send command ioctl request
* @req_len - command buffer length
* @req_buf - command buffer
* @ifd_data_fd - ion handle to memory allocated in user space
* @cmd_buf_offset - command buffer offset
*/
struct compat_qseecom_send_modfd_listener_resp {
compat_uptr_t resp_buf_ptr; /* in */
compat_uint_t resp_len; /* in */
struct compat_qseecom_ion_fd_info ifd_data[MAX_ION_FD]; /* in */
};
struct compat_qseecom_qteec_req {
compat_uptr_t req_ptr;
compat_ulong_t req_len;
compat_uptr_t resp_ptr;
compat_ulong_t resp_len;
};
struct compat_qseecom_qteec_modfd_req {
compat_uptr_t req_ptr;
compat_ulong_t req_len;
compat_uptr_t resp_ptr;
compat_ulong_t resp_len;
struct compat_qseecom_ion_fd_info ifd_data[MAX_ION_FD];
};
struct compat_qseecom_ce_pipe_entry {
compat_int_t valid;
compat_uint_t ce_num;
compat_uint_t ce_pipe_pair;
};
struct compat_qseecom_ce_info_req {
unsigned char handle[MAX_CE_INFO_HANDLE_SIZE];
compat_uint_t usage;
compat_uint_t unit_num;
compat_uint_t num_ce_pipe_entries;
struct compat_qseecom_ce_pipe_entry
ce_pipe_entry[MAX_CE_PIPE_PAIR_PER_UNIT];
};
struct file;
extern long compat_qseecom_ioctl(struct file *file,
unsigned int cmd, unsigned long arg);
extern long qseecom_ioctl(struct file *file,
unsigned int cmd, unsigned long arg);
#define COMPAT_QSEECOM_IOCTL_REGISTER_LISTENER_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 1, struct compat_qseecom_register_listener_req)
#define COMPAT_QSEECOM_IOCTL_UNREGISTER_LISTENER_REQ \
_IO(QSEECOM_IOC_MAGIC, 2)
#define COMPAT_QSEECOM_IOCTL_SEND_CMD_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 3, struct compat_qseecom_send_cmd_req)
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 4, struct compat_qseecom_send_modfd_cmd_req)
#define COMPAT_QSEECOM_IOCTL_RECEIVE_REQ \
_IO(QSEECOM_IOC_MAGIC, 5)
#define COMPAT_QSEECOM_IOCTL_SEND_RESP_REQ \
_IO(QSEECOM_IOC_MAGIC, 6)
#define COMPAT_QSEECOM_IOCTL_LOAD_APP_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 7, struct compat_qseecom_load_img_req)
#define COMPAT_QSEECOM_IOCTL_SET_MEM_PARAM_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 8, struct compat_qseecom_set_sb_mem_param_req)
#define COMPAT_QSEECOM_IOCTL_UNLOAD_APP_REQ \
_IO(QSEECOM_IOC_MAGIC, 9)
#define COMPAT_QSEECOM_IOCTL_GET_QSEOS_VERSION_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 10, struct compat_qseecom_qseos_version_req)
#define COMPAT_QSEECOM_IOCTL_PERF_ENABLE_REQ \
_IO(QSEECOM_IOC_MAGIC, 11)
#define COMPAT_QSEECOM_IOCTL_PERF_DISABLE_REQ \
_IO(QSEECOM_IOC_MAGIC, 12)
#define COMPAT_QSEECOM_IOCTL_LOAD_EXTERNAL_ELF_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 13, struct compat_qseecom_load_img_req)
#define COMPAT_QSEECOM_IOCTL_UNLOAD_EXTERNAL_ELF_REQ \
_IO(QSEECOM_IOC_MAGIC, 14)
#define COMPAT_QSEECOM_IOCTL_APP_LOADED_QUERY_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 15, struct compat_qseecom_qseos_app_load_query)
#define COMPAT_QSEECOM_IOCTL_SEND_CMD_SERVICE_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 16, struct compat_qseecom_send_svc_cmd_req)
#define COMPAT_QSEECOM_IOCTL_CREATE_KEY_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 17, struct compat_qseecom_create_key_req)
#define COMPAT_QSEECOM_IOCTL_WIPE_KEY_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 18, struct compat_qseecom_wipe_key_req)
#define COMPAT_QSEECOM_IOCTL_SAVE_PARTITION_HASH_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 19, \
struct compat_qseecom_save_partition_hash_req)
#define COMPAT_QSEECOM_IOCTL_IS_ES_ACTIVATED_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 20, struct compat_qseecom_is_es_activated_req)
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP \
_IOWR(QSEECOM_IOC_MAGIC, 21, \
struct compat_qseecom_send_modfd_listener_resp)
#define COMPAT_QSEECOM_IOCTL_SET_BUS_SCALING_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 23, int)
#define COMPAT_QSEECOM_IOCTL_UPDATE_KEY_USER_INFO_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 24, \
struct compat_qseecom_update_key_userinfo_req)
#define COMPAT_QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 30, struct compat_qseecom_qteec_modfd_req)
#define COMPAT_QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 31, struct compat_qseecom_qteec_req)
#define COMPAT_QSEECOM_QTEEC_IOCTL_INVOKE_MODFD_CMD_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 32, struct compat_qseecom_qteec_modfd_req)
#define COMPAT_QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 33, struct compat_qseecom_qteec_modfd_req)
#define COMPAT_QSEECOM_IOCTL_MDTP_CIPHER_DIP_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 34, struct qseecom_mdtp_cipher_dip_req)
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_CMD_64_REQ \
_IOWR(QSEECOM_IOC_MAGIC, 35, struct compat_qseecom_send_modfd_cmd_req)
#define COMPAT_QSEECOM_IOCTL_SEND_MODFD_RESP_64 \
_IOWR(QSEECOM_IOC_MAGIC, 36, \
struct compat_qseecom_send_modfd_listener_resp)
#define COMPAT_QSEECOM_IOCTL_GET_CE_PIPE_INFO \
_IOWR(QSEECOM_IOC_MAGIC, 40, \
struct compat_qseecom_ce_info_req)
#define COMPAT_QSEECOM_IOCTL_FREE_CE_PIPE_INFO \
_IOWR(QSEECOM_IOC_MAGIC, 41, \
struct compat_qseecom_ce_info_req)
#define COMPAT_QSEECOM_IOCTL_QUERY_CE_PIPE_INFO \
_IOWR(QSEECOM_IOC_MAGIC, 42, \
struct compat_qseecom_ce_info_req)
#endif
#endif /* _UAPI_COMPAT_QSEECOM_H_ */

View file

@ -48,6 +48,7 @@
#include <linux/interconnect.h>
#include <linux/of_reserved_mem.h>
#include <linux/qtee_shmbridge.h>
#include "compat_qseecom.h"
#define QSEECOM_DEV "qseecom"
#define QSEOS_VERSION_14 0x14
@ -7495,7 +7496,7 @@ static void __qseecom_clean_data_sglistinfo(struct qseecom_dev_handle *data)
}
}
static long qseecom_ioctl(struct file *file,
long qseecom_ioctl(struct file *file,
unsigned int cmd, unsigned long arg)
{
int ret = 0;
@ -8331,6 +8332,7 @@ static int qseecom_release(struct inode *inode, struct file *file)
static const struct file_operations qseecom_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl = qseecom_ioctl,
.compat_ioctl = compat_qseecom_ioctl,
.open = qseecom_open,
.release = qseecom_release
};