Skip to content

Commit 80936d6

Browse files
r-vigneshvinodkoul
authored andcommitted
dmaengine: ti: k3-udma: Fix smatch warnings
Smatch reports below warnings [1] wrt dereferencing rm_res when it can potentially be ERR_PTR(). This is possible when entire range is allocated to Linux Fix this case by making sure, there is no deference of rm_res when its ERR_PTR(). [1]: drivers/dma/ti/k3-udma.c:4524 udma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4537 udma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4681 bcdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4696 bcdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4711 bcdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4848 pktdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() drivers/dma/ti/k3-udma.c:4861 pktdma_setup_resources() error: 'rm_res' dereferencing possible ERR_PTR() Reported-by: Nishanth Menon <[email protected]> Signed-off-by: Vignesh Raghavendra <[email protected]> Acked-by: Peter Ujfalusi <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent fa51b16 commit 80936d6

File tree

1 file changed

+107
-50
lines changed

1 file changed

+107
-50
lines changed

drivers/dma/ti/k3-udma.c

Lines changed: 107 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4534,45 +4534,60 @@ static int udma_setup_resources(struct udma_dev *ud)
45344534
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
45354535
if (IS_ERR(rm_res)) {
45364536
bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4537+
irq_res.sets = 1;
45374538
} else {
45384539
bitmap_fill(ud->tchan_map, ud->tchan_cnt);
45394540
for (i = 0; i < rm_res->sets; i++)
45404541
udma_mark_resource_ranges(ud, ud->tchan_map,
45414542
&rm_res->desc[i], "tchan");
4543+
irq_res.sets = rm_res->sets;
45424544
}
4543-
irq_res.sets = rm_res->sets;
45444545

45454546
/* rchan and matching default flow ranges */
45464547
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
45474548
if (IS_ERR(rm_res)) {
45484549
bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4550+
irq_res.sets++;
45494551
} else {
45504552
bitmap_fill(ud->rchan_map, ud->rchan_cnt);
45514553
for (i = 0; i < rm_res->sets; i++)
45524554
udma_mark_resource_ranges(ud, ud->rchan_map,
45534555
&rm_res->desc[i], "rchan");
4556+
irq_res.sets += rm_res->sets;
45544557
}
45554558

4556-
irq_res.sets += rm_res->sets;
45574559
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4560+
if (!irq_res.desc)
4561+
return -ENOMEM;
45584562
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4559-
for (i = 0; i < rm_res->sets; i++) {
4560-
irq_res.desc[i].start = rm_res->desc[i].start;
4561-
irq_res.desc[i].num = rm_res->desc[i].num;
4562-
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
4563-
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
4563+
if (IS_ERR(rm_res)) {
4564+
irq_res.desc[0].start = 0;
4565+
irq_res.desc[0].num = ud->tchan_cnt;
4566+
i = 1;
4567+
} else {
4568+
for (i = 0; i < rm_res->sets; i++) {
4569+
irq_res.desc[i].start = rm_res->desc[i].start;
4570+
irq_res.desc[i].num = rm_res->desc[i].num;
4571+
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
4572+
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
4573+
}
45644574
}
45654575
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4566-
for (j = 0; j < rm_res->sets; j++, i++) {
4567-
if (rm_res->desc[j].num) {
4568-
irq_res.desc[i].start = rm_res->desc[j].start +
4569-
ud->soc_data->oes.udma_rchan;
4570-
irq_res.desc[i].num = rm_res->desc[j].num;
4571-
}
4572-
if (rm_res->desc[j].num_sec) {
4573-
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
4574-
ud->soc_data->oes.udma_rchan;
4575-
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
4576+
if (IS_ERR(rm_res)) {
4577+
irq_res.desc[i].start = 0;
4578+
irq_res.desc[i].num = ud->rchan_cnt;
4579+
} else {
4580+
for (j = 0; j < rm_res->sets; j++, i++) {
4581+
if (rm_res->desc[j].num) {
4582+
irq_res.desc[i].start = rm_res->desc[j].start +
4583+
ud->soc_data->oes.udma_rchan;
4584+
irq_res.desc[i].num = rm_res->desc[j].num;
4585+
}
4586+
if (rm_res->desc[j].num_sec) {
4587+
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
4588+
ud->soc_data->oes.udma_rchan;
4589+
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
4590+
}
45764591
}
45774592
}
45784593
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
@@ -4690,77 +4705,104 @@ static int bcdma_setup_resources(struct udma_dev *ud)
46904705
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
46914706
if (IS_ERR(rm_res)) {
46924707
bitmap_zero(ud->bchan_map, ud->bchan_cnt);
4708+
irq_res.sets++;
46934709
} else {
46944710
bitmap_fill(ud->bchan_map, ud->bchan_cnt);
46954711
for (i = 0; i < rm_res->sets; i++)
46964712
udma_mark_resource_ranges(ud, ud->bchan_map,
46974713
&rm_res->desc[i],
46984714
"bchan");
4715+
irq_res.sets += rm_res->sets;
46994716
}
4700-
irq_res.sets += rm_res->sets;
47014717
}
47024718

47034719
/* tchan ranges */
47044720
if (ud->tchan_cnt) {
47054721
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
47064722
if (IS_ERR(rm_res)) {
47074723
bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4724+
irq_res.sets += 2;
47084725
} else {
47094726
bitmap_fill(ud->tchan_map, ud->tchan_cnt);
47104727
for (i = 0; i < rm_res->sets; i++)
47114728
udma_mark_resource_ranges(ud, ud->tchan_map,
47124729
&rm_res->desc[i],
47134730
"tchan");
4731+
irq_res.sets += rm_res->sets * 2;
47144732
}
4715-
irq_res.sets += rm_res->sets * 2;
47164733
}
47174734

47184735
/* rchan ranges */
47194736
if (ud->rchan_cnt) {
47204737
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
47214738
if (IS_ERR(rm_res)) {
47224739
bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4740+
irq_res.sets += 2;
47234741
} else {
47244742
bitmap_fill(ud->rchan_map, ud->rchan_cnt);
47254743
for (i = 0; i < rm_res->sets; i++)
47264744
udma_mark_resource_ranges(ud, ud->rchan_map,
47274745
&rm_res->desc[i],
47284746
"rchan");
4747+
irq_res.sets += rm_res->sets * 2;
47294748
}
4730-
irq_res.sets += rm_res->sets * 2;
47314749
}
47324750

47334751
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4752+
if (!irq_res.desc)
4753+
return -ENOMEM;
47344754
if (ud->bchan_cnt) {
47354755
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
4736-
for (i = 0; i < rm_res->sets; i++) {
4737-
irq_res.desc[i].start = rm_res->desc[i].start +
4738-
oes->bcdma_bchan_ring;
4739-
irq_res.desc[i].num = rm_res->desc[i].num;
4756+
if (IS_ERR(rm_res)) {
4757+
irq_res.desc[0].start = oes->bcdma_bchan_ring;
4758+
irq_res.desc[0].num = ud->bchan_cnt;
4759+
i = 1;
4760+
} else {
4761+
for (i = 0; i < rm_res->sets; i++) {
4762+
irq_res.desc[i].start = rm_res->desc[i].start +
4763+
oes->bcdma_bchan_ring;
4764+
irq_res.desc[i].num = rm_res->desc[i].num;
4765+
}
47404766
}
47414767
}
47424768
if (ud->tchan_cnt) {
47434769
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4744-
for (j = 0; j < rm_res->sets; j++, i += 2) {
4745-
irq_res.desc[i].start = rm_res->desc[j].start +
4746-
oes->bcdma_tchan_data;
4747-
irq_res.desc[i].num = rm_res->desc[j].num;
4748-
4749-
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4750-
oes->bcdma_tchan_ring;
4751-
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4770+
if (IS_ERR(rm_res)) {
4771+
irq_res.desc[i].start = oes->bcdma_tchan_data;
4772+
irq_res.desc[i].num = ud->tchan_cnt;
4773+
irq_res.desc[i + 1].start = oes->bcdma_tchan_ring;
4774+
irq_res.desc[i + 1].num = ud->tchan_cnt;
4775+
i += 2;
4776+
} else {
4777+
for (j = 0; j < rm_res->sets; j++, i += 2) {
4778+
irq_res.desc[i].start = rm_res->desc[j].start +
4779+
oes->bcdma_tchan_data;
4780+
irq_res.desc[i].num = rm_res->desc[j].num;
4781+
4782+
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4783+
oes->bcdma_tchan_ring;
4784+
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4785+
}
47524786
}
47534787
}
47544788
if (ud->rchan_cnt) {
47554789
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4756-
for (j = 0; j < rm_res->sets; j++, i += 2) {
4757-
irq_res.desc[i].start = rm_res->desc[j].start +
4758-
oes->bcdma_rchan_data;
4759-
irq_res.desc[i].num = rm_res->desc[j].num;
4760-
4761-
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4762-
oes->bcdma_rchan_ring;
4763-
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4790+
if (IS_ERR(rm_res)) {
4791+
irq_res.desc[i].start = oes->bcdma_rchan_data;
4792+
irq_res.desc[i].num = ud->rchan_cnt;
4793+
irq_res.desc[i + 1].start = oes->bcdma_rchan_ring;
4794+
irq_res.desc[i + 1].num = ud->rchan_cnt;
4795+
i += 2;
4796+
} else {
4797+
for (j = 0; j < rm_res->sets; j++, i += 2) {
4798+
irq_res.desc[i].start = rm_res->desc[j].start +
4799+
oes->bcdma_rchan_data;
4800+
irq_res.desc[i].num = rm_res->desc[j].num;
4801+
4802+
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4803+
oes->bcdma_rchan_ring;
4804+
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4805+
}
47644806
}
47654807
}
47664808

@@ -4858,39 +4900,54 @@ static int pktdma_setup_resources(struct udma_dev *ud)
48584900
if (IS_ERR(rm_res)) {
48594901
/* all rflows are assigned exclusively to Linux */
48604902
bitmap_zero(ud->rflow_in_use, ud->rflow_cnt);
4903+
irq_res.sets = 1;
48614904
} else {
48624905
bitmap_fill(ud->rflow_in_use, ud->rflow_cnt);
48634906
for (i = 0; i < rm_res->sets; i++)
48644907
udma_mark_resource_ranges(ud, ud->rflow_in_use,
48654908
&rm_res->desc[i], "rflow");
4909+
irq_res.sets = rm_res->sets;
48664910
}
4867-
irq_res.sets = rm_res->sets;
48684911

48694912
/* tflow ranges */
48704913
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
48714914
if (IS_ERR(rm_res)) {
48724915
/* all tflows are assigned exclusively to Linux */
48734916
bitmap_zero(ud->tflow_map, ud->tflow_cnt);
4917+
irq_res.sets++;
48744918
} else {
48754919
bitmap_fill(ud->tflow_map, ud->tflow_cnt);
48764920
for (i = 0; i < rm_res->sets; i++)
48774921
udma_mark_resource_ranges(ud, ud->tflow_map,
48784922
&rm_res->desc[i], "tflow");
4923+
irq_res.sets += rm_res->sets;
48794924
}
4880-
irq_res.sets += rm_res->sets;
48814925

48824926
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4927+
if (!irq_res.desc)
4928+
return -ENOMEM;
48834929
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
4884-
for (i = 0; i < rm_res->sets; i++) {
4885-
irq_res.desc[i].start = rm_res->desc[i].start +
4886-
oes->pktdma_tchan_flow;
4887-
irq_res.desc[i].num = rm_res->desc[i].num;
4930+
if (IS_ERR(rm_res)) {
4931+
irq_res.desc[0].start = oes->pktdma_tchan_flow;
4932+
irq_res.desc[0].num = ud->tflow_cnt;
4933+
i = 1;
4934+
} else {
4935+
for (i = 0; i < rm_res->sets; i++) {
4936+
irq_res.desc[i].start = rm_res->desc[i].start +
4937+
oes->pktdma_tchan_flow;
4938+
irq_res.desc[i].num = rm_res->desc[i].num;
4939+
}
48884940
}
48894941
rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
4890-
for (j = 0; j < rm_res->sets; j++, i++) {
4891-
irq_res.desc[i].start = rm_res->desc[j].start +
4892-
oes->pktdma_rchan_flow;
4893-
irq_res.desc[i].num = rm_res->desc[j].num;
4942+
if (IS_ERR(rm_res)) {
4943+
irq_res.desc[i].start = oes->pktdma_rchan_flow;
4944+
irq_res.desc[i].num = ud->rflow_cnt;
4945+
} else {
4946+
for (j = 0; j < rm_res->sets; j++, i++) {
4947+
irq_res.desc[i].start = rm_res->desc[j].start +
4948+
oes->pktdma_rchan_flow;
4949+
irq_res.desc[i].num = rm_res->desc[j].num;
4950+
}
48944951
}
48954952
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
48964953
kfree(irq_res.desc);

0 commit comments

Comments
 (0)