@@ -251,8 +251,6 @@ static inline bool arm_lpae_concat_mandatory(struct io_pgtable_cfg *cfg,
251
251
(data -> start_level == 1 ) && (oas == 40 );
252
252
}
253
253
254
- static bool selftest_running = false;
255
-
256
254
static dma_addr_t __arm_lpae_dma_addr (void * pages )
257
255
{
258
256
return (dma_addr_t )virt_to_phys (pages );
@@ -371,7 +369,7 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data,
371
369
for (i = 0 ; i < num_entries ; i ++ )
372
370
if (iopte_leaf (ptep [i ], lvl , data -> iop .fmt )) {
373
371
/* We require an unmap first */
374
- WARN_ON (!selftest_running );
372
+ WARN_ON (!( data -> iop . cfg . quirks & IO_PGTABLE_QUIRK_NO_WARN ) );
375
373
return - EEXIST ;
376
374
} else if (iopte_type (ptep [i ]) == ARM_LPAE_PTE_TYPE_TABLE ) {
377
375
/*
@@ -473,7 +471,7 @@ static int __arm_lpae_map(struct arm_lpae_io_pgtable *data, unsigned long iova,
473
471
cptep = iopte_deref (pte , data );
474
472
} else if (pte ) {
475
473
/* We require an unmap first */
476
- WARN_ON (!selftest_running );
474
+ WARN_ON (!( cfg -> quirks & IO_PGTABLE_QUIRK_NO_WARN ) );
477
475
return - EEXIST ;
478
476
}
479
477
@@ -641,8 +639,10 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
641
639
unmap_idx_start = ARM_LPAE_LVL_IDX (iova , lvl , data );
642
640
ptep += unmap_idx_start ;
643
641
pte = READ_ONCE (* ptep );
644
- if (WARN_ON (!pte ))
645
- return 0 ;
642
+ if (!pte ) {
643
+ WARN_ON (!(data -> iop .cfg .quirks & IO_PGTABLE_QUIRK_NO_WARN ));
644
+ return - ENOENT ;
645
+ }
646
646
647
647
/* If the size matches this level, we're in the right place */
648
648
if (size == ARM_LPAE_BLOCK_SIZE (lvl , data )) {
@@ -652,8 +652,10 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data,
652
652
/* Find and handle non-leaf entries */
653
653
for (i = 0 ; i < num_entries ; i ++ ) {
654
654
pte = READ_ONCE (ptep [i ]);
655
- if (WARN_ON (!pte ))
655
+ if (!pte ) {
656
+ WARN_ON (!(data -> iop .cfg .quirks & IO_PGTABLE_QUIRK_NO_WARN ));
656
657
break ;
658
+ }
657
659
658
660
if (!iopte_leaf (pte , lvl , iop -> fmt )) {
659
661
__arm_lpae_clear_pte (& ptep [i ], & iop -> cfg , 1 );
@@ -968,7 +970,8 @@ arm_64_lpae_alloc_pgtable_s1(struct io_pgtable_cfg *cfg, void *cookie)
968
970
if (cfg -> quirks & ~(IO_PGTABLE_QUIRK_ARM_NS |
969
971
IO_PGTABLE_QUIRK_ARM_TTBR1 |
970
972
IO_PGTABLE_QUIRK_ARM_OUTER_WBWA |
971
- IO_PGTABLE_QUIRK_ARM_HD ))
973
+ IO_PGTABLE_QUIRK_ARM_HD |
974
+ IO_PGTABLE_QUIRK_NO_WARN ))
972
975
return NULL ;
973
976
974
977
data = arm_lpae_alloc_pgtable (cfg );
@@ -1069,7 +1072,8 @@ arm_64_lpae_alloc_pgtable_s2(struct io_pgtable_cfg *cfg, void *cookie)
1069
1072
struct arm_lpae_io_pgtable * data ;
1070
1073
typeof (& cfg -> arm_lpae_s2_cfg .vtcr ) vtcr = & cfg -> arm_lpae_s2_cfg .vtcr ;
1071
1074
1072
- if (cfg -> quirks & ~(IO_PGTABLE_QUIRK_ARM_S2FWB ))
1075
+ if (cfg -> quirks & ~(IO_PGTABLE_QUIRK_ARM_S2FWB |
1076
+ IO_PGTABLE_QUIRK_NO_WARN ))
1073
1077
return NULL ;
1074
1078
1075
1079
data = arm_lpae_alloc_pgtable (cfg );
@@ -1310,7 +1314,6 @@ static void __init arm_lpae_dump_ops(struct io_pgtable_ops *ops)
1310
1314
#define __FAIL (ops , i ) ({ \
1311
1315
WARN(1, "selftest: test failed for fmt idx %d\n", (i)); \
1312
1316
arm_lpae_dump_ops(ops); \
1313
- selftest_running = false; \
1314
1317
-EFAULT; \
1315
1318
})
1316
1319
@@ -1326,8 +1329,6 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)
1326
1329
size_t size , mapped ;
1327
1330
struct io_pgtable_ops * ops ;
1328
1331
1329
- selftest_running = true;
1330
-
1331
1332
for (i = 0 ; i < ARRAY_SIZE (fmts ); ++ i ) {
1332
1333
cfg_cookie = cfg ;
1333
1334
ops = alloc_io_pgtable_ops (fmts [i ], cfg , cfg );
@@ -1416,7 +1417,6 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)
1416
1417
free_io_pgtable_ops (ops );
1417
1418
}
1418
1419
1419
- selftest_running = false;
1420
1420
return 0 ;
1421
1421
}
1422
1422
@@ -1438,6 +1438,7 @@ static int __init arm_lpae_do_selftests(void)
1438
1438
.tlb = & dummy_tlb_ops ,
1439
1439
.coherent_walk = true,
1440
1440
.iommu_dev = & dev ,
1441
+ .quirks = IO_PGTABLE_QUIRK_NO_WARN ,
1441
1442
};
1442
1443
1443
1444
/* __arm_lpae_alloc_pages() merely needs dev_to_node() to work */
0 commit comments