@@ -1160,6 +1160,7 @@ static int qi_check_fault(struct intel_iommu *iommu, int index)
1160
1160
int head , tail ;
1161
1161
struct q_inval * qi = iommu -> qi ;
1162
1162
int wait_index = (index + 1 ) % QI_LENGTH ;
1163
+ int shift = qi_shift (iommu );
1163
1164
1164
1165
if (qi -> desc_status [wait_index ] == QI_ABORT )
1165
1166
return - EAGAIN ;
@@ -1173,13 +1174,19 @@ static int qi_check_fault(struct intel_iommu *iommu, int index)
1173
1174
*/
1174
1175
if (fault & DMA_FSTS_IQE ) {
1175
1176
head = readl (iommu -> reg + DMAR_IQH_REG );
1176
- if ((head >> DMAR_IQ_SHIFT ) == index ) {
1177
- pr_err ("VT-d detected invalid descriptor: "
1178
- "low=%llx, high=%llx\n" ,
1179
- (unsigned long long )qi -> desc [index ].low ,
1180
- (unsigned long long )qi -> desc [index ].high );
1181
- memcpy (& qi -> desc [index ], & qi -> desc [wait_index ],
1182
- sizeof (struct qi_desc ));
1177
+ if ((head >> shift ) == index ) {
1178
+ struct qi_desc * desc = qi -> desc + head ;
1179
+
1180
+ /*
1181
+ * desc->qw2 and desc->qw3 are either reserved or
1182
+ * used by software as private data. We won't print
1183
+ * out these two qw's for security consideration.
1184
+ */
1185
+ pr_err ("VT-d detected invalid descriptor: qw0 = %llx, qw1 = %llx\n" ,
1186
+ (unsigned long long )desc -> qw0 ,
1187
+ (unsigned long long )desc -> qw1 );
1188
+ memcpy (desc , qi -> desc + (wait_index << shift ),
1189
+ 1 << shift );
1183
1190
writel (DMA_FSTS_IQE , iommu -> reg + DMAR_FSTS_REG );
1184
1191
return - EINVAL ;
1185
1192
}
@@ -1191,10 +1198,10 @@ static int qi_check_fault(struct intel_iommu *iommu, int index)
1191
1198
*/
1192
1199
if (fault & DMA_FSTS_ITE ) {
1193
1200
head = readl (iommu -> reg + DMAR_IQH_REG );
1194
- head = ((head >> DMAR_IQ_SHIFT ) - 1 + QI_LENGTH ) % QI_LENGTH ;
1201
+ head = ((head >> shift ) - 1 + QI_LENGTH ) % QI_LENGTH ;
1195
1202
head |= 1 ;
1196
1203
tail = readl (iommu -> reg + DMAR_IQT_REG );
1197
- tail = ((tail >> DMAR_IQ_SHIFT ) - 1 + QI_LENGTH ) % QI_LENGTH ;
1204
+ tail = ((tail >> shift ) - 1 + QI_LENGTH ) % QI_LENGTH ;
1198
1205
1199
1206
writel (DMA_FSTS_ITE , iommu -> reg + DMAR_FSTS_REG );
1200
1207
@@ -1222,15 +1229,14 @@ int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
1222
1229
{
1223
1230
int rc ;
1224
1231
struct q_inval * qi = iommu -> qi ;
1225
- struct qi_desc * hw , wait_desc ;
1232
+ int offset , shift , length ;
1233
+ struct qi_desc wait_desc ;
1226
1234
int wait_index , index ;
1227
1235
unsigned long flags ;
1228
1236
1229
1237
if (!qi )
1230
1238
return 0 ;
1231
1239
1232
- hw = qi -> desc ;
1233
-
1234
1240
restart :
1235
1241
rc = 0 ;
1236
1242
@@ -1243,16 +1249,21 @@ int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
1243
1249
1244
1250
index = qi -> free_head ;
1245
1251
wait_index = (index + 1 ) % QI_LENGTH ;
1252
+ shift = qi_shift (iommu );
1253
+ length = 1 << shift ;
1246
1254
1247
1255
qi -> desc_status [index ] = qi -> desc_status [wait_index ] = QI_IN_USE ;
1248
1256
1249
- hw [ index ] = * desc ;
1250
-
1251
- wait_desc .low = QI_IWD_STATUS_DATA (QI_DONE ) |
1257
+ offset = index << shift ;
1258
+ memcpy ( qi -> desc + offset , desc , length );
1259
+ wait_desc .qw0 = QI_IWD_STATUS_DATA (QI_DONE ) |
1252
1260
QI_IWD_STATUS_WRITE | QI_IWD_TYPE ;
1253
- wait_desc .high = virt_to_phys (& qi -> desc_status [wait_index ]);
1261
+ wait_desc .qw1 = virt_to_phys (& qi -> desc_status [wait_index ]);
1262
+ wait_desc .qw2 = 0 ;
1263
+ wait_desc .qw3 = 0 ;
1254
1264
1255
- hw [wait_index ] = wait_desc ;
1265
+ offset = wait_index << shift ;
1266
+ memcpy (qi -> desc + offset , & wait_desc , length );
1256
1267
1257
1268
qi -> free_head = (qi -> free_head + 2 ) % QI_LENGTH ;
1258
1269
qi -> free_cnt -= 2 ;
@@ -1261,7 +1272,7 @@ int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
1261
1272
* update the HW tail register indicating the presence of
1262
1273
* new descriptors.
1263
1274
*/
1264
- writel (qi -> free_head << DMAR_IQ_SHIFT , iommu -> reg + DMAR_IQT_REG );
1275
+ writel (qi -> free_head << shift , iommu -> reg + DMAR_IQT_REG );
1265
1276
1266
1277
while (qi -> desc_status [wait_index ] != QI_DONE ) {
1267
1278
/*
@@ -1298,8 +1309,10 @@ void qi_global_iec(struct intel_iommu *iommu)
1298
1309
{
1299
1310
struct qi_desc desc ;
1300
1311
1301
- desc .low = QI_IEC_TYPE ;
1302
- desc .high = 0 ;
1312
+ desc .qw0 = QI_IEC_TYPE ;
1313
+ desc .qw1 = 0 ;
1314
+ desc .qw2 = 0 ;
1315
+ desc .qw3 = 0 ;
1303
1316
1304
1317
/* should never fail */
1305
1318
qi_submit_sync (& desc , iommu );
@@ -1310,9 +1323,11 @@ void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
1310
1323
{
1311
1324
struct qi_desc desc ;
1312
1325
1313
- desc .low = QI_CC_FM (fm ) | QI_CC_SID (sid ) | QI_CC_DID (did )
1326
+ desc .qw0 = QI_CC_FM (fm ) | QI_CC_SID (sid ) | QI_CC_DID (did )
1314
1327
| QI_CC_GRAN (type ) | QI_CC_TYPE ;
1315
- desc .high = 0 ;
1328
+ desc .qw1 = 0 ;
1329
+ desc .qw2 = 0 ;
1330
+ desc .qw3 = 0 ;
1316
1331
1317
1332
qi_submit_sync (& desc , iommu );
1318
1333
}
@@ -1331,10 +1346,12 @@ void qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
1331
1346
if (cap_read_drain (iommu -> cap ))
1332
1347
dr = 1 ;
1333
1348
1334
- desc .low = QI_IOTLB_DID (did ) | QI_IOTLB_DR (dr ) | QI_IOTLB_DW (dw )
1349
+ desc .qw0 = QI_IOTLB_DID (did ) | QI_IOTLB_DR (dr ) | QI_IOTLB_DW (dw )
1335
1350
| QI_IOTLB_GRAN (type ) | QI_IOTLB_TYPE ;
1336
- desc .high = QI_IOTLB_ADDR (addr ) | QI_IOTLB_IH (ih )
1351
+ desc .qw1 = QI_IOTLB_ADDR (addr ) | QI_IOTLB_IH (ih )
1337
1352
| QI_IOTLB_AM (size_order );
1353
+ desc .qw2 = 0 ;
1354
+ desc .qw3 = 0 ;
1338
1355
1339
1356
qi_submit_sync (& desc , iommu );
1340
1357
}
@@ -1347,15 +1364,17 @@ void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 pfsid,
1347
1364
if (mask ) {
1348
1365
WARN_ON_ONCE (addr & ((1ULL << (VTD_PAGE_SHIFT + mask )) - 1 ));
1349
1366
addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1 )) - 1 ;
1350
- desc .high = QI_DEV_IOTLB_ADDR (addr ) | QI_DEV_IOTLB_SIZE ;
1367
+ desc .qw1 = QI_DEV_IOTLB_ADDR (addr ) | QI_DEV_IOTLB_SIZE ;
1351
1368
} else
1352
- desc .high = QI_DEV_IOTLB_ADDR (addr );
1369
+ desc .qw1 = QI_DEV_IOTLB_ADDR (addr );
1353
1370
1354
1371
if (qdep >= QI_DEV_IOTLB_MAX_INVS )
1355
1372
qdep = 0 ;
1356
1373
1357
- desc .low = QI_DEV_IOTLB_SID (sid ) | QI_DEV_IOTLB_QDEP (qdep ) |
1374
+ desc .qw0 = QI_DEV_IOTLB_SID (sid ) | QI_DEV_IOTLB_QDEP (qdep ) |
1358
1375
QI_DIOTLB_TYPE | QI_DEV_IOTLB_PFSID (pfsid );
1376
+ desc .qw2 = 0 ;
1377
+ desc .qw3 = 0 ;
1359
1378
1360
1379
qi_submit_sync (& desc , iommu );
1361
1380
}
@@ -1403,16 +1422,24 @@ static void __dmar_enable_qi(struct intel_iommu *iommu)
1403
1422
u32 sts ;
1404
1423
unsigned long flags ;
1405
1424
struct q_inval * qi = iommu -> qi ;
1425
+ u64 val = virt_to_phys (qi -> desc );
1406
1426
1407
1427
qi -> free_head = qi -> free_tail = 0 ;
1408
1428
qi -> free_cnt = QI_LENGTH ;
1409
1429
1430
+ /*
1431
+ * Set DW=1 and QS=1 in IQA_REG when Scalable Mode capability
1432
+ * is present.
1433
+ */
1434
+ if (ecap_smts (iommu -> ecap ))
1435
+ val |= (1 << 11 ) | 1 ;
1436
+
1410
1437
raw_spin_lock_irqsave (& iommu -> register_lock , flags );
1411
1438
1412
1439
/* write zero to the tail reg */
1413
1440
writel (0 , iommu -> reg + DMAR_IQT_REG );
1414
1441
1415
- dmar_writeq (iommu -> reg + DMAR_IQA_REG , virt_to_phys ( qi -> desc ) );
1442
+ dmar_writeq (iommu -> reg + DMAR_IQA_REG , val );
1416
1443
1417
1444
iommu -> gcmd |= DMA_GCMD_QIE ;
1418
1445
writel (iommu -> gcmd , iommu -> reg + DMAR_GCMD_REG );
@@ -1448,8 +1475,12 @@ int dmar_enable_qi(struct intel_iommu *iommu)
1448
1475
1449
1476
qi = iommu -> qi ;
1450
1477
1451
-
1452
- desc_page = alloc_pages_node (iommu -> node , GFP_ATOMIC | __GFP_ZERO , 0 );
1478
+ /*
1479
+ * Need two pages to accommodate 256 descriptors of 256 bits each
1480
+ * if the remapping hardware supports scalable mode translation.
1481
+ */
1482
+ desc_page = alloc_pages_node (iommu -> node , GFP_ATOMIC | __GFP_ZERO ,
1483
+ !!ecap_smts (iommu -> ecap ));
1453
1484
if (!desc_page ) {
1454
1485
kfree (qi );
1455
1486
iommu -> qi = NULL ;
0 commit comments