From 2784a80c97c73cfa1ca80543d7e4dd096637e1af Mon Sep 17 00:00:00 2001 From: Vinod Koul Date: Tue, 3 May 2011 17:32:49 +0100 Subject: [PATCH] intel_sst: parameter tuning ioctl This patch adds new IOCTL for application interface. Using parameter tuning IOCTL, application can fine tune the audio firmware for it's requirement. Signed-off-by: Vinod Koul Signed-off-by: Ramesh Babu K V Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman --- .../staging/intel_sst/intel_sst_app_interface.c | 37 ++++++++++++++++++++++ drivers/staging/intel_sst/intel_sst_common.h | 4 +-- drivers/staging/intel_sst/intel_sst_fw_ipc.h | 1 + drivers/staging/intel_sst/intel_sst_ioctl.h | 8 +++++ drivers/staging/intel_sst/intel_sst_ipc.c | 18 +++++++++++ 5 files changed, 66 insertions(+), 2 deletions(-) diff --git a/drivers/staging/intel_sst/intel_sst_app_interface.c b/drivers/staging/intel_sst/intel_sst_app_interface.c index d7454e2..b8c7ddb 100644 --- a/drivers/staging/intel_sst/intel_sst_app_interface.c +++ b/drivers/staging/intel_sst/intel_sst_app_interface.c @@ -961,6 +961,34 @@ free_mem: return retval; } + +int sst_ioctl_tuning_params(unsigned long arg) +{ + struct snd_sst_tuning_params params; + struct ipc_post *msg; + + if (copy_from_user(¶ms, (void __user *)arg, sizeof(params))) + return -EFAULT; + if (params.size > SST_MAILBOX_SIZE) + return -ENOMEM; + pr_debug("Parameter %d, Stream %d, Size %d\n", params.type, + params.str_id, params.size); + if (sst_create_large_msg(&msg)) + return -ENOMEM; + + sst_fill_header(&msg->header, IPC_IA_TUNING_PARAMS, 1, params.str_id); + msg->header.part.data = sizeof(u32) + sizeof(params) + params.size; + memcpy(msg->mailbox_data, &msg->header.full, sizeof(u32)); + memcpy(msg->mailbox_data + sizeof(u32), ¶ms, sizeof(params)); + if (copy_from_user(msg->mailbox_data + sizeof(params), + (void __user *)(unsigned long)params.addr, + params.size)) { + kfree(msg->mailbox_data); + kfree(msg); + return -EFAULT; + } + return sst_send_algo_ipc(&msg); +} /** * intel_sst_ioctl - receives the device ioctl's * @file_ptr:pointer to file @@ -1412,6 +1440,15 @@ free_iobufs: } retval = intel_sst_ioctl_dsp(cmd, arg); break; + + case _IOC_NR(SNDRV_SST_TUNING_PARAMS): + if (minor != AM_MODULE) { + retval = -EBADRQC; + break; + } + retval = sst_ioctl_tuning_params(arg); + break; + default: retval = -EINVAL; } diff --git a/drivers/staging/intel_sst/intel_sst_common.h b/drivers/staging/intel_sst/intel_sst_common.h index 9aff1a3..e37b377 100644 --- a/drivers/staging/intel_sst/intel_sst_common.h +++ b/drivers/staging/intel_sst/intel_sst_common.h @@ -28,8 +28,8 @@ * Common private declarations for SST */ -#define SST_DRIVER_VERSION "1.2.14" -#define SST_VERSION_NUM 0x1214 +#define SST_DRIVER_VERSION "1.2.15" +#define SST_VERSION_NUM 0x1215 /* driver names */ #define SST_DRV_NAME "intel_sst_driver" diff --git a/drivers/staging/intel_sst/intel_sst_fw_ipc.h b/drivers/staging/intel_sst/intel_sst_fw_ipc.h index 8628a8a..5d0cc56 100644 --- a/drivers/staging/intel_sst/intel_sst_fw_ipc.h +++ b/drivers/staging/intel_sst/intel_sst_fw_ipc.h @@ -71,6 +71,7 @@ #define IPC_IA_DECODE_FRAMES 0x18 #define IPC_IA_ALG_PARAMS 0x1A +#define IPC_IA_TUNING_PARAMS 0x1B /* I2L Stream config/control msgs */ #define IPC_IA_ALLOC_STREAM 0x20 /* Allocate a stream ID */ diff --git a/drivers/staging/intel_sst/intel_sst_ioctl.h b/drivers/staging/intel_sst/intel_sst_ioctl.h index bebc395..5da5ee0 100644 --- a/drivers/staging/intel_sst/intel_sst_ioctl.h +++ b/drivers/staging/intel_sst/intel_sst_ioctl.h @@ -400,6 +400,13 @@ struct snd_sst_dbufs { struct snd_sst_buffs *obufs; }; +struct snd_sst_tuning_params { + __u8 type; + __u8 str_id; + __u8 size; + __u8 rsvd; + __aligned_u64 addr; +} __attribute__ ((packed)); /*IOCTL defined here */ /*SST MMF IOCTLS only */ #define SNDRV_SST_STREAM_SET_PARAMS _IOR('L', 0x00, \ @@ -428,5 +435,6 @@ struct snd_sst_dbufs { /*DSP Ioctls on /dev/intel_sst_ctrl only*/ #define SNDRV_SST_SET_ALGO _IOW('L', 0x30, struct snd_ppp_params *) #define SNDRV_SST_GET_ALGO _IOWR('L', 0x31, struct snd_ppp_params *) +#define SNDRV_SST_TUNING_PARAMS _IOW('L', 0x32, struct snd_sst_tuning_params *) #endif /* __INTEL_SST_IOCTL_H__ */ diff --git a/drivers/staging/intel_sst/intel_sst_ipc.c b/drivers/staging/intel_sst/intel_sst_ipc.c index 878b19d..5c3444f 100644 --- a/drivers/staging/intel_sst/intel_sst_ipc.c +++ b/drivers/staging/intel_sst/intel_sst_ipc.c @@ -416,6 +416,24 @@ void sst_process_reply(struct work_struct *work) } break; } + + case IPC_IA_TUNING_PARAMS: { + pr_debug("sst:IPC_TUNING_PARAMS resp: %x\n", msg->header.full); + pr_debug("data value %x\n", msg->header.part.data); + if (msg->header.part.large) { + pr_debug("alg set failed\n"); + sst_drv_ctx->ppp_params_blk.ret_code = + -msg->header.part.data; + } else { + pr_debug("alg set success\n"); + sst_drv_ctx->ppp_params_blk.ret_code = 0; + } + if (sst_drv_ctx->ppp_params_blk.on == true) { + sst_drv_ctx->ppp_params_blk.condition = true; + wake_up(&sst_drv_ctx->wait_queue); + } + } + case IPC_IA_GET_FW_INFO: { struct snd_sst_fw_info *fw_info = (struct snd_sst_fw_info *)msg->mailbox; -- 2.7.4