@@ -1520,6 +1520,11 @@ static void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target,
1520
1520
struct arm_smmu_domain * smmu_domain )
1521
1521
{
1522
1522
struct arm_smmu_s2_cfg * s2_cfg = & smmu_domain -> s2_cfg ;
1523
+ const struct io_pgtable_cfg * pgtbl_cfg =
1524
+ & io_pgtable_ops_to_pgtable (smmu_domain -> pgtbl_ops )-> cfg ;
1525
+ typeof (& pgtbl_cfg -> arm_lpae_s2_cfg .vtcr ) vtcr =
1526
+ & pgtbl_cfg -> arm_lpae_s2_cfg .vtcr ;
1527
+ u64 vtcr_val ;
1523
1528
1524
1529
memset (target , 0 , sizeof (* target ));
1525
1530
target -> data [0 ] = cpu_to_le64 (
@@ -1532,17 +1537,25 @@ static void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target,
1532
1537
FIELD_PREP (STRTAB_STE_1_SHCFG ,
1533
1538
STRTAB_STE_1_SHCFG_INCOMING ));
1534
1539
1540
+ vtcr_val = FIELD_PREP (STRTAB_STE_2_VTCR_S2T0SZ , vtcr -> tsz ) |
1541
+ FIELD_PREP (STRTAB_STE_2_VTCR_S2SL0 , vtcr -> sl ) |
1542
+ FIELD_PREP (STRTAB_STE_2_VTCR_S2IR0 , vtcr -> irgn ) |
1543
+ FIELD_PREP (STRTAB_STE_2_VTCR_S2OR0 , vtcr -> orgn ) |
1544
+ FIELD_PREP (STRTAB_STE_2_VTCR_S2SH0 , vtcr -> sh ) |
1545
+ FIELD_PREP (STRTAB_STE_2_VTCR_S2TG , vtcr -> tg ) |
1546
+ FIELD_PREP (STRTAB_STE_2_VTCR_S2PS , vtcr -> ps );
1535
1547
target -> data [2 ] = cpu_to_le64 (
1536
1548
FIELD_PREP (STRTAB_STE_2_S2VMID , s2_cfg -> vmid ) |
1537
- FIELD_PREP (STRTAB_STE_2_VTCR , s2_cfg -> vtcr ) |
1549
+ FIELD_PREP (STRTAB_STE_2_VTCR , vtcr_val ) |
1538
1550
STRTAB_STE_2_S2AA64 |
1539
1551
#ifdef __BIG_ENDIAN
1540
1552
STRTAB_STE_2_S2ENDI |
1541
1553
#endif
1542
1554
STRTAB_STE_2_S2PTW |
1543
1555
STRTAB_STE_2_S2R );
1544
1556
1545
- target -> data [3 ] = cpu_to_le64 (s2_cfg -> vttbr & STRTAB_STE_3_S2TTB_MASK );
1557
+ target -> data [3 ] = cpu_to_le64 (pgtbl_cfg -> arm_lpae_s2_cfg .vttbr &
1558
+ STRTAB_STE_3_S2TTB_MASK );
1546
1559
}
1547
1560
1548
1561
static void arm_smmu_write_strtab_ent (struct arm_smmu_master * master , u32 sid ,
@@ -2302,24 +2315,14 @@ static int arm_smmu_domain_finalise_s2(struct arm_smmu_domain *smmu_domain,
2302
2315
int vmid ;
2303
2316
struct arm_smmu_device * smmu = smmu_domain -> smmu ;
2304
2317
struct arm_smmu_s2_cfg * cfg = & smmu_domain -> s2_cfg ;
2305
- typeof (& pgtbl_cfg -> arm_lpae_s2_cfg .vtcr ) vtcr ;
2306
2318
2307
2319
/* Reserve VMID 0 for stage-2 bypass STEs */
2308
2320
vmid = ida_alloc_range (& smmu -> vmid_map , 1 , (1 << smmu -> vmid_bits ) - 1 ,
2309
2321
GFP_KERNEL );
2310
2322
if (vmid < 0 )
2311
2323
return vmid ;
2312
2324
2313
- vtcr = & pgtbl_cfg -> arm_lpae_s2_cfg .vtcr ;
2314
2325
cfg -> vmid = (u16 )vmid ;
2315
- cfg -> vttbr = pgtbl_cfg -> arm_lpae_s2_cfg .vttbr ;
2316
- cfg -> vtcr = FIELD_PREP (STRTAB_STE_2_VTCR_S2T0SZ , vtcr -> tsz ) |
2317
- FIELD_PREP (STRTAB_STE_2_VTCR_S2SL0 , vtcr -> sl ) |
2318
- FIELD_PREP (STRTAB_STE_2_VTCR_S2IR0 , vtcr -> irgn ) |
2319
- FIELD_PREP (STRTAB_STE_2_VTCR_S2OR0 , vtcr -> orgn ) |
2320
- FIELD_PREP (STRTAB_STE_2_VTCR_S2SH0 , vtcr -> sh ) |
2321
- FIELD_PREP (STRTAB_STE_2_VTCR_S2TG , vtcr -> tg ) |
2322
- FIELD_PREP (STRTAB_STE_2_VTCR_S2PS , vtcr -> ps );
2323
2326
return 0 ;
2324
2327
}
2325
2328
0 commit comments