[PATCH v5 15/23] ASoC: qdsp6: q6core: Add q6core driver

2018-04-18 Thread srinivas . kandagatla
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 
Reviewed-and-tested-by: Rohit kumar 
---
 sound/soc/qcom/Kconfig|   4 +
 sound/soc/qcom/qdsp6/Makefile |   1 +
 sound/soc/qcom/qdsp6/q6core.c | 380 ++
 sound/soc/qcom/qdsp6/q6core.h |  15 ++
 4 files changed, 400 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 a07181290624..488ee93ee084 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -56,6 +56,9 @@ config SND_SOC_QDSP6_ADM
 config SND_SOC_QDSP6_ASM
tristate
 
+config SND_SOC_QDSP6_CORE
+   tristate
+
 config SND_SOC_QDSP6
tristate "SoC ALSA audio driver for QDSP6"
depends on QCOM_APR && HAS_DMA
@@ -63,6 +66,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 ..244ec153ab71
--- /dev/null
+++ b/sound/soc/qcom/qdsp6/q6core.c
@@ -0,0 +1,380 @@
+// 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 
+#include "q6core.h"
+#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
+#define AVCS_CMD_GET_FWK_VERSION   0x001292c
+#define AVCS_CMDRSP_GET_FWK_VERSION0x001292d
+
+struct avcs_svc_info {
+   uint32_t service_id;
+   uint32_t version;
+} __packed;
+
+struct avcs_cmdrsp_get_version {
+   uint32_t build_id;
+   uint32_t num_services;
+   struct avcs_svc_info svc_api_info[];
+} __packed;
+
+/* for ADSP2.8 and above */
+struct avcs_svc_api_info {
+   uint32_t service_id;
+   uint32_t api_version;
+   uint32_t api_branch_version;
+} __packed;
+
+struct avcs_cmdrsp_get_fwk_version {
+   uint32_t build_major_version;
+   uint32_t build_minor_version;
+   uint32_t build_branch_version;
+   uint32_t build_subbranch_version;
+   uint32_t num_services;
+   struct avcs_svc_api_info svc_api_info[];
+} __packed;
+
+struct q6core {
+   struct apr_device *adev;
+   wait_queue_head_t wait;
+   uint32_t avcs_state;
+   struct mutex lock;
+   bool resp_received;
+   uint32_t num_services;
+   struct avcs_cmdrsp_get_fwk_version *fwk_version;
+   struct avcs_cmdrsp_get_version *svc_version;
+   bool fwk_version_supported;
+   bool get_state_supported;
+   bool get_version_supported;
+   bool is_version_requested;
+};
+
+static struct q6core *g_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 APR_BASIC_RSP_RESULT:{
+   result = data->payload;
+   switch (result->opcode) {
+   case AVCS_GET_VERSIONS:
+   if (result->status == ADSP_EUNSUPPORTED)
+   core->get_version_supported = false;
+   core->resp_received = true;
+   break;
+   case AVCS_CMD_GET_FWK_VERSION:
+   if (result->status == ADSP_EUNSUPPORTED)
+   core->fwk_version_supported = false;
+   core->resp_received = true;
+   break;
+   case AVCS_CMD_ADSP_EVENT_GET_STATE:
+   if (result->status == ADSP_EUNSUPPORTED)
+   core->get_state_supported = false;
+   core->resp_received = true;

[PATCH v5 15/23] ASoC: qdsp6: q6core: Add q6core driver

2018-04-18 Thread srinivas . kandagatla
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 
Reviewed-and-tested-by: Rohit kumar 
---
 sound/soc/qcom/Kconfig|   4 +
 sound/soc/qcom/qdsp6/Makefile |   1 +
 sound/soc/qcom/qdsp6/q6core.c | 380 ++
 sound/soc/qcom/qdsp6/q6core.h |  15 ++
 4 files changed, 400 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 a07181290624..488ee93ee084 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -56,6 +56,9 @@ config SND_SOC_QDSP6_ADM
 config SND_SOC_QDSP6_ASM
tristate
 
+config SND_SOC_QDSP6_CORE
+   tristate
+
 config SND_SOC_QDSP6
tristate "SoC ALSA audio driver for QDSP6"
depends on QCOM_APR && HAS_DMA
@@ -63,6 +66,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 ..244ec153ab71
--- /dev/null
+++ b/sound/soc/qcom/qdsp6/q6core.c
@@ -0,0 +1,380 @@
+// 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 
+#include "q6core.h"
+#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
+#define AVCS_CMD_GET_FWK_VERSION   0x001292c
+#define AVCS_CMDRSP_GET_FWK_VERSION0x001292d
+
+struct avcs_svc_info {
+   uint32_t service_id;
+   uint32_t version;
+} __packed;
+
+struct avcs_cmdrsp_get_version {
+   uint32_t build_id;
+   uint32_t num_services;
+   struct avcs_svc_info svc_api_info[];
+} __packed;
+
+/* for ADSP2.8 and above */
+struct avcs_svc_api_info {
+   uint32_t service_id;
+   uint32_t api_version;
+   uint32_t api_branch_version;
+} __packed;
+
+struct avcs_cmdrsp_get_fwk_version {
+   uint32_t build_major_version;
+   uint32_t build_minor_version;
+   uint32_t build_branch_version;
+   uint32_t build_subbranch_version;
+   uint32_t num_services;
+   struct avcs_svc_api_info svc_api_info[];
+} __packed;
+
+struct q6core {
+   struct apr_device *adev;
+   wait_queue_head_t wait;
+   uint32_t avcs_state;
+   struct mutex lock;
+   bool resp_received;
+   uint32_t num_services;
+   struct avcs_cmdrsp_get_fwk_version *fwk_version;
+   struct avcs_cmdrsp_get_version *svc_version;
+   bool fwk_version_supported;
+   bool get_state_supported;
+   bool get_version_supported;
+   bool is_version_requested;
+};
+
+static struct q6core *g_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 APR_BASIC_RSP_RESULT:{
+   result = data->payload;
+   switch (result->opcode) {
+   case AVCS_GET_VERSIONS:
+   if (result->status == ADSP_EUNSUPPORTED)
+   core->get_version_supported = false;
+   core->resp_received = true;
+   break;
+   case AVCS_CMD_GET_FWK_VERSION:
+   if (result->status == ADSP_EUNSUPPORTED)
+   core->fwk_version_supported = false;
+   core->resp_received = true;
+   break;
+   case AVCS_CMD_ADSP_EVENT_GET_STATE:
+   if (result->status == ADSP_EUNSUPPORTED)
+   core->get_state_supported = false;
+   core->resp_received = true;
+   break;
+   }
+   break;
+   }
+