Petr Tesarik 939b3e
From: Niklas Schnelle <schnelle@linux.ibm.com>
Petr Tesarik 939b3e
Date: Thu, 4 Nov 2021 15:04:10 +0100
Petr Tesarik 939b3e
Subject: s390/pci: move pseudo-MMIO to prevent MIO overlap
Petr Tesarik 939b3e
Git-commit: 52d04d408185b7aa47628d2339c28ec70074e0ae
Petr Tesarik 939b3e
Patch-mainline: v5.16-rc4
Petr Tesarik 939b3e
References: bsc#1194966 LTC#196029
Petr Tesarik 939b3e
Petr Tesarik 939b3e
When running without MIO support, with pci=nomio or for devices which
Petr Tesarik 939b3e
are not MIO-capable the zPCI subsystem generates pseudo-MMIO addresses
Petr Tesarik 939b3e
to allow access to PCI BARs via MMIO based Linux APIs even though the
Petr Tesarik 939b3e
platform uses function handles and BAR numbers.
Petr Tesarik 939b3e
Petr Tesarik 939b3e
This is done by stashing an index into our global IOMAP array which
Petr Tesarik 939b3e
contains the function handle in the 16 most significant bits of the
Petr Tesarik 939b3e
addresses returned by ioremap() always setting the most significant bit.
Petr Tesarik 939b3e
Petr Tesarik 939b3e
On the other hand the MIO addresses assigned by the platform for use,
Petr Tesarik 939b3e
while requiring special instructions, allow PCI access with virtually
Petr Tesarik 939b3e
mapped physical addresses. Now the problem is that these MIO addresses
Petr Tesarik 939b3e
and our own pseudo-MMIO addresses may overlap, while functionally this
Petr Tesarik 939b3e
would not be a problem by itself this overlap is detected by common code
Petr Tesarik 939b3e
as both address types are added as resources in the iomem_resource tree.
Petr Tesarik 939b3e
This leads to the overlapping resource claim of either the MIO capable
Petr Tesarik 939b3e
or non-MIO capable devices with being rejected.
Petr Tesarik 939b3e
Petr Tesarik 939b3e
Since PCI is tightly coupled to the use of the iomem_resource tree, see
Petr Tesarik 939b3e
for example the code for request_mem_region(), we can't reasonably get
Petr Tesarik 939b3e
rid of the overlap being detected by keeping our pseudo-MMIO addresses
Petr Tesarik 939b3e
out of the iomem_resource tree.
Petr Tesarik 939b3e
Petr Tesarik 939b3e
Instead let's move the range used by our own pseudo-MMIO addresses by
Petr Tesarik 939b3e
starting at (1UL << 62) and only using addresses below (1UL << 63) thus
Petr Tesarik 939b3e
avoiding the range currently used for MIO addresses.
Petr Tesarik 939b3e
Petr Tesarik 939b3e
Fixes: c7ff0e918a7c ("s390/pci: deal with devices that have no support for MIO instructions")
Petr Tesarik 939b3e
Cc: stable@vger.kernel.org # 5.3+
Petr Tesarik 939b3e
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
Petr Tesarik 939b3e
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Petr Tesarik 939b3e
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Petr Tesarik 939b3e
Acked-by: Petr Tesarik <ptesarik@suse.com>
Petr Tesarik 939b3e
---
Petr Tesarik 939b3e
 arch/s390/include/asm/pci_io.h |    7 ++++---
Petr Tesarik 939b3e
 1 file changed, 4 insertions(+), 3 deletions(-)
Petr Tesarik 939b3e
Petr Tesarik 939b3e
--- a/arch/s390/include/asm/pci_io.h
Petr Tesarik 939b3e
+++ b/arch/s390/include/asm/pci_io.h
Petr Tesarik 939b3e
@@ -14,12 +14,13 @@
Petr Tesarik 939b3e
 
Petr Tesarik 939b3e
 /* I/O Map */
Petr Tesarik 939b3e
 #define ZPCI_IOMAP_SHIFT		48
Petr Tesarik 939b3e
-#define ZPCI_IOMAP_ADDR_BASE		0x8000000000000000UL
Petr Tesarik 939b3e
+#define ZPCI_IOMAP_ADDR_SHIFT		62
Petr Tesarik 939b3e
+#define ZPCI_IOMAP_ADDR_BASE		(1UL << ZPCI_IOMAP_ADDR_SHIFT)
Petr Tesarik 939b3e
 #define ZPCI_IOMAP_ADDR_OFF_MASK	((1UL << ZPCI_IOMAP_SHIFT) - 1)
Petr Tesarik 939b3e
 #define ZPCI_IOMAP_MAX_ENTRIES							\
Petr Tesarik 939b3e
-	((ULONG_MAX - ZPCI_IOMAP_ADDR_BASE + 1) / (1UL << ZPCI_IOMAP_SHIFT))
Petr Tesarik 939b3e
+	(1UL << (ZPCI_IOMAP_ADDR_SHIFT - ZPCI_IOMAP_SHIFT))
Petr Tesarik 939b3e
 #define ZPCI_IOMAP_ADDR_IDX_MASK						\
Petr Tesarik 939b3e
-	(~ZPCI_IOMAP_ADDR_OFF_MASK - ZPCI_IOMAP_ADDR_BASE)
Petr Tesarik 939b3e
+	((ZPCI_IOMAP_ADDR_BASE - 1) & ~ZPCI_IOMAP_ADDR_OFF_MASK)
Petr Tesarik 939b3e
 
Petr Tesarik 939b3e
 struct zpci_iomap_entry {
Petr Tesarik 939b3e
 	u32 fh;