• Niklas Schnelle's avatar
    s390/pci: move pseudo-MMIO to prevent MIO overlap · 52d04d40
    Niklas Schnelle authored
    When running without MIO support, with pci=nomio or for devices which
    are not MIO-capable the zPCI subsystem generates pseudo-MMIO addresses
    to allow access to PCI BARs via MMIO based Linux APIs even though the
    platform uses function handles and BAR numbers.
    
    This is done by stashing an index into our global IOMAP array which
    contains the function handle in the 16 most significant bits of the
    addresses returned by ioremap() always setting the most significant bit.
    
    On the other hand the MIO addresses assigned by the platform for use,
    while requiring special instructions, allow PCI access with virtually
    mapped physical addresses. Now the problem is that these MIO addresses
    and our own pseudo-MMIO addresses may overlap, while functionally this
    would not be a problem by itself this overlap is detected by common code
    as both address types are added as resources in the iomem_resource tree.
    This leads to the overlapping resource claim of either the MIO capable
    or non-MIO capable devices with being rejected.
    
    Since PCI is tightly coupled to the use of the iomem_resource tree, see
    for example the code for request_mem_region(), we can't reasonably get
    rid of the overlap being detected by keeping our pseudo-MMIO addresses
    out of the iomem_resource tree.
    
    Instead let's move the range used by our own pseudo-MMIO addresses by
    starting at (1UL << 62) and only using addresses below (1UL << 63) thus
    avoiding the range currently used for MIO addresses.
    
    Fixes: c7ff0e91 ("s390/pci: deal with devices that have no support for MIO instructions")
    Cc: stable@vger.kernel.org # 5.3+
    Reviewed-by: default avatarPierre Morel <pmorel@linux.ibm.com>
    Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    52d04d40
pci_io.h 4.17 KB