CC: kbuild-all(a)lists.01.org TO: Sia Jee Heng CC: "Li, Yifan" tree: https://github.com/intel/linux-intel-lts.git 5.4/yocto head: eeb611e5394c56d45c5cc8f7dc484c9f19e93143 commit: 94e13c2880167751eb5cbbcb0e7be68ca83f0653 [40/1142] dmaengine: dw-axi-dma: support cyclic mode :::::: branch date: 7 weeks ago :::::: commit date: 7 weeks ago config: x86_64-randconfig-m001-20201008 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot Reported-by: Dan Carpenter New smatch warnings: drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c:972 dw_chan_prep_dma_cyclic() error: uninitialized symbol 'mem'. drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c:972 dw_chan_prep_dma_cyclic() error: uninitialized symbol 'len'. Old smatch warnings: drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c:1050 dw_chan_prep_dma_cyclic() error: uninitialized symbol 'len'. drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c:1058 dw_chan_prep_dma_cyclic() error: uninitialized symbol 'mem'. vim +/mem +972 drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c 1fe20f1b84548bb Eugeniy Paltsev 2018-03-06 912 94e13c288016775 Sia Jee Heng 2020-06-26 913 static struct dma_async_tx_descriptor * 94e13c288016775 Sia Jee Heng 2020-06-26 914 dw_chan_prep_dma_cyclic(struct dma_chan *dchan, dma_addr_t buf_addr, 94e13c288016775 Sia Jee Heng 2020-06-26 915 size_t buf_len, size_t period_len, 94e13c288016775 Sia Jee Heng 2020-06-26 916 enum dma_transfer_direction direction, 94e13c288016775 Sia Jee Heng 2020-06-26 917 unsigned long flags) 94e13c288016775 Sia Jee Heng 2020-06-26 918 { 94e13c288016775 Sia Jee Heng 2020-06-26 919 struct axi_dma_chan *chan = dchan_to_axi_dma_chan(dchan); 94e13c288016775 Sia Jee Heng 2020-06-26 920 struct axi_dma_desc *first = NULL, *prev = NULL; 94e13c288016775 Sia Jee Heng 2020-06-26 921 unsigned int reg_width; 94e13c288016775 Sia Jee Heng 2020-06-26 922 unsigned int mem_width; 94e13c288016775 Sia Jee Heng 2020-06-26 923 unsigned int data_width = BIT(chan->chip->dw->hdata->m_data_width); 94e13c288016775 Sia Jee Heng 2020-06-26 924 dma_addr_t reg; 94e13c288016775 Sia Jee Heng 2020-06-26 925 u32 reg_value = 0; 94e13c288016775 Sia Jee Heng 2020-06-26 926 unsigned int i = 0; 94e13c288016775 Sia Jee Heng 2020-06-26 927 u32 ctllo, ctlhi; 94e13c288016775 Sia Jee Heng 2020-06-26 928 size_t total_len = 0; 94e13c288016775 Sia Jee Heng 2020-06-26 929 size_t block_ts, max_block_ts; 94e13c288016775 Sia Jee Heng 2020-06-26 930 u8 lms = 0; // Select AXI0 master for LLI fetching 94e13c288016775 Sia Jee Heng 2020-06-26 931 u32 offset; 94e13c288016775 Sia Jee Heng 2020-06-26 932 94e13c288016775 Sia Jee Heng 2020-06-26 933 if (unlikely(!is_slave_direction(direction))) 94e13c288016775 Sia Jee Heng 2020-06-26 934 return NULL; 94e13c288016775 Sia Jee Heng 2020-06-26 935 94e13c288016775 Sia Jee Heng 2020-06-26 936 chan->direction = direction; 94e13c288016775 Sia Jee Heng 2020-06-26 937 chan->cyclic = 0x1; 94e13c288016775 Sia Jee Heng 2020-06-26 938 94e13c288016775 Sia Jee Heng 2020-06-26 939 max_block_ts = chan->chip->dw->hdata->block_size[chan->id]; 94e13c288016775 Sia Jee Heng 2020-06-26 940 94e13c288016775 Sia Jee Heng 2020-06-26 941 axi_set_hw_channel(chan->chip, chan->hw_hs_num); 94e13c288016775 Sia Jee Heng 2020-06-26 942 94e13c288016775 Sia Jee Heng 2020-06-26 943 switch (direction) { 94e13c288016775 Sia Jee Heng 2020-06-26 944 case DMA_MEM_TO_DEV: 94e13c288016775 Sia Jee Heng 2020-06-26 945 reg_width = __ffs(chan->slave_config.dst_addr_width); 94e13c288016775 Sia Jee Heng 2020-06-26 946 94e13c288016775 Sia Jee Heng 2020-06-26 947 chan->reg_width = reg_width; 94e13c288016775 Sia Jee Heng 2020-06-26 948 if (reg_width == DWAXIDMAC_TRANS_WIDTH_16) { 94e13c288016775 Sia Jee Heng 2020-06-26 949 offset = DMAC_APB_HALFWORD_WR_CH_EN; 94e13c288016775 Sia Jee Heng 2020-06-26 950 reg_value = axi_dma_apb_ioread32(chan->chip, offset); 94e13c288016775 Sia Jee Heng 2020-06-26 951 reg_value |= 0x1 << chan->id; 94e13c288016775 Sia Jee Heng 2020-06-26 952 axi_dma_apb_iowrite32(chan->chip, 94e13c288016775 Sia Jee Heng 2020-06-26 953 DMAC_APB_HALFWORD_WR_CH_EN, reg_value); 94e13c288016775 Sia Jee Heng 2020-06-26 954 } else if (reg_width == DWAXIDMAC_TRANS_WIDTH_8) { 94e13c288016775 Sia Jee Heng 2020-06-26 955 offset = DMAC_APB_BYTE_WR_CH_EN; 94e13c288016775 Sia Jee Heng 2020-06-26 956 reg_value = axi_dma_apb_ioread32(chan->chip, offset); 94e13c288016775 Sia Jee Heng 2020-06-26 957 reg_value |= 0x1 << chan->id; 94e13c288016775 Sia Jee Heng 2020-06-26 958 axi_dma_apb_iowrite32(chan->chip, offset, reg_value); 94e13c288016775 Sia Jee Heng 2020-06-26 959 } 94e13c288016775 Sia Jee Heng 2020-06-26 960 reg = chan->slave_config.dst_addr; 94e13c288016775 Sia Jee Heng 2020-06-26 961 94e13c288016775 Sia Jee Heng 2020-06-26 962 ctllo = axi_dma_prepare_ctllo(chan) | 94e13c288016775 Sia Jee Heng 2020-06-26 963 reg_width << CH_CTL_L_DST_WIDTH_POS | 94e13c288016775 Sia Jee Heng 2020-06-26 964 DWAXIDMAC_CH_CTL_L_NOINC << CH_CTL_L_DST_INC_POS | 94e13c288016775 Sia Jee Heng 2020-06-26 965 DWAXIDMAC_CH_CTL_L_INC << CH_CTL_L_SRC_INC_POS; 94e13c288016775 Sia Jee Heng 2020-06-26 966 94e13c288016775 Sia Jee Heng 2020-06-26 967 for (i = 0; i < buf_len / period_len; i++) { 94e13c288016775 Sia Jee Heng 2020-06-26 968 struct axi_dma_desc *desc; 94e13c288016775 Sia Jee Heng 2020-06-26 969 size_t xfer_len; 94e13c288016775 Sia Jee Heng 2020-06-26 970 u32 mem, len; 94e13c288016775 Sia Jee Heng 2020-06-26 971 94e13c288016775 Sia Jee Heng 2020-06-26 @972 mem_width = __ffs(data_width | mem | len); 94e13c288016775 Sia Jee Heng 2020-06-26 973 if (mem_width > DWAXIDMAC_TRANS_WIDTH_32) 94e13c288016775 Sia Jee Heng 2020-06-26 974 mem_width = DWAXIDMAC_TRANS_WIDTH_32; 94e13c288016775 Sia Jee Heng 2020-06-26 975 94e13c288016775 Sia Jee Heng 2020-06-26 976 xfer_len = period_len; 94e13c288016775 Sia Jee Heng 2020-06-26 977 block_ts = period_len; 94e13c288016775 Sia Jee Heng 2020-06-26 978 94e13c288016775 Sia Jee Heng 2020-06-26 979 desc = axi_desc_get(chan); 94e13c288016775 Sia Jee Heng 2020-06-26 980 if (unlikely(!desc)) 94e13c288016775 Sia Jee Heng 2020-06-26 981 goto err_desc_get; 94e13c288016775 Sia Jee Heng 2020-06-26 982 94e13c288016775 Sia Jee Heng 2020-06-26 983 if (block_ts > max_block_ts) { 94e13c288016775 Sia Jee Heng 2020-06-26 984 block_ts = max_block_ts; 94e13c288016775 Sia Jee Heng 2020-06-26 985 xfer_len = max_block_ts << mem_width; 94e13c288016775 Sia Jee Heng 2020-06-26 986 } 94e13c288016775 Sia Jee Heng 2020-06-26 987 94e13c288016775 Sia Jee Heng 2020-06-26 988 ctlhi = axi_dma_prepare_ctlhi(chan); 94e13c288016775 Sia Jee Heng 2020-06-26 989 94e13c288016775 Sia Jee Heng 2020-06-26 990 ctllo |= mem_width << CH_CTL_L_SRC_WIDTH_POS; 94e13c288016775 Sia Jee Heng 2020-06-26 991 write_desc_sar(desc, buf_addr + i * period_len); 94e13c288016775 Sia Jee Heng 2020-06-26 992 write_desc_dar(desc, reg); 94e13c288016775 Sia Jee Heng 2020-06-26 993 desc->lli.block_ts_lo = period_len / 4; 94e13c288016775 Sia Jee Heng 2020-06-26 994 desc->lli.ctl_hi = cpu_to_le32(ctlhi); 94e13c288016775 Sia Jee Heng 2020-06-26 995 desc->lli.ctl_lo = cpu_to_le32(ctllo); 94e13c288016775 Sia Jee Heng 2020-06-26 996 94e13c288016775 Sia Jee Heng 2020-06-26 997 set_desc_src_master(desc); 94e13c288016775 Sia Jee Heng 2020-06-26 998 set_desc_src_master(desc); 94e13c288016775 Sia Jee Heng 2020-06-26 999 94e13c288016775 Sia Jee Heng 2020-06-26 1000 // Manage transfer list (xfer_list) 94e13c288016775 Sia Jee Heng 2020-06-26 1001 if (!first) { 94e13c288016775 Sia Jee Heng 2020-06-26 1002 first = desc; 94e13c288016775 Sia Jee Heng 2020-06-26 1003 } else { 94e13c288016775 Sia Jee Heng 2020-06-26 1004 write_desc_llp(prev, desc->vd.tx.phys | lms); 94e13c288016775 Sia Jee Heng 2020-06-26 1005 list_add_tail(&desc->xfer_list, 94e13c288016775 Sia Jee Heng 2020-06-26 1006 &first->xfer_list); 94e13c288016775 Sia Jee Heng 2020-06-26 1007 } 94e13c288016775 Sia Jee Heng 2020-06-26 1008 prev = desc; 94e13c288016775 Sia Jee Heng 2020-06-26 1009 if (i == ((buf_len / period_len) - 1)) 94e13c288016775 Sia Jee Heng 2020-06-26 1010 write_desc_llp(prev, first->vd.tx.phys | lms); 94e13c288016775 Sia Jee Heng 2020-06-26 1011 94e13c288016775 Sia Jee Heng 2020-06-26 1012 total_len += xfer_len; 94e13c288016775 Sia Jee Heng 2020-06-26 1013 94e13c288016775 Sia Jee Heng 2020-06-26 1014 set_desc_last(desc); 94e13c288016775 Sia Jee Heng 2020-06-26 1015 } 94e13c288016775 Sia Jee Heng 2020-06-26 1016 break; 94e13c288016775 Sia Jee Heng 2020-06-26 1017 case DMA_DEV_TO_MEM: 94e13c288016775 Sia Jee Heng 2020-06-26 1018 reg_width = __ffs(chan->slave_config.src_addr_width); 94e13c288016775 Sia Jee Heng 2020-06-26 1019 94e13c288016775 Sia Jee Heng 2020-06-26 1020 chan->reg_width = reg_width; 94e13c288016775 Sia Jee Heng 2020-06-26 1021 if (reg_width == DWAXIDMAC_TRANS_WIDTH_16) { 94e13c288016775 Sia Jee Heng 2020-06-26 1022 offset = DMAC_APB_HALFWORD_WR_CH_EN; 94e13c288016775 Sia Jee Heng 2020-06-26 1023 reg_value = axi_dma_apb_ioread32(chan->chip, offset); 94e13c288016775 Sia Jee Heng 2020-06-26 1024 reg_value |= 0x1 << chan->id; 94e13c288016775 Sia Jee Heng 2020-06-26 1025 axi_dma_apb_iowrite32(chan->chip, offset, reg_value); 94e13c288016775 Sia Jee Heng 2020-06-26 1026 } else if (reg_width == DWAXIDMAC_TRANS_WIDTH_8) { 94e13c288016775 Sia Jee Heng 2020-06-26 1027 offset = DMAC_APB_BYTE_WR_CH_EN; 94e13c288016775 Sia Jee Heng 2020-06-26 1028 reg_value = axi_dma_apb_ioread32(chan->chip, offset); 94e13c288016775 Sia Jee Heng 2020-06-26 1029 reg_value |= 0x1 << chan->id; 94e13c288016775 Sia Jee Heng 2020-06-26 1030 axi_dma_apb_iowrite32(chan->chip, offset, reg_value); 94e13c288016775 Sia Jee Heng 2020-06-26 1031 } 94e13c288016775 Sia Jee Heng 2020-06-26 1032 reg = chan->slave_config.src_addr; 94e13c288016775 Sia Jee Heng 2020-06-26 1033 if (reg_width > DWAXIDMAC_TRANS_WIDTH_32) 94e13c288016775 Sia Jee Heng 2020-06-26 1034 reg_width = DWAXIDMAC_TRANS_WIDTH_32; 94e13c288016775 Sia Jee Heng 2020-06-26 1035 ctllo = axi_dma_prepare_ctllo(chan) | 94e13c288016775 Sia Jee Heng 2020-06-26 1036 reg_width << CH_CTL_L_SRC_WIDTH_POS | 94e13c288016775 Sia Jee Heng 2020-06-26 1037 DWAXIDMAC_CH_CTL_L_INC << CH_CTL_L_DST_INC_POS | 94e13c288016775 Sia Jee Heng 2020-06-26 1038 // Workaround 94e13c288016775 Sia Jee Heng 2020-06-26 1039 DWAXIDMAC_CH_CTL_L_NOINC << CH_CTL_L_SRC_INC_POS; 94e13c288016775 Sia Jee Heng 2020-06-26 1040 94e13c288016775 Sia Jee Heng 2020-06-26 1041 for (i = 0; i < buf_len / period_len; i++) { 94e13c288016775 Sia Jee Heng 2020-06-26 1042 struct axi_dma_desc *desc; 94e13c288016775 Sia Jee Heng 2020-06-26 1043 size_t xfer_len; 94e13c288016775 Sia Jee Heng 2020-06-26 1044 u32 mem, len; 94e13c288016775 Sia Jee Heng 2020-06-26 1045 94e13c288016775 Sia Jee Heng 2020-06-26 1046 desc = axi_desc_get(chan); 94e13c288016775 Sia Jee Heng 2020-06-26 1047 if (unlikely(!desc)) 94e13c288016775 Sia Jee Heng 2020-06-26 1048 goto err_desc_get; 94e13c288016775 Sia Jee Heng 2020-06-26 1049 94e13c288016775 Sia Jee Heng 2020-06-26 1050 xfer_len = len; 94e13c288016775 Sia Jee Heng 2020-06-26 1051 block_ts = xfer_len >> reg_width; 94e13c288016775 Sia Jee Heng 2020-06-26 1052 if (block_ts > max_block_ts) { 94e13c288016775 Sia Jee Heng 2020-06-26 1053 block_ts = max_block_ts; 94e13c288016775 Sia Jee Heng 2020-06-26 1054 xfer_len = max_block_ts << reg_width; 94e13c288016775 Sia Jee Heng 2020-06-26 1055 } 94e13c288016775 Sia Jee Heng 2020-06-26 1056 xfer_len = period_len; 94e13c288016775 Sia Jee Heng 2020-06-26 1057 block_ts = period_len; 94e13c288016775 Sia Jee Heng 2020-06-26 1058 mem_width = __ffs(data_width | mem | xfer_len); 94e13c288016775 Sia Jee Heng 2020-06-26 1059 if (mem_width > DWAXIDMAC_TRANS_WIDTH_32) 94e13c288016775 Sia Jee Heng 2020-06-26 1060 mem_width = DWAXIDMAC_TRANS_WIDTH_32; 94e13c288016775 Sia Jee Heng 2020-06-26 1061 94e13c288016775 Sia Jee Heng 2020-06-26 1062 ctlhi = axi_dma_prepare_ctlhi(chan); 94e13c288016775 Sia Jee Heng 2020-06-26 1063 ctllo |= mem_width << CH_CTL_L_DST_WIDTH_POS; 94e13c288016775 Sia Jee Heng 2020-06-26 1064 94e13c288016775 Sia Jee Heng 2020-06-26 1065 write_desc_sar(desc, reg); 94e13c288016775 Sia Jee Heng 2020-06-26 1066 write_desc_dar(desc, buf_addr + i * period_len); 94e13c288016775 Sia Jee Heng 2020-06-26 1067 if (reg_width == DWAXIDMAC_TRANS_WIDTH_16) 94e13c288016775 Sia Jee Heng 2020-06-26 1068 desc->lli.block_ts_lo = period_len / 2; 94e13c288016775 Sia Jee Heng 2020-06-26 1069 else if (reg_width >= DWAXIDMAC_TRANS_WIDTH_32) 94e13c288016775 Sia Jee Heng 2020-06-26 1070 desc->lli.block_ts_lo = period_len / 4; 94e13c288016775 Sia Jee Heng 2020-06-26 1071 desc->lli.ctl_hi = cpu_to_le32(ctlhi); 94e13c288016775 Sia Jee Heng 2020-06-26 1072 desc->lli.ctl_lo = cpu_to_le32(ctllo); 94e13c288016775 Sia Jee Heng 2020-06-26 1073 94e13c288016775 Sia Jee Heng 2020-06-26 1074 set_desc_src_master(desc); 94e13c288016775 Sia Jee Heng 2020-06-26 1075 set_desc_src_master(desc); 94e13c288016775 Sia Jee Heng 2020-06-26 1076 94e13c288016775 Sia Jee Heng 2020-06-26 1077 // Manage transfer list (xfer_list) 94e13c288016775 Sia Jee Heng 2020-06-26 1078 if (!first) { 94e13c288016775 Sia Jee Heng 2020-06-26 1079 first = desc; 94e13c288016775 Sia Jee Heng 2020-06-26 1080 } else { 94e13c288016775 Sia Jee Heng 2020-06-26 1081 write_desc_llp(prev, desc->vd.tx.phys | lms); 94e13c288016775 Sia Jee Heng 2020-06-26 1082 list_add_tail(&desc->xfer_list, 94e13c288016775 Sia Jee Heng 2020-06-26 1083 &first->xfer_list); 94e13c288016775 Sia Jee Heng 2020-06-26 1084 } 94e13c288016775 Sia Jee Heng 2020-06-26 1085 prev = desc; 94e13c288016775 Sia Jee Heng 2020-06-26 1086 if (i == ((buf_len / period_len) - 1)) 94e13c288016775 Sia Jee Heng 2020-06-26 1087 write_desc_llp(prev, first->vd.tx.phys | lms); 94e13c288016775 Sia Jee Heng 2020-06-26 1088 94e13c288016775 Sia Jee Heng 2020-06-26 1089 total_len += xfer_len; 94e13c288016775 Sia Jee Heng 2020-06-26 1090 94e13c288016775 Sia Jee Heng 2020-06-26 1091 // TODO: check if needed 94e13c288016775 Sia Jee Heng 2020-06-26 1092 set_desc_last(desc); 94e13c288016775 Sia Jee Heng 2020-06-26 1093 } 94e13c288016775 Sia Jee Heng 2020-06-26 1094 break; 94e13c288016775 Sia Jee Heng 2020-06-26 1095 default: 94e13c288016775 Sia Jee Heng 2020-06-26 1096 return NULL; 94e13c288016775 Sia Jee Heng 2020-06-26 1097 } 94e13c288016775 Sia Jee Heng 2020-06-26 1098 94e13c288016775 Sia Jee Heng 2020-06-26 1099 if (unlikely(!first)) 94e13c288016775 Sia Jee Heng 2020-06-26 1100 return NULL; 94e13c288016775 Sia Jee Heng 2020-06-26 1101 94e13c288016775 Sia Jee Heng 2020-06-26 1102 return vchan_tx_prep(&chan->vc, &first->vd, flags); 94e13c288016775 Sia Jee Heng 2020-06-26 1103 94e13c288016775 Sia Jee Heng 2020-06-26 1104 err_desc_get: 94e13c288016775 Sia Jee Heng 2020-06-26 1105 if (first) 94e13c288016775 Sia Jee Heng 2020-06-26 1106 axi_desc_put(first); 94e13c288016775 Sia Jee Heng 2020-06-26 1107 94e13c288016775 Sia Jee Heng 2020-06-26 1108 return NULL; 94e13c288016775 Sia Jee Heng 2020-06-26 1109 } 94e13c288016775 Sia Jee Heng 2020-06-26 1110 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org