@@ -318,55 +318,39 @@ static struct iommu_domain *mock_domain_alloc_paging(struct device *dev)
318
318
return & mock -> domain ;
319
319
}
320
320
321
- static struct iommu_domain *
322
- __mock_domain_alloc_nested (struct mock_iommu_domain * mock_parent ,
323
- const struct iommu_hwpt_selftest * user_cfg )
321
+ static struct mock_iommu_domain_nested *
322
+ __mock_domain_alloc_nested (const struct iommu_user_data * user_data )
324
323
{
325
324
struct mock_iommu_domain_nested * mock_nested ;
326
- int i ;
325
+ struct iommu_hwpt_selftest user_cfg ;
326
+ int rc , i ;
327
+
328
+ if (user_data -> type != IOMMU_HWPT_DATA_SELFTEST )
329
+ return ERR_PTR (- EOPNOTSUPP );
330
+
331
+ rc = iommu_copy_struct_from_user (& user_cfg , user_data ,
332
+ IOMMU_HWPT_DATA_SELFTEST , iotlb );
333
+ if (rc )
334
+ return ERR_PTR (rc );
327
335
328
336
mock_nested = kzalloc (sizeof (* mock_nested ), GFP_KERNEL );
329
337
if (!mock_nested )
330
338
return ERR_PTR (- ENOMEM );
331
- mock_nested -> parent = mock_parent ;
332
339
mock_nested -> domain .ops = & domain_nested_ops ;
333
340
mock_nested -> domain .type = IOMMU_DOMAIN_NESTED ;
334
341
for (i = 0 ; i < MOCK_NESTED_DOMAIN_IOTLB_NUM ; i ++ )
335
- mock_nested -> iotlb [i ] = user_cfg -> iotlb ;
336
- return & mock_nested -> domain ;
342
+ mock_nested -> iotlb [i ] = user_cfg . iotlb ;
343
+ return mock_nested ;
337
344
}
338
345
339
346
static struct iommu_domain *
340
- mock_domain_alloc_user (struct device * dev , u32 flags ,
341
- struct iommu_domain * parent ,
342
- const struct iommu_user_data * user_data )
347
+ mock_domain_alloc_nested (struct iommu_domain * parent , u32 flags ,
348
+ const struct iommu_user_data * user_data )
343
349
{
350
+ struct mock_iommu_domain_nested * mock_nested ;
344
351
struct mock_iommu_domain * mock_parent ;
345
- struct iommu_hwpt_selftest user_cfg ;
346
- int rc ;
347
-
348
- /* must be mock_domain */
349
- if (!parent ) {
350
- struct mock_dev * mdev = to_mock_dev (dev );
351
- bool has_dirty_flag = flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING ;
352
- bool no_dirty_ops = mdev -> flags & MOCK_FLAGS_DEVICE_NO_DIRTY ;
353
- struct iommu_domain * domain ;
354
-
355
- if (flags & (~(IOMMU_HWPT_ALLOC_NEST_PARENT |
356
- IOMMU_HWPT_ALLOC_DIRTY_TRACKING )))
357
- return ERR_PTR (- EOPNOTSUPP );
358
- if (user_data || (has_dirty_flag && no_dirty_ops ))
359
- return ERR_PTR (- EOPNOTSUPP );
360
- domain = mock_domain_alloc_paging (dev );
361
- if (!domain )
362
- return ERR_PTR (- ENOMEM );
363
- if (has_dirty_flag )
364
- domain -> dirty_ops = & dirty_ops ;
365
- return domain ;
366
- }
367
352
368
- /* must be mock_domain_nested */
369
- if (user_data -> type != IOMMU_HWPT_DATA_SELFTEST || flags )
353
+ if (flags )
370
354
return ERR_PTR (- EOPNOTSUPP );
371
355
if (!parent || parent -> ops != mock_ops .default_domain_ops )
372
356
return ERR_PTR (- EINVAL );
@@ -375,12 +359,39 @@ mock_domain_alloc_user(struct device *dev, u32 flags,
375
359
if (!mock_parent )
376
360
return ERR_PTR (- EINVAL );
377
361
378
- rc = iommu_copy_struct_from_user (& user_cfg , user_data ,
379
- IOMMU_HWPT_DATA_SELFTEST , iotlb );
380
- if (rc )
381
- return ERR_PTR (rc );
362
+ mock_nested = __mock_domain_alloc_nested (user_data );
363
+ if (IS_ERR (mock_nested ))
364
+ return ERR_CAST (mock_nested );
365
+ mock_nested -> parent = mock_parent ;
366
+ return & mock_nested -> domain ;
367
+ }
368
+
369
+ static struct iommu_domain *
370
+ mock_domain_alloc_user (struct device * dev , u32 flags ,
371
+ struct iommu_domain * parent ,
372
+ const struct iommu_user_data * user_data )
373
+ {
374
+ bool has_dirty_flag = flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING ;
375
+ const u32 PAGING_FLAGS = IOMMU_HWPT_ALLOC_DIRTY_TRACKING |
376
+ IOMMU_HWPT_ALLOC_NEST_PARENT ;
377
+ bool no_dirty_ops = to_mock_dev (dev )-> flags &
378
+ MOCK_FLAGS_DEVICE_NO_DIRTY ;
379
+ struct iommu_domain * domain ;
380
+
381
+ if (parent )
382
+ return mock_domain_alloc_nested (parent , flags , user_data );
382
383
383
- return __mock_domain_alloc_nested (mock_parent , & user_cfg );
384
+ if (user_data )
385
+ return ERR_PTR (- EOPNOTSUPP );
386
+ if ((flags & ~PAGING_FLAGS ) || (has_dirty_flag && no_dirty_ops ))
387
+ return ERR_PTR (- EOPNOTSUPP );
388
+
389
+ domain = mock_domain_alloc_paging (dev );
390
+ if (!domain )
391
+ return ERR_PTR (- ENOMEM );
392
+ if (has_dirty_flag )
393
+ domain -> dirty_ops = & dirty_ops ;
394
+ return domain ;
384
395
}
385
396
386
397
static void mock_domain_free (struct iommu_domain * domain )
0 commit comments