@@ -4535,45 +4535,60 @@ static int udma_setup_resources(struct udma_dev *ud)
4535
4535
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TCHAN ];
4536
4536
if (IS_ERR (rm_res )) {
4537
4537
bitmap_zero (ud -> tchan_map , ud -> tchan_cnt );
4538
+ irq_res .sets = 1 ;
4538
4539
} else {
4539
4540
bitmap_fill (ud -> tchan_map , ud -> tchan_cnt );
4540
4541
for (i = 0 ; i < rm_res -> sets ; i ++ )
4541
4542
udma_mark_resource_ranges (ud , ud -> tchan_map ,
4542
4543
& rm_res -> desc [i ], "tchan" );
4544
+ irq_res .sets = rm_res -> sets ;
4543
4545
}
4544
- irq_res .sets = rm_res -> sets ;
4545
4546
4546
4547
/* rchan and matching default flow ranges */
4547
4548
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RCHAN ];
4548
4549
if (IS_ERR (rm_res )) {
4549
4550
bitmap_zero (ud -> rchan_map , ud -> rchan_cnt );
4551
+ irq_res .sets ++ ;
4550
4552
} else {
4551
4553
bitmap_fill (ud -> rchan_map , ud -> rchan_cnt );
4552
4554
for (i = 0 ; i < rm_res -> sets ; i ++ )
4553
4555
udma_mark_resource_ranges (ud , ud -> rchan_map ,
4554
4556
& rm_res -> desc [i ], "rchan" );
4557
+ irq_res .sets += rm_res -> sets ;
4555
4558
}
4556
4559
4557
- irq_res .sets += rm_res -> sets ;
4558
4560
irq_res .desc = kcalloc (irq_res .sets , sizeof (* irq_res .desc ), GFP_KERNEL );
4561
+ if (!irq_res .desc )
4562
+ return - ENOMEM ;
4559
4563
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TCHAN ];
4560
- for (i = 0 ; i < rm_res -> sets ; i ++ ) {
4561
- irq_res .desc [i ].start = rm_res -> desc [i ].start ;
4562
- irq_res .desc [i ].num = rm_res -> desc [i ].num ;
4563
- irq_res .desc [i ].start_sec = rm_res -> desc [i ].start_sec ;
4564
- irq_res .desc [i ].num_sec = rm_res -> desc [i ].num_sec ;
4564
+ if (IS_ERR (rm_res )) {
4565
+ irq_res .desc [0 ].start = 0 ;
4566
+ irq_res .desc [0 ].num = ud -> tchan_cnt ;
4567
+ i = 1 ;
4568
+ } else {
4569
+ for (i = 0 ; i < rm_res -> sets ; i ++ ) {
4570
+ irq_res .desc [i ].start = rm_res -> desc [i ].start ;
4571
+ irq_res .desc [i ].num = rm_res -> desc [i ].num ;
4572
+ irq_res .desc [i ].start_sec = rm_res -> desc [i ].start_sec ;
4573
+ irq_res .desc [i ].num_sec = rm_res -> desc [i ].num_sec ;
4574
+ }
4565
4575
}
4566
4576
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RCHAN ];
4567
- for (j = 0 ; j < rm_res -> sets ; j ++ , i ++ ) {
4568
- if (rm_res -> desc [j ].num ) {
4569
- irq_res .desc [i ].start = rm_res -> desc [j ].start +
4570
- ud -> soc_data -> oes .udma_rchan ;
4571
- irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4572
- }
4573
- if (rm_res -> desc [j ].num_sec ) {
4574
- irq_res .desc [i ].start_sec = rm_res -> desc [j ].start_sec +
4575
- ud -> soc_data -> oes .udma_rchan ;
4576
- irq_res .desc [i ].num_sec = rm_res -> desc [j ].num_sec ;
4577
+ if (IS_ERR (rm_res )) {
4578
+ irq_res .desc [i ].start = 0 ;
4579
+ irq_res .desc [i ].num = ud -> rchan_cnt ;
4580
+ } else {
4581
+ for (j = 0 ; j < rm_res -> sets ; j ++ , i ++ ) {
4582
+ if (rm_res -> desc [j ].num ) {
4583
+ irq_res .desc [i ].start = rm_res -> desc [j ].start +
4584
+ ud -> soc_data -> oes .udma_rchan ;
4585
+ irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4586
+ }
4587
+ if (rm_res -> desc [j ].num_sec ) {
4588
+ irq_res .desc [i ].start_sec = rm_res -> desc [j ].start_sec +
4589
+ ud -> soc_data -> oes .udma_rchan ;
4590
+ irq_res .desc [i ].num_sec = rm_res -> desc [j ].num_sec ;
4591
+ }
4577
4592
}
4578
4593
}
4579
4594
ret = ti_sci_inta_msi_domain_alloc_irqs (ud -> dev , & irq_res );
@@ -4691,77 +4706,104 @@ static int bcdma_setup_resources(struct udma_dev *ud)
4691
4706
rm_res = tisci_rm -> rm_ranges [RM_RANGE_BCHAN ];
4692
4707
if (IS_ERR (rm_res )) {
4693
4708
bitmap_zero (ud -> bchan_map , ud -> bchan_cnt );
4709
+ irq_res .sets ++ ;
4694
4710
} else {
4695
4711
bitmap_fill (ud -> bchan_map , ud -> bchan_cnt );
4696
4712
for (i = 0 ; i < rm_res -> sets ; i ++ )
4697
4713
udma_mark_resource_ranges (ud , ud -> bchan_map ,
4698
4714
& rm_res -> desc [i ],
4699
4715
"bchan" );
4716
+ irq_res .sets += rm_res -> sets ;
4700
4717
}
4701
- irq_res .sets += rm_res -> sets ;
4702
4718
}
4703
4719
4704
4720
/* tchan ranges */
4705
4721
if (ud -> tchan_cnt ) {
4706
4722
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TCHAN ];
4707
4723
if (IS_ERR (rm_res )) {
4708
4724
bitmap_zero (ud -> tchan_map , ud -> tchan_cnt );
4725
+ irq_res .sets += 2 ;
4709
4726
} else {
4710
4727
bitmap_fill (ud -> tchan_map , ud -> tchan_cnt );
4711
4728
for (i = 0 ; i < rm_res -> sets ; i ++ )
4712
4729
udma_mark_resource_ranges (ud , ud -> tchan_map ,
4713
4730
& rm_res -> desc [i ],
4714
4731
"tchan" );
4732
+ irq_res .sets += rm_res -> sets * 2 ;
4715
4733
}
4716
- irq_res .sets += rm_res -> sets * 2 ;
4717
4734
}
4718
4735
4719
4736
/* rchan ranges */
4720
4737
if (ud -> rchan_cnt ) {
4721
4738
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RCHAN ];
4722
4739
if (IS_ERR (rm_res )) {
4723
4740
bitmap_zero (ud -> rchan_map , ud -> rchan_cnt );
4741
+ irq_res .sets += 2 ;
4724
4742
} else {
4725
4743
bitmap_fill (ud -> rchan_map , ud -> rchan_cnt );
4726
4744
for (i = 0 ; i < rm_res -> sets ; i ++ )
4727
4745
udma_mark_resource_ranges (ud , ud -> rchan_map ,
4728
4746
& rm_res -> desc [i ],
4729
4747
"rchan" );
4748
+ irq_res .sets += rm_res -> sets * 2 ;
4730
4749
}
4731
- irq_res .sets += rm_res -> sets * 2 ;
4732
4750
}
4733
4751
4734
4752
irq_res .desc = kcalloc (irq_res .sets , sizeof (* irq_res .desc ), GFP_KERNEL );
4753
+ if (!irq_res .desc )
4754
+ return - ENOMEM ;
4735
4755
if (ud -> bchan_cnt ) {
4736
4756
rm_res = tisci_rm -> rm_ranges [RM_RANGE_BCHAN ];
4737
- for (i = 0 ; i < rm_res -> sets ; i ++ ) {
4738
- irq_res .desc [i ].start = rm_res -> desc [i ].start +
4739
- oes -> bcdma_bchan_ring ;
4740
- irq_res .desc [i ].num = rm_res -> desc [i ].num ;
4757
+ if (IS_ERR (rm_res )) {
4758
+ irq_res .desc [0 ].start = oes -> bcdma_bchan_ring ;
4759
+ irq_res .desc [0 ].num = ud -> bchan_cnt ;
4760
+ i = 1 ;
4761
+ } else {
4762
+ for (i = 0 ; i < rm_res -> sets ; i ++ ) {
4763
+ irq_res .desc [i ].start = rm_res -> desc [i ].start +
4764
+ oes -> bcdma_bchan_ring ;
4765
+ irq_res .desc [i ].num = rm_res -> desc [i ].num ;
4766
+ }
4741
4767
}
4742
4768
}
4743
4769
if (ud -> tchan_cnt ) {
4744
4770
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TCHAN ];
4745
- for (j = 0 ; j < rm_res -> sets ; j ++ , i += 2 ) {
4746
- irq_res .desc [i ].start = rm_res -> desc [j ].start +
4747
- oes -> bcdma_tchan_data ;
4748
- irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4749
-
4750
- irq_res .desc [i + 1 ].start = rm_res -> desc [j ].start +
4751
- oes -> bcdma_tchan_ring ;
4752
- irq_res .desc [i + 1 ].num = rm_res -> desc [j ].num ;
4771
+ if (IS_ERR (rm_res )) {
4772
+ irq_res .desc [i ].start = oes -> bcdma_tchan_data ;
4773
+ irq_res .desc [i ].num = ud -> tchan_cnt ;
4774
+ irq_res .desc [i + 1 ].start = oes -> bcdma_tchan_ring ;
4775
+ irq_res .desc [i + 1 ].num = ud -> tchan_cnt ;
4776
+ i += 2 ;
4777
+ } else {
4778
+ for (j = 0 ; j < rm_res -> sets ; j ++ , i += 2 ) {
4779
+ irq_res .desc [i ].start = rm_res -> desc [j ].start +
4780
+ oes -> bcdma_tchan_data ;
4781
+ irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4782
+
4783
+ irq_res .desc [i + 1 ].start = rm_res -> desc [j ].start +
4784
+ oes -> bcdma_tchan_ring ;
4785
+ irq_res .desc [i + 1 ].num = rm_res -> desc [j ].num ;
4786
+ }
4753
4787
}
4754
4788
}
4755
4789
if (ud -> rchan_cnt ) {
4756
4790
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RCHAN ];
4757
- for (j = 0 ; j < rm_res -> sets ; j ++ , i += 2 ) {
4758
- irq_res .desc [i ].start = rm_res -> desc [j ].start +
4759
- oes -> bcdma_rchan_data ;
4760
- irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4761
-
4762
- irq_res .desc [i + 1 ].start = rm_res -> desc [j ].start +
4763
- oes -> bcdma_rchan_ring ;
4764
- irq_res .desc [i + 1 ].num = rm_res -> desc [j ].num ;
4791
+ if (IS_ERR (rm_res )) {
4792
+ irq_res .desc [i ].start = oes -> bcdma_rchan_data ;
4793
+ irq_res .desc [i ].num = ud -> rchan_cnt ;
4794
+ irq_res .desc [i + 1 ].start = oes -> bcdma_rchan_ring ;
4795
+ irq_res .desc [i + 1 ].num = ud -> rchan_cnt ;
4796
+ i += 2 ;
4797
+ } else {
4798
+ for (j = 0 ; j < rm_res -> sets ; j ++ , i += 2 ) {
4799
+ irq_res .desc [i ].start = rm_res -> desc [j ].start +
4800
+ oes -> bcdma_rchan_data ;
4801
+ irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4802
+
4803
+ irq_res .desc [i + 1 ].start = rm_res -> desc [j ].start +
4804
+ oes -> bcdma_rchan_ring ;
4805
+ irq_res .desc [i + 1 ].num = rm_res -> desc [j ].num ;
4806
+ }
4765
4807
}
4766
4808
}
4767
4809
@@ -4859,39 +4901,54 @@ static int pktdma_setup_resources(struct udma_dev *ud)
4859
4901
if (IS_ERR (rm_res )) {
4860
4902
/* all rflows are assigned exclusively to Linux */
4861
4903
bitmap_zero (ud -> rflow_in_use , ud -> rflow_cnt );
4904
+ irq_res .sets = 1 ;
4862
4905
} else {
4863
4906
bitmap_fill (ud -> rflow_in_use , ud -> rflow_cnt );
4864
4907
for (i = 0 ; i < rm_res -> sets ; i ++ )
4865
4908
udma_mark_resource_ranges (ud , ud -> rflow_in_use ,
4866
4909
& rm_res -> desc [i ], "rflow" );
4910
+ irq_res .sets = rm_res -> sets ;
4867
4911
}
4868
- irq_res .sets = rm_res -> sets ;
4869
4912
4870
4913
/* tflow ranges */
4871
4914
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TFLOW ];
4872
4915
if (IS_ERR (rm_res )) {
4873
4916
/* all tflows are assigned exclusively to Linux */
4874
4917
bitmap_zero (ud -> tflow_map , ud -> tflow_cnt );
4918
+ irq_res .sets ++ ;
4875
4919
} else {
4876
4920
bitmap_fill (ud -> tflow_map , ud -> tflow_cnt );
4877
4921
for (i = 0 ; i < rm_res -> sets ; i ++ )
4878
4922
udma_mark_resource_ranges (ud , ud -> tflow_map ,
4879
4923
& rm_res -> desc [i ], "tflow" );
4924
+ irq_res .sets += rm_res -> sets ;
4880
4925
}
4881
- irq_res .sets += rm_res -> sets ;
4882
4926
4883
4927
irq_res .desc = kcalloc (irq_res .sets , sizeof (* irq_res .desc ), GFP_KERNEL );
4928
+ if (!irq_res .desc )
4929
+ return - ENOMEM ;
4884
4930
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TFLOW ];
4885
- for (i = 0 ; i < rm_res -> sets ; i ++ ) {
4886
- irq_res .desc [i ].start = rm_res -> desc [i ].start +
4887
- oes -> pktdma_tchan_flow ;
4888
- irq_res .desc [i ].num = rm_res -> desc [i ].num ;
4931
+ if (IS_ERR (rm_res )) {
4932
+ irq_res .desc [0 ].start = oes -> pktdma_tchan_flow ;
4933
+ irq_res .desc [0 ].num = ud -> tflow_cnt ;
4934
+ i = 1 ;
4935
+ } else {
4936
+ for (i = 0 ; i < rm_res -> sets ; i ++ ) {
4937
+ irq_res .desc [i ].start = rm_res -> desc [i ].start +
4938
+ oes -> pktdma_tchan_flow ;
4939
+ irq_res .desc [i ].num = rm_res -> desc [i ].num ;
4940
+ }
4889
4941
}
4890
4942
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RFLOW ];
4891
- for (j = 0 ; j < rm_res -> sets ; j ++ , i ++ ) {
4892
- irq_res .desc [i ].start = rm_res -> desc [j ].start +
4893
- oes -> pktdma_rchan_flow ;
4894
- irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4943
+ if (IS_ERR (rm_res )) {
4944
+ irq_res .desc [i ].start = oes -> pktdma_rchan_flow ;
4945
+ irq_res .desc [i ].num = ud -> rflow_cnt ;
4946
+ } else {
4947
+ for (j = 0 ; j < rm_res -> sets ; j ++ , i ++ ) {
4948
+ irq_res .desc [i ].start = rm_res -> desc [j ].start +
4949
+ oes -> pktdma_rchan_flow ;
4950
+ irq_res .desc [i ].num = rm_res -> desc [j ].num ;
4951
+ }
4895
4952
}
4896
4953
ret = ti_sci_inta_msi_domain_alloc_irqs (ud -> dev , & irq_res );
4897
4954
kfree (irq_res .desc );
0 commit comments