Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: dwc: Add upper limit address for outbound iATU

The size parameter is unsigned long type which can accept size > 4GB. In
that case, the upper limit address must be programmed. Add support to
program the upper limit address and set INCREASE_REGION_SIZE in case size >
4GB.

Link: https://lore.kernel.org/r/1612250918-19610-1-git-send-email-shradha.t@samsung.com
Signed-off-by: Shradha Todi <shradha.t@samsung.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Pankaj Dubey <pankaj.dubey@samsung.com>
Reviewed-by: Rob Herring <robh@kernel.org>

authored by

Shradha Todi and committed by
Bjorn Helgaas
5b4cf0f6 3856e1c5

+6
+5
drivers/pci/controller/dwc/pcie-designware.c
··· 333 333 upper_32_bits(cpu_addr)); 334 334 dw_pcie_writel_dbi(pci, PCIE_ATU_LIMIT, 335 335 lower_32_bits(cpu_addr + size - 1)); 336 + if (pci->version >= 0x460A) 337 + dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_LIMIT, 338 + upper_32_bits(cpu_addr + size - 1)); 336 339 dw_pcie_writel_dbi(pci, PCIE_ATU_LOWER_TARGET, 337 340 lower_32_bits(pci_addr)); 338 341 dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_TARGET, 339 342 upper_32_bits(pci_addr)); 340 343 val = type | PCIE_ATU_FUNC_NUM(func_no); 344 + val = ((upper_32_bits(size - 1)) && (pci->version >= 0x460A)) ? 345 + val | PCIE_ATU_INCREASE_REGION_SIZE : val; 341 346 if (pci->version == 0x490A) 342 347 val = dw_pcie_enable_ecrc(val); 343 348 dw_pcie_writel_dbi(pci, PCIE_ATU_CR1, val);
+1
drivers/pci/controller/dwc/pcie-designware.h
··· 100 100 #define PCIE_ATU_DEV(x) FIELD_PREP(GENMASK(23, 19), x) 101 101 #define PCIE_ATU_FUNC(x) FIELD_PREP(GENMASK(18, 16), x) 102 102 #define PCIE_ATU_UPPER_TARGET 0x91C 103 + #define PCIE_ATU_UPPER_LIMIT 0x924 103 104 104 105 #define PCIE_MISC_CONTROL_1_OFF 0x8BC 105 106 #define PCIE_DBI_RO_WR_EN BIT(0)