]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
PCI: dwc: Use cfg0_base as iMSI-RX target address to support 32-bit MSI devices
authorShawn Lin <shawn.lin@rock-chips.com>
Wed, 24 Dec 2025 01:38:52 +0000 (09:38 +0800)
committerManivannan Sadhasivam <mani@kernel.org>
Mon, 29 Dec 2025 13:59:48 +0000 (19:29 +0530)
commit68ac85fb42cfeb081cf029acdd8aace55ed375a2
treed0a2c952adf5976fad7655e39753c3073f3da76e
parent8719c64e76bf258cc8f44109740c854f2e2ead2e
PCI: dwc: Use cfg0_base as iMSI-RX target address to support 32-bit MSI devices

commit f3a296405b6e ("PCI: dwc: Strengthen the MSI address allocation
logic") strengthened the iMSI-RX target address allocation logic to handle
64-bit addresses for platforms without 32-bit DMA addresses. However, it
still left 32-bit MSI capable endpoints (EPs) non-functional on such
platforms.

Per DWC databook r6.21a, sec 3.10.2.3, it states:
"The iMSI-RX is programmed with an address (MSI_CTRL_ADDR_OFF and
MSI_CTRL_UPPER_ADDR_OFF) that is used as the system MSI address. When an
inbound MWr request is passed to the AXI bridge and matches this address
as well as the conditions specified for an MSI memory write request, an
MSI interrupt is detected. When this MWr is about to be driven onto the
AXI bridge master interface1, it is dropped and never appears on the AXI
bus."

Since iMSI-RX MSI_CTRL_ADDR doesn't require actual system memory mapping,
any 32-bit address that won't be used for BAR memory allocations can be
assigned. So assign cfg0_base to the iMSI-RX target address as the first
option if it's a 32-bit address, which satisfies this requirement.
Otherwise, fallback to the existing coherent allocation.

cc: Ajay Agarwal <ajayagarwal@google.com>
cc: Will McVicker <willmcvicker@google.com>
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
[mani: trimmed the description to exclude testbed info and used imperative tone]
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://patch.msgid.link/1766540332-24235-1-git-send-email-shawn.lin@rock-chips.com
drivers/pci/controller/dwc/pcie-designware-host.c