clear-pkgs-linux-iot-lts2018/0256-ASoC-Intel-Skylake-fix...

109 lines
4.2 KiB
Diff
Raw Permalink Normal View History

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mousumi Jana <mousumix.jana@intel.com>
Date: Sun, 8 Nov 2015 19:12:28 +0530
Subject: [PATCH] ASoC: Intel: Skylake:fix for large get config api
This patch adds support for get large config API
when need to send the tx parameter to retrieve one or
more configuration parameters from specified module instance.
Change-Id: I3db4398e52e63176cb25ec37ff06db2b8f73f72b
Signed-off-by: Mousumi Jana <mousumix.jana@intel.com>
Reviewed-on:
Reviewed-by: Babu, Ramesh <ramesh.babu@intel.com>
Tested-by: Babu, Ramesh <ramesh.babu@intel.com>
---
sound/soc/intel/skylake/skl-messages.c | 2 +-
sound/soc/intel/skylake/skl-sst-ipc.c | 26 ++++++++++++++++++--------
sound/soc/intel/skylake/skl-sst-ipc.h | 3 ++-
3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
2020-10-27 02:14:06 +08:00
index fa8ef710900c..13d1898da7fb 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -1538,5 +1538,5 @@ int skl_get_module_params(struct skl_sst *ctx, u32 *params, int size,
msg.param_data_size = size;
msg.large_param_id = param_id;
- return skl_ipc_get_large_config(&ctx->ipc, &msg, params);
+ return skl_ipc_get_large_config(&ctx->ipc, &msg, params, NULL, 0);
}
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.c b/sound/soc/intel/skylake/skl-sst-ipc.c
2020-10-27 02:14:06 +08:00
index b83a3076a1e3..7b6ce92c9d0e 100644
--- a/sound/soc/intel/skylake/skl-sst-ipc.c
+++ b/sound/soc/intel/skylake/skl-sst-ipc.c
@@ -1002,12 +1002,13 @@ int skl_ipc_set_large_config(struct sst_generic_ipc *ipc,
EXPORT_SYMBOL_GPL(skl_ipc_set_large_config);
int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
- struct skl_ipc_large_config_msg *msg, u32 *param)
+ struct skl_ipc_large_config_msg *msg, u32 *param,
+ u32 *txparam, u32 size)
{
struct skl_ipc_header header = {0};
u64 *ipc_header = (u64 *)(&header);
int ret = 0;
- size_t sz_remaining, rx_size, data_offset;
+ size_t sz_remaining, rx_size, data_offset, inbox_sz;
header.primary = IPC_MSG_TARGET(IPC_MOD_MSG);
header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
@@ -1022,16 +1023,25 @@ int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
sz_remaining = msg->param_data_size;
data_offset = 0;
+ inbox_sz = ipc->dsp->mailbox.in_size;
+
+ if (msg->param_data_size >= inbox_sz)
+ header.extension |= IPC_FINAL_BLOCK(0);
while (sz_remaining != 0) {
- rx_size = sz_remaining > SKL_ADSP_W1_SZ
- ? SKL_ADSP_W1_SZ : sz_remaining;
+ rx_size = sz_remaining > inbox_sz
+ ? inbox_sz : sz_remaining;
if (rx_size == sz_remaining)
header.extension |= IPC_FINAL_BLOCK(1);
- ret = sst_ipc_tx_message_wait(ipc, *ipc_header, NULL, 0,
- ((char *)param) + data_offset,
- msg->param_data_size);
+ dev_dbg(ipc->dev, "In %s primary=%#x ext=%#x\n", __func__,
+ header.primary, header.extension);
+ dev_dbg(ipc->dev, "receiving offset: %#x, size: %#x\n",
+ (unsigned)data_offset, (unsigned)rx_size);
+
+ ret = sst_ipc_tx_message_wait(ipc, *ipc_header,
+ ((char *)txparam), size, ((char *)param) + data_offset,
+ rx_size);
if (ret < 0) {
dev_err(ipc->dev,
"ipc: get large config fail, err: %d\n", ret);
@@ -1044,7 +1054,7 @@ int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
header.extension &= IPC_INITIAL_BLOCK_CLEAR;
header.extension &= IPC_DATA_OFFSET_SZ_CLEAR;
/* fill the fields */
- header.extension |= IPC_INITIAL_BLOCK(1);
+ header.extension |= IPC_INITIAL_BLOCK(0);
header.extension |= IPC_DATA_OFFSET_SZ(data_offset);
}
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.h b/sound/soc/intel/skylake/skl-sst-ipc.h
2020-10-27 02:14:06 +08:00
index 0437e4cf1261..e969ac964daa 100644
--- a/sound/soc/intel/skylake/skl-sst-ipc.h
+++ b/sound/soc/intel/skylake/skl-sst-ipc.h
@@ -244,7 +244,8 @@ int skl_ipc_set_large_config(struct sst_generic_ipc *ipc,
struct skl_ipc_large_config_msg *msg, u32 *param);
int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
- struct skl_ipc_large_config_msg *msg, u32 *param);
+ struct skl_ipc_large_config_msg *msg, u32 *param,
+ u32 *txparam, u32 size);
int skl_sst_ipc_load_library(struct sst_generic_ipc *ipc,
u8 dma_id, u8 table_id, bool wait);
--
https://clearlinux.org