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

Commit efc1993a authored by Laxminath Kasam's avatar Laxminath Kasam
Browse files

ASoC: change audio drivers to accomodate sid 33bit in 32-mode



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

Change-Id: Ie2fa573def36d7b346d6a96249239ef1ecc7f8e0
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent ec7db6c5
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ static int q6usm_memory_map(phys_addr_t buf_add, int dir, uint32_t bufsz,
	mem_region_map.flags = 0;

	mem_region_map.shm_addr_lsw = lower_32_bits(buf_add);
	mem_region_map.shm_addr_msw = upper_32_bits(buf_add);
	mem_region_map.shm_addr_msw = populate_upper_32_bits(buf_add);
	mem_region_map.mem_size_bytes = bufsz * bufcnt;

	rc = apr_send_pkt(this_mmap.apr, (uint32_t *) &mem_region_map);
@@ -1154,7 +1154,7 @@ int q6usm_read(struct us_client *usc, uint32_t read_ind)
	read.buf_size = port->buf_size;
	buf_addr = (u64)(port->phys) + port->buf_size * (port->cpu_buf);
	read.buf_addr_lsw = lower_32_bits(buf_addr);
	read.buf_addr_msw = upper_32_bits(buf_addr);
	read.buf_addr_msw = populate_upper_32_bits(buf_addr);
	read.mem_map_handle = *((uint32_t *)(port->ext));

	for (loop_ind = 0; loop_ind < read_counter; ++loop_ind) {
@@ -1163,7 +1163,7 @@ int q6usm_read(struct us_client *usc, uint32_t read_ind)
		buf_addr = (u64)(port->phys) +
				port->buf_size * (port->cpu_buf);
		read.buf_addr_lsw = lower_32_bits(buf_addr);
		read.buf_addr_msw = upper_32_bits(buf_addr);
		read.buf_addr_msw = populate_upper_32_bits(buf_addr);
		read.seq_id = port->cpu_buf;
		read.hdr.token = port->cpu_buf;
		read.counter = 1;
@@ -1230,7 +1230,7 @@ int q6usm_write(struct us_client *usc, uint32_t write_ind)
	cmd_write.buf_size = port->buf_size;
	buf_addr = (u64)(port->phys) + port->buf_size * (port->cpu_buf);
	cmd_write.buf_addr_lsw = lower_32_bits(buf_addr);
	cmd_write.buf_addr_msw = upper_32_bits(buf_addr);
	cmd_write.buf_addr_msw = populate_upper_32_bits(buf_addr);
	cmd_write.mem_map_handle = *((uint32_t *)(port->ext));
	cmd_write.res0 = 0;
	cmd_write.res1 = 0;
@@ -1242,7 +1242,7 @@ int q6usm_write(struct us_client *usc, uint32_t write_ind)
		buf_addr = (u64)(port->phys) +
				port->buf_size * (port->cpu_buf);
		cmd_write.buf_addr_lsw = lower_32_bits(buf_addr);
		cmd_write.buf_addr_msw = upper_32_bits(buf_addr);
		cmd_write.buf_addr_msw = populate_upper_32_bits(buf_addr);
		cmd_write.seq_id = port->cpu_buf;
		cmd_write.hdr.token = port->cpu_buf;

@@ -1380,7 +1380,7 @@ int q6usm_set_us_stream_param(int dir, struct us_client *usc,

	cmd_set_param.hdr.opcode = USM_STREAM_CMD_SET_PARAM;
	cmd_set_param.buf_size = buf_size;
	cmd_set_param.buf_addr_msw = upper_32_bits(port->param_phys);
	cmd_set_param.buf_addr_msw = populate_upper_32_bits(port->param_phys);
	cmd_set_param.buf_addr_lsw = lower_32_bits(port->param_phys);
	cmd_set_param.mem_map_handle =
			*((uint32_t *)(port->param_buf_mem_handle));
@@ -1425,7 +1425,7 @@ int q6usm_get_us_stream_param(int dir, struct us_client *usc,

	cmd_get_param.hdr.opcode = USM_STREAM_CMD_GET_PARAM;
	cmd_get_param.buf_size = buf_size;
	cmd_get_param.buf_addr_msw = upper_32_bits(port->param_phys);
	cmd_get_param.buf_addr_msw = populate_upper_32_bits(port->param_phys);
	cmd_get_param.buf_addr_lsw = lower_32_bits(port->param_phys);
	cmd_get_param.mem_map_handle =
			*((uint32_t *)(port->param_buf_mem_handle));
+17 −0
Original line number Diff line number Diff line
@@ -776,6 +776,23 @@ static const struct of_device_id msm_audio_ion_dt_match[] = {
};
MODULE_DEVICE_TABLE(of, msm_audio_ion_dt_match);


u32 msm_audio_ion_get_smmu_sid_mode32(void)
{
	if (msm_audio_ion_data.smmu_enabled)
		return upper_32_bits(msm_audio_ion_data.smmu_sid_bits);
	else
		return 0;
}

u32 populate_upper_32_bits(ion_phys_addr_t pa)
{
	if (sizeof(ion_phys_addr_t) == sizeof(u32))
		return msm_audio_ion_get_smmu_sid_mode32();
	else
		return upper_32_bits(pa);
}

static int msm_audio_ion_probe(struct platform_device *pdev)
{
	int rc = 0;
+2 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
 * Copyright (c) 2013-2015, 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
@@ -41,4 +41,5 @@ int msm_audio_ion_import_legacy(const char *name, struct ion_client *client,
			ion_phys_addr_t *paddr, size_t *pa_len, void **vaddr);
int msm_audio_ion_free_legacy(struct ion_client *client,
			struct ion_handle *handle);
u32 populate_upper_32_bits(ion_phys_addr_t pa);
#endif /* _LINUX_MSM_AUDIO_ION_H */
+3 −2
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ static int msm_lsm_queue_lab_buffer(struct lsm_priv *prtd, int i)
	cmd_read.buf_addr_lsw =
		lower_32_bits(prtd->lsm_client->lab_buffer[i].phys);
	cmd_read.buf_addr_msw =
		upper_32_bits(prtd->lsm_client->lab_buffer[i].phys);
		populate_upper_32_bits(prtd->lsm_client->lab_buffer[i].phys);
	cmd_read.buf_size = prtd->lsm_client->lab_buffer[i].size;
	cmd_read.mem_map_handle =
		prtd->lsm_client->lab_buffer[i].mem_map_handle;
@@ -158,7 +158,8 @@ static int lsm_lab_buffer_sanity(struct lsm_priv *prtd,
	for (i = 0; i < prtd->lsm_client->hw_params.period_count; i++) {
		if ((lower_32_bits(prtd->lsm_client->lab_buffer[i].phys) ==
			read_done->buf_addr_lsw) &&
			(upper_32_bits(prtd->lsm_client->lab_buffer[i].phys) ==
			(populate_upper_32_bits
				(prtd->lsm_client->lab_buffer[i].phys) ==
			read_done->buf_addr_msw) &&
			(prtd->lsm_client->lab_buffer[i].mem_map_handle ==
			read_done->mem_map_handle)) {
+12 −7
Original line number Diff line number Diff line
@@ -307,7 +307,8 @@ int adm_dts_eagle_set(int port_id, int copp_idx, int param_id,
	admp.hdr.token = p_idx << 16 | copp_idx;
	admp.hdr.opcode = ADM_CMD_SET_PP_PARAMS_V5;
	admp.payload_addr_lsw = lower_32_bits(this_adm.outband_memmap.paddr);
	admp.payload_addr_msw = upper_32_bits(this_adm.outband_memmap.paddr);
	admp.payload_addr_msw = populate_upper_32_bits(
						this_adm.outband_memmap.paddr);
	admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[
					  ADM_DTS_EAGLE]);
	admp.payload_size = size + sizeof(struct adm_param_data_v5);
@@ -416,7 +417,8 @@ int adm_dts_eagle_get(int port_id, int copp_idx, int param_id,
	admp.data_payload_addr_lsw =
				lower_32_bits(this_adm.outband_memmap.paddr);
	admp.data_payload_addr_msw =
				upper_32_bits(this_adm.outband_memmap.paddr);
				populate_upper_32_bits(
						this_adm.outband_memmap.paddr);
	admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[
					  ADM_DTS_EAGLE]);
	admp.module_id = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX;
@@ -665,7 +667,7 @@ int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id,
					sizeof(struct adm_cmd_set_pp_params_v5);
		adm_params->payload_addr_lsw = lower_32_bits(
						this_adm.outband_memmap.paddr);
		adm_params->payload_addr_msw = upper_32_bits(
		adm_params->payload_addr_msw = populate_upper_32_bits(
						this_adm.outband_memmap.paddr);
		adm_params->mem_map_handle = atomic_read(&this_adm.
					mem_map_handles[ADM_SRS_TRUMEDIA]);
@@ -1603,7 +1605,7 @@ static int adm_memory_map_regions(phys_addr_t *buf_add, uint32_t mempool_id,

	for (i = 0; i < bufcnt; i++) {
		mregions->shm_addr_lsw = lower_32_bits(buf_add[i]);
		mregions->shm_addr_msw = upper_32_bits(buf_add[i]);
		mregions->shm_addr_msw = populate_upper_32_bits(buf_add[i]);
		mregions->mem_size_bytes = bufsz[i];
		++mregions;
	}
@@ -1771,7 +1773,8 @@ static void send_adm_custom_topology(void)
	adm_top.hdr.token = 0;
	adm_top.hdr.opcode = ADM_CMD_ADD_TOPOLOGIES;
	adm_top.payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr);
	adm_top.payload_addr_msw = upper_32_bits(cal_block->cal_data.paddr);
	adm_top.payload_addr_msw = populate_upper_32_bits(
						cal_block->cal_data.paddr);
	adm_top.mem_map_handle = cal_block->map_data.q6map_handle;
	adm_top.payload_size = cal_block->cal_data.size;

@@ -1859,7 +1862,8 @@ static int send_adm_cal_block(int port_id, int copp_idx,
			atomic_read(&this_adm.copp.id[port_idx][copp_idx]);
	adm_params.hdr.opcode = ADM_CMD_SET_PP_PARAMS_V5;
	adm_params.payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr);
	adm_params.payload_addr_msw = upper_32_bits(cal_block->cal_data.paddr);
	adm_params.payload_addr_msw = populate_upper_32_bits(
						cal_block->cal_data.paddr);
	adm_params.mem_map_handle = cal_block->map_data.q6map_handle;
	adm_params.payload_size = cal_block->cal_data.size;

@@ -4105,7 +4109,8 @@ int adm_get_source_tracking(int port_id, int copp_idx,
	admp.data_payload_addr_lsw =
		lower_32_bits(this_adm.sourceTrackingData.memmap.paddr);
	admp.data_payload_addr_msw =
		upper_32_bits(this_adm.sourceTrackingData.memmap.paddr);
		populate_upper_32_bits(
				this_adm.sourceTrackingData.memmap.paddr);
	admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[
					  ADM_MEM_MAP_INDEX_SOURCE_TRACKING]);
	admp.module_id = VOICEPROC_MODULE_ID_GENERIC_TX;
Loading