@@ -519,11 +519,12 @@ static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova,
519
519
return __arm_v7s_map (data , iova , paddr , size , prot , lvl + 1 , cptep , gfp );
520
520
}
521
521
522
- static int arm_v7s_map (struct io_pgtable_ops * ops , unsigned long iova ,
523
- phys_addr_t paddr , size_t size , int prot , gfp_t gfp )
522
+ static int arm_v7s_map_pages (struct io_pgtable_ops * ops , unsigned long iova ,
523
+ phys_addr_t paddr , size_t pgsize , size_t pgcount ,
524
+ int prot , gfp_t gfp , size_t * mapped )
524
525
{
525
526
struct arm_v7s_io_pgtable * data = io_pgtable_ops_to_data (ops );
526
- int ret ;
527
+ int ret = - EINVAL ;
527
528
528
529
if (WARN_ON (iova >= (1ULL << data -> iop .cfg .ias ) ||
529
530
paddr >= (1ULL << data -> iop .cfg .oas )))
@@ -533,7 +534,17 @@ static int arm_v7s_map(struct io_pgtable_ops *ops, unsigned long iova,
533
534
if (!(prot & (IOMMU_READ | IOMMU_WRITE )))
534
535
return 0 ;
535
536
536
- ret = __arm_v7s_map (data , iova , paddr , size , prot , 1 , data -> pgd , gfp );
537
+ while (pgcount -- ) {
538
+ ret = __arm_v7s_map (data , iova , paddr , pgsize , prot , 1 , data -> pgd ,
539
+ gfp );
540
+ if (ret )
541
+ break ;
542
+
543
+ iova += pgsize ;
544
+ paddr += pgsize ;
545
+ if (mapped )
546
+ * mapped += pgsize ;
547
+ }
537
548
/*
538
549
* Synchronise all PTE updates for the new mapping before there's
539
550
* a chance for anything to kick off a table walk for the new iova.
@@ -543,6 +554,12 @@ static int arm_v7s_map(struct io_pgtable_ops *ops, unsigned long iova,
543
554
return ret ;
544
555
}
545
556
557
+ static int arm_v7s_map (struct io_pgtable_ops * ops , unsigned long iova ,
558
+ phys_addr_t paddr , size_t size , int prot , gfp_t gfp )
559
+ {
560
+ return arm_v7s_map_pages (ops , iova , paddr , size , 1 , prot , gfp , NULL );
561
+ }
562
+
546
563
static void arm_v7s_free_pgtable (struct io_pgtable * iop )
547
564
{
548
565
struct arm_v7s_io_pgtable * data = io_pgtable_to_data (iop );
@@ -797,6 +814,7 @@ static struct io_pgtable *arm_v7s_alloc_pgtable(struct io_pgtable_cfg *cfg,
797
814
798
815
data -> iop .ops = (struct io_pgtable_ops ) {
799
816
.map = arm_v7s_map ,
817
+ .map_pages = arm_v7s_map_pages ,
800
818
.unmap = arm_v7s_unmap ,
801
819
.unmap_pages = arm_v7s_unmap_pages ,
802
820
.iova_to_phys = arm_v7s_iova_to_phys ,
0 commit comments