Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
# SPDX-License-Identifier: GPL-2.0
#
# Makefile for MSCC networking PHY driver
obj-$(CONFIG_MICROSEMI_PHY) := mscc.o
mscc-objs := mscc_main.o
mscc-objs += mscc_serdes.o
ifdef CONFIG_MACSEC
mscc-objs += mscc_macsec.o
endif
ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
mscc-objs += mscc_ptp.o
endif
+523
View File
@@ -0,0 +1,523 @@
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Driver for Microsemi VSC85xx PHYs
*
* Copyright (c) 2016 Microsemi Corporation
*/
#ifndef _MSCC_PHY_H_
#define _MSCC_PHY_H_
#if IS_ENABLED(CONFIG_MACSEC)
#include "mscc_macsec.h"
#endif
enum rgmii_clock_delay {
RGMII_CLK_DELAY_0_2_NS = 0,
RGMII_CLK_DELAY_0_8_NS = 1,
RGMII_CLK_DELAY_1_1_NS = 2,
RGMII_CLK_DELAY_1_7_NS = 3,
RGMII_CLK_DELAY_2_0_NS = 4,
RGMII_CLK_DELAY_2_3_NS = 5,
RGMII_CLK_DELAY_2_6_NS = 6,
RGMII_CLK_DELAY_3_4_NS = 7
};
/* Microsemi VSC85xx PHY registers */
/* IEEE 802. Std Registers */
#define MSCC_PHY_BYPASS_CONTROL 18
#define DISABLE_HP_AUTO_MDIX_MASK 0x0080
#define DISABLE_PAIR_SWAP_CORR_MASK 0x0020
#define DISABLE_POLARITY_CORR_MASK 0x0010
#define PARALLEL_DET_IGNORE_ADVERTISED 0x0008
#define MSCC_PHY_EXT_CNTL_STATUS 22
#define SMI_BROADCAST_WR_EN 0x0001
#define MSCC_PHY_ERR_RX_CNT 19
#define MSCC_PHY_ERR_FALSE_CARRIER_CNT 20
#define MSCC_PHY_ERR_LINK_DISCONNECT_CNT 21
#define ERR_CNT_MASK GENMASK(7, 0)
#define MSCC_PHY_EXT_PHY_CNTL_1 23
#define MAC_IF_SELECTION_MASK 0x1800
#define MAC_IF_SELECTION_GMII 0
#define MAC_IF_SELECTION_RMII 1
#define MAC_IF_SELECTION_RGMII 2
#define MAC_IF_SELECTION_POS 11
#define VSC8584_MAC_IF_SELECTION_MASK 0x1000
#define VSC8584_MAC_IF_SELECTION_SGMII 0
#define VSC8584_MAC_IF_SELECTION_1000BASEX 1
#define VSC8584_MAC_IF_SELECTION_POS 12
#define FAR_END_LOOPBACK_MODE_MASK 0x0008
#define MEDIA_OP_MODE_MASK 0x0700
#define MEDIA_OP_MODE_COPPER 0
#define MEDIA_OP_MODE_SERDES 1
#define MEDIA_OP_MODE_1000BASEX 2
#define MEDIA_OP_MODE_100BASEFX 3
#define MEDIA_OP_MODE_AMS_COPPER_SERDES 5
#define MEDIA_OP_MODE_AMS_COPPER_1000BASEX 6
#define MEDIA_OP_MODE_AMS_COPPER_100BASEFX 7
#define MEDIA_OP_MODE_POS 8
#define MSCC_PHY_EXT_PHY_CNTL_2 24
#define MII_VSC85XX_INT_MASK 25
#define MII_VSC85XX_INT_MASK_MDINT BIT(15)
#define MII_VSC85XX_INT_MASK_LINK_CHG BIT(13)
#define MII_VSC85XX_INT_MASK_WOL BIT(6)
#define MII_VSC85XX_INT_MASK_EXT BIT(5)
#define MII_VSC85XX_INT_STATUS 26
#define MII_VSC85XX_INT_MASK_MASK (MII_VSC85XX_INT_MASK_MDINT | \
MII_VSC85XX_INT_MASK_LINK_CHG | \
MII_VSC85XX_INT_MASK_EXT)
#define MSCC_PHY_WOL_MAC_CONTROL 27
#define EDGE_RATE_CNTL_POS 5
#define EDGE_RATE_CNTL_MASK 0x00E0
#define MSCC_PHY_DEV_AUX_CNTL 28
#define HP_AUTO_MDIX_X_OVER_IND_MASK 0x2000
#define MSCC_PHY_LED_MODE_SEL 29
#define LED_MODE_SEL_POS(x) ((x) * 4)
#define LED_MODE_SEL_MASK(x) (GENMASK(3, 0) << LED_MODE_SEL_POS(x))
#define LED_MODE_SEL(x, mode) (((mode) << LED_MODE_SEL_POS(x)) & LED_MODE_SEL_MASK(x))
#define MSCC_PHY_LED_BEHAVIOR 30
#define LED_COMBINE_DIS_MASK(x) BIT(x)
#define LED_COMBINE_DIS(x, dis) (((dis) ? 1 : 0) << (x))
#define MSCC_EXT_PAGE_CSR_CNTL_17 17
#define MSCC_EXT_PAGE_CSR_CNTL_18 18
#define MSCC_EXT_PAGE_CSR_CNTL_19 19
#define MSCC_PHY_CSR_CNTL_19_REG_ADDR(x) (x)
#define MSCC_PHY_CSR_CNTL_19_TARGET(x) ((x) << 12)
#define MSCC_PHY_CSR_CNTL_19_READ BIT(14)
#define MSCC_PHY_CSR_CNTL_19_CMD BIT(15)
#define MSCC_EXT_PAGE_CSR_CNTL_20 20
#define MSCC_PHY_CSR_CNTL_20_TARGET(x) (x)
#define PHY_MCB_TARGET 0x07
#define PHY_MCB_S6G_WRITE BIT(31)
#define PHY_MCB_S6G_READ BIT(30)
#define PHY_S6G_PLL5G_CFG0 0x06
#define PHY_S6G_PLL5G_CFG2 0x08
#define PHY_S6G_LCPLL_CFG 0x11
#define PHY_S6G_PLL_CFG 0x2b
#define PHY_S6G_COMMON_CFG 0x2c
#define PHY_S6G_GPC_CFG 0x2e
#define PHY_S6G_MISC_CFG 0x3b
#define PHY_MCB_S6G_CFG 0x3f
#define PHY_S6G_DFT_CFG2 0x3e
#define PHY_S6G_PLL_STATUS 0x31
#define PHY_S6G_IB_STATUS0 0x2f
#define PHY_S6G_SYS_RST_POS 31
#define PHY_S6G_ENA_LANE_POS 18
#define PHY_S6G_ENA_LOOP_POS 8
#define PHY_S6G_QRATE_POS 6
#define PHY_S6G_IF_MODE_POS 4
#define PHY_S6G_PLL_ENA_OFFS_POS 21
#define PHY_S6G_PLL_FSM_CTRL_DATA_POS 8
#define PHY_S6G_PLL_FSM_ENA_POS 7
#define PHY_S6G_CFG2_FSM_DIS 1
#define PHY_S6G_CFG2_FSM_CLK_BP 23
#define MSCC_EXT_PAGE_ACCESS 31
#define MSCC_PHY_PAGE_STANDARD 0x0000 /* Standard registers */
#define MSCC_PHY_PAGE_EXTENDED 0x0001 /* Extended registers */
#define MSCC_PHY_PAGE_EXTENDED_2 0x0002 /* Extended reg - page 2 */
#define MSCC_PHY_PAGE_EXTENDED_3 0x0003 /* Extended reg - page 3 */
#define MSCC_PHY_PAGE_EXTENDED_4 0x0004 /* Extended reg - page 4 */
#define MSCC_PHY_PAGE_CSR_CNTL MSCC_PHY_PAGE_EXTENDED_4
#define MSCC_PHY_PAGE_MACSEC MSCC_PHY_PAGE_EXTENDED_4
/* Extended reg - GPIO; this is a bank of registers that are shared for all PHYs
* in the same package.
*/
#define MSCC_PHY_PAGE_EXTENDED_GPIO 0x0010 /* Extended reg - GPIO */
#define MSCC_PHY_PAGE_1588 0x1588 /* PTP (1588) */
#define MSCC_PHY_PAGE_TEST 0x2a30 /* Test reg */
#define MSCC_PHY_PAGE_TR 0x52b5 /* Token ring registers */
#define MSCC_PHY_GPIO_CONTROL_2 14
#define MSCC_PHY_COMA_MODE 0x2000 /* input(1) / output(0) */
#define MSCC_PHY_COMA_OUTPUT 0x1000 /* value to output */
/* Extended Page 1 Registers */
#define MSCC_PHY_CU_MEDIA_CRC_VALID_CNT 18
#define VALID_CRC_CNT_CRC_MASK GENMASK(13, 0)
#define MSCC_PHY_EXT_MODE_CNTL 19
#define FORCE_MDI_CROSSOVER_MASK 0x000C
#define FORCE_MDI_CROSSOVER_MDIX 0x000C
#define FORCE_MDI_CROSSOVER_MDI 0x0008
#define MSCC_PHY_ACTIPHY_CNTL 20
#define PHY_ADDR_REVERSED 0x0200
#define DOWNSHIFT_CNTL_MASK 0x001C
#define DOWNSHIFT_EN 0x0010
#define DOWNSHIFT_CNTL_POS 2
#define MSCC_PHY_EXT_PHY_CNTL_4 23
#define PHY_CNTL_4_ADDR_POS 11
#define MSCC_PHY_VERIPHY_CNTL_2 25
#define MSCC_PHY_VERIPHY_CNTL_3 26
/* Extended Page 2 Registers */
#define MSCC_PHY_CU_PMD_TX_CNTL 16
/* RGMII setting controls at address 18E2, for VSC8572 and similar */
#define VSC8572_RGMII_CNTL 18
#define VSC8572_RGMII_RX_DELAY_MASK 0x000E
#define VSC8572_RGMII_TX_DELAY_MASK 0x0070
/* RGMII controls at address 20E2, for VSC8502 and similar */
#define VSC8502_RGMII_CNTL 20
#define VSC8502_RGMII_RX_DELAY_MASK 0x0070
#define VSC8502_RGMII_TX_DELAY_MASK 0x0007
#define VSC8502_RGMII_RX_CLK_DISABLE 0x0800
#define MSCC_PHY_WOL_LOWER_MAC_ADDR 21
#define MSCC_PHY_WOL_MID_MAC_ADDR 22
#define MSCC_PHY_WOL_UPPER_MAC_ADDR 23
#define MSCC_PHY_WOL_LOWER_PASSWD 24
#define MSCC_PHY_WOL_MID_PASSWD 25
#define MSCC_PHY_WOL_UPPER_PASSWD 26
#define MSCC_PHY_WOL_MAC_CONTROL 27
#define SECURE_ON_ENABLE 0x8000
#define SECURE_ON_PASSWD_LEN_4 0x4000
#define MSCC_PHY_EXTENDED_INT 28
#define MSCC_PHY_EXTENDED_INT_MS_EGR BIT(9)
/* Extended Page 3 Registers */
#define MSCC_PHY_SERDES_PCS_CTRL 16
#define MSCC_PHY_SERDES_ANEG BIT(7)
#define MSCC_PHY_SERDES_TX_VALID_CNT 21
#define MSCC_PHY_SERDES_TX_CRC_ERR_CNT 22
#define MSCC_PHY_SERDES_RX_VALID_CNT 28
#define MSCC_PHY_SERDES_RX_CRC_ERR_CNT 29
/* Extended page GPIO Registers */
#define MSCC_DW8051_CNTL_STATUS 0
#define MICRO_NSOFT_RESET 0x8000
#define RUN_FROM_INT_ROM 0x4000
#define AUTOINC_ADDR 0x2000
#define PATCH_RAM_CLK 0x1000
#define MICRO_PATCH_EN 0x0080
#define DW8051_CLK_EN 0x0010
#define MICRO_CLK_EN 0x0008
#define MICRO_CLK_DIVIDE(x) ((x) >> 1)
#define MSCC_DW8051_VLD_MASK 0xf1ff
/* x Address in range 1-4 */
#define MSCC_TRAP_ROM_ADDR(x) ((x) * 2 + 1)
#define MSCC_PATCH_RAM_ADDR(x) (((x) + 1) * 2)
#define MSCC_INT_MEM_ADDR 11
#define MSCC_INT_MEM_CNTL 12
#define READ_SFR 0x6000
#define READ_PRAM 0x4000
#define READ_ROM 0x2000
#define READ_RAM 0x0000
#define INT_MEM_WRITE_EN 0x1000
#define EN_PATCH_RAM_TRAP_ADDR(x) (0x0100 << ((x) - 1))
#define INT_MEM_DATA_M 0x00ff
#define INT_MEM_DATA(x) (INT_MEM_DATA_M & (x))
#define MSCC_PHY_PROC_CMD 18
#define PROC_CMD_NCOMPLETED 0x8000
#define PROC_CMD_FAILED 0x4000
#define PROC_CMD_SGMII_PORT(x) ((x) << 8)
#define PROC_CMD_FIBER_PORT(x) (0x0100 << (x) % 4)
#define PROC_CMD_QSGMII_PORT 0x0c00
#define PROC_CMD_RST_CONF_PORT 0x0080
#define PROC_CMD_RECONF_PORT 0x0000
#define PROC_CMD_READ_MOD_WRITE_PORT 0x0040
#define PROC_CMD_WRITE 0x0040
#define PROC_CMD_READ 0x0000
#define PROC_CMD_FIBER_DISABLE 0x0020
#define PROC_CMD_FIBER_100BASE_FX 0x0010
#define PROC_CMD_FIBER_1000BASE_X 0x0000
#define PROC_CMD_SGMII_MAC 0x0030
#define PROC_CMD_QSGMII_MAC 0x0020
#define PROC_CMD_NO_MAC_CONF 0x0000
#define PROC_CMD_1588_DEFAULT_INIT 0x0010
#define PROC_CMD_NOP 0x000f
#define PROC_CMD_PHY_INIT 0x000a
#define PROC_CMD_CRC16 0x0008
#define PROC_CMD_FIBER_MEDIA_CONF 0x0001
#define PROC_CMD_MCB_ACCESS_MAC_CONF 0x0000
#define PROC_CMD_NCOMPLETED_TIMEOUT_MS 500
#define MSCC_PHY_MAC_CFG_FASTLINK 19
#define MAC_CFG_MASK 0xc000
#define MAC_CFG_SGMII 0x0000
#define MAC_CFG_QSGMII 0x4000
#define MAC_CFG_RGMII 0x8000
/* Test page Registers */
#define MSCC_PHY_TEST_PAGE_5 5
#define MSCC_PHY_TEST_PAGE_8 8
#define TR_CLK_DISABLE 0x8000
#define MSCC_PHY_TEST_PAGE_9 9
#define MSCC_PHY_TEST_PAGE_20 20
#define MSCC_PHY_TEST_PAGE_24 24
/* Token ring page Registers */
#define MSCC_PHY_TR_CNTL 16
#define TR_WRITE 0x8000
#define TR_ADDR(x) (0x7fff & (x))
#define MSCC_PHY_TR_LSB 17
#define MSCC_PHY_TR_MSB 18
/* Microsemi PHY ID's
* Code assumes lowest nibble is 0
*/
#define PHY_ID_VSC8501 0x00070530
#define PHY_ID_VSC8502 0x00070630
#define PHY_ID_VSC8504 0x000704c0
#define PHY_ID_VSC8514 0x00070670
#define PHY_ID_VSC8530 0x00070560
#define PHY_ID_VSC8531 0x00070570
#define PHY_ID_VSC8540 0x00070760
#define PHY_ID_VSC8541 0x00070770
#define PHY_ID_VSC8552 0x000704e0
#define PHY_ID_VSC856X 0x000707e1
#define PHY_ID_VSC8572 0x000704d0
#define PHY_ID_VSC8574 0x000704a0
#define PHY_ID_VSC8575 0x000707d1
#define PHY_ID_VSC8582 0x000707b1
#define PHY_ID_VSC8584 0x000707c1
#define PHY_VENDOR_MSCC 0x00070400
#define MSCC_VDDMAC_1500 1500
#define MSCC_VDDMAC_1800 1800
#define MSCC_VDDMAC_2500 2500
#define MSCC_VDDMAC_3300 3300
#define DOWNSHIFT_COUNT_MAX 5
#define MAX_LEDS 4
#define VSC8584_SUPP_LED_MODES (BIT(VSC8531_LINK_ACTIVITY) | \
BIT(VSC8531_LINK_1000_ACTIVITY) | \
BIT(VSC8531_LINK_100_ACTIVITY) | \
BIT(VSC8531_LINK_10_ACTIVITY) | \
BIT(VSC8531_LINK_100_1000_ACTIVITY) | \
BIT(VSC8531_LINK_10_1000_ACTIVITY) | \
BIT(VSC8531_LINK_10_100_ACTIVITY) | \
BIT(VSC8584_LINK_100FX_1000X_ACTIVITY) | \
BIT(VSC8531_DUPLEX_COLLISION) | \
BIT(VSC8531_COLLISION) | \
BIT(VSC8531_ACTIVITY) | \
BIT(VSC8584_100FX_1000X_ACTIVITY) | \
BIT(VSC8531_AUTONEG_FAULT) | \
BIT(VSC8531_SERIAL_MODE) | \
BIT(VSC8531_FORCE_LED_OFF) | \
BIT(VSC8531_FORCE_LED_ON))
#define VSC85XX_SUPP_LED_MODES (BIT(VSC8531_LINK_ACTIVITY) | \
BIT(VSC8531_LINK_1000_ACTIVITY) | \
BIT(VSC8531_LINK_100_ACTIVITY) | \
BIT(VSC8531_LINK_10_ACTIVITY) | \
BIT(VSC8531_LINK_100_1000_ACTIVITY) | \
BIT(VSC8531_LINK_10_1000_ACTIVITY) | \
BIT(VSC8531_LINK_10_100_ACTIVITY) | \
BIT(VSC8531_DUPLEX_COLLISION) | \
BIT(VSC8531_COLLISION) | \
BIT(VSC8531_ACTIVITY) | \
BIT(VSC8531_AUTONEG_FAULT) | \
BIT(VSC8531_SERIAL_MODE) | \
BIT(VSC8531_FORCE_LED_OFF) | \
BIT(VSC8531_FORCE_LED_ON))
#define MSCC_VSC8584_REVB_INT8051_FW "microchip/mscc_vsc8584_revb_int8051_fb48.bin"
#define MSCC_VSC8584_REVB_INT8051_FW_START_ADDR 0xe800
#define MSCC_VSC8584_REVB_INT8051_FW_CRC 0xfb48
#define MSCC_VSC8574_REVB_INT8051_FW "microchip/mscc_vsc8574_revb_int8051_29e8.bin"
#define MSCC_VSC8574_REVB_INT8051_FW_START_ADDR 0x4000
#define MSCC_VSC8574_REVB_INT8051_FW_CRC 0x29e8
#define VSC8584_REVB 0x0001
#define MSCC_DEV_REV_MASK GENMASK(3, 0)
#define MSCC_ROM_TRAP_SERDES_6G_CFG 0x1E48
#define MSCC_RAM_TRAP_SERDES_6G_CFG 0x1E4F
#define PATCH_VEC_ZERO_EN 0x0100
struct reg_val {
u16 reg;
u32 val;
};
struct vsc85xx_hw_stat {
const char *string;
u8 reg;
u16 page;
u16 mask;
};
struct vsc8531_skb_cb {
u32 ns;
};
#define VSC8531_SKB_CB(skb) \
((struct vsc8531_skb_cb *)((skb)->cb))
struct vsc8531_private {
int rate_magic;
u16 supp_led_modes;
u32 leds_mode[MAX_LEDS];
u8 nleds;
const struct vsc85xx_hw_stat *hw_stats;
u64 *stats;
int nstats;
/* PHY address within the package. */
u8 addr;
/* For multiple port PHYs; the MDIO address of the base PHY in the
* package.
*/
unsigned int base_addr;
#if IS_ENABLED(CONFIG_MACSEC)
/* MACsec fields:
* - One SecY per device (enforced at the s/w implementation level)
* - macsec_flows: list of h/w flows
* - ingr_flows: bitmap of ingress flows
* - egr_flows: bitmap of egress flows
*/
struct macsec_secy *secy;
struct list_head macsec_flows;
unsigned long ingr_flows;
unsigned long egr_flows;
#endif
struct mii_timestamper mii_ts;
bool input_clk_init;
struct vsc85xx_ptp *ptp;
/* LOAD/SAVE GPIO pin, used for retrieving or setting time to the PHC. */
struct gpio_desc *load_save;
/* For multiple port PHYs; the MDIO address of the base PHY in the
* pair of two PHYs that share a 1588 engine. PHY0 and PHY2 are coupled.
* PHY1 and PHY3 as well. PHY0 and PHY1 are base PHYs for their
* respective pair.
*/
unsigned int ts_base_addr;
u8 ts_base_phy;
/* ts_lock: used for per-PHY timestamping operations.
* phc_lock: used for per-PHY PHC opertations.
*/
struct mutex ts_lock;
struct mutex phc_lock;
/* list of skbs that were received and need timestamp information but it
* didn't received it yet
*/
struct sk_buff_head rx_skbs_list;
};
/* Shared structure between the PHYs of the same package.
* gpio_lock: used for PHC operations. Common for all PHYs as the load/save GPIO
* is shared.
*/
enum vsc85xx_global_phy {
VSC88XX_BASE_ADDR = 0,
};
struct vsc85xx_shared_private {
struct mutex gpio_lock;
};
#if IS_ENABLED(CONFIG_OF_MDIO)
struct vsc8531_edge_rate_table {
u32 vddmac;
u32 slowdown[8];
};
#endif /* CONFIG_OF_MDIO */
enum csr_target {
MACRO_CTRL = 0x07,
};
u32 vsc85xx_csr_read(struct phy_device *phydev,
enum csr_target target, u32 reg);
int vsc85xx_csr_write(struct phy_device *phydev,
enum csr_target target, u32 reg, u32 val);
int phy_base_write(struct phy_device *phydev, u32 regnum, u16 val);
int phy_base_read(struct phy_device *phydev, u32 regnum);
int phy_update_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb);
int phy_commit_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb);
int vsc8584_cmd(struct phy_device *phydev, u16 val);
#if IS_ENABLED(CONFIG_MACSEC)
int vsc8584_macsec_init(struct phy_device *phydev);
void vsc8584_handle_macsec_interrupt(struct phy_device *phydev);
void vsc8584_config_macsec_intr(struct phy_device *phydev);
#else
static inline int vsc8584_macsec_init(struct phy_device *phydev)
{
return 0;
}
static inline void vsc8584_handle_macsec_interrupt(struct phy_device *phydev)
{
}
static inline void vsc8584_config_macsec_intr(struct phy_device *phydev)
{
}
#endif
#if IS_ENABLED(CONFIG_NETWORK_PHY_TIMESTAMPING)
void vsc85xx_link_change_notify(struct phy_device *phydev);
void vsc8584_config_ts_intr(struct phy_device *phydev);
int vsc8584_ptp_init(struct phy_device *phydev);
void vsc8584_ptp_deinit(struct phy_device *phydev);
int vsc8584_ptp_probe_once(struct phy_device *phydev);
int vsc8584_ptp_probe(struct phy_device *phydev);
irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev);
#else
static inline void vsc85xx_link_change_notify(struct phy_device *phydev)
{
}
static inline void vsc8584_config_ts_intr(struct phy_device *phydev)
{
}
static inline int vsc8584_ptp_init(struct phy_device *phydev)
{
return 0;
}
static inline void vsc8584_ptp_deinit(struct phy_device *phydev)
{
}
static inline int vsc8584_ptp_probe_once(struct phy_device *phydev)
{
return 0;
}
static inline int vsc8584_ptp_probe(struct phy_device *phydev)
{
return 0;
}
static inline irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)
{
return IRQ_NONE;
}
#endif
#endif /* _MSCC_PHY_H_ */
@@ -0,0 +1,64 @@
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Driver for Microsemi VSC85xx PHYs
*
* Copyright (C) 2020 Microsemi Corporation
*/
#ifndef _MSCC_PHY_FC_BUFFER_H_
#define _MSCC_PHY_FC_BUFFER_H_
#define MSCC_FCBUF_ENA_CFG 0x00
#define MSCC_FCBUF_MODE_CFG 0x01
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG 0x02
#define MSCC_FCBUF_TX_CTRL_QUEUE_CFG 0x03
#define MSCC_FCBUF_TX_DATA_QUEUE_CFG 0x04
#define MSCC_FCBUF_RX_DATA_QUEUE_CFG 0x05
#define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG 0x06
#define MSCC_FCBUF_FC_READ_THRESH_CFG 0x07
#define MSCC_FCBUF_TX_FRM_GAP_COMP 0x08
#define MSCC_FCBUF_ENA_CFG_TX_ENA BIT(0)
#define MSCC_FCBUF_ENA_CFG_RX_ENA BIT(4)
#define MSCC_FCBUF_MODE_CFG_DROP_BEHAVIOUR BIT(4)
#define MSCC_FCBUF_MODE_CFG_PAUSE_REACT_ENA BIT(8)
#define MSCC_FCBUF_MODE_CFG_RX_PPM_RATE_ADAPT_ENA BIT(12)
#define MSCC_FCBUF_MODE_CFG_TX_PPM_RATE_ADAPT_ENA BIT(16)
#define MSCC_FCBUF_MODE_CFG_TX_CTRL_QUEUE_ENA BIT(20)
#define MSCC_FCBUF_MODE_CFG_PAUSE_GEN_ENA BIT(24)
#define MSCC_FCBUF_MODE_CFG_INCLUDE_PAUSE_RCVD_IN_PAUSE_GEN BIT(28)
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_THRESH(x) (x)
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_THRESH_M GENMASK(15, 0)
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_OFFSET(x) ((x) << 16)
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_TX_OFFSET_M GENMASK(19, 16)
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_RX_THRESH(x) ((x) << 20)
#define MSCC_FCBUF_PPM_RATE_ADAPT_THRESH_CFG_RX_THRESH_M GENMASK(31, 20)
#define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_START(x) (x)
#define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_START_M GENMASK(15, 0)
#define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_END(x) ((x) << 16)
#define MSCC_FCBUF_TX_CTRL_QUEUE_CFG_END_M GENMASK(31, 16)
#define MSCC_FCBUF_TX_DATA_QUEUE_CFG_START(x) (x)
#define MSCC_FCBUF_TX_DATA_QUEUE_CFG_START_M GENMASK(15, 0)
#define MSCC_FCBUF_TX_DATA_QUEUE_CFG_END(x) ((x) << 16)
#define MSCC_FCBUF_TX_DATA_QUEUE_CFG_END_M GENMASK(31, 16)
#define MSCC_FCBUF_RX_DATA_QUEUE_CFG_START(x) (x)
#define MSCC_FCBUF_RX_DATA_QUEUE_CFG_START_M GENMASK(15, 0)
#define MSCC_FCBUF_RX_DATA_QUEUE_CFG_END(x) ((x) << 16)
#define MSCC_FCBUF_RX_DATA_QUEUE_CFG_END_M GENMASK(31, 16)
#define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XOFF_THRESH(x) (x)
#define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XOFF_THRESH_M GENMASK(15, 0)
#define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XON_THRESH(x) ((x) << 16)
#define MSCC_FCBUF_TX_BUFF_XON_XOFF_THRESH_CFG_XON_THRESH_M GENMASK(31, 16)
#define MSCC_FCBUF_FC_READ_THRESH_CFG_TX_THRESH(x) (x)
#define MSCC_FCBUF_FC_READ_THRESH_CFG_TX_THRESH_M GENMASK(15, 0)
#define MSCC_FCBUF_FC_READ_THRESH_CFG_RX_THRESH(x) ((x) << 16)
#define MSCC_FCBUF_FC_READ_THRESH_CFG_RX_THRESH_M GENMASK(31, 16)
#endif /* _MSCC_PHY_FC_BUFFER_H_ */
+159
View File
@@ -0,0 +1,159 @@
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Driver for Microsemi VSC85xx PHYs
*
* Copyright (c) 2020 Microsemi Corporation
*/
#ifndef _MSCC_PHY_LINE_MAC_H_
#define _MSCC_PHY_LINE_MAC_H_
#define MSCC_MAC_CFG_ENA_CFG 0x00
#define MSCC_MAC_CFG_MODE_CFG 0x01
#define MSCC_MAC_CFG_MAXLEN_CFG 0x02
#define MSCC_MAC_CFG_NUM_TAGS_CFG 0x03
#define MSCC_MAC_CFG_TAGS_CFG 0x04
#define MSCC_MAC_CFG_ADV_CHK_CFG 0x07
#define MSCC_MAC_CFG_LFS_CFG 0x08
#define MSCC_MAC_CFG_LB_CFG 0x09
#define MSCC_MAC_CFG_PKTINF_CFG 0x0a
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL 0x0b
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_2 0x0c
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL 0x0d
#define MSCC_MAC_PAUSE_CFG_STATE 0x0e
#define MSCC_MAC_PAUSE_CFG_MAC_ADDRESS_LSB 0x0f
#define MSCC_MAC_PAUSE_CFG_MAC_ADDRESS_MSB 0x10
#define MSCC_MAC_STATUS_RX_LANE_STICKY_0 0x11
#define MSCC_MAC_STATUS_RX_LANE_STICKY_1 0x12
#define MSCC_MAC_STATUS_TX_MONITOR_STICKY 0x13
#define MSCC_MAC_STATUS_TX_MONITOR_STICKY_MASK 0x14
#define MSCC_MAC_STATUS_STICKY 0x15
#define MSCC_MAC_STATUS_STICKY_MASK 0x16
#define MSCC_MAC_STATS_32BIT_RX_HIH_CKSM_ERR_CNT 0x17
#define MSCC_MAC_STATS_32BIT_RX_XGMII_PROT_ERR_CNT 0x18
#define MSCC_MAC_STATS_32BIT_RX_SYMBOL_ERR_CNT 0x19
#define MSCC_MAC_STATS_32BIT_RX_PAUSE_CNT 0x1a
#define MSCC_MAC_STATS_32BIT_RX_UNSUP_OPCODE_CNT 0x1b
#define MSCC_MAC_STATS_32BIT_RX_UC_CNT 0x1c
#define MSCC_MAC_STATS_32BIT_RX_MC_CNT 0x1d
#define MSCC_MAC_STATS_32BIT_RX_BC_CNT 0x1e
#define MSCC_MAC_STATS_32BIT_RX_CRC_ERR_CNT 0x1f
#define MSCC_MAC_STATS_32BIT_RX_UNDERSIZE_CNT 0x20
#define MSCC_MAC_STATS_32BIT_RX_FRAGMENTS_CNT 0x21
#define MSCC_MAC_STATS_32BIT_RX_IN_RANGE_LEN_ERR_CNT 0x22
#define MSCC_MAC_STATS_32BIT_RX_OUT_OF_RANGE_LEN_ERR_CNT 0x23
#define MSCC_MAC_STATS_32BIT_RX_OVERSIZE_CNT 0x24
#define MSCC_MAC_STATS_32BIT_RX_JABBERS_CNT 0x25
#define MSCC_MAC_STATS_32BIT_RX_SIZE64_CNT 0x26
#define MSCC_MAC_STATS_32BIT_RX_SIZE65TO127_CNT 0x27
#define MSCC_MAC_STATS_32BIT_RX_SIZE128TO255_CNT 0x28
#define MSCC_MAC_STATS_32BIT_RX_SIZE256TO511_CNT 0x29
#define MSCC_MAC_STATS_32BIT_RX_SIZE512TO1023_CNT 0x2a
#define MSCC_MAC_STATS_32BIT_RX_SIZE1024TO1518_CNT 0x2b
#define MSCC_MAC_STATS_32BIT_RX_SIZE1519TOMAX_CNT 0x2c
#define MSCC_MAC_STATS_32BIT_RX_IPG_SHRINK_CNT 0x2d
#define MSCC_MAC_STATS_32BIT_TX_PAUSE_CNT 0x2e
#define MSCC_MAC_STATS_32BIT_TX_UC_CNT 0x2f
#define MSCC_MAC_STATS_32BIT_TX_MC_CNT 0x30
#define MSCC_MAC_STATS_32BIT_TX_BC_CNT 0x31
#define MSCC_MAC_STATS_32BIT_TX_SIZE64_CNT 0x32
#define MSCC_MAC_STATS_32BIT_TX_SIZE65TO127_CNT 0x33
#define MSCC_MAC_STATS_32BIT_TX_SIZE128TO255_CNT 0x34
#define MSCC_MAC_STATS_32BIT_TX_SIZE256TO511_CNT 0x35
#define MSCC_MAC_STATS_32BIT_TX_SIZE512TO1023_CNT 0x36
#define MSCC_MAC_STATS_32BIT_TX_SIZE1024TO1518_CNT 0x37
#define MSCC_MAC_STATS_32BIT_TX_SIZE1519TOMAX_CNT 0x38
#define MSCC_MAC_STATS_40BIT_RX_BAD_BYTES_CNT 0x39
#define MSCC_MAC_STATS_40BIT_RX_BAD_BYTES_MSB_CNT 0x3a
#define MSCC_MAC_STATS_40BIT_RX_OK_BYTES_CNT 0x3b
#define MSCC_MAC_STATS_40BIT_RX_OK_BYTES_MSB_CNT 0x3c
#define MSCC_MAC_STATS_40BIT_RX_IN_BYTES_CNT 0x3d
#define MSCC_MAC_STATS_40BIT_RX_IN_BYTES_MSB_CNT 0x3e
#define MSCC_MAC_STATS_40BIT_TX_OK_BYTES_CNT 0x3f
#define MSCC_MAC_STATS_40BIT_TX_OK_BYTES_MSB_CNT 0x40
#define MSCC_MAC_STATS_40BIT_TX_OUT_BYTES_CNT 0x41
#define MSCC_MAC_STATS_40BIT_TX_OUT_BYTES_MSB_CNT 0x42
#define MSCC_MAC_CFG_ENA_CFG_RX_CLK_ENA BIT(0)
#define MSCC_MAC_CFG_ENA_CFG_TX_CLK_ENA BIT(4)
#define MSCC_MAC_CFG_ENA_CFG_RX_SW_RST BIT(8)
#define MSCC_MAC_CFG_ENA_CFG_TX_SW_RST BIT(12)
#define MSCC_MAC_CFG_ENA_CFG_RX_ENA BIT(16)
#define MSCC_MAC_CFG_ENA_CFG_TX_ENA BIT(20)
#define MSCC_MAC_CFG_MODE_CFG_FORCE_CW_UPDATE_INTERVAL(x) ((x) << 20)
#define MSCC_MAC_CFG_MODE_CFG_FORCE_CW_UPDATE_INTERVAL_M GENMASK(29, 20)
#define MSCC_MAC_CFG_MODE_CFG_FORCE_CW_UPDATE BIT(16)
#define MSCC_MAC_CFG_MODE_CFG_TUNNEL_PAUSE_FRAMES BIT(14)
#define MSCC_MAC_CFG_MODE_CFG_MAC_PREAMBLE_CFG(x) ((x) << 10)
#define MSCC_MAC_CFG_MODE_CFG_MAC_PREAMBLE_CFG_M GENMASK(12, 10)
#define MSCC_MAC_CFG_MODE_CFG_MAC_IPG_CFG BIT(6)
#define MSCC_MAC_CFG_MODE_CFG_XGMII_GEN_MODE_ENA BIT(4)
#define MSCC_MAC_CFG_MODE_CFG_HIH_CRC_CHECK BIT(2)
#define MSCC_MAC_CFG_MODE_CFG_UNDERSIZED_FRAME_DROP_DIS BIT(1)
#define MSCC_MAC_CFG_MODE_CFG_DISABLE_DIC BIT(0)
#define MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN_TAG_CHK BIT(16)
#define MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN(x) (x)
#define MSCC_MAC_CFG_MAXLEN_CFG_MAX_LEN_M GENMASK(15, 0)
#define MSCC_MAC_CFG_TAGS_CFG_RSZ 0x4
#define MSCC_MAC_CFG_TAGS_CFG_TAG_ID(x) ((x) << 16)
#define MSCC_MAC_CFG_TAGS_CFG_TAG_ID_M GENMASK(31, 16)
#define MSCC_MAC_CFG_TAGS_CFG_TAG_ENA BIT(4)
#define MSCC_MAC_CFG_ADV_CHK_CFG_EXT_EOP_CHK_ENA BIT(24)
#define MSCC_MAC_CFG_ADV_CHK_CFG_EXT_SOP_CHK_ENA BIT(20)
#define MSCC_MAC_CFG_ADV_CHK_CFG_SFD_CHK_ENA BIT(16)
#define MSCC_MAC_CFG_ADV_CHK_CFG_PRM_SHK_CHK_DIS BIT(12)
#define MSCC_MAC_CFG_ADV_CHK_CFG_PRM_CHK_ENA BIT(8)
#define MSCC_MAC_CFG_ADV_CHK_CFG_OOR_ERR_ENA BIT(4)
#define MSCC_MAC_CFG_ADV_CHK_CFG_INR_ERR_ENA BIT(0)
#define MSCC_MAC_CFG_LFS_CFG_LFS_INH_TX BIT(8)
#define MSCC_MAC_CFG_LFS_CFG_LFS_DIS_TX BIT(4)
#define MSCC_MAC_CFG_LFS_CFG_LFS_UNIDIR_ENA BIT(3)
#define MSCC_MAC_CFG_LFS_CFG_USE_LEADING_EDGE_DETECT BIT(2)
#define MSCC_MAC_CFG_LFS_CFG_SPURIOUS_Q_DIS BIT(1)
#define MSCC_MAC_CFG_LFS_CFG_LFS_MODE_ENA BIT(0)
#define MSCC_MAC_CFG_LB_CFG_XGMII_HOST_LB_ENA BIT(4)
#define MSCC_MAC_CFG_LB_CFG_XGMII_PHY_LB_ENA BIT(0)
#define MSCC_MAC_CFG_PKTINF_CFG_STRIP_FCS_ENA BIT(0)
#define MSCC_MAC_CFG_PKTINF_CFG_INSERT_FCS_ENA BIT(4)
#define MSCC_MAC_CFG_PKTINF_CFG_STRIP_PREAMBLE_ENA BIT(8)
#define MSCC_MAC_CFG_PKTINF_CFG_INSERT_PREAMBLE_ENA BIT(12)
#define MSCC_MAC_CFG_PKTINF_CFG_LPI_RELAY_ENA BIT(16)
#define MSCC_MAC_CFG_PKTINF_CFG_LF_RELAY_ENA BIT(20)
#define MSCC_MAC_CFG_PKTINF_CFG_RF_RELAY_ENA BIT(24)
#define MSCC_MAC_CFG_PKTINF_CFG_ENABLE_TX_PADDING BIT(25)
#define MSCC_MAC_CFG_PKTINF_CFG_ENABLE_RX_PADDING BIT(26)
#define MSCC_MAC_CFG_PKTINF_CFG_ENABLE_4BYTE_PREAMBLE BIT(27)
#define MSCC_MAC_CFG_PKTINF_CFG_MACSEC_BYPASS_NUM_PTP_STALL_CLKS(x) ((x) << 28)
#define MSCC_MAC_CFG_PKTINF_CFG_MACSEC_BYPASS_NUM_PTP_STALL_CLKS_M GENMASK(30, 28)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_VALUE(x) ((x) << 16)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_VALUE_M GENMASK(31, 16)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_WAIT_FOR_LPI_LOW BIT(12)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_USE_PAUSE_STALL_ENA BIT(8)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_REPL_MODE BIT(4)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_FRC_FRAME BIT(2)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_MODE(x) (x)
#define MSCC_MAC_PAUSE_CFG_TX_FRAME_CTRL_PAUSE_MODE_M GENMASK(1, 0)
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_EARLY_PAUSE_DETECT_ENA BIT(16)
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PRE_CRC_MODE BIT(20)
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_TIMER_ENA BIT(12)
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_REACT_ENA BIT(8)
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_FRAME_DROP_ENA BIT(4)
#define MSCC_MAC_PAUSE_CFG_RX_FRAME_CTRL_PAUSE_MODE BIT(0)
#define MSCC_MAC_PAUSE_CFG_STATE_PAUSE_STATE BIT(0)
#define MSCC_MAC_PAUSE_CFG_STATE_MAC_TX_PAUSE_GEN BIT(4)
#define MSCC_PROC_IP_1588_TOP_CFG_STAT_MODE_CTL 0x2
#define MSCC_PROC_IP_1588_TOP_CFG_STAT_MODE_CTL_PROTOCOL_MODE(x) (x)
#define MSCC_PROC_IP_1588_TOP_CFG_STAT_MODE_CTL_PROTOCOL_MODE_M GENMASK(2, 0)
#endif /* _MSCC_PHY_LINE_MAC_H_ */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,323 @@
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Driver for Microsemi VSC85xx PHYs
*
* Copyright (c) 2020 Microsemi Corporation
*/
#ifndef _MSCC_PHY_MACSEC_H_
#define _MSCC_PHY_MACSEC_H_
#include <net/macsec.h>
#define MSCC_MS_MAX_FLOWS 16
#define CONTROL_TYPE_EGRESS 0x6
#define CONTROL_TYPE_INGRESS 0xf
#define CONTROL_IV0 BIT(5)
#define CONTROL_IV1 BIT(6)
#define CONTROL_IV2 BIT(7)
#define CONTROL_UPDATE_SEQ BIT(13)
#define CONTROL_IV_IN_SEQ BIT(14)
#define CONTROL_ENCRYPT_AUTH BIT(15)
#define CONTROL_KEY_IN_CTX BIT(16)
#define CONTROL_CRYPTO_ALG(x) ((x) << 17)
#define CTRYPTO_ALG_AES_CTR_128 0x5
#define CTRYPTO_ALG_AES_CTR_192 0x6
#define CTRYPTO_ALG_AES_CTR_256 0x7
#define CONTROL_DIGEST_TYPE(x) ((x) << 21)
#define CONTROL_AUTH_ALG(x) ((x) << 23)
#define AUTH_ALG_AES_GHAS 0x4
#define CONTROL_AN(x) ((x) << 26)
#define CONTROL_SEQ_TYPE(x) ((x) << 28)
#define CONTROL_SEQ_MASK BIT(30)
#define CONTROL_CONTEXT_ID BIT(31)
enum mscc_macsec_destination_ports {
MSCC_MS_PORT_COMMON = 0,
MSCC_MS_PORT_RSVD = 1,
MSCC_MS_PORT_CONTROLLED = 2,
MSCC_MS_PORT_UNCONTROLLED = 3,
};
enum mscc_macsec_drop_actions {
MSCC_MS_ACTION_BYPASS_CRC = 0,
MSCC_MS_ACTION_BYPASS_BAD = 1,
MSCC_MS_ACTION_DROP = 2,
MSCC_MS_ACTION_BYPASS = 3,
};
enum mscc_macsec_flow_types {
MSCC_MS_FLOW_BYPASS = 0,
MSCC_MS_FLOW_DROP = 1,
MSCC_MS_FLOW_INGRESS = 2,
MSCC_MS_FLOW_EGRESS = 3,
};
enum mscc_macsec_validate_levels {
MSCC_MS_VALIDATE_DISABLED = 0,
MSCC_MS_VALIDATE_CHECK = 1,
MSCC_MS_VALIDATE_STRICT = 2,
};
enum macsec_bank {
FC_BUFFER = 0x04,
HOST_MAC = 0x05,
LINE_MAC = 0x06,
PROC_0 = 0x0e,
PROC_2 = 0x0f,
MACSEC_INGR = 0x38,
MACSEC_EGR = 0x3c,
};
struct macsec_flow {
struct list_head list;
enum mscc_macsec_destination_ports port;
enum macsec_bank bank;
u32 index;
int assoc_num;
bool has_transformation;
/* Highest takes precedence [0..15] */
u8 priority;
union {
struct macsec_rx_sa *rx_sa;
struct macsec_tx_sa *tx_sa;
};
/* Matching */
struct {
u8 sci:1;
u8 tagged:1;
u8 untagged:1;
u8 etype:1;
} match;
u16 etype;
/* Action */
struct {
u8 bypass:1;
u8 drop:1;
} action;
};
#define MSCC_EXT_PAGE_MACSEC_17 17
#define MSCC_EXT_PAGE_MACSEC_18 18
#define MSCC_EXT_PAGE_MACSEC_19 19
#define MSCC_PHY_MACSEC_19_REG_ADDR(x) (x)
#define MSCC_PHY_MACSEC_19_TARGET(x) ((x) << 12)
#define MSCC_PHY_MACSEC_19_READ BIT(14)
#define MSCC_PHY_MACSEC_19_CMD BIT(15)
#define MSCC_EXT_PAGE_MACSEC_20 20
#define MSCC_PHY_MACSEC_20_TARGET(x) (x)
#define MSCC_MS_XFORM_REC(x, y) (((x) << 5) + (y))
#define MSCC_MS_ENA_CFG 0x800
#define MSCC_MS_FC_CFG 0x804
#define MSCC_MS_SAM_MAC_SA_MATCH_LO(x) (0x1000 + ((x) << 4))
#define MSCC_MS_SAM_MAC_SA_MATCH_HI(x) (0x1001 + ((x) << 4))
#define MSCC_MS_SAM_MISC_MATCH(x) (0x1004 + ((x) << 4))
#define MSCC_MS_SAM_MATCH_SCI_LO(x) (0x1005 + ((x) << 4))
#define MSCC_MS_SAM_MATCH_SCI_HI(x) (0x1006 + ((x) << 4))
#define MSCC_MS_SAM_MASK(x) (0x1007 + ((x) << 4))
#define MSCC_MS_SAM_ENTRY_SET1 0x1808
#define MSCC_MS_SAM_ENTRY_CLEAR1 0x180c
#define MSCC_MS_SAM_FLOW_CTRL(x) (0x1c00 + (x))
#define MSCC_MS_SAM_CP_TAG 0x1e40
#define MSCC_MS_SAM_NM_FLOW_NCP 0x1e51
#define MSCC_MS_SAM_NM_FLOW_CP 0x1e52
#define MSCC_MS_MISC_CONTROL 0x1e5f
#define MSCC_MS_COUNT_CONTROL 0x3204
#define MSCC_MS_PARAMS2_IG_CC_CONTROL 0x3a10
#define MSCC_MS_PARAMS2_IG_CP_TAG 0x3a14
#define MSCC_MS_VLAN_MTU_CHECK(x) (0x3c40 + (x))
#define MSCC_MS_NON_VLAN_MTU_CHECK 0x3c48
#define MSCC_MS_PP_CTRL 0x3c4b
#define MSCC_MS_STATUS_CONTEXT_CTRL 0x3d02
#define MSCC_MS_INTR_CTRL_STATUS 0x3d04
#define MSCC_MS_BLOCK_CTX_UPDATE 0x3d0c
#define MSCC_MS_AIC_CTRL 0x3e02
/* MACSEC_ENA_CFG */
#define MSCC_MS_ENA_CFG_CLK_ENA BIT(0)
#define MSCC_MS_ENA_CFG_SW_RST BIT(1)
#define MSCC_MS_ENA_CFG_MACSEC_BYPASS_ENA BIT(8)
#define MSCC_MS_ENA_CFG_MACSEC_ENA BIT(9)
#define MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE(x) ((x) << 10)
#define MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE_M GENMASK(12, 10)
/* MACSEC_FC_CFG */
#define MSCC_MS_FC_CFG_FCBUF_ENA BIT(0)
#define MSCC_MS_FC_CFG_USE_PKT_EXPANSION_INDICATION BIT(1)
#define MSCC_MS_FC_CFG_LOW_THRESH(x) ((x) << 4)
#define MSCC_MS_FC_CFG_LOW_THRESH_M GENMASK(7, 4)
#define MSCC_MS_FC_CFG_HIGH_THRESH(x) ((x) << 8)
#define MSCC_MS_FC_CFG_HIGH_THRESH_M GENMASK(11, 8)
#define MSCC_MS_FC_CFG_LOW_BYTES_VAL(x) ((x) << 12)
#define MSCC_MS_FC_CFG_LOW_BYTES_VAL_M GENMASK(14, 12)
#define MSCC_MS_FC_CFG_HIGH_BYTES_VAL(x) ((x) << 16)
#define MSCC_MS_FC_CFG_HIGH_BYTES_VAL_M GENMASK(18, 16)
/* MSCC_MS_SAM_MAC_SA_MATCH_HI */
#define MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE(x) ((x) << 16)
#define MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE_M GENMASK(31, 16)
/* MACSEC_SAM_MISC_MATCH */
#define MSCC_MS_SAM_MISC_MATCH_VLAN_VALID BIT(0)
#define MSCC_MS_SAM_MISC_MATCH_QINQ_FOUND BIT(1)
#define MSCC_MS_SAM_MISC_MATCH_STAG_VALID BIT(2)
#define MSCC_MS_SAM_MISC_MATCH_QTAG_VALID BIT(3)
#define MSCC_MS_SAM_MISC_MATCH_VLAN_UP(x) ((x) << 4)
#define MSCC_MS_SAM_MISC_MATCH_VLAN_UP_M GENMASK(6, 4)
#define MSCC_MS_SAM_MISC_MATCH_CONTROL_PACKET BIT(7)
#define MSCC_MS_SAM_MISC_MATCH_UNTAGGED BIT(8)
#define MSCC_MS_SAM_MISC_MATCH_TAGGED BIT(9)
#define MSCC_MS_SAM_MISC_MATCH_BAD_TAG BIT(10)
#define MSCC_MS_SAM_MISC_MATCH_KAY_TAG BIT(11)
#define MSCC_MS_SAM_MISC_MATCH_SOURCE_PORT(x) ((x) << 12)
#define MSCC_MS_SAM_MISC_MATCH_SOURCE_PORT_M GENMASK(13, 12)
#define MSCC_MS_SAM_MISC_MATCH_PRIORITY(x) ((x) << 16)
#define MSCC_MS_SAM_MISC_MATCH_PRIORITY_M GENMASK(19, 16)
#define MSCC_MS_SAM_MISC_MATCH_AN(x) ((x) << 24)
#define MSCC_MS_SAM_MISC_MATCH_TCI(x) ((x) << 26)
/* MACSEC_SAM_MASK */
#define MSCC_MS_SAM_MASK_MAC_SA_MASK(x) (x)
#define MSCC_MS_SAM_MASK_MAC_SA_MASK_M GENMASK(5, 0)
#define MSCC_MS_SAM_MASK_MAC_DA_MASK(x) ((x) << 6)
#define MSCC_MS_SAM_MASK_MAC_DA_MASK_M GENMASK(11, 6)
#define MSCC_MS_SAM_MASK_MAC_ETYPE_MASK BIT(12)
#define MSCC_MS_SAM_MASK_VLAN_VLD_MASK BIT(13)
#define MSCC_MS_SAM_MASK_QINQ_FOUND_MASK BIT(14)
#define MSCC_MS_SAM_MASK_STAG_VLD_MASK BIT(15)
#define MSCC_MS_SAM_MASK_QTAG_VLD_MASK BIT(16)
#define MSCC_MS_SAM_MASK_VLAN_UP_MASK BIT(17)
#define MSCC_MS_SAM_MASK_VLAN_ID_MASK BIT(18)
#define MSCC_MS_SAM_MASK_SOURCE_PORT_MASK BIT(19)
#define MSCC_MS_SAM_MASK_CTL_PACKET_MASK BIT(20)
#define MSCC_MS_SAM_MASK_VLAN_UP_INNER_MASK BIT(21)
#define MSCC_MS_SAM_MASK_VLAN_ID_INNER_MASK BIT(22)
#define MSCC_MS_SAM_MASK_SCI_MASK BIT(23)
#define MSCC_MS_SAM_MASK_AN_MASK(x) ((x) << 24)
#define MSCC_MS_SAM_MASK_TCI_MASK(x) ((x) << 26)
/* MACSEC_SAM_FLOW_CTRL_EGR */
#define MSCC_MS_SAM_FLOW_CTRL_FLOW_TYPE(x) (x)
#define MSCC_MS_SAM_FLOW_CTRL_FLOW_TYPE_M GENMASK(1, 0)
#define MSCC_MS_SAM_FLOW_CTRL_DEST_PORT(x) ((x) << 2)
#define MSCC_MS_SAM_FLOW_CTRL_DEST_PORT_M GENMASK(3, 2)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_4 BIT(4)
#define MSCC_MS_SAM_FLOW_CTRL_FLOW_CRYPT_AUTH BIT(5)
#define MSCC_MS_SAM_FLOW_CTRL_DROP_ACTION(x) ((x) << 6)
#define MSCC_MS_SAM_FLOW_CTRL_DROP_ACTION_M GENMASK(7, 6)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_15_TO_8(x) ((x) << 8)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_15_TO_8_M GENMASK(15, 8)
#define MSCC_MS_SAM_FLOW_CTRL_PROTECT_FRAME BIT(16)
#define MSCC_MS_SAM_FLOW_CTRL_REPLAY_PROTECT BIT(16)
#define MSCC_MS_SAM_FLOW_CTRL_SA_IN_USE BIT(17)
#define MSCC_MS_SAM_FLOW_CTRL_INCLUDE_SCI BIT(18)
#define MSCC_MS_SAM_FLOW_CTRL_USE_ES BIT(19)
#define MSCC_MS_SAM_FLOW_CTRL_USE_SCB BIT(20)
#define MSCC_MS_SAM_FLOW_CTRL_VALIDATE_FRAMES(x) ((x) << 19)
#define MSCC_MS_SAM_FLOW_CTRL_TAG_BYPASS_SIZE(x) ((x) << 21)
#define MSCC_MS_SAM_FLOW_CTRL_TAG_BYPASS_SIZE_M GENMASK(22, 21)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_23 BIT(23)
#define MSCC_MS_SAM_FLOW_CTRL_CONFIDENTIALITY_OFFSET(x) ((x) << 24)
#define MSCC_MS_SAM_FLOW_CTRL_CONFIDENTIALITY_OFFSET_M GENMASK(30, 24)
#define MSCC_MS_SAM_FLOW_CTRL_CONF_PROTECT BIT(31)
/* MACSEC_SAM_CP_TAG */
#define MSCC_MS_SAM_CP_TAG_MAP_TBL(x) (x)
#define MSCC_MS_SAM_CP_TAG_MAP_TBL_M GENMASK(23, 0)
#define MSCC_MS_SAM_CP_TAG_DEF_UP(x) ((x) << 24)
#define MSCC_MS_SAM_CP_TAG_DEF_UP_M GENMASK(26, 24)
#define MSCC_MS_SAM_CP_TAG_STAG_UP_EN BIT(27)
#define MSCC_MS_SAM_CP_TAG_QTAG_UP_EN BIT(28)
#define MSCC_MS_SAM_CP_TAG_PARSE_QINQ BIT(29)
#define MSCC_MS_SAM_CP_TAG_PARSE_STAG BIT(30)
#define MSCC_MS_SAM_CP_TAG_PARSE_QTAG BIT(31)
/* MACSEC_SAM_NM_FLOW_NCP */
#define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_FLOW_TYPE(x) (x)
#define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DEST_PORT(x) ((x) << 2)
#define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DROP_ACTION(x) ((x) << 6)
#define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_FLOW_TYPE(x) ((x) << 8)
#define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DEST_PORT(x) ((x) << 10)
#define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DROP_ACTION(x) ((x) << 14)
#define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_FLOW_TYPE(x) ((x) << 16)
#define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DEST_PORT(x) ((x) << 18)
#define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DROP_ACTION(x) ((x) << 22)
#define MSCC_MS_SAM_NM_FLOW_NCP_KAY_FLOW_TYPE(x) ((x) << 24)
#define MSCC_MS_SAM_NM_FLOW_NCP_KAY_DEST_PORT(x) ((x) << 26)
#define MSCC_MS_SAM_NM_FLOW_NCP_KAY_DROP_ACTION(x) ((x) << 30)
/* MACSEC_SAM_NM_FLOW_CP */
#define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_FLOW_TYPE(x) (x)
#define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DEST_PORT(x) ((x) << 2)
#define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DROP_ACTION(x) ((x) << 6)
#define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_FLOW_TYPE(x) ((x) << 8)
#define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DEST_PORT(x) ((x) << 10)
#define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DROP_ACTION(x) ((x) << 14)
#define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_FLOW_TYPE(x) ((x) << 16)
#define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DEST_PORT(x) ((x) << 18)
#define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DROP_ACTION(x) ((x) << 22)
#define MSCC_MS_SAM_NM_FLOW_CP_KAY_FLOW_TYPE(x) ((x) << 24)
#define MSCC_MS_SAM_NM_FLOW_CP_KAY_DEST_PORT(x) ((x) << 26)
#define MSCC_MS_SAM_NM_FLOW_CP_KAY_DROP_ACTION(x) ((x) << 30)
/* MACSEC_MISC_CONTROL */
#define MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX(x) (x)
#define MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX_M GENMASK(5, 0)
#define MSCC_MS_MISC_CONTROL_STATIC_BYPASS BIT(8)
#define MSCC_MS_MISC_CONTROL_NM_MACSEC_EN BIT(9)
#define MSCC_MS_MISC_CONTROL_VALIDATE_FRAMES(x) ((x) << 10)
#define MSCC_MS_MISC_CONTROL_VALIDATE_FRAMES_M GENMASK(11, 10)
#define MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE(x) ((x) << 24)
#define MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE_M GENMASK(25, 24)
/* MACSEC_COUNT_CONTROL */
#define MSCC_MS_COUNT_CONTROL_RESET_ALL BIT(0)
#define MSCC_MS_COUNT_CONTROL_DEBUG_ACCESS BIT(1)
#define MSCC_MS_COUNT_CONTROL_SATURATE_CNTRS BIT(2)
#define MSCC_MS_COUNT_CONTROL_AUTO_CNTR_RESET BIT(3)
/* MACSEC_PARAMS2_IG_CC_CONTROL */
#define MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_CTRL_ACT BIT(14)
#define MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_ACT BIT(15)
/* MACSEC_PARAMS2_IG_CP_TAG */
#define MSCC_MS_PARAMS2_IG_CP_TAG_MAP_TBL(x) (x)
#define MSCC_MS_PARAMS2_IG_CP_TAG_MAP_TBL_M GENMASK(23, 0)
#define MSCC_MS_PARAMS2_IG_CP_TAG_DEF_UP(x) ((x) << 24)
#define MSCC_MS_PARAMS2_IG_CP_TAG_DEF_UP_M GENMASK(26, 24)
#define MSCC_MS_PARAMS2_IG_CP_TAG_STAG_UP_EN BIT(27)
#define MSCC_MS_PARAMS2_IG_CP_TAG_QTAG_UP_EN BIT(28)
#define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QINQ BIT(29)
#define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_STAG BIT(30)
#define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QTAG BIT(31)
/* MACSEC_VLAN_MTU_CHECK */
#define MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE(x) (x)
#define MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE_M GENMASK(14, 0)
#define MSCC_MS_VLAN_MTU_CHECK_MTU_COMP_DROP BIT(15)
/* MACSEC_NON_VLAN_MTU_CHECK */
#define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE(x) (x)
#define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE_M GENMASK(14, 0)
#define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMP_DROP BIT(15)
/* MACSEC_PP_CTRL */
#define MSCC_MS_PP_CTRL_MACSEC_OCTET_INCR_MODE BIT(0)
/* MACSEC_INTR_CTRL_STATUS */
#define MSCC_MS_INTR_CTRL_STATUS_INTR_CLR_STATUS(x) (x)
#define MSCC_MS_INTR_CTRL_STATUS_INTR_CLR_STATUS_M GENMASK(15, 0)
#define MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE(x) ((x) << 16)
#define MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE_M GENMASK(31, 16)
#define MACSEC_INTR_CTRL_STATUS_ROLLOVER BIT(5)
#endif /* _MSCC_PHY_MACSEC_H_ */
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+473
View File
@@ -0,0 +1,473 @@
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Driver for Microsemi VSC85xx PHYs
*
* Copyright (c) 2020 Microsemi Corporation
*/
#ifndef _MSCC_PHY_PTP_H_
#define _MSCC_PHY_PTP_H_
/* 1588 page Registers */
#define MSCC_PHY_TS_BIU_ADDR_CNTL 16
#define BIU_ADDR_EXE 0x8000
#define BIU_ADDR_READ 0x4000
#define BIU_ADDR_WRITE 0x0000
#define BIU_BLK_ID(x) ((x) << 11)
#define BIU_CSR_ADDR(x) (x)
#define BIU_ADDR_CNT_MAX 8
#define MSCC_PHY_TS_CSR_DATA_LSB 17
#define MSCC_PHY_TS_CSR_DATA_MSB 18
#define MSCC_PHY_1588_INGR_VSC85XX_INT_STATUS 0x002d
#define MSCC_PHY_1588_VSC85XX_INT_STATUS 0x004d
#define VSC85XX_1588_INT_FIFO_ADD 0x0004
#define VSC85XX_1588_INT_FIFO_OVERFLOW 0x0001
#define MSCC_PHY_1588_INGR_VSC85XX_INT_MASK 0x002e
#define MSCC_PHY_1588_VSC85XX_INT_MASK 0x004e
#define VSC85XX_1588_INT_MASK_MASK (VSC85XX_1588_INT_FIFO_ADD | \
VSC85XX_1588_INT_FIFO_OVERFLOW)
/* TS CSR addresses */
#define MSCC_PHY_ANA_ETH1_NTX_PROT 0x0000
#define ANA_ETH1_NTX_PROT_SIG_OFF_MASK GENMASK(20, 16)
#define ANA_ETH1_NTX_PROT_SIG_OFF(x) (((x) << 16) & ANA_ETH1_NTX_PROT_SIG_OFF_MASK)
#define ANA_ETH1_NTX_PROT_COMPARATOR_MASK GENMASK(2, 0)
#define ANA_ETH1_NTX_PROT_PTP_OAM 0x0005
#define ANA_ETH1_NTX_PROT_MPLS 0x0004
#define ANA_ETH1_NTX_PROT_IP_UDP_ACH_2 0x0003
#define ANA_ETH1_NTX_PROT_IP_UDP_ACH_1 0x0002
#define ANA_ETH1_NTX_PROT_ETH2 0x0001
#define MSCC_PHY_PTP_IFACE_CTRL 0x0000
#define PTP_IFACE_CTRL_CLK_ENA 0x0040
#define PTP_IFACE_CTRL_INGR_BYPASS 0x0008
#define PTP_IFACE_CTRL_EGR_BYPASS 0x0004
#define PTP_IFACE_CTRL_MII_PROT 0x0003
#define PTP_IFACE_CTRL_GMII_PROT 0x0002
#define PTP_IFACE_CTRL_XGMII_64_PROT 0x0000
#define MSCC_PHY_ANA_ETH1_NTX_PROT_VLAN_TPID 0x0001
#define ANA_ETH1_NTX_PROT_VLAN_TPID_MASK GENMASK(31, 16)
#define ANA_ETH1_NTX_PROT_VLAN_TPID(x) (((x) << 16) & ANA_ETH1_NTX_PROT_VLAN_TPID_MASK)
#define MSCC_PHY_PTP_ANALYZER_MODE 0x0001
#define PTP_ANA_SPLIT_ENCAP_FLOW 0x1000000
#define PTP_ANA_EGR_ENCAP_FLOW_MODE_MASK GENMASK(22, 20)
#define PTP_ANA_EGR_ENCAP_FLOW_MODE(x) (((x) << 20) & PTP_ANA_EGR_ENCAP_FLOW_MODE_MASK)
#define PTP_ANA_INGR_ENCAP_FLOW_MODE_MASK GENMASK(18, 16)
#define PTP_ANA_INGR_ENCAP_FLOW_MODE(x) (((x) << 16) & PTP_ANA_INGR_ENCAP_FLOW_MODE_MASK)
#define PTP_ANALYZER_MODE_EGR_ENA_MASK GENMASK(6, 4)
#define PTP_ANALYZER_MODE_EGR_ENA(x) (((x) << 4) & PTP_ANALYZER_MODE_EGR_ENA_MASK)
#define PTP_ANALYZER_MODE_INGR_ENA_MASK GENMASK(2, 0)
#define PTP_ANALYZER_MODE_INGR_ENA(x) ((x) & PTP_ANALYZER_MODE_INGR_ENA_MASK)
#define MSCC_PHY_ANA_ETH1_NXT_PROT_TAG 0x0002
#define ANA_ETH1_NXT_PROT_TAG_ENA 0x0001
#define MSCC_PHY_PTP_MODE_CTRL 0x0002
#define PTP_MODE_CTRL_MODE_MASK GENMASK(2, 0)
#define PTP_MODE_CTRL_PKT_MODE 0x0004
#define MSCC_PHY_ANA_ETH1_NXT_PROT_ETYPE_MATCH 0x0003
#define ANA_ETH1_NXT_PROT_ETYPE_MATCH_ENA 0x10000
#define ANA_ETH1_NXT_PROT_ETYPE_MATCH_MASK GENMASK(15, 0)
#define ANA_ETH1_NXT_PROT_ETYPE_MATCH(x) ((x) & ANA_ETH1_NXT_PROT_ETYPE_MATCH_MASK)
#define MSCC_PHY_PTP_VERSION_CODE 0x0003
#define PTP_IP_VERSION_MASK GENMASK(7, 0)
#define PTP_IP_VERSION_2_1 0x0021
#define MSCC_ANA_ETH1_FLOW_ENA(x) (0x0010 + ((x) << 4))
#define ETH1_FLOW_ENA_CHANNEL_MASK_MASK GENMASK(9, 8)
#define ETH1_FLOW_ENA_CHANNEL_MASK(x) (((x) << 8) & ETH1_FLOW_ENA_CHANNEL_MASK_MASK)
#define ETH1_FLOW_VALID_CH1 ETH1_FLOW_ENA_CHANNEL_MASK(2)
#define ETH1_FLOW_VALID_CH0 ETH1_FLOW_ENA_CHANNEL_MASK(1)
#define ETH1_FLOW_ENA 0x0001
#define MSCC_ANA_ETH1_FLOW_MATCH_MODE(x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 1)
#define ANA_ETH1_FLOW_MATCH_VLAN_TAG_MASK GENMASK(7, 6)
#define ANA_ETH1_FLOW_MATCH_VLAN_TAG(x) (((x) << 6) & ANA_ETH1_FLOW_MATCH_VLAN_TAG_MASK)
#define ANA_ETH1_FLOW_MATCH_VLAN_TAG2 0x0200
#define ANA_ETH1_FLOW_MATCH_VLAN_VERIFY 0x0010
#define MSCC_ANA_ETH1_FLOW_ADDR_MATCH1(x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 2)
#define MSCC_ANA_ETH1_FLOW_ADDR_MATCH2(x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 3)
#define ANA_ETH1_FLOW_ADDR_MATCH2_MASK_MASK GENMASK(22, 20)
#define ANA_ETH1_FLOW_ADDR_MATCH2_ANY_MULTICAST 0x400000
#define ANA_ETH1_FLOW_ADDR_MATCH2_ANY_UNICAST 0x200000
#define ANA_ETH1_FLOW_ADDR_MATCH2_FULL_ADDR 0x100000
#define ANA_ETH1_FLOW_ADDR_MATCH2_SRC_DEST_MASK GENMASK(17, 16)
#define ANA_ETH1_FLOW_ADDR_MATCH2_SRC_DEST 0x020000
#define ANA_ETH1_FLOW_ADDR_MATCH2_SRC 0x010000
#define ANA_ETH1_FLOW_ADDR_MATCH2_DEST 0x000000
#define MSCC_ANA_ETH1_FLOW_VLAN_RANGE_I_TAG(x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 4)
#define MSCC_ANA_ETH1_FLOW_VLAN_TAG1(x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 5)
#define MSCC_ANA_ETH1_FLOW_VLAN_TAG2_I_TAG(x) (MSCC_ANA_ETH1_FLOW_ENA(x) + 6)
#define MSCC_PHY_PTP_LTC_CTRL 0x0010
#define PTP_LTC_CTRL_CLK_SEL_MASK GENMASK(14, 12)
#define PTP_LTC_CTRL_CLK_SEL(x) (((x) << 12) & PTP_LTC_CTRL_CLK_SEL_MASK)
#define PTP_LTC_CTRL_CLK_SEL_INTERNAL_250 PTP_LTC_CTRL_CLK_SEL(5)
#define PTP_LTC_CTRL_AUTO_ADJ_UPDATE 0x0010
#define PTP_LTC_CTRL_ADD_SUB_1NS_REQ 0x0008
#define PTP_LTC_CTRL_ADD_1NS 0x0004
#define PTP_LTC_CTRL_SAVE_ENA 0x0002
#define PTP_LTC_CTRL_LOAD_ENA 0x0001
#define MSCC_PHY_PTP_LTC_LOAD_SEC_MSB 0x0011
#define PTP_LTC_LOAD_SEC_MSB(x) (((x) & GENMASK_ULL(47, 32)) >> 32)
#define MSCC_PHY_PTP_LTC_LOAD_SEC_LSB 0x0012
#define PTP_LTC_LOAD_SEC_LSB(x) ((x) & GENMASK(31, 0))
#define MSCC_PHY_PTP_LTC_LOAD_NS 0x0013
#define PTP_LTC_LOAD_NS(x) ((x) & GENMASK(31, 0))
#define MSCC_PHY_PTP_LTC_SAVED_SEC_MSB 0x0014
#define MSCC_PHY_PTP_LTC_SAVED_SEC_LSB 0x0015
#define MSCC_PHY_PTP_LTC_SAVED_NS 0x0016
#define MSCC_PHY_PTP_LTC_SEQUENCE 0x0017
#define PTP_LTC_SEQUENCE_A_MASK GENMASK(3, 0)
#define PTP_LTC_SEQUENCE_A(x) ((x) & PTP_LTC_SEQUENCE_A_MASK)
#define MSCC_PHY_PTP_LTC_SEQ 0x0018
#define PTP_LTC_SEQ_ADD_SUB 0x80000
#define PTP_LTC_SEQ_ERR_MASK GENMASK(18, 0)
#define PTP_LTC_SEQ_ERR(x) ((x) & PTP_LTC_SEQ_ERR_MASK)
#define MSCC_PHY_PTP_LTC_AUTO_ADJ 0x001a
#define PTP_AUTO_ADJ_NS_ROLLOVER(x) ((x) & GENMASK(29, 0))
#define PTP_AUTO_ADJ_ADD_SUB_1NS_MASK GENMASK(31, 30)
#define PTP_AUTO_ADJ_SUB_1NS 0x80000000
#define PTP_AUTO_ADJ_ADD_1NS 0x40000000
#define MSCC_PHY_PTP_LTC_1PPS_WIDTH_ADJ 0x001b
#define PTP_LTC_1PPS_WIDTH_ADJ_MASK GENMASK(29, 0)
#define MSCC_PHY_PTP_TSTAMP_FIFO_SI 0x0020
#define PTP_TSTAMP_FIFO_SI_EN 0x0001
#define MSCC_PHY_PTP_INGR_PREDICTOR 0x0022
#define PTP_INGR_PREDICTOR_EN 0x0001
#define MSCC_PHY_PTP_EGR_PREDICTOR 0x0026
#define PTP_EGR_PREDICTOR_EN 0x0001
#define MSCC_PHY_PTP_INGR_TSP_CTRL 0x0035
#define PHY_PTP_INGR_TSP_CTRL_FRACT_NS 0x0004
#define PHY_PTP_INGR_TSP_CTRL_LOAD_DELAYS 0x0001
#define MSCC_PHY_PTP_INGR_LOCAL_LATENCY 0x0037
#define PTP_INGR_LOCAL_LATENCY_MASK GENMASK(22, 0)
#define PTP_INGR_LOCAL_LATENCY(x) ((x) & PTP_INGR_LOCAL_LATENCY_MASK)
#define MSCC_PHY_PTP_INGR_DELAY_FIFO 0x003a
#define PTP_INGR_DELAY_FIFO_DEPTH_MACSEC 0x0013
#define PTP_INGR_DELAY_FIFO_DEPTH_DEFAULT 0x000f
#define MSCC_PHY_PTP_INGR_TS_FIFO(x) (0x005c + (x))
#define PTP_INGR_TS_FIFO_EMPTY 0x80000000
#define MSCC_PHY_PTP_INGR_REWRITER_CTRL 0x0044
#define PTP_INGR_REWRITER_REDUCE_PREAMBLE 0x0010
#define PTP_INGR_REWRITER_FLAG_VAL 0x0008
#define PTP_INGR_REWRITER_FLAG_BIT_OFF_M GENMASK(2, 0)
#define PTP_INGR_REWRITER_FLAG_BIT_OFF(x) ((x) & PTP_INGR_REWRITER_FLAG_BIT_OFF_M)
#define MSCC_PHY_PTP_EGR_STALL_LATENCY 0x004f
#define MSCC_PHY_PTP_EGR_TSP_CTRL 0x0055
#define PHY_PTP_EGR_TSP_CTRL_FRACT_NS 0x0004
#define PHY_PTP_EGR_TSP_CTRL_LOAD_DELAYS 0x0001
#define MSCC_PHY_PTP_EGR_LOCAL_LATENCY 0x0057
#define PTP_EGR_LOCAL_LATENCY_MASK GENMASK(22, 0)
#define PTP_EGR_LOCAL_LATENCY(x) ((x) & PTP_EGR_LOCAL_LATENCY_MASK)
#define MSCC_PHY_PTP_EGR_DELAY_FIFO 0x005a
#define PTP_EGR_DELAY_FIFO_DEPTH_MACSEC 0x0013
#define PTP_EGR_DELAY_FIFO_DEPTH_DEFAULT 0x000f
#define MSCC_PHY_PTP_EGR_TS_FIFO_CTRL 0x005b
#define PTP_EGR_TS_FIFO_RESET 0x10000
#define PTP_EGR_FIFO_LEVEL_LAST_READ_MASK GENMASK(15, 12)
#define PTP_EGR_FIFO_LEVEL_LAST_READ(x) (((x) & PTP_EGR_FIFO_LEVEL_LAST_READ_MASK) >> 12)
#define PTP_EGR_TS_FIFO_THRESH_MASK GENMASK(11, 8)
#define PTP_EGR_TS_FIFO_THRESH(x) (((x) << 8) & PTP_EGR_TS_FIFO_THRESH_MASK)
#define PTP_EGR_TS_FIFO_SIG_BYTES_MASK GENMASK(4, 0)
#define PTP_EGR_TS_FIFO_SIG_BYTES(x) ((x) & PTP_EGR_TS_FIFO_SIG_BYTES_MASK)
#define MSCC_PHY_PTP_EGR_TS_FIFO(x) (0x005c + (x))
#define PTP_EGR_TS_FIFO_EMPTY 0x80000000
#define PTP_EGR_TS_FIFO_0_MASK GENMASK(15, 0)
#define MSCC_PHY_PTP_EGR_REWRITER_CTRL 0x0064
#define PTP_EGR_REWRITER_REDUCE_PREAMBLE 0x0010
#define PTP_EGR_REWRITER_FLAG_VAL 0x0008
#define PTP_EGR_REWRITER_FLAG_BIT_OFF_M GENMASK(2, 0)
#define PTP_EGR_REWRITER_FLAG_BIT_OFF(x) ((x) & PTP_EGR_REWRITER_FLAG_BIT_OFF_M)
#define MSCC_PHY_PTP_SERIAL_TOD_IFACE 0x006e
#define PTP_SERIAL_TOD_IFACE_LS_AUTO_CLR 0x0004
#define MSCC_PHY_PTP_LTC_OFFSET 0x0070
#define PTP_LTC_OFFSET_ADJ BIT(31)
#define PTP_LTC_OFFSET_ADD BIT(30)
#define PTP_LTC_OFFSET_VAL(x) (x)
#define MSCC_PHY_PTP_ACCUR_CFG_STATUS 0x0074
#define PTP_ACCUR_PPS_OUT_CALIB_ERR 0x20000
#define PTP_ACCUR_PPS_OUT_CALIB_DONE 0x10000
#define PTP_ACCUR_PPS_IN_CALIB_ERR 0x4000
#define PTP_ACCUR_PPS_IN_CALIB_DONE 0x2000
#define PTP_ACCUR_EGR_SOF_CALIB_ERR 0x1000
#define PTP_ACCUR_EGR_SOF_CALIB_DONE 0x0800
#define PTP_ACCUR_INGR_SOF_CALIB_ERR 0x0400
#define PTP_ACCUR_INGR_SOF_CALIB_DONE 0x0200
#define PTP_ACCUR_LOAD_SAVE_CALIB_ERR 0x0100
#define PTP_ACCUR_LOAD_SAVE_CALIB_DONE 0x0080
#define PTP_ACCUR_CALIB_TRIGG 0x0040
#define PTP_ACCUR_PPS_OUT_BYPASS 0x0010
#define PTP_ACCUR_PPS_IN_BYPASS 0x0008
#define PTP_ACCUR_EGR_SOF_BYPASS 0x0004
#define PTP_ACCUR_INGR_SOF_BYPASS 0x0002
#define PTP_ACCUR_LOAD_SAVE_BYPASS 0x0001
#define MSCC_PHY_ANA_ETH2_NTX_PROT 0x0090
#define ANA_ETH2_NTX_PROT_COMPARATOR_MASK GENMASK(2, 0)
#define ANA_ETH2_NTX_PROT_PTP_OAM 0x0005
#define ANA_ETH2_NTX_PROT_MPLS 0x0004
#define ANA_ETH2_NTX_PROT_IP_UDP_ACH_2 0x0003
#define ANA_ETH2_NTX_PROT_IP_UDP_ACH_1 0x0002
#define ANA_ETH2_NTX_PROT_ETH2 0x0001
#define MSCC_PHY_ANA_ETH2_NXT_PROT_ETYPE_MATCH 0x0003
#define ANA_ETH2_NXT_PROT_ETYPE_MATCH_ENA 0x10000
#define ANA_ETH2_NXT_PROT_ETYPE_MATCH_MASK GENMASK(15, 0)
#define ANA_ETH2_NXT_PROT_ETYPE_MATCH(x) ((x) & ANA_ETH2_NXT_PROT_ETYPE_MATCH_MASK)
#define MSCC_ANA_ETH2_FLOW_ENA(x) (0x00a0 + ((x) << 4))
#define ETH2_FLOW_ENA_CHANNEL_MASK_MASK GENMASK(9, 8)
#define ETH2_FLOW_ENA_CHANNEL_MASK(x) (((x) << 8) & ETH2_FLOW_ENA_CHANNEL_MASK_MASK)
#define ETH2_FLOW_VALID_CH1 ETH2_FLOW_ENA_CHANNEL_MASK(2)
#define ETH2_FLOW_VALID_CH0 ETH2_FLOW_ENA_CHANNEL_MASK(1)
#define MSCC_PHY_ANA_MPLS_COMP_NXT_COMP 0x0120
#define ANA_MPLS_NTX_PROT_COMPARATOR_MASK GENMASK(2, 0)
#define ANA_MPLS_NTX_PROT_PTP_OAM 0x0005
#define ANA_MPLS_NTX_PROT_MPLS 0x0004
#define ANA_MPLS_NTX_PROT_IP_UDP_ACH_2 0x0003
#define ANA_MPLS_NTX_PROT_IP_UDP_ACH_1 0x0002
#define ANA_MPLS_NTX_PROT_ETH2 0x0001
#define MSCC_ANA_MPLS_FLOW_CTRL(x) (0x0130 + ((x) << 4))
#define MPLS_FLOW_CTRL_CHANNEL_MASK_MASK GENMASK(25, 24)
#define MPLS_FLOW_CTRL_CHANNEL_MASK(x) (((x) << 24) & MPLS_FLOW_CTRL_CHANNEL_MASK_MASK)
#define MPLS_FLOW_VALID_CH1 MPLS_FLOW_CTRL_CHANNEL_MASK(2)
#define MPLS_FLOW_VALID_CH0 MPLS_FLOW_CTRL_CHANNEL_MASK(1)
#define MSCC_ANA_IP1_NXT_PROT_NXT_COMP 0x01b0
#define ANA_IP1_NXT_PROT_NXT_COMP_BYTES_HDR_MASK GENMASK(15, 8)
#define ANA_IP1_NXT_PROT_NXT_COMP_BYTES_HDR(x) (((x) << 8) & ANA_IP1_NXT_PROT_NXT_COMP_BYTES_HDR_MASK)
#define ANA_IP1_NXT_PROT_NXT_COMP_PTP_OAM 0x0005
#define ANA_IP1_NXT_PROT_NXT_COMP_IP_UDP_ACH2 0x0003
#define MSCC_ANA_IP1_NXT_PROT_IP1_MODE 0x01b1
#define ANA_IP1_NXT_PROT_FLOW_OFFSET_IPV4 0x0c00
#define ANA_IP1_NXT_PROT_FLOW_OFFSET_IPV6 0x0800
#define ANA_IP1_NXT_PROT_IPV6 0x0001
#define ANA_IP1_NXT_PROT_IPV4 0x0000
#define MSCC_ANA_IP1_NXT_PROT_IP_MATCH1 0x01b2
#define ANA_IP1_NXT_PROT_IP_MATCH1_PROT_OFF_MASK GENMASK(20, 16)
#define ANA_IP1_NXT_PROT_IP_MATCH1_PROT_OFF(x) (((x) << 16) & ANA_IP1_NXT_PROT_IP_MATCH1_PROT_OFF_MASK)
#define ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MASK_MASK GENMASK(15, 8)
#define ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MASK(x) (((x) << 15) & ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MASK_MASK)
#define ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MATCH_MASK GENMASK(7, 0)
#define ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MATCH(x) ((x) & ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MATCH_MASK)
#define MSCC_ANA_IP1_NXT_PROT_MATCH2_UPPER 0x01b3
#define MSCC_ANA_IP1_NXT_PROT_MATCH2_LOWER 0x01b4
#define MSCC_ANA_IP1_NXT_PROT_MASK2_UPPER 0x01b5
#define MSCC_ANA_IP1_NXT_PROT_MASK2_LOWER 0x01b6
#define MSCC_ANA_IP1_NXT_PROT_OFFSET2 0x01b7
#define ANA_IP1_NXT_PROT_OFFSET2_MASK GENMASK(6, 0)
#define ANA_IP1_NXT_PROT_OFFSET2(x) ((x) & ANA_IP1_NXT_PROT_OFFSET2_MASK)
#define MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM 0x01b8
#define IP1_NXT_PROT_UDP_CHKSUM_OFF_MASK GENMASK(15, 8)
#define IP1_NXT_PROT_UDP_CHKSUM_OFF(x) (((x) << 8) & IP1_NXT_PROT_UDP_CHKSUM_OFF_MASK)
#define IP1_NXT_PROT_UDP_CHKSUM_WIDTH_MASK GENMASK(5, 4)
#define IP1_NXT_PROT_UDP_CHKSUM_WIDTH(x) (((x) << 4) & IP1_NXT_PROT_UDP_CHKSUM_WIDTH_MASK)
#define IP1_NXT_PROT_UDP_CHKSUM_UPDATE 0x0002
#define IP1_NXT_PROT_UDP_CHKSUM_CLEAR 0x0001
#define MSCC_ANA_IP1_FLOW_ENA(x) (0x01c0 + ((x) << 4))
#define IP1_FLOW_MATCH_ADDR_MASK GENMASK(9, 8)
#define IP1_FLOW_MATCH_DEST_SRC_ADDR 0x0200
#define IP1_FLOW_MATCH_DEST_ADDR 0x0100
#define IP1_FLOW_MATCH_SRC_ADDR 0x0000
#define IP1_FLOW_ENA_CHANNEL_MASK_MASK GENMASK(5, 4)
#define IP1_FLOW_ENA_CHANNEL_MASK(x) (((x) << 4) & IP1_FLOW_ENA_CHANNEL_MASK_MASK)
#define IP1_FLOW_VALID_CH1 IP1_FLOW_ENA_CHANNEL_MASK(2)
#define IP1_FLOW_VALID_CH0 IP1_FLOW_ENA_CHANNEL_MASK(1)
#define IP1_FLOW_ENA 0x0001
#define MSCC_ANA_OAM_PTP_FLOW_ENA(x) (0x1e0 + ((x) << 4))
#define MSCC_ANA_OAM_PTP_FLOW_MATCH_LOWER(x) (MSCC_ANA_OAM_PTP_FLOW_ENA(x) + 2)
#define MSCC_ANA_OAM_PTP_FLOW_MASK_LOWER(x) (MSCC_ANA_OAM_PTP_FLOW_ENA(x) + 4)
#define MSCC_ANA_OAM_PTP_FLOW_PTP_0_FIELD(x) (MSCC_ANA_OAM_PTP_FLOW_ENA(x) + 8)
#define MSCC_ANA_IP1_FLOW_MATCH_UPPER(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 1)
#define MSCC_ANA_IP1_FLOW_MATCH_UPPER_MID(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 2)
#define MSCC_ANA_IP1_FLOW_MATCH_LOWER_MID(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 3)
#define MSCC_ANA_IP1_FLOW_MATCH_LOWER(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 4)
#define MSCC_ANA_IP1_FLOW_MASK_UPPER(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 5)
#define MSCC_ANA_IP1_FLOW_MASK_UPPER_MID(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 6)
#define MSCC_ANA_IP1_FLOW_MASK_LOWER_MID(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 7)
#define MSCC_ANA_IP1_FLOW_MASK_LOWER(x) (MSCC_ANA_IP1_FLOW_ENA(x) + 8)
#define MSCC_ANA_IP2_NXT_PROT_NXT_COMP 0x0240
#define ANA_IP2_NXT_PROT_NXT_COMP_BYTES_HDR_MASK GENMASK(15, 8)
#define ANA_IP2_NXT_PROT_NXT_COMP_BYTES_HDR(x) (((x) << 8) & ANA_IP2_NXT_PROT_NXT_COMP_BYTES_HDR_MASK)
#define ANA_IP2_NXT_PROT_NXT_COMP_PTP_OAM 0x0005
#define ANA_IP2_NXT_PROT_NXT_COMP_IP_UDP_ACH2 0x0003
#define MSCC_ANA_IP2_NXT_PROT_UDP_CHKSUM 0x0248
#define IP2_NXT_PROT_UDP_CHKSUM_OFF_MASK GENMASK(15, 8)
#define IP2_NXT_PROT_UDP_CHKSUM_OFF(x) (((x) << 8) & IP2_NXT_PROT_UDP_CHKSUM_OFF_MASK)
#define IP2_NXT_PROT_UDP_CHKSUM_WIDTH_MASK GENMASK(5, 4)
#define IP2_NXT_PROT_UDP_CHKSUM_WIDTH(x) (((x) << 4) & IP2_NXT_PROT_UDP_CHKSUM_WIDTH_MASK)
#define MSCC_ANA_IP2_FLOW_ENA(x) (0x0250 + ((x) << 4))
#define IP2_FLOW_ENA_CHANNEL_MASK_MASK GENMASK(5, 4)
#define IP2_FLOW_ENA_CHANNEL_MASK(x) (((x) << 4) & IP2_FLOW_ENA_CHANNEL_MASK_MASK)
#define IP2_FLOW_VALID_CH1 IP2_FLOW_ENA_CHANNEL_MASK(2)
#define IP2_FLOW_VALID_CH0 IP2_FLOW_ENA_CHANNEL_MASK(1)
#define MSCC_ANA_PTP_FLOW_ENA(x) (0x02d0 + ((x) << 4))
#define PTP_FLOW_ENA_CHANNEL_MASK_MASK GENMASK(5, 4)
#define PTP_FLOW_ENA_CHANNEL_MASK(x) (((x) << 4) & PTP_FLOW_ENA_CHANNEL_MASK_MASK)
#define PTP_FLOW_VALID_CH1 PTP_FLOW_ENA_CHANNEL_MASK(2)
#define PTP_FLOW_VALID_CH0 PTP_FLOW_ENA_CHANNEL_MASK(1)
#define PTP_FLOW_ENA 0x0001
#define MSCC_ANA_PTP_FLOW_MATCH_UPPER(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 1)
#define PTP_FLOW_MSG_TYPE_MASK 0x0F000000
#define PTP_FLOW_MSG_PDELAY_RESP 0x04000000
#define PTP_FLOW_MSG_PDELAY_REQ 0x02000000
#define PTP_FLOW_MSG_DELAY_REQ 0x01000000
#define PTP_FLOW_MSG_SYNC 0x00000000
#define MSCC_ANA_PTP_FLOW_MATCH_LOWER(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 2)
#define MSCC_ANA_PTP_FLOW_MASK_UPPER(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 3)
#define MSCC_ANA_PTP_FLOW_MASK_LOWER(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 4)
#define MSCC_ANA_PTP_FLOW_DOMAIN_RANGE(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 5)
#define PTP_FLOW_DOMAIN_RANGE_ENA 0x0001
#define MSCC_ANA_PTP_FLOW_PTP_ACTION(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 6)
#define PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_UPDATE 0x10000000
#define PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_BYTE_OFFSET_MASK GENMASK(26, 24)
#define PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_BYTE_OFFSET(x) (((x) << 24) & PTP_FLOW_PTP_ACTION_MOD_FRAME_STATUS_BYTE_OFFSET_MASK)
#define PTP_FLOW_PTP_ACTION_PTP_CMD_MASK GENMASK(3, 0)
#define PTP_FLOW_PTP_ACTION_PTP_CMD(x) ((x) & PTP_FLOW_PTP_ACTION_PTP_CMD_MASK)
#define PTP_FLOW_PTP_ACTION_SUB_DELAY_ASYM 0x00200000
#define PTP_FLOW_PTP_ACTION_ADD_DELAY_ASYM 0x00100000
#define PTP_FLOW_PTP_ACTION_TIME_OFFSET_MASK GENMASK(15, 10)
#define PTP_FLOW_PTP_ACTION_TIME_OFFSET(x) (((x) << 10) & PTP_FLOW_PTP_ACTION_TIME_OFFSET_MASK)
#define PTP_FLOW_PTP_ACTION_CORR_OFFSET_MASK GENMASK(9, 5)
#define PTP_FLOW_PTP_ACTION_CORR_OFFSET(x) (((x) << 5) & PTP_FLOW_PTP_ACTION_CORR_OFFSET_MASK)
#define PTP_FLOW_PTP_ACTION_SAVE_LOCAL_TIME 0x00000010
#define MSCC_ANA_PTP_FLOW_PTP_ACTION2(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 7)
#define PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET_MASK GENMASK(15, 8)
#define PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET(x) (((x) << 8) & PTP_FLOW_PTP_ACTION2_REWRITE_OFFSET_MASK)
#define PTP_FLOW_PTP_ACTION2_REWRITE_BYTES_MASK GENMASK(3, 0)
#define PTP_FLOW_PTP_ACTION2_REWRITE_BYTES(x) ((x) & PTP_FLOW_PTP_ACTION2_REWRITE_BYTES_MASK)
#define MSCC_ANA_PTP_FLOW_PTP_0_FIELD(x) (MSCC_ANA_PTP_FLOW_ENA(x) + 8)
#define PTP_FLOW_PTP_0_FIELD_PTP_FRAME 0x8000
#define PTP_FLOW_PTP_0_FIELD_RSVRD_CHECK 0x4000
#define PTP_FLOW_PTP_0_FIELD_OFFSET_MASK GENMASK(13, 8)
#define PTP_FLOW_PTP_0_FIELD_OFFSET(x) (((x) << 8) & PTP_FLOW_PTP_0_FIELD_OFFSET_MASK)
#define PTP_FLOW_PTP_0_FIELD_BYTES_MASK GENMASK(3, 0)
#define PTP_FLOW_PTP_0_FIELD_BYTES(x) ((x) & PTP_FLOW_PTP_0_FIELD_BYTES_MASK)
#define MSCC_ANA_PTP_IP_CHKSUM_SEL 0x0330
#define ANA_PTP_IP_CHKSUM_SEL_IP_COMP_2 0x0001
#define ANA_PTP_IP_CHKSUM_SEL_IP_COMP_1 0x0000
#define MSCC_PHY_ANA_FSB_CFG 0x331
#define ANA_FSB_ADDR_FROM_BLOCK_SEL_MASK GENMASK(1, 0)
#define ANA_FSB_ADDR_FROM_IP2 0x0003
#define ANA_FSB_ADDR_FROM_IP1 0x0002
#define ANA_FSB_ADDR_FROM_ETH2 0x0001
#define ANA_FSB_ADDR_FROM_ETH1 0x0000
#define MSCC_PHY_ANA_FSB_REG(x) (0x332 + (x))
#define COMP_MAX_FLOWS 8
#define PTP_COMP_MAX_FLOWS 6
#define PPS_WIDTH_ADJ 0x1dcd6500
#define STALL_EGR_LATENCY(x) (1536000 / (x))
/* PHC clock available frequencies. */
enum {
PHC_CLK_125MHZ,
PHC_CLK_156_25MHZ,
PHC_CLK_200MHZ,
PHC_CLK_250MHZ,
PHC_CLK_500MHZ,
};
enum ptp_cmd {
PTP_NOP = 0,
PTP_WRITE_1588 = 5,
PTP_WRITE_NS = 7,
PTP_SAVE_IN_TS_FIFO = 11, /* invalid when writing in reg */
};
struct vsc85xx_ptphdr {
u8 tsmt; /* transportSpecific | messageType */
u8 ver; /* reserved0 | versionPTP */
__be16 msglen;
u8 domain;
u8 rsrvd1;
__be16 flags;
__be64 correction;
__be32 rsrvd2;
__be64 clk_identity;
__be16 src_port_id;
__be16 seq_id;
u8 ctrl;
u8 log_interval;
} __attribute__((__packed__));
/* Represents an entry in the timestamping FIFO */
struct vsc85xx_ts_fifo {
u32 ns;
u64 secs:48;
u8 sig[16];
} __attribute__((__packed__));
struct vsc85xx_ptp {
struct phy_device *phydev;
struct ptp_clock *ptp_clock;
struct ptp_clock_info caps;
struct sk_buff_head tx_queue;
enum hwtstamp_tx_types tx_type;
enum hwtstamp_rx_filters rx_filter;
u8 configured:1;
};
#endif /* _MSCC_PHY_PTP_H_ */
@@ -0,0 +1,650 @@
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/*
* Driver for Microsemi VSC85xx PHYs
*
* Author: Bjarni Jonasson <bjarni.jonassoni@microchip.com>
* License: Dual MIT/GPL
* Copyright (c) 2021 Microsemi Corporation
*/
#include <linux/phy.h>
#include "mscc_serdes.h"
#include "mscc.h"
static int pll5g_detune(struct phy_device *phydev)
{
u32 rd_dat;
int ret;
rd_dat = vsc85xx_csr_read(phydev, MACRO_CTRL, PHY_S6G_PLL5G_CFG2);
rd_dat &= ~PHY_S6G_PLL5G_CFG2_GAIN_MASK;
rd_dat |= PHY_S6G_PLL5G_CFG2_ENA_GAIN;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_PLL5G_CFG2, rd_dat);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int pll5g_tune(struct phy_device *phydev)
{
u32 rd_dat;
int ret;
rd_dat = vsc85xx_csr_read(phydev, MACRO_CTRL, PHY_S6G_PLL5G_CFG2);
rd_dat &= ~PHY_S6G_PLL5G_CFG2_ENA_GAIN;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_PLL5G_CFG2, rd_dat);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_pll_cfg_wr(struct phy_device *phydev,
const u32 pll_ena_offs,
const u32 pll_fsm_ctrl_data,
const u32 pll_fsm_ena)
{
int ret;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_PLL_CFG,
(pll_fsm_ena << PHY_S6G_PLL_ENA_OFFS_POS) |
(pll_fsm_ctrl_data << PHY_S6G_PLL_FSM_CTRL_DATA_POS) |
(pll_ena_offs << PHY_S6G_PLL_FSM_ENA_POS));
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_common_cfg_wr(struct phy_device *phydev,
const u32 sys_rst,
const u32 ena_lane,
const u32 ena_loop,
const u32 qrate,
const u32 if_mode,
const u32 pwd_tx)
{
/* ena_loop = 8 for eloop */
/* = 4 for floop */
/* = 2 for iloop */
/* = 1 for ploop */
/* qrate = 1 for SGMII, 0 for QSGMII */
/* if_mode = 1 for SGMII, 3 for QSGMII */
int ret;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_COMMON_CFG,
(sys_rst << PHY_S6G_SYS_RST_POS) |
(ena_lane << PHY_S6G_ENA_LANE_POS) |
(ena_loop << PHY_S6G_ENA_LOOP_POS) |
(qrate << PHY_S6G_QRATE_POS) |
(if_mode << PHY_S6G_IF_MODE_POS));
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_des_cfg_wr(struct phy_device *phydev,
const u32 des_phy_ctrl,
const u32 des_mbtr_ctrl,
const u32 des_bw_hyst,
const u32 des_bw_ana,
const u32 des_cpmd_sel)
{
u32 reg_val;
int ret;
/* configurable terms */
reg_val = (des_phy_ctrl << PHY_S6G_DES_PHY_CTRL_POS) |
(des_mbtr_ctrl << PHY_S6G_DES_MBTR_CTRL_POS) |
(des_cpmd_sel << PHY_S6G_DES_CPMD_SEL_POS) |
(des_bw_hyst << PHY_S6G_DES_BW_HYST_POS) |
(des_bw_ana << PHY_S6G_DES_BW_ANA_POS);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_DES_CFG,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_ib_cfg0_wr(struct phy_device *phydev,
const u32 ib_rtrm_adj,
const u32 ib_sig_det_clk_sel,
const u32 ib_reg_pat_sel_offset,
const u32 ib_cal_ena)
{
u32 base_val;
u32 reg_val;
int ret;
/* constant terms */
base_val = 0x60a85837;
/* configurable terms */
reg_val = base_val | (ib_rtrm_adj << 25) |
(ib_sig_det_clk_sel << 16) |
(ib_reg_pat_sel_offset << 8) |
(ib_cal_ena << 3);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_IB_CFG0,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_ib_cfg1_wr(struct phy_device *phydev,
const u32 ib_tjtag,
const u32 ib_tsdet,
const u32 ib_scaly,
const u32 ib_frc_offset,
const u32 ib_filt_offset)
{
u32 ib_filt_val;
u32 reg_val = 0;
int ret;
/* constant terms */
ib_filt_val = 0xe0;
/* configurable terms */
reg_val = (ib_tjtag << 17) + (ib_tsdet << 12) + (ib_scaly << 8) +
ib_filt_val + (ib_filt_offset << 4) + (ib_frc_offset << 0);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_IB_CFG1,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_ib_cfg2_wr(struct phy_device *phydev,
const u32 ib_tinfv,
const u32 ib_tcalv,
const u32 ib_ureg)
{
u32 ib_cfg2_val;
u32 base_val;
int ret;
/* constant terms */
base_val = 0x0f878010;
/* configurable terms */
ib_cfg2_val = base_val | ((ib_tinfv) << 28) | ((ib_tcalv) << 5) |
(ib_ureg << 0);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_IB_CFG2,
ib_cfg2_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_ib_cfg3_wr(struct phy_device *phydev,
const u32 ib_ini_hp,
const u32 ib_ini_mid,
const u32 ib_ini_lp,
const u32 ib_ini_offset)
{
u32 reg_val;
int ret;
reg_val = (ib_ini_hp << 24) + (ib_ini_mid << 16) +
(ib_ini_lp << 8) + (ib_ini_offset << 0);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_IB_CFG3,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_ib_cfg4_wr(struct phy_device *phydev,
const u32 ib_max_hp,
const u32 ib_max_mid,
const u32 ib_max_lp,
const u32 ib_max_offset)
{
u32 reg_val;
int ret;
reg_val = (ib_max_hp << 24) + (ib_max_mid << 16) +
(ib_max_lp << 8) + (ib_max_offset << 0);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_IB_CFG4,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_misc_cfg_wr(struct phy_device *phydev,
const u32 lane_rst)
{
int ret;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_MISC_CFG,
lane_rst);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_gp_cfg_wr(struct phy_device *phydev, const u32 gp_cfg_val)
{
int ret;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_GP_CFG,
gp_cfg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_dft_cfg2_wr(struct phy_device *phydev,
const u32 rx_ji_ampl,
const u32 rx_step_freq,
const u32 rx_ji_ena,
const u32 rx_waveform_sel,
const u32 rx_freqoff_dir,
const u32 rx_freqoff_ena)
{
u32 reg_val;
int ret;
/* configurable terms */
reg_val = (rx_ji_ampl << 8) | (rx_step_freq << 4) |
(rx_ji_ena << 3) | (rx_waveform_sel << 2) |
(rx_freqoff_dir << 1) | rx_freqoff_ena;
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_IB_DFT_CFG2,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
static int vsc85xx_sd6g_dft_cfg0_wr(struct phy_device *phydev,
const u32 prbs_sel,
const u32 test_mode,
const u32 rx_dft_ena)
{
u32 reg_val;
int ret;
/* configurable terms */
reg_val = (prbs_sel << 20) | (test_mode << 16) | (rx_dft_ena << 2);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_DFT_CFG0,
reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
/* Access LCPLL Cfg_0 */
static int vsc85xx_pll5g_cfg0_wr(struct phy_device *phydev,
const u32 selbgv820)
{
u32 base_val;
u32 reg_val;
int ret;
/* constant terms */
base_val = 0x7036f145;
/* configurable terms */
reg_val = base_val | (selbgv820 << 23);
ret = vsc85xx_csr_write(phydev, MACRO_CTRL,
PHY_S6G_PLL5G_CFG0, reg_val);
if (ret)
dev_err(&phydev->mdio.dev, "%s: write error\n", __func__);
return ret;
}
int vsc85xx_sd6g_config_v2(struct phy_device *phydev)
{
u32 ib_sig_det_clk_sel_cal = 0;
u32 ib_sig_det_clk_sel_mm = 7;
u32 pll_fsm_ctrl_data = 60;
unsigned long deadline;
u32 des_bw_ana_val = 3;
u32 ib_tsdet_cal = 16;
u32 ib_tsdet_mm = 5;
u32 ib_rtrm_adj;
u32 if_mode = 1;
u32 gp_iter = 5;
u32 val32 = 0;
u32 qrate = 1;
u32 iter;
int val = 0;
int ret;
phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
/* Detune/Unlock LCPLL */
ret = pll5g_detune(phydev);
if (ret)
return ret;
/* 0. Reset RCPLL */
ret = vsc85xx_sd6g_pll_cfg_wr(phydev, 3, pll_fsm_ctrl_data, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_common_cfg_wr(phydev, 0, 0, 0, qrate, if_mode, 0);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_des_cfg_wr(phydev, 6, 2, 5, des_bw_ana_val, 0);
if (ret)
return ret;
/* 1. Configure sd6g for SGMII prior to sd6g_IB_CAL */
ib_rtrm_adj = 13;
ret = vsc85xx_sd6g_ib_cfg0_wr(phydev, ib_rtrm_adj, ib_sig_det_clk_sel_mm, 0, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg1_wr(phydev, 8, ib_tsdet_mm, 15, 0, 1);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg2_wr(phydev, 3, 13, 5);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg3_wr(phydev, 0, 31, 1, 31);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg4_wr(phydev, 63, 63, 2, 63);
if (ret)
return ret;
ret = vsc85xx_sd6g_common_cfg_wr(phydev, 1, 1, 0, qrate, if_mode, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_misc_cfg_wr(phydev, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 2. Start rcpll_fsm */
ret = vsc85xx_sd6g_pll_cfg_wr(phydev, 3, pll_fsm_ctrl_data, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
do {
usleep_range(500, 1000);
ret = phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
val32 = vsc85xx_csr_read(phydev, MACRO_CTRL,
PHY_S6G_PLL_STATUS);
/* wait for bit 12 to clear */
} while (time_before(jiffies, deadline) && (val32 & BIT(12)));
if (val32 & BIT(12))
return -ETIMEDOUT;
/* 4. Release digital reset and disable transmitter */
ret = vsc85xx_sd6g_misc_cfg_wr(phydev, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_common_cfg_wr(phydev, 1, 1, 0, qrate, if_mode, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 5. Apply a frequency offset on RX-side (using internal FoJi logic) */
ret = vsc85xx_sd6g_gp_cfg_wr(phydev, 768);
if (ret)
return ret;
ret = vsc85xx_sd6g_dft_cfg2_wr(phydev, 0, 2, 0, 0, 0, 1);
if (ret)
return ret;
ret = vsc85xx_sd6g_dft_cfg0_wr(phydev, 0, 0, 1);
if (ret)
return ret;
ret = vsc85xx_sd6g_des_cfg_wr(phydev, 6, 2, 5, des_bw_ana_val, 2);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 6. Prepare required settings for IBCAL */
ret = vsc85xx_sd6g_ib_cfg1_wr(phydev, 8, ib_tsdet_cal, 15, 1, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg0_wr(phydev, ib_rtrm_adj, ib_sig_det_clk_sel_cal, 0, 0);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 7. Start IB_CAL */
ret = vsc85xx_sd6g_ib_cfg0_wr(phydev, ib_rtrm_adj,
ib_sig_det_clk_sel_cal, 0, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 11 cycles (for ViperA) or 5 cycles (for ViperB & Elise) w/ SW clock */
for (iter = 0; iter < gp_iter; iter++) {
/* set gp(0) */
ret = vsc85xx_sd6g_gp_cfg_wr(phydev, 769);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* clear gp(0) */
ret = vsc85xx_sd6g_gp_cfg_wr(phydev, 768);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
}
ret = vsc85xx_sd6g_ib_cfg1_wr(phydev, 8, ib_tsdet_cal, 15, 1, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg1_wr(phydev, 8, ib_tsdet_cal, 15, 0, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 8. Wait for IB cal to complete */
deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
do {
usleep_range(500, 1000);
ret = phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
val32 = vsc85xx_csr_read(phydev, MACRO_CTRL,
PHY_S6G_IB_STATUS0);
/* wait for bit 8 to set */
} while (time_before(jiffies, deadline) && (~val32 & BIT(8)));
if (~val32 & BIT(8))
return -ETIMEDOUT;
/* 9. Restore cfg values for mission mode */
ret = vsc85xx_sd6g_ib_cfg0_wr(phydev, ib_rtrm_adj, ib_sig_det_clk_sel_mm, 0, 1);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg1_wr(phydev, 8, ib_tsdet_mm, 15, 0, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 10. Re-enable transmitter */
ret = vsc85xx_sd6g_common_cfg_wr(phydev, 1, 1, 0, qrate, if_mode, 0);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 11. Disable frequency offset generation (using internal FoJi logic) */
ret = vsc85xx_sd6g_dft_cfg2_wr(phydev, 0, 0, 0, 0, 0, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_dft_cfg0_wr(phydev, 0, 0, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_des_cfg_wr(phydev, 6, 2, 5, des_bw_ana_val, 0);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* Tune/Re-lock LCPLL */
ret = pll5g_tune(phydev);
if (ret)
return ret;
/* 12. Configure for Final Configuration and Settings */
/* a. Reset RCPLL */
ret = vsc85xx_sd6g_pll_cfg_wr(phydev, 3, pll_fsm_ctrl_data, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_common_cfg_wr(phydev, 0, 1, 0, qrate, if_mode, 0);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* b. Configure sd6g for desired operating mode */
phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_EXTENDED_GPIO);
ret = phy_base_read(phydev, MSCC_PHY_MAC_CFG_FASTLINK);
if ((ret & MAC_CFG_MASK) == MAC_CFG_QSGMII) {
/* QSGMII */
pll_fsm_ctrl_data = 120;
qrate = 0;
if_mode = 3;
des_bw_ana_val = 5;
val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT |
PROC_CMD_READ_MOD_WRITE_PORT | PROC_CMD_QSGMII_MAC;
ret = vsc8584_cmd(phydev, val);
if (ret) {
dev_err(&phydev->mdio.dev, "%s: QSGMII error: %d\n",
__func__, ret);
return ret;
}
phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
} else if ((ret & MAC_CFG_MASK) == MAC_CFG_SGMII) {
/* SGMII */
pll_fsm_ctrl_data = 60;
qrate = 1;
if_mode = 1;
des_bw_ana_val = 3;
val = PROC_CMD_MCB_ACCESS_MAC_CONF | PROC_CMD_RST_CONF_PORT |
PROC_CMD_READ_MOD_WRITE_PORT | PROC_CMD_SGMII_MAC;
ret = vsc8584_cmd(phydev, val);
if (ret) {
dev_err(&phydev->mdio.dev, "%s: SGMII error: %d\n",
__func__, ret);
return ret;
}
phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD);
} else {
dev_err(&phydev->mdio.dev, "%s: invalid mac_if: %x\n",
__func__, ret);
}
ret = phy_update_mcb_s6g(phydev, PHY_S6G_LCPLL_CFG, 0);
if (ret)
return ret;
ret = phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
ret = vsc85xx_pll5g_cfg0_wr(phydev, 4);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_S6G_LCPLL_CFG, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_des_cfg_wr(phydev, 6, 2, 5, des_bw_ana_val, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg0_wr(phydev, ib_rtrm_adj, ib_sig_det_clk_sel_mm, 0, 1);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg1_wr(phydev, 8, ib_tsdet_mm, 15, 0, 1);
if (ret)
return ret;
ret = vsc85xx_sd6g_common_cfg_wr(phydev, 1, 1, 0, qrate, if_mode, 0);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg2_wr(phydev, 3, 13, 5);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg3_wr(phydev, 0, 31, 1, 31);
if (ret)
return ret;
ret = vsc85xx_sd6g_ib_cfg4_wr(phydev, 63, 63, 2, 63);
if (ret)
return ret;
ret = vsc85xx_sd6g_misc_cfg_wr(phydev, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 13. Start rcpll_fsm */
ret = vsc85xx_sd6g_pll_cfg_wr(phydev, 3, pll_fsm_ctrl_data, 1);
if (ret)
return ret;
ret = phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
/* 14. Wait for PLL cal to complete */
deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
do {
usleep_range(500, 1000);
ret = phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
if (ret)
return ret;
val32 = vsc85xx_csr_read(phydev, MACRO_CTRL,
PHY_S6G_PLL_STATUS);
/* wait for bit 12 to clear */
} while (time_before(jiffies, deadline) && (val32 & BIT(12)));
if (val32 & BIT(12))
return -ETIMEDOUT;
/* release lane reset */
ret = vsc85xx_sd6g_misc_cfg_wr(phydev, 0);
if (ret)
return ret;
return phy_commit_mcb_s6g(phydev, PHY_MCB_S6G_CFG, 0);
}
@@ -0,0 +1,31 @@
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
* Driver for Microsemi VSC85xx PHYs
*
* Copyright (c) 2021 Microsemi Corporation
*/
#ifndef _MSCC_SERDES_PHY_H_
#define _MSCC_SERDES_PHY_H_
#define PHY_S6G_PLL5G_CFG2_GAIN_MASK GENMASK(9, 5)
#define PHY_S6G_PLL5G_CFG2_ENA_GAIN 1
#define PHY_S6G_DES_PHY_CTRL_POS 13
#define PHY_S6G_DES_MBTR_CTRL_POS 10
#define PHY_S6G_DES_CPMD_SEL_POS 8
#define PHY_S6G_DES_BW_HYST_POS 5
#define PHY_S6G_DES_BW_ANA_POS 1
#define PHY_S6G_DES_CFG 0x21
#define PHY_S6G_IB_CFG0 0x22
#define PHY_S6G_IB_CFG1 0x23
#define PHY_S6G_IB_CFG2 0x24
#define PHY_S6G_IB_CFG3 0x25
#define PHY_S6G_IB_CFG4 0x26
#define PHY_S6G_GP_CFG 0x2E
#define PHY_S6G_DFT_CFG0 0x35
#define PHY_S6G_IB_DFT_CFG2 0x37
int vsc85xx_sd6g_config_v2(struct phy_device *phydev);
#endif /* _MSCC_PHY_SERDES_H_ */