]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/s390: set appropriate IOTA region type
authorMatthew Rosato <mjrosato@linux.ibm.com>
Fri, 11 Apr 2025 20:24:29 +0000 (16:24 -0400)
committerJoerg Roedel <jroedel@suse.de>
Thu, 17 Apr 2025 14:43:10 +0000 (16:43 +0200)
When registering the I/O Translation Anchor, use the current table type
stored in the s390_domain to set the appropriate region type
indication.  For the moment, the table type will always be stored as
region third.

Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Niklas Schnelle <schnelle@linux.ibm.com>
Link: https://lore.kernel.org/r/20250411202433.181683-2-mjrosato@linux.ibm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/s390-iommu.c

index e1c76e0f9c2b7f9e32e3d8586a5112fe0a319f36..cad032d4c9a6469490650fc46440d0f1f09017a7 100644 (file)
@@ -31,6 +31,7 @@ struct s390_domain {
        unsigned long           *dma_table;
        spinlock_t              list_lock;
        struct rcu_head         rcu;
+       u8                      origin_type;
 };
 
 static struct iommu_domain blocking_domain;
@@ -345,6 +346,7 @@ static struct iommu_domain *s390_domain_alloc_paging(struct device *dev)
        s390_domain->domain.geometry.force_aperture = true;
        s390_domain->domain.geometry.aperture_start = 0;
        s390_domain->domain.geometry.aperture_end = ZPCI_TABLE_SIZE_RT - 1;
+       s390_domain->origin_type = ZPCI_TABLE_TYPE_RTX;
 
        spin_lock_init(&s390_domain->list_lock);
        INIT_LIST_HEAD_RCU(&s390_domain->devices);
@@ -381,6 +383,21 @@ static void zdev_s390_domain_update(struct zpci_dev *zdev,
        spin_unlock_irqrestore(&zdev->dom_lock, flags);
 }
 
+static u64 get_iota_region_flag(struct s390_domain *domain)
+{
+       switch (domain->origin_type) {
+       case ZPCI_TABLE_TYPE_RTX:
+               return ZPCI_IOTA_RTTO_FLAG;
+       case ZPCI_TABLE_TYPE_RSX:
+               return ZPCI_IOTA_RSTO_FLAG;
+       case ZPCI_TABLE_TYPE_RFX:
+               return ZPCI_IOTA_RFTO_FLAG;
+       default:
+               WARN_ONCE(1, "Invalid IOMMU table (%x)\n", domain->origin_type);
+               return 0;
+       }
+}
+
 static int s390_iommu_domain_reg_ioat(struct zpci_dev *zdev,
                                      struct iommu_domain *domain, u8 *status)
 {
@@ -399,7 +416,7 @@ static int s390_iommu_domain_reg_ioat(struct zpci_dev *zdev,
        default:
                s390_domain = to_s390_domain(domain);
                iota = virt_to_phys(s390_domain->dma_table) |
-                      ZPCI_IOTA_RTTO_FLAG;
+                      get_iota_region_flag(s390_domain);
                rc = zpci_register_ioat(zdev, 0, zdev->start_dma,
                                        zdev->end_dma, iota, status);
        }