|
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;
|