@@ -1526,24 +1526,9 @@ void qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
1526
1526
void qi_flush_iotlb (struct intel_iommu * iommu , u16 did , u64 addr ,
1527
1527
unsigned int size_order , u64 type )
1528
1528
{
1529
- u8 dw = 0 , dr = 0 ;
1530
-
1531
1529
struct qi_desc desc ;
1532
- int ih = 0 ;
1533
-
1534
- if (cap_write_drain (iommu -> cap ))
1535
- dw = 1 ;
1536
-
1537
- if (cap_read_drain (iommu -> cap ))
1538
- dr = 1 ;
1539
-
1540
- desc .qw0 = QI_IOTLB_DID (did ) | QI_IOTLB_DR (dr ) | QI_IOTLB_DW (dw )
1541
- | QI_IOTLB_GRAN (type ) | QI_IOTLB_TYPE ;
1542
- desc .qw1 = QI_IOTLB_ADDR (addr ) | QI_IOTLB_IH (ih )
1543
- | QI_IOTLB_AM (size_order );
1544
- desc .qw2 = 0 ;
1545
- desc .qw3 = 0 ;
1546
1530
1531
+ qi_desc_iotlb (iommu , did , addr , size_order , type , & desc );
1547
1532
qi_submit_sync (iommu , & desc , 1 , 0 );
1548
1533
}
1549
1534
@@ -1561,20 +1546,7 @@ void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 pfsid,
1561
1546
if (!(iommu -> gcmd & DMA_GCMD_TE ))
1562
1547
return ;
1563
1548
1564
- if (mask ) {
1565
- addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1 )) - 1 ;
1566
- desc .qw1 = QI_DEV_IOTLB_ADDR (addr ) | QI_DEV_IOTLB_SIZE ;
1567
- } else
1568
- desc .qw1 = QI_DEV_IOTLB_ADDR (addr );
1569
-
1570
- if (qdep >= QI_DEV_IOTLB_MAX_INVS )
1571
- qdep = 0 ;
1572
-
1573
- desc .qw0 = QI_DEV_IOTLB_SID (sid ) | QI_DEV_IOTLB_QDEP (qdep ) |
1574
- QI_DIOTLB_TYPE | QI_DEV_IOTLB_PFSID (pfsid );
1575
- desc .qw2 = 0 ;
1576
- desc .qw3 = 0 ;
1577
-
1549
+ qi_desc_dev_iotlb (sid , pfsid , qdep , addr , mask , & desc );
1578
1550
qi_submit_sync (iommu , & desc , 1 , 0 );
1579
1551
}
1580
1552
@@ -1594,36 +1566,14 @@ void qi_flush_piotlb(struct intel_iommu *iommu, u16 did, u32 pasid, u64 addr,
1594
1566
return ;
1595
1567
}
1596
1568
1597
- if (npages == -1 ) {
1598
- desc .qw0 = QI_EIOTLB_PASID (pasid ) |
1599
- QI_EIOTLB_DID (did ) |
1600
- QI_EIOTLB_GRAN (QI_GRAN_NONG_PASID ) |
1601
- QI_EIOTLB_TYPE ;
1602
- desc .qw1 = 0 ;
1603
- } else {
1604
- int mask = ilog2 (__roundup_pow_of_two (npages ));
1605
- unsigned long align = (1ULL << (VTD_PAGE_SHIFT + mask ));
1606
-
1607
- if (WARN_ON_ONCE (!IS_ALIGNED (addr , align )))
1608
- addr = ALIGN_DOWN (addr , align );
1609
-
1610
- desc .qw0 = QI_EIOTLB_PASID (pasid ) |
1611
- QI_EIOTLB_DID (did ) |
1612
- QI_EIOTLB_GRAN (QI_GRAN_PSI_PASID ) |
1613
- QI_EIOTLB_TYPE ;
1614
- desc .qw1 = QI_EIOTLB_ADDR (addr ) |
1615
- QI_EIOTLB_IH (ih ) |
1616
- QI_EIOTLB_AM (mask );
1617
- }
1618
-
1569
+ qi_desc_piotlb (did , pasid , addr , npages , ih , & desc );
1619
1570
qi_submit_sync (iommu , & desc , 1 , 0 );
1620
1571
}
1621
1572
1622
1573
/* PASID-based device IOTLB Invalidate */
1623
1574
void qi_flush_dev_iotlb_pasid (struct intel_iommu * iommu , u16 sid , u16 pfsid ,
1624
1575
u32 pasid , u16 qdep , u64 addr , unsigned int size_order )
1625
1576
{
1626
- unsigned long mask = 1UL << (VTD_PAGE_SHIFT + size_order - 1 );
1627
1577
struct qi_desc desc = {.qw1 = 0 , .qw2 = 0 , .qw3 = 0 };
1628
1578
1629
1579
/*
@@ -1635,40 +1585,9 @@ void qi_flush_dev_iotlb_pasid(struct intel_iommu *iommu, u16 sid, u16 pfsid,
1635
1585
if (!(iommu -> gcmd & DMA_GCMD_TE ))
1636
1586
return ;
1637
1587
1638
- desc .qw0 = QI_DEV_EIOTLB_PASID (pasid ) | QI_DEV_EIOTLB_SID (sid ) |
1639
- QI_DEV_EIOTLB_QDEP (qdep ) | QI_DEIOTLB_TYPE |
1640
- QI_DEV_IOTLB_PFSID (pfsid );
1641
-
1642
- /*
1643
- * If S bit is 0, we only flush a single page. If S bit is set,
1644
- * The least significant zero bit indicates the invalidation address
1645
- * range. VT-d spec 6.5.2.6.
1646
- * e.g. address bit 12[0] indicates 8KB, 13[0] indicates 16KB.
1647
- * size order = 0 is PAGE_SIZE 4KB
1648
- * Max Invs Pending (MIP) is set to 0 for now until we have DIT in
1649
- * ECAP.
1650
- */
1651
- if (!IS_ALIGNED (addr , VTD_PAGE_SIZE << size_order ))
1652
- pr_warn_ratelimited ("Invalidate non-aligned address %llx, order %d\n" ,
1653
- addr , size_order );
1654
-
1655
- /* Take page address */
1656
- desc .qw1 = QI_DEV_EIOTLB_ADDR (addr );
1657
-
1658
- if (size_order ) {
1659
- /*
1660
- * Existing 0s in address below size_order may be the least
1661
- * significant bit, we must set them to 1s to avoid having
1662
- * smaller size than desired.
1663
- */
1664
- desc .qw1 |= GENMASK_ULL (size_order + VTD_PAGE_SHIFT - 1 ,
1665
- VTD_PAGE_SHIFT );
1666
- /* Clear size_order bit to indicate size */
1667
- desc .qw1 &= ~mask ;
1668
- /* Set the S bit to indicate flushing more than 1 page */
1669
- desc .qw1 |= QI_DEV_EIOTLB_SIZE ;
1670
- }
1671
-
1588
+ qi_desc_dev_iotlb_pasid (sid , pfsid , pasid ,
1589
+ qdep , addr , size_order ,
1590
+ & desc );
1672
1591
qi_submit_sync (iommu , & desc , 1 , 0 );
1673
1592
}
1674
1593
0 commit comments