23
23
#include <linux/types.h>
24
24
25
25
#include <asm/barrier.h>
26
+ #include "iommu-pages.h"
26
27
27
28
#define DART1_MAX_ADDR_BITS 36
28
29
@@ -106,18 +107,12 @@ static phys_addr_t iopte_to_paddr(dart_iopte pte,
106
107
return paddr ;
107
108
}
108
109
109
- static void * __dart_alloc_pages (size_t size , gfp_t gfp ,
110
- struct io_pgtable_cfg * cfg )
110
+ static void * __dart_alloc_pages (size_t size , gfp_t gfp )
111
111
{
112
112
int order = get_order (size );
113
- struct page * p ;
114
113
115
114
VM_BUG_ON ((gfp & __GFP_HIGHMEM ));
116
- p = alloc_pages (gfp | __GFP_ZERO , order );
117
- if (!p )
118
- return NULL ;
119
-
120
- return page_address (p );
115
+ return iommu_alloc_pages (gfp , order );
121
116
}
122
117
123
118
static int dart_init_pte (struct dart_io_pgtable * data ,
@@ -262,13 +257,13 @@ static int dart_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
262
257
263
258
/* no L2 table present */
264
259
if (!pte ) {
265
- cptep = __dart_alloc_pages (tblsz , gfp , cfg );
260
+ cptep = __dart_alloc_pages (tblsz , gfp );
266
261
if (!cptep )
267
262
return - ENOMEM ;
268
263
269
264
pte = dart_install_table (cptep , ptep , 0 , data );
270
265
if (pte )
271
- free_pages (( unsigned long ) cptep , get_order (tblsz ));
266
+ iommu_free_pages ( cptep , get_order (tblsz ));
272
267
273
268
/* L2 table is present (now) */
274
269
pte = READ_ONCE (* ptep );
@@ -419,8 +414,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
419
414
cfg -> apple_dart_cfg .n_ttbrs = 1 << data -> tbl_bits ;
420
415
421
416
for (i = 0 ; i < cfg -> apple_dart_cfg .n_ttbrs ; ++ i ) {
422
- data -> pgd [i ] = __dart_alloc_pages (DART_GRANULE (data ), GFP_KERNEL ,
423
- cfg );
417
+ data -> pgd [i ] = __dart_alloc_pages (DART_GRANULE (data ), GFP_KERNEL );
424
418
if (!data -> pgd [i ])
425
419
goto out_free_data ;
426
420
cfg -> apple_dart_cfg .ttbr [i ] = virt_to_phys (data -> pgd [i ]);
@@ -429,16 +423,18 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
429
423
return & data -> iop ;
430
424
431
425
out_free_data :
432
- while (-- i >= 0 )
433
- free_pages ((unsigned long )data -> pgd [i ],
434
- get_order (DART_GRANULE (data )));
426
+ while (-- i >= 0 ) {
427
+ iommu_free_pages (data -> pgd [i ],
428
+ get_order (DART_GRANULE (data )));
429
+ }
435
430
kfree (data );
436
431
return NULL ;
437
432
}
438
433
439
434
static void apple_dart_free_pgtable (struct io_pgtable * iop )
440
435
{
441
436
struct dart_io_pgtable * data = io_pgtable_to_data (iop );
437
+ int order = get_order (DART_GRANULE (data ));
442
438
dart_iopte * ptep , * end ;
443
439
int i ;
444
440
@@ -449,15 +445,10 @@ static void apple_dart_free_pgtable(struct io_pgtable *iop)
449
445
while (ptep != end ) {
450
446
dart_iopte pte = * ptep ++ ;
451
447
452
- if (pte ) {
453
- unsigned long page =
454
- (unsigned long )iopte_deref (pte , data );
455
-
456
- free_pages (page , get_order (DART_GRANULE (data )));
457
- }
448
+ if (pte )
449
+ iommu_free_pages (iopte_deref (pte , data ), order );
458
450
}
459
- free_pages ((unsigned long )data -> pgd [i ],
460
- get_order (DART_GRANULE (data )));
451
+ iommu_free_pages (data -> pgd [i ], order );
461
452
}
462
453
463
454
kfree (data );
0 commit comments