* [bug report] dmaengine: tegra: Add tegra gpcdma driver
@ 2022-04-13 11:21 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2022-04-13 11:21 UTC (permalink / raw)
To: akhilrajeev; +Cc: linux-tegra
Hello Akhil R,
The patch ee17028009d4: "dmaengine: tegra: Add tegra gpcdma driver"
from Feb 25, 2022, leads to the following Smatch static checker
warning:
drivers/dma/tegra186-gpc-dma.c:1071 tegra_dma_prep_slave_sg()
error: uninitialized symbol 'slave_bw'.
drivers/dma/tegra186-gpc-dma.c
981 static struct dma_async_tx_descriptor *
982 tegra_dma_prep_slave_sg(struct dma_chan *dc, struct scatterlist *sgl,
983 unsigned int sg_len, enum dma_transfer_direction direction,
984 unsigned long flags, void *context)
985 {
986 struct tegra_dma_channel *tdc = to_tegra_dma_chan(dc);
987 unsigned int max_dma_count = tdc->tdma->chip_data->max_dma_count;
988 u32 csr, mc_seq, apb_ptr = 0, mmio_seq = 0;
989 enum dma_slave_buswidth slave_bw;
990 struct tegra_dma_sg_req *sg_req;
991 struct tegra_dma_desc *dma_desc;
992 struct scatterlist *sg;
993 u32 burst_size;
994 unsigned int i;
995 int ret;
996
997 if (!tdc->config_init) {
998 dev_err(tdc2dev(tdc), "DMA channel is not configured\n");
999 return NULL;
1000 }
1001 if (sg_len < 1) {
1002 dev_err(tdc2dev(tdc), "Invalid segment length %d\n", sg_len);
1003 return NULL;
1004 }
1005
1006 ret = tegra_dma_sid_reserve(tdc, direction);
1007 if (ret)
1008 return NULL;
1009
1010 ret = get_transfer_param(tdc, direction, &apb_ptr, &mmio_seq, &csr,
1011 &burst_size, &slave_bw);
*slave_bw is not set fro the DMA_MEM_TO_MEM case.
1012 if (ret < 0)
1013 return NULL;
1014
1015 /* Enable once or continuous mode */
1016 csr |= TEGRA_GPCDMA_CSR_ONCE;
1017 /* Program the slave id in requestor select */
1018 csr |= FIELD_PREP(TEGRA_GPCDMA_CSR_REQ_SEL_MASK, tdc->slave_id);
1019 /* Enable IRQ mask */
1020 csr |= TEGRA_GPCDMA_CSR_IRQ_MASK;
1021 /* Configure default priority weight for the channel*/
1022 csr |= FIELD_PREP(TEGRA_GPCDMA_CSR_WEIGHT, 1);
1023
1024 /* Enable the DMA interrupt */
1025 if (flags & DMA_PREP_INTERRUPT)
1026 csr |= TEGRA_GPCDMA_CSR_IE_EOC;
1027
1028 mc_seq = tdc_read(tdc, TEGRA_GPCDMA_CHAN_MCSEQ);
1029 /* retain stream-id and clean rest */
1030 mc_seq &= TEGRA_GPCDMA_MCSEQ_STREAM_ID0_MASK;
1031
1032 /* Set the address wrapping on both MC and MMIO side */
1033
1034 mc_seq |= FIELD_PREP(TEGRA_GPCDMA_MCSEQ_WRAP0,
1035 TEGRA_GPCDMA_MCSEQ_WRAP_NONE);
1036 mc_seq |= FIELD_PREP(TEGRA_GPCDMA_MCSEQ_WRAP1,
1037 TEGRA_GPCDMA_MCSEQ_WRAP_NONE);
1038 mmio_seq |= FIELD_PREP(TEGRA_GPCDMA_MMIOSEQ_WRAP_WORD, 1);
1039
1040 /* Program 2 MC outstanding requests by default. */
1041 mc_seq |= FIELD_PREP(TEGRA_GPCDMA_MCSEQ_REQ_COUNT, 1);
1042
1043 /* Setting MC burst size depending on MMIO burst size */
1044 if (burst_size == 64)
1045 mc_seq |= TEGRA_GPCDMA_MCSEQ_BURST_16;
1046 else
1047 mc_seq |= TEGRA_GPCDMA_MCSEQ_BURST_2;
1048
1049 dma_desc = kzalloc(struct_size(dma_desc, sg_req, sg_len), GFP_NOWAIT);
1050 if (!dma_desc)
1051 return NULL;
1052
1053 dma_desc->sg_count = sg_len;
1054 sg_req = dma_desc->sg_req;
1055
1056 /* Make transfer requests */
1057 for_each_sg(sgl, sg, sg_len, i) {
1058 u32 len;
1059 dma_addr_t mem;
1060
1061 mem = sg_dma_address(sg);
1062 len = sg_dma_len(sg);
1063
1064 if ((len & 3) || (mem & 3) || len > max_dma_count) {
1065 dev_err(tdc2dev(tdc),
1066 "DMA length/memory address is not supported\n");
1067 kfree(dma_desc);
1068 return NULL;
1069 }
1070
--> 1071 mmio_seq |= get_burst_size(tdc, burst_size, slave_bw, len);
^^^^^^^^
used here.
1072 dma_desc->bytes_req += len;
1073
1074 if (direction == DMA_MEM_TO_DEV) {
1075 sg_req[i].ch_regs.src_ptr = mem;
1076 sg_req[i].ch_regs.dst_ptr = apb_ptr;
1077 sg_req[i].ch_regs.high_addr_ptr =
1078 FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_SRC_PTR, (mem >> 32));
1079 } else if (direction == DMA_DEV_TO_MEM) {
1080 sg_req[i].ch_regs.src_ptr = apb_ptr;
1081 sg_req[i].ch_regs.dst_ptr = mem;
1082 sg_req[i].ch_regs.high_addr_ptr =
1083 FIELD_PREP(TEGRA_GPCDMA_HIGH_ADDR_DST_PTR, (mem >> 32));
1084 }
1085
1086 /*
1087 * Word count register takes input in words. Writing a value
1088 * of N into word count register means a req of (N+1) words.
1089 */
1090 sg_req[i].ch_regs.wcount = ((len - 4) >> 2);
1091 sg_req[i].ch_regs.csr = csr;
1092 sg_req[i].ch_regs.mmio_seq = mmio_seq;
1093 sg_req[i].ch_regs.mc_seq = mc_seq;
1094 sg_req[i].len = len;
1095 }
1096
1097 dma_desc->cyclic = false;
1098 return vchan_tx_prep(&tdc->vc, &dma_desc->vd, flags);
1099 }
regards,
dan carpenter
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-04-13 11:21 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-13 11:21 [bug report] dmaengine: tegra: Add tegra gpcdma driver Dan Carpenter
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.