From 832723d733d6b4b83e6f8142428e268032bd1e15 Mon Sep 17 00:00:00 2001 From: Aditya Bavanari Date: Mon, 8 May 2017 12:31:23 -0700 Subject: ASoC: msm: qdsp6v2: Expose APIs to get and set Instance ID support Expose APIs to get and set instance ID support by exposing a mixer control for HAL to set the support status as well as APIs for kernel components to querry for instance ID support. CRs-Fixed: 2151551 Change-Id: I76a97c92cd02e28f03a0efb73757c4be75152d1f Signed-off-by: Siena Richard Signed-off-by: Aditya Bavanari --- include/sound/q6common.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 include/sound/q6common.h (limited to 'include') diff --git a/include/sound/q6common.h b/include/sound/q6common.h new file mode 100644 index 000000000000..9b722f1de5bf --- /dev/null +++ b/include/sound/q6common.h @@ -0,0 +1,21 @@ +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef __Q6COMMON_H__ +#define __Q6COMMON_H__ + +#include + +void q6common_update_instance_id_support(bool supported); +bool q6common_is_instance_id_supported(void); + +#endif /* __Q6COMMON_H__ */ -- cgit v1.2.3 From 067a92850f0359c41397b4d964f69b14b7ce65d0 Mon Sep 17 00:00:00 2001 From: Aditya Bavanari Date: Mon, 25 Sep 2017 12:51:30 -0700 Subject: ASoC: msm: qdsp6v2: Add common items needed for Instance ID Add common headers and functions needed to support instance ID. CRs-Fixed: 2151551 Change-Id: I8a167be29cdb5c365ac957530789007e90a91a97 Signed-off-by: Siena Richard Signed-off-by: Aditya Bavanari --- include/sound/apr_audio-v2.h | 102 +++++++++++++++++++++++++++++++++++++++ include/sound/q6common.h | 4 +- sound/soc/msm/qdsp6v2/q6common.c | 53 ++++++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/sound/apr_audio-v2.h b/include/sound/apr_audio-v2.h index 6078ef2e24de..6819af659768 100644 --- a/include/sound/apr_audio-v2.h +++ b/include/sound/apr_audio-v2.h @@ -29,6 +29,108 @@ struct param_outband { phys_addr_t paddr; }; +/* --------- Common Structures and Definitions------------- */ +/* Instance ID Definitions */ +#define INSTANCE_ID_0 0x0000 + +struct mem_mapping_hdr { + /* + * LSW of parameter data payload address. Supported values: any. + * - Must be set to zero for in-band data. + */ + u32 data_payload_addr_lsw; + + /* + * MSW of Parameter data payload address. Supported values: any. + * - Must be set to zero for in-band data. + * - In the case of 32 bit Shared memory address, msw field must be + * set to zero. + * - In the case of 36 bit shared memory address, bit 31 to bit 4 of + * msw must be set to zero. + */ + u32 data_payload_addr_msw; + + /* + * Memory map handle returned by DSP through + * ASM_CMD_SHARED_MEM_MAP_REGIONS command. + * Supported Values: Any. + * If mmhandle is NULL, the ParamData payloads are within the + * message payload (in-band). + * If mmhandle is non-NULL, the ParamData payloads begin at the + * address specified in the address msw and lsw (out-of-band). + */ + u32 mem_map_handle; + +} __packed; + +/* + * Payload format for parameter data. + * Immediately following these structures are param_size bytes of parameter + * data. + */ +struct param_hdr_v1 { + /* Valid ID of the module. */ + uint32_t module_id; + + /* Valid ID of the parameter. */ + uint32_t param_id; + + /* The size of the parameter specified by the module/param ID combo */ + uint16_t param_size; + + /* This field must be set to zero. */ + uint16_t reserved; +} __packed; + +struct param_hdr_v2 { + /* Valid ID of the module. */ + uint32_t module_id; + + /* Valid ID of the parameter. */ + uint32_t param_id; + + /* The size of the parameter specified by the module/param ID combo */ + uint32_t param_size; +} __packed; + +struct param_hdr_v3 { + /* Valid ID of the module. */ + uint32_t module_id; + + /* Instance of the module. */ + uint16_t instance_id; + + /* This field must be set to zero. */ + uint16_t reserved; + + /* Valid ID of the parameter. */ + uint32_t param_id; + + /* The size of the parameter specified by the module/param ID combo */ + uint32_t param_size; +} __packed; + +/* A union of all param_hdr versions for versitility and max size */ +union param_hdrs { + struct param_hdr_v1 v1; + struct param_hdr_v2 v2; + struct param_hdr_v3 v3; +}; + +struct module_instance_info { + /* Module ID. */ + u32 module_id; + + /* Instance of the module */ + u16 instance_id; + + /* Reserved. This field must be set to zero. */ + u16 reserved; +} __packed; +/* -------------------------------------------------------- */ + +/* Begin service specific definitions and structures */ + #define ADSP_ADM_VERSION 0x00070000 #define ADM_CMD_SHARED_MEM_MAP_REGIONS 0x00010322 diff --git a/include/sound/q6common.h b/include/sound/q6common.h index 9b722f1de5bf..b6208f756cd9 100644 --- a/include/sound/q6common.h +++ b/include/sound/q6common.h @@ -13,9 +13,11 @@ #ifndef __Q6COMMON_H__ #define __Q6COMMON_H__ -#include +#include void q6common_update_instance_id_support(bool supported); bool q6common_is_instance_id_supported(void); +int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr, + u8 *param_data, u32 *total_size); #endif /* __Q6COMMON_H__ */ diff --git a/sound/soc/msm/qdsp6v2/q6common.c b/sound/soc/msm/qdsp6v2/q6common.c index 7886916f03da..88e9af1cb86b 100644 --- a/sound/soc/msm/qdsp6v2/q6common.c +++ b/sound/soc/msm/qdsp6v2/q6common.c @@ -30,3 +30,56 @@ bool q6common_is_instance_id_supported(void) } EXPORT_SYMBOL(q6common_is_instance_id_supported); +int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr, + u8 *param_data, u32 *total_size) +{ + struct param_hdr_v1 *v1_hdr = NULL; + u32 packed_size = 0; + u32 param_size = 0; + bool iid_supported = q6common_is_instance_id_supported(); + + if (dest == NULL) { + pr_err("%s: Received NULL pointer for destination\n", __func__); + return -EINVAL; + } else if (v3_hdr == NULL) { + pr_err("%s: Received NULL pointer for header\n", __func__); + return -EINVAL; + } else if (total_size == NULL) { + pr_err("%s: Received NULL pointer for total size\n", __func__); + return -EINVAL; + } + + param_size = v3_hdr->param_size; + packed_size = iid_supported ? sizeof(struct param_hdr_v3) : + sizeof(struct param_hdr_v1); + + if (iid_supported) { + memcpy(dest, v3_hdr, packed_size); + } else { + v1_hdr = (struct param_hdr_v1 *) dest; + v1_hdr->module_id = v3_hdr->module_id; + v1_hdr->param_id = v3_hdr->param_id; + + if (param_size > U16_MAX) { + pr_err("%s: Invalid param size for V1 %d\n", __func__, + param_size); + return -EINVAL; + } + v1_hdr->param_size = param_size; + v1_hdr->reserved = 0; + } + + /* + * Make param_data optional for cases when there is no data + * present as in some set cases and all get cases. + */ + if (param_data != NULL) { + memcpy(dest + packed_size, param_data, param_size); + packed_size += param_size; + } + + *total_size = packed_size; + + return 0; +} +EXPORT_SYMBOL(q6common_pack_pp_params); -- cgit v1.2.3