From: kernel test robot <lkp@intel.com>
To: Otavio Salvador <otavio@ossystems.com.br>
Cc: oe-kbuild-all@lists.linux.dev
Subject: [freescale-fslc:pr/639 125/24603] sound/soc/fsl/fsl_asrc_m2m.c:350:5: warning: no previous prototype for 'fsl_asrc_process_buffer_pre'
Date: Thu, 31 Aug 2023 15:47:11 +0800 [thread overview]
Message-ID: <202308311544.iKpPOmBL-lkp@intel.com> (raw)
Hi Shengjiu,
FYI, the error/warning still remains.
tree: https://github.com/Freescale/linux-fslc pr/639
head: 857fbf7cebaba3b1ffccc558deee1d13ac0e11d7
commit: 94e5356aea65959c2f670b94b36472658a40000f [125/24603] MLK-11398: ASoC: fsl_asrc: Add Memory to Memory support
config: sparc-allyesconfig (https://download.01.org/0day-ci/archive/20230831/202308311544.iKpPOmBL-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230831/202308311544.iKpPOmBL-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202308311544.iKpPOmBL-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from sound/soc/fsl/fsl_asrc.c:11:
sound/soc/fsl/fsl_asrc_m2m.c: In function 'fsl_asrc_dmaconfig':
sound/soc/fsl/fsl_asrc_m2m.c:244:69: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
244 | ret = dma_map_sg(&asrc->pdev->dev, sg, sg_nent, slave_config.direction);
| ~~~~~~~~~~~~^~~~~~~~~~
include/linux/dma-mapping.h:408:58: note: in definition of macro 'dma_map_sg'
408 | #define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, 0)
| ^
In file included from sound/soc/fsl/fsl_asrc.c:918:
sound/soc/fsl/fsl_asrc_m2m.c: At top level:
>> sound/soc/fsl/fsl_asrc_m2m.c:350:5: warning: no previous prototype for 'fsl_asrc_process_buffer_pre' [-Wmissing-prototypes]
350 | int fsl_asrc_process_buffer_pre(struct completion *complete,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>> sound/soc/fsl/fsl_asrc_m2m.c:372:5: warning: no previous prototype for 'fsl_asrc_process_buffer' [-Wmissing-prototypes]
372 | int fsl_asrc_process_buffer(struct fsl_asrc_pair *pair,
| ^~~~~~~~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c: In function 'fsl_asrc_process_buffer':
sound/soc/fsl/fsl_asrc_m2m.c:367:30: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
367 | DMA_MEM_TO_DEV); \
| ^~~~~~~~~~~~~~
include/linux/dma-mapping.h:409:62: note: in definition of macro 'dma_unmap_sg'
409 | #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
| ^
sound/soc/fsl/fsl_asrc_m2m.c:384:17: note: in expansion of macro 'mxc_asrc_dma_umap'
384 | mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
| ^~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c:369:30: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
369 | DMA_DEV_TO_MEM); \
| ^~~~~~~~~~~~~~
include/linux/dma-mapping.h:409:62: note: in definition of macro 'dma_unmap_sg'
409 | #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
| ^
sound/soc/fsl/fsl_asrc_m2m.c:384:17: note: in expansion of macro 'mxc_asrc_dma_umap'
384 | mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
| ^~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c:367:30: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
367 | DMA_MEM_TO_DEV); \
| ^~~~~~~~~~~~~~
include/linux/dma-mapping.h:409:62: note: in definition of macro 'dma_unmap_sg'
409 | #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
| ^
sound/soc/fsl/fsl_asrc_m2m.c:391:17: note: in expansion of macro 'mxc_asrc_dma_umap'
391 | mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
| ^~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c:369:30: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
369 | DMA_DEV_TO_MEM); \
| ^~~~~~~~~~~~~~
include/linux/dma-mapping.h:409:62: note: in definition of macro 'dma_unmap_sg'
409 | #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
| ^
sound/soc/fsl/fsl_asrc_m2m.c:391:17: note: in expansion of macro 'mxc_asrc_dma_umap'
391 | mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
| ^~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c:367:30: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
367 | DMA_MEM_TO_DEV); \
| ^~~~~~~~~~~~~~
include/linux/dma-mapping.h:409:62: note: in definition of macro 'dma_unmap_sg'
409 | #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
| ^
sound/soc/fsl/fsl_asrc_m2m.c:395:9: note: in expansion of macro 'mxc_asrc_dma_umap'
395 | mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
| ^~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c:369:30: warning: implicit conversion from 'enum dma_transfer_direction' to 'enum dma_data_direction' [-Wenum-conversion]
369 | DMA_DEV_TO_MEM); \
| ^~~~~~~~~~~~~~
include/linux/dma-mapping.h:409:62: note: in definition of macro 'dma_unmap_sg'
409 | #define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, 0)
| ^
sound/soc/fsl/fsl_asrc_m2m.c:395:9: note: in expansion of macro 'mxc_asrc_dma_umap'
395 | mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
| ^~~~~~~~~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c: In function 'fsl_asrc_calc_last_period_size':
>> sound/soc/fsl/fsl_asrc_m2m.c:670:22: warning: variable 'out_length' set but not used [-Wunused-but-set-variable]
670 | unsigned int out_length;
| ^~~~~~~~~~
sound/soc/fsl/fsl_asrc_m2m.c: In function 'fsl_asrc_m2m_resume':
>> sound/soc/fsl/fsl_asrc_m2m.c:1037:30: warning: variable 'm2m' set but not used [-Wunused-but-set-variable]
1037 | struct fsl_asrc_m2m *m2m;
| ^~~
vim +/fsl_asrc_process_buffer_pre +350 sound/soc/fsl/fsl_asrc_m2m.c
162
163 static int fsl_asrc_dmaconfig(struct fsl_asrc_pair *pair, struct dma_chan *chan,
164 u32 dma_addr, void *buf_addr, u32 buf_len,
165 bool dir, snd_pcm_format_t word_format)
166 {
167 struct dma_async_tx_descriptor *desc = pair->desc[dir];
168 struct fsl_asrc *asrc = pair->asrc;
169 struct fsl_asrc_priv *asrc_priv = asrc->private;
170 struct fsl_asrc_m2m *m2m = pair->private_m2m;
171 unsigned int sg_nent = m2m->sg_nodes[dir];
172 enum asrc_pair_index index = pair->index;
173 struct scatterlist *sg = m2m->sg[dir];
174 struct dma_slave_config slave_config;
175 enum dma_slave_buswidth buswidth;
176 int ret, i;
177
178 switch (snd_pcm_format_physical_width(word_format)) {
179 case 8:
180 buswidth = DMA_SLAVE_BUSWIDTH_1_BYTE;
181 break;
182 case 16:
183 buswidth = DMA_SLAVE_BUSWIDTH_2_BYTES;
184 break;
185 case 24:
186 buswidth = DMA_SLAVE_BUSWIDTH_3_BYTES;
187 break;
188 case 32:
189 buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
190 break;
191 default:
192 pair_err("invalid word width\n");
193 return -EINVAL;
194 }
195
196 memset(&slave_config, 0, sizeof(slave_config));
197 if (dir == IN) {
198 slave_config.direction = DMA_MEM_TO_DEV;
199 slave_config.dst_addr = dma_addr;
200 slave_config.dst_addr_width = buswidth;
201 if (!asrc_priv->soc->use_edma)
202 slave_config.dst_maxburst =
203 m2m->watermark[IN] * pair->channels;
204 else
205 slave_config.dst_maxburst = 1;
206 } else {
207 slave_config.direction = DMA_DEV_TO_MEM;
208 slave_config.src_addr = dma_addr;
209 slave_config.src_addr_width = buswidth;
210 if (!asrc_priv->soc->use_edma)
211 slave_config.src_maxburst =
212 m2m->watermark[OUT] * pair->channels;
213 else
214 slave_config.src_maxburst = 1;
215 }
216
217 ret = dmaengine_slave_config(chan, &slave_config);
218 if (ret) {
219 pair_err("failed to config dmaengine for %sput task: %d\n",
220 DIR_STR(dir), ret);
221 return -EINVAL;
222 }
223
224 sg_init_table(sg, sg_nent);
225 switch (sg_nent) {
226 case 1:
227 sg_init_one(sg, buf_addr, buf_len);
228 break;
229 case 2:
230 case 3:
231 case 4:
232 for (i = 0; i < (sg_nent - 1); i++)
233 sg_set_buf(&sg[i], buf_addr + i * ASRC_MAX_BUFFER_SIZE,
234 ASRC_MAX_BUFFER_SIZE);
235
236 sg_set_buf(&sg[i], buf_addr + i * ASRC_MAX_BUFFER_SIZE,
237 buf_len - ASRC_MAX_BUFFER_SIZE * i);
238 break;
239 default:
240 pair_err("invalid input DMA nodes number: %d\n", sg_nent);
241 return -EINVAL;
242 }
243
> 244 ret = dma_map_sg(&asrc->pdev->dev, sg, sg_nent, slave_config.direction);
245 if (ret != sg_nent) {
246 pair_err("failed to map DMA sg for %sput task\n", DIR_STR(dir));
247 return -EINVAL;
248 }
249
250 desc = dmaengine_prep_slave_sg(chan, sg, sg_nent,
251 slave_config.direction, DMA_PREP_INTERRUPT);
252 if (!desc) {
253 pair_err("failed to prepare dmaengine for %sput task\n",
254 DIR_STR(dir));
255 return -EINVAL;
256 }
257
258 pair->desc[dir] = desc;
259 pair->desc[dir]->callback = ASRC_xPUT_DMA_CALLBACK(dir);
260
261 desc->callback = ASRC_xPUT_DMA_CALLBACK(dir);
262 desc->callback_param = pair;
263
264 return 0;
265 }
266
267 static int fsl_asrc_prepare_io_buffer(struct fsl_asrc_pair *pair,
268 struct asrc_convert_buffer *pbuf, bool dir)
269 {
270 struct fsl_asrc_m2m *m2m = pair->private_m2m;
271 struct fsl_asrc *asrc = pair->asrc;
272 struct fsl_asrc_priv *asrc_priv = asrc->private;
273 unsigned int *dma_len = &m2m->dma_block[dir].length;
274 void *dma_vaddr = m2m->dma_block[dir].dma_vaddr;
275 struct dma_chan *dma_chan = pair->dma_chan[dir];
276 unsigned int buf_len, wm = m2m->watermark[dir];
277 unsigned int *sg_nodes = &m2m->sg_nodes[dir];
278 unsigned int last_period_size = m2m->last_period_size;
279 enum asrc_pair_index index = pair->index;
280 u32 word_size, fifo_addr;
281 void __user *buf_vaddr;
282
283 /* Clean the DMA buffer */
284 memset(dma_vaddr, 0, ASRC_DMA_BUFFER_SIZE);
285
286 if (dir == IN) {
287 buf_vaddr = (void __user *)pbuf->input_buffer_vaddr;
288 buf_len = pbuf->input_buffer_length;
289 } else {
290 buf_vaddr = (void __user *)pbuf->output_buffer_vaddr;
291 buf_len = pbuf->output_buffer_length;
292 }
293
294 word_size = snd_pcm_format_physical_width(m2m->word_format[dir]) / 8;
295
296 if (buf_len < word_size * pair->channels * wm ||
297 buf_len > ASRC_DMA_BUFFER_SIZE ||
298 (dir == OUT && buf_len < word_size * pair->channels * last_period_size)) {
299 pair_err("%sput buffer size is error: [%d]\n",
300 DIR_STR(dir), buf_len);
301 return -EINVAL;
302 }
303
304 /* Copy origin data into input buffer */
305 if (dir == IN && copy_from_user(dma_vaddr, buf_vaddr, buf_len))
306 return -EFAULT;
307
308 *dma_len = buf_len;
309 if (dir == OUT) {
310 *dma_len -= last_period_size * word_size * pair->channels;
311 *dma_len = *dma_len / (word_size * pair->channels) *
312 (word_size * pair->channels);
313 if (asrc_priv->soc->use_edma)
314 *dma_len = *dma_len / (word_size * pair->channels * m2m->watermark[OUT])
315 * (word_size * pair->channels * m2m->watermark[OUT]);
316 }
317
318 *sg_nodes = *dma_len / ASRC_MAX_BUFFER_SIZE;
319 if (*dma_len % ASRC_MAX_BUFFER_SIZE)
320 *sg_nodes += 1;
321
322 fifo_addr = asrc->paddr + REG_ASRDx(dir, index);
323
324 return fsl_asrc_dmaconfig(pair, dma_chan, fifo_addr, dma_vaddr,
325 *dma_len, dir, m2m->word_format[dir]);
326 }
327
328 static int fsl_asrc_prepare_buffer(struct fsl_asrc_pair *pair,
329 struct asrc_convert_buffer *pbuf)
330 {
331 struct fsl_asrc *asrc = pair->asrc;
332 enum asrc_pair_index index = pair->index;
333 int ret;
334
335 ret = fsl_asrc_prepare_io_buffer(pair, pbuf, IN);
336 if (ret) {
337 pair_err("failed to prepare input buffer: %d\n", ret);
338 return ret;
339 }
340
341 ret = fsl_asrc_prepare_io_buffer(pair, pbuf, OUT);
342 if (ret) {
343 pair_err("failed to prepare output buffer: %d\n", ret);
344 return ret;
345 }
346
347 return 0;
348 }
349
> 350 int fsl_asrc_process_buffer_pre(struct completion *complete,
351 enum asrc_pair_index index, bool dir)
352 {
353 if (!wait_for_completion_interruptible_timeout(complete, 10 * HZ)) {
354 pr_err("%sput DMA task timeout\n", DIR_STR(dir));
355 return -ETIME;
356 } else if (signal_pending(current)) {
357 pr_err("%sput task forcibly aborted\n", DIR_STR(dir));
358 return -ERESTARTSYS;
359 }
360
361 return 0;
362 }
363
364 #define mxc_asrc_dma_umap(dev, m2m) \
365 do { \
366 dma_unmap_sg(dev, m2m->sg[IN], m2m->sg_nodes[IN], \
367 DMA_MEM_TO_DEV); \
368 dma_unmap_sg(dev, m2m->sg[OUT], m2m->sg_nodes[OUT], \
369 DMA_DEV_TO_MEM); \
370 } while (0)
371
> 372 int fsl_asrc_process_buffer(struct fsl_asrc_pair *pair,
373 struct asrc_convert_buffer *pbuf)
374 {
375 struct fsl_asrc *asrc = pair->asrc;
376 struct fsl_asrc_m2m *m2m = pair->private_m2m;
377 enum asrc_pair_index index = pair->index;
378 unsigned long lock_flags;
379 int ret;
380
381 /* Check input task first */
382 ret = fsl_asrc_process_buffer_pre(&m2m->complete[IN], index, IN);
383 if (ret) {
384 mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
385 return ret;
386 }
387
388 /* ...then output task*/
389 ret = fsl_asrc_process_buffer_pre(&m2m->complete[OUT], index, OUT);
390 if (ret) {
391 mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
392 return ret;
393 }
394
> 395 mxc_asrc_dma_umap(&asrc->pdev->dev, m2m);
396
397 /* Fetch the remaining data */
398 spin_lock_irqsave(&m2m->lock, lock_flags);
399 if (!m2m->pair_hold) {
400 spin_unlock_irqrestore(&m2m->lock, lock_flags);
401 return -EFAULT;
402 }
403 spin_unlock_irqrestore(&m2m->lock, lock_flags);
404
405 fsl_asrc_read_last_FIFO(pair);
406
407 /* Update final lengths after getting last FIFO */
408 pbuf->input_buffer_length = m2m->dma_block[IN].length;
409 pbuf->output_buffer_length = m2m->dma_block[OUT].length;
410
411 if (copy_to_user((void __user *)pbuf->output_buffer_vaddr,
412 m2m->dma_block[OUT].dma_vaddr,
413 m2m->dma_block[OUT].length))
414 return -EFAULT;
415
416 return 0;
417 }
418
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2023-08-31 7:48 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202308311544.iKpPOmBL-lkp@intel.com \
--to=lkp@intel.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=otavio@ossystems.com.br \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.