@@ -4534,45 +4534,60 @@ static int udma_setup_resources(struct udma_dev *ud)
4534
4534
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TCHAN ];
4535
4535
if (IS_ERR (rm_res )) {
4536
4536
bitmap_zero (ud -> tchan_map , ud -> tchan_cnt );
4537
+ irq_res .sets = 1 ;
4537
4538
} else {
4538
4539
bitmap_fill (ud -> tchan_map , ud -> tchan_cnt );
4539
4540
for (i = 0 ; i < rm_res -> sets ; i ++ )
4540
4541
udma_mark_resource_ranges (ud , ud -> tchan_map ,
4541
4542
& rm_res -> desc [i ], "tchan" );
4543
+ irq_res .sets = rm_res -> sets ;
4542
4544
}
4543
- irq_res .sets = rm_res -> sets ;
4544
4545
4545
4546
/* rchan and matching default flow ranges */
4546
4547
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RCHAN ];
4547
4548
if (IS_ERR (rm_res )) {
4548
4549
bitmap_zero (ud -> rchan_map , ud -> rchan_cnt );
4550
+ irq_res .sets ++ ;
4549
4551
} else {
4550
4552
bitmap_fill (ud -> rchan_map , ud -> rchan_cnt );
4551
4553
for (i = 0 ; i < rm_res -> sets ; i ++ )
4552
4554
udma_mark_resource_ranges (ud , ud -> rchan_map ,
4553
4555
& rm_res -> desc [i ], "rchan" );
4556
+ irq_res .sets += rm_res -> sets ;
4554
4557
}
4555
4558
4556
- irq_res .sets += rm_res -> sets ;
4557
4559
irq_res .desc = kcalloc (irq_res .sets , sizeof (* irq_res .desc ), GFP_KERNEL );
4560
+ if (!irq_res .desc )
4561
+ return - ENOMEM ;
4558
4562
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
+ }
4564
4574
}
4565
4575
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
+ }
4576
4591
}
4577
4592
}
4578
4593
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)
4690
4705
rm_res = tisci_rm -> rm_ranges [RM_RANGE_BCHAN ];
4691
4706
if (IS_ERR (rm_res )) {
4692
4707
bitmap_zero (ud -> bchan_map , ud -> bchan_cnt );
4708
+ irq_res .sets ++ ;
4693
4709
} else {
4694
4710
bitmap_fill (ud -> bchan_map , ud -> bchan_cnt );
4695
4711
for (i = 0 ; i < rm_res -> sets ; i ++ )
4696
4712
udma_mark_resource_ranges (ud , ud -> bchan_map ,
4697
4713
& rm_res -> desc [i ],
4698
4714
"bchan" );
4715
+ irq_res .sets += rm_res -> sets ;
4699
4716
}
4700
- irq_res .sets += rm_res -> sets ;
4701
4717
}
4702
4718
4703
4719
/* tchan ranges */
4704
4720
if (ud -> tchan_cnt ) {
4705
4721
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TCHAN ];
4706
4722
if (IS_ERR (rm_res )) {
4707
4723
bitmap_zero (ud -> tchan_map , ud -> tchan_cnt );
4724
+ irq_res .sets += 2 ;
4708
4725
} else {
4709
4726
bitmap_fill (ud -> tchan_map , ud -> tchan_cnt );
4710
4727
for (i = 0 ; i < rm_res -> sets ; i ++ )
4711
4728
udma_mark_resource_ranges (ud , ud -> tchan_map ,
4712
4729
& rm_res -> desc [i ],
4713
4730
"tchan" );
4731
+ irq_res .sets += rm_res -> sets * 2 ;
4714
4732
}
4715
- irq_res .sets += rm_res -> sets * 2 ;
4716
4733
}
4717
4734
4718
4735
/* rchan ranges */
4719
4736
if (ud -> rchan_cnt ) {
4720
4737
rm_res = tisci_rm -> rm_ranges [RM_RANGE_RCHAN ];
4721
4738
if (IS_ERR (rm_res )) {
4722
4739
bitmap_zero (ud -> rchan_map , ud -> rchan_cnt );
4740
+ irq_res .sets += 2 ;
4723
4741
} else {
4724
4742
bitmap_fill (ud -> rchan_map , ud -> rchan_cnt );
4725
4743
for (i = 0 ; i < rm_res -> sets ; i ++ )
4726
4744
udma_mark_resource_ranges (ud , ud -> rchan_map ,
4727
4745
& rm_res -> desc [i ],
4728
4746
"rchan" );
4747
+ irq_res .sets += rm_res -> sets * 2 ;
4729
4748
}
4730
- irq_res .sets += rm_res -> sets * 2 ;
4731
4749
}
4732
4750
4733
4751
irq_res .desc = kcalloc (irq_res .sets , sizeof (* irq_res .desc ), GFP_KERNEL );
4752
+ if (!irq_res .desc )
4753
+ return - ENOMEM ;
4734
4754
if (ud -> bchan_cnt ) {
4735
4755
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
+ }
4740
4766
}
4741
4767
}
4742
4768
if (ud -> tchan_cnt ) {
4743
4769
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
+ }
4752
4786
}
4753
4787
}
4754
4788
if (ud -> rchan_cnt ) {
4755
4789
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
+ }
4764
4806
}
4765
4807
}
4766
4808
@@ -4858,39 +4900,54 @@ static int pktdma_setup_resources(struct udma_dev *ud)
4858
4900
if (IS_ERR (rm_res )) {
4859
4901
/* all rflows are assigned exclusively to Linux */
4860
4902
bitmap_zero (ud -> rflow_in_use , ud -> rflow_cnt );
4903
+ irq_res .sets = 1 ;
4861
4904
} else {
4862
4905
bitmap_fill (ud -> rflow_in_use , ud -> rflow_cnt );
4863
4906
for (i = 0 ; i < rm_res -> sets ; i ++ )
4864
4907
udma_mark_resource_ranges (ud , ud -> rflow_in_use ,
4865
4908
& rm_res -> desc [i ], "rflow" );
4909
+ irq_res .sets = rm_res -> sets ;
4866
4910
}
4867
- irq_res .sets = rm_res -> sets ;
4868
4911
4869
4912
/* tflow ranges */
4870
4913
rm_res = tisci_rm -> rm_ranges [RM_RANGE_TFLOW ];
4871
4914
if (IS_ERR (rm_res )) {
4872
4915
/* all tflows are assigned exclusively to Linux */
4873
4916
bitmap_zero (ud -> tflow_map , ud -> tflow_cnt );
4917
+ irq_res .sets ++ ;
4874
4918
} else {
4875
4919
bitmap_fill (ud -> tflow_map , ud -> tflow_cnt );
4876
4920
for (i = 0 ; i < rm_res -> sets ; i ++ )
4877
4921
udma_mark_resource_ranges (ud , ud -> tflow_map ,
4878
4922
& rm_res -> desc [i ], "tflow" );
4923
+ irq_res .sets += rm_res -> sets ;
4879
4924
}
4880
- irq_res .sets += rm_res -> sets ;
4881
4925
4882
4926
irq_res .desc = kcalloc (irq_res .sets , sizeof (* irq_res .desc ), GFP_KERNEL );
4927
+ if (!irq_res .desc )
4928
+ return - ENOMEM ;
4883
4929
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
+ }
4888
4940
}
4889
4941
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
+ }
4894
4951
}
4895
4952
ret = ti_sci_inta_msi_domain_alloc_irqs (ud -> dev , & irq_res );
4896
4953
kfree (irq_res .desc );
0 commit comments