• Niklas Schnelle's avatar
    s390/pci: fix max size calculation in zpci_memcpy_toio() · 80df7d6a
    Niklas Schnelle authored
    The zpci_get_max_write_size() helper is used to determine the maximum
    size a PCI store or load can use at a given __iomem address.
    
    For the PCI block store the following restrictions apply:
    
    1. The dst + len must not cross a 4K boundary in the (pseudo-)MMIO space
    2. len must not exceed ZPCI_MAX_WRITE_SIZE
    3. len must be a multiple of 8 bytes
    4. The src address must be double word (8 byte) aligned
    5. The dst address must be double word (8 byte) aligned
    
    Otherwise only a normal PCI store which takes its src value from
    a register can be used. For these PCI store restriction 1 still applies.
    Similarly 1 also applies to PCI loads.
    
    It turns out zpci_max_write_size() instead implements stricter
    conditions which prevents PCI block stores from being used where they
    can and should be used. In particular instead of conditions 4 and 5 it
    wrongly enforces both dst and src to be size aligned. This indirectly
    covers condition 1 but also prevents many legal PCI block stores.
    
    On top of the functional shortcomings the zpci_get_max_write_size() is
    misnamed as it is used for both read and write size calculations. Rename
    it to zpci_get_max_io_size() and implement the listed conditions
    explicitly.
    Reviewed-by: default avatarMatthew Rosato <mjrosato@linux.ibm.com>
    Fixes: cd248341 ("s390/pci: base support")
    Signed-off-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
    [agordeev@linux.ibm.com replaced spaces with tabs]
    Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
    80df7d6a
pci_mmio.c 8.09 KB