@@ -30,6 +30,11 @@ static struct mm_struct sva_mm = {
30
30
.pgd = (void * )0xdaedbeefdeadbeefULL ,
31
31
};
32
32
33
+ enum arm_smmu_test_master_feat {
34
+ ARM_SMMU_MASTER_TEST_ATS = BIT (0 ),
35
+ ARM_SMMU_MASTER_TEST_STALL = BIT (1 ),
36
+ };
37
+
33
38
static bool arm_smmu_entry_differs_in_used_bits (const __le64 * entry ,
34
39
const __le64 * used_bits ,
35
40
const __le64 * target ,
@@ -164,16 +169,22 @@ static const dma_addr_t fake_cdtab_dma_addr = 0xF0F0F0F0F0F0;
164
169
165
170
static void arm_smmu_test_make_cdtable_ste (struct arm_smmu_ste * ste ,
166
171
unsigned int s1dss ,
167
- const dma_addr_t dma_addr )
172
+ const dma_addr_t dma_addr ,
173
+ enum arm_smmu_test_master_feat feat )
168
174
{
175
+ bool ats_enabled = feat & ARM_SMMU_MASTER_TEST_ATS ;
176
+ bool stall_enabled = feat & ARM_SMMU_MASTER_TEST_STALL ;
177
+
169
178
struct arm_smmu_master master = {
179
+ .ats_enabled = ats_enabled ,
170
180
.cd_table .cdtab_dma = dma_addr ,
171
181
.cd_table .s1cdmax = 0xFF ,
172
182
.cd_table .s1fmt = STRTAB_STE_0_S1FMT_64K_L2 ,
173
183
.smmu = & smmu ,
184
+ .stall_enabled = stall_enabled ,
174
185
};
175
186
176
- arm_smmu_make_cdtable_ste (ste , & master , true , s1dss );
187
+ arm_smmu_make_cdtable_ste (ste , & master , ats_enabled , s1dss );
177
188
}
178
189
179
190
static void arm_smmu_v3_write_ste_test_bypass_to_abort (struct kunit * test )
@@ -204,7 +215,7 @@ static void arm_smmu_v3_write_ste_test_cdtable_to_abort(struct kunit *test)
204
215
struct arm_smmu_ste ste ;
205
216
206
217
arm_smmu_test_make_cdtable_ste (& ste , STRTAB_STE_1_S1DSS_SSID0 ,
207
- fake_cdtab_dma_addr );
218
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
208
219
arm_smmu_v3_test_ste_expect_hitless_transition (test , & ste , & abort_ste ,
209
220
NUM_EXPECTED_SYNCS (2 ));
210
221
}
@@ -214,7 +225,7 @@ static void arm_smmu_v3_write_ste_test_abort_to_cdtable(struct kunit *test)
214
225
struct arm_smmu_ste ste ;
215
226
216
227
arm_smmu_test_make_cdtable_ste (& ste , STRTAB_STE_1_S1DSS_SSID0 ,
217
- fake_cdtab_dma_addr );
228
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
218
229
arm_smmu_v3_test_ste_expect_hitless_transition (test , & abort_ste , & ste ,
219
230
NUM_EXPECTED_SYNCS (2 ));
220
231
}
@@ -224,7 +235,7 @@ static void arm_smmu_v3_write_ste_test_cdtable_to_bypass(struct kunit *test)
224
235
struct arm_smmu_ste ste ;
225
236
226
237
arm_smmu_test_make_cdtable_ste (& ste , STRTAB_STE_1_S1DSS_SSID0 ,
227
- fake_cdtab_dma_addr );
238
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
228
239
arm_smmu_v3_test_ste_expect_hitless_transition (test , & ste , & bypass_ste ,
229
240
NUM_EXPECTED_SYNCS (3 ));
230
241
}
@@ -234,7 +245,7 @@ static void arm_smmu_v3_write_ste_test_bypass_to_cdtable(struct kunit *test)
234
245
struct arm_smmu_ste ste ;
235
246
236
247
arm_smmu_test_make_cdtable_ste (& ste , STRTAB_STE_1_S1DSS_SSID0 ,
237
- fake_cdtab_dma_addr );
248
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
238
249
arm_smmu_v3_test_ste_expect_hitless_transition (test , & bypass_ste , & ste ,
239
250
NUM_EXPECTED_SYNCS (3 ));
240
251
}
@@ -245,9 +256,9 @@ static void arm_smmu_v3_write_ste_test_cdtable_s1dss_change(struct kunit *test)
245
256
struct arm_smmu_ste s1dss_bypass ;
246
257
247
258
arm_smmu_test_make_cdtable_ste (& ste , STRTAB_STE_1_S1DSS_SSID0 ,
248
- fake_cdtab_dma_addr );
259
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
249
260
arm_smmu_test_make_cdtable_ste (& s1dss_bypass , STRTAB_STE_1_S1DSS_BYPASS ,
250
- fake_cdtab_dma_addr );
261
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
251
262
252
263
/*
253
264
* Flipping s1dss on a CD table STE only involves changes to the second
@@ -265,7 +276,7 @@ arm_smmu_v3_write_ste_test_s1dssbypass_to_stebypass(struct kunit *test)
265
276
struct arm_smmu_ste s1dss_bypass ;
266
277
267
278
arm_smmu_test_make_cdtable_ste (& s1dss_bypass , STRTAB_STE_1_S1DSS_BYPASS ,
268
- fake_cdtab_dma_addr );
279
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
269
280
arm_smmu_v3_test_ste_expect_hitless_transition (
270
281
test , & s1dss_bypass , & bypass_ste , NUM_EXPECTED_SYNCS (2 ));
271
282
}
@@ -276,16 +287,20 @@ arm_smmu_v3_write_ste_test_stebypass_to_s1dssbypass(struct kunit *test)
276
287
struct arm_smmu_ste s1dss_bypass ;
277
288
278
289
arm_smmu_test_make_cdtable_ste (& s1dss_bypass , STRTAB_STE_1_S1DSS_BYPASS ,
279
- fake_cdtab_dma_addr );
290
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
280
291
arm_smmu_v3_test_ste_expect_hitless_transition (
281
292
test , & bypass_ste , & s1dss_bypass , NUM_EXPECTED_SYNCS (2 ));
282
293
}
283
294
284
295
static void arm_smmu_test_make_s2_ste (struct arm_smmu_ste * ste ,
285
- bool ats_enabled )
296
+ enum arm_smmu_test_master_feat feat )
286
297
{
298
+ bool ats_enabled = feat & ARM_SMMU_MASTER_TEST_ATS ;
299
+ bool stall_enabled = feat & ARM_SMMU_MASTER_TEST_STALL ;
287
300
struct arm_smmu_master master = {
301
+ .ats_enabled = ats_enabled ,
288
302
.smmu = & smmu ,
303
+ .stall_enabled = stall_enabled ,
289
304
};
290
305
struct io_pgtable io_pgtable = {};
291
306
struct arm_smmu_domain smmu_domain = {
@@ -308,7 +323,7 @@ static void arm_smmu_v3_write_ste_test_s2_to_abort(struct kunit *test)
308
323
{
309
324
struct arm_smmu_ste ste ;
310
325
311
- arm_smmu_test_make_s2_ste (& ste , true );
326
+ arm_smmu_test_make_s2_ste (& ste , ARM_SMMU_MASTER_TEST_ATS );
312
327
arm_smmu_v3_test_ste_expect_hitless_transition (test , & ste , & abort_ste ,
313
328
NUM_EXPECTED_SYNCS (2 ));
314
329
}
@@ -317,7 +332,7 @@ static void arm_smmu_v3_write_ste_test_abort_to_s2(struct kunit *test)
317
332
{
318
333
struct arm_smmu_ste ste ;
319
334
320
- arm_smmu_test_make_s2_ste (& ste , true );
335
+ arm_smmu_test_make_s2_ste (& ste , ARM_SMMU_MASTER_TEST_ATS );
321
336
arm_smmu_v3_test_ste_expect_hitless_transition (test , & abort_ste , & ste ,
322
337
NUM_EXPECTED_SYNCS (2 ));
323
338
}
@@ -326,7 +341,7 @@ static void arm_smmu_v3_write_ste_test_s2_to_bypass(struct kunit *test)
326
341
{
327
342
struct arm_smmu_ste ste ;
328
343
329
- arm_smmu_test_make_s2_ste (& ste , true );
344
+ arm_smmu_test_make_s2_ste (& ste , ARM_SMMU_MASTER_TEST_ATS );
330
345
arm_smmu_v3_test_ste_expect_hitless_transition (test , & ste , & bypass_ste ,
331
346
NUM_EXPECTED_SYNCS (2 ));
332
347
}
@@ -335,7 +350,7 @@ static void arm_smmu_v3_write_ste_test_bypass_to_s2(struct kunit *test)
335
350
{
336
351
struct arm_smmu_ste ste ;
337
352
338
- arm_smmu_test_make_s2_ste (& ste , true );
353
+ arm_smmu_test_make_s2_ste (& ste , ARM_SMMU_MASTER_TEST_ATS );
339
354
arm_smmu_v3_test_ste_expect_hitless_transition (test , & bypass_ste , & ste ,
340
355
NUM_EXPECTED_SYNCS (2 ));
341
356
}
@@ -346,8 +361,8 @@ static void arm_smmu_v3_write_ste_test_s1_to_s2(struct kunit *test)
346
361
struct arm_smmu_ste s2_ste ;
347
362
348
363
arm_smmu_test_make_cdtable_ste (& s1_ste , STRTAB_STE_1_S1DSS_SSID0 ,
349
- fake_cdtab_dma_addr );
350
- arm_smmu_test_make_s2_ste (& s2_ste , true );
364
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
365
+ arm_smmu_test_make_s2_ste (& s2_ste , ARM_SMMU_MASTER_TEST_ATS );
351
366
arm_smmu_v3_test_ste_expect_hitless_transition (test , & s1_ste , & s2_ste ,
352
367
NUM_EXPECTED_SYNCS (3 ));
353
368
}
@@ -358,8 +373,8 @@ static void arm_smmu_v3_write_ste_test_s2_to_s1(struct kunit *test)
358
373
struct arm_smmu_ste s2_ste ;
359
374
360
375
arm_smmu_test_make_cdtable_ste (& s1_ste , STRTAB_STE_1_S1DSS_SSID0 ,
361
- fake_cdtab_dma_addr );
362
- arm_smmu_test_make_s2_ste (& s2_ste , true );
376
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
377
+ arm_smmu_test_make_s2_ste (& s2_ste , ARM_SMMU_MASTER_TEST_ATS );
363
378
arm_smmu_v3_test_ste_expect_hitless_transition (test , & s2_ste , & s1_ste ,
364
379
NUM_EXPECTED_SYNCS (3 ));
365
380
}
@@ -375,9 +390,9 @@ static void arm_smmu_v3_write_ste_test_non_hitless(struct kunit *test)
375
390
* s1 dss field in the same update.
376
391
*/
377
392
arm_smmu_test_make_cdtable_ste (& ste , STRTAB_STE_1_S1DSS_SSID0 ,
378
- fake_cdtab_dma_addr );
393
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_ATS );
379
394
arm_smmu_test_make_cdtable_ste (& ste_2 , STRTAB_STE_1_S1DSS_BYPASS ,
380
- 0x4B4B4b4B4B );
395
+ 0x4B4B4b4B4B , ARM_SMMU_MASTER_TEST_ATS );
381
396
arm_smmu_v3_test_ste_expect_non_hitless_transition (
382
397
test , & ste , & ste_2 , NUM_EXPECTED_SYNCS (3 ));
383
398
}
@@ -503,6 +518,30 @@ static void arm_smmu_test_make_sva_release_cd(struct arm_smmu_cd *cd,
503
518
arm_smmu_make_sva_cd (cd , & master , NULL , asid );
504
519
}
505
520
521
+ static void arm_smmu_v3_write_ste_test_s1_to_s2_stall (struct kunit * test )
522
+ {
523
+ struct arm_smmu_ste s1_ste ;
524
+ struct arm_smmu_ste s2_ste ;
525
+
526
+ arm_smmu_test_make_cdtable_ste (& s1_ste , STRTAB_STE_1_S1DSS_SSID0 ,
527
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_STALL );
528
+ arm_smmu_test_make_s2_ste (& s2_ste , ARM_SMMU_MASTER_TEST_STALL );
529
+ arm_smmu_v3_test_ste_expect_hitless_transition (test , & s1_ste , & s2_ste ,
530
+ NUM_EXPECTED_SYNCS (3 ));
531
+ }
532
+
533
+ static void arm_smmu_v3_write_ste_test_s2_to_s1_stall (struct kunit * test )
534
+ {
535
+ struct arm_smmu_ste s1_ste ;
536
+ struct arm_smmu_ste s2_ste ;
537
+
538
+ arm_smmu_test_make_cdtable_ste (& s1_ste , STRTAB_STE_1_S1DSS_SSID0 ,
539
+ fake_cdtab_dma_addr , ARM_SMMU_MASTER_TEST_STALL );
540
+ arm_smmu_test_make_s2_ste (& s2_ste , ARM_SMMU_MASTER_TEST_STALL );
541
+ arm_smmu_v3_test_ste_expect_hitless_transition (test , & s2_ste , & s1_ste ,
542
+ NUM_EXPECTED_SYNCS (3 ));
543
+ }
544
+
506
545
static void arm_smmu_v3_write_cd_test_sva_clear (struct kunit * test )
507
546
{
508
547
struct arm_smmu_cd cd = {};
@@ -547,6 +586,8 @@ static struct kunit_case arm_smmu_v3_test_cases[] = {
547
586
KUNIT_CASE (arm_smmu_v3_write_ste_test_non_hitless ),
548
587
KUNIT_CASE (arm_smmu_v3_write_cd_test_s1_clear ),
549
588
KUNIT_CASE (arm_smmu_v3_write_cd_test_s1_change_asid ),
589
+ KUNIT_CASE (arm_smmu_v3_write_ste_test_s1_to_s2_stall ),
590
+ KUNIT_CASE (arm_smmu_v3_write_ste_test_s2_to_s1_stall ),
550
591
KUNIT_CASE (arm_smmu_v3_write_cd_test_sva_clear ),
551
592
KUNIT_CASE (arm_smmu_v3_write_cd_test_sva_release ),
552
593
{},
0 commit comments