linux/arch/s390
Niklas Schnelle 930ce7a5c0 s390/pci: fix max size calculation in zpci_memcpy_toio()
[ Upstream commit 80df7d6af7 ]

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: Matthew Rosato <mjrosato@linux.ibm.com>
Fixes: cd24834130 ("s390/pci: base support")
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
[agordeev@linux.ibm.com replaced spaces with tabs]
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-01-25 15:35:56 -08:00
..
appldata sysctl: Add size to register_sysctl 2023-08-15 15:26:17 -07:00
boot s390/kasan: handle DCSS mapping in memory holes 2023-10-16 13:03:05 +02:00
configs cred: get rid of CONFIG_DEBUG_CREDENTIALS 2023-12-20 17:01:51 +01:00
crypto s390/paes: fix PKEY_TYPE_EP11_AES handling for secure keyblobs 2023-08-17 15:18:53 +02:00
hypfs s390 updates for 6.6 merge window 2023-08-28 17:22:39 -07:00
include s390/pci: fix max size calculation in zpci_memcpy_toio() 2024-01-25 15:35:56 -08:00
kernel s390/ipl: add missing IPL_TYPE_ECKD_DUMP case to ipl_init() 2023-12-03 07:33:04 +01:00
kvm KVM: s390: vsie: fix wrong VIR 37 when MSO is used 2024-01-10 17:16:56 +01:00
lib s390: replace #include <asm/export.h> with #include <linux/export.h> 2023-08-09 15:20:50 +02:00
mm KVM: s390/mm: Properly reset no-dat 2023-12-13 18:45:34 +01:00
net s390/bpf: Fix unwinding past the trampoline 2023-10-11 00:08:46 +02:00
pci s390/pci: fix max size calculation in zpci_memcpy_toio() 2024-01-25 15:35:56 -08:00
purgatory s390 updates for 6.5 merge window part 2 2023-07-06 13:18:30 -07:00
tools KVM: s390: Add facility 197 to the allow list 2022-07-13 15:25:25 +02:00
Kbuild - An extensive rework of kexec and crash Kconfig from Eric DeVolder 2023-08-29 14:53:51 -07:00
Kconfig kexec: fix KEXEC_FILE dependencies 2024-01-05 15:19:41 +01:00
Kconfig.debug s390/Kconfig.debug: fix indentation 2022-06-01 12:03:15 +02:00
Makefile s390: use obj-y to descend into drivers/s390/ 2023-07-24 12:12:25 +02:00