FAILED: patch "[PATCH] PCI: rockchip: Don't advertise MSI-X in PCIe capabilities" failed to apply to 5.15-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x a52587e0bee14cbeeadf48a24013828cb04b8df8
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023072133-onto-maroon-ba75@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
a52587e0bee1 ("PCI: rockchip: Don't advertise MSI-X in PCIe capabilities") 8962b2cb3911 ("PCI: rockchip: Use u32 variable to access 32-bit registers") dc73ed0f1b8b ("PCI: rockchip: Fix window mapping and address translation for endpoint") 166e89d99dd8 ("PCI: rockchip: Fix legacy IRQ generation for RK3399 PCIe endpoint core") 9dd3c7c4c8c3 ("PCI: rockchip: Add poll and timeout to wait for PHY PLLs to be locked") f397fd4ac1fa ("PCI: rockchip: Assert PCI Configuration Enable bit after probe") 92a9c57c325d ("PCI: rockchip: Remove writes to unused registers") 096950e230b8 ("PCI: rockchip: Fix find_first_zero_bit() limit")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a52587e0bee14cbeeadf48a24013828cb04b8df8 Mon Sep 17 00:00:00 2001
From: Rick Wertenbroek <[email protected]>
Date: Tue, 18 Apr 2023 09:46:57 +0200
Subject: [PATCH] PCI: rockchip: Don't advertise MSI-X in PCIe capabilities
The RK3399 PCIe endpoint controller cannot generate MSI-X IRQs. This is documented in the RK3399 technical reference manual (TRM) section 17.5.9 "Interrupt Support".
MSI-X capability should therefore not be advertised. Remove the MSI-X capability by editing the capability linked-list. The previous entry is the MSI capability, therefore get the next entry from the MSI-X capability entry and set it as next entry for the MSI capability. This in effect removes MSI-X from the list.
Linked list before : MSI cap -> MSI-X cap -> PCIe Device cap -> ... Linked list now : MSI cap -> PCIe Device cap -> ...
drivers/pci/controller/pcie-rockchip-ep.c +24 -0
@@ -507,6 +507,7 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)size_t max_regions;struct pci_epc_mem_window *windows =NULL ;int err, i; +u32 cfg_msi, cfg_msix_cp; ep =devm_kzalloc (dev,sizeof (*ep),GFP_KERNEL );if (!ep)
@@ -582,6 +583,29 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev) ep->irq_pci_addr =ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR ; +/* +* MSI-X is not supported but the controller still advertises the MSI-X +* capability by default, which can lead to the Root Complex side +* allocating MSI-X vectors which cannot be used. Avoid this by skipping +* the MSI-X capability entry in the PCIe capabilities linked-list: get +* the next pointer from the MSI-X entry and set that in the MSI +* capability entry (which is the previous entry). This way the MSI-X +* entry is skipped (left out of the linked-list) and not advertised. +*/ + cfg_msi =rockchip_pcie_read (rockchip,PCIE_EP_CONFIG_BASE + +ROCKCHIP_PCIE_EP_MSI_CTRL_REG ); + + cfg_msi &= ~ROCKCHIP_PCIE_EP_MSI_CP1_MASK ; + + cfg_msix_cp =rockchip_pcie_read (rockchip,PCIE_EP_CONFIG_BASE + +ROCKCHIP_PCIE_EP_MSIX_CAP_REG ) & +ROCKCHIP_PCIE_EP_MSIX_CAP_CP_MASK ; + + cfg_msi |= cfg_msix_cp; + +rockchip_pcie_write (rockchip, cfg_msi, +PCIE_EP_CONFIG_BASE +ROCKCHIP_PCIE_EP_MSI_CTRL_REG ); +rockchip_pcie_write (rockchip,PCIE_CLIENT_CONF_ENABLE ,PCIE_CLIENT_CONFIG );
drivers/pci/controller/pcie-rockchip.h +5 -0
@@ -227,6 +227,8 @@#define ROCKCHIP_PCIE_EP_CMD_STATUS 0x4#define ROCKCHIP_PCIE_EP_CMD_STATUS_IS BIT(19)#define ROCKCHIP_PCIE_EP_MSI_CTRL_REG 0x90 +#define ROCKCHIP_PCIE_EP_MSI_CP1_OFFSET 8 +#define ROCKCHIP_PCIE_EP_MSI_CP1_MASK GENMASK(15, 8)#define ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET 16#define ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET 17#define ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK GENMASK(19, 17)
@@ -234,6 +236,9 @@#define ROCKCHIP_PCIE_EP_MSI_CTRL_MME_MASK GENMASK(22, 20)#define ROCKCHIP_PCIE_EP_MSI_CTRL_ME BIT(16)#define ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP BIT(24) +#define ROCKCHIP_PCIE_EP_MSIX_CAP_REG 0xb0 +#define ROCKCHIP_PCIE_EP_MSIX_CAP_CP_OFFSET 8 +#define ROCKCHIP_PCIE_EP_MSIX_CAP_CP_MASK GENMASK(15, 8)#define ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR 0x1#define ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR 0x3#define ROCKCHIP_PCIE_EP_FUNC_BASE (fn) \