Re: [alsa-devel] [PATCH v3 12/25] ASoC: qcom: qdsp6: Add support to Q6CORE

2018-02-19 Thread Rohit Kumar



On 2/13/2018 10:28 PM, srinivas.kandaga...@linaro.org wrote:

From: Srinivas Kandagatla 

This patch adds support to core apr service, which is used to query
status of other static and dynamic services on the dsp.

Signed-off-by: Srinivas Kandagatla 
---
  sound/soc/qcom/Kconfig|   5 +
  sound/soc/qcom/qdsp6/Makefile |   1 +
  sound/soc/qcom/qdsp6/q6core.c | 235 ++
  sound/soc/qcom/qdsp6/q6core.h |   9 ++
  4 files changed, 250 insertions(+)
  create mode 100644 sound/soc/qcom/qdsp6/q6core.c
  create mode 100644 sound/soc/qcom/qdsp6/q6core.h

diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
index a14d960b8fe4..8c2d65e0a28e 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -60,6 +60,10 @@ config SND_SOC_QDSP6_ASM
tristate
default n
  
+config SND_SOC_QDSP6_CORE

+   tristate
+   default n
+
  config SND_SOC_QDSP6
tristate "SoC ALSA audio driver for QDSP6"
depends on QCOM_APR && HAS_DMA
@@ -67,6 +71,7 @@ config SND_SOC_QDSP6
select SND_SOC_QDSP6_AFE
select SND_SOC_QDSP6_ADM
select SND_SOC_QDSP6_ASM
+   select SND_SOC_QDSP6_CORE
help
 To add support for MSM QDSP6 Soc Audio.
 This will enable sound soc platform specific
diff --git a/sound/soc/qcom/qdsp6/Makefile b/sound/soc/qcom/qdsp6/Makefile
index eea962315ab3..61f089bc0d25 100644
--- a/sound/soc/qcom/qdsp6/Makefile
+++ b/sound/soc/qcom/qdsp6/Makefile
@@ -2,3 +2,4 @@ obj-$(CONFIG_SND_SOC_QDSP6_COMMON) += q6dsp-common.o
  obj-$(CONFIG_SND_SOC_QDSP6_AFE) += q6afe.o
  obj-$(CONFIG_SND_SOC_QDSP6_ADM) += q6adm.o
  obj-$(CONFIG_SND_SOC_QDSP6_ASM) += q6asm.o
+obj-$(CONFIG_SND_SOC_QDSP6_CORE) += q6core.o
diff --git a/sound/soc/qcom/qdsp6/q6core.c b/sound/soc/qcom/qdsp6/q6core.c
new file mode 100644
index ..d4a3ff409a34
--- /dev/null
+++ b/sound/soc/qcom/qdsp6/q6core.c
@@ -0,0 +1,235 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2011-2017, The Linux Foundation
+ * Copyright (c) 2018, Linaro Limited
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "q6dsp-errno.h"
+
+#define ADSP_STATE_READY_TIMEOUT_MS3000
+#define Q6_READY_TIMEOUT_MS 100
+#define AVCS_CMD_ADSP_EVENT_GET_STATE  0x0001290C
+#define AVCS_CMDRSP_ADSP_EVENT_GET_STATE   0x0001290D
+#define AVCS_GET_VERSIONS   0x00012905
+#define AVCS_GET_VERSIONS_RSP   0x00012906
+
+struct avcs_svc_info {
+   uint32_t service_id;
+   uint32_t version;
+} __packed;
+
+struct q6core {
+   struct apr_device *adev;
+   wait_queue_head_t wait;
+   uint32_t avcs_state;
+   bool resp_received;
+   uint32_t num_services;
+   struct avcs_svc_info *svcs_info;
+};
+
+struct q6core *core;
+
+static int q6core_callback(struct apr_device *adev,
+struct apr_client_message *data)
+{
+   struct q6core *core = dev_get_drvdata(>dev);
+   struct aprv2_ibasic_rsp_result_t *result;
+
+   result = data->payload;
+   switch (data->opcode) {
+   case AVCS_GET_VERSIONS_RSP:
+   core->num_services = result->status;
+
+   core->svcs_info = kcalloc(core->num_services,
+ sizeof(*core->svcs_info),
+ GFP_ATOMIC);
+   if (!core->svcs_info)
+   return -ENOMEM;
+
+   /* svc info is after apr result */
+   memcpy(core->svcs_info, result + sizeof(*result),
+  core->num_services * sizeof(*core->svcs_info));
+
+   core->resp_received = true;
+   wake_up(>wait);
+
+   break;
+   case AVCS_CMDRSP_ADSP_EVENT_GET_STATE:
+   core->avcs_state = result->opcode;
+
+   core->resp_received = true;
+   wake_up(>wait);
+   break;
+   default:
+   dev_err(>dev, "Message id from adsp core svc: 0x%x\n",
+   data->opcode);
+   break;
+   }
+
+   return 0;
+}
+
+static int q6core_get_svc_versions(struct q6core *core)
+{
+   struct apr_device *adev = core->adev;
+   struct apr_hdr hdr = {0};
+   int rc;
+
+   hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
+ APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
+   hdr.pkt_size = APR_HDR_SIZE;
+   hdr.opcode = AVCS_GET_VERSIONS;
+
+   rc = apr_send_pkt(adev, );
+   if (rc < 0)
+   return rc;
+
+   rc = wait_event_timeout(core->wait, (core->resp_received),
+   msecs_to_jiffies(Q6_READY_TIMEOUT_MS));
+   if (rc > 0 && core->resp_received) {
+   core->resp_received = false;
+   return 0;
+   }
+
+   return rc;
+}
+
+static bool __q6core_is_adsp_ready(struct 

Re: [alsa-devel] [PATCH v3 12/25] ASoC: qcom: qdsp6: Add support to Q6CORE

2018-02-19 Thread Rohit Kumar



On 2/13/2018 10:28 PM, srinivas.kandaga...@linaro.org wrote:

From: Srinivas Kandagatla 

This patch adds support to core apr service, which is used to query
status of other static and dynamic services on the dsp.

Signed-off-by: Srinivas Kandagatla 
---
  sound/soc/qcom/Kconfig|   5 +
  sound/soc/qcom/qdsp6/Makefile |   1 +
  sound/soc/qcom/qdsp6/q6core.c | 235 ++
  sound/soc/qcom/qdsp6/q6core.h |   9 ++
  4 files changed, 250 insertions(+)
  create mode 100644 sound/soc/qcom/qdsp6/q6core.c
  create mode 100644 sound/soc/qcom/qdsp6/q6core.h

diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
index a14d960b8fe4..8c2d65e0a28e 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -60,6 +60,10 @@ config SND_SOC_QDSP6_ASM
tristate
default n
  
+config SND_SOC_QDSP6_CORE

+   tristate
+   default n
+
  config SND_SOC_QDSP6
tristate "SoC ALSA audio driver for QDSP6"
depends on QCOM_APR && HAS_DMA
@@ -67,6 +71,7 @@ config SND_SOC_QDSP6
select SND_SOC_QDSP6_AFE
select SND_SOC_QDSP6_ADM
select SND_SOC_QDSP6_ASM
+   select SND_SOC_QDSP6_CORE
help
 To add support for MSM QDSP6 Soc Audio.
 This will enable sound soc platform specific
diff --git a/sound/soc/qcom/qdsp6/Makefile b/sound/soc/qcom/qdsp6/Makefile
index eea962315ab3..61f089bc0d25 100644
--- a/sound/soc/qcom/qdsp6/Makefile
+++ b/sound/soc/qcom/qdsp6/Makefile
@@ -2,3 +2,4 @@ obj-$(CONFIG_SND_SOC_QDSP6_COMMON) += q6dsp-common.o
  obj-$(CONFIG_SND_SOC_QDSP6_AFE) += q6afe.o
  obj-$(CONFIG_SND_SOC_QDSP6_ADM) += q6adm.o
  obj-$(CONFIG_SND_SOC_QDSP6_ASM) += q6asm.o
+obj-$(CONFIG_SND_SOC_QDSP6_CORE) += q6core.o
diff --git a/sound/soc/qcom/qdsp6/q6core.c b/sound/soc/qcom/qdsp6/q6core.c
new file mode 100644
index ..d4a3ff409a34
--- /dev/null
+++ b/sound/soc/qcom/qdsp6/q6core.c
@@ -0,0 +1,235 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2011-2017, The Linux Foundation
+ * Copyright (c) 2018, Linaro Limited
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "q6dsp-errno.h"
+
+#define ADSP_STATE_READY_TIMEOUT_MS3000
+#define Q6_READY_TIMEOUT_MS 100
+#define AVCS_CMD_ADSP_EVENT_GET_STATE  0x0001290C
+#define AVCS_CMDRSP_ADSP_EVENT_GET_STATE   0x0001290D
+#define AVCS_GET_VERSIONS   0x00012905
+#define AVCS_GET_VERSIONS_RSP   0x00012906
+
+struct avcs_svc_info {
+   uint32_t service_id;
+   uint32_t version;
+} __packed;
+
+struct q6core {
+   struct apr_device *adev;
+   wait_queue_head_t wait;
+   uint32_t avcs_state;
+   bool resp_received;
+   uint32_t num_services;
+   struct avcs_svc_info *svcs_info;
+};
+
+struct q6core *core;
+
+static int q6core_callback(struct apr_device *adev,
+struct apr_client_message *data)
+{
+   struct q6core *core = dev_get_drvdata(>dev);
+   struct aprv2_ibasic_rsp_result_t *result;
+
+   result = data->payload;
+   switch (data->opcode) {
+   case AVCS_GET_VERSIONS_RSP:
+   core->num_services = result->status;
+
+   core->svcs_info = kcalloc(core->num_services,
+ sizeof(*core->svcs_info),
+ GFP_ATOMIC);
+   if (!core->svcs_info)
+   return -ENOMEM;
+
+   /* svc info is after apr result */
+   memcpy(core->svcs_info, result + sizeof(*result),
+  core->num_services * sizeof(*core->svcs_info));
+
+   core->resp_received = true;
+   wake_up(>wait);
+
+   break;
+   case AVCS_CMDRSP_ADSP_EVENT_GET_STATE:
+   core->avcs_state = result->opcode;
+
+   core->resp_received = true;
+   wake_up(>wait);
+   break;
+   default:
+   dev_err(>dev, "Message id from adsp core svc: 0x%x\n",
+   data->opcode);
+   break;
+   }
+
+   return 0;
+}
+
+static int q6core_get_svc_versions(struct q6core *core)
+{
+   struct apr_device *adev = core->adev;
+   struct apr_hdr hdr = {0};
+   int rc;
+
+   hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
+ APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
+   hdr.pkt_size = APR_HDR_SIZE;
+   hdr.opcode = AVCS_GET_VERSIONS;
+
+   rc = apr_send_pkt(adev, );
+   if (rc < 0)
+   return rc;
+
+   rc = wait_event_timeout(core->wait, (core->resp_received),
+   msecs_to_jiffies(Q6_READY_TIMEOUT_MS));
+   if (rc > 0 && core->resp_received) {
+   core->resp_received = false;
+   return 0;
+   }
+
+   return rc;
+}
+
+static bool __q6core_is_adsp_ready(struct q6core *core)
+{
+   struct apr_device *adev = core->adev;
+