Re: [PATCH v11 2/4] dmaengine: tegra: Add tegra gpcdma driver

From: kernel test robot
Date: Fri Oct 29 2021 - 10:29:13 EST


Hi Akhil,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on robh/for-next]
[also build test WARNING on vkoul-dmaengine/next arm64/for-next/core v5.15-rc7 next-20211029]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Akhil-R/Add-NVIDIA-Tegra-GPC-DMA-driver/20211028-212920
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: openrisc-randconfig-r031-20211029 (attached as .config)
compiler: or1k-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://github.com/0day-ci/linux/commit/020f86b695432467db8b697540871173f6d751c8
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Akhil-R/Add-NVIDIA-Tegra-GPC-DMA-driver/20211028-212920
git checkout 020f86b695432467db8b697540871173f6d751c8
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=openrisc

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All warnings (new ones prefixed by >>):

include/linux/minmax.h:89:28: note: in expansion of macro 'min'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
26 | (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
36 | __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
include/linux/minmax.h:52:25: note: in expansion of macro '__careful_cmp'
52 | #define max(x, y) __careful_cmp(x, y, >)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:45: note: in expansion of macro 'max'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
drivers/dma/tegra186-gpc-dma.c:692:9: note: in expansion of macro 'clamp'
692 | clamp(burst_mmio_width, TEGRA_GPCDMA_MMIOSEQ_BURST_MIN,
| ^~~~~
include/linux/minmax.h:20:35: warning: comparison of distinct pointer types lacks a cast
20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^~
include/linux/minmax.h:28:40: note: in definition of macro '__cmp'
28 | #define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
| ^
include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
45 | #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:28: note: in expansion of macro 'min'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
26 | (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
36 | __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
include/linux/minmax.h:52:25: note: in expansion of macro '__careful_cmp'
52 | #define max(x, y) __careful_cmp(x, y, >)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:45: note: in expansion of macro 'max'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
drivers/dma/tegra186-gpc-dma.c:692:9: note: in expansion of macro 'clamp'
692 | clamp(burst_mmio_width, TEGRA_GPCDMA_MMIOSEQ_BURST_MIN,
| ^~~~~
include/linux/minmax.h:20:35: warning: comparison of distinct pointer types lacks a cast
20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^~
include/linux/minmax.h:31:24: note: in definition of macro '__cmp_once'
31 | typeof(x) unique_x = (x); \
| ^
include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
45 | #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:28: note: in expansion of macro 'min'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
26 | (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
36 | __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
include/linux/minmax.h:52:25: note: in expansion of macro '__careful_cmp'
52 | #define max(x, y) __careful_cmp(x, y, >)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:45: note: in expansion of macro 'max'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
drivers/dma/tegra186-gpc-dma.c:692:9: note: in expansion of macro 'clamp'
692 | clamp(burst_mmio_width, TEGRA_GPCDMA_MMIOSEQ_BURST_MIN,
| ^~~~~
include/linux/minmax.h:20:35: warning: comparison of distinct pointer types lacks a cast
20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^~
include/linux/minmax.h:31:39: note: in definition of macro '__cmp_once'
31 | typeof(x) unique_x = (x); \
| ^
include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
45 | #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:28: note: in expansion of macro 'min'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
26 | (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
36 | __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
include/linux/minmax.h:52:25: note: in expansion of macro '__careful_cmp'
52 | #define max(x, y) __careful_cmp(x, y, >)
| ^~~~~~~~~~~~~
include/linux/minmax.h:89:45: note: in expansion of macro 'max'
89 | #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
| ^~~
drivers/dma/tegra186-gpc-dma.c:692:9: note: in expansion of macro 'clamp'
692 | clamp(burst_mmio_width, TEGRA_GPCDMA_MMIOSEQ_BURST_MIN,
| ^~~~~
drivers/dma/tegra186-gpc-dma.c: In function 'tegra_dma_prep_dma_memset':
>> drivers/dma/tegra186-gpc-dma.c:785:74: warning: right shift count >= width of type [-Wshift-count-overflow]
785 | FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_DST_PTR, (dest >> 32));
| ^~
drivers/dma/tegra186-gpc-dma.c: In function 'tegra_dma_prep_dma_memcpy':
drivers/dma/tegra186-gpc-dma.c:852:65: warning: right shift count >= width of type [-Wshift-count-overflow]
852 | FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_SRC_PTR, (src >> 32));
| ^~
drivers/dma/tegra186-gpc-dma.c:854:66: warning: right shift count >= width of type [-Wshift-count-overflow]
854 | FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_DST_PTR, (dest >> 32));
| ^~
drivers/dma/tegra186-gpc-dma.c: In function 'tegra_dma_prep_slave_sg':
drivers/dma/tegra186-gpc-dma.c:960:81: warning: right shift count >= width of type [-Wshift-count-overflow]
960 | FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_SRC_PTR, (mem >> 32));
| ^~
drivers/dma/tegra186-gpc-dma.c:965:81: warning: right shift count >= width of type [-Wshift-count-overflow]
965 | FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_DST_PTR, (mem >> 32));
| ^~
cc1: some warnings being treated as errors


vim +785 drivers/dma/tegra186-gpc-dma.c

676
677 static unsigned int get_burst_size(struct tegra_dma_channel *tdc,
678 u32 burst_size, enum dma_slave_buswidth slave_bw,
679 int len)
680 {
681 unsigned int burst_mmio_width, burst_byte;
682
683 /*
684 * burst_size from client is in terms of the bus_width.
685 * convert that into words.
686 * If burst_size is not specified from client, then use
687 * len to calculate the optimum burst size
688 */
689 burst_byte = burst_size ? burst_size * slave_bw : len;
690 burst_mmio_width = burst_byte / 4;
691
> 692 clamp(burst_mmio_width, TEGRA_GPCDMA_MMIOSEQ_BURST_MIN,
693 TEGRA_GPCDMA_MMIOSEQ_BURST_MAX);
694
695 return (fls(burst_mmio_width) - 1) << TEGRA_GPCDMA_MMIOSEQ_BURST_SHIFT;
696 }
697
698 static int get_transfer_param(struct tegra_dma_channel *tdc,
699 enum dma_transfer_direction direction,
700 unsigned long *apb_addr,
701 unsigned long *mmio_seq,
702 unsigned long *csr,
703 unsigned int *burst_size,
704 enum dma_slave_buswidth *slave_bw)
705 {
706 switch (direction) {
707 case DMA_MEM_TO_DEV:
708 *apb_addr = tdc->dma_sconfig.dst_addr;
709 *mmio_seq = get_bus_width(tdc, tdc->dma_sconfig.dst_addr_width);
710 *burst_size = tdc->dma_sconfig.dst_maxburst;
711 *slave_bw = tdc->dma_sconfig.dst_addr_width;
712 *csr = TEGRA_GPCDMA_CSR_DMA_MEM2IO_FC;
713 return 0;
714 case DMA_DEV_TO_MEM:
715 *apb_addr = tdc->dma_sconfig.src_addr;
716 *mmio_seq = get_bus_width(tdc, tdc->dma_sconfig.src_addr_width);
717 *burst_size = tdc->dma_sconfig.src_maxburst;
718 *slave_bw = tdc->dma_sconfig.src_addr_width;
719 *csr = TEGRA_GPCDMA_CSR_DMA_IO2MEM_FC;
720 return 0;
721 case DMA_MEM_TO_MEM:
722 *burst_size = tdc->dma_sconfig.src_addr_width;
723 *csr = TEGRA_GPCDMA_CSR_DMA_MEM2MEM;
724 return 0;
725 default:
726 dev_err(tdc2dev(tdc), "DMA direction is not supported\n");
727 }
728
729 return -EINVAL;
730 }
731
732 static struct dma_async_tx_descriptor *
733 tegra_dma_prep_dma_memset(struct dma_chan *dc, dma_addr_t dest, int value,
734 size_t len, unsigned long flags)
735 {
736 struct tegra_dma_channel *tdc = to_tegra_dma_chan(dc);
737 unsigned int max_dma_count = tdc->tdma->chip_data->max_dma_count;
738 struct tegra_dma_desc *dma_desc;
739 unsigned long csr, mc_seq;
740
741 if ((len & 3) || (dest & 3) || len > max_dma_count) {
742 dev_err(tdc2dev(tdc),
743 "DMA length/memory address is not supported\n");
744 return NULL;
745 }
746
747 /* Set dma mode to fixed pattern */
748 csr = TEGRA_GPCDMA_CSR_DMA_FIXED_PAT;
749 /* Enable once or continuous mode */
750 csr |= TEGRA_GPCDMA_CSR_ONCE;
751 /* Enable IRQ mask */
752 csr |= TEGRA_GPCDMA_CSR_IRQ_MASK;
753 /* Enable the dma interrupt */
754 if (flags & DMA_PREP_INTERRUPT)
755 csr |= TEGRA_GPCDMA_CSR_IE_EOC;
756 /* Configure default priority weight for the channel */
757 csr |= FIELD_PREP(TEGRA_GPCDMA_CSR_WEIGHT, 1);
758
759 mc_seq = tdc_read(tdc, TEGRA_GPCDMA_CHAN_MCSEQ);
760 /* retain stream-id and clean rest */
761 mc_seq &= TEGRA_GPCDMA_MCSEQ_STREAM_ID0_MASK;
762
763 /* Set the address wrapping */
764 mc_seq |= FIELD_PREP(TEGRA_GPCDMA_MCSEQ_WRAP0,
765 TEGRA_GPCDMA_MCSEQ_WRAP_NONE);
766 mc_seq |= FIELD_PREP(TEGRA_GPCDMA_MCSEQ_WRAP1,
767 TEGRA_GPCDMA_MCSEQ_WRAP_NONE);
768
769 /* Program outstanding MC requests */
770 mc_seq |= FIELD_PREP(TEGRA_GPCDMA_MCSEQ_REQ_COUNT, 1);
771 /* Set burst size */
772 mc_seq |= TEGRA_GPCDMA_MCSEQ_BURST_16;
773
774 dma_desc = kzalloc(sizeof(*dma_desc), GFP_NOWAIT);
775 if (!dma_desc)
776 return NULL;
777
778 dma_desc->bytes_requested = 0;
779 dma_desc->bytes_transferred = 0;
780
781 dma_desc->bytes_requested += len;
782 tdc->ch_regs.src_ptr = 0;
783 tdc->ch_regs.dst_ptr = dest;
784 tdc->ch_regs.high_addr_ptr =
> 785 FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_DST_PTR, (dest >> 32));
786 tdc->ch_regs.fixed_pattern = value;
787 /* Word count reg takes value as (N +1) words */
788 tdc->ch_regs.wcount = ((len - 4) >> 2);
789 tdc->ch_regs.csr = csr;
790 tdc->ch_regs.mmio_seq = 0;
791 tdc->ch_regs.mc_seq = mc_seq;
792
793 tdc->dma_desc = dma_desc;
794
795 return vchan_tx_prep(&tdc->vc, &dma_desc->vd, flags);
796 }
797

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip