@@ -183,7 +183,6 @@ struct apple_dart_master_cfg {
183
183
184
184
static struct platform_driver apple_dart_driver ;
185
185
static const struct iommu_ops apple_dart_iommu_ops ;
186
- static const struct iommu_flush_ops apple_dart_tlb_ops ;
187
186
188
187
static struct apple_dart_domain * to_dart_domain (struct iommu_domain * dom )
189
188
{
@@ -338,22 +337,6 @@ static void apple_dart_iotlb_sync_map(struct iommu_domain *domain,
338
337
apple_dart_domain_flush_tlb (to_dart_domain (domain ));
339
338
}
340
339
341
- static void apple_dart_tlb_flush_all (void * cookie )
342
- {
343
- apple_dart_domain_flush_tlb (cookie );
344
- }
345
-
346
- static void apple_dart_tlb_flush_walk (unsigned long iova , size_t size ,
347
- size_t granule , void * cookie )
348
- {
349
- apple_dart_domain_flush_tlb (cookie );
350
- }
351
-
352
- static const struct iommu_flush_ops apple_dart_tlb_ops = {
353
- .tlb_flush_all = apple_dart_tlb_flush_all ,
354
- .tlb_flush_walk = apple_dart_tlb_flush_walk ,
355
- };
356
-
357
340
static phys_addr_t apple_dart_iova_to_phys (struct iommu_domain * domain ,
358
341
dma_addr_t iova )
359
342
{
@@ -435,7 +418,6 @@ static int apple_dart_finalize_domain(struct iommu_domain *domain,
435
418
.ias = 32 ,
436
419
.oas = 36 ,
437
420
.coherent_walk = 1 ,
438
- .tlb = & apple_dart_tlb_ops ,
439
421
.iommu_dev = dart -> dev ,
440
422
};
441
423
@@ -661,16 +643,34 @@ static int apple_dart_of_xlate(struct device *dev, struct of_phandle_args *args)
661
643
return - EINVAL ;
662
644
}
663
645
646
+ static DEFINE_MUTEX (apple_dart_groups_lock );
647
+
648
+ static void apple_dart_release_group (void * iommu_data )
649
+ {
650
+ int i , sid ;
651
+ struct apple_dart_stream_map * stream_map ;
652
+ struct apple_dart_master_cfg * group_master_cfg = iommu_data ;
653
+
654
+ mutex_lock (& apple_dart_groups_lock );
655
+
656
+ for_each_stream_map (i , group_master_cfg , stream_map )
657
+ for_each_set_bit (sid , & stream_map -> sidmap , DART_MAX_STREAMS )
658
+ stream_map -> dart -> sid2group [sid ] = NULL ;
659
+
660
+ kfree (iommu_data );
661
+ mutex_unlock (& apple_dart_groups_lock );
662
+ }
663
+
664
664
static struct iommu_group * apple_dart_device_group (struct device * dev )
665
665
{
666
- static DEFINE_MUTEX (lock );
667
666
int i , sid ;
668
667
struct apple_dart_master_cfg * cfg = dev_iommu_priv_get (dev );
669
668
struct apple_dart_stream_map * stream_map ;
669
+ struct apple_dart_master_cfg * group_master_cfg ;
670
670
struct iommu_group * group = NULL ;
671
671
struct iommu_group * res = ERR_PTR (- EINVAL );
672
672
673
- mutex_lock (& lock );
673
+ mutex_lock (& apple_dart_groups_lock );
674
674
675
675
for_each_stream_map (i , cfg , stream_map ) {
676
676
for_each_set_bit (sid , & stream_map -> sidmap , DART_MAX_STREAMS ) {
@@ -698,14 +698,28 @@ static struct iommu_group *apple_dart_device_group(struct device *dev)
698
698
#endif
699
699
group = generic_device_group (dev );
700
700
701
+ res = ERR_PTR (- ENOMEM );
702
+ if (!group )
703
+ goto out ;
704
+
705
+ group_master_cfg = kzalloc (sizeof (* group_master_cfg ), GFP_KERNEL );
706
+ if (!group_master_cfg ) {
707
+ iommu_group_put (group );
708
+ goto out ;
709
+ }
710
+
711
+ memcpy (group_master_cfg , cfg , sizeof (* group_master_cfg ));
712
+ iommu_group_set_iommudata (group , group_master_cfg ,
713
+ apple_dart_release_group );
714
+
701
715
for_each_stream_map (i , cfg , stream_map )
702
716
for_each_set_bit (sid , & stream_map -> sidmap , DART_MAX_STREAMS )
703
717
stream_map -> dart -> sid2group [sid ] = group ;
704
718
705
719
res = group ;
706
720
707
721
out :
708
- mutex_unlock (& lock );
722
+ mutex_unlock (& apple_dart_groups_lock );
709
723
return res ;
710
724
}
711
725
0 commit comments