@@ -106,8 +106,8 @@ struct comp_data {
106106 int sink_frames ;
107107 int sample_container_bytes ;
108108 void (* src_func )(struct comp_dev * dev ,
109- const struct audio_stream * source ,
110- struct audio_stream * sink ,
109+ const struct audio_stream __sparse_cache * source ,
110+ struct audio_stream __sparse_cache * sink ,
111111 int * consumed ,
112112 int * produced );
113113 void (* polyphase_func )(struct src_stage_prm * s );
@@ -335,16 +335,16 @@ int src_polyphase_init(struct polyphase_src *src, struct src_param *p,
335335
336336/* Fallback function */
337337static void src_fallback (struct comp_dev * dev ,
338- const struct audio_stream * source ,
339- struct audio_stream * sink , int * n_read , int * n_written )
338+ const struct audio_stream __sparse_cache * source ,
339+ struct audio_stream __sparse_cache * sink , int * n_read , int * n_written )
340340{
341341 * n_read = 0 ;
342342 * n_written = 0 ;
343343}
344344
345345/* Normal 2 stage SRC */
346- static void src_2s (struct comp_dev * dev , const struct audio_stream * source ,
347- struct audio_stream * sink , int * n_read , int * n_written )
346+ static void src_2s (struct comp_dev * dev , const struct audio_stream __sparse_cache * source ,
347+ struct audio_stream __sparse_cache * sink , int * n_read , int * n_written )
348348{
349349 struct src_stage_prm s1 ;
350350 struct src_stage_prm s2 ;
@@ -435,8 +435,8 @@ static void src_2s(struct comp_dev *dev, const struct audio_stream *source,
435435}
436436
437437/* 1 stage SRC for simple conversions */
438- static void src_1s (struct comp_dev * dev , const struct audio_stream * source ,
439- struct audio_stream * sink , int * n_read , int * n_written )
438+ static void src_1s (struct comp_dev * dev , const struct audio_stream __sparse_cache * source ,
439+ struct audio_stream __sparse_cache * sink , int * n_read , int * n_written )
440440{
441441 struct src_stage_prm s1 ;
442442 struct comp_data * cd = comp_get_drvdata (dev );
@@ -461,8 +461,8 @@ static void src_1s(struct comp_dev *dev, const struct audio_stream *source,
461461
462462/* A fast copy function for same in and out rate */
463463static void src_copy_sxx (struct comp_dev * dev ,
464- const struct audio_stream * source ,
465- struct audio_stream * sink ,
464+ const struct audio_stream __sparse_cache * source ,
465+ struct audio_stream __sparse_cache * sink ,
466466 int * n_read , int * n_written )
467467{
468468 struct comp_data * cd = comp_get_drvdata (dev );
@@ -529,7 +529,7 @@ static void src_set_params(struct comp_dev *dev, struct sof_ipc_stream_params *p
529529 sinkb -> stream .rate = cd -> ipc_config .sink_rate ;
530530}
531531
532- static void src_set_sink_params (struct comp_dev * dev , struct comp_buffer * sinkb )
532+ static void src_set_sink_params (struct comp_dev * dev , struct comp_buffer __sparse_cache * sinkb )
533533{
534534 struct comp_data * cd = comp_get_drvdata (dev );
535535
@@ -568,7 +568,7 @@ static int src_stream_pcm_source_rate_check(struct ipc_config_src cfg,
568568
569569static void src_set_params (struct comp_dev * dev , struct sof_ipc_stream_params * params ) {}
570570
571- static void src_set_sink_params (struct comp_dev * dev , struct comp_buffer * sinkb ) {}
571+ static void src_set_sink_params (struct comp_dev * dev , struct comp_buffer __sparse_cache * sinkb ) {}
572572#else
573573#error "No or invalid IPC MAJOR version selected."
574574#endif /* CONFIG_IPC_MAJOR_4 */
@@ -667,11 +667,11 @@ static int src_params(struct comp_dev *dev,
667667 struct sof_ipc_stream_params * params )
668668{
669669 struct comp_data * cd = comp_get_drvdata (dev );
670- struct comp_buffer * sinkb ;
671- struct comp_buffer * sourceb ;
670+ struct comp_buffer * sourceb , * sinkb ;
671+ struct comp_buffer __sparse_cache * source_c , * sink_c ;
672672 size_t delay_lines_size ;
673673 int32_t * buffer_start ;
674- int n = 0 ;
674+ int n ;
675675 int err ;
676676
677677 comp_info (dev , "src_params()" );
@@ -691,14 +691,19 @@ static int src_params(struct comp_dev *dev,
691691 sinkb = list_first_item (& dev -> bsink_list , struct comp_buffer ,
692692 source_list );
693693
694- src_set_sink_params (dev , sinkb );
694+ source_c = buffer_acquire (sourceb );
695+ sink_c = buffer_acquire (sinkb );
696+
697+ src_set_sink_params (dev , sink_c );
695698
696699 /* Set source/sink_rate/frames */
697- cd -> source_rate = sourceb -> stream .rate ;
698- cd -> sink_rate = sinkb -> stream .rate ;
700+ cd -> source_rate = source_c -> stream .rate ;
701+ cd -> sink_rate = sink_c -> stream .rate ;
699702 if (!cd -> sink_rate ) {
700703 comp_err (dev , "src_params(), zero sink rate" );
701- return - EINVAL ;
704+
705+ err = - EINVAL ;
706+ goto out ;
702707 }
703708
704709 cd -> source_frames = dev -> frames * cd -> source_rate / cd -> sink_rate ;
@@ -708,12 +713,12 @@ static int src_params(struct comp_dev *dev,
708713 comp_info (dev , "src_params(), source_rate = %u, sink_rate = %u" ,
709714 cd -> source_rate , cd -> sink_rate );
710715 comp_info (dev , "src_params(), sourceb->channels = %u, sinkb->channels = %u, dev->frames = %u" ,
711- sourceb -> stream .channels , sinkb -> stream .channels , dev -> frames );
716+ source_c -> stream .channels , sink_c -> stream .channels , dev -> frames );
712717 err = src_buffer_lengths (& cd -> param , cd -> source_rate , cd -> sink_rate ,
713- sourceb -> stream .channels , cd -> source_frames );
718+ source_c -> stream .channels , cd -> source_frames );
714719 if (err < 0 ) {
715720 comp_err (dev , "src_params(): src_buffer_lengths() failed" );
716- return err ;
721+ goto out ;
717722 }
718723
719724 comp_info (dev , "src_params(), blk_in = %u, blk_out = %u" ,
@@ -722,7 +727,9 @@ static int src_params(struct comp_dev *dev,
722727 delay_lines_size = sizeof (int32_t ) * cd -> param .total ;
723728 if (delay_lines_size == 0 ) {
724729 comp_err (dev , "src_params(): delay_lines_size = 0" );
725- return - EINVAL ;
730+
731+ err = - EINVAL ;
732+ goto out ;
726733 }
727734
728735 /* free any existing delay lines. TODO reuse if same size */
@@ -733,7 +740,8 @@ static int src_params(struct comp_dev *dev,
733740 if (!cd -> delay_lines ) {
734741 comp_err (dev , "src_params(): failed to alloc cd->delay_lines, delay_lines_size = %u" ,
735742 delay_lines_size );
736- return - EINVAL ;
743+ err = - EINVAL ;
744+ goto out ;
737745 }
738746
739747 /* Clear all delay lines here */
@@ -765,10 +773,14 @@ static int src_params(struct comp_dev *dev,
765773 */
766774 comp_info (dev , "src_params(), missing coefficients for requested rates combination" );
767775 cd -> src_func = src_fallback ;
768- return - EINVAL ;
776+ err = - EINVAL ;
769777 }
770778
771- return 0 ;
779+ out :
780+ buffer_release (sink_c );
781+ buffer_release (source_c );
782+
783+ return err ;
772784}
773785
774786static int src_ctrl_cmd (struct comp_dev * dev , struct sof_ipc_ctrl_data * cdata )
@@ -808,8 +820,8 @@ static int src_trigger(struct comp_dev *dev, int cmd)
808820}
809821
810822static int src_get_copy_limits (struct comp_data * cd ,
811- const struct comp_buffer * source ,
812- const struct comp_buffer * sink )
823+ const struct comp_buffer __sparse_cache * source ,
824+ const struct comp_buffer __sparse_cache * sink )
813825{
814826 struct src_param * sp ;
815827 struct src_stage * s1 ;
@@ -853,8 +865,8 @@ static int src_get_copy_limits(struct comp_data *cd,
853865 return 0 ;
854866}
855867
856- static void src_process (struct comp_dev * dev , struct comp_buffer * source ,
857- struct comp_buffer * sink )
868+ static void src_process (struct comp_dev * dev , struct comp_buffer __sparse_cache * source ,
869+ struct comp_buffer __sparse_cache * sink )
858870{
859871 struct comp_data * cd = comp_get_drvdata (dev );
860872 int consumed = 0 ;
@@ -868,18 +880,18 @@ static void src_process(struct comp_dev *dev, struct comp_buffer *source,
868880 comp_dbg (dev , "src_copy(), consumed = %u, produced = %u" ,
869881 consumed , produced );
870882
871- comp_update_buffer_consume (source , consumed *
883+ comp_update_buffer_cached_consume (source , consumed *
872884 audio_stream_frame_bytes (& source -> stream ));
873- comp_update_buffer_produce (sink , produced *
885+ comp_update_buffer_cached_produce (sink , produced *
874886 audio_stream_frame_bytes (& sink -> stream ));
875887}
876888
877889/* copy and process stream data from source to sink buffers */
878890static int src_copy (struct comp_dev * dev )
879891{
880892 struct comp_data * cd = comp_get_drvdata (dev );
881- struct comp_buffer * source ;
882- struct comp_buffer * sink ;
893+ struct comp_buffer * source , * sink ;
894+ struct comp_buffer __sparse_cache * source_c , * sink_c ;
883895 int ret ;
884896
885897 comp_dbg (dev , "src_copy()" );
@@ -890,30 +902,28 @@ static int src_copy(struct comp_dev *dev)
890902 sink = list_first_item (& dev -> bsink_list , struct comp_buffer ,
891903 source_list );
892904
893- source = buffer_acquire (source );
894- sink = buffer_acquire (sink );
905+ source_c = buffer_acquire (source );
906+ sink_c = buffer_acquire (sink );
895907
896908 /* Get from buffers and SRC conversion specific block constraints
897909 * how many frames can be processed. If sufficient number of samples
898910 * is not available the processing is omitted.
899911 */
900- ret = src_get_copy_limits (cd , source , sink );
901-
902- buffer_release (sink );
903- buffer_release (source );
904-
905- if (ret ) {
912+ ret = src_get_copy_limits (cd , source_c , sink_c );
913+ if (ret )
906914 comp_dbg (dev , "No data to process." );
907- return 0 ;
908- }
915+ else
916+ src_process (dev , source_c , sink_c );
917+
918+ buffer_release (sink_c );
919+ buffer_release (source_c );
909920
910- src_process (dev , source , sink );
911921 return 0 ;
912922}
913923
914924static int src_check_buffer_sizes (struct comp_data * cd ,
915- struct audio_stream * source_stream ,
916- struct audio_stream * sink_stream )
925+ struct audio_stream __sparse_cache * source_stream ,
926+ struct audio_stream __sparse_cache * sink_stream )
917927{
918928 struct src_stage * s1 = cd -> src .stage1 ;
919929 struct src_stage * s2 = cd -> src .stage2 ;
@@ -958,8 +968,8 @@ static int src_check_buffer_sizes(struct comp_data *cd,
958968static int src_prepare (struct comp_dev * dev )
959969{
960970 struct comp_data * cd = comp_get_drvdata (dev );
961- struct comp_buffer * sinkb ;
962- struct comp_buffer * sourceb ;
971+ struct comp_buffer * sourceb , * sinkb ;
972+ struct comp_buffer __sparse_cache * source_c , * sink_c ;
963973 enum sof_ipc_frame source_format ;
964974 enum sof_ipc_frame sink_format ;
965975 int ret ;
@@ -979,24 +989,25 @@ static int src_prepare(struct comp_dev *dev)
979989 sinkb = list_first_item (& dev -> bsink_list ,
980990 struct comp_buffer , source_list );
981991
992+ source_c = buffer_acquire (sourceb );
993+ sink_c = buffer_acquire (sinkb );
994+
982995 /* get source data format */
983- source_format = sourceb -> stream .frame_fmt ;
996+ source_format = source_c -> stream .frame_fmt ;
984997
985998 /* get sink data format */
986- sink_format = sinkb -> stream .frame_fmt ;
999+ sink_format = sink_c -> stream .frame_fmt ;
9871000
988- ret = src_check_buffer_sizes (cd , & sourceb -> stream , & sinkb -> stream );
989- if (ret < 0 ) {
990- comp_err (dev , "src_prepare(): source or sink buffer size is insufficient" );
991- return ret ;
992- }
1001+ ret = src_check_buffer_sizes (cd , & source_c -> stream , & sink_c -> stream );
1002+ if (ret < 0 )
1003+ goto out ;
9931004
9941005 /* SRC supports S16_LE, S24_4LE and S32_LE formats */
9951006 if (source_format != sink_format ) {
9961007 comp_err (dev , "src_prepare(): Source fmt %d and sink fmt %d are different." ,
9971008 source_format , sink_format );
9981009 ret = - EINVAL ;
999- goto err ;
1010+ goto out ;
10001011 }
10011012
10021013 switch (source_format ) {
@@ -1021,13 +1032,16 @@ static int src_prepare(struct comp_dev *dev)
10211032 default :
10221033 comp_err (dev , "src_prepare(): invalid format %d" , source_format );
10231034 ret = - EINVAL ;
1024- goto err ;
1035+ goto out ;
10251036 }
10261037
1027- return 0 ;
1038+ out :
1039+ if (ret < 0 )
1040+ comp_set_state (dev , COMP_TRIGGER_RESET );
1041+
1042+ buffer_release (sink_c );
1043+ buffer_release (source_c );
10281044
1029- err :
1030- comp_set_state (dev , COMP_TRIGGER_RESET );
10311045 return ret ;
10321046}
10331047
0 commit comments