]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI: cadence: Check for the existence of cdns_pcie::ops before using it
authorChen Wang <unicorn_wang@outlook.com>
Fri, 12 Sep 2025 02:36:01 +0000 (10:36 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:28 +0000 (15:34 -0500)
[ Upstream commit 49a6c160ad4812476f8ae1a8f4ed6d15adfa6c09 ]

cdns_pcie::ops might not be populated by all the Cadence glue drivers. This
is going to be true for the upcoming Sophgo platform which doesn't set the
ops.

Hence, add a check to prevent NULL pointer dereference.

Signed-off-by: Chen Wang <unicorn_wang@outlook.com>
[mani: reworded subject and description]
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://patch.msgid.link/35182ee1d972dfcd093a964e11205efcebbdc044.1757643388.git.unicorn_wang@outlook.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pci/controller/cadence/pcie-cadence-host.c
drivers/pci/controller/cadence/pcie-cadence.c
drivers/pci/controller/cadence/pcie-cadence.h

index 741e10a575ec7525f7d03f262ec90b8d54eb654f..675b7ea6ff7844b2fe30bbaa8f6e2ccee0c9a0fb 100644 (file)
@@ -452,7 +452,7 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)
        cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_PCI_ADDR1(0), addr1);
        cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_DESC1(0), desc1);
 
-       if (pcie->ops->cpu_addr_fixup)
+       if (pcie->ops && pcie->ops->cpu_addr_fixup)
                cpu_addr = pcie->ops->cpu_addr_fixup(pcie, cpu_addr);
 
        addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(12) |
index 4251fac5e31065cd8651da7a022fac7f945664da..a1b66dbfc10f82fb81d9a6fa05d4cdf1a4c0df19 100644 (file)
@@ -90,7 +90,7 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 busnr, u8 fn,
        cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_DESC1(r), desc1);
 
        /* Set the CPU address */
-       if (pcie->ops->cpu_addr_fixup)
+       if (pcie->ops && pcie->ops->cpu_addr_fixup)
                cpu_addr = pcie->ops->cpu_addr_fixup(pcie, cpu_addr);
 
        addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(nbits) |
@@ -120,7 +120,7 @@ void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie,
        }
 
        /* Set the CPU address */
-       if (pcie->ops->cpu_addr_fixup)
+       if (pcie->ops && pcie->ops->cpu_addr_fixup)
                cpu_addr = pcie->ops->cpu_addr_fixup(pcie, cpu_addr);
 
        addr0 = CDNS_PCIE_AT_OB_REGION_CPU_ADDR0_NBITS(17) |
index 39ee9945c903ec88a11e336007769879ef9fd704..c267566fa76ecbfa1e1b149f7ee77149211ede3a 100644 (file)
@@ -499,7 +499,7 @@ static inline u32 cdns_pcie_ep_fn_readl(struct cdns_pcie *pcie, u8 fn, u32 reg)
 
 static inline int cdns_pcie_start_link(struct cdns_pcie *pcie)
 {
-       if (pcie->ops->start_link)
+       if (pcie->ops && pcie->ops->start_link)
                return pcie->ops->start_link(pcie);
 
        return 0;
@@ -507,13 +507,13 @@ static inline int cdns_pcie_start_link(struct cdns_pcie *pcie)
 
 static inline void cdns_pcie_stop_link(struct cdns_pcie *pcie)
 {
-       if (pcie->ops->stop_link)
+       if (pcie->ops && pcie->ops->stop_link)
                pcie->ops->stop_link(pcie);
 }
 
 static inline bool cdns_pcie_link_up(struct cdns_pcie *pcie)
 {
-       if (pcie->ops->link_up)
+       if (pcie->ops && pcie->ops->link_up)
                return pcie->ops->link_up(pcie);
 
        return true;