summaryrefslogtreecommitdiff
path: root/sound/soc/sof/ipc.c
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>2022-03-30 23:19:23 +0300
committerMark Brown <broonie@kernel.org>2022-04-04 10:39:08 +0300
commit5db8eb5b9e35c712cc63fcebf04c80ace9812961 (patch)
tree4916e637854a9f3d5872a1c7a5c086897daf91b2 /sound/soc/sof/ipc.c
parent249ee180874dd48a809caf70981b2aa800329d27 (diff)
downloadlinux-5db8eb5b9e35c712cc63fcebf04c80ace9812961.tar.xz
ASoC: SOF: ipc: Use msg->reply_data directly in snd_sof_ipc_get_reply()
Instead of using a local reply to first read out the header from the mailbox then memcpy it or read it again to msg->reply_data, read it directly to it's final place from the start. If we received an error we do not need to do a memcpy anymore. If the reply is reporting a success then we don not need to read the reply again from the mailbox if the reply_size equals to the already read header size. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Link: https://lore.kernel.org/r/20220330201926.1330402-9-ranjani.sridharan@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/sof/ipc.c')
-rw-r--r--sound/soc/sof/ipc.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c
index c722ca0b00a6..46c40dfd9f2b 100644
--- a/sound/soc/sof/ipc.c
+++ b/sound/soc/sof/ipc.c
@@ -393,7 +393,7 @@ EXPORT_SYMBOL(sof_ipc_tx_message_no_pm);
void snd_sof_ipc_get_reply(struct snd_sof_dev *sdev)
{
struct snd_sof_ipc_msg *msg = sdev->msg;
- struct sof_ipc_reply reply;
+ struct sof_ipc_reply *reply;
int ret = 0;
/*
@@ -407,13 +407,12 @@ void snd_sof_ipc_get_reply(struct snd_sof_dev *sdev)
}
/* get the generic reply */
- snd_sof_dsp_mailbox_read(sdev, sdev->host_box.offset, &reply,
- sizeof(reply));
+ reply = msg->reply_data;
+ snd_sof_dsp_mailbox_read(sdev, sdev->host_box.offset, reply, sizeof(*reply));
- if (reply.error < 0) {
- memcpy(msg->reply_data, &reply, sizeof(reply));
- ret = reply.error;
- } else if (!reply.hdr.size) {
+ if (reply->error < 0) {
+ ret = reply->error;
+ } else if (!reply->hdr.size) {
/* Reply should always be >= sizeof(struct sof_ipc_reply) */
if (msg->reply_size)
dev_err(sdev->dev,
@@ -424,24 +423,27 @@ void snd_sof_ipc_get_reply(struct snd_sof_dev *sdev)
ret = -EINVAL;
} else if (msg->reply_size > 0) {
- if (reply.hdr.size == msg->reply_size) {
+ if (reply->hdr.size == msg->reply_size) {
ret = 0;
- } else if (reply.hdr.size < msg->reply_size) {
+ } else if (reply->hdr.size < msg->reply_size) {
dev_dbg(sdev->dev,
"reply size (%u) is less than expected (%zu)\n",
- reply.hdr.size, msg->reply_size);
+ reply->hdr.size, msg->reply_size);
- msg->reply_size = reply.hdr.size;
+ msg->reply_size = reply->hdr.size;
ret = 0;
} else {
dev_err(sdev->dev,
"reply size (%u) exceeds the buffer size (%zu)\n",
- reply.hdr.size, msg->reply_size);
+ reply->hdr.size, msg->reply_size);
ret = -EINVAL;
}
- /* get the full message if reply.hdr.size <= msg->reply_size */
- if (!ret)
+ /*
+ * get the full message if reply->hdr.size <= msg->reply_size
+ * and the reply->hdr.size > sizeof(struct sof_ipc_reply)
+ */
+ if (!ret && msg->reply_size > sizeof(*reply))
snd_sof_dsp_mailbox_read(sdev, sdev->host_box.offset,
msg->reply_data, msg->reply_size);
}