@@ -1217,17 +1217,18 @@ static void arm_smmu_sync_cd(struct arm_smmu_master *master,
1217
1217
arm_smmu_cmdq_batch_submit (smmu , & cmds );
1218
1218
}
1219
1219
1220
- static void arm_smmu_write_cd_l1_desc (__le64 * dst , dma_addr_t l2ptr_dma )
1220
+ static void arm_smmu_write_cd_l1_desc (struct arm_smmu_cdtab_l1 * dst ,
1221
+ dma_addr_t l2ptr_dma )
1221
1222
{
1222
1223
u64 val = (l2ptr_dma & CTXDESC_L1_DESC_L2PTR_MASK ) | CTXDESC_L1_DESC_V ;
1223
1224
1224
1225
/* The HW has 64 bit atomicity with stores to the L2 CD table */
1225
- WRITE_ONCE (* dst , cpu_to_le64 (val ));
1226
+ WRITE_ONCE (dst -> l2ptr , cpu_to_le64 (val ));
1226
1227
}
1227
1228
1228
- static dma_addr_t arm_smmu_cd_l1_get_desc (const __le64 * src )
1229
+ static dma_addr_t arm_smmu_cd_l1_get_desc (const struct arm_smmu_cdtab_l1 * src )
1229
1230
{
1230
- return le64_to_cpu (* src ) & CTXDESC_L1_DESC_L2PTR_MASK ;
1231
+ return le64_to_cpu (src -> l2ptr ) & CTXDESC_L1_DESC_L2PTR_MASK ;
1231
1232
}
1232
1233
1233
1234
struct arm_smmu_cd * arm_smmu_get_cd_ptr (struct arm_smmu_master * master ,
@@ -1240,13 +1241,12 @@ struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master,
1240
1241
return NULL ;
1241
1242
1242
1243
if (cd_table -> s1fmt == STRTAB_STE_0_S1FMT_LINEAR )
1243
- return (struct arm_smmu_cd * )(cd_table -> cdtab +
1244
- ssid * CTXDESC_CD_DWORDS );
1244
+ return & ((struct arm_smmu_cd * )cd_table -> cdtab )[ssid ];
1245
1245
1246
- l1_desc = & cd_table -> l1_desc [ssid / CTXDESC_L2_ENTRIES ];
1246
+ l1_desc = & cd_table -> l1_desc [arm_smmu_cdtab_l1_idx ( ssid ) ];
1247
1247
if (!l1_desc -> l2ptr )
1248
1248
return NULL ;
1249
- return & l1_desc -> l2ptr [ ssid % CTXDESC_L2_ENTRIES ];
1249
+ return & l1_desc -> l2ptr -> cds [ arm_smmu_cdtab_l2_idx ( ssid ) ];
1250
1250
}
1251
1251
1252
1252
static struct arm_smmu_cd * arm_smmu_alloc_cd_ptr (struct arm_smmu_master * master ,
@@ -1264,11 +1264,12 @@ static struct arm_smmu_cd *arm_smmu_alloc_cd_ptr(struct arm_smmu_master *master,
1264
1264
}
1265
1265
1266
1266
if (cd_table -> s1fmt == STRTAB_STE_0_S1FMT_64K_L2 ) {
1267
- unsigned int idx = ssid / CTXDESC_L2_ENTRIES ;
1267
+ unsigned int idx = arm_smmu_cdtab_l1_idx ( ssid ) ;
1268
1268
struct arm_smmu_l1_ctx_desc * l1_desc ;
1269
1269
1270
1270
l1_desc = & cd_table -> l1_desc [idx ];
1271
1271
if (!l1_desc -> l2ptr ) {
1272
+ struct arm_smmu_cdtab_l1 * dst ;
1272
1273
dma_addr_t l2ptr_dma ;
1273
1274
size_t size ;
1274
1275
@@ -1279,8 +1280,8 @@ static struct arm_smmu_cd *arm_smmu_alloc_cd_ptr(struct arm_smmu_master *master,
1279
1280
if (!l1_desc -> l2ptr )
1280
1281
return NULL ;
1281
1282
1282
- arm_smmu_write_cd_l1_desc ( & cd_table -> cdtab [idx ],
1283
- l2ptr_dma );
1283
+ dst = & (( struct arm_smmu_cdtab_l1 * ) cd_table -> cdtab ) [idx ];
1284
+ arm_smmu_write_cd_l1_desc ( dst , l2ptr_dma );
1284
1285
/* An invalid L1CD can be cached */
1285
1286
arm_smmu_sync_cd (master , ssid , false);
1286
1287
}
@@ -1424,7 +1425,7 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master)
1424
1425
cd_table -> s1fmt = STRTAB_STE_0_S1FMT_LINEAR ;
1425
1426
cd_table -> num_l1_ents = max_contexts ;
1426
1427
1427
- l1size = max_contexts * ( CTXDESC_CD_DWORDS << 3 );
1428
+ l1size = max_contexts * sizeof ( struct arm_smmu_cd );
1428
1429
} else {
1429
1430
cd_table -> s1fmt = STRTAB_STE_0_S1FMT_64K_L2 ;
1430
1431
cd_table -> num_l1_ents = DIV_ROUND_UP (max_contexts ,
@@ -1436,7 +1437,7 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master)
1436
1437
if (!cd_table -> l1_desc )
1437
1438
return - ENOMEM ;
1438
1439
1439
- l1size = cd_table -> num_l1_ents * ( CTXDESC_L1_DESC_DWORDS << 3 );
1440
+ l1size = cd_table -> num_l1_ents * sizeof ( struct arm_smmu_cdtab_l1 );
1440
1441
}
1441
1442
1442
1443
cd_table -> cdtab = dma_alloc_coherent (smmu -> dev , l1size ,
@@ -1460,27 +1461,29 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master)
1460
1461
static void arm_smmu_free_cd_tables (struct arm_smmu_master * master )
1461
1462
{
1462
1463
int i ;
1463
- size_t size , l1size ;
1464
+ size_t l1size ;
1464
1465
struct arm_smmu_device * smmu = master -> smmu ;
1465
1466
struct arm_smmu_ctx_desc_cfg * cd_table = & master -> cd_table ;
1466
1467
1467
1468
if (cd_table -> l1_desc ) {
1468
- size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3 );
1469
-
1470
1469
for (i = 0 ; i < cd_table -> num_l1_ents ; i ++ ) {
1470
+ dma_addr_t dma_handle ;
1471
+
1471
1472
if (!cd_table -> l1_desc [i ].l2ptr )
1472
1473
continue ;
1473
1474
1474
- dma_free_coherent (smmu -> dev , size ,
1475
+ dma_handle = arm_smmu_cd_l1_get_desc (& (
1476
+ (struct arm_smmu_cdtab_l1 * )cd_table -> cdtab )[i ]);
1477
+ dma_free_coherent (smmu -> dev ,
1478
+ sizeof (* cd_table -> l1_desc [i ].l2ptr ),
1475
1479
cd_table -> l1_desc [i ].l2ptr ,
1476
- arm_smmu_cd_l1_get_desc (
1477
- & cd_table -> cdtab [i ]));
1480
+ dma_handle );
1478
1481
}
1479
1482
kfree (cd_table -> l1_desc );
1480
1483
1481
- l1size = cd_table -> num_l1_ents * ( CTXDESC_L1_DESC_DWORDS << 3 );
1484
+ l1size = cd_table -> num_l1_ents * sizeof ( struct arm_smmu_cdtab_l1 );
1482
1485
} else {
1483
- l1size = cd_table -> num_l1_ents * ( CTXDESC_CD_DWORDS << 3 );
1486
+ l1size = cd_table -> num_l1_ents * sizeof ( struct arm_smmu_cd );
1484
1487
}
1485
1488
1486
1489
dma_free_coherent (smmu -> dev , l1size , cd_table -> cdtab , cd_table -> cdtab_dma );
0 commit comments