@@ -64,6 +64,92 @@ static int copier_set_alh_multi_gtw_channel_map(struct comp_dev *dev,
6464 return 0 ;
6565}
6666
67+ static int copier_alh_assign_dai_index (struct comp_dev * dev ,
68+ void * gtw_cfg_data ,
69+ union ipc4_connector_node_id node_id ,
70+ struct ipc_config_dai * dai ,
71+ int * dai_index ,
72+ int * dai_count )
73+ {
74+ struct processing_module * mod = comp_get_drvdata (dev );
75+ struct copier_data * cd = module_get_private_data (mod );
76+ const struct sof_alh_configuration_blob * alh_blob = gtw_cfg_data ;
77+ uint8_t * dma_config ;
78+ size_t alh_cfg_size , dma_config_length ;
79+ int i , dai_num , ret ;
80+
81+ if (!cd -> config .gtw_cfg .config_length ) {
82+ comp_err (mod -> dev , "No gateway config found in blob!" );
83+ return - EINVAL ;
84+ }
85+
86+ switch (dai -> type ) {
87+ case SOF_DAI_INTEL_HDA :
88+ /* We use DAI_INTEL_HDA for ACE 2.0 platforms */
89+ alh_cfg_size = get_alh_config_size (alh_blob );
90+ dma_config = (uint8_t * )gtw_cfg_data + alh_cfg_size ;
91+ dma_config_length = (cd -> config .gtw_cfg .config_length << 2 ) - alh_cfg_size ;
92+
93+ /* Here we check node_id if we need to use FW aggregation,
94+ * in other words do we need to create multiple dai or not
95+ */
96+ if (!is_multi_gateway (node_id )) {
97+ /* Find DMA config in blob and retrieve stream_id */
98+ ret = ipc4_find_dma_config_multiple (dai , dma_config , dma_config_length ,
99+ alh_blob -> alh_cfg .mapping [0 ].alh_id , 0 );
100+ if (ret != 0 ) {
101+ comp_err (mod -> dev , "No sndw dma_config found in blob!" );
102+ return - EINVAL ;
103+ }
104+ dai_index [0 ] = dai -> host_dma_config [0 ]-> stream_id ;
105+ return 0 ;
106+ }
107+
108+ dai_num = alh_blob -> alh_cfg .count ;
109+ if (dai_num > IPC4_ALH_MAX_NUMBER_OF_GTW || dai_num < 0 ) {
110+ comp_err (mod -> dev , "Invalid dai_count: %d" , dai_num );
111+ return - EINVAL ;
112+ }
113+
114+ for (i = 0 ; i < dai_num ; i ++ ) {
115+ ret = ipc4_find_dma_config_multiple (dai , dma_config ,
116+ dma_config_length ,
117+ alh_blob -> alh_cfg .mapping [i ].alh_id , i );
118+ if (ret != 0 ) {
119+ comp_err (mod -> dev , "No sndw dma_config found in blob!" );
120+ return - EINVAL ;
121+ }
122+ dai_index [i ] = dai -> host_dma_config [i ]-> stream_id ;
123+ }
124+
125+ * dai_count = dai_num ;
126+ break ;
127+ case SOF_DAI_INTEL_ALH :
128+ /* Use DAI_INTEL_ALH for ACE 1.0 and older */
129+ if (!is_multi_gateway (node_id )) {
130+ dai_index [0 ] = IPC4_ALH_DAI_INDEX (node_id .f .v_index );
131+ return 0 ;
132+ }
133+
134+ dai_num = alh_blob -> alh_cfg .count ;
135+ if (dai_num > IPC4_ALH_MAX_NUMBER_OF_GTW || dai_num < 0 ) {
136+ comp_err (mod -> dev , "Invalid dai_count: %d" , dai_num );
137+ return - EINVAL ;
138+ }
139+
140+ for (i = 0 ; i < dai_num ; i ++ )
141+ dai_index [i ] = IPC4_ALH_DAI_INDEX (alh_blob -> alh_cfg .mapping [i ].alh_id );
142+
143+ * dai_count = dai_num ;
144+ break ;
145+ default :
146+ comp_err (mod -> dev , "Invalid dai type selected: %d" , dai -> type );
147+ return - EINVAL ;
148+ }
149+
150+ return 0 ;
151+ }
152+
67153static int copier_dai_init (struct comp_dev * dev ,
68154 struct comp_ipc_config * config ,
69155 const struct ipc4_copier_module_cfg * copier ,
@@ -100,7 +186,8 @@ static int copier_dai_init(struct comp_dev *dev,
100186 }
101187
102188 /* save the channel map and count for ALH multi-gateway */
103- if (type == ipc4_gtw_alh && is_multi_gateway (copier -> gtw_cfg .node_id )) {
189+ if ((type == ipc4_gtw_alh || type == ipc4_gtw_link ) &&
190+ is_multi_gateway (copier -> gtw_cfg .node_id )) {
104191 ret = copier_set_alh_multi_gtw_channel_map (dev , copier , index );
105192 if (ret < 0 )
106193 return ret ;
@@ -182,50 +269,19 @@ int copier_dai_create(struct comp_dev *dev, struct copier_data *cd,
182269 break ;
183270 case ipc4_alh_link_output_class :
184271 case ipc4_alh_link_input_class :
272+ #if defined(CONFIG_ACE_VERSION_2_0 )
273+ dai .type = SOF_DAI_INTEL_HDA ;
274+ dai .is_config_blob = true;
275+ type = ipc4_gtw_link ;
276+ #else
185277 dai .type = SOF_DAI_INTEL_ALH ;
186278 dai .is_config_blob = true;
187279 type = ipc4_gtw_alh ;
188-
189- /* copier
190- * {
191- * gtw_cfg
192- * {
193- * gtw_node_id;
194- * config_length;
195- * config_data
196- * {
197- * count;
198- * {
199- * node_id; \\ normal gtw id
200- * mask;
201- * } mapping[MAX_ALH_COUNT];
202- * }
203- * }
204- * }
205- */
206- /* get gtw node id in config data */
207- if (is_multi_gateway (node_id )) {
208- if (copier -> gtw_cfg .config_length ) {
209- const struct sof_alh_configuration_blob * alh_blob =
210- (const struct sof_alh_configuration_blob * )
211- copier -> gtw_cfg .config_data ;
212-
213- dai_count = alh_blob -> alh_cfg .count ;
214- if (dai_count > IPC4_ALH_MAX_NUMBER_OF_GTW || dai_count < 0 ) {
215- comp_err (dev , "Invalid dai_count: %d" , dai_count );
216- return - EINVAL ;
217- }
218- for (i = 0 ; i < dai_count ; i ++ )
219- dai_index [i ] =
220- IPC4_ALH_DAI_INDEX (alh_blob -> alh_cfg .mapping [i ].alh_id );
221- } else {
222- comp_err (dev , "No ipc4_alh_multi_gtw_cfg found in blob!" );
223- return - EINVAL ;
224- }
225- } else {
226- dai_index [dai_count - 1 ] = IPC4_ALH_DAI_INDEX (node_id .f .v_index );
227- }
228-
280+ #endif /* defined(CONFIG_ACE_VERSION_2_0) */
281+ ret = copier_alh_assign_dai_index (dev , cd -> gtw_cfg , node_id ,
282+ & dai , dai_index , & dai_count );
283+ if (ret )
284+ return ret ;
229285 break ;
230286 case ipc4_dmic_link_input_class :
231287 dai .type = SOF_DAI_INTEL_DMIC ;
@@ -425,7 +481,6 @@ int copier_dai_params(struct copier_data *cd, struct comp_dev *dev,
425481 cd -> converter [IPC4_COPIER_GATEWAY_PIN ];
426482 return ret ;
427483 }
428-
429484 /* For ALH multi-gateway case, params->channels is a total multiplexed
430485 * number of channels. Demultiplexed number of channels for each individual
431486 * gateway comes in blob's struct ipc4_alh_multi_gtw_cfg.
0 commit comments