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:
parent
832723d733
commit
067a92850f
3 changed files with 158 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue