@@ -33,8 +33,12 @@ static struct mm_struct sva_mm = {
3333enum arm_smmu_test_master_feat {
3434 ARM_SMMU_MASTER_TEST_ATS = BIT (0 ),
3535 ARM_SMMU_MASTER_TEST_STALL = BIT (1 ),
36+ ARM_SMMU_MASTER_TEST_NESTED = BIT (2 ),
3637};
3738
39+ static void arm_smmu_test_make_s2_ste (struct arm_smmu_ste * ste ,
40+ enum arm_smmu_test_master_feat feat );
41+
3842static bool arm_smmu_entry_differs_in_used_bits (const __le64 * entry ,
3943 const __le64 * used_bits ,
4044 const __le64 * target ,
@@ -210,6 +214,18 @@ static void arm_smmu_test_make_cdtable_ste(struct arm_smmu_ste *ste,
210214 };
211215
212216 arm_smmu_make_cdtable_ste (ste , & master , ats_enabled , s1dss );
217+ if (feat & ARM_SMMU_MASTER_TEST_NESTED ) {
218+ struct arm_smmu_ste s2ste ;
219+ int i ;
220+
221+ arm_smmu_test_make_s2_ste (& s2ste ,
222+ feat & ~ARM_SMMU_MASTER_TEST_NESTED );
223+ ste -> data [0 ] |= cpu_to_le64 (
224+ FIELD_PREP (STRTAB_STE_0_CFG , STRTAB_STE_0_CFG_NESTED ));
225+ ste -> data [1 ] |= cpu_to_le64 (STRTAB_STE_1_MEV );
226+ for (i = 2 ; i < NUM_ENTRY_QWORDS ; i ++ )
227+ ste -> data [i ] = s2ste .data [i ];
228+ }
213229}
214230
215231static void arm_smmu_v3_write_ste_test_bypass_to_abort (struct kunit * test )
@@ -567,6 +583,35 @@ static void arm_smmu_v3_write_ste_test_s2_to_s1_stall(struct kunit *test)
567583 NUM_EXPECTED_SYNCS (3 ));
568584}
569585
586+ static void
587+ arm_smmu_v3_write_ste_test_nested_s1dssbypass_to_s1bypass (struct kunit * test )
588+ {
589+ struct arm_smmu_ste s1_ste ;
590+ struct arm_smmu_ste s2_ste ;
591+
592+ arm_smmu_test_make_cdtable_ste (
593+ & s1_ste , STRTAB_STE_1_S1DSS_BYPASS , fake_cdtab_dma_addr ,
594+ ARM_SMMU_MASTER_TEST_ATS | ARM_SMMU_MASTER_TEST_NESTED );
595+ arm_smmu_test_make_s2_ste (& s2_ste , 0 );
596+ /* Expect an additional sync to unset ignored bits: EATS and MEV */
597+ arm_smmu_v3_test_ste_expect_hitless_transition (test , & s1_ste , & s2_ste ,
598+ NUM_EXPECTED_SYNCS (3 ));
599+ }
600+
601+ static void
602+ arm_smmu_v3_write_ste_test_nested_s1bypass_to_s1dssbypass (struct kunit * test )
603+ {
604+ struct arm_smmu_ste s1_ste ;
605+ struct arm_smmu_ste s2_ste ;
606+
607+ arm_smmu_test_make_cdtable_ste (
608+ & s1_ste , STRTAB_STE_1_S1DSS_BYPASS , fake_cdtab_dma_addr ,
609+ ARM_SMMU_MASTER_TEST_ATS | ARM_SMMU_MASTER_TEST_NESTED );
610+ arm_smmu_test_make_s2_ste (& s2_ste , 0 );
611+ arm_smmu_v3_test_ste_expect_hitless_transition (test , & s2_ste , & s1_ste ,
612+ NUM_EXPECTED_SYNCS (2 ));
613+ }
614+
570615static void arm_smmu_v3_write_cd_test_sva_clear (struct kunit * test )
571616{
572617 struct arm_smmu_cd cd = {};
@@ -613,6 +658,8 @@ static struct kunit_case arm_smmu_v3_test_cases[] = {
613658 KUNIT_CASE (arm_smmu_v3_write_cd_test_s1_change_asid ),
614659 KUNIT_CASE (arm_smmu_v3_write_ste_test_s1_to_s2_stall ),
615660 KUNIT_CASE (arm_smmu_v3_write_ste_test_s2_to_s1_stall ),
661+ KUNIT_CASE (arm_smmu_v3_write_ste_test_nested_s1dssbypass_to_s1bypass ),
662+ KUNIT_CASE (arm_smmu_v3_write_ste_test_nested_s1bypass_to_s1dssbypass ),
616663 KUNIT_CASE (arm_smmu_v3_write_cd_test_sva_clear ),
617664 KUNIT_CASE (arm_smmu_v3_write_cd_test_sva_release ),
618665 {},
0 commit comments