]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: dwc: Update pci->num_lanes to maximum supported link width
authorKrishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
Fri, 28 Mar 2025 10:28:31 +0000 (15:58 +0530)
committerManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Sat, 19 Apr 2025 14:12:38 +0000 (19:42 +0530)
If the num-lanes property is not present in the devicetree, update
pci->num_lanes with the hardware supported maximum link width using
the newly introduced dw_pcie_link_get_max_link_width() API.

The API is used to get the Maximum Link Width (MLW) of the controller.

Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
[mani: reworded commit message a bit]
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://patch.msgid.link/20250328-preset_v6-v9-3-22cfa0490518@oss.qualcomm.com
drivers/pci/controller/dwc/pcie-designware-host.c
drivers/pci/controller/dwc/pcie-designware.c
drivers/pci/controller/dwc/pcie-designware.h

index ecc33f6789e32cd022a5e5fb487bdec5d7759880..e8eccf6a1b2f98a6237d4fa3bb72d2683fa50ae7 100644 (file)
@@ -523,6 +523,9 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
 
        dw_pcie_iatu_detect(pci);
 
+       if (pci->num_lanes < 1)
+               pci->num_lanes = dw_pcie_link_get_max_link_width(pci);
+
        /*
         * Allocate the resource for MSG TLP before programming the iATU
         * outbound window in dw_pcie_setup_rc(). Since the allocation depends
index 97d76d3dc066efeff093de28dcac64411dad51aa..cafe91bd9c340155c49bcd81e89d0deffb86c3eb 100644 (file)
@@ -781,6 +781,14 @@ static void dw_pcie_link_set_max_speed(struct dw_pcie *pci)
 
 }
 
+int dw_pcie_link_get_max_link_width(struct dw_pcie *pci)
+{
+       u8 cap = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
+       u32 lnkcap = dw_pcie_readl_dbi(pci, cap + PCI_EXP_LNKCAP);
+
+       return FIELD_GET(PCI_EXP_LNKCAP_MLW, lnkcap);
+}
+
 static void dw_pcie_link_set_max_link_width(struct dw_pcie *pci, u32 num_lanes)
 {
        u32 lnkcap, lwsc, plc;
index 56aafdbcdacaff6b738800fb03ae60eb13c9a0f2..dda788e3bd24ddc8b7d44498ba3aace6f8f2d187 100644 (file)
@@ -540,6 +540,7 @@ void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
 int dw_pcie_link_up(struct dw_pcie *pci);
 void dw_pcie_upconfig_setup(struct dw_pcie *pci);
 int dw_pcie_wait_for_link(struct dw_pcie *pci);
+int dw_pcie_link_get_max_link_width(struct dw_pcie *pci);
 int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,
                              const struct dw_pcie_ob_atu_cfg *atu);
 int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, int index, int type,