Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-lan969x-add-rgmii-support'

Daniel Machon says:

====================
net: lan969x: add RGMII support

== Description:

This series is the fourth of a multi-part series, that prepares and adds
support for the new lan969x switch driver.

The upstreaming efforts is split into multiple series (might change a
bit as we go along):

1) Prepare the Sparx5 driver for lan969x (merged)

2) Add support for lan969x (same basic features as Sparx5
provides excl. FDMA and VCAP, merged).

3) Add lan969x VCAP functionality (merged).

--> 4) Add RGMII support.

5) Add FDMA support.

== RGMII support:

The lan969x switch device includes two RGMII port interfaces (port 28
and 29) supporting data speeds of 1 Gbps, 100 Mbps and 10 Mbps.

== Patch breakdown:

Patch #1 does some preparation work.

Patch #2 adds new function: is_port_rgmii() to the match data ops.

Patch #3 uses the is_port_rgmii() in a number of places.

Patch #4 makes sure that we do not configure an RGMII device as a
low-speed device, when doing a port config.

Patch #5 makes sure we only return the PCS if the port mode requires
it.

Patch #6 adds checks for RGMII PHY modes in sparx5_verify_speeds().

Patch #7 adds registers required to configure RGMII.

Patch #8 adds RGMII implementation.

Patch #9 documents RGMII delays in the dt-bindings.

Details are in the commit description of the individual patches

v4: https://lore.kernel.org/20241213-sparx5-lan969x-switch-driver-4-v4-0-d1a72c9c4714@microchip.com
v3: https://lore.kernel.org/20241118-sparx5-lan969x-switch-driver-4-v3-0-3cefee5e7e3a@microchip.com
v2: https://lore.kernel.org/20241113-sparx5-lan969x-switch-driver-4-v2-0-0db98ac096d1@microchip.com
v1: https://lore.kernel.org/20241106-sparx5-lan969x-switch-driver-4-v1-0-f7f7316436bd@microchip.com
====================

Link: https://patch.msgid.link/20241220-sparx5-lan969x-switch-driver-4-v5-0-fa8ba5dff732@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+484 -29
+18
Documentation/devicetree/bindings/net/microchip,sparx5-switch.yaml
··· 129 129 minimum: 0 130 130 maximum: 383 131 131 132 + rx-internal-delay-ps: 133 + description: 134 + RGMII Receive Clock Delay defined in pico seconds, used to select 135 + the DLL phase shift between 1000 ps (45 degree shift at 1Gbps) and 136 + 3300 ps (147 degree shift at 1Gbps). A value of 0 ps will disable 137 + any delay. The Default is no delay. 138 + enum: [0, 1000, 1700, 2000, 2500, 3000, 3300] 139 + default: 0 140 + 141 + tx-internal-delay-ps: 142 + description: 143 + RGMII Transmit Clock Delay defined in pico seconds, used to select 144 + the DLL phase shift between 1000 ps (45 degree shift at 1Gbps) and 145 + 3300 ps (147 degree shift at 1Gbps). A value of 0 ps will disable 146 + any delay. The Default is no delay. 147 + enum: [0, 1000, 1700, 2000, 2500, 3000, 3300] 148 + default: 0 149 + 132 150 required: 133 151 - reg 134 152 - phys
+2 -1
drivers/net/ethernet/microchip/sparx5/Makefile
··· 20 20 lan969x/lan969x.o \ 21 21 lan969x/lan969x_calendar.o \ 22 22 lan969x/lan969x_vcap_ag_api.o \ 23 - lan969x/lan969x_vcap_impl.o 23 + lan969x/lan969x_vcap_impl.o \ 24 + lan969x/lan969x_rgmii.o 24 25 25 26 # Provide include files 26 27 ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/vcap
+5
drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.c
··· 90 90 { TARGET_DEV2G5 + 27, 0x30d8000, 1 }, /* 0xe30d8000 */ 91 91 { TARGET_DEV10G + 9, 0x30dc000, 1 }, /* 0xe30dc000 */ 92 92 { TARGET_PCS10G_BR + 9, 0x30e0000, 1 }, /* 0xe30e0000 */ 93 + { TARGET_DEVRGMII, 0x30e4000, 1 }, /* 0xe30e4000 */ 94 + { TARGET_DEVRGMII + 1, 0x30e8000, 1 }, /* 0xe30e8000 */ 93 95 { TARGET_DSM, 0x30ec000, 1 }, /* 0xe30ec000 */ 94 96 { TARGET_PORT_CONF, 0x30f0000, 1 }, /* 0xe30f0000 */ 95 97 { TARGET_ASM, 0x3200000, 1 }, /* 0xe3200000 */ 98 + { TARGET_HSIO_WRAP, 0x3408000, 1 }, /* 0xe3408000 */ 96 99 }; 97 100 98 101 static struct sparx5_sdlb_group lan969x_sdlb_groups[LAN969X_SDLB_GRP_CNT] = { ··· 332 329 .is_port_5g = &lan969x_port_is_5g, 333 330 .is_port_10g = &lan969x_port_is_10g, 334 331 .is_port_25g = &lan969x_port_is_25g, 332 + .is_port_rgmii = &lan969x_port_is_rgmii, 335 333 .get_port_dev_index = &lan969x_port_dev_mapping, 336 334 .get_port_dev_bit = &lan969x_get_dev_mode_bit, 337 335 .get_hsch_max_group_rate = &lan969x_get_hsch_max_group_rate, ··· 340 336 .set_port_mux = &lan969x_port_mux_set, 341 337 .ptp_irq_handler = &lan969x_ptp_irq_handler, 342 338 .dsm_calendar_calc = &lan969x_dsm_calendar_calc, 339 + .port_config_rgmii = &lan969x_port_config_rgmii, 343 340 }; 344 341 345 342 const struct sparx5_match_data lan969x_desc = {
+10
drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.h
··· 59 59 return false; 60 60 } 61 61 62 + static inline bool lan969x_port_is_rgmii(int portno) 63 + { 64 + return portno == 28 || portno == 29; 65 + } 66 + 62 67 /* lan969x_calendar.c */ 63 68 int lan969x_dsm_calendar_calc(struct sparx5 *sparx5, u32 taxi, 64 69 struct sparx5_calendar_data *data); 70 + 71 + /* lan969x_rgmii.c */ 72 + int lan969x_port_config_rgmii(struct sparx5_port *port, 73 + struct sparx5_port_config *conf); 74 + 65 75 #endif
+224
drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_rgmii.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* Microchip lan969x Switch driver 3 + * 4 + * Copyright (c) 2024 Microchip Technology Inc. and its subsidiaries. 5 + */ 6 + 7 + #include "lan969x.h" 8 + 9 + /* Tx clock selectors */ 10 + #define LAN969X_RGMII_TX_CLK_SEL_125MHZ 1 /* 1000Mbps */ 11 + #define LAN969X_RGMII_TX_CLK_SEL_25MHZ 2 /* 100Mbps */ 12 + #define LAN969X_RGMII_TX_CLK_SEL_2M5MHZ 3 /* 10Mbps */ 13 + 14 + /* Port speed selectors */ 15 + #define LAN969X_RGMII_SPEED_SEL_10 0 /* Select 10Mbps speed */ 16 + #define LAN969X_RGMII_SPEED_SEL_100 1 /* Select 100Mbps speed */ 17 + #define LAN969X_RGMII_SPEED_SEL_1000 2 /* Select 1000Mbps speed */ 18 + 19 + /* Clock delay selectors */ 20 + #define LAN969X_RGMII_CLK_DELAY_SEL_1_0_NS 2 /* Phase shift 45deg */ 21 + #define LAN969X_RGMII_CLK_DELAY_SEL_1_7_NS 3 /* Phase shift 77deg */ 22 + #define LAN969X_RGMII_CLK_DELAY_SEL_2_0_NS 4 /* Phase shift 90deg */ 23 + #define LAN969X_RGMII_CLK_DELAY_SEL_2_5_NS 5 /* Phase shift 112deg */ 24 + #define LAN969X_RGMII_CLK_DELAY_SEL_3_0_NS 6 /* Phase shift 135deg */ 25 + #define LAN969X_RGMII_CLK_DELAY_SEL_3_3_NS 7 /* Phase shift 147deg */ 26 + 27 + #define LAN969X_RGMII_PORT_START_IDX 28 /* Index of the first RGMII port */ 28 + #define LAN969X_RGMII_IFG_TX 4 /* TX Inter Frame Gap value */ 29 + #define LAN969X_RGMII_IFG_RX1 5 /* RX1 Inter Frame Gap value */ 30 + #define LAN969X_RGMII_IFG_RX2 1 /* RX2 Inter Frame Gap value */ 31 + 32 + #define RGMII_PORT_IDX(port) ((port)->portno - LAN969X_RGMII_PORT_START_IDX) 33 + 34 + /* Get the tx clock selector based on the port speed. */ 35 + static int lan969x_rgmii_get_clk_sel(int speed) 36 + { 37 + return (speed == SPEED_10 ? LAN969X_RGMII_TX_CLK_SEL_2M5MHZ : 38 + speed == SPEED_100 ? LAN969X_RGMII_TX_CLK_SEL_25MHZ : 39 + LAN969X_RGMII_TX_CLK_SEL_125MHZ); 40 + } 41 + 42 + /* Get the port speed selector based on the port speed. */ 43 + static int lan969x_rgmii_get_speed_sel(int speed) 44 + { 45 + return (speed == SPEED_10 ? LAN969X_RGMII_SPEED_SEL_10 : 46 + speed == SPEED_100 ? LAN969X_RGMII_SPEED_SEL_100 : 47 + LAN969X_RGMII_SPEED_SEL_1000); 48 + } 49 + 50 + /* Get the clock delay selector based on the clock delay in picoseconds. */ 51 + static int lan969x_rgmii_get_clk_delay_sel(struct sparx5_port *port, 52 + u32 delay_ps, u32 *clk_delay_sel) 53 + { 54 + switch (delay_ps) { 55 + case 0: 56 + /* Hardware default selector. */ 57 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_2_5_NS; 58 + break; 59 + case 1000: 60 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_1_0_NS; 61 + break; 62 + case 1700: 63 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_1_7_NS; 64 + break; 65 + case 2000: 66 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_2_0_NS; 67 + break; 68 + case 2500: 69 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_2_5_NS; 70 + break; 71 + case 3000: 72 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_3_0_NS; 73 + break; 74 + case 3300: 75 + *clk_delay_sel = LAN969X_RGMII_CLK_DELAY_SEL_3_3_NS; 76 + break; 77 + default: 78 + dev_err(port->sparx5->dev, "Invalid RGMII delay: %u", delay_ps); 79 + return -EINVAL; 80 + } 81 + 82 + return 0; 83 + } 84 + 85 + /* Configure the RGMII tx clock frequency. */ 86 + static void lan969x_rgmii_tx_clk_config(struct sparx5_port *port, 87 + struct sparx5_port_config *conf) 88 + { 89 + u32 clk_sel = lan969x_rgmii_get_clk_sel(conf->speed); 90 + u32 idx = RGMII_PORT_IDX(port); 91 + 92 + /* Take the RGMII clock domain out of reset and set tx clock 93 + * frequency. 94 + */ 95 + spx5_rmw(HSIO_WRAP_RGMII_CFG_TX_CLK_CFG_SET(clk_sel) | 96 + HSIO_WRAP_RGMII_CFG_RGMII_TX_RST_SET(0) | 97 + HSIO_WRAP_RGMII_CFG_RGMII_RX_RST_SET(0), 98 + HSIO_WRAP_RGMII_CFG_TX_CLK_CFG | 99 + HSIO_WRAP_RGMII_CFG_RGMII_TX_RST | 100 + HSIO_WRAP_RGMII_CFG_RGMII_RX_RST, 101 + port->sparx5, HSIO_WRAP_RGMII_CFG(idx)); 102 + } 103 + 104 + /* Configure the RGMII port device. */ 105 + static void lan969x_rgmii_port_device_config(struct sparx5_port *port, 106 + struct sparx5_port_config *conf) 107 + { 108 + u32 dtag, dotag, etype, speed_sel, idx = RGMII_PORT_IDX(port); 109 + 110 + speed_sel = lan969x_rgmii_get_speed_sel(conf->speed); 111 + 112 + etype = (port->vlan_type == SPX5_VLAN_PORT_TYPE_S_CUSTOM ? 113 + port->custom_etype : 114 + port->vlan_type == SPX5_VLAN_PORT_TYPE_C ? 115 + ETH_P_8021Q : ETH_P_8021AD); 116 + 117 + dtag = port->max_vlan_tags == SPX5_PORT_MAX_TAGS_TWO; 118 + dotag = port->max_vlan_tags != SPX5_PORT_MAX_TAGS_NONE; 119 + 120 + /* Enable the MAC. */ 121 + spx5_wr(DEVRGMII_MAC_ENA_CFG_RX_ENA_SET(1) | 122 + DEVRGMII_MAC_ENA_CFG_TX_ENA_SET(1), 123 + port->sparx5, DEVRGMII_MAC_ENA_CFG(idx)); 124 + 125 + /* Configure the Inter Frame Gap. */ 126 + spx5_wr(DEVRGMII_MAC_IFG_CFG_TX_IFG_SET(LAN969X_RGMII_IFG_TX) | 127 + DEVRGMII_MAC_IFG_CFG_RX_IFG1_SET(LAN969X_RGMII_IFG_RX1) | 128 + DEVRGMII_MAC_IFG_CFG_RX_IFG2_SET(LAN969X_RGMII_IFG_RX2), 129 + port->sparx5, DEVRGMII_MAC_IFG_CFG(idx)); 130 + 131 + /* Configure port data rate. */ 132 + spx5_wr(DEVRGMII_DEV_RST_CTRL_SPEED_SEL_SET(speed_sel), 133 + port->sparx5, DEVRGMII_DEV_RST_CTRL(idx)); 134 + 135 + /* Configure VLAN awareness. */ 136 + spx5_wr(DEVRGMII_MAC_TAGS_CFG_TAG_ID_SET(etype) | 137 + DEVRGMII_MAC_TAGS_CFG_PB_ENA_SET(dtag) | 138 + DEVRGMII_MAC_TAGS_CFG_VLAN_AWR_ENA_SET(dotag) | 139 + DEVRGMII_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA_SET(dotag), 140 + port->sparx5, 141 + DEVRGMII_MAC_TAGS_CFG(idx)); 142 + } 143 + 144 + /* Configure the RGMII delay lines in the MAC. 145 + * 146 + * We use the rx-internal-delay-ps" and "tx-internal-delay-ps" properties to 147 + * configure the rx and tx delays for the MAC. If these properties are missing 148 + * or set to zero, the MAC will not apply any delay. 149 + * 150 + * The PHY side delays are determined by the PHY mode 151 + * (e.g. PHY_INTERFACE_MODE_RGMII_{ID, RXID, TXID}), and ignored by the MAC side 152 + * entirely. 153 + */ 154 + static int lan969x_rgmii_delay_config(struct sparx5_port *port, 155 + struct sparx5_port_config *conf) 156 + { 157 + u32 tx_clk_sel, rx_clk_sel, tx_delay_ps = 0, rx_delay_ps = 0; 158 + u32 idx = RGMII_PORT_IDX(port); 159 + int err; 160 + 161 + of_property_read_u32(port->of_node, "rx-internal-delay-ps", 162 + &rx_delay_ps); 163 + 164 + of_property_read_u32(port->of_node, "tx-internal-delay-ps", 165 + &tx_delay_ps); 166 + 167 + err = lan969x_rgmii_get_clk_delay_sel(port, rx_delay_ps, &rx_clk_sel); 168 + if (err) 169 + return err; 170 + 171 + err = lan969x_rgmii_get_clk_delay_sel(port, tx_delay_ps, &tx_clk_sel); 172 + if (err) 173 + return err; 174 + 175 + /* Configure rx delay. */ 176 + spx5_rmw(HSIO_WRAP_DLL_CFG_DLL_RST_SET(0) | 177 + HSIO_WRAP_DLL_CFG_DLL_ENA_SET(1) | 178 + HSIO_WRAP_DLL_CFG_DLL_CLK_ENA_SET(!!rx_delay_ps) | 179 + HSIO_WRAP_DLL_CFG_DLL_CLK_SEL_SET(rx_clk_sel), 180 + HSIO_WRAP_DLL_CFG_DLL_RST | 181 + HSIO_WRAP_DLL_CFG_DLL_ENA | 182 + HSIO_WRAP_DLL_CFG_DLL_CLK_ENA | 183 + HSIO_WRAP_DLL_CFG_DLL_CLK_SEL, 184 + port->sparx5, HSIO_WRAP_DLL_CFG(idx, 0)); 185 + 186 + /* Configure tx delay. */ 187 + spx5_rmw(HSIO_WRAP_DLL_CFG_DLL_RST_SET(0) | 188 + HSIO_WRAP_DLL_CFG_DLL_ENA_SET(1) | 189 + HSIO_WRAP_DLL_CFG_DLL_CLK_ENA_SET(!!tx_delay_ps) | 190 + HSIO_WRAP_DLL_CFG_DLL_CLK_SEL_SET(tx_clk_sel), 191 + HSIO_WRAP_DLL_CFG_DLL_RST | 192 + HSIO_WRAP_DLL_CFG_DLL_ENA | 193 + HSIO_WRAP_DLL_CFG_DLL_CLK_ENA | 194 + HSIO_WRAP_DLL_CFG_DLL_CLK_SEL, 195 + port->sparx5, HSIO_WRAP_DLL_CFG(idx, 1)); 196 + 197 + return 0; 198 + } 199 + 200 + /* Configure GPIO's to be used as RGMII interface. */ 201 + static void lan969x_rgmii_gpio_config(struct sparx5_port *port) 202 + { 203 + u32 idx = RGMII_PORT_IDX(port); 204 + 205 + /* Enable the RGMII on the GPIOs. */ 206 + spx5_wr(HSIO_WRAP_XMII_CFG_GPIO_XMII_CFG_SET(1), port->sparx5, 207 + HSIO_WRAP_XMII_CFG(!idx)); 208 + } 209 + 210 + int lan969x_port_config_rgmii(struct sparx5_port *port, 211 + struct sparx5_port_config *conf) 212 + { 213 + int err; 214 + 215 + err = lan969x_rgmii_delay_config(port, conf); 216 + if (err) 217 + return err; 218 + 219 + lan969x_rgmii_tx_clk_config(port, conf); 220 + lan969x_rgmii_gpio_config(port); 221 + lan969x_rgmii_port_device_config(port, conf); 222 + 223 + return 0; 224 + }
+21 -8
drivers/net/ethernet/microchip/sparx5/sparx5_main.c
··· 313 313 struct initial_port_config *config) 314 314 { 315 315 struct sparx5_port *spx5_port; 316 + const struct sparx5_ops *ops; 316 317 struct net_device *ndev; 317 318 struct phylink *phylink; 318 319 int err; 320 + 321 + ops = sparx5->data->ops; 319 322 320 323 ndev = sparx5_create_netdev(sparx5, config->portno); 321 324 if (IS_ERR(ndev)) { ··· 359 356 spx5_port->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | 360 357 MAC_SYM_PAUSE | MAC_10 | MAC_100 | MAC_1000FD | 361 358 MAC_2500FD | MAC_5000FD | MAC_10000FD | MAC_25000FD; 359 + 360 + if (ops->is_port_rgmii(spx5_port->portno)) 361 + phy_interface_set_rgmii(spx5_port->phylink_config.supported_interfaces); 362 362 363 363 __set_bit(PHY_INTERFACE_MODE_SGMII, 364 364 spx5_port->phylink_config.supported_interfaces); ··· 836 830 struct initial_port_config *configs, *config; 837 831 struct device_node *np = pdev->dev.of_node; 838 832 struct device_node *ports, *portnp; 833 + const struct sparx5_ops *ops; 839 834 struct reset_control *reset; 840 835 struct sparx5 *sparx5; 841 836 int idx = 0, err = 0; ··· 858 851 return -EINVAL; 859 852 860 853 regs = sparx5->data->regs; 854 + ops = sparx5->data->ops; 861 855 862 856 /* Do switch core reset if available */ 863 857 reset = devm_reset_control_get_optional_shared(&pdev->dev, "switch"); ··· 888 880 889 881 for_each_available_child_of_node(ports, portnp) { 890 882 struct sparx5_port_config *conf; 891 - struct phy *serdes; 883 + struct phy *serdes = NULL; 892 884 u32 portno; 893 885 894 886 err = of_property_read_u32(portnp, "reg", &portno); ··· 918 910 conf->sd_sgpio = ~0; 919 911 else 920 912 sparx5->sd_sgpio_remapping = true; 921 - serdes = devm_of_phy_get(sparx5->dev, portnp, NULL); 922 - if (IS_ERR(serdes)) { 923 - err = dev_err_probe(sparx5->dev, PTR_ERR(serdes), 924 - "port %u: missing serdes\n", 925 - portno); 926 - of_node_put(portnp); 927 - goto cleanup_config; 913 + /* There is no SerDes node for RGMII ports. */ 914 + if (!ops->is_port_rgmii(portno)) { 915 + serdes = devm_of_phy_get(sparx5->dev, portnp, NULL); 916 + if (IS_ERR(serdes)) { 917 + err = dev_err_probe(sparx5->dev, 918 + PTR_ERR(serdes), 919 + "port %u: missing serdes\n", 920 + portno); 921 + of_node_put(portnp); 922 + goto cleanup_config; 923 + } 928 924 } 929 925 config->portno = portno; 930 926 config->node = portnp; ··· 1084 1072 .is_port_5g = &sparx5_port_is_5g, 1085 1073 .is_port_10g = &sparx5_port_is_10g, 1086 1074 .is_port_25g = &sparx5_port_is_25g, 1075 + .is_port_rgmii = &sparx5_port_is_rgmii, 1087 1076 .get_port_dev_index = &sparx5_port_dev_mapping, 1088 1077 .get_port_dev_bit = &sparx5_port_dev_mapping, 1089 1078 .get_hsch_max_group_rate = &sparx5_get_hsch_max_group_rate,
+3
drivers/net/ethernet/microchip/sparx5/sparx5_main.h
··· 313 313 bool (*is_port_5g)(int portno); 314 314 bool (*is_port_10g)(int portno); 315 315 bool (*is_port_25g)(int portno); 316 + bool (*is_port_rgmii)(int portno); 316 317 u32 (*get_port_dev_index)(struct sparx5 *sparx5, int port); 317 318 u32 (*get_port_dev_bit)(struct sparx5 *sparx5, int port); 318 319 u32 (*get_hsch_max_group_rate)(int grp); ··· 324 323 irqreturn_t (*ptp_irq_handler)(int irq, void *args); 325 324 int (*dsm_calendar_calc)(struct sparx5 *sparx5, u32 taxi, 326 325 struct sparx5_calendar_data *data); 326 + int (*port_config_rgmii)(struct sparx5_port *port, 327 + struct sparx5_port_config *conf); 327 328 }; 328 329 329 330 struct sparx5_main_io_resource {
+145
drivers/net/ethernet/microchip/sparx5/sparx5_main_regs.h
··· 37 37 TARGET_FDMA = 117, 38 38 TARGET_GCB = 118, 39 39 TARGET_HSCH = 119, 40 + TARGET_HSIO_WRAP = 120, 40 41 TARGET_LRN = 122, 41 42 TARGET_PCEP = 129, 42 43 TARGET_PCS10G_BR = 132, ··· 55 54 TARGET_VCAP_SUPER = 326, 56 55 TARGET_VOP = 327, 57 56 TARGET_XQS = 331, 57 + TARGET_DEVRGMII = 392, 58 58 NUM_TARGETS = 517 59 59 }; 60 60 ··· 5369 5367 #define HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY_GET(x)\ 5370 5368 FIELD_GET(HSCH_TAS_STATEMACHINE_CFG_REVISIT_DLY, x) 5371 5369 5370 + /* LAN969X ONLY */ 5371 + /* HSIOWRAP:XMII_CFG:XMII_CFG */ 5372 + #define HSIO_WRAP_XMII_CFG(g) \ 5373 + __REG(TARGET_HSIO_WRAP, 0, 1, 116, g, 2, 20, 0, 0, 1, 4) 5374 + 5375 + #define HSIO_WRAP_XMII_CFG_GPIO_XMII_CFG GENMASK(2, 1) 5376 + #define HSIO_WRAP_XMII_CFG_GPIO_XMII_CFG_SET(x)\ 5377 + FIELD_PREP(HSIO_WRAP_XMII_CFG_GPIO_XMII_CFG, x) 5378 + #define HSIO_WRAP_XMII_CFG_GPIO_XMII_CFG_GET(x)\ 5379 + FIELD_GET(HSIO_WRAP_XMII_CFG_GPIO_XMII_CFG, x) 5380 + 5381 + /* LAN969X ONLY */ 5382 + /* HSIOWRAP:XMII_CFG:RGMII_CFG */ 5383 + #define HSIO_WRAP_RGMII_CFG(g) \ 5384 + __REG(TARGET_HSIO_WRAP, 0, 1, 116, g, 2, 20, 4, 0, 1, 4) 5385 + 5386 + #define HSIO_WRAP_RGMII_CFG_TX_CLK_CFG GENMASK(4, 2) 5387 + #define HSIO_WRAP_RGMII_CFG_TX_CLK_CFG_SET(x)\ 5388 + FIELD_PREP(HSIO_WRAP_RGMII_CFG_TX_CLK_CFG, x) 5389 + #define HSIO_WRAP_RGMII_CFG_TX_CLK_CFG_GET(x)\ 5390 + FIELD_GET(HSIO_WRAP_RGMII_CFG_TX_CLK_CFG, x) 5391 + 5392 + #define HSIO_WRAP_RGMII_CFG_RGMII_TX_RST BIT(1) 5393 + #define HSIO_WRAP_RGMII_CFG_RGMII_TX_RST_SET(x)\ 5394 + FIELD_PREP(HSIO_WRAP_RGMII_CFG_RGMII_TX_RST, x) 5395 + #define HSIO_WRAP_RGMII_CFG_RGMII_TX_RST_GET(x)\ 5396 + FIELD_GET(HSIO_WRAP_RGMII_CFG_RGMII_TX_RST, x) 5397 + 5398 + #define HSIO_WRAP_RGMII_CFG_RGMII_RX_RST BIT(0) 5399 + #define HSIO_WRAP_RGMII_CFG_RGMII_RX_RST_SET(x)\ 5400 + FIELD_PREP(HSIO_WRAP_RGMII_CFG_RGMII_RX_RST, x) 5401 + #define HSIO_WRAP_RGMII_CFG_RGMII_RX_RST_GET(x)\ 5402 + FIELD_GET(HSIO_WRAP_RGMII_CFG_RGMII_RX_RST, x) 5403 + 5404 + /* LAN969X ONLY */ 5405 + /* HSIOWRAP:XMII_CFG:DLL_CFG */ 5406 + #define HSIO_WRAP_DLL_CFG(g, r) \ 5407 + __REG(TARGET_HSIO_WRAP, 0, 1, 116, g, 2, 20, 12, r, 2, 4) 5408 + 5409 + #define HSIO_WRAP_DLL_CFG_DLL_ENA BIT(19) 5410 + #define HSIO_WRAP_DLL_CFG_DLL_ENA_SET(x)\ 5411 + FIELD_PREP(HSIO_WRAP_DLL_CFG_DLL_ENA, x) 5412 + #define HSIO_WRAP_DLL_CFG_DLL_ENA_GET(x)\ 5413 + FIELD_GET(HSIO_WRAP_DLL_CFG_DLL_ENA, x) 5414 + 5415 + #define HSIO_WRAP_DLL_CFG_DLL_CLK_ENA BIT(18) 5416 + #define HSIO_WRAP_DLL_CFG_DLL_CLK_ENA_SET(x)\ 5417 + FIELD_PREP(HSIO_WRAP_DLL_CFG_DLL_CLK_ENA, x) 5418 + #define HSIO_WRAP_DLL_CFG_DLL_CLK_ENA_GET(x)\ 5419 + FIELD_GET(HSIO_WRAP_DLL_CFG_DLL_CLK_ENA, x) 5420 + 5421 + #define HSIO_WRAP_DLL_CFG_DLL_CLK_SEL GENMASK(17, 15) 5422 + #define HSIO_WRAP_DLL_CFG_DLL_CLK_SEL_SET(x)\ 5423 + FIELD_PREP(HSIO_WRAP_DLL_CFG_DLL_CLK_SEL, x) 5424 + #define HSIO_WRAP_DLL_CFG_DLL_CLK_SEL_GET(x)\ 5425 + FIELD_GET(HSIO_WRAP_DLL_CFG_DLL_CLK_SEL, x) 5426 + 5427 + #define HSIO_WRAP_DLL_CFG_DLL_RST BIT(0) 5428 + #define HSIO_WRAP_DLL_CFG_DLL_RST_SET(x)\ 5429 + FIELD_PREP(HSIO_WRAP_DLL_CFG_DLL_RST, x) 5430 + #define HSIO_WRAP_DLL_CFG_DLL_RST_GET(x)\ 5431 + FIELD_GET(HSIO_WRAP_DLL_CFG_DLL_RST, x) 5432 + 5372 5433 /* LRN:COMMON:COMMON_ACCESS_CTRL */ 5373 5434 #define LRN_COMMON_ACCESS_CTRL \ 5374 5435 __REG(TARGET_LRN, 0, 1, 0, 0, 1, 72, 0, 0, 1, 4) ··· 8174 8109 /* XQS:STAT:CNT */ 8175 8110 #define XQS_CNT(g) \ 8176 8111 __REG(TARGET_XQS, 0, 1, 0, g, 1024, 4, 0, 0, 1, 4) 8112 + 8113 + /* LAN969X ONLY */ 8114 + /* DEV1G:DEV_CFG_STATUS:DEV_RST_CTRL */ 8115 + #define DEVRGMII_DEV_RST_CTRL(t) \ 8116 + __REG(TARGET_DEVRGMII, t, 2, 0, 0, 1, 36, 0, 0, 1, 4) 8117 + 8118 + #define DEVRGMII_DEV_RST_CTRL_SPEED_SEL GENMASK(22, 20) 8119 + #define DEVRGMII_DEV_RST_CTRL_SPEED_SEL_SET(x)\ 8120 + FIELD_PREP(DEVRGMII_DEV_RST_CTRL_SPEED_SEL, x) 8121 + #define DEVRGMII_DEV_RST_CTRL_SPEED_SEL_GET(x)\ 8122 + FIELD_GET(DEVRGMII_DEV_RST_CTRL_SPEED_SEL, x) 8123 + 8124 + /* LAN969X ONLY */ 8125 + /* DEV1G:MAC_CFG_STATUS:MAC_ENA_CFG */ 8126 + #define DEVRGMII_MAC_ENA_CFG(t) \ 8127 + __REG(TARGET_DEVRGMII, t, 2, 36, 0, 1, 36, 0, 0, 1, 4) 8128 + 8129 + #define DEVRGMII_MAC_ENA_CFG_RX_ENA BIT(4) 8130 + #define DEVRGMII_MAC_ENA_CFG_RX_ENA_SET(x)\ 8131 + FIELD_PREP(DEVRGMII_MAC_ENA_CFG_RX_ENA, x) 8132 + #define DEVRGMII_MAC_ENA_CFG_RX_ENA_GET(x)\ 8133 + FIELD_GET(DEVRGMII_MAC_ENA_CFG_RX_ENA, x) 8134 + 8135 + #define DEVRGMII_MAC_ENA_CFG_TX_ENA BIT(0) 8136 + #define DEVRGMII_MAC_ENA_CFG_TX_ENA_SET(x)\ 8137 + FIELD_PREP(DEVRGMII_MAC_ENA_CFG_TX_ENA, x) 8138 + #define DEVRGMII_MAC_ENA_CFG_TX_ENA_GET(x)\ 8139 + FIELD_GET(DEVRGMII_MAC_ENA_CFG_TX_ENA, x) 8140 + 8141 + /* LAN969X ONLY */ 8142 + /* DEV1G:MAC_CFG_STATUS:MAC_TAGS_CFG */ 8143 + #define DEVRGMII_MAC_TAGS_CFG(t) \ 8144 + __REG(TARGET_DEVRGMII, t, 2, 36, 0, 1, 36, 12, 0, 1, 4) 8145 + 8146 + #define DEVRGMII_MAC_TAGS_CFG_TAG_ID GENMASK(31, 16) 8147 + #define DEVRGMII_MAC_TAGS_CFG_TAG_ID_SET(x)\ 8148 + FIELD_PREP(DEVRGMII_MAC_TAGS_CFG_TAG_ID, x) 8149 + #define DEVRGMII_MAC_TAGS_CFG_TAG_ID_GET(x)\ 8150 + FIELD_GET(DEVRGMII_MAC_TAGS_CFG_TAG_ID, x) 8151 + 8152 + #define DEVRGMII_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA BIT(3) 8153 + #define DEVRGMII_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA_SET(x)\ 8154 + FIELD_PREP(DEVRGMII_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, x) 8155 + #define DEVRGMII_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA_GET(x)\ 8156 + FIELD_GET(DEVRGMII_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, x) 8157 + 8158 + #define DEVRGMII_MAC_TAGS_CFG_PB_ENA GENMASK(2, 1) 8159 + #define DEVRGMII_MAC_TAGS_CFG_PB_ENA_SET(x)\ 8160 + FIELD_PREP(DEVRGMII_MAC_TAGS_CFG_PB_ENA, x) 8161 + #define DEVRGMII_MAC_TAGS_CFG_PB_ENA_GET(x)\ 8162 + FIELD_GET(DEVRGMII_MAC_TAGS_CFG_PB_ENA, x) 8163 + 8164 + #define DEVRGMII_MAC_TAGS_CFG_VLAN_AWR_ENA BIT(0) 8165 + #define DEVRGMII_MAC_TAGS_CFG_VLAN_AWR_ENA_SET(x)\ 8166 + FIELD_PREP(DEVRGMII_MAC_TAGS_CFG_VLAN_AWR_ENA, x) 8167 + #define DEVRGMII_MAC_TAGS_CFG_VLAN_AWR_ENA_GET(x)\ 8168 + FIELD_GET(DEVRGMII_MAC_TAGS_CFG_VLAN_AWR_ENA, x) 8169 + 8170 + /* LAN969X ONLY */ 8171 + /* DEV1G:MAC_CFG_STATUS:MAC_IFG_CFG */ 8172 + #define DEVRGMII_MAC_IFG_CFG(t) \ 8173 + __REG(TARGET_DEVRGMII, t, 2, 36, 0, 1, 36, 24, 0, 1, 4) 8174 + 8175 + #define DEVRGMII_MAC_IFG_CFG_TX_IFG GENMASK(12, 8) 8176 + #define DEVRGMII_MAC_IFG_CFG_TX_IFG_SET(x)\ 8177 + FIELD_PREP(DEVRGMII_MAC_IFG_CFG_TX_IFG, x) 8178 + #define DEVRGMII_MAC_IFG_CFG_TX_IFG_GET(x)\ 8179 + FIELD_GET(DEVRGMII_MAC_IFG_CFG_TX_IFG, x) 8180 + 8181 + #define DEVRGMII_MAC_IFG_CFG_RX_IFG2 GENMASK(7, 4) 8182 + #define DEVRGMII_MAC_IFG_CFG_RX_IFG2_SET(x)\ 8183 + FIELD_PREP(DEVRGMII_MAC_IFG_CFG_RX_IFG2, x) 8184 + #define DEVRGMII_MAC_IFG_CFG_RX_IFG2_GET(x)\ 8185 + FIELD_GET(DEVRGMII_MAC_IFG_CFG_RX_IFG2, x) 8186 + 8187 + #define DEVRGMII_MAC_IFG_CFG_RX_IFG1 GENMASK(3, 0) 8188 + #define DEVRGMII_MAC_IFG_CFG_RX_IFG1_SET(x)\ 8189 + FIELD_PREP(DEVRGMII_MAC_IFG_CFG_RX_IFG1, x) 8190 + #define DEVRGMII_MAC_IFG_CFG_RX_IFG1_GET(x)\ 8191 + FIELD_GET(DEVRGMII_MAC_IFG_CFG_RX_IFG1, x) 8177 8192 8178 8193 #endif /* _SPARX5_MAIN_REGS_H_ */
+13 -1
drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c
··· 32 32 { 33 33 struct sparx5_port *port = netdev_priv(to_net_dev(config->dev)); 34 34 35 - return &port->phylink_pcs; 35 + /* Return the PCS for all the modes that require it. */ 36 + switch (interface) { 37 + case PHY_INTERFACE_MODE_SGMII: 38 + case PHY_INTERFACE_MODE_QSGMII: 39 + case PHY_INTERFACE_MODE_1000BASEX: 40 + case PHY_INTERFACE_MODE_2500BASEX: 41 + case PHY_INTERFACE_MODE_5GBASER: 42 + case PHY_INTERFACE_MODE_10GBASER: 43 + case PHY_INTERFACE_MODE_25GBASER: 44 + return &port->phylink_pcs; 45 + default: 46 + return NULL; 47 + } 36 48 } 37 49 38 50 static void sparx5_phylink_mac_config(struct phylink_config *config,
+38 -19
drivers/net/ethernet/microchip/sparx5/sparx5_port.c
··· 257 257 conf->speed != SPEED_25000)) 258 258 return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 259 259 break; 260 + case PHY_INTERFACE_MODE_RGMII: 261 + case PHY_INTERFACE_MODE_RGMII_ID: 262 + case PHY_INTERFACE_MODE_RGMII_TXID: 263 + case PHY_INTERFACE_MODE_RGMII_RXID: 264 + if (conf->speed != SPEED_1000 && 265 + conf->speed != SPEED_100 && 266 + conf->speed != SPEED_10) 267 + return sparx5_port_error(port, conf, SPX5_PERR_SPEED); 268 + break; 260 269 default: 261 270 return sparx5_port_error(port, conf, SPX5_PERR_IFTYPE); 262 271 } ··· 1003 994 struct sparx5_port *port, 1004 995 struct sparx5_port_config *conf) 1005 996 { 997 + bool rgmii = phy_interface_mode_is_rgmii(conf->phy_mode); 1006 998 bool high_speed_dev = sparx5_is_baser(conf->portmode); 1007 999 const struct sparx5_ops *ops = sparx5->data->ops; 1008 1000 int err, urgency, stop_wm; ··· 1012 1002 if (err) 1013 1003 return err; 1014 1004 1005 + if (rgmii) { 1006 + err = ops->port_config_rgmii(port, conf); 1007 + if (err) 1008 + return err; 1009 + } 1010 + 1015 1011 /* high speed device is already configured */ 1016 - if (!high_speed_dev) 1012 + if (!rgmii && !high_speed_dev) 1017 1013 sparx5_port_config_low_set(sparx5, port, conf); 1018 1014 1019 1015 /* Configure flow control */ ··· 1083 1067 if (err) 1084 1068 return err; 1085 1069 1086 - /* Configure MAC vlan awareness */ 1087 - err = sparx5_port_max_tags_set(sparx5, port); 1088 - if (err) 1089 - return err; 1090 - 1091 - /* Set Max Length */ 1092 - spx5_rmw(DEV2G5_MAC_MAXLEN_CFG_MAX_LEN_SET(ETH_MAXLEN), 1093 - DEV2G5_MAC_MAXLEN_CFG_MAX_LEN, 1094 - sparx5, 1095 - DEV2G5_MAC_MAXLEN_CFG(port->portno)); 1096 - 1097 - /* 1G/2G5: Signal Detect configuration */ 1098 - spx5_wr(DEV2G5_PCS1G_SD_CFG_SD_POL_SET(sd_pol) | 1099 - DEV2G5_PCS1G_SD_CFG_SD_SEL_SET(sd_sel) | 1100 - DEV2G5_PCS1G_SD_CFG_SD_ENA_SET(sd_ena), 1101 - sparx5, 1102 - DEV2G5_PCS1G_SD_CFG(port->portno)); 1103 - 1104 1070 /* Set Pause WM hysteresis */ 1105 1071 spx5_rmw(QSYS_PAUSE_CFG_PAUSE_START_SET(pause_start) | 1106 1072 QSYS_PAUSE_CFG_PAUSE_STOP_SET(pause_stop) | ··· 1105 1107 spx5_rmw(ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS_SET(0), 1106 1108 ANA_CL_FILTER_CTRL_FILTER_SMAC_MC_DIS, 1107 1109 sparx5, ANA_CL_FILTER_CTRL(port->portno)); 1110 + 1111 + if (ops->is_port_rgmii(port->portno)) 1112 + return 0; /* RGMII device - nothing more to configure */ 1113 + 1114 + /* Configure MAC vlan awareness */ 1115 + err = sparx5_port_max_tags_set(sparx5, port); 1116 + if (err) 1117 + return err; 1118 + 1119 + /* Set Max Length */ 1120 + spx5_rmw(DEV2G5_MAC_MAXLEN_CFG_MAX_LEN_SET(ETH_MAXLEN), 1121 + DEV2G5_MAC_MAXLEN_CFG_MAX_LEN, 1122 + sparx5, 1123 + DEV2G5_MAC_MAXLEN_CFG(port->portno)); 1124 + 1125 + /* 1G/2G5: Signal Detect configuration */ 1126 + spx5_wr(DEV2G5_PCS1G_SD_CFG_SD_POL_SET(sd_pol) | 1127 + DEV2G5_PCS1G_SD_CFG_SD_SEL_SET(sd_sel) | 1128 + DEV2G5_PCS1G_SD_CFG_SD_ENA_SET(sd_ena), 1129 + sparx5, 1130 + DEV2G5_PCS1G_SD_CFG(port->portno)); 1108 1131 1109 1132 if (conf->portmode == PHY_INTERFACE_MODE_QSGMII || 1110 1133 conf->portmode == PHY_INTERFACE_MODE_SGMII) {
+5
drivers/net/ethernet/microchip/sparx5/sparx5_port.h
··· 40 40 return portno >= 56 && portno <= 63; 41 41 } 42 42 43 + static inline bool sparx5_port_is_rgmii(int portno) 44 + { 45 + return false; 46 + } 47 + 43 48 static inline u32 sparx5_to_high_dev(struct sparx5 *sparx5, int port) 44 49 { 45 50 const struct sparx5_ops *ops = sparx5->data->ops;