@@ -581,6 +581,8 @@ struct wm_adsp_compr_buf {
581581 int read_index ;
582582 int avail ;
583583 int host_buf_mem_type ;
584+ int num_regions ;
585+ const struct wm_adsp_buffer_region_def * region_def ;
584586};
585587
586588struct wm_adsp_compr {
@@ -649,11 +651,27 @@ static const struct wm_adsp_buffer_region_def default_regions[] = {
649651 },
650652};
651653
654+ static const struct wm_adsp_buffer_region_def vpu_regions [] = {
655+ {
656+ .mem_type = WMFW_VPU_DM ,
657+ .base_offset = HOST_BUFFER_FIELD (buf1_base ),
658+ .size_offset = HOST_BUFFER_FIELD (buf1_size ),
659+ },
660+ {
661+ .mem_type = WMFW_VPU_DM ,
662+ .base_offset = HOST_BUFFER_FIELD (buf2_base ),
663+ .size_offset = HOST_BUFFER_FIELD (buf1_buf2_size ),
664+ },
665+ {
666+ .mem_type = WMFW_VPU_DM ,
667+ .base_offset = HOST_BUFFER_FIELD (buf3_base ),
668+ .size_offset = HOST_BUFFER_FIELD (buf_total_size ),
669+ },
670+ };
671+
652672struct wm_adsp_fw_caps {
653673 u32 id ;
654674 struct snd_codec_desc desc ;
655- int num_regions ;
656- const struct wm_adsp_buffer_region_def * region_defs ;
657675};
658676
659677static const struct wm_adsp_fw_caps ctrl_caps [] = {
@@ -665,8 +683,6 @@ static const struct wm_adsp_fw_caps ctrl_caps[] = {
665683 .num_sample_rates = 1 ,
666684 .formats = SNDRV_PCM_FMTBIT_S16_LE ,
667685 },
668- .num_regions = ARRAY_SIZE (default_regions ),
669- .region_defs = default_regions ,
670686 },
671687};
672688
@@ -683,8 +699,6 @@ static const struct wm_adsp_fw_caps trace_caps[] = {
683699 .num_sample_rates = 15 ,
684700 .formats = SNDRV_PCM_FMTBIT_S16_LE ,
685701 },
686- .num_regions = ARRAY_SIZE (default_regions ),
687- .region_defs = default_regions ,
688702 },
689703};
690704
@@ -4351,23 +4365,22 @@ static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
43514365
43524366static int wm_adsp_buffer_populate (struct wm_adsp_compr_buf * buf )
43534367{
4354- const struct wm_adsp_fw_caps * caps = wm_adsp_fw [buf -> dsp -> fw ].caps ;
43554368 struct wm_adsp_buffer_region * region ;
43564369 u32 offset = 0 ;
43574370 int i , ret ;
43584371
4359- for (i = 0 ; i < caps -> num_regions ; ++ i ) {
4372+ for (i = 0 ; i < buf -> num_regions ; ++ i ) {
43604373 region = & buf -> regions [i ];
43614374
43624375 region -> offset = offset ;
4363- region -> mem_type = caps -> region_defs [i ].mem_type ;
4376+ region -> mem_type = buf -> region_def [i ].mem_type ;
43644377
4365- ret = wm_adsp_buffer_read (buf , caps -> region_defs [i ].base_offset ,
4378+ ret = wm_adsp_buffer_read (buf , buf -> region_def [i ].base_offset ,
43664379 & region -> base_addr );
43674380 if (ret < 0 )
43684381 return ret ;
43694382
4370- ret = wm_adsp_buffer_read (buf , caps -> region_defs [i ].size_offset ,
4383+ ret = wm_adsp_buffer_read (buf , buf -> region_def [i ].size_offset ,
43714384 & offset );
43724385 if (ret < 0 )
43734386 return ret ;
@@ -4403,14 +4416,31 @@ static int wm_adsp_buffer_init(struct wm_adsp *dsp)
44034416
44044417 wm_adsp_buffer_clear (buf );
44054418
4419+ switch (dsp -> type ) {
4420+ case WMFW_ADSP1 :
4421+ case WMFW_ADSP2 :
4422+ case WMFW_HALO :
4423+ buf -> num_regions = ARRAY_SIZE (default_regions );
4424+ buf -> region_def = default_regions ;
4425+ break ;
4426+ case WMFW_VPU :
4427+ buf -> num_regions = ARRAY_SIZE (vpu_regions );
4428+ buf -> region_def = vpu_regions ;
4429+ break ;
4430+ default :
4431+ adsp_err (dsp , "Unknown DSP type:%d\n" , dsp -> type );
4432+ ret = - EINVAL ;
4433+ goto err_buffer ;
4434+ }
4435+
44064436 ret = wm_adsp_buffer_locate (buf );
44074437 if (ret < 0 ) {
44084438 adsp_err (dsp , "Failed to acquire host buffer: %d\n" , ret );
44094439 goto err_buffer ;
44104440 }
44114441
4412- buf -> regions = kcalloc (wm_adsp_fw [ dsp -> fw ]. caps -> num_regions ,
4413- sizeof ( * buf -> regions ), GFP_KERNEL );
4442+ buf -> regions = kcalloc (buf -> num_regions , sizeof ( * buf -> regions ) ,
4443+ GFP_KERNEL );
44144444 if (!buf -> regions ) {
44154445 ret = - ENOMEM ;
44164446 goto err_buffer ;
@@ -4495,7 +4525,7 @@ EXPORT_SYMBOL_GPL(wm_adsp_compr_trigger);
44954525
44964526static inline int wm_adsp_buffer_size (struct wm_adsp_compr_buf * buf )
44974527{
4498- int last_region = wm_adsp_fw [ buf -> dsp -> fw ]. caps -> num_regions - 1 ;
4528+ int last_region = buf -> num_regions - 1 ;
44994529
45004530 return buf -> regions [last_region ].cumulative_size ;
45014531}
@@ -4695,11 +4725,11 @@ static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target)
46954725 int data_word_size = buf -> dsp -> data_word_size ;
46964726
46974727 /* Calculate read parameters */
4698- for (i = 0 ; i < wm_adsp_fw [ buf -> dsp -> fw ]. caps -> num_regions ; ++ i )
4728+ for (i = 0 ; i < buf -> num_regions ; ++ i )
46994729 if (buf -> read_index < buf -> regions [i ].cumulative_size )
47004730 break ;
47014731
4702- if (i == wm_adsp_fw [ buf -> dsp -> fw ]. caps -> num_regions )
4732+ if (i == buf -> num_regions )
47034733 return - EINVAL ;
47044734
47054735 mem_type = buf -> regions [i ].mem_type ;
0 commit comments