@@ -519,11 +519,12 @@ static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova,
519519 return __arm_v7s_map (data , iova , paddr , size , prot , lvl + 1 , cptep , gfp );
520520}
521521
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 )
524525{
525526 struct arm_v7s_io_pgtable * data = io_pgtable_ops_to_data (ops );
526- int ret ;
527+ int ret = - EINVAL ;
527528
528529 if (WARN_ON (iova >= (1ULL << data -> iop .cfg .ias ) ||
529530 paddr >= (1ULL << data -> iop .cfg .oas )))
@@ -533,7 +534,17 @@ static int arm_v7s_map(struct io_pgtable_ops *ops, unsigned long iova,
533534 if (!(prot & (IOMMU_READ | IOMMU_WRITE )))
534535 return 0 ;
535536
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+ }
537548 /*
538549 * Synchronise all PTE updates for the new mapping before there's
539550 * 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,
543554 return ret ;
544555}
545556
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+
546563static void arm_v7s_free_pgtable (struct io_pgtable * iop )
547564{
548565 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,
797814
798815 data -> iop .ops = (struct io_pgtable_ops ) {
799816 .map = arm_v7s_map ,
817+ .map_pages = arm_v7s_map_pages ,
800818 .unmap = arm_v7s_unmap ,
801819 .unmap_pages = arm_v7s_unmap_pages ,
802820 .iova_to_phys = arm_v7s_iova_to_phys ,
0 commit comments