generic: backport support for MT7981 Ethernet
Backport support for the MT7981 SoC to mtk_eth_soc. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
		| @@ -0,0 +1,183 @@ | |||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_eth_path.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c | ||||||
|  | @@ -96,12 +96,20 @@ static int set_mux_gmac2_gmac0_to_gephy( | ||||||
|  |   | ||||||
|  |  static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path) | ||||||
|  |  { | ||||||
|  | -	unsigned int val = 0; | ||||||
|  | +	unsigned int val = 0, mask = 0, reg = 0; | ||||||
|  |  	bool updated = true; | ||||||
|  |   | ||||||
|  |  	switch (path) { | ||||||
|  |  	case MTK_ETH_PATH_GMAC2_SGMII: | ||||||
|  | -		val = CO_QPHY_SEL; | ||||||
|  | +		if (MTK_HAS_CAPS(eth->soc->caps, MTK_U3_COPHY_V2)) { | ||||||
|  | +			reg = USB_PHY_SWITCH_REG; | ||||||
|  | +			val = SGMII_QPHY_SEL; | ||||||
|  | +			mask = QPHY_SEL_MASK; | ||||||
|  | +		} else { | ||||||
|  | +			reg = INFRA_MISC2; | ||||||
|  | +			val = CO_QPHY_SEL; | ||||||
|  | +			mask = val; | ||||||
|  | +		} | ||||||
|  |  		break; | ||||||
|  |  	default: | ||||||
|  |  		updated = false; | ||||||
|  | @@ -109,7 +117,7 @@ static int set_mux_u3_gmac2_to_qphy(stru | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  |  	if (updated) | ||||||
|  | -		regmap_update_bits(eth->infra, INFRA_MISC2, CO_QPHY_SEL, val); | ||||||
|  | +		regmap_update_bits(eth->infra, reg, mask, val); | ||||||
|  |   | ||||||
|  |  	dev_dbg(eth->dev, "path %s in %s updated = %d\n", | ||||||
|  |  		mtk_eth_path_name(path), __func__, updated); | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||||||
|  | @@ -4757,6 +4757,26 @@ static const struct mtk_soc_data mt7629_ | ||||||
|  |  	}, | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +static const struct mtk_soc_data mt7981_data = { | ||||||
|  | +	.reg_map = &mt7986_reg_map, | ||||||
|  | +	.ana_rgc3 = 0x128, | ||||||
|  | +	.caps = MT7981_CAPS, | ||||||
|  | +	.hw_features = MTK_HW_FEATURES, | ||||||
|  | +	.required_clks = MT7981_CLKS_BITMAP, | ||||||
|  | +	.required_pctl = false, | ||||||
|  | +	.offload_version = 2, | ||||||
|  | +	.hash_offset = 4, | ||||||
|  | +	.foe_entry_size = sizeof(struct mtk_foe_entry), | ||||||
|  | +	.txrx = { | ||||||
|  | +		.txd_size = sizeof(struct mtk_tx_dma_v2), | ||||||
|  | +		.rxd_size = sizeof(struct mtk_rx_dma_v2), | ||||||
|  | +		.rx_irq_done_mask = MTK_RX_DONE_INT_V2, | ||||||
|  | +		.rx_dma_l4_valid = RX_DMA_L4_VALID_V2, | ||||||
|  | +		.dma_max_len = MTK_TX_DMA_BUF_LEN_V2, | ||||||
|  | +		.dma_len_offset = 8, | ||||||
|  | +	}, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  |  static const struct mtk_soc_data mt7986_data = { | ||||||
|  |  	.reg_map = &mt7986_reg_map, | ||||||
|  |  	.ana_rgc3 = 0x128, | ||||||
|  | @@ -4799,6 +4819,7 @@ const struct of_device_id of_mtk_match[] | ||||||
|  |  	{ .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, | ||||||
|  |  	{ .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, | ||||||
|  |  	{ .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, | ||||||
|  | +	{ .compatible = "mediatek,mt7981-eth", .data = &mt7981_data}, | ||||||
|  |  	{ .compatible = "mediatek,mt7986-eth", .data = &mt7986_data}, | ||||||
|  |  	{ .compatible = "ralink,rt5350-eth", .data = &rt5350_data}, | ||||||
|  |  	{}, | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||||||
|  | @@ -553,11 +553,22 @@ | ||||||
|  |  #define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8 | ||||||
|  |  #define	SGMII_PHYA_PWD		BIT(4) | ||||||
|  |   | ||||||
|  | +/* Register to QPHY wrapper control */ | ||||||
|  | +#define SGMSYS_QPHY_WRAP_CTRL	0xec | ||||||
|  | +#define SGMII_PN_SWAP_MASK	GENMASK(1, 0) | ||||||
|  | +#define SGMII_PN_SWAP_TX_RX	(BIT(0) | BIT(1)) | ||||||
|  | +#define MTK_SGMII_FLAG_PN_SWAP	BIT(0) | ||||||
|  | + | ||||||
|  |  /* Infrasys subsystem config registers */ | ||||||
|  |  #define INFRA_MISC2            0x70c | ||||||
|  |  #define CO_QPHY_SEL            BIT(0) | ||||||
|  |  #define GEPHY_MAC_SEL          BIT(1) | ||||||
|  |   | ||||||
|  | +/* Top misc registers */ | ||||||
|  | +#define USB_PHY_SWITCH_REG	0x218 | ||||||
|  | +#define QPHY_SEL_MASK		GENMASK(1, 0) | ||||||
|  | +#define SGMII_QPHY_SEL		0x2 | ||||||
|  | + | ||||||
|  |  /* MT7628/88 specific stuff */ | ||||||
|  |  #define MT7628_PDMA_OFFSET	0x0800 | ||||||
|  |  #define MT7628_SDM_OFFSET	0x0c00 | ||||||
|  | @@ -738,6 +749,17 @@ enum mtk_clks_map { | ||||||
|  |  				 BIT(MTK_CLK_SGMII2_CDR_FB) | \ | ||||||
|  |  				 BIT(MTK_CLK_SGMII_CK) | \ | ||||||
|  |  				 BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) | ||||||
|  | +#define MT7981_CLKS_BITMAP	(BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ | ||||||
|  | +				 BIT(MTK_CLK_WOCPU0) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII_TX_250M) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII_RX_250M) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII_CDR_REF) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII_CDR_FB) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII2_TX_250M) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII2_RX_250M) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII2_CDR_REF) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII2_CDR_FB) | \ | ||||||
|  | +				 BIT(MTK_CLK_SGMII_CK)) | ||||||
|  |  #define MT7986_CLKS_BITMAP	(BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ | ||||||
|  |  				 BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ | ||||||
|  |  				 BIT(MTK_CLK_SGMII_TX_250M) | \ | ||||||
|  | @@ -851,6 +873,7 @@ enum mkt_eth_capabilities { | ||||||
|  |  	MTK_NETSYS_V2_BIT, | ||||||
|  |  	MTK_SOC_MT7628_BIT, | ||||||
|  |  	MTK_RSTCTRL_PPE1_BIT, | ||||||
|  | +	MTK_U3_COPHY_V2_BIT, | ||||||
|  |   | ||||||
|  |  	/* MUX BITS*/ | ||||||
|  |  	MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, | ||||||
|  | @@ -885,6 +908,7 @@ enum mkt_eth_capabilities { | ||||||
|  |  #define MTK_NETSYS_V2		BIT(MTK_NETSYS_V2_BIT) | ||||||
|  |  #define MTK_SOC_MT7628		BIT(MTK_SOC_MT7628_BIT) | ||||||
|  |  #define MTK_RSTCTRL_PPE1	BIT(MTK_RSTCTRL_PPE1_BIT) | ||||||
|  | +#define MTK_U3_COPHY_V2		BIT(MTK_U3_COPHY_V2_BIT) | ||||||
|  |   | ||||||
|  |  #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW		\ | ||||||
|  |  	BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) | ||||||
|  | @@ -963,6 +987,11 @@ enum mkt_eth_capabilities { | ||||||
|  |  		      MTK_MUX_U3_GMAC2_TO_QPHY | \ | ||||||
|  |  		      MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) | ||||||
|  |   | ||||||
|  | +#define MT7981_CAPS  (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \ | ||||||
|  | +		      MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ | ||||||
|  | +		      MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \ | ||||||
|  | +		      MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) | ||||||
|  | + | ||||||
|  |  #define MT7986_CAPS  (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ | ||||||
|  |  		      MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ | ||||||
|  |  		      MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) | ||||||
|  | @@ -1076,12 +1105,14 @@ struct mtk_soc_data { | ||||||
|  |   * @ana_rgc3:          The offset refers to register ANA_RGC3 related to regmap | ||||||
|  |   * @interface:         Currently configured interface mode | ||||||
|  |   * @pcs:               Phylink PCS structure | ||||||
|  | + * @flags:             Flags indicating hardware properties | ||||||
|  |   */ | ||||||
|  |  struct mtk_pcs { | ||||||
|  |  	struct regmap	*regmap; | ||||||
|  |  	u32             ana_rgc3; | ||||||
|  |  	phy_interface_t	interface; | ||||||
|  |  	struct phylink_pcs pcs; | ||||||
|  | +	u32		flags; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  /* struct mtk_sgmii -  This is the structure holding sgmii regmap and its | ||||||
|  | --- a/drivers/net/ethernet/mediatek/mtk_sgmii.c | ||||||
|  | +++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c | ||||||
|  | @@ -87,6 +87,11 @@ static int mtk_pcs_config(struct phylink | ||||||
|  |  		regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, | ||||||
|  |  				   SGMII_PHYA_PWD, SGMII_PHYA_PWD); | ||||||
|  |   | ||||||
|  | +		if (mpcs->flags & MTK_SGMII_FLAG_PN_SWAP) | ||||||
|  | +			regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL, | ||||||
|  | +					   SGMII_PN_SWAP_MASK, | ||||||
|  | +					   SGMII_PN_SWAP_TX_RX); | ||||||
|  | + | ||||||
|  |  		/* Reset SGMII PCS state */ | ||||||
|  |  		regmap_update_bits(mpcs->regmap, SGMII_RESERVED_0, | ||||||
|  |  				   SGMII_SW_RESET, SGMII_SW_RESET); | ||||||
|  | @@ -186,6 +191,11 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, | ||||||
|  |   | ||||||
|  |  		ss->pcs[i].ana_rgc3 = ana_rgc3; | ||||||
|  |  		ss->pcs[i].regmap = syscon_node_to_regmap(np); | ||||||
|  | + | ||||||
|  | +		ss->pcs[i].flags = 0; | ||||||
|  | +		if (of_property_read_bool(np, "mediatek,pnswap")) | ||||||
|  | +			ss->pcs[i].flags |= MTK_SGMII_FLAG_PN_SWAP; | ||||||
|  | + | ||||||
|  |  		of_node_put(np); | ||||||
|  |  		if (IS_ERR(ss->pcs[i].regmap)) | ||||||
|  |  			return PTR_ERR(ss->pcs[i].regmap); | ||||||
| @@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  |  | ||||||
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||||||
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||||||
| @@ -1326,6 +1326,9 @@ int mtk_gmac_rgmii_path_setup(struct mtk | @@ -1357,6 +1357,9 @@ int mtk_gmac_rgmii_path_setup(struct mtk | ||||||
|  int mtk_eth_offload_init(struct mtk_eth *eth); |  int mtk_eth_offload_init(struct mtk_eth *eth); | ||||||
|  int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, |  int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, | ||||||
|  		     void *type_data); |  		     void *type_data); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Daniel Golle
					Daniel Golle