]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: dwc: Export DWC MSI controller related APIs
authorMayank Rana <mayank.rana@oss.qualcomm.com>
Mon, 16 Jun 2025 22:42:56 +0000 (15:42 -0700)
committerManivannan Sadhasivam <mani@kernel.org>
Tue, 1 Jul 2025 14:31:15 +0000 (20:01 +0530)
Export dw_pcie_msi_host_init(), dw_pcie_msi_init(), and dw_pcie_free_msi()
APIs to allow them to be reused by the upcoming DWC based ECAM driver
implementation. Also, move MSI IRQ related initialization code to
dw_pcie_msi_init(), as this code must be executed before dw_pcie_msi_init()
API can be used with ECAM driver.

Signed-off-by: Mayank Rana <mayank.rana@oss.qualcomm.com>
[mani: commit message rewording]
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://patch.msgid.link/20250616224259.3549811-2-mayank.rana@oss.qualcomm.com
drivers/pci/controller/dwc/pcie-designware-host.c
drivers/pci/controller/dwc/pcie-designware.h

index 906277f9ffaf79f2c5c3c76f1941556bebdba38f..af6c91ec7312bab6c6e5ad35b051d0f452fe7b8d 100644 (file)
@@ -250,7 +250,7 @@ int dw_pcie_allocate_domains(struct dw_pcie_rp *pp)
        return 0;
 }
 
-static void dw_pcie_free_msi(struct dw_pcie_rp *pp)
+void dw_pcie_free_msi(struct dw_pcie_rp *pp)
 {
        u32 ctrl;
 
@@ -263,19 +263,34 @@ static void dw_pcie_free_msi(struct dw_pcie_rp *pp)
        irq_domain_remove(pp->msi_domain);
        irq_domain_remove(pp->irq_domain);
 }
+EXPORT_SYMBOL_GPL(dw_pcie_free_msi);
 
-static void dw_pcie_msi_init(struct dw_pcie_rp *pp)
+void dw_pcie_msi_init(struct dw_pcie_rp *pp)
 {
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
        u64 msi_target = (u64)pp->msi_data;
+       u32 ctrl, num_ctrls;
 
        if (!pci_msi_enabled() || !pp->has_msi_ctrl)
                return;
 
+       num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+
+       /* Initialize IRQ Status array */
+       for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
+               dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK +
+                                   (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
+                                   pp->irq_mask[ctrl]);
+               dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_ENABLE +
+                                   (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
+                                   ~0);
+       }
+
        /* Program the msi_data */
        dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_LO, lower_32_bits(msi_target));
        dw_pcie_writel_dbi(pci, PCIE_MSI_ADDR_HI, upper_32_bits(msi_target));
 }
+EXPORT_SYMBOL_GPL(dw_pcie_msi_init);
 
 static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp)
 {
@@ -317,7 +332,7 @@ static int dw_pcie_parse_split_msi_irq(struct dw_pcie_rp *pp)
        return 0;
 }
 
-static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
+int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
 {
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
        struct device *dev = pci->dev;
@@ -391,6 +406,7 @@ static int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(dw_pcie_msi_host_init);
 
 static void dw_pcie_host_request_msg_tlp_res(struct dw_pcie_rp *pp)
 {
@@ -909,7 +925,7 @@ static void dw_pcie_config_presets(struct dw_pcie_rp *pp)
 int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
 {
        struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
-       u32 val, ctrl, num_ctrls;
+       u32 val;
        int ret;
 
        /*
@@ -920,20 +936,6 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
 
        dw_pcie_setup(pci);
 
-       if (pp->has_msi_ctrl) {
-               num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
-
-               /* Initialize IRQ Status array */
-               for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
-                       dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_MASK +
-                                           (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
-                                           pp->irq_mask[ctrl]);
-                       dw_pcie_writel_dbi(pci, PCIE_MSI_INTR0_ENABLE +
-                                           (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
-                                           ~0);
-               }
-       }
-
        dw_pcie_msi_init(pp);
 
        /* Setup RC BARs */
index ce9e18554e426e46f0376af22ffc99e329c2ccb8..4165c49a0a5059cab92dee3c47f8024af9d840bd 100644 (file)
@@ -759,6 +759,9 @@ static inline enum dw_pcie_ltssm dw_pcie_get_ltssm(struct dw_pcie *pci)
 int dw_pcie_suspend_noirq(struct dw_pcie *pci);
 int dw_pcie_resume_noirq(struct dw_pcie *pci);
 irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp);
+void dw_pcie_msi_init(struct dw_pcie_rp *pp);
+int dw_pcie_msi_host_init(struct dw_pcie_rp *pp);
+void dw_pcie_free_msi(struct dw_pcie_rp *pp);
 int dw_pcie_setup_rc(struct dw_pcie_rp *pp);
 int dw_pcie_host_init(struct dw_pcie_rp *pp);
 void dw_pcie_host_deinit(struct dw_pcie_rp *pp);
@@ -781,6 +784,17 @@ static inline irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp)
        return IRQ_NONE;
 }
 
+static inline void dw_pcie_msi_init(struct dw_pcie_rp *pp)
+{ }
+
+static inline int dw_pcie_msi_host_init(struct dw_pcie_rp *pp)
+{
+       return -ENODEV;
+}
+
+static inline void dw_pcie_free_msi(struct dw_pcie_rp *pp)
+{ }
+
 static inline int dw_pcie_setup_rc(struct dw_pcie_rp *pp)
 {
        return 0;