[PATCH v7 2/2] PCI: dwc: Validate max-link-speed property
From: Hans Zhang
Date: Sun Mar 08 2026 - 10:27:22 EST
With the removal of hardcoded upper bound in of_pci_get_max_link_speed(),
the DWC driver must now validate the retrieved speed value before using
it as an index into the pcie_link_speed array. Invalid values (missing,
out of range, or mapping to PCI_SPEED_UNKNOWN) could lead to out-of-bounds
access or incorrect link configuration.
Introduce dw_pcie_get_link_speed() to handle the property retrieval and
validation. If the property is missing or invalid, fall back to Gen1 (1)
and issue a warning. This ensures safe operation while allowing future
PCIe generations to be supported without code changes in the validation
logic.
Signed-off-by: Hans Zhang <18255117159@xxxxxxx>
---
drivers/pci/controller/dwc/pcie-designware.c | 29 +++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/controller/dwc/pcie-designware.c
index 5741c09dde7f..e10cd7a0fee1 100644
--- a/drivers/pci/controller/dwc/pcie-designware.c
+++ b/drivers/pci/controller/dwc/pcie-designware.c
@@ -110,6 +110,33 @@ static int dw_pcie_get_resets(struct dw_pcie *pci)
return 0;
}
+static void dw_pcie_get_link_speed(struct dw_pcie *pci)
+{
+ struct device_node *np = dev_of_node(pci->dev);
+ int max_speed;
+
+ max_speed = of_pci_get_max_link_speed(np);
+ if (max_speed < 0) {
+ dev_warn(pci->dev,
+ "Failed to get max-link-speed, using default (Gen1)\n");
+ pci->max_link_speed = 1;
+ return;
+ }
+
+ /* Validate against known speeds in pcie_link_speed */
+ if (max_speed == 0 ||
+ max_speed >= ARRAY_SIZE(pcie_link_speed) ||
+ pcie_link_speed[max_speed] == PCI_SPEED_UNKNOWN) {
+ dev_warn(pci->dev,
+ "Invalid max-link-speed %d, using default (Gen1)\n",
+ max_speed);
+ pci->max_link_speed = 1;
+ return;
+ }
+
+ pci->max_link_speed = max_speed;
+}
+
int dw_pcie_get_resources(struct dw_pcie *pci)
{
struct platform_device *pdev = to_platform_device(pci->dev);
@@ -189,7 +216,7 @@ int dw_pcie_get_resources(struct dw_pcie *pci)
}
if (pci->max_link_speed < 1)
- pci->max_link_speed = of_pci_get_max_link_speed(np);
+ dw_pcie_get_link_speed(pci);
of_property_read_u32(np, "num-lanes", &pci->num_lanes);
--
2.34.1