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 <sienar@codeaurora.org>
Signed-off-by: Aditya Bavanari <abavanar@codeaurora.org>
This commit is contained in:
Aditya Bavanari 2017-09-25 12:51:30 -07:00
parent 832723d733
commit 067a92850f
3 changed files with 158 additions and 1 deletions

View file

@ -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

View file

@ -13,9 +13,11 @@
#ifndef __Q6COMMON_H__
#define __Q6COMMON_H__
#include <linux/qdsp6v2/apr.h>
#include <sound/apr_audio-v2.h>
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__ */

View file

@ -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);