@@ -271,10 +271,11 @@ static void sprd_iommu_detach_device(struct iommu_domain *domain,
271
271
}
272
272
273
273
static int sprd_iommu_map (struct iommu_domain * domain , unsigned long iova ,
274
- phys_addr_t paddr , size_t size , int prot , gfp_t gfp )
274
+ phys_addr_t paddr , size_t pgsize , size_t pgcount ,
275
+ int prot , gfp_t gfp , size_t * mapped )
275
276
{
276
277
struct sprd_iommu_domain * dom = to_sprd_domain (domain );
277
- unsigned int page_num = size >> SPRD_IOMMU_PAGE_SHIFT ;
278
+ size_t size = pgcount * SPRD_IOMMU_PAGE_SIZE ;
278
279
unsigned long flags ;
279
280
unsigned int i ;
280
281
u32 * pgt_base_iova ;
@@ -296,35 +297,37 @@ static int sprd_iommu_map(struct iommu_domain *domain, unsigned long iova,
296
297
pgt_base_iova = dom -> pgt_va + ((iova - start ) >> SPRD_IOMMU_PAGE_SHIFT );
297
298
298
299
spin_lock_irqsave (& dom -> pgtlock , flags );
299
- for (i = 0 ; i < page_num ; i ++ ) {
300
+ for (i = 0 ; i < pgcount ; i ++ ) {
300
301
pgt_base_iova [i ] = pabase >> SPRD_IOMMU_PAGE_SHIFT ;
301
302
pabase += SPRD_IOMMU_PAGE_SIZE ;
302
303
}
303
304
spin_unlock_irqrestore (& dom -> pgtlock , flags );
304
305
306
+ * mapped = size ;
305
307
return 0 ;
306
308
}
307
309
308
310
static size_t sprd_iommu_unmap (struct iommu_domain * domain , unsigned long iova ,
309
- size_t size , struct iommu_iotlb_gather * iotlb_gather )
311
+ size_t pgsize , size_t pgcount ,
312
+ struct iommu_iotlb_gather * iotlb_gather )
310
313
{
311
314
struct sprd_iommu_domain * dom = to_sprd_domain (domain );
312
315
unsigned long flags ;
313
316
u32 * pgt_base_iova ;
314
- unsigned int page_num = size >> SPRD_IOMMU_PAGE_SHIFT ;
317
+ size_t size = pgcount * SPRD_IOMMU_PAGE_SIZE ;
315
318
unsigned long start = domain -> geometry .aperture_start ;
316
319
unsigned long end = domain -> geometry .aperture_end ;
317
320
318
321
if (iova < start || (iova + size ) > (end + 1 ))
319
- return - EINVAL ;
322
+ return 0 ;
320
323
321
324
pgt_base_iova = dom -> pgt_va + ((iova - start ) >> SPRD_IOMMU_PAGE_SHIFT );
322
325
323
326
spin_lock_irqsave (& dom -> pgtlock , flags );
324
- memset (pgt_base_iova , 0 , page_num * sizeof (u32 ));
327
+ memset (pgt_base_iova , 0 , pgcount * sizeof (u32 ));
325
328
spin_unlock_irqrestore (& dom -> pgtlock , flags );
326
329
327
- return 0 ;
330
+ return size ;
328
331
}
329
332
330
333
static void sprd_iommu_sync_map (struct iommu_domain * domain ,
@@ -407,13 +410,13 @@ static const struct iommu_ops sprd_iommu_ops = {
407
410
.probe_device = sprd_iommu_probe_device ,
408
411
.device_group = sprd_iommu_device_group ,
409
412
.of_xlate = sprd_iommu_of_xlate ,
410
- .pgsize_bitmap = ~ 0UL << SPRD_IOMMU_PAGE_SHIFT ,
413
+ .pgsize_bitmap = SPRD_IOMMU_PAGE_SIZE ,
411
414
.owner = THIS_MODULE ,
412
415
.default_domain_ops = & (const struct iommu_domain_ops ) {
413
416
.attach_dev = sprd_iommu_attach_device ,
414
417
.detach_dev = sprd_iommu_detach_device ,
415
- .map = sprd_iommu_map ,
416
- .unmap = sprd_iommu_unmap ,
418
+ .map_pages = sprd_iommu_map ,
419
+ .unmap_pages = sprd_iommu_unmap ,
417
420
.iotlb_sync_map = sprd_iommu_sync_map ,
418
421
.iotlb_sync = sprd_iommu_sync ,
419
422
.iova_to_phys = sprd_iommu_iova_to_phys ,
0 commit comments