Skip to content

Commit d5de750

Browse files
committed
ASoC: wm_adsp: Add dynamic handling of adsp data word size
Change-Id: Ic363ccfbae493255fa7530b572bd506ea784fcb0 Signed-off-by: Andrew Ford <[email protected]>
1 parent 33e409a commit d5de750

File tree

2 files changed

+41
-19
lines changed

2 files changed

+41
-19
lines changed

sound/soc/codecs/wm_adsp.c

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -596,12 +596,16 @@ struct wm_adsp_compr {
596596
unsigned int sample_rate;
597597
};
598598

599-
#define WM_ADSP_DATA_WORD_SIZE 3
599+
#define WM_ADSP_DATA_WORD_SIZE_DEFAULT 3
600+
#define WM_ADSP_DATA_WORD_SIZE_VPU 4
600601

601-
#define WM_ADSP_MIN_FRAGMENTS 1
602-
#define WM_ADSP_MAX_FRAGMENTS 256
603-
#define WM_ADSP_MIN_FRAGMENT_SIZE (64 * WM_ADSP_DATA_WORD_SIZE)
604-
#define WM_ADSP_MAX_FRAGMENT_SIZE (4096 * WM_ADSP_DATA_WORD_SIZE)
602+
#define WM_ADSP_DATA_WORD_MASK_DEFAULT 0x00ffffffu
603+
#define WM_ADSP_DATA_WORD_MASK_VPU 0xffffffffu
604+
605+
#define WM_ADSP_MIN_FRAGMENTS 1
606+
#define WM_ADSP_MAX_FRAGMENTS 256
607+
#define WM_ADSP_MIN_FRAGMENT_SIZE_WORDS 64
608+
#define WM_ADSP_MAX_FRAGMENT_SIZE_WORDS 4096
605609

606610
#define WM_ADSP_ALG_XM_STRUCT_MAGIC 0x49aec7
607611

@@ -3894,6 +3898,9 @@ int wm_adsp2_init(struct wm_adsp *dsp)
38943898

38953899
mutex_init(&dsp->pwr_lock);
38963900

3901+
dsp->data_word_size = WM_ADSP_DATA_WORD_SIZE_DEFAULT;
3902+
dsp->data_word_mask = WM_ADSP_DATA_WORD_MASK_DEFAULT;
3903+
38973904
return 0;
38983905
}
38993906
EXPORT_SYMBOL_GPL(wm_adsp2_init);
@@ -3918,6 +3925,9 @@ int wm_halo_init(struct wm_adsp *dsp, struct mutex *rate_lock)
39183925
dsp->tx_rate_cache = kcalloc(dsp->n_tx_channels, sizeof(u8),
39193926
GFP_KERNEL);
39203927

3928+
dsp->data_word_size = WM_ADSP_DATA_WORD_SIZE_DEFAULT;
3929+
dsp->data_word_mask = WM_ADSP_DATA_WORD_MASK_DEFAULT;
3930+
39213931
return 0;
39223932
}
39233933
EXPORT_SYMBOL_GPL(wm_halo_init);
@@ -3935,6 +3945,9 @@ int wm_vpu_init(struct wm_adsp *vpu)
39353945
INIT_WORK(&vpu->boot_work, wm_vpu_boot_work);
39363946
mutex_init(&vpu->pwr_lock);
39373947

3948+
vpu->data_word_size = WM_ADSP_DATA_WORD_SIZE_VPU;
3949+
vpu->data_word_mask = WM_ADSP_DATA_WORD_MASK_VPU;
3950+
39383951
return 0;
39393952
}
39403953
EXPORT_SYMBOL_GPL(wm_vpu_init);
@@ -4064,11 +4077,13 @@ static int wm_adsp_compr_check_params(struct snd_compr_stream *stream,
40644077
const struct snd_codec_desc *desc;
40654078
int i, j;
40664079

4067-
if (params->buffer.fragment_size < WM_ADSP_MIN_FRAGMENT_SIZE ||
4068-
params->buffer.fragment_size > WM_ADSP_MAX_FRAGMENT_SIZE ||
4080+
if (params->buffer.fragment_size < (WM_ADSP_MIN_FRAGMENT_SIZE_WORDS
4081+
* dsp->data_word_size) ||
4082+
params->buffer.fragment_size > (WM_ADSP_MAX_FRAGMENT_SIZE_WORDS
4083+
* dsp->data_word_size) ||
40694084
params->buffer.fragments < WM_ADSP_MIN_FRAGMENTS ||
40704085
params->buffer.fragments > WM_ADSP_MAX_FRAGMENTS ||
4071-
params->buffer.fragment_size % WM_ADSP_DATA_WORD_SIZE) {
4086+
params->buffer.fragment_size % dsp->data_word_size) {
40724087
adsp_err(dsp, "Invalid buffer fragsize=%d fragments=%d\n",
40734088
params->buffer.fragment_size,
40744089
params->buffer.fragments);
@@ -4107,7 +4122,7 @@ static int wm_adsp_compr_check_params(struct snd_compr_stream *stream,
41074122

41084123
static inline unsigned int wm_adsp_compr_frag_words(struct wm_adsp_compr *compr)
41094124
{
4110-
return compr->size.fragment_size / WM_ADSP_DATA_WORD_SIZE;
4125+
return compr->size.fragment_size / compr->dsp->data_word_size;
41114126
}
41124127

41134128
int wm_adsp_compr_set_params(struct snd_compr_stream *stream,
@@ -4141,6 +4156,7 @@ int wm_adsp_compr_get_caps(struct snd_compr_stream *stream,
41414156
struct snd_compr_caps *caps)
41424157
{
41434158
struct wm_adsp_compr *compr = stream->runtime->private_data;
4159+
struct wm_adsp *dsp = compr->dsp;
41444160
int fw = compr->dsp->fw;
41454161
int i;
41464162

@@ -4151,8 +4167,10 @@ int wm_adsp_compr_get_caps(struct snd_compr_stream *stream,
41514167
caps->num_codecs = i;
41524168
caps->direction = wm_adsp_fw[fw].compr_direction;
41534169

4154-
caps->min_fragment_size = WM_ADSP_MIN_FRAGMENT_SIZE;
4155-
caps->max_fragment_size = WM_ADSP_MAX_FRAGMENT_SIZE;
4170+
caps->min_fragment_size = WM_ADSP_MIN_FRAGMENT_SIZE_WORDS
4171+
* dsp->data_word_size;
4172+
caps->max_fragment_size = WM_ADSP_MAX_FRAGMENT_SIZE_WORDS
4173+
* dsp->data_word_size;
41564174
caps->min_fragments = WM_ADSP_MIN_FRAGMENTS;
41574175
caps->max_fragments = WM_ADSP_MAX_FRAGMENTS;
41584176
}
@@ -4167,6 +4185,7 @@ static int wm_adsp_read_data_block(struct wm_adsp *dsp, int mem_type,
41674185
{
41684186
struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type);
41694187
unsigned int i, reg;
4188+
unsigned int data_word_mask = dsp->data_word_mask;
41704189
int ret;
41714190

41724191
if (!mem)
@@ -4180,7 +4199,7 @@ static int wm_adsp_read_data_block(struct wm_adsp *dsp, int mem_type,
41804199
return ret;
41814200

41824201
for (i = 0; i < num_words; ++i)
4183-
data[i] = be32_to_cpu(data[i]) & 0x00ffffffu;
4202+
data[i] = be32_to_cpu(data[i]) & data_word_mask;
41844203

41854204
return 0;
41864205
}
@@ -4202,7 +4221,7 @@ static int wm_adsp_write_data_word(struct wm_adsp *dsp, int mem_type,
42024221

42034222
reg = wm_adsp_region_to_reg(dsp, mem, mem_addr);
42044223

4205-
data = cpu_to_be32(data & 0x00ffffffu);
4224+
data = cpu_to_be32(data & dsp->data_word_mask);
42064225

42074226
return regmap_raw_write(dsp->regmap, reg, &data, sizeof(data));
42084227
}
@@ -4517,7 +4536,7 @@ static int wm_adsp_buffer_update_avail(struct wm_adsp_compr_buf *buf)
45174536
avail += wm_adsp_buffer_size(buf);
45184537

45194538
adsp_dbg(buf->dsp, "readindex=0x%x, writeindex=0x%x, avail=%d\n",
4520-
buf->read_index, write_index, avail * WM_ADSP_DATA_WORD_SIZE);
4539+
buf->read_index, write_index, avail * buf->dsp->data_word_size);
45214540

45224541
buf->avail = avail;
45234542

@@ -4655,7 +4674,7 @@ int wm_adsp_compr_pointer(struct snd_compr_stream *stream,
46554674
}
46564675

46574676
tstamp->copied_total = compr->copied_total;
4658-
tstamp->copied_total += buf->avail * WM_ADSP_DATA_WORD_SIZE;
4677+
tstamp->copied_total += buf->avail * dsp->data_word_size;
46594678
tstamp->sampling_rate = compr->sample_rate;
46604679

46614680
out:
@@ -4673,6 +4692,7 @@ static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target)
46734692
unsigned int adsp_addr;
46744693
int mem_type, nwords, max_read;
46754694
int i, j, ret;
4695+
int data_word_size = buf->dsp->data_word_size;
46764696

46774697
/* Calculate read parameters */
46784698
for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i)
@@ -4706,10 +4726,10 @@ static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target)
47064726

47074727
/* Remove the padding bytes from the data read from the DSP */
47084728
for (i = 0; i < nwords; i++) {
4709-
for (j = 0; j < WM_ADSP_DATA_WORD_SIZE; j++)
4729+
for (j = 0; j < data_word_size; j++)
47104730
*pack_out++ = *pack_in++;
47114731

4712-
pack_in += sizeof(*(compr->raw_buf)) - WM_ADSP_DATA_WORD_SIZE;
4732+
pack_in += sizeof(*(compr->raw_buf)) - data_word_size;
47134733
}
47144734

47154735
/* update read index to account for words read */
@@ -4742,7 +4762,7 @@ static int wm_adsp_compr_read(struct wm_adsp_compr *compr,
47424762
return -EIO;
47434763
}
47444764

4745-
count /= WM_ADSP_DATA_WORD_SIZE;
4765+
count /= dsp->data_word_size;
47464766

47474767
do {
47484768
nwords = wm_adsp_buffer_capture_block(compr, count);
@@ -4751,7 +4771,7 @@ static int wm_adsp_compr_read(struct wm_adsp_compr *compr,
47514771
return nwords;
47524772
}
47534773

4754-
nbytes = nwords * WM_ADSP_DATA_WORD_SIZE;
4774+
nbytes = nwords * dsp->data_word_size;
47554775

47564776
adsp_dbg(dsp, "Read %d bytes\n", nbytes);
47574777

sound/soc/codecs/wm_adsp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ struct wm_adsp {
114114
char *wmfw_file_name;
115115
char *bin_file_name;
116116
#endif
117+
unsigned int data_word_mask;
118+
int data_word_size;
117119
};
118120

119121
#define WM_ADSP_PRELOADER(wname, num, event_fn) \

0 commit comments

Comments
 (0)