[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241209192549.107226-8-mjrosato@linux.ibm.com>
Date: Mon, 9 Dec 2024 14:25:49 -0500
From: Matthew Rosato <mjrosato@...ux.ibm.com>
To: joro@...tes.org, will@...nel.org, robin.murphy@....com,
gerald.schaefer@...ux.ibm.com, schnelle@...ux.ibm.com
Cc: hca@...ux.ibm.com, gor@...ux.ibm.com, agordeev@...ux.ibm.com,
svens@...ux.ibm.com, borntraeger@...ux.ibm.com, clegoate@...hat.com,
iommu@...ts.linux.dev, linux-kernel@...r.kernel.org,
linux-s390@...r.kernel.org
Subject: [PATCH 7/7] iommu/s390: allow larger region tables
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@...ux.ibm.com>
---
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
Powered by blists - more mailing lists