]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: endpoint: Align pci_epc_set_msi(), pci_epc_ops::set_msi() nr_irqs encoding
authorNiklas Cassel <cassel@kernel.org>
Wed, 14 May 2025 07:43:18 +0000 (09:43 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 28 May 2025 21:47:56 +0000 (16:47 -0500)
The kdoc for pci_epc_set_msi() says:
"Invoke to set the required number of MSI interrupts."

The kdoc for the callback pci_epc_ops::set_msi() says:
"ops to set the requested number of MSI interrupts in the MSI capability
register"

pci_epc_ops::set_msi() does however expect the parameter 'interrupts' to be
in the encoding as defined by the Multiple Message Capable (MMC) field of
the MSI capability structure. Nowhere in the kdoc does it say that the
number of interrupts should be in MMC encoding.

It is very confusing that the API pci_epc_set_msi() and the callback
function pci_epc_ops::set_msi() both take a parameter named 'interrupts',
but they expect completely different encodings.

Clean up the API and the callback function to have the same semantics,
i.e. the parameter represents the number of interrupts, regardless of the
internal encoding of that value.

Also rename the parameter 'interrupts' to 'nr_irqs', in both the wrapper
function and the callback function, such that the name is unambiguous.

[bhelgaas: more specific subject]

Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: stable+noautosel@kernel.org # this is simply a cleanup
Link: https://patch.msgid.link/20250514074313.283156-13-cassel@kernel.org
drivers/pci/controller/cadence/pcie-cadence-ep.c
drivers/pci/controller/dwc/pcie-designware-ep.c
drivers/pci/controller/pcie-rcar-ep.c
drivers/pci/controller/pcie-rockchip-ep.c
drivers/pci/endpoint/pci-epc-core.c
include/linux/pci-epc.h

index 569cb7481d450f5a83839a83df6e4649adeb73e5..f09f29ed27edb92e331c3dbfebd532fffd716063 100644 (file)
@@ -220,10 +220,11 @@ static void cdns_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,
        clear_bit(r, &ep->ob_region_map);
 }
 
-static int cdns_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn, u8 mmc)
+static int cdns_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn, u8 nr_irqs)
 {
        struct cdns_pcie_ep *ep = epc_get_drvdata(epc);
        struct cdns_pcie *pcie = &ep->pcie;
+       u8 mmc = order_base_2(nr_irqs);
        u32 cap = CDNS_PCIE_EP_FUNC_MSI_CAP_OFFSET;
        u16 flags;
 
index 307c862588a441444f9a33d8c6cdd31dde7ff7a0..230e82674591240e90a3385466d3b763ef4d1be9 100644 (file)
@@ -536,11 +536,12 @@ static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
 }
 
 static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
-                             u8 interrupts)
+                             u8 nr_irqs)
 {
        struct dw_pcie_ep *ep = epc_get_drvdata(epc);
        struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
        struct dw_pcie_ep_func *ep_func;
+       u8 mmc = order_base_2(nr_irqs);
        u32 val, reg;
 
        ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
@@ -550,7 +551,7 @@ static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
        reg = ep_func->msi_cap + PCI_MSI_FLAGS;
        val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
        val &= ~PCI_MSI_FLAGS_QMASK;
-       val |= FIELD_PREP(PCI_MSI_FLAGS_QMASK, interrupts);
+       val |= FIELD_PREP(PCI_MSI_FLAGS_QMASK, mmc);
        dw_pcie_dbi_ro_wr_en(pci);
        dw_pcie_ep_writew_dbi(ep, func_no, reg, val);
        dw_pcie_dbi_ro_wr_dis(pci);
index 9da39a4617b6d3575fbac64397df03a802a66093..a8a966844cf38cd59c5faea5fb8fd55b2f0fff34 100644 (file)
@@ -256,15 +256,15 @@ static void rcar_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn, u8 vfn,
        clear_bit(atu_index + 1, ep->ib_window_map);
 }
 
-static int rcar_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
-                               u8 interrupts)
+static int rcar_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn, u8 nr_irqs)
 {
        struct rcar_pcie_endpoint *ep = epc_get_drvdata(epc);
        struct rcar_pcie *pcie = &ep->pcie;
+       u8 mmc = order_base_2(nr_irqs);
        u32 flags;
 
        flags = rcar_pci_read_reg(pcie, MSICAP(fn));
-       flags |= interrupts << MSICAP0_MMESCAP_OFFSET;
+       flags |= mmc << MSICAP0_MMESCAP_OFFSET;
        rcar_pci_write_reg(pcie, flags, MSICAP(fn));
 
        return 0;
index 85ca7d9b4c77c653a14e33d7be9aa3fe5ad48308..a0a85080c31d4668152bcac3b8ee43ead43eafc7 100644 (file)
@@ -308,10 +308,11 @@ static void rockchip_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,
 }
 
 static int rockchip_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
-                                   u8 multi_msg_cap)
+                                   u8 nr_irqs)
 {
        struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
        struct rockchip_pcie *rockchip = &ep->rockchip;
+       u8 mmc = order_base_2(nr_irqs);
        u32 flags;
 
        flags = rockchip_pcie_read(rockchip,
@@ -319,7 +320,7 @@ static int rockchip_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
                                   ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
        flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK;
        flags |=
-          (multi_msg_cap << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
+          (mmc << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
           (PCI_MSI_FLAGS_64BIT << ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET);
        flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP;
        rockchip_pcie_write(rockchip, flags,
index 092b14918b4606c271f225d3f1e8798c0fb9b41d..ea698551f9d87bd746157368c258bd32b9c68fc2 100644 (file)
@@ -302,28 +302,25 @@ EXPORT_SYMBOL_GPL(pci_epc_get_msi);
  * @epc: the EPC device on which MSI has to be configured
  * @func_no: the physical endpoint function number in the EPC device
  * @vfunc_no: the virtual endpoint function number in the physical function
- * @interrupts: number of MSI interrupts required by the EPF
+ * @nr_irqs: number of MSI interrupts required by the EPF
  *
  * Invoke to set the required number of MSI interrupts.
  */
-int pci_epc_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u8 interrupts)
+int pci_epc_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u8 nr_irqs)
 {
        int ret;
-       u8 encode_int;
 
        if (!pci_epc_function_is_valid(epc, func_no, vfunc_no))
                return -EINVAL;
 
-       if (interrupts < 1 || interrupts > 32)
+       if (nr_irqs < 1 || nr_irqs > 32)
                return -EINVAL;
 
        if (!epc->ops->set_msi)
                return 0;
 
-       encode_int = order_base_2(interrupts);
-
        mutex_lock(&epc->lock);
-       ret = epc->ops->set_msi(epc, func_no, vfunc_no, encode_int);
+       ret = epc->ops->set_msi(epc, func_no, vfunc_no, nr_irqs);
        mutex_unlock(&epc->lock);
 
        return ret;
index 82837008b56fa98a9aee979f9bb6437f4996ab39..15d10c07c9f13bc63a8392b3bba98eb098d70e51 100644 (file)
@@ -100,7 +100,7 @@ struct pci_epc_ops {
        void    (*unmap_addr)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
                              phys_addr_t addr);
        int     (*set_msi)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
-                          u8 interrupts);
+                          u8 nr_irqs);
        int     (*get_msi)(struct pci_epc *epc, u8 func_no, u8 vfunc_no);
        int     (*set_msix)(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
                            u16 interrupts, enum pci_barno, u32 offset);
@@ -286,8 +286,7 @@ int pci_epc_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
                     u64 pci_addr, size_t size);
 void pci_epc_unmap_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
                        phys_addr_t phys_addr);
-int pci_epc_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
-                   u8 interrupts);
+int pci_epc_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u8 nr_irqs);
 int pci_epc_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no);
 int pci_epc_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
                     u16 interrupts, enum pci_barno, u32 offset);