Skip to content

Commit a9a1bcb

Browse files
shimodaykwilczynski
authored andcommitted
PCI: dwc: Add dw_pcie_link_set_max_link_width()
This is a preparation before adding the Max-Link-width capability setup which would in its turn complete the max-link-width setup procedure defined by Synopsys in the HW-manual. Seeing there is a max-link-speed setup method defined in the DW PCIe core driver it would be good to have a similar function for the link width setup. That's why we need to define a dedicated function first from already implemented but incomplete link-width setting up code. Link: https://lore.kernel.org/linux-pci/20231018085631.1121289-3-yoshihiro.shimoda.uh@renesas.com Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org> Reviewed-by: Manivannan Sadhasivam <mani@kernel.org> Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
1 parent 164f66b commit a9a1bcb

1 file changed

Lines changed: 41 additions & 45 deletions

File tree

drivers/pci/controller/dwc/pcie-designware.c

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,46 @@ static void dw_pcie_link_set_max_speed(struct dw_pcie *pci, u32 link_gen)
732732

733733
}
734734

735+
static void dw_pcie_link_set_max_link_width(struct dw_pcie *pci, u32 num_lanes)
736+
{
737+
u32 lwsc, plc;
738+
739+
if (!num_lanes)
740+
return;
741+
742+
/* Set the number of lanes */
743+
plc = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL);
744+
plc &= ~PORT_LINK_FAST_LINK_MODE;
745+
plc &= ~PORT_LINK_MODE_MASK;
746+
747+
/* Set link width speed control register */
748+
lwsc = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
749+
lwsc &= ~PORT_LOGIC_LINK_WIDTH_MASK;
750+
switch (num_lanes) {
751+
case 1:
752+
plc |= PORT_LINK_MODE_1_LANES;
753+
lwsc |= PORT_LOGIC_LINK_WIDTH_1_LANES;
754+
break;
755+
case 2:
756+
plc |= PORT_LINK_MODE_2_LANES;
757+
lwsc |= PORT_LOGIC_LINK_WIDTH_2_LANES;
758+
break;
759+
case 4:
760+
plc |= PORT_LINK_MODE_4_LANES;
761+
lwsc |= PORT_LOGIC_LINK_WIDTH_4_LANES;
762+
break;
763+
case 8:
764+
plc |= PORT_LINK_MODE_8_LANES;
765+
lwsc |= PORT_LOGIC_LINK_WIDTH_8_LANES;
766+
break;
767+
default:
768+
dev_err(pci->dev, "num-lanes %u: invalid value\n", num_lanes);
769+
return;
770+
}
771+
dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, plc);
772+
dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, lwsc);
773+
}
774+
735775
void dw_pcie_iatu_detect(struct dw_pcie *pci)
736776
{
737777
int max_region, ob, ib;
@@ -1013,49 +1053,5 @@ void dw_pcie_setup(struct dw_pcie *pci)
10131053
val |= PORT_LINK_DLL_LINK_EN;
10141054
dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val);
10151055

1016-
if (!pci->num_lanes) {
1017-
dev_dbg(pci->dev, "Using h/w default number of lanes\n");
1018-
return;
1019-
}
1020-
1021-
/* Set the number of lanes */
1022-
val &= ~PORT_LINK_FAST_LINK_MODE;
1023-
val &= ~PORT_LINK_MODE_MASK;
1024-
switch (pci->num_lanes) {
1025-
case 1:
1026-
val |= PORT_LINK_MODE_1_LANES;
1027-
break;
1028-
case 2:
1029-
val |= PORT_LINK_MODE_2_LANES;
1030-
break;
1031-
case 4:
1032-
val |= PORT_LINK_MODE_4_LANES;
1033-
break;
1034-
case 8:
1035-
val |= PORT_LINK_MODE_8_LANES;
1036-
break;
1037-
default:
1038-
dev_err(pci->dev, "num-lanes %u: invalid value\n", pci->num_lanes);
1039-
return;
1040-
}
1041-
dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val);
1042-
1043-
/* Set link width speed control register */
1044-
val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL);
1045-
val &= ~PORT_LOGIC_LINK_WIDTH_MASK;
1046-
switch (pci->num_lanes) {
1047-
case 1:
1048-
val |= PORT_LOGIC_LINK_WIDTH_1_LANES;
1049-
break;
1050-
case 2:
1051-
val |= PORT_LOGIC_LINK_WIDTH_2_LANES;
1052-
break;
1053-
case 4:
1054-
val |= PORT_LOGIC_LINK_WIDTH_4_LANES;
1055-
break;
1056-
case 8:
1057-
val |= PORT_LOGIC_LINK_WIDTH_8_LANES;
1058-
break;
1059-
}
1060-
dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val);
1056+
dw_pcie_link_set_max_link_width(pci, pci->num_lanes);
10611057
}

0 commit comments

Comments
 (0)