From: Ekansh Gupta <[email protected]>

Wire FASTRPC_IOCTL_GET_DSP_INFO into the legacy FastRPC compatibility
shim on top of qda_fastrpc_get_dsp_info(), so existing user space can
query DSP capabilities through the /dev/fastrpc-* interface exactly
as it could with the driver this one replaces.

The device-wide capability cache introduced for the native
DRM_IOCTL_QDA_QUERY path is reused as-is; the shim only has to
translate between the legacy fastrpc_ioctl_capability layout and the
shared qda_fastrpc_get_dsp_info() call.

Signed-off-by: Ekansh Gupta <[email protected]>
---
 drivers/accel/qda/qda_fastrpc_shim.c | 20 ++++++++++++++++++++
 drivers/accel/qda/qda_legacy_ops.c   |  6 ++++++
 drivers/accel/qda/qda_legacy_ops.h   |  2 ++
 3 files changed, 28 insertions(+)

diff --git a/drivers/accel/qda/qda_fastrpc_shim.c 
b/drivers/accel/qda/qda_fastrpc_shim.c
index c1464b1adbc2..2be1dd116ef7 100644
--- a/drivers/accel/qda/qda_fastrpc_shim.c
+++ b/drivers/accel/qda/qda_fastrpc_shim.c
@@ -463,6 +463,24 @@ static long qda_shim_mem_unmap(struct qda_shim_file *sf, 
void __user *argp)
        return 0;
 }
 
+static long qda_shim_get_dsp_info(struct qda_shim_file *sf, void __user *argp)
+{
+       struct fastrpc_ioctl_capability args;
+       int err;
+
+       if (copy_from_user(&args, argp, sizeof(args)))
+               return -EFAULT;
+
+       err = qda_legacy_ops_table.get_dsp_info(sf->session, args.attribute_id, 
&args.capability);
+       if (err)
+               return err;
+
+       if (copy_to_user(argp, &args, sizeof(args)))
+               return -EFAULT;
+
+       return 0;
+}
+
 static long qda_shim_invoke(struct qda_shim_file *sf, void __user *argp)
 {
        struct qda_legacy_invoke_arg *largs;
@@ -550,6 +568,8 @@ static long qda_shim_dispatch(struct qda_shim_file *sf, 
unsigned int cmd, void _
                return qda_shim_mem_unmap(sf, argp);
        case FASTRPC_IOCTL_INVOKE:
                return qda_shim_invoke(sf, argp);
+       case FASTRPC_IOCTL_GET_DSP_INFO:
+               return qda_shim_get_dsp_info(sf, argp);
        default:
                /*
                 * Includes FASTRPC_IOCTL_FREE_DMA_BUFF, which the driver this
diff --git a/drivers/accel/qda/qda_legacy_ops.c 
b/drivers/accel/qda/qda_legacy_ops.c
index fc5e94c0c9bc..8d9d597c76c2 100644
--- a/drivers/accel/qda/qda_legacy_ops.c
+++ b/drivers/accel/qda/qda_legacy_ops.c
@@ -188,6 +188,11 @@ static int legacy_invoke(struct qda_session *session, u32 
handle, u32 sc,
        return qda_fastrpc_invoke_legacy(session->qda_dev, session, handle, sc, 
args);
 }
 
+static int legacy_get_dsp_info(struct qda_session *session, u32 attribute_id, 
u32 *capability)
+{
+       return qda_get_dsp_capability(session->qda_dev, session, attribute_id, 
capability);
+}
+
 const struct qda_legacy_ops qda_legacy_ops_table = {
        .session_create = legacy_session_create,
        .session_destroy = legacy_session_destroy,
@@ -201,5 +206,6 @@ const struct qda_legacy_ops qda_legacy_ops_table = {
        .alloc_dmabuf = legacy_alloc_dmabuf,
        .import_dmabuf = legacy_import_dmabuf,
        .invoke = legacy_invoke,
+       .get_dsp_info = legacy_get_dsp_info,
 };
 EXPORT_SYMBOL_FOR_MODULES(qda_legacy_ops_table, "qda_fastrpc_shim");
diff --git a/drivers/accel/qda/qda_legacy_ops.h 
b/drivers/accel/qda/qda_legacy_ops.h
index 95a169edc594..c79003021fc1 100644
--- a/drivers/accel/qda/qda_legacy_ops.h
+++ b/drivers/accel/qda/qda_legacy_ops.h
@@ -57,6 +57,8 @@ struct qda_legacy_ops {
        /** @invoke: Run a method on the DSP; takes ownership of each 
@args[i].obj */
        int (*invoke)(struct qda_session *session, u32 handle, u32 sc,
                      struct qda_legacy_invoke_arg *args);
+       /** @get_dsp_info: Query a DSP capability attribute */
+       int (*get_dsp_info)(struct qda_session *session, u32 attribute_id, u32 
*capability);
 };
 
 extern const struct qda_legacy_ops qda_legacy_ops_table;

-- 
2.34.1

Reply via email to