|
@@ -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;
|
|
|
}
|