On Wed, May 04, 2022 at 12:46:34AM +0300, Serge Semin wrote: > Since the DWC PCIe driver private data now contains the iATU inbound and > outbound regions constraints info like alignment, minimum and maximum > limits, we can use them to make the in- and outbound iATU regions setup > methods more strict to the ranges a callee tries to specify. That will > give us the safer dw_pcie_prog_outbound_atu(), > dw_pcie_prog_ep_outbound_atu() and dw_pcie_prog_inbound_atu() functions. > > First of all let's update the outbound ATU entries setup methods to > returning the operation status. The methods will fail either in case if > the range is failed to be activated or the passed region doesn't fulfill > iATU constraints. Secondly the passed to the > dw_pcie_prog_{ep_}outbound_atu() methods region-related parameters are > verified against the detected iATU regions constraints. In particular the > region limit address must not overflow the lower/upper limit CSR RW-fields > otherwise the specified range will be just silently clamped. That > verification will also protect the code from having u64 type overflow. > Secondly let's make sure base address (CPU-address), target address > (PCI-address) and size are properly aligned. Unaligned ranges will be > silently aligned down (addresses) and up (limit) on writing the values to > the corresponding registers, which in it turn may lead to unpredictable > results like ranges virtual overlap. Finally the CPU-address alignment > needs to be verified in the dw_pcie_prog_inbound_atu() method too as the > DWC PCIe RC/EP registers manual demands seeing the lower bits of the in- > and outbound iATU base address are always zeros. > > Signed-off-by: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx> > --- > drivers/pci/controller/dwc/pcie-designware.c | 39 +++++++++++++------- > drivers/pci/controller/dwc/pcie-designware.h | 10 ++--- > 2 files changed, 30 insertions(+), 19 deletions(-) Reviewed-by: Rob Herring <robh@xxxxxxxxxx>