Skip to content

Commit a4f976e

Browse files
nicolincwilldeacon
authored andcommitted
iommu/arm-smmu-v3-test: Add nested s1bypass/s1dssbypass coverage
STE in a nested case requires both S1 and S2 fields. And this makes the use case different from the existing one. Add coverage for previously failed cases shifting between S2-only and S1+S2 STEs. Reviewed-by: Shuai Xue <xueshuai@linux.alibaba.com> Reviewed-by: Mostafa Saleh <smostafa@google.com> Reviewed-by: Pranjal Shrivastava <praan@google.com> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Will Deacon <will@kernel.org>
1 parent 7cad800 commit a4f976e

1 file changed

Lines changed: 47 additions & 0 deletions

File tree

drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ static struct mm_struct sva_mm = {
3333
enum 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+
3842
static 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

215231
static 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+
570615
static 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

Comments
 (0)