ice: Introduce ETH56G PHY model for E825C products
E825C products feature a new PHY model - ETH56G. Introduces all necessary PHY definitions, functions etc. for ETH56G PHY, analogous to E82X and E810 ones with addition of a few HW-specific functionalities for ETH56G like one-step timestamping. It ensures correct PTP initialization and operation for E825C products. Co-developed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Co-developed-by: Michal Michalik <michal.michalik@intel.com> Signed-off-by: Michal Michalik <michal.michalik@intel.com> Signed-off-by: Sergey Temerkhanov <sergey.temerkhanov@intel.com> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com> Reviewed-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> Co-developed-by: Karol Kolacinski <karol.kolacinski@intel.com> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com> Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Link: https://lore.kernel.org/r/20240528-next-2024-05-28-ptp-refactors-v1-7-c082739bb6f6@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1f374d57c3
commit
7cab44f1c3
9 changed files with 2613 additions and 154 deletions
|
@ -3067,11 +3067,13 @@ bool ice_is_100m_speed_supported(struct ice_hw *hw)
|
||||||
* Note: In the structure of [phy_type_low, phy_type_high], there should
|
* Note: In the structure of [phy_type_low, phy_type_high], there should
|
||||||
* be one bit set, as this function will convert one PHY type to its
|
* be one bit set, as this function will convert one PHY type to its
|
||||||
* speed.
|
* speed.
|
||||||
* If no bit gets set, ICE_AQ_LINK_SPEED_UNKNOWN will be returned
|
*
|
||||||
* If more than one bit gets set, ICE_AQ_LINK_SPEED_UNKNOWN will be returned
|
* Return:
|
||||||
|
* * PHY speed for recognized PHY type
|
||||||
|
* * If no bit gets set, ICE_AQ_LINK_SPEED_UNKNOWN will be returned
|
||||||
|
* * If more than one bit gets set, ICE_AQ_LINK_SPEED_UNKNOWN will be returned
|
||||||
*/
|
*/
|
||||||
static u16
|
u16 ice_get_link_speed_based_on_phy_type(u64 phy_type_low, u64 phy_type_high)
|
||||||
ice_get_link_speed_based_on_phy_type(u64 phy_type_low, u64 phy_type_high)
|
|
||||||
{
|
{
|
||||||
u16 speed_phy_type_high = ICE_AQ_LINK_SPEED_UNKNOWN;
|
u16 speed_phy_type_high = ICE_AQ_LINK_SPEED_UNKNOWN;
|
||||||
u16 speed_phy_type_low = ICE_AQ_LINK_SPEED_UNKNOWN;
|
u16 speed_phy_type_low = ICE_AQ_LINK_SPEED_UNKNOWN;
|
||||||
|
|
|
@ -262,6 +262,7 @@ int
|
||||||
ice_aq_get_gpio(struct ice_hw *hw, u16 gpio_ctrl_handle, u8 pin_idx,
|
ice_aq_get_gpio(struct ice_hw *hw, u16 gpio_ctrl_handle, u8 pin_idx,
|
||||||
bool *value, struct ice_sq_cd *cd);
|
bool *value, struct ice_sq_cd *cd);
|
||||||
bool ice_is_100m_speed_supported(struct ice_hw *hw);
|
bool ice_is_100m_speed_supported(struct ice_hw *hw);
|
||||||
|
u16 ice_get_link_speed_based_on_phy_type(u64 phy_type_low, u64 phy_type_high);
|
||||||
int
|
int
|
||||||
ice_aq_set_lldp_mib(struct ice_hw *hw, u8 mib_type, void *buf, u16 buf_size,
|
ice_aq_set_lldp_mib(struct ice_hw *hw, u8 mib_type, void *buf, u16 buf_size,
|
||||||
struct ice_sq_cd *cd);
|
struct ice_sq_cd *cd);
|
||||||
|
|
|
@ -1011,6 +1011,28 @@ ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx)
|
||||||
tx->len = 0;
|
tx->len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ice_ptp_init_tx_eth56g - Initialize tracking for Tx timestamps
|
||||||
|
* @pf: Board private structure
|
||||||
|
* @tx: the Tx tracking structure to initialize
|
||||||
|
* @port: the port this structure tracks
|
||||||
|
*
|
||||||
|
* Initialize the Tx timestamp tracker for this port. ETH56G PHYs
|
||||||
|
* have independent memory blocks for all ports.
|
||||||
|
*
|
||||||
|
* Return: 0 for success, -ENOMEM when failed to allocate Tx tracker
|
||||||
|
*/
|
||||||
|
static int ice_ptp_init_tx_eth56g(struct ice_pf *pf, struct ice_ptp_tx *tx,
|
||||||
|
u8 port)
|
||||||
|
{
|
||||||
|
tx->block = port;
|
||||||
|
tx->offset = 0;
|
||||||
|
tx->len = INDEX_PER_PORT_ETH56G;
|
||||||
|
tx->has_ready_bitmap = 1;
|
||||||
|
|
||||||
|
return ice_ptp_alloc_tx_tracker(tx);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ice_ptp_init_tx_e82x - Initialize tracking for Tx timestamps
|
* ice_ptp_init_tx_e82x - Initialize tracking for Tx timestamps
|
||||||
* @pf: Board private structure
|
* @pf: Board private structure
|
||||||
|
@ -1341,10 +1363,19 @@ ice_ptp_port_phy_stop(struct ice_ptp_port *ptp_port)
|
||||||
|
|
||||||
mutex_lock(&ptp_port->ps_lock);
|
mutex_lock(&ptp_port->ps_lock);
|
||||||
|
|
||||||
kthread_cancel_delayed_work_sync(&ptp_port->ov_work);
|
switch (hw->ptp.phy_model) {
|
||||||
|
case ICE_PHY_ETH56G:
|
||||||
|
err = ice_stop_phy_timer_eth56g(hw, port, true);
|
||||||
|
break;
|
||||||
|
case ICE_PHY_E82X:
|
||||||
|
kthread_cancel_delayed_work_sync(&ptp_port->ov_work);
|
||||||
|
|
||||||
err = ice_stop_phy_timer_e82x(hw, port, true);
|
err = ice_stop_phy_timer_e82x(hw, port, true);
|
||||||
if (err)
|
break;
|
||||||
|
default:
|
||||||
|
err = -ENODEV;
|
||||||
|
}
|
||||||
|
if (err && err != -EBUSY)
|
||||||
dev_err(ice_pf_to_dev(pf), "PTP failed to set PHY port %d down, err %d\n",
|
dev_err(ice_pf_to_dev(pf), "PTP failed to set PHY port %d down, err %d\n",
|
||||||
port, err);
|
port, err);
|
||||||
|
|
||||||
|
@ -1378,27 +1409,39 @@ ice_ptp_port_phy_restart(struct ice_ptp_port *ptp_port)
|
||||||
|
|
||||||
mutex_lock(&ptp_port->ps_lock);
|
mutex_lock(&ptp_port->ps_lock);
|
||||||
|
|
||||||
kthread_cancel_delayed_work_sync(&ptp_port->ov_work);
|
switch (hw->ptp.phy_model) {
|
||||||
|
case ICE_PHY_ETH56G:
|
||||||
|
err = ice_start_phy_timer_eth56g(hw, port);
|
||||||
|
break;
|
||||||
|
case ICE_PHY_E82X:
|
||||||
|
/* Start the PHY timer in Vernier mode */
|
||||||
|
kthread_cancel_delayed_work_sync(&ptp_port->ov_work);
|
||||||
|
|
||||||
/* temporarily disable Tx timestamps while calibrating PHY offset */
|
/* temporarily disable Tx timestamps while calibrating
|
||||||
spin_lock_irqsave(&ptp_port->tx.lock, flags);
|
* PHY offset
|
||||||
ptp_port->tx.calibrating = true;
|
*/
|
||||||
spin_unlock_irqrestore(&ptp_port->tx.lock, flags);
|
spin_lock_irqsave(&ptp_port->tx.lock, flags);
|
||||||
ptp_port->tx_fifo_busy_cnt = 0;
|
ptp_port->tx.calibrating = true;
|
||||||
|
spin_unlock_irqrestore(&ptp_port->tx.lock, flags);
|
||||||
|
ptp_port->tx_fifo_busy_cnt = 0;
|
||||||
|
|
||||||
/* Start the PHY timer in Vernier mode */
|
/* Start the PHY timer in Vernier mode */
|
||||||
err = ice_start_phy_timer_e82x(hw, port);
|
err = ice_start_phy_timer_e82x(hw, port);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_unlock;
|
break;
|
||||||
|
|
||||||
/* Enable Tx timestamps right away */
|
/* Enable Tx timestamps right away */
|
||||||
spin_lock_irqsave(&ptp_port->tx.lock, flags);
|
spin_lock_irqsave(&ptp_port->tx.lock, flags);
|
||||||
ptp_port->tx.calibrating = false;
|
ptp_port->tx.calibrating = false;
|
||||||
spin_unlock_irqrestore(&ptp_port->tx.lock, flags);
|
spin_unlock_irqrestore(&ptp_port->tx.lock, flags);
|
||||||
|
|
||||||
kthread_queue_delayed_work(pf->ptp.kworker, &ptp_port->ov_work, 0);
|
kthread_queue_delayed_work(pf->ptp.kworker, &ptp_port->ov_work,
|
||||||
|
0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
err = -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
out_unlock:
|
|
||||||
if (err)
|
if (err)
|
||||||
dev_err(ice_pf_to_dev(pf), "PTP failed to set PHY port %d up, err %d\n",
|
dev_err(ice_pf_to_dev(pf), "PTP failed to set PHY port %d up, err %d\n",
|
||||||
port, err);
|
port, err);
|
||||||
|
@ -1436,6 +1479,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)
|
||||||
case ICE_PHY_E810:
|
case ICE_PHY_E810:
|
||||||
/* Do not reconfigure E810 PHY */
|
/* Do not reconfigure E810 PHY */
|
||||||
return;
|
return;
|
||||||
|
case ICE_PHY_ETH56G:
|
||||||
case ICE_PHY_E82X:
|
case ICE_PHY_E82X:
|
||||||
ice_ptp_port_phy_restart(ptp_port);
|
ice_ptp_port_phy_restart(ptp_port);
|
||||||
return;
|
return;
|
||||||
|
@ -1465,6 +1509,22 @@ static int ice_ptp_cfg_phy_interrupt(struct ice_pf *pf, bool ena, u32 threshold)
|
||||||
ice_ptp_reset_ts_memory(hw);
|
ice_ptp_reset_ts_memory(hw);
|
||||||
|
|
||||||
switch (hw->ptp.phy_model) {
|
switch (hw->ptp.phy_model) {
|
||||||
|
case ICE_PHY_ETH56G: {
|
||||||
|
int port;
|
||||||
|
|
||||||
|
for (port = 0; port < hw->ptp.num_lports; port++) {
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = ice_phy_cfg_intr_eth56g(hw, port, ena, threshold);
|
||||||
|
if (err) {
|
||||||
|
dev_err(dev, "Failed to configure PHY interrupt for port %d, err %d\n",
|
||||||
|
port, err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case ICE_PHY_E82X: {
|
case ICE_PHY_E82X: {
|
||||||
int quad;
|
int quad;
|
||||||
|
|
||||||
|
@ -3075,6 +3135,9 @@ static int ice_ptp_init_port(struct ice_pf *pf, struct ice_ptp_port *ptp_port)
|
||||||
mutex_init(&ptp_port->ps_lock);
|
mutex_init(&ptp_port->ps_lock);
|
||||||
|
|
||||||
switch (hw->ptp.phy_model) {
|
switch (hw->ptp.phy_model) {
|
||||||
|
case ICE_PHY_ETH56G:
|
||||||
|
return ice_ptp_init_tx_eth56g(pf, &ptp_port->tx,
|
||||||
|
ptp_port->port_num);
|
||||||
case ICE_PHY_E810:
|
case ICE_PHY_E810:
|
||||||
return ice_ptp_init_tx_e810(pf, &ptp_port->tx);
|
return ice_ptp_init_tx_e810(pf, &ptp_port->tx);
|
||||||
case ICE_PHY_E82X:
|
case ICE_PHY_E82X:
|
||||||
|
|
|
@ -153,6 +153,7 @@ struct ice_ptp_tx {
|
||||||
#define INDEX_PER_QUAD 64
|
#define INDEX_PER_QUAD 64
|
||||||
#define INDEX_PER_PORT_E82X 16
|
#define INDEX_PER_PORT_E82X 16
|
||||||
#define INDEX_PER_PORT_E810 64
|
#define INDEX_PER_PORT_E810 64
|
||||||
|
#define INDEX_PER_PORT_ETH56G 64
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ice_ptp_port - data used to initialize an external port for PTP
|
* struct ice_ptp_port - data used to initialize an external port for PTP
|
||||||
|
|
|
@ -9,6 +9,321 @@
|
||||||
*/
|
*/
|
||||||
/* Constants defined for the PTP 1588 clock hardware. */
|
/* Constants defined for the PTP 1588 clock hardware. */
|
||||||
|
|
||||||
|
const struct ice_phy_reg_info_eth56g eth56g_phy_res[NUM_ETH56G_PHY_RES] = {
|
||||||
|
/* ETH56G_PHY_REG_PTP */
|
||||||
|
{
|
||||||
|
/* base_addr */
|
||||||
|
{
|
||||||
|
0x092000,
|
||||||
|
0x126000,
|
||||||
|
0x1BA000,
|
||||||
|
0x24E000,
|
||||||
|
0x2E2000,
|
||||||
|
},
|
||||||
|
/* step */
|
||||||
|
0x98,
|
||||||
|
},
|
||||||
|
/* ETH56G_PHY_MEM_PTP */
|
||||||
|
{
|
||||||
|
/* base_addr */
|
||||||
|
{
|
||||||
|
0x093000,
|
||||||
|
0x127000,
|
||||||
|
0x1BB000,
|
||||||
|
0x24F000,
|
||||||
|
0x2E3000,
|
||||||
|
},
|
||||||
|
/* step */
|
||||||
|
0x200,
|
||||||
|
},
|
||||||
|
/* ETH56G_PHY_REG_XPCS */
|
||||||
|
{
|
||||||
|
/* base_addr */
|
||||||
|
{
|
||||||
|
0x000000,
|
||||||
|
0x009400,
|
||||||
|
0x128000,
|
||||||
|
0x1BC000,
|
||||||
|
0x250000,
|
||||||
|
},
|
||||||
|
/* step */
|
||||||
|
0x21000,
|
||||||
|
},
|
||||||
|
/* ETH56G_PHY_REG_MAC */
|
||||||
|
{
|
||||||
|
/* base_addr */
|
||||||
|
{
|
||||||
|
0x085000,
|
||||||
|
0x119000,
|
||||||
|
0x1AD000,
|
||||||
|
0x241000,
|
||||||
|
0x2D5000,
|
||||||
|
},
|
||||||
|
/* step */
|
||||||
|
0x1000,
|
||||||
|
},
|
||||||
|
/* ETH56G_PHY_REG_GPCS */
|
||||||
|
{
|
||||||
|
/* base_addr */
|
||||||
|
{
|
||||||
|
0x084000,
|
||||||
|
0x118000,
|
||||||
|
0x1AC000,
|
||||||
|
0x240000,
|
||||||
|
0x2D4000,
|
||||||
|
},
|
||||||
|
/* step */
|
||||||
|
0x400,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const
|
||||||
|
struct ice_eth56g_mac_reg_cfg eth56g_mac_cfg[NUM_ICE_ETH56G_LNK_SPD] = {
|
||||||
|
[ICE_ETH56G_LNK_SPD_1G] = {
|
||||||
|
.tx_mode = { .def = 6, },
|
||||||
|
.rx_mode = { .def = 6, },
|
||||||
|
.blks_per_clk = 1,
|
||||||
|
.blktime = 0x4000, /* 32 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0x6666, /* 51.2 */
|
||||||
|
.no_fec = 0xd066, /* 104.2 */
|
||||||
|
.sfd = 0x3000, /* 24 */
|
||||||
|
.onestep = 0x30000 /* 384 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xffffc59a, /* -29.2 */
|
||||||
|
.no_fec = 0xffff0a80, /* -122.75 */
|
||||||
|
.sfd = 0x2c00, /* 22 */
|
||||||
|
.bs_ds = 0x19a /* 0.8 */
|
||||||
|
/* Dynamic bitslip 0 equals to 10 */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_2_5G] = {
|
||||||
|
.tx_mode = { .def = 6, },
|
||||||
|
.rx_mode = { .def = 6, },
|
||||||
|
.blks_per_clk = 1,
|
||||||
|
.blktime = 0x199a, /* 12.8 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0x28f6, /* 20.48 */
|
||||||
|
.no_fec = 0x53b8, /* 41.86 */
|
||||||
|
.sfd = 0x1333, /* 9.6 */
|
||||||
|
.onestep = 0x13333 /* 153.6 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xffffe8a4, /* -11.68 */
|
||||||
|
.no_fec = 0xffff9a76, /* -50.77 */
|
||||||
|
.sfd = 0xf33, /* 7.6 */
|
||||||
|
.bs_ds = 0xa4 /* 0.32 */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_10G] = {
|
||||||
|
.tx_mode = { .def = 1, },
|
||||||
|
.rx_mode = { .def = 1, },
|
||||||
|
.blks_per_clk = 1,
|
||||||
|
.blktime = 0x666, /* 3.2 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0x234c, /* 17.6484848 */
|
||||||
|
.no_fec = 0x8e80, /* 71.25 */
|
||||||
|
.fc = 0xb4a4, /* 90.32 */
|
||||||
|
.sfd = 0x4a4, /* 2.32 */
|
||||||
|
.onestep = 0x4ccd /* 38.4 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xffffeb27, /* -10.42424 */
|
||||||
|
.no_fec = 0xffffcccd, /* -25.6 */
|
||||||
|
.fc = 0xfffe0014, /* -255.96 */
|
||||||
|
.sfd = 0x4a4, /* 2.32 */
|
||||||
|
.bs_ds = 0x32 /* 0.0969697 */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_25G] = {
|
||||||
|
.tx_mode = {
|
||||||
|
.def = 1,
|
||||||
|
.rs = 4
|
||||||
|
},
|
||||||
|
.tx_mk_dly = 4,
|
||||||
|
.tx_cw_dly = {
|
||||||
|
.def = 1,
|
||||||
|
.onestep = 6
|
||||||
|
},
|
||||||
|
.rx_mode = {
|
||||||
|
.def = 1,
|
||||||
|
.rs = 4
|
||||||
|
},
|
||||||
|
.rx_mk_dly = {
|
||||||
|
.def = 1,
|
||||||
|
.rs = 1
|
||||||
|
},
|
||||||
|
.rx_cw_dly = {
|
||||||
|
.def = 1,
|
||||||
|
.rs = 1
|
||||||
|
},
|
||||||
|
.blks_per_clk = 1,
|
||||||
|
.blktime = 0x28f, /* 1.28 */
|
||||||
|
.mktime = 0x147b, /* 10.24, only if RS-FEC enabled */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0xe1e, /* 7.0593939 */
|
||||||
|
.no_fec = 0x3857, /* 28.17 */
|
||||||
|
.fc = 0x48c3, /* 36.38 */
|
||||||
|
.rs = 0x8100, /* 64.5 */
|
||||||
|
.sfd = 0x1dc, /* 0.93 */
|
||||||
|
.onestep = 0x1eb8 /* 15.36 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xfffff7a9, /* -4.1697 */
|
||||||
|
.no_fec = 0xffffe71a, /* -12.45 */
|
||||||
|
.fc = 0xfffe894d, /* -187.35 */
|
||||||
|
.rs = 0xfffff8cd, /* -3.6 */
|
||||||
|
.sfd = 0x1dc, /* 0.93 */
|
||||||
|
.bs_ds = 0x14 /* 0.0387879, RS-FEC 0 */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_40G] = {
|
||||||
|
.tx_mode = { .def = 3 },
|
||||||
|
.tx_mk_dly = 4,
|
||||||
|
.tx_cw_dly = {
|
||||||
|
.def = 1,
|
||||||
|
.onestep = 6
|
||||||
|
},
|
||||||
|
.rx_mode = { .def = 4 },
|
||||||
|
.rx_mk_dly = { .def = 1 },
|
||||||
|
.rx_cw_dly = { .def = 1 },
|
||||||
|
.blktime = 0x333, /* 1.6 */
|
||||||
|
.mktime = 0xccd, /* 6.4 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0x234c, /* 17.6484848 */
|
||||||
|
.no_fec = 0x5a8a, /* 45.27 */
|
||||||
|
.fc = 0x81b8, /* 64.86 */
|
||||||
|
.sfd = 0x4a4, /* 2.32 */
|
||||||
|
.onestep = 0x1333 /* 9.6 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xffffeb27, /* -10.42424 */
|
||||||
|
.no_fec = 0xfffff594, /* -5.21 */
|
||||||
|
.fc = 0xfffe3080, /* -231.75 */
|
||||||
|
.sfd = 0x4a4, /* 2.32 */
|
||||||
|
.bs_ds = 0xccd /* 6.4 */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_50G] = {
|
||||||
|
.tx_mode = { .def = 5 },
|
||||||
|
.tx_mk_dly = 4,
|
||||||
|
.tx_cw_dly = {
|
||||||
|
.def = 1,
|
||||||
|
.onestep = 6
|
||||||
|
},
|
||||||
|
.rx_mode = { .def = 5 },
|
||||||
|
.rx_mk_dly = { .def = 1 },
|
||||||
|
.rx_cw_dly = { .def = 1 },
|
||||||
|
.blktime = 0x28f, /* 1.28 */
|
||||||
|
.mktime = 0xa3d, /* 5.12 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0x13ba, /* 9.86353 */
|
||||||
|
.rs = 0x5400, /* 42 */
|
||||||
|
.sfd = 0xe6, /* 0.45 */
|
||||||
|
.onestep = 0xf5c /* 7.68 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xfffff7e8, /* -4.04706 */
|
||||||
|
.rs = 0xfffff994, /* -3.21 */
|
||||||
|
.sfd = 0xe6 /* 0.45 */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_50G2] = {
|
||||||
|
.tx_mode = {
|
||||||
|
.def = 3,
|
||||||
|
.rs = 2
|
||||||
|
},
|
||||||
|
.tx_mk_dly = 4,
|
||||||
|
.tx_cw_dly = {
|
||||||
|
.def = 1,
|
||||||
|
.onestep = 6
|
||||||
|
},
|
||||||
|
.rx_mode = {
|
||||||
|
.def = 4,
|
||||||
|
.rs = 1
|
||||||
|
},
|
||||||
|
.rx_mk_dly = { .def = 1 },
|
||||||
|
.rx_cw_dly = { .def = 1 },
|
||||||
|
.blktime = 0x28f, /* 1.28 */
|
||||||
|
.mktime = 0xa3d, /* 5.12 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0xe1e, /* 7.0593939 */
|
||||||
|
.no_fec = 0x3d33, /* 30.6 */
|
||||||
|
.rs = 0x5057, /* 40.17 */
|
||||||
|
.sfd = 0x1dc, /* 0.93 */
|
||||||
|
.onestep = 0xf5c /* 7.68 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xfffff7a9, /* -4.1697 */
|
||||||
|
.no_fec = 0xfffff8cd, /* -3.6 */
|
||||||
|
.rs = 0xfffff21a, /* -6.95 */
|
||||||
|
.sfd = 0x1dc, /* 0.93 */
|
||||||
|
.bs_ds = 0xa3d /* 5.12, RS-FEC 0x633 (3.1) */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_100G] = {
|
||||||
|
.tx_mode = {
|
||||||
|
.def = 3,
|
||||||
|
.rs = 2
|
||||||
|
},
|
||||||
|
.tx_mk_dly = 10,
|
||||||
|
.tx_cw_dly = {
|
||||||
|
.def = 3,
|
||||||
|
.onestep = 6
|
||||||
|
},
|
||||||
|
.rx_mode = {
|
||||||
|
.def = 4,
|
||||||
|
.rs = 1
|
||||||
|
},
|
||||||
|
.rx_mk_dly = { .def = 5 },
|
||||||
|
.rx_cw_dly = { .def = 5 },
|
||||||
|
.blks_per_clk = 1,
|
||||||
|
.blktime = 0x148, /* 0.64 */
|
||||||
|
.mktime = 0x199a, /* 12.8 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0xe1e, /* 7.0593939 */
|
||||||
|
.no_fec = 0x67ec, /* 51.96 */
|
||||||
|
.rs = 0x44fb, /* 34.49 */
|
||||||
|
.sfd = 0x1dc, /* 0.93 */
|
||||||
|
.onestep = 0xf5c /* 7.68 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xfffff7a9, /* -4.1697 */
|
||||||
|
.no_fec = 0xfffff5a9, /* -5.17 */
|
||||||
|
.rs = 0xfffff6e6, /* -4.55 */
|
||||||
|
.sfd = 0x1dc, /* 0.93 */
|
||||||
|
.bs_ds = 0x199a /* 12.8, RS-FEC 0x31b (1.552) */
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[ICE_ETH56G_LNK_SPD_100G2] = {
|
||||||
|
.tx_mode = { .def = 5 },
|
||||||
|
.tx_mk_dly = 10,
|
||||||
|
.tx_cw_dly = {
|
||||||
|
.def = 3,
|
||||||
|
.onestep = 6
|
||||||
|
},
|
||||||
|
.rx_mode = { .def = 5 },
|
||||||
|
.rx_mk_dly = { .def = 5 },
|
||||||
|
.rx_cw_dly = { .def = 5 },
|
||||||
|
.blks_per_clk = 1,
|
||||||
|
.blktime = 0x148, /* 0.64 */
|
||||||
|
.mktime = 0x199a, /* 12.8 */
|
||||||
|
.tx_offset = {
|
||||||
|
.serdes = 0x13ba, /* 9.86353 */
|
||||||
|
.rs = 0x460a, /* 35.02 */
|
||||||
|
.sfd = 0xe6, /* 0.45 */
|
||||||
|
.onestep = 0xf5c /* 7.68 */
|
||||||
|
},
|
||||||
|
.rx_offset = {
|
||||||
|
.serdes = 0xfffff7e8, /* -4.04706 */
|
||||||
|
.rs = 0xfffff548, /* -5.36 */
|
||||||
|
.sfd = 0xe6, /* 0.45 */
|
||||||
|
.bs_ds = 0x303 /* 1.506 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* struct ice_time_ref_info_e82x
|
/* struct ice_time_ref_info_e82x
|
||||||
*
|
*
|
||||||
* E822 hardware can use different sources as the reference for the PTP
|
* E822 hardware can use different sources as the reference for the PTP
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -41,6 +41,41 @@ enum ice_ptp_fec_mode {
|
||||||
ICE_PTP_FEC_MODE_RS_FEC
|
ICE_PTP_FEC_MODE_RS_FEC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum eth56g_res_type {
|
||||||
|
ETH56G_PHY_REG_PTP,
|
||||||
|
ETH56G_PHY_MEM_PTP,
|
||||||
|
ETH56G_PHY_REG_XPCS,
|
||||||
|
ETH56G_PHY_REG_MAC,
|
||||||
|
ETH56G_PHY_REG_GPCS,
|
||||||
|
NUM_ETH56G_PHY_RES
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ice_eth56g_link_spd {
|
||||||
|
ICE_ETH56G_LNK_SPD_1G,
|
||||||
|
ICE_ETH56G_LNK_SPD_2_5G,
|
||||||
|
ICE_ETH56G_LNK_SPD_10G,
|
||||||
|
ICE_ETH56G_LNK_SPD_25G,
|
||||||
|
ICE_ETH56G_LNK_SPD_40G,
|
||||||
|
ICE_ETH56G_LNK_SPD_50G,
|
||||||
|
ICE_ETH56G_LNK_SPD_50G2,
|
||||||
|
ICE_ETH56G_LNK_SPD_100G,
|
||||||
|
ICE_ETH56G_LNK_SPD_100G2,
|
||||||
|
NUM_ICE_ETH56G_LNK_SPD /* Must be last */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct ice_phy_reg_info_eth56g - ETH56G PHY register parameters
|
||||||
|
* @base: base address for each PHY block
|
||||||
|
* @step: step between PHY lanes
|
||||||
|
*
|
||||||
|
* Characteristic information for the various PHY register parameters in the
|
||||||
|
* ETH56G devices
|
||||||
|
*/
|
||||||
|
struct ice_phy_reg_info_eth56g {
|
||||||
|
u32 base[NUM_ETH56G_PHY_RES];
|
||||||
|
u32 step;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ice_time_ref_info_e82x
|
* struct ice_time_ref_info_e82x
|
||||||
* @pll_freq: Frequency of PLL that drives timer ticks in Hz
|
* @pll_freq: Frequency of PLL that drives timer ticks in Hz
|
||||||
|
@ -94,6 +129,73 @@ struct ice_vernier_info_e82x {
|
||||||
u32 rx_fixed_delay;
|
u32 rx_fixed_delay;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define ICE_ETH56G_MAC_CFG_RX_OFFSET_INT GENMASK(19, 9)
|
||||||
|
#define ICE_ETH56G_MAC_CFG_RX_OFFSET_FRAC GENMASK(8, 0)
|
||||||
|
#define ICE_ETH56G_MAC_CFG_FRAC_W 9
|
||||||
|
/**
|
||||||
|
* struct ice_eth56g_mac_reg_cfg - MAC config values for specific PTP registers
|
||||||
|
* @tx_mode: Tx timestamp compensation mode
|
||||||
|
* @tx_mk_dly: Tx timestamp marker start strobe delay
|
||||||
|
* @tx_cw_dly: Tx timestamp codeword start strobe delay
|
||||||
|
* @rx_mode: Rx timestamp compensation mode
|
||||||
|
* @rx_mk_dly: Rx timestamp marker start strobe delay
|
||||||
|
* @rx_cw_dly: Rx timestamp codeword start strobe delay
|
||||||
|
* @blks_per_clk: number of blocks transferred per clock cycle
|
||||||
|
* @blktime: block time, fixed point
|
||||||
|
* @mktime: marker time, fixed point
|
||||||
|
* @tx_offset: total Tx offset, fixed point
|
||||||
|
* @rx_offset: total Rx offset, contains value for bitslip/deskew, fixed point
|
||||||
|
*
|
||||||
|
* All fixed point registers except Rx offset are 23 bit unsigned ints with
|
||||||
|
* a 9 bit fractional.
|
||||||
|
* Rx offset is 11 bit unsigned int with a 9 bit fractional.
|
||||||
|
*/
|
||||||
|
struct ice_eth56g_mac_reg_cfg {
|
||||||
|
struct {
|
||||||
|
u8 def;
|
||||||
|
u8 rs;
|
||||||
|
} tx_mode;
|
||||||
|
u8 tx_mk_dly;
|
||||||
|
struct {
|
||||||
|
u8 def;
|
||||||
|
u8 onestep;
|
||||||
|
} tx_cw_dly;
|
||||||
|
struct {
|
||||||
|
u8 def;
|
||||||
|
u8 rs;
|
||||||
|
} rx_mode;
|
||||||
|
struct {
|
||||||
|
u8 def;
|
||||||
|
u8 rs;
|
||||||
|
} rx_mk_dly;
|
||||||
|
struct {
|
||||||
|
u8 def;
|
||||||
|
u8 rs;
|
||||||
|
} rx_cw_dly;
|
||||||
|
u8 blks_per_clk;
|
||||||
|
u16 blktime;
|
||||||
|
u16 mktime;
|
||||||
|
struct {
|
||||||
|
u32 serdes;
|
||||||
|
u32 no_fec;
|
||||||
|
u32 fc;
|
||||||
|
u32 rs;
|
||||||
|
u32 sfd;
|
||||||
|
u32 onestep;
|
||||||
|
} tx_offset;
|
||||||
|
struct {
|
||||||
|
u32 serdes;
|
||||||
|
u32 no_fec;
|
||||||
|
u32 fc;
|
||||||
|
u32 rs;
|
||||||
|
u32 sfd;
|
||||||
|
u32 bs_ds;
|
||||||
|
} rx_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern
|
||||||
|
const struct ice_eth56g_mac_reg_cfg eth56g_mac_cfg[NUM_ICE_ETH56G_LNK_SPD];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct ice_cgu_pll_params_e82x
|
* struct ice_cgu_pll_params_e82x
|
||||||
* @refclk_pre_div: Reference clock pre-divisor
|
* @refclk_pre_div: Reference clock pre-divisor
|
||||||
|
@ -188,6 +290,9 @@ ice_cgu_pll_params_e82x e822_cgu_params[NUM_ICE_TIME_REF_FREQ];
|
||||||
#define E810C_QSFP_C827_0_HANDLE 2
|
#define E810C_QSFP_C827_0_HANDLE 2
|
||||||
#define E810C_QSFP_C827_1_HANDLE 3
|
#define E810C_QSFP_C827_1_HANDLE 3
|
||||||
|
|
||||||
|
/* Table of constants related to possible ETH56G PHY resources */
|
||||||
|
extern const struct ice_phy_reg_info_eth56g eth56g_phy_res[NUM_ETH56G_PHY_RES];
|
||||||
|
|
||||||
/* Table of constants related to possible TIME_REF sources */
|
/* Table of constants related to possible TIME_REF sources */
|
||||||
extern const struct ice_time_ref_info_e82x e822_time_ref[NUM_ICE_TIME_REF_FREQ];
|
extern const struct ice_time_ref_info_e82x e822_time_ref[NUM_ICE_TIME_REF_FREQ];
|
||||||
|
|
||||||
|
@ -197,7 +302,9 @@ extern const struct ice_vernier_info_e82x e822_vernier[NUM_ICE_PTP_LNK_SPD];
|
||||||
/* Increment value to generate nanoseconds in the GLTSYN_TIME_L register for
|
/* Increment value to generate nanoseconds in the GLTSYN_TIME_L register for
|
||||||
* the E810 devices. Based off of a PLL with an 812.5 MHz frequency.
|
* the E810 devices. Based off of a PLL with an 812.5 MHz frequency.
|
||||||
*/
|
*/
|
||||||
#define ICE_PTP_NOMINAL_INCVAL_E810 0x13b13b13bULL
|
#define ICE_E810_PLL_FREQ 812500000
|
||||||
|
#define ICE_PTP_NOMINAL_INCVAL_E810 0x13b13b13bULL
|
||||||
|
#define E810_OUT_PROP_DELAY_NS 1
|
||||||
|
|
||||||
/* Device agnostic functions */
|
/* Device agnostic functions */
|
||||||
u8 ice_get_ptp_src_clock_index(struct ice_hw *hw);
|
u8 ice_get_ptp_src_clock_index(struct ice_hw *hw);
|
||||||
|
@ -215,6 +322,8 @@ void ice_ptp_reset_ts_memory(struct ice_hw *hw);
|
||||||
int ice_ptp_init_phc(struct ice_hw *hw);
|
int ice_ptp_init_phc(struct ice_hw *hw);
|
||||||
void ice_ptp_init_hw(struct ice_hw *hw);
|
void ice_ptp_init_hw(struct ice_hw *hw);
|
||||||
int ice_get_phy_tx_tstamp_ready(struct ice_hw *hw, u8 block, u64 *tstamp_ready);
|
int ice_get_phy_tx_tstamp_ready(struct ice_hw *hw, u8 block, u64 *tstamp_ready);
|
||||||
|
int ice_ptp_one_port_cmd(struct ice_hw *hw, u8 configured_port,
|
||||||
|
enum ice_ptp_tmr_cmd configured_cmd);
|
||||||
|
|
||||||
/* E822 family functions */
|
/* E822 family functions */
|
||||||
int ice_read_quad_reg_e82x(struct ice_hw *hw, u8 quad, u16 offset, u32 *val);
|
int ice_read_quad_reg_e82x(struct ice_hw *hw, u8 quad, u16 offset, u32 *val);
|
||||||
|
@ -285,6 +394,21 @@ int ice_get_cgu_rclk_pin_info(struct ice_hw *hw, u8 *base_idx, u8 *pin_num);
|
||||||
int ice_cgu_get_output_pin_state_caps(struct ice_hw *hw, u8 pin_id,
|
int ice_cgu_get_output_pin_state_caps(struct ice_hw *hw, u8 pin_id,
|
||||||
unsigned long *caps);
|
unsigned long *caps);
|
||||||
|
|
||||||
|
/* ETH56G family functions */
|
||||||
|
int ice_ptp_read_tx_hwtstamp_status_eth56g(struct ice_hw *hw, u32 *ts_status);
|
||||||
|
int ice_stop_phy_timer_eth56g(struct ice_hw *hw, u8 port, bool soft_reset);
|
||||||
|
int ice_start_phy_timer_eth56g(struct ice_hw *hw, u8 port);
|
||||||
|
int ice_phy_cfg_tx_offset_eth56g(struct ice_hw *hw, u8 port);
|
||||||
|
int ice_phy_cfg_rx_offset_eth56g(struct ice_hw *hw, u8 port);
|
||||||
|
int ice_phy_cfg_intr_eth56g(struct ice_hw *hw, u8 port, bool ena, u8 threshold);
|
||||||
|
int ice_phy_cfg_ptp_1step_eth56g(struct ice_hw *hw, u8 port);
|
||||||
|
|
||||||
|
#define ICE_ETH56G_NOMINAL_INCVAL 0x140000000ULL
|
||||||
|
#define ICE_ETH56G_NOMINAL_PCS_REF_TUS 0x100000000ULL
|
||||||
|
#define ICE_ETH56G_NOMINAL_PCS_REF_INC 0x300000000ULL
|
||||||
|
#define ICE_ETH56G_NOMINAL_THRESH4 0x7777
|
||||||
|
#define ICE_ETH56G_NOMINAL_TX_THRESH 0x6
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ice_get_base_incval - Get base clock increment value
|
* ice_get_base_incval - Get base clock increment value
|
||||||
* @hw: pointer to the HW struct
|
* @hw: pointer to the HW struct
|
||||||
|
@ -294,6 +418,8 @@ int ice_cgu_get_output_pin_state_caps(struct ice_hw *hw, u8 pin_id,
|
||||||
static inline u64 ice_get_base_incval(struct ice_hw *hw)
|
static inline u64 ice_get_base_incval(struct ice_hw *hw)
|
||||||
{
|
{
|
||||||
switch (hw->ptp.phy_model) {
|
switch (hw->ptp.phy_model) {
|
||||||
|
case ICE_PHY_ETH56G:
|
||||||
|
return ICE_ETH56G_NOMINAL_INCVAL;
|
||||||
case ICE_PHY_E810:
|
case ICE_PHY_E810:
|
||||||
return ICE_PTP_NOMINAL_INCVAL_E810;
|
return ICE_PTP_NOMINAL_INCVAL_E810;
|
||||||
case ICE_PHY_E82X:
|
case ICE_PHY_E82X:
|
||||||
|
@ -330,6 +456,7 @@ static inline u64 ice_get_base_incval(struct ice_hw *hw)
|
||||||
#define TS_CMD_MASK_E810 0xFF
|
#define TS_CMD_MASK_E810 0xFF
|
||||||
#define TS_CMD_MASK 0xF
|
#define TS_CMD_MASK 0xF
|
||||||
#define SYNC_EXEC_CMD 0x3
|
#define SYNC_EXEC_CMD 0x3
|
||||||
|
#define TS_CMD_RX_TYPE ICE_M(0x18, 0x4)
|
||||||
|
|
||||||
/* Macros to derive port low and high addresses on both quads */
|
/* Macros to derive port low and high addresses on both quads */
|
||||||
#define P_Q0_L(a, p) ((((a) + (0x2000 * (p)))) & 0xFFFF)
|
#define P_Q0_L(a, p) ((((a) + (0x2000 * (p)))) & 0xFFFF)
|
||||||
|
@ -564,4 +691,115 @@ static inline u64 ice_get_base_incval(struct ice_hw *hw)
|
||||||
/* E810T PCA9575 IO controller pin control */
|
/* E810T PCA9575 IO controller pin control */
|
||||||
#define ICE_E810T_P0_GNSS_PRSNT_N BIT(4)
|
#define ICE_E810T_P0_GNSS_PRSNT_N BIT(4)
|
||||||
|
|
||||||
|
/* ETH56G PHY register addresses */
|
||||||
|
/* Timestamp PHY incval registers */
|
||||||
|
#define PHY_REG_TIMETUS_L 0x8
|
||||||
|
#define PHY_REG_TIMETUS_U 0xC
|
||||||
|
|
||||||
|
/* Timestamp PCS registers */
|
||||||
|
#define PHY_PCS_REF_TUS_L 0x18
|
||||||
|
#define PHY_PCS_REF_TUS_U 0x1C
|
||||||
|
|
||||||
|
/* Timestamp PCS ref incval registers */
|
||||||
|
#define PHY_PCS_REF_INC_L 0x20
|
||||||
|
#define PHY_PCS_REF_INC_U 0x24
|
||||||
|
|
||||||
|
/* Timestamp init registers */
|
||||||
|
#define PHY_REG_RX_TIMER_INC_PRE_L 0x64
|
||||||
|
#define PHY_REG_RX_TIMER_INC_PRE_U 0x68
|
||||||
|
#define PHY_REG_TX_TIMER_INC_PRE_L 0x44
|
||||||
|
#define PHY_REG_TX_TIMER_INC_PRE_U 0x48
|
||||||
|
|
||||||
|
/* Timestamp match and adjust target registers */
|
||||||
|
#define PHY_REG_RX_TIMER_CNT_ADJ_L 0x6C
|
||||||
|
#define PHY_REG_RX_TIMER_CNT_ADJ_U 0x70
|
||||||
|
#define PHY_REG_TX_TIMER_CNT_ADJ_L 0x4C
|
||||||
|
#define PHY_REG_TX_TIMER_CNT_ADJ_U 0x50
|
||||||
|
|
||||||
|
/* Timestamp command registers */
|
||||||
|
#define PHY_REG_TX_TMR_CMD 0x40
|
||||||
|
#define PHY_REG_RX_TMR_CMD 0x60
|
||||||
|
|
||||||
|
/* Phy offset ready registers */
|
||||||
|
#define PHY_REG_TX_OFFSET_READY 0x54
|
||||||
|
#define PHY_REG_RX_OFFSET_READY 0x74
|
||||||
|
|
||||||
|
/* Phy total offset registers */
|
||||||
|
#define PHY_REG_TOTAL_TX_OFFSET_L 0x38
|
||||||
|
#define PHY_REG_TOTAL_TX_OFFSET_U 0x3C
|
||||||
|
#define PHY_REG_TOTAL_RX_OFFSET_L 0x58
|
||||||
|
#define PHY_REG_TOTAL_RX_OFFSET_U 0x5C
|
||||||
|
|
||||||
|
/* Timestamp capture registers */
|
||||||
|
#define PHY_REG_TX_CAPTURE_L 0x78
|
||||||
|
#define PHY_REG_TX_CAPTURE_U 0x7C
|
||||||
|
#define PHY_REG_RX_CAPTURE_L 0x8C
|
||||||
|
#define PHY_REG_RX_CAPTURE_U 0x90
|
||||||
|
|
||||||
|
/* Memory status registers */
|
||||||
|
#define PHY_REG_TX_MEMORY_STATUS_L 0x80
|
||||||
|
#define PHY_REG_TX_MEMORY_STATUS_U 0x84
|
||||||
|
|
||||||
|
/* Interrupt config register */
|
||||||
|
#define PHY_REG_TS_INT_CONFIG 0x88
|
||||||
|
|
||||||
|
/* XIF mode config register */
|
||||||
|
#define PHY_MAC_XIF_MODE 0x24
|
||||||
|
#define PHY_MAC_XIF_1STEP_ENA_M ICE_M(0x1, 5)
|
||||||
|
#define PHY_MAC_XIF_TS_BIN_MODE_M ICE_M(0x1, 11)
|
||||||
|
#define PHY_MAC_XIF_TS_SFD_ENA_M ICE_M(0x1, 20)
|
||||||
|
#define PHY_MAC_XIF_GMII_TS_SEL_M ICE_M(0x1, 21)
|
||||||
|
|
||||||
|
/* GPCS config register */
|
||||||
|
#define PHY_GPCS_CONFIG_REG0 0x268
|
||||||
|
#define PHY_GPCS_CONFIG_REG0_TX_THR_M ICE_M(0xF, 24)
|
||||||
|
#define PHY_GPCS_BITSLIP 0x5C
|
||||||
|
|
||||||
|
#define PHY_TS_INT_CONFIG_THRESHOLD_M ICE_M(0x3F, 0)
|
||||||
|
#define PHY_TS_INT_CONFIG_ENA_M BIT(6)
|
||||||
|
|
||||||
|
/* 1-step PTP config */
|
||||||
|
#define PHY_PTP_1STEP_CONFIG 0x270
|
||||||
|
#define PHY_PTP_1STEP_T1S_UP64_M ICE_M(0xF, 4)
|
||||||
|
#define PHY_PTP_1STEP_T1S_DELTA_M ICE_M(0xF, 8)
|
||||||
|
#define PHY_PTP_1STEP_PEER_DELAY(_port) (0x274 + 4 * (_port))
|
||||||
|
#define PHY_PTP_1STEP_PD_ADD_PD_M ICE_M(0x1, 0)
|
||||||
|
#define PHY_PTP_1STEP_PD_DELAY_M ICE_M(0x3fffffff, 1)
|
||||||
|
#define PHY_PTP_1STEP_PD_DLY_V_M ICE_M(0x1, 31)
|
||||||
|
|
||||||
|
/* Macros to derive offsets for TimeStampLow and TimeStampHigh */
|
||||||
|
#define PHY_TSTAMP_L(x) (((x) * 8) + 0)
|
||||||
|
#define PHY_TSTAMP_U(x) (((x) * 8) + 4)
|
||||||
|
|
||||||
|
#define PHY_REG_REVISION 0x85000
|
||||||
|
|
||||||
|
#define PHY_REG_DESKEW_0 0x94
|
||||||
|
#define PHY_REG_DESKEW_0_RLEVEL GENMASK(6, 0)
|
||||||
|
#define PHY_REG_DESKEW_0_RLEVEL_FRAC GENMASK(9, 7)
|
||||||
|
#define PHY_REG_DESKEW_0_RLEVEL_FRAC_W 3
|
||||||
|
#define PHY_REG_DESKEW_0_VALID GENMASK(10, 10)
|
||||||
|
|
||||||
|
#define PHY_REG_GPCS_BITSLIP 0x5C
|
||||||
|
#define PHY_REG_SD_BIT_SLIP(_port_offset) (0x29C + 4 * (_port_offset))
|
||||||
|
#define PHY_REVISION_ETH56G 0x10200
|
||||||
|
#define PHY_VENDOR_TXLANE_THRESH 0x2000C
|
||||||
|
|
||||||
|
#define PHY_MAC_TSU_CONFIG 0x40
|
||||||
|
#define PHY_MAC_TSU_CFG_RX_MODE_M ICE_M(0x7, 0)
|
||||||
|
#define PHY_MAC_TSU_CFG_RX_MII_CW_DLY_M ICE_M(0x7, 4)
|
||||||
|
#define PHY_MAC_TSU_CFG_RX_MII_MK_DLY_M ICE_M(0x7, 8)
|
||||||
|
#define PHY_MAC_TSU_CFG_TX_MODE_M ICE_M(0x7, 12)
|
||||||
|
#define PHY_MAC_TSU_CFG_TX_MII_CW_DLY_M ICE_M(0x1F, 16)
|
||||||
|
#define PHY_MAC_TSU_CFG_TX_MII_MK_DLY_M ICE_M(0x1F, 21)
|
||||||
|
#define PHY_MAC_TSU_CFG_BLKS_PER_CLK_M ICE_M(0x1, 28)
|
||||||
|
#define PHY_MAC_RX_MODULO 0x44
|
||||||
|
#define PHY_MAC_RX_OFFSET 0x48
|
||||||
|
#define PHY_MAC_RX_OFFSET_M ICE_M(0xFFFFFF, 0)
|
||||||
|
#define PHY_MAC_TX_MODULO 0x4C
|
||||||
|
#define PHY_MAC_BLOCKTIME 0x50
|
||||||
|
#define PHY_MAC_MARKERTIME 0x54
|
||||||
|
#define PHY_MAC_TX_OFFSET 0x58
|
||||||
|
|
||||||
|
#define PHY_PTP_INT_STATUS 0x7FD140
|
||||||
|
|
||||||
#endif /* _ICE_PTP_HW_H_ */
|
#endif /* _ICE_PTP_HW_H_ */
|
||||||
|
|
|
@ -47,10 +47,12 @@ struct ice_sbq_evt_desc {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ice_sbq_msg_dev {
|
enum ice_sbq_msg_dev {
|
||||||
rmn_0 = 0x02,
|
eth56g_phy_0 = 0x02,
|
||||||
rmn_1 = 0x03,
|
rmn_0 = 0x02,
|
||||||
rmn_2 = 0x04,
|
rmn_1 = 0x03,
|
||||||
cgu = 0x06
|
rmn_2 = 0x04,
|
||||||
|
cgu = 0x06,
|
||||||
|
eth56g_phy_1 = 0x0D,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ice_sbq_msg_opcode {
|
enum ice_sbq_msg_opcode {
|
||||||
|
|
|
@ -322,7 +322,9 @@ enum ice_time_ref_freq {
|
||||||
ICE_TIME_REF_FREQ_156_250 = 4,
|
ICE_TIME_REF_FREQ_156_250 = 4,
|
||||||
ICE_TIME_REF_FREQ_245_760 = 5,
|
ICE_TIME_REF_FREQ_245_760 = 5,
|
||||||
|
|
||||||
NUM_ICE_TIME_REF_FREQ
|
NUM_ICE_TIME_REF_FREQ,
|
||||||
|
|
||||||
|
ICE_TIME_REF_FREQ_INVALID = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Clock source specification */
|
/* Clock source specification */
|
||||||
|
@ -821,15 +823,29 @@ struct ice_mbx_data {
|
||||||
#define ICE_PORTS_PER_QUAD 4
|
#define ICE_PORTS_PER_QUAD 4
|
||||||
#define ICE_GET_QUAD_NUM(port) ((port) / ICE_PORTS_PER_QUAD)
|
#define ICE_GET_QUAD_NUM(port) ((port) / ICE_PORTS_PER_QUAD)
|
||||||
|
|
||||||
|
struct ice_eth56g_params {
|
||||||
|
u8 num_phys;
|
||||||
|
u8 phy_addr[2];
|
||||||
|
bool onestep_ena;
|
||||||
|
bool sfd_ena;
|
||||||
|
u32 peer_delay;
|
||||||
|
};
|
||||||
|
|
||||||
|
union ice_phy_params {
|
||||||
|
struct ice_eth56g_params eth56g;
|
||||||
|
};
|
||||||
|
|
||||||
/* PHY model */
|
/* PHY model */
|
||||||
enum ice_phy_model {
|
enum ice_phy_model {
|
||||||
ICE_PHY_UNSUP = -1,
|
ICE_PHY_UNSUP = -1,
|
||||||
ICE_PHY_E810 = 1,
|
ICE_PHY_E810 = 1,
|
||||||
ICE_PHY_E82X,
|
ICE_PHY_E82X,
|
||||||
|
ICE_PHY_ETH56G,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ice_ptp_hw {
|
struct ice_ptp_hw {
|
||||||
enum ice_phy_model phy_model;
|
enum ice_phy_model phy_model;
|
||||||
|
union ice_phy_params phy;
|
||||||
u8 num_lports;
|
u8 num_lports;
|
||||||
u8 ports_per_phy;
|
u8 ports_per_phy;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue