Extend the aperture calculation to consider sizes beyond the maximum size of a region third table. Attempt to always use the smallest table size possible to avoid unnecessary extra steps during translation. Signed-off-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxx> --- arch/s390/include/asm/pci_dma.h | 1 + drivers/iommu/s390-iommu.c | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/arch/s390/include/asm/pci_dma.h b/arch/s390/include/asm/pci_dma.h index 8d8962e4fd58..d12e17201661 100644 --- a/arch/s390/include/asm/pci_dma.h +++ b/arch/s390/include/asm/pci_dma.h @@ -25,6 +25,7 @@ enum zpci_ioat_dtype { #define ZPCI_KEY (PAGE_DEFAULT_KEY << 5) #define ZPCI_TABLE_SIZE_RT (1UL << 42) +#define ZPCI_TABLE_SIZE_RS (1UL << 53) #define ZPCI_IOTA_STO_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_ST) #define ZPCI_IOTA_RTTO_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RT) diff --git a/drivers/iommu/s390-iommu.c b/drivers/iommu/s390-iommu.c index 4924fe9faccb..c6b2bca881c3 100644 --- a/drivers/iommu/s390-iommu.c +++ b/drivers/iommu/s390-iommu.c @@ -953,12 +953,24 @@ int zpci_init_iommu(struct zpci_dev *zdev) goto out_sysfs; zdev->start_dma = PAGE_ALIGN(zdev->start_dma); - aperture_size = min3(s390_iommu_aperture, - ZPCI_TABLE_SIZE_RT - zdev->start_dma, - zdev->end_dma - zdev->start_dma + 1); + aperture_size = min(s390_iommu_aperture, + zdev->end_dma - zdev->start_dma + 1); + if (aperture_size <= (ZPCI_TABLE_SIZE_RT - zdev->start_dma)) { + zdev->origin_type = ZPCI_TABLE_TYPE_RTX; + zdev->max_table_size = ZPCI_TABLE_SIZE_RT - 1; + } else if (aperture_size <= (ZPCI_TABLE_SIZE_RS - zdev->start_dma) && + (zdev->dtsm & ZPCI_IOTA_DT_RS)) { + zdev->origin_type = ZPCI_TABLE_TYPE_RSX; + zdev->max_table_size = ZPCI_TABLE_SIZE_RS - 1; + } else if (zdev->dtsm & ZPCI_IOTA_DT_RF) { + zdev->origin_type = ZPCI_TABLE_TYPE_RFX; + zdev->max_table_size = U64_MAX; + } else { + /* Assume RTX available */ + zdev->origin_type = ZPCI_TABLE_TYPE_RTX; + zdev->max_table_size = ZPCI_TABLE_SIZE_RT - 1; + } zdev->end_dma = zdev->start_dma + aperture_size - 1; - zdev->origin_type = ZPCI_TABLE_TYPE_RTX; - zdev->max_table_size = ZPCI_TABLE_SIZE_RT - 1; return 0; -- 2.47.0