154 lines
4.7 KiB
Diff
154 lines
4.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Pardha Saradhi K <pardha.saradhi.kesapragada@intel.com>
|
|
Date: Thu, 25 Feb 2016 12:06:18 +0530
|
|
Subject: [PATCH] ASoC: Intel: Skylake: DebugFs changes to suit FDK
|
|
|
|
Following changes have been made in the generic ipc
|
|
debugfs interface to better suit the FDK implementation
|
|
|
|
1. Return IO error on write operation if the ipc fails.
|
|
2. IPC read operations are exposed in binary format
|
|
|
|
Change-Id: If0254fdb91030c917e0c0501089214d0654d39c7
|
|
Signed-off-by: Pardha Saradhi K <pardha.saradhi.kesapragada@intel.com>
|
|
Signed-off-by: Sanyog Kale <sanyog.r.kale@intel.com>
|
|
Reviewed-on:
|
|
Reviewed-by: Babu, Ramesh <ramesh.babu@intel.com>
|
|
Tested-by: Babu, Ramesh <ramesh.babu@intel.com>
|
|
Reviewed-on:
|
|
Reviewed-by: audio_build
|
|
Reviewed-by: Avati, Santosh Kumar <santosh.kumar.avati@intel.com>
|
|
Tested-by: Avati, Santosh Kumar <santosh.kumar.avati@intel.com>
|
|
---
|
|
sound/soc/intel/skylake/skl-debug.c | 67 +++++++----------------------
|
|
1 file changed, 16 insertions(+), 51 deletions(-)
|
|
|
|
diff --git a/sound/soc/intel/skylake/skl-debug.c b/sound/soc/intel/skylake/skl-debug.c
|
|
index 39293c7a31ae..c1ae218a5009 100644
|
|
--- a/sound/soc/intel/skylake/skl-debug.c
|
|
+++ b/sound/soc/intel/skylake/skl-debug.c
|
|
@@ -151,37 +151,11 @@ static ssize_t mod_control_read(struct file *file,
|
|
char __user *user_buf, size_t count, loff_t *ppos)
|
|
{
|
|
struct skl_debug *d = file->private_data;
|
|
- char *state;
|
|
- char *buf1;
|
|
- int ret;
|
|
- unsigned int ofs = 0;
|
|
-
|
|
- if (d->ipc_data[0] == 0) {
|
|
- state = d->skl->mod_set_get_status ? "Fail\n" : "success\n";
|
|
- return simple_read_from_buffer(user_buf, count, ppos,
|
|
- state, strlen(state));
|
|
- }
|
|
-
|
|
- state = d->skl->mod_set_get_status ? "Fail\n" : "success\n";
|
|
- buf1 = kzalloc(MOD_BUF1, GFP_KERNEL);
|
|
- if (!buf1)
|
|
- return -ENOMEM;
|
|
-
|
|
- ret = snprintf(buf1, MOD_BUF1,
|
|
- "%s\nLARGE PARAM DATA\n", state);
|
|
-
|
|
- for (ofs = 0 ; ofs < d->ipc_data[0] ; ofs += 16) {
|
|
- ret += snprintf(buf1 + ret, MOD_BUF1 - ret, "0x%.4x : ", ofs);
|
|
- hex_dump_to_buffer(&(d->ipc_data[1]) + ofs, 16, 16, 4,
|
|
- buf1 + ret, MOD_BUF1 - ret, 0);
|
|
- ret += strlen(buf1 + ret);
|
|
- if (MOD_BUF1 - ret > 0)
|
|
- buf1[ret++] = '\n';
|
|
- }
|
|
+ const u32 param_data_size = d->ipc_data[0];
|
|
+ const u32 *param_data = &d->ipc_data[1];
|
|
|
|
- ret = simple_read_from_buffer(user_buf, count, ppos, buf1, ret);
|
|
- kfree(buf1);
|
|
- return ret;
|
|
+ return simple_read_from_buffer(user_buf, count, ppos,
|
|
+ param_data, param_data_size);
|
|
|
|
}
|
|
|
|
@@ -194,14 +168,14 @@ static ssize_t mod_control_write(struct file *file,
|
|
int retval, type;
|
|
ssize_t written;
|
|
u32 size, mbsz;
|
|
- u32 *large_data;
|
|
- int large_param_size;
|
|
|
|
struct skl_sst *ctx = d->skl->skl_sst;
|
|
struct skl_ipc_large_config_msg msg;
|
|
struct skl_ipc_header header = {0};
|
|
u64 *ipc_header = (u64 *)(&header);
|
|
|
|
+ d->ipc_data[0] = 0;
|
|
+
|
|
buf = kzalloc(MOD_BUF, GFP_KERNEL);
|
|
written = simple_write_to_buffer(buf, MOD_BUF, ppos,
|
|
user_buf, count);
|
|
@@ -225,28 +199,22 @@ static ssize_t mod_control_write(struct file *file,
|
|
msg.instance_id = ((header.primary) & 0x00ff0000)>>16;
|
|
msg.large_param_id = ((header.extension) & 0x0ff00000)>>20;
|
|
msg.param_data_size = (header.extension) & 0x000fffff;
|
|
- large_param_size = msg.param_data_size;
|
|
-
|
|
- large_data = kzalloc(large_param_size, GFP_KERNEL);
|
|
- if (!large_data)
|
|
- return -ENOMEM;
|
|
|
|
if (mbsz)
|
|
retval = skl_ipc_get_large_config(&ctx->ipc, &msg,
|
|
- large_data, &(mod_set_get->mailbx[0]),
|
|
- mbsz, NULL);
|
|
+ &d->ipc_data[1],
|
|
+ &mod_set_get->mailbx[0],
|
|
+ mbsz, NULL);
|
|
else
|
|
retval = skl_ipc_get_large_config(&ctx->ipc,
|
|
- &msg, large_data, NULL,
|
|
- 0, NULL);
|
|
-
|
|
- d->ipc_data[0] = msg.param_data_size;
|
|
- memcpy(&d->ipc_data[1], large_data, msg.param_data_size);
|
|
- kfree(large_data);
|
|
+ &msg,
|
|
+ &d->ipc_data[1],
|
|
+ NULL, 0, NULL);
|
|
+ if (retval == 0)
|
|
+ d->ipc_data[0] = msg.param_data_size;
|
|
break;
|
|
|
|
case IPC_MOD_LARGE_CONFIG_SET:
|
|
- d->ipc_data[0] = 0;
|
|
msg.module_id = (header.primary) & 0x0000ffff;
|
|
msg.instance_id = ((header.primary) & 0x00ff0000)>>16;
|
|
msg.large_param_id = ((header.extension) & 0x0ff00000)>>20;
|
|
@@ -254,7 +222,6 @@ static ssize_t mod_control_write(struct file *file,
|
|
|
|
retval = skl_ipc_set_large_config(&ctx->ipc, &msg,
|
|
(u32 *)(&mod_set_get->mailbx));
|
|
- d->ipc_data[0] = 0;
|
|
break;
|
|
|
|
default:
|
|
@@ -266,14 +233,12 @@ static ssize_t mod_control_write(struct file *file,
|
|
retval = sst_ipc_tx_message_wait(&ctx->ipc, *ipc_header,
|
|
NULL, 0, NULL, NULL);
|
|
|
|
- d->ipc_data[0] = 0;
|
|
break;
|
|
|
|
}
|
|
+
|
|
if (retval)
|
|
- d->skl->mod_set_get_status = 1;
|
|
- else
|
|
- d->skl->mod_set_get_status = 0;
|
|
+ return -EIO;
|
|
|
|
/* Userspace has been fiddling around behind the kernel's back */
|
|
add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
|
|
--
|
|
https://clearlinux.org
|
|
|