@@ -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}
38993906EXPORT_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}
39233933EXPORT_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}
39403953EXPORT_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
41084123static 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
41134128int 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
46614680out :
@@ -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
0 commit comments