blob: 7c9b580c305ae6d2bd16700843a0aa20ab2b63b0 [file] [log] [blame]
/*
* Copyright (c) 2015, The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _DESS_PSGMII_H_
#define _DESS_PSGMII_H_
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*PSGMII Registers*/
#define PSGMIIPHY_MODECFG_1 0xcc
#define PSGMIIPHY_PHY_INTERFACE 0x10C
#define PSGMIIPHY_EEE_CH0_1 0x168
#define PSGMIIPHY_EEE_CH0_2 0x16C
#define PSGMIIPHY_EEE_CH0_3 0x170
#define PSGMIIPHY_EEE_CH0_4 0x174
#define PSGMIIPHY_EEE_CH0_5 0x178
#define PSGMIIPHY_EEE_CH0_6 0x17C
#define PSGMIIPHY_EEE_CH0_7 0x180
#define PSGMIIPHY_EEE_CH1_1 0x184
#define PSGMIIPHY_EEE_CH1_2 0x188
#define PSGMIIPHY_EEE_CH1_3 0x18C
#define PSGMIIPHY_EEE_CH2_1 0x190
#define PSGMIIPHY_EEE_CH2_2 0x194
#define PSGMIIPHY_EEE_CH2_3 0x198
#define PSGMIIPHY_EEE_CH3_1 0x19C
#define PSGMIIPHY_EEE_CH3_2 0x1A0
#define PSGMIIPHY_EEE_CH3_3 0x1A4
#define PSGMIIPHY_EEE_CH4_1 0x1A8
#define PSGMIIPHY_EEE_CH4_2 0x1AC
#define PSGMIIPHY_EEE_CH4_3 0x1B0
#define PSGMIIPHY_MODE_CONTROL 0x1b4
#define PSGMIIPHY_FIFO 0x1b8
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_1 0x1BC
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4 0x1C8
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5 0x1CC
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4 0x1e0
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5 0x1e4
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4 0x1f8
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5 0x1fC
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4 0x210
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5 0x214
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4 0x228
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5 0x22C
#define PSGMIIPHY_CHANNEL0TXSTATE 0x248
#define PSGMIIPHY_CHANNEL0RXSTATES 0x24c
#define PSGMIIPHY_CHANNEL1TXSTATE 0x250
#define PSGMIIPHY_CHANNEL1RXSTATES 0x254
#define PSGMIIPHY_CHANNEL2TXSTATE 0x258
#define PSGMIIPHY_CHANNEL2RXSTATES 0x25c
#define PSGMIIPHY_CHANNEL3TXSTATE 0x260
#define PSGMIIPHY_CHANNEL3RXSTATES 0x264
#define PSGMIIPHY_CHANNEL4TXSTATE 0x268
#define PSGMIIPHY_CHANNEL4RXSTATES 0x26c
/* PSGMII Registers Field*/
/*PSGMIIPHY_EEE_CH0_1 register field*/
#define PSGMIIPHY_EEE_DIS_LPI 0x2
#define PSGMIIPHY_EEE_EN_LPI 0x1
/*PSGMIIPHY_MODE_CONTROL register field*/
#define PSGMIIPHY_MODE_SW_V17_V18 0x8000
/* Interface Mode, bits 12:14 */
#define PSGMIIPHY_MODE_CH0_MODE_1000BASEX 0x0000
#define PSGMIIPHY_MODE_CH0_MODE_PSGMII_PHY 0x1000
#define PSGMIIPHY_MODE_CH0_MODE_PSGMII_MAC 0x2000
#define PSGMIIPHY_MODE_CH0_PSGMII_QSGMII 0x200
#define PSGMIIPHY_MODE_CH0_QSGMII_SGMII 0x100
#define PSGMIIPHY_MODE_SGMII_EVEN_LOW 0x0008
#define PSGMIIPHY_MODE_CH4_CH1_0_SGMII 0x0004
#define PSGMIIPHY_MODE_CH1_CH0_SGMII 0x0002
#define PSGMIIPHY_MODE_CH0_ATHR_CSCO_MODE_25M 0x0001
/*CHANNEL_0_INPUT_OUTPUT_1 register field*/
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_1_MR_AN_COMPLETE 0x800
/*CHANNEL_0_INPUT_OUTPUT_4 register field*/
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_POWER_ON_25M 0x400
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_MR_MAIN_RESET_25M 0x200
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_MR_MR_LOOPBACK_25M 0x100
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_MR_RESTART_AN_25M 0x80
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_MR_AN_ENABLE_25M 0x40
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_MR_MR_REG4_CH_25M 0x20
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_MR_MR_NP_LOADED_25M 0x10
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_FORCE_SPEED_25M 0x08
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_SPEED_25M_10M 0x02
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_SPEED_25M_100M 0x04
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_SPEED_25M_1000M 0x06
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_4_REM_PHY_LPBK 0x00
/*CHANNEL_0_INPUT_OUTPUT_5 register field*/
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_FULL_DUPLEX_25M 0x800
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_HALF_DUPLEX_25M 0x400
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_REMOTE_FAULT_25M 0x300
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_LINK_25M 0x80
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_DUPLEX_MODE_25M 0x40
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_SPEED_MODE_25M 0x30
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_PAUSE_SG_TX_EN_25M 0x08
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_NEXT_PAGE_25M 0x04
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_PAUSE_25M 0x02
#define PSGMIIPHY_CHANNEL_0_INPUT_OUTPUT_5_ASYM_PAUSE_25M 0x01
/*CHANNEL_1_INPUT_OUTPUT_4 register field*/
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_POWER_ON_25M 0x400
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_MR_MAIN_RESET_25M 0x200
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_MR_MR_LOOPBACK_25M 0x100
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_MR_RESTART_AN_25M 0x80
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_MR_AN_ENABLE_25M 0x40
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_MR_MR_REG4_CH_25M 0x20
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_MR_MR_NP_LOADED_25M 0x10
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_FORCE_SPEED_25M 0x08
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_SPEED_25M_10M 0x02
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_SPEED_25M_100M 0x04
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_SPEED_25M_1000M 0x06
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_4_REM_PHY_LPBK 0x00
/*CHANNEL_1_INPUT_OUTPUT_5 register field*/
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_FULL_DUPLEX_25M 0x800
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_HALF_DUPLEX_25M 0x400
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_REMOTE_FAULT_25M 0x300
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_LINK_25M 0x80
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_DUPLEX_MODE_25M 0x40
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_SPEED_MODE_25M 0x30
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_PAUSE_SG_TX_EN_25M 0x08
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_NEXT_PAGE_25M 0x04
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_PAUSE_25M 0x02
#define PSGMIIPHY_CHANNEL_1_INPUT_OUTPUT_5_ASYM_PAUSE_25M 0x01
/*CHANNEL_2_INPUT_OUTPUT_4 register field*/
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_POWER_ON_25M 0x400
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_MR_MAIN_RESET_25M 0x200
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_MR_MR_LOOPBACK_25M 0x100
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_MR_RESTART_AN_25M 0x80
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_MR_AN_ENABLE_25M 0x40
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_MR_MR_REG4_CH_25M 0x20
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_MR_MR_NP_LOADED_25M 0x10
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_FORCE_SPEED_25M 0x08
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_SPEED_25M_10M 0x02
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_SPEED_25M_100M 0x04
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_SPEED_25M_1000M 0x06
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_4_REM_PHY_LPBK 0x00
/*CHANNEL_2_INPUT_OUTPUT_5 register field*/
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_FULL_DUPLEX_25M 0x800
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_HALF_DUPLEX_25M 0x400
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_REMOTE_FAULT_25M 0x300
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_LINK_25M 0x80
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_DUPLEX_MODE_25M 0x40
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_SPEED_MODE_25M 0x30
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_PAUSE_SG_TX_EN_25M 0x08
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_NEXT_PAGE_25M 0x04
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_PAUSE_25M 0x02
#define PSGMIIPHY_CHANNEL_2_INPUT_OUTPUT_5_ASYM_PAUSE_25M 0x01
/*CHANNEL_3_INPUT_OUTPUT_4 register field*/
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_POWER_ON_25M 0x400
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_MR_MAIN_RESET_25M 0x200
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_MR_MR_LOOPBACK_25M 0x100
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_MR_RESTART_AN_25M 0x80
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_MR_AN_ENABLE_25M 0x40
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_MR_MR_REG4_CH_25M 0x20
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_MR_MR_NP_LOADED_25M 0x10
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_FORCE_SPEED_25M 0x08
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_SPEED_25M_MASK 0x06
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_SPEED_25M_10M 0x0
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_SPEED_25M_100M 0x02
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_SPEED_25M_1000M 0x04
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_4_REM_PHY_LPBK 0x00
/*CHANNEL_3_INPUT_OUTPUT_5 register field*/
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_FULL_DUPLEX_25M 0x800
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_HALF_DUPLEX_25M 0x400
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_REMOTE_FAULT_25M 0x300
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_LINK_25M 0x80
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_DUPLEX_MODE_25M 0x40
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_SPEED_MODE_25M 0x30
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_SPEED_25M_10M 0x00
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_SPEED_25M_100M 0x10
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_SPEED_25M_1000M 0x20
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_PAUSE_SG_TX_EN_25M 0x08
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_NEXT_PAGE_25M 0x04
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_PAUSE_25M 0x02
#define PSGMIIPHY_CHANNEL_3_INPUT_OUTPUT_5_ASYM_PAUSE_25M 0x01
/*CHANNEL_4_INPUT_OUTPUT_4 register field*/
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_POWER_ON_25M 0x400
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_MR_MAIN_RESET_25M 0x200
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_MR_MR_LOOPBACK_25M 0x100
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_MR_RESTART_AN_25M 0x80
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_MR_AN_ENABLE_25M 0x40
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_MR_MR_REG4_CH_25M 0x20
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_MR_MR_NP_LOADED_25M 0x10
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_FORCE_SPEED_25M 0x08
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_SPEED_25M_10M 0x02
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_SPEED_25M_100M 0x04
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_SPEED_25M_1000M 0x06
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_4_REM_PHY_LPBK 0x00
/*CHANNEL_4_INPUT_OUTPUT_5 register field*/
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_FULL_DUPLEX_25M 0x800
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_HALF_DUPLEX_25M 0x400
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_REMOTE_FAULT_25M 0x300
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_LINK_25M 0x80
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_DUPLEX_MODE_25M 0x40
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_SPEED_MODE_25M 0x30
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_PAUSE_SG_TX_EN_25M 0x08
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_NEXT_PAGE_25M 0x04
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_PAUSE_25M 0x02
#define PSGMIIPHY_CHANNEL_4_INPUT_OUTPUT_5_ASYM_PAUSE_25M 0x01
typedef enum {
PSGMII_MAC_MODE_PSGMII = 0,
PSGMII_MAC_MODE_QSGMII,
PSGMII_MAC_MODE_SGMII,
PSGMII_MAC_MODE_DEFAULT
}psgmii_interface_mac_mode_t;
sw_error_t
dess_psgmii_reg_get(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len);
sw_error_t
dess_psgmii_reg_set(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len);
sw_error_t
dess_psgmii_set_lpi(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable);
sw_error_t
dess_psgmii_get_lpi(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t *enable);
sw_error_t
dess_psgmii_set_interface_type(a_uint32_t dev_id, a_uint32_t phy_id,
psgmii_interface_mac_mode_t mode);
sw_error_t
dess_psgmii_get_interface_type(a_uint32_t dev_id, a_uint32_t * phy_id,
psgmii_interface_mac_mode_t * mode);
a_bool_t
dess_psgmii_autoneg_done(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_reset(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_poweroff(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_poweron(a_uint32_t dev_id, a_uint32_t phy_id);
a_bool_t
dess_psgmii_get_link_status(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_set_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
a_bool_t enable);
sw_error_t
dess_psgmii_get_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
a_bool_t * enable);
a_bool_t dess_psgmii_autoneg_status(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_restart_autoneg(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_enable_autoneg(a_uint32_t dev_id, a_uint32_t phy_id);
sw_error_t
dess_psgmii_set_duplex(a_uint32_t dev_id, a_uint32_t phy_id,
fal_port_duplex_t duplex);
sw_error_t
dess_psgmii_get_duplex(a_uint32_t dev_id, a_uint32_t phy_id,
fal_port_duplex_t * duplex);
sw_error_t
dess_psgmii_set_speed(a_uint32_t dev_id, a_uint32_t phy_id,
fal_port_speed_t speed);
sw_error_t
dess_psgmii_get_speed(a_uint32_t dev_id, a_uint32_t phy_id,
fal_port_speed_t * speed);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _DESS_PSGMII_H_ */