From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [narmstrong-oxnas:oxnas/v5.18/dma 2/4] drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'dma_addr_t' {aka 'long long unsigned int'}
Date: Wed, 05 Jan 2022 20:24:26 +0800 [thread overview]
Message-ID: <202201052040.tCKTvGRC-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 28304 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/narmstrong/linux-oxnas.git oxnas/v5.18/dma
head: 8a4b70b0d54020bfae32041369422c3b41c0cd56
commit: 90ad9e59c40581027a2fd9134e4e160ad0a7f5d2 [2/4] dmaengine: Add Oxford Semiconductor OXNAS DMA Controller
config: ia64-allmodconfig (https://download.01.org/0day-ci/archive/20220105/202201052040.tCKTvGRC-lkp(a)intel.com/config)
compiler: ia64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/narmstrong/linux-oxnas.git/commit/?id=90ad9e59c40581027a2fd9134e4e160ad0a7f5d2
git remote add narmstrong-oxnas https://git.kernel.org/pub/scm/linux/kernel/git/narmstrong/linux-oxnas.git
git fetch --no-tags narmstrong-oxnas oxnas/v5.18/dma
git checkout 90ad9e59c40581027a2fd9134e4e160ad0a7f5d2
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/ata/ drivers/dma/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c: In function 'oxnas_dma_start_next':
>> drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:17: note: in expansion of macro 'dev_dbg'
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:75: note: format string is defined here
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 7 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:17: note: in expansion of macro 'dev_dbg'
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:83: note: format string is defined here
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/device.h:15,
from include/linux/platform_device.h:13,
from drivers/dma/oxnas_adma.c:13:
drivers/dma/oxnas_adma.c: In function 'oxnas_dma_prep_slave_sg':
>> drivers/dma/oxnas_adma.c:450:53: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'phys_addr_t' {aka 'long long unsigned int'} [-Wformat=]
450 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:450:25: note: in expansion of macro 'dev_err'
450 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:450:80: note: format string is defined here
450 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/device.h:15,
from include/linux/platform_device.h:13,
from drivers/dma/oxnas_adma.c:13:
drivers/dma/oxnas_adma.c:462:53: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'phys_addr_t' {aka 'long long unsigned int'} [-Wformat=]
462 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:462:25: note: in expansion of macro 'dev_err'
462 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:462:80: note: format string is defined here
462 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c:500:37: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
500 | dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:500:9: note: in expansion of macro 'dev_dbg'
500 | dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
| ^~~~~~~
drivers/dma/oxnas_adma.c:500:55: note: format string is defined here
500 | dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c:520:37: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
520 | dev_dbg(&dmadev->pdev->dev, "src = %p (%08x) dst = %p (%08x)\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:520:9: note: in expansion of macro 'dev_dbg'
vim +355 drivers/dma/oxnas_adma.c
298
299 static void oxnas_dma_start_next(struct oxnas_dma_channel *channel)
300 {
301 struct oxnas_dma_device *dmadev = channel->dmadev;
302 struct virt_dma_desc *vd = vchan_next_desc(&channel->vc);
303 struct oxnas_dma_desc *desc;
304 unsigned long ctrl_status;
305
306 if (!vd) {
307 channel->cur = NULL;
308 return;
309 }
310
311 list_del(&vd->node);
312
313 desc = container_of(&vd->tx, struct oxnas_dma_desc, vd.tx);
314 channel->cur = desc;
315
316 if (desc->type == OXNAS_DMA_TYPE_SIMPLE) {
317 /* Write the control/status value to the DMAC */
318 writel(desc->ctrl,
319 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_CTRL_STATUS));
320
321 /* Ensure control/status word makes it to the DMAC before
322 * we write address/length info
323 */
324 wmb();
325
326 /* Write the source addresses to the DMAC */
327 writel(desc->src_adr & OXNAS_DMA_ADR_MASK,
328 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_BASE_SRC_ADR));
329
330 /* Write the destination addresses to the DMAC */
331 writel(desc->dst_adr & OXNAS_DMA_ADR_MASK,
332 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_BASE_DST_ADR));
333
334 /* Write the length, with EOT configuration
335 * for the single transfer
336 */
337 writel(desc->len,
338 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_BYTE_CNT));
339
340 /* Ensure adr/len info makes it to DMAC before later modifications to
341 * control/status register due to starting the transfer, which happens in
342 * oxnas_dma_start()
343 */
344 wmb();
345
346 /* Setup channel data */
347 atomic_set(&channel->active, 1);
348
349 /* Single transfer mode, so unpause the DMA controller channel */
350 ctrl_status = readl(dmadev->dma_base +
351 DMA_CALC_REG_ADR(channel->id, DMA_CTRL_STATUS));
352 writel(ctrl_status & ~DMA_CTRL_STATUS_PAUSE,
353 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_CTRL_STATUS));
354
> 355 dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
356 channel->id, vd->tx.cookie,
357 desc->src_adr, desc->dst_adr,
358 desc->len & OXNAS_DMA_MAX_TRANSFER_LENGTH);
359 } else if (desc->type == OXNAS_DMA_TYPE_SG) {
360 /* Write to the SG-DMA channel's reset register to reset the control
361 * in case the previous SG-DMA transfer failed in some way, thus
362 * leaving the SG-DMA controller hung up part way through processing
363 * its SG list. The reset bits are self-clearing
364 */
365 writel(DMA_SG_RESETS_CONTROL,
366 dmadev->sgdma_base + DMA_SG_CALC_REG_ADR(channel->id, DMA_SG_RESETS));
367
368 /* Copy the sg_info structure */
369 memcpy(channel->sg_info, &desc->sg_info, sizeof(struct oxnas_dma_sg_info));
370
371 /* Ensure adr/len info makes it to DMAC before later modifications to
372 * control/status register due to starting the transfer, which happens in
373 * oxnas_dma_start()
374 */
375 wmb();
376
377 /* Write the pointer to the SG info struct into the Request Pointer reg */
378 writel(channel->p_sg_info,
379 dmadev->sgdma_base + DMA_SG_CALC_REG_ADR(channel->id, DMA_SG_REQ_PTR));
380
381 /* Setup channel data */
382 atomic_set(&channel->active, 1);
383
384 /* Start the transfert */
385 writel(DMA_SG_CONTROL_START |
386 DMA_SG_CONTROL_QUEUING_ENABLE |
387 DMA_SG_CONTROL_HBURST_ENABLE,
388 dmadev->sgdma_base + DMA_SG_CALC_REG_ADR(channel->id, DMA_SG_CONTROL));
389
390 dev_dbg(&dmadev->pdev->dev, "ch%d: started %d sg req with %d entries\n",
391 channel->id, vd->tx.cookie,
392 desc->entries);
393 }
394 }
395
396 static void oxnas_dma_sched(unsigned long data)
397 {
398 struct oxnas_dma_device *dmadev = (struct oxnas_dma_device *)data;
399 LIST_HEAD(head);
400
401 spin_lock_irq(&dmadev->lock);
402 list_splice_tail_init(&dmadev->pending, &head);
403 spin_unlock_irq(&dmadev->lock);
404
405 while (!list_empty(&head)) {
406 struct oxnas_dma_channel *ch = list_first_entry(&head,
407 struct oxnas_dma_channel, node);
408
409 spin_lock_irq(&ch->vc.lock);
410
411 list_del_init(&ch->node);
412 oxnas_dma_start_next(ch);
413
414 spin_unlock_irq(&ch->vc.lock);
415 }
416 }
417
418 static int oxnas_check_address(struct oxnas_dma_device *dmadev, dma_addr_t address)
419 {
420 int i;
421
422 for (i = 0 ; i < dmadev->authorized_types_count ; ++i) {
423 if (address >= dmadev->authorized_types[i].start &&
424 address < dmadev->authorized_types[i].end)
425 return dmadev->authorized_types[i].type;
426 }
427
428 return -1;
429 }
430
431 static struct dma_async_tx_descriptor *oxnas_dma_prep_slave_sg(struct dma_chan *chan,
432 struct scatterlist *sgl,
433 unsigned int sglen,
434 enum dma_transfer_direction dir,
435 unsigned long flags, void *context)
436 {
437 struct oxnas_dma_channel *channel = container_of(chan, struct oxnas_dma_channel, vc.chan);
438 struct oxnas_dma_device *dmadev = channel->dmadev;
439 struct oxnas_dma_desc *desc;
440 struct scatterlist *sgent;
441 struct oxnas_dma_sg_entry *entry_mem = NULL, *prev_entry_mem = NULL;
442 struct oxnas_dma_sg_entry *entry_dev = NULL;
443 unsigned int i;
444 int src_memory = OXNAS_DMA_DREQ_MEMORY;
445 int dst_memory = OXNAS_DMA_DREQ_MEMORY;
446
447 if (dir == DMA_DEV_TO_MEM) {
448 src_memory = oxnas_check_address(dmadev, channel->cfg.src_addr);
449 if (src_memory == -1) {
> 450 dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
451 channel->cfg.src_addr);
452 return NULL;
453 }
454
455 if (src_memory == OXNAS_DMA_DREQ_MEMORY) {
456 dev_err(&dmadev->pdev->dev, "In DEV_TO_MEM, src cannot be memory\n");
457 return NULL;
458 }
459 } else if (dir == DMA_MEM_TO_DEV) {
460 dst_memory = oxnas_check_address(dmadev, channel->cfg.dst_addr);
461 if (dst_memory == -1) {
462 dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
463 channel->cfg.dst_addr);
464 return NULL;
465 }
466
467 if (dst_memory == OXNAS_DMA_DREQ_MEMORY) {
468 dev_err(&dmadev->pdev->dev, "In MEM_TO_DEV, dst cannot be memory\n");
469 return NULL;
470 }
471 } else {
472 dev_err(&dmadev->pdev->dev, "invalid direction\n");
473 return NULL;
474 }
475
476 if (atomic_read(&dmadev->free_entries_count) < (sglen + 1)) {
477 dev_err(&dmadev->pdev->dev, "Missing sg entries...\n");
478 return NULL;
479 }
480
481 desc = kzalloc(sizeof(*desc), GFP_KERNEL);
482 if (unlikely(!desc))
483 return NULL;
484 desc->channel = channel;
485
486 INIT_LIST_HEAD(&desc->sg_entries);
487 desc->entries = 0;
488
489 /* Device single entry */
490 entry_dev = list_first_entry_or_null(&dmadev->free_entries,
491 struct oxnas_dma_sg_entry, entry);
492 if (!entry_dev) {
493 dev_err(&dmadev->pdev->dev, "Fatal error: Missing dev sg entry...\n");
494 goto entries_cleanup;
495 }
496
497 atomic_dec(&dmadev->free_entries_count);
498 list_move(&entry_dev->entry, &desc->sg_entries);
499 ++desc->entries;
500 dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
501
502 entry_dev->next_entry = NULL;
503 entry_dev->p_next_entry = 0;
504 entry_dev->data_length = 0; /* Completed by mem sg entries */
505
506 if (dir == DMA_DEV_TO_MEM) {
507 entry_dev->data_addr = channel->cfg.src_addr & OXNAS_DMA_ADR_MASK;
508 desc->sg_info.src_entries = entry_dev;
509 desc->sg_info.p_src_entries = entry_dev->this_paddr;
510
511 dev_dbg(&dmadev->pdev->dev, "src set %p\n", entry_dev);
512 } else if (dir == DMA_MEM_TO_DEV) {
513 entry_dev->data_addr = channel->cfg.dst_addr & OXNAS_DMA_ADR_MASK;
514 desc->sg_info.dst_entries = entry_dev;
515 desc->sg_info.p_dst_entries = entry_dev->this_paddr;
516
517 dev_dbg(&dmadev->pdev->dev, "dst set %p\n", entry_dev);
518 }
519
520 dev_dbg(&dmadev->pdev->dev, "src = %p (%08x) dst = %p (%08x)\n",
521 desc->sg_info.src_entries, desc->sg_info.p_src_entries,
522 desc->sg_info.dst_entries, desc->sg_info.p_dst_entries);
523
524 /* Memory entries */
525 for_each_sg(sgl, sgent, sglen, i) {
526 entry_mem = list_first_entry_or_null(&dmadev->free_entries,
527 struct oxnas_dma_sg_entry, entry);
528 if (!entry_mem) {
529 dev_err(&dmadev->pdev->dev, "Fatal error: Missing mem sg entries...\n");
530 goto entries_cleanup;
531 }
532
533 atomic_dec(&dmadev->free_entries_count);
534 list_move(&entry_mem->entry, &desc->sg_entries);
535 ++desc->entries;
536 dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n",
537 entry_mem, entry_mem->this_paddr);
538
539 /* Fill the linked list */
540 if (prev_entry_mem) {
541 prev_entry_mem->next_entry = entry_mem;
542 prev_entry_mem->p_next_entry = entry_mem->this_paddr;
543 } else {
544 if (dir == DMA_DEV_TO_MEM) {
545 desc->sg_info.dst_entries = entry_mem;
546 desc->sg_info.p_dst_entries = entry_mem->this_paddr;
547 dev_dbg(&dmadev->pdev->dev, "src set %p\n", entry_mem);
548 } else if (dir == DMA_MEM_TO_DEV) {
549 desc->sg_info.src_entries = entry_mem;
550 desc->sg_info.p_src_entries = entry_mem->this_paddr;
551 dev_dbg(&dmadev->pdev->dev, "dst set %p\n", entry_mem);
552 }
553
554 dev_dbg(&dmadev->pdev->dev, "src = %p (%08x) dst = %p (%08x)\n",
555 desc->sg_info.src_entries, desc->sg_info.p_src_entries,
556 desc->sg_info.dst_entries, desc->sg_info.p_dst_entries);
557 }
558 prev_entry_mem = entry_mem;
559
560 /* Fill the entry from the SG */
561 entry_mem->next_entry = NULL;
562 entry_mem->p_next_entry = 0;
563
564 entry_mem->data_addr = sg_dma_address(sgent) & OXNAS_DMA_ADR_MASK;
565 entry_mem->data_length = sg_dma_len(sgent);
566 dev_dbg(&dmadev->pdev->dev, "sg = %08x len = %d\n",
567 sg_dma_address(sgent), sg_dma_len(sgent));
568
569 /* Add to dev sg length */
570 entry_dev->data_length += sg_dma_len(sgent);
571 }
572 dev_dbg(&dmadev->pdev->dev, "allocated %d sg entries\n", desc->entries);
573
574 desc->sg_info.qualifier = FIELD_PREP(OXNAS_DMA_SG_CHANNEL, channel->id) |
575 OXNAS_DMA_SG_QUALIFIER;
576
577 if (dir == DMA_DEV_TO_MEM)
578 desc->sg_info.qualifier |= FIELD_PREP(OXNAS_DMA_SG_SRC_EOT, 2);
579 else if (dir == DMA_MEM_TO_DEV)
580 desc->sg_info.qualifier |= FIELD_PREP(OXNAS_DMA_SG_DST_EOT, 2);
581
582 desc->sg_info.control = (DMA_CTRL_STATUS_INTERRUPT_ENABLE |
583 DMA_CTRL_STATUS_FAIR_SHARE_ARB |
584 DMA_CTRL_STATUS_INTR_CLEAR_ENABLE);
585 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_SRC_DREQ, src_memory);
586 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_DEST_DREQ, dst_memory);
587
588 if (dir == DMA_DEV_TO_MEM) {
589 desc->sg_info.control |= DMA_CTRL_STATUS_SRC_ADR_MODE;
590 desc->sg_info.control &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
591 desc->sg_info.control |= DMA_CTRL_STATUS_DEST_ADR_MODE;
592 desc->sg_info.control &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
593 } else if (dir == DMA_MEM_TO_DEV) {
594 desc->sg_info.control |= DMA_CTRL_STATUS_SRC_ADR_MODE;
595 desc->sg_info.control &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
596 desc->sg_info.control |= DMA_CTRL_STATUS_DEST_ADR_MODE;
597 desc->sg_info.control &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
598 }
599 desc->sg_info.control |= DMA_CTRL_STATUS_TRANSFER_MODE_A;
600 desc->sg_info.control |= DMA_CTRL_STATUS_TRANSFER_MODE_B;
601 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_DIR, OXNAS_DMA_A_TO_B);
602
603 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_SRC_WIDTH,
604 OXNAS_DMA_TRANSFER_WIDTH_32BITS);
605 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_DEST_WIDTH,
606 OXNAS_DMA_TRANSFER_WIDTH_32BITS);
607 desc->sg_info.control &= ~DMA_CTRL_STATUS_STARVE_LOW_PRIORITY;
608
609 desc->type = OXNAS_DMA_TYPE_SG;
610
611 return vchan_tx_prep(&channel->vc, &desc->vd, flags);
612
613 entries_cleanup:
614 /* Put back all entries in the free entries... */
615 list_splice_tail_init(&desc->sg_entries, &dmadev->free_entries);
616 atomic_add(desc->entries, &dmadev->free_entries_count);
617 dev_dbg(&dmadev->pdev->dev, "freed %d sg entries\n", desc->entries);
618
619 kfree(desc);
620
621 return NULL;
622 }
623
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Neil Armstrong <narmstrong@baylibre.com>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org
Subject: [narmstrong-oxnas:oxnas/v5.18/dma 2/4] drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'dma_addr_t' {aka 'long long unsigned int'}
Date: Wed, 5 Jan 2022 20:24:26 +0800 [thread overview]
Message-ID: <202201052040.tCKTvGRC-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/narmstrong/linux-oxnas.git oxnas/v5.18/dma
head: 8a4b70b0d54020bfae32041369422c3b41c0cd56
commit: 90ad9e59c40581027a2fd9134e4e160ad0a7f5d2 [2/4] dmaengine: Add Oxford Semiconductor OXNAS DMA Controller
config: ia64-allmodconfig (https://download.01.org/0day-ci/archive/20220105/202201052040.tCKTvGRC-lkp@intel.com/config)
compiler: ia64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/narmstrong/linux-oxnas.git/commit/?id=90ad9e59c40581027a2fd9134e4e160ad0a7f5d2
git remote add narmstrong-oxnas https://git.kernel.org/pub/scm/linux/kernel/git/narmstrong/linux-oxnas.git
git fetch --no-tags narmstrong-oxnas oxnas/v5.18/dma
git checkout 90ad9e59c40581027a2fd9134e4e160ad0a7f5d2
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/ata/ drivers/dma/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c: In function 'oxnas_dma_start_next':
>> drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:17: note: in expansion of macro 'dev_dbg'
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:75: note: format string is defined here
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 7 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:17: note: in expansion of macro 'dev_dbg'
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:355:83: note: format string is defined here
355 | dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/device.h:15,
from include/linux/platform_device.h:13,
from drivers/dma/oxnas_adma.c:13:
drivers/dma/oxnas_adma.c: In function 'oxnas_dma_prep_slave_sg':
>> drivers/dma/oxnas_adma.c:450:53: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'phys_addr_t' {aka 'long long unsigned int'} [-Wformat=]
450 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:450:25: note: in expansion of macro 'dev_err'
450 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:450:80: note: format string is defined here
450 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/device.h:15,
from include/linux/platform_device.h:13,
from drivers/dma/oxnas_adma.c:13:
drivers/dma/oxnas_adma.c:462:53: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'phys_addr_t' {aka 'long long unsigned int'} [-Wformat=]
462 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:462:25: note: in expansion of macro 'dev_err'
462 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ^~~~~~~
drivers/dma/oxnas_adma.c:462:80: note: format string is defined here
462 | dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c:500:37: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
500 | dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:500:9: note: in expansion of macro 'dev_dbg'
500 | dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
| ^~~~~~~
drivers/dma/oxnas_adma.c:500:55: note: format string is defined here
500 | dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
| ~~~^
| |
| unsigned int
| %08llx
In file included from include/linux/printk.h:555,
from include/linux/numa.h:24,
from arch/ia64/include/asm/nodedata.h:14,
from arch/ia64/include/asm/processor.h:81,
from arch/ia64/include/asm/timex.h:15,
from include/linux/timex.h:65,
from include/linux/time32.h:13,
from include/linux/time.h:60,
from include/linux/stat.h:19,
from include/linux/module.h:13,
from drivers/dma/oxnas_adma.c:7:
drivers/dma/oxnas_adma.c:520:37: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'dma_addr_t' {aka 'long long unsigned int'} [-Wformat=]
520 | dev_dbg(&dmadev->pdev->dev, "src = %p (%08x) dst = %p (%08x)\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _dynamic_func_call(fmt,__dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/dma/oxnas_adma.c:520:9: note: in expansion of macro 'dev_dbg'
vim +355 drivers/dma/oxnas_adma.c
298
299 static void oxnas_dma_start_next(struct oxnas_dma_channel *channel)
300 {
301 struct oxnas_dma_device *dmadev = channel->dmadev;
302 struct virt_dma_desc *vd = vchan_next_desc(&channel->vc);
303 struct oxnas_dma_desc *desc;
304 unsigned long ctrl_status;
305
306 if (!vd) {
307 channel->cur = NULL;
308 return;
309 }
310
311 list_del(&vd->node);
312
313 desc = container_of(&vd->tx, struct oxnas_dma_desc, vd.tx);
314 channel->cur = desc;
315
316 if (desc->type == OXNAS_DMA_TYPE_SIMPLE) {
317 /* Write the control/status value to the DMAC */
318 writel(desc->ctrl,
319 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_CTRL_STATUS));
320
321 /* Ensure control/status word makes it to the DMAC before
322 * we write address/length info
323 */
324 wmb();
325
326 /* Write the source addresses to the DMAC */
327 writel(desc->src_adr & OXNAS_DMA_ADR_MASK,
328 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_BASE_SRC_ADR));
329
330 /* Write the destination addresses to the DMAC */
331 writel(desc->dst_adr & OXNAS_DMA_ADR_MASK,
332 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_BASE_DST_ADR));
333
334 /* Write the length, with EOT configuration
335 * for the single transfer
336 */
337 writel(desc->len,
338 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_BYTE_CNT));
339
340 /* Ensure adr/len info makes it to DMAC before later modifications to
341 * control/status register due to starting the transfer, which happens in
342 * oxnas_dma_start()
343 */
344 wmb();
345
346 /* Setup channel data */
347 atomic_set(&channel->active, 1);
348
349 /* Single transfer mode, so unpause the DMA controller channel */
350 ctrl_status = readl(dmadev->dma_base +
351 DMA_CALC_REG_ADR(channel->id, DMA_CTRL_STATUS));
352 writel(ctrl_status & ~DMA_CTRL_STATUS_PAUSE,
353 dmadev->dma_base + DMA_CALC_REG_ADR(channel->id, DMA_CTRL_STATUS));
354
> 355 dev_dbg(&dmadev->pdev->dev, "ch%d: started req %d from %08x to %08x, %lubytes\n",
356 channel->id, vd->tx.cookie,
357 desc->src_adr, desc->dst_adr,
358 desc->len & OXNAS_DMA_MAX_TRANSFER_LENGTH);
359 } else if (desc->type == OXNAS_DMA_TYPE_SG) {
360 /* Write to the SG-DMA channel's reset register to reset the control
361 * in case the previous SG-DMA transfer failed in some way, thus
362 * leaving the SG-DMA controller hung up part way through processing
363 * its SG list. The reset bits are self-clearing
364 */
365 writel(DMA_SG_RESETS_CONTROL,
366 dmadev->sgdma_base + DMA_SG_CALC_REG_ADR(channel->id, DMA_SG_RESETS));
367
368 /* Copy the sg_info structure */
369 memcpy(channel->sg_info, &desc->sg_info, sizeof(struct oxnas_dma_sg_info));
370
371 /* Ensure adr/len info makes it to DMAC before later modifications to
372 * control/status register due to starting the transfer, which happens in
373 * oxnas_dma_start()
374 */
375 wmb();
376
377 /* Write the pointer to the SG info struct into the Request Pointer reg */
378 writel(channel->p_sg_info,
379 dmadev->sgdma_base + DMA_SG_CALC_REG_ADR(channel->id, DMA_SG_REQ_PTR));
380
381 /* Setup channel data */
382 atomic_set(&channel->active, 1);
383
384 /* Start the transfert */
385 writel(DMA_SG_CONTROL_START |
386 DMA_SG_CONTROL_QUEUING_ENABLE |
387 DMA_SG_CONTROL_HBURST_ENABLE,
388 dmadev->sgdma_base + DMA_SG_CALC_REG_ADR(channel->id, DMA_SG_CONTROL));
389
390 dev_dbg(&dmadev->pdev->dev, "ch%d: started %d sg req with %d entries\n",
391 channel->id, vd->tx.cookie,
392 desc->entries);
393 }
394 }
395
396 static void oxnas_dma_sched(unsigned long data)
397 {
398 struct oxnas_dma_device *dmadev = (struct oxnas_dma_device *)data;
399 LIST_HEAD(head);
400
401 spin_lock_irq(&dmadev->lock);
402 list_splice_tail_init(&dmadev->pending, &head);
403 spin_unlock_irq(&dmadev->lock);
404
405 while (!list_empty(&head)) {
406 struct oxnas_dma_channel *ch = list_first_entry(&head,
407 struct oxnas_dma_channel, node);
408
409 spin_lock_irq(&ch->vc.lock);
410
411 list_del_init(&ch->node);
412 oxnas_dma_start_next(ch);
413
414 spin_unlock_irq(&ch->vc.lock);
415 }
416 }
417
418 static int oxnas_check_address(struct oxnas_dma_device *dmadev, dma_addr_t address)
419 {
420 int i;
421
422 for (i = 0 ; i < dmadev->authorized_types_count ; ++i) {
423 if (address >= dmadev->authorized_types[i].start &&
424 address < dmadev->authorized_types[i].end)
425 return dmadev->authorized_types[i].type;
426 }
427
428 return -1;
429 }
430
431 static struct dma_async_tx_descriptor *oxnas_dma_prep_slave_sg(struct dma_chan *chan,
432 struct scatterlist *sgl,
433 unsigned int sglen,
434 enum dma_transfer_direction dir,
435 unsigned long flags, void *context)
436 {
437 struct oxnas_dma_channel *channel = container_of(chan, struct oxnas_dma_channel, vc.chan);
438 struct oxnas_dma_device *dmadev = channel->dmadev;
439 struct oxnas_dma_desc *desc;
440 struct scatterlist *sgent;
441 struct oxnas_dma_sg_entry *entry_mem = NULL, *prev_entry_mem = NULL;
442 struct oxnas_dma_sg_entry *entry_dev = NULL;
443 unsigned int i;
444 int src_memory = OXNAS_DMA_DREQ_MEMORY;
445 int dst_memory = OXNAS_DMA_DREQ_MEMORY;
446
447 if (dir == DMA_DEV_TO_MEM) {
448 src_memory = oxnas_check_address(dmadev, channel->cfg.src_addr);
449 if (src_memory == -1) {
> 450 dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
451 channel->cfg.src_addr);
452 return NULL;
453 }
454
455 if (src_memory == OXNAS_DMA_DREQ_MEMORY) {
456 dev_err(&dmadev->pdev->dev, "In DEV_TO_MEM, src cannot be memory\n");
457 return NULL;
458 }
459 } else if (dir == DMA_MEM_TO_DEV) {
460 dst_memory = oxnas_check_address(dmadev, channel->cfg.dst_addr);
461 if (dst_memory == -1) {
462 dev_err(&dmadev->pdev->dev, "invalid memory address %08x\n",
463 channel->cfg.dst_addr);
464 return NULL;
465 }
466
467 if (dst_memory == OXNAS_DMA_DREQ_MEMORY) {
468 dev_err(&dmadev->pdev->dev, "In MEM_TO_DEV, dst cannot be memory\n");
469 return NULL;
470 }
471 } else {
472 dev_err(&dmadev->pdev->dev, "invalid direction\n");
473 return NULL;
474 }
475
476 if (atomic_read(&dmadev->free_entries_count) < (sglen + 1)) {
477 dev_err(&dmadev->pdev->dev, "Missing sg entries...\n");
478 return NULL;
479 }
480
481 desc = kzalloc(sizeof(*desc), GFP_KERNEL);
482 if (unlikely(!desc))
483 return NULL;
484 desc->channel = channel;
485
486 INIT_LIST_HEAD(&desc->sg_entries);
487 desc->entries = 0;
488
489 /* Device single entry */
490 entry_dev = list_first_entry_or_null(&dmadev->free_entries,
491 struct oxnas_dma_sg_entry, entry);
492 if (!entry_dev) {
493 dev_err(&dmadev->pdev->dev, "Fatal error: Missing dev sg entry...\n");
494 goto entries_cleanup;
495 }
496
497 atomic_dec(&dmadev->free_entries_count);
498 list_move(&entry_dev->entry, &desc->sg_entries);
499 ++desc->entries;
500 dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n", entry_dev, entry_dev->this_paddr);
501
502 entry_dev->next_entry = NULL;
503 entry_dev->p_next_entry = 0;
504 entry_dev->data_length = 0; /* Completed by mem sg entries */
505
506 if (dir == DMA_DEV_TO_MEM) {
507 entry_dev->data_addr = channel->cfg.src_addr & OXNAS_DMA_ADR_MASK;
508 desc->sg_info.src_entries = entry_dev;
509 desc->sg_info.p_src_entries = entry_dev->this_paddr;
510
511 dev_dbg(&dmadev->pdev->dev, "src set %p\n", entry_dev);
512 } else if (dir == DMA_MEM_TO_DEV) {
513 entry_dev->data_addr = channel->cfg.dst_addr & OXNAS_DMA_ADR_MASK;
514 desc->sg_info.dst_entries = entry_dev;
515 desc->sg_info.p_dst_entries = entry_dev->this_paddr;
516
517 dev_dbg(&dmadev->pdev->dev, "dst set %p\n", entry_dev);
518 }
519
520 dev_dbg(&dmadev->pdev->dev, "src = %p (%08x) dst = %p (%08x)\n",
521 desc->sg_info.src_entries, desc->sg_info.p_src_entries,
522 desc->sg_info.dst_entries, desc->sg_info.p_dst_entries);
523
524 /* Memory entries */
525 for_each_sg(sgl, sgent, sglen, i) {
526 entry_mem = list_first_entry_or_null(&dmadev->free_entries,
527 struct oxnas_dma_sg_entry, entry);
528 if (!entry_mem) {
529 dev_err(&dmadev->pdev->dev, "Fatal error: Missing mem sg entries...\n");
530 goto entries_cleanup;
531 }
532
533 atomic_dec(&dmadev->free_entries_count);
534 list_move(&entry_mem->entry, &desc->sg_entries);
535 ++desc->entries;
536 dev_dbg(&dmadev->pdev->dev, "got entry %p (%08x)\n",
537 entry_mem, entry_mem->this_paddr);
538
539 /* Fill the linked list */
540 if (prev_entry_mem) {
541 prev_entry_mem->next_entry = entry_mem;
542 prev_entry_mem->p_next_entry = entry_mem->this_paddr;
543 } else {
544 if (dir == DMA_DEV_TO_MEM) {
545 desc->sg_info.dst_entries = entry_mem;
546 desc->sg_info.p_dst_entries = entry_mem->this_paddr;
547 dev_dbg(&dmadev->pdev->dev, "src set %p\n", entry_mem);
548 } else if (dir == DMA_MEM_TO_DEV) {
549 desc->sg_info.src_entries = entry_mem;
550 desc->sg_info.p_src_entries = entry_mem->this_paddr;
551 dev_dbg(&dmadev->pdev->dev, "dst set %p\n", entry_mem);
552 }
553
554 dev_dbg(&dmadev->pdev->dev, "src = %p (%08x) dst = %p (%08x)\n",
555 desc->sg_info.src_entries, desc->sg_info.p_src_entries,
556 desc->sg_info.dst_entries, desc->sg_info.p_dst_entries);
557 }
558 prev_entry_mem = entry_mem;
559
560 /* Fill the entry from the SG */
561 entry_mem->next_entry = NULL;
562 entry_mem->p_next_entry = 0;
563
564 entry_mem->data_addr = sg_dma_address(sgent) & OXNAS_DMA_ADR_MASK;
565 entry_mem->data_length = sg_dma_len(sgent);
566 dev_dbg(&dmadev->pdev->dev, "sg = %08x len = %d\n",
567 sg_dma_address(sgent), sg_dma_len(sgent));
568
569 /* Add to dev sg length */
570 entry_dev->data_length += sg_dma_len(sgent);
571 }
572 dev_dbg(&dmadev->pdev->dev, "allocated %d sg entries\n", desc->entries);
573
574 desc->sg_info.qualifier = FIELD_PREP(OXNAS_DMA_SG_CHANNEL, channel->id) |
575 OXNAS_DMA_SG_QUALIFIER;
576
577 if (dir == DMA_DEV_TO_MEM)
578 desc->sg_info.qualifier |= FIELD_PREP(OXNAS_DMA_SG_SRC_EOT, 2);
579 else if (dir == DMA_MEM_TO_DEV)
580 desc->sg_info.qualifier |= FIELD_PREP(OXNAS_DMA_SG_DST_EOT, 2);
581
582 desc->sg_info.control = (DMA_CTRL_STATUS_INTERRUPT_ENABLE |
583 DMA_CTRL_STATUS_FAIR_SHARE_ARB |
584 DMA_CTRL_STATUS_INTR_CLEAR_ENABLE);
585 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_SRC_DREQ, src_memory);
586 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_DEST_DREQ, dst_memory);
587
588 if (dir == DMA_DEV_TO_MEM) {
589 desc->sg_info.control |= DMA_CTRL_STATUS_SRC_ADR_MODE;
590 desc->sg_info.control &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
591 desc->sg_info.control |= DMA_CTRL_STATUS_DEST_ADR_MODE;
592 desc->sg_info.control &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
593 } else if (dir == DMA_MEM_TO_DEV) {
594 desc->sg_info.control |= DMA_CTRL_STATUS_SRC_ADR_MODE;
595 desc->sg_info.control &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
596 desc->sg_info.control |= DMA_CTRL_STATUS_DEST_ADR_MODE;
597 desc->sg_info.control &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
598 }
599 desc->sg_info.control |= DMA_CTRL_STATUS_TRANSFER_MODE_A;
600 desc->sg_info.control |= DMA_CTRL_STATUS_TRANSFER_MODE_B;
601 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_DIR, OXNAS_DMA_A_TO_B);
602
603 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_SRC_WIDTH,
604 OXNAS_DMA_TRANSFER_WIDTH_32BITS);
605 desc->sg_info.control |= FIELD_PREP(DMA_CTRL_STATUS_DEST_WIDTH,
606 OXNAS_DMA_TRANSFER_WIDTH_32BITS);
607 desc->sg_info.control &= ~DMA_CTRL_STATUS_STARVE_LOW_PRIORITY;
608
609 desc->type = OXNAS_DMA_TYPE_SG;
610
611 return vchan_tx_prep(&channel->vc, &desc->vd, flags);
612
613 entries_cleanup:
614 /* Put back all entries in the free entries... */
615 list_splice_tail_init(&desc->sg_entries, &dmadev->free_entries);
616 atomic_add(desc->entries, &dmadev->free_entries_count);
617 dev_dbg(&dmadev->pdev->dev, "freed %d sg entries\n", desc->entries);
618
619 kfree(desc);
620
621 return NULL;
622 }
623
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
next reply other threads:[~2022-01-05 12:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-05 12:24 kernel test robot [this message]
2022-01-05 12:24 ` [narmstrong-oxnas:oxnas/v5.18/dma 2/4] drivers/dma/oxnas_adma.c:355:45: warning: format '%x' expects argument of type 'unsigned int', but argument 6 has type 'dma_addr_t' {aka 'long long unsigned int'} kernel test robot
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=202201052040.tCKTvGRC-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/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.