Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d0b5a2d authored by Venkata Narendra Kumar Gutta's avatar Venkata Narendra Kumar Gutta Committed by Laxminath Kasam
Browse files

ASoC: Add support in voice driver to accommodate sid 33 bit in 32 bit mode



In kernel 32 bit mode, SID address being 33bit is getting truncated.
To address this issue, update voice driver to fetch SMMU SID info
from audio ion driver and fill the upper 32 bits accordingly.

Change-Id: If487af8a47bacc271f4525c695dc8cacffa65eec
Signed-off-by: default avatarVenkata Narendra Kumar Gutta <vgutta@codeaurora.org>
parent efc1993a
Loading
Loading
Loading
Loading
+43 −22
Original line number Diff line number Diff line
@@ -2637,8 +2637,10 @@ static int voice_send_cvs_register_cal_cmd(struct voice_data *v)

	cvs_reg_cal_cmd.cvs_cal_data.cal_mem_handle =
		cal_block->map_data.q6map_handle;
	cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address =
		cal_block->cal_data.paddr;
	cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address_lsw =
		lower_32_bits(cal_block->cal_data.paddr);
	cvs_reg_cal_cmd.cvs_cal_data.cal_mem_address_msw =
		populate_upper_32_bits(cal_block->cal_data.paddr);
	cvs_reg_cal_cmd.cvs_cal_data.cal_mem_size =
		cal_block->cal_data.size;

@@ -2887,8 +2889,10 @@ static int voice_send_cvp_register_dev_cfg_cmd(struct voice_data *v)

	cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_handle =
		cal_block->map_data.q6map_handle;
	cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address =
		cal_block->cal_data.paddr;
	cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address_lsw =
		lower_32_bits(cal_block->cal_data.paddr);
	cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_address_msw =
		populate_upper_32_bits(cal_block->cal_data.paddr);
	cvp_reg_dev_cfg_cmd.cvp_dev_cfg_data.mem_size =
		cal_block->cal_data.size;

@@ -3051,8 +3055,10 @@ static int voice_send_cvp_register_cal_cmd(struct voice_data *v)

	cvp_reg_cal_cmd.cvp_cal_data.cal_mem_handle =
		cal_block->map_data.q6map_handle;
	cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address =
		cal_block->cal_data.paddr;
	cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address_lsw =
		lower_32_bits(cal_block->cal_data.paddr);
	cvp_reg_cal_cmd.cvp_cal_data.cal_mem_address_msw =
		populate_upper_32_bits(cal_block->cal_data.paddr);
	cvp_reg_cal_cmd.cvp_cal_data.cal_mem_size =
		cal_block->cal_data.size;

@@ -3207,8 +3213,10 @@ static int voice_send_cvp_register_vol_cal_cmd(struct voice_data *v)

	cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_handle =
		cal_block->map_data.q6map_handle;
	cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address =
		cal_block->cal_data.paddr;
	cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address_lsw =
		lower_32_bits(cal_block->cal_data.paddr);
	cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_address_msw =
		populate_upper_32_bits(cal_block->cal_data.paddr);
	cvp_reg_vol_cal_cmd.cvp_vol_cal_data.cal_mem_size =
		cal_block->cal_data.size;

@@ -3368,7 +3376,10 @@ static int voice_map_memory_physical_cmd(struct voice_data *v,
	mvm_map_phys_cmd.hdr.token = token;
	mvm_map_phys_cmd.hdr.opcode = VSS_IMEMORY_CMD_MAP_PHYSICAL;

	mvm_map_phys_cmd.table_descriptor.mem_address = table_info->phys;
	mvm_map_phys_cmd.table_descriptor.mem_address_lsw =
			lower_32_bits(table_info->phys);
	mvm_map_phys_cmd.table_descriptor.mem_address_msw =
			populate_upper_32_bits(table_info->phys);
	mvm_map_phys_cmd.table_descriptor.mem_size =
			sizeof(struct vss_imemory_block_t) +
			sizeof(struct vss_imemory_table_descriptor_t);
@@ -4615,8 +4626,6 @@ static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v)
	struct vss_istream_cmd_set_oob_packet_exchange_config_t
						 packet_exchange_config_pkt;
	int ret = 0;
	phys_addr_t dec_buf;
	phys_addr_t enc_buf;
	void *apr_cvs;
	u16 cvs_handle;

@@ -4624,8 +4633,6 @@ static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v)
		pr_err("%s: v is NULL\n", __func__);
		return -EINVAL;
	}
	dec_buf = (phys_addr_t)v->shmem_info.sh_buf.buf[0].phys;
	enc_buf = (phys_addr_t)v->shmem_info.sh_buf.buf[1].phys;

	apr_cvs = common.apr_q6_cvs;

@@ -4649,16 +4656,26 @@ static int voice_send_cvs_packet_exchange_config_cmd(struct voice_data *v)
	packet_exchange_config_pkt.hdr.opcode =
			 VSS_ISTREAM_CMD_SET_OOB_PACKET_EXCHANGE_CONFIG;
	packet_exchange_config_pkt.mem_handle = v->shmem_info.mem_handle;
	packet_exchange_config_pkt.dec_buf_addr = (phys_addr_t)dec_buf;
	/* dec buffer address */
	packet_exchange_config_pkt.dec_buf_addr_lsw =
		lower_32_bits(v->shmem_info.sh_buf.buf[0].phys);
	packet_exchange_config_pkt.dec_buf_addr_msw =
		populate_upper_32_bits(v->shmem_info.sh_buf.buf[0].phys);
	packet_exchange_config_pkt.dec_buf_size = 4096;
	packet_exchange_config_pkt.enc_buf_addr = (phys_addr_t)enc_buf;
	/* enc buffer address */
	packet_exchange_config_pkt.enc_buf_addr_lsw =
		lower_32_bits(v->shmem_info.sh_buf.buf[1].phys);
	packet_exchange_config_pkt.enc_buf_addr_msw =
		populate_upper_32_bits(v->shmem_info.sh_buf.buf[1].phys);
	packet_exchange_config_pkt.enc_buf_size = 4096;

	pr_debug("%s: dec buf: add %pa, size %d, enc buf: add %pa, size %d\n",
	pr_debug("%s: dec buf add: lsw %0x msw %0x, size %d, enc buf add: lsw %0x msw %0x, size %d\n",
		__func__,
		&dec_buf,
		packet_exchange_config_pkt.dec_buf_addr_lsw,
		packet_exchange_config_pkt.dec_buf_addr_msw,
		packet_exchange_config_pkt.dec_buf_size,
		&enc_buf,
		packet_exchange_config_pkt.enc_buf_addr_lsw,
		packet_exchange_config_pkt.enc_buf_addr_msw,
		packet_exchange_config_pkt.enc_buf_size);

	v->cvs_state = CMD_STATUS_FAIL;
@@ -8246,14 +8263,18 @@ static int voice_send_get_source_tracking_cmd(struct voice_data *v,

	st_cmd.cvp_get_source_tracking_param.mem_handle	=
				 common.source_tracking_sh_mem.mem_handle;
	st_cmd.cvp_get_source_tracking_param.mem_address =
		(uint64_t)common.source_tracking_sh_mem.sh_mem_block.phys;
	st_cmd.cvp_get_source_tracking_param.mem_address_lsw =
		lower_32_bits(common.source_tracking_sh_mem.sh_mem_block.phys);
	st_cmd.cvp_get_source_tracking_param.mem_address_msw =
		populate_upper_32_bits(common.source_tracking_sh_mem.
					sh_mem_block.phys);
	st_cmd.cvp_get_source_tracking_param.mem_size =
		(uint32_t)common.source_tracking_sh_mem.sh_mem_block.size;
	pr_debug("%s: mem_handle=0x%x, mem_address=0x%llx, mem_size=%d\n",
	pr_debug("%s: mem_handle=0x%x, mem_address_lsw=0x%x, msw=0x%x, mem_size=%d\n",
		 __func__,
		 st_cmd.cvp_get_source_tracking_param.mem_handle,
		 (uint64_t)st_cmd.cvp_get_source_tracking_param.mem_address,
		 st_cmd.cvp_get_source_tracking_param.mem_address_lsw,
		 st_cmd.cvp_get_source_tracking_param.mem_address_msw,
		 (uint32_t)st_cmd.cvp_get_source_tracking_param.mem_size);

	v->cvp_state = CMD_STATUS_FAIL;
+16 −8
Original line number Diff line number Diff line
@@ -399,7 +399,8 @@ struct mvm_set_hd_enable_cmd {
} __packed;

struct vss_imemory_table_descriptor_t {
	uint64_t mem_address;
	uint32_t mem_address_lsw;
	uint32_t mem_address_msw;
	/*
	 * Base physical address of the table. The address must be aligned
	 * to LCM( cache_line_size, page_align, max_data_width ), where the
@@ -785,7 +786,8 @@ struct vss_istream_cmd_set_enc_dtx_mode_t {
struct vss_istream_cmd_register_calibration_data_v2_t {
	uint32_t cal_mem_handle;
	/* Handle to the shared memory that holds the calibration data. */
	uint64_t cal_mem_address;
	uint32_t cal_mem_address_lsw;
	uint32_t cal_mem_address_msw;
	/* Location of calibration data. */
	uint32_t cal_mem_size;
	/* Size of the calibration data in bytes. */
@@ -945,9 +947,11 @@ struct cvs_enc_buffer_consumed_cmd {
struct vss_istream_cmd_set_oob_packet_exchange_config_t {
	struct apr_hdr hdr;
	uint32_t mem_handle;
	uint64_t enc_buf_addr;
	uint32_t enc_buf_addr_lsw;
	uint32_t enc_buf_addr_msw;
	uint32_t enc_buf_size;
	uint64_t dec_buf_addr;
	uint32_t dec_buf_addr_lsw;
	uint32_t dec_buf_addr_msw;
	uint32_t dec_buf_size;
} __packed;

@@ -1180,7 +1184,8 @@ struct vss_ivocproc_cmd_register_device_config_t {
	 * Handle to the shared memory that holds the per-network calibration
	 * data.
	 */
	uint64_t mem_address;
	uint32_t mem_address_lsw;
	uint32_t mem_address_msw;
	/* Location of calibration data. */
	uint32_t mem_size;
	/* Size of the calibration data in bytes. */
@@ -1192,7 +1197,8 @@ struct vss_ivocproc_cmd_register_calibration_data_v2_t {
	 * Handle to the shared memory that holds the per-network calibration
	 * data.
	 */
	uint64_t cal_mem_address;
	uint32_t cal_mem_address_lsw;
	uint32_t cal_mem_address_msw;
	/* Location of calibration data. */
	uint32_t cal_mem_size;
	/* Size of the calibration data in bytes. */
@@ -1211,7 +1217,8 @@ struct vss_ivocproc_cmd_register_volume_cal_data_t {
	 * Handle to the shared memory that holds the volume calibration
	 * data.
	 */
	uint64_t cal_mem_address;
	uint32_t cal_mem_address_lsw;
	uint32_t cal_mem_address_msw;
	/* Location of volume calibration data. */
	uint32_t cal_mem_size;
	/* Size of the volume calibration data in bytes. */
@@ -1503,7 +1510,8 @@ struct cvp_set_sound_focus_param_cmd_t {
/* Payload structure for the VSS_ISOURCETRACK_CMD_GET_ACTIVITY command */
struct vss_isourcetrack_cmd_get_activity_t {
	uint32_t mem_handle;
	uint64_t mem_address;
	uint32_t mem_address_lsw;
	uint32_t mem_address_msw;
	uint32_t mem_size;
} __packed;