1df39890fSTomasz Duszynski /* SPDX-License-Identifier: BSD-3-Clause 2df39890fSTomasz Duszynski * Copyright(C) 2021 Marvell. 3df39890fSTomasz Duszynski */ 4df39890fSTomasz Duszynski 5df39890fSTomasz Duszynski #ifndef _CNXK_BPHY_H_ 6df39890fSTomasz Duszynski #define _CNXK_BPHY_H_ 7df39890fSTomasz Duszynski 8a90735a7STomasz Duszynski #include <stdint.h> 9a90735a7STomasz Duszynski 10a90735a7STomasz Duszynski #include <rte_common.h> 112f6ac042SJakub Palider #include <rte_dev.h> 12a90735a7STomasz Duszynski #include <rte_malloc.h> 13bb85a78dSTomasz Duszynski #include <rte_memcpy.h> 142f6ac042SJakub Palider #include <rte_rawdev.h> 15bb85a78dSTomasz Duszynski 16d309d1e1SJakub Palider /** 17d309d1e1SJakub Palider * @file rte_pmd_bphy.h 18d309d1e1SJakub Palider * 19d309d1e1SJakub Palider * Marvell CGX and BPHY PMD specific structures and interface 20d309d1e1SJakub Palider * 21d309d1e1SJakub Palider * This API allows applications to manage BPHY memory in user space along with 22d309d1e1SJakub Palider * installing interrupt handlers for low latency signal processing. 23d309d1e1SJakub Palider */ 24d309d1e1SJakub Palider 252f6ac042SJakub Palider #ifdef __cplusplus 262f6ac042SJakub Palider extern "C" { 272f6ac042SJakub Palider #endif 287cf19768STomasz Duszynski 290fc53935SStephen Hemminger extern int cnxk_logtype_bphy; 30*2b843cacSDavid Marchand #define RTE_LOGTYPE_CNXK_BPHY cnxk_logtype_bphy 310fc53935SStephen Hemminger 32*2b843cacSDavid Marchand #define CNXK_BPHY_LOG(level, ...) \ 33*2b843cacSDavid Marchand RTE_LOG_LINE_PREFIX(level, CNXK_BPHY, "%s(): ", __func__, __VA_ARGS__) 340fc53935SStephen Hemminger 35d309d1e1SJakub Palider /** Available message types */ 36df39890fSTomasz Duszynski enum cnxk_bphy_cgx_msg_type { 37d309d1e1SJakub Palider /** Type used to obtain link information */ 38df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO, 39d309d1e1SJakub Palider /** Type used to disable internal loopback */ 40df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE, 41d309d1e1SJakub Palider /** Type used to enable loopback */ 42df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_INTLBK_ENABLE, 43d309d1e1SJakub Palider /** Type used to disable PTP on RX */ 44df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_DISABLE, 45d309d1e1SJakub Palider /** Type used to enable PTP on RX */ 46df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_ENABLE, 47d309d1e1SJakub Palider /** Type used to set link mode */ 48df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_MODE, 49d309d1e1SJakub Palider /** Type used to set link state */ 50df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE, 51d309d1e1SJakub Palider /** Type used to start transmission and packet reception */ 52df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_START_RXTX, 53d309d1e1SJakub Palider /** Type used to stop transmission and packet reception */ 54df39890fSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX, 55d309d1e1SJakub Palider /** Type used to obtain supported FEC */ 563b28b365STomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_GET_SUPPORTED_FEC, 57d309d1e1SJakub Palider /** Type used to set FEC */ 581409edecSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_SET_FEC, 597af3e7aaSTomasz Duszynski /** Type used to switch from eCPRI to CPRI */ 607af3e7aaSTomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_CPRI_MODE_CHANGE, 61283c9175STomasz Duszynski /** Type used to enable TX for CPRI SERDES */ 62283c9175STomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_CPRI_TX_CONTROL, 63888123a6STomasz Duszynski /** Type use to change misc CPRI SERDES settings */ 64888123a6STomasz Duszynski CNXK_BPHY_CGX_MSG_TYPE_CPRI_MODE_MISC, 65df39890fSTomasz Duszynski }; 66df39890fSTomasz Duszynski 67d309d1e1SJakub Palider /** Available link speeds */ 68df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_speed { 69d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_NONE, /**< None */ 70d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_10M, /**< 10 Mbps */ 71d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_100M, /**< 100 Mbps */ 72d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_1G, /**< 1 Gbps */ 73d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_2HG, /**< 2.5 Gbps */ 74d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_5G, /**< 5 Gbps */ 75d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_10G, /**< 10 Gbps */ 76d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_20G, /**< 20 Gbps */ 77d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_25G, /**< 25 Gbps */ 78d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_40G, /**< 40 Gbps */ 79d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_50G, /**< 50 Gbps */ 80d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_80G, /**< 80 Gbps */ 81d309d1e1SJakub Palider CNXK_BPHY_CGX_ETH_LINK_SPEED_100G, /**< 100 Gbps */ 82df39890fSTomasz Duszynski __CNXK_BPHY_CGX_ETH_LINK_SPEED_MAX 83df39890fSTomasz Duszynski }; 84df39890fSTomasz Duszynski 85d309d1e1SJakub Palider /** Available FEC modes */ 86df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_fec { 87d309d1e1SJakub Palider /** Disable FEC */ 88df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_FEC_NONE, 89d309d1e1SJakub Palider /** Base FEC (IEEE 802.3 CLause 74) */ 90df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_FEC_BASE_R, 91d309d1e1SJakub Palider /** Reed-Solomon FEC */ 92df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_FEC_RS, 93df39890fSTomasz Duszynski __CNXK_BPHY_CGX_ETH_LINK_FEC_MAX 94df39890fSTomasz Duszynski }; 95df39890fSTomasz Duszynski 96d309d1e1SJakub Palider /** Available link modes */ 97df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_mode { 98d309d1e1SJakub Palider /** SGMII */ 99df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_SGMII_BIT, 100d309d1e1SJakub Palider /** 1000BASE-X */ 101df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_1000_BASEX_BIT, 102d309d1e1SJakub Palider /** QSGMII */ 103df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_QSGMII_BIT, 104d309d1e1SJakub Palider /** 10GBASE-C2C */ 105df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_10G_C2C_BIT, 106d309d1e1SJakub Palider /** 10GBASE-C2M */ 107df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_10G_C2M_BIT, 108d309d1e1SJakub Palider /** 10GBASE-KR */ 109df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_10G_KR_BIT, 110d309d1e1SJakub Palider /** 20GBASE-C2C */ 111df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_20G_C2C_BIT, 112d309d1e1SJakub Palider /** 25GBASE-C2C */ 113df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25G_C2C_BIT, 114d309d1e1SJakub Palider /** 25GBASE-C2M */ 115df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25G_C2M_BIT, 116d309d1e1SJakub Palider /** 25GBASE-2-C2M */ 117df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25G_2_C2C_BIT, 118d309d1e1SJakub Palider /** 25GBASE-CR */ 119df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25G_CR_BIT, 120d309d1e1SJakub Palider /** 25GBASE-KR */ 121df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25G_KR_BIT, 122d309d1e1SJakub Palider /** 40GBASE-C2C */ 123df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_40G_C2C_BIT, 124d309d1e1SJakub Palider /** 40GBASE-C2M */ 125df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_40G_C2M_BIT, 126d309d1e1SJakub Palider /** 40GBASE-CR4 */ 127df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_40G_CR4_BIT, 128d309d1e1SJakub Palider /** 40GBASE-KR4 */ 129df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_40G_KR4_BIT, 130d309d1e1SJakub Palider /** 40GAUI-C2C */ 131df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_40GAUI_C2C_BIT, 132d309d1e1SJakub Palider /** 50GBASE-C2C */ 133df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50G_C2C_BIT, 134d309d1e1SJakub Palider /** 50GBASE-C2M */ 135df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50G_C2M_BIT, 136d309d1e1SJakub Palider /** 50GBASE-4-C2C */ 137df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50G_4_C2C_BIT, 138d309d1e1SJakub Palider /** 50GBASE-CR */ 139df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50G_CR_BIT, 140d309d1e1SJakub Palider /** 50GBASE-KR */ 141df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50G_KR_BIT, 142d309d1e1SJakub Palider /** 80GAUI-C2C */ 143df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_80GAUI_C2C_BIT, 144d309d1e1SJakub Palider /** 100GBASE-C2C */ 145df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100G_C2C_BIT, 146d309d1e1SJakub Palider /** 100GBASE-C2M */ 147df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100G_C2M_BIT, 148d309d1e1SJakub Palider /** 100GBASE-CR4 */ 149df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100G_CR4_BIT, 150d309d1e1SJakub Palider /** 100GBASE-KR4 */ 151df39890fSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100G_KR4_BIT, 152bd2fd34aSTomasz Duszynski /** 50GAUI-2-C2C */ 153bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50GAUI_2_C2C_BIT, 154bd2fd34aSTomasz Duszynski /** 50GAUI-2-C2M */ 155bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50GAUI_2_C2M_BIT, 156bd2fd34aSTomasz Duszynski /** 50GBASE-CR2-C */ 157bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50GBASE_CR2_C_BIT, 158bd2fd34aSTomasz Duszynski /** 50GBASE-KR2-C */ 159bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_50GBASE_KR2_C_BIT, 160bd2fd34aSTomasz Duszynski /** 100GAUI-2-C2C */ 161bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100GAUI_2_C2C_BIT, 162bd2fd34aSTomasz Duszynski /** 100GAUI-2-C2M */ 163bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100GAUI_2_C2M_BIT, 164bd2fd34aSTomasz Duszynski /** 100GBASE-CR2 */ 165bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100GBASE_CR2_BIT, 166bd2fd34aSTomasz Duszynski /** 100GBASE-KR2 */ 167bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_100GBASE_KR2_BIT, 168bd2fd34aSTomasz Duszynski /** SFI-1G */ 169bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_SFI_1G_BIT, 170bd2fd34aSTomasz Duszynski /** 25GBASE-CR-C */ 171bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25GBASE_CR_C_BIT, 172bd2fd34aSTomasz Duszynski /** 25GBASE-KR-C */ 173bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_ETH_LINK_MODE_25GBASE_KR_C_BIT, 174df39890fSTomasz Duszynski __CNXK_BPHY_CGX_ETH_LINK_MODE_MAX 175df39890fSTomasz Duszynski }; 176df39890fSTomasz Duszynski 1772e8bd307STomasz Duszynski enum cnxk_bphy_cgx_eth_mode_cpri { 1782e8bd307STomasz Duszynski /** 2.4G Lane Rate */ 1792e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_2_4G_BIT, 1802e8bd307STomasz Duszynski /** 3.1G Lane Rate */ 1812e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_3_1G_BIT, 1822e8bd307STomasz Duszynski /** 4.9G Lane Rate */ 1832e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_4_9G_BIT, 1842e8bd307STomasz Duszynski /** 6.1G Lane Rate */ 1852e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_6_1G_BIT, 1862e8bd307STomasz Duszynski /** 9.8G Lane Rate */ 1872e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_9_8G_BIT, 1882e8bd307STomasz Duszynski /** 10.1G Lane Rate */ 1892e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_10_1_BIT, 1902e8bd307STomasz Duszynski /** 24.3G Lane Rate */ 1912e8bd307STomasz Duszynski CNXK_BPHY_CGX_ETH_MODE_CPRI_24_3G_BIT, 1922e8bd307STomasz Duszynski }; 1932e8bd307STomasz Duszynski 194bd2fd34aSTomasz Duszynski enum cnxk_bphy_cgx_mode_group { 195bd2fd34aSTomasz Duszynski /** ETH group */ 196bd2fd34aSTomasz Duszynski CNXK_BPHY_CGX_MODE_GROUP_ETH, 1972e8bd307STomasz Duszynski /** CPRI group */ 1982e8bd307STomasz Duszynski CNXK_BPHY_CGX_MODE_GROUP_CPRI = 2, 199bd2fd34aSTomasz Duszynski }; 200bd2fd34aSTomasz Duszynski 201df39890fSTomasz Duszynski struct cnxk_bphy_cgx_msg_link_mode { 202d309d1e1SJakub Palider /** Setting for full-duplex */ 203df39890fSTomasz Duszynski bool full_duplex; 204d309d1e1SJakub Palider /** Setting for automatic link negotiation */ 205df39890fSTomasz Duszynski bool autoneg; 206bd2fd34aSTomasz Duszynski /** Set to true to use port index */ 207bd2fd34aSTomasz Duszynski bool use_portm_idx; 208bd2fd34aSTomasz Duszynski /** Port index */ 209bd2fd34aSTomasz Duszynski unsigned int portm_idx; 210bd2fd34aSTomasz Duszynski /** Mode group */ 211bd2fd34aSTomasz Duszynski enum cnxk_bphy_cgx_mode_group mode_group_idx; 212d309d1e1SJakub Palider /** Link speed */ 213df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_speed speed; 2142e8bd307STomasz Duszynski union { 215d309d1e1SJakub Palider /** Link mode */ 216df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_mode mode; 2172e8bd307STomasz Duszynski /** CPRI mode */ 2182e8bd307STomasz Duszynski enum cnxk_bphy_cgx_eth_mode_cpri mode_cpri; 2192e8bd307STomasz Duszynski }; 220df39890fSTomasz Duszynski }; 221df39890fSTomasz Duszynski 222df39890fSTomasz Duszynski struct cnxk_bphy_cgx_msg_link_info { 223d309d1e1SJakub Palider /** Link state information */ 224df39890fSTomasz Duszynski bool link_up; 225d309d1e1SJakub Palider /** Link full duplex state */ 226df39890fSTomasz Duszynski bool full_duplex; 227d309d1e1SJakub Palider /** Link speed */ 228df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_speed speed; 229d309d1e1SJakub Palider /** Link auto-negotiation setting */ 230df39890fSTomasz Duszynski bool autoneg; 231d309d1e1SJakub Palider /** FEC mode */ 232df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_fec fec; 233d309d1e1SJakub Palider /** Link configuration */ 234df39890fSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_mode mode; 235df39890fSTomasz Duszynski }; 236df39890fSTomasz Duszynski 237df39890fSTomasz Duszynski struct cnxk_bphy_cgx_msg_set_link_state { 238d309d1e1SJakub Palider /** Defines link state result */ 239df39890fSTomasz Duszynski bool state; /* up or down */ 2406576ef65STomasz Duszynski /** Timeout in ms */ 2416576ef65STomasz Duszynski int timeout; 2426576ef65STomasz Duszynski /** Set if Rx/Tx should not be enabled during link up config */ 2436576ef65STomasz Duszynski bool rx_tx_dis; 244df39890fSTomasz Duszynski }; 245df39890fSTomasz Duszynski 2467af3e7aaSTomasz Duszynski struct cnxk_bphy_cgx_msg_cpri_mode_change { 2477af3e7aaSTomasz Duszynski /** SERDES index (0 - 4) */ 2487af3e7aaSTomasz Duszynski int gserc_idx; 2497af3e7aaSTomasz Duszynski /** Lane index (0 - 1) */ 2507af3e7aaSTomasz Duszynski int lane_idx; 2517af3e7aaSTomasz Duszynski /** Baud rate (9830/4915/2458/6144/3072) */ 2527af3e7aaSTomasz Duszynski int rate; 2537af3e7aaSTomasz Duszynski /** Disable LEQ */ 2547af3e7aaSTomasz Duszynski bool disable_leq; 2557af3e7aaSTomasz Duszynski /** Disable DFE */ 2567af3e7aaSTomasz Duszynski bool disable_dfe; 2577af3e7aaSTomasz Duszynski }; 2587af3e7aaSTomasz Duszynski 259283c9175STomasz Duszynski struct cnxk_bphy_cgx_msg_cpri_mode_tx_ctrl { 260283c9175STomasz Duszynski /** SERDES index (0 - 4) */ 261283c9175STomasz Duszynski int gserc_idx; 262283c9175STomasz Duszynski /** Lane index (0 - 1) */ 263283c9175STomasz Duszynski int lane_idx; 264283c9175STomasz Duszynski /** Disable or enable SERDES */ 265283c9175STomasz Duszynski bool enable; 266283c9175STomasz Duszynski }; 267283c9175STomasz Duszynski 268888123a6STomasz Duszynski struct cnxk_bphy_cgx_msg_cpri_mode_misc { 269888123a6STomasz Duszynski /** SERDES index (0 - 4) */ 270888123a6STomasz Duszynski int gserc_idx; 271888123a6STomasz Duszynski /** Lane index (0 - 1) */ 272888123a6STomasz Duszynski int lane_idx; 273888123a6STomasz Duszynski /** Misc flags (0 - RX Eq, 1 - RX state machine reset) */ 274888123a6STomasz Duszynski int flags; 275888123a6STomasz Duszynski }; 276888123a6STomasz Duszynski 277df39890fSTomasz Duszynski struct cnxk_bphy_cgx_msg { 278d309d1e1SJakub Palider /** Message type */ 279df39890fSTomasz Duszynski enum cnxk_bphy_cgx_msg_type type; 280d309d1e1SJakub Palider /** 281d309d1e1SJakub Palider * Data depends on message type and whether 282df39890fSTomasz Duszynski * it's a request or a response 283df39890fSTomasz Duszynski */ 284df39890fSTomasz Duszynski void *data; 285df39890fSTomasz Duszynski }; 286df39890fSTomasz Duszynski 2877cf19768STomasz Duszynski #define CNXK_BPHY_DEF_QUEUE 0 2887cf19768STomasz Duszynski 289d309d1e1SJakub Palider /** 290d309d1e1SJakub Palider * BPHY interrupt handler 291d309d1e1SJakub Palider * 292d309d1e1SJakub Palider * @param irq_num 293d309d1e1SJakub Palider * Zero-based interrupt number 294d309d1e1SJakub Palider * @param isr_data 295d309d1e1SJakub Palider * Cookie passed to interrupt handler 296d309d1e1SJakub Palider */ 2972f6ac042SJakub Palider typedef void (*cnxk_bphy_intr_handler_t)(int irq_num, void *isr_data); 2982f6ac042SJakub Palider 2992f6ac042SJakub Palider struct cnxk_bphy_mem { 300d309d1e1SJakub Palider /** Memory for BAR0 */ 3012f6ac042SJakub Palider struct rte_mem_resource res0; 302d309d1e1SJakub Palider /** Memory for BAR2 */ 3032f6ac042SJakub Palider struct rte_mem_resource res2; 3042f6ac042SJakub Palider }; 3052f6ac042SJakub Palider 306d309d1e1SJakub Palider /** Available IRQ configuration commands */ 307ca25655eSTomasz Duszynski enum cnxk_bphy_irq_msg_type { 308d309d1e1SJakub Palider /** Type used to initialize interrupts */ 309ca25655eSTomasz Duszynski CNXK_BPHY_IRQ_MSG_TYPE_INIT, 310d309d1e1SJakub Palider /** Type used to deinitialize interrupts */ 311ca25655eSTomasz Duszynski CNXK_BPHY_IRQ_MSG_TYPE_FINI, 312d309d1e1SJakub Palider /** Type used to register interrupt */ 313ca25655eSTomasz Duszynski CNXK_BPHY_IRQ_MSG_TYPE_REGISTER, 314d309d1e1SJakub Palider /** Type used to unregister interrupt */ 315ca25655eSTomasz Duszynski CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER, 316d309d1e1SJakub Palider /** Type used to retrieve BPHY memory */ 317ca25655eSTomasz Duszynski CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET, 318d309d1e1SJakub Palider /** Type used to retrieve NPA PF function */ 319f1704016STomasz Duszynski CNXK_BPHY_MSG_TYPE_NPA_PF_FUNC, 320d309d1e1SJakub Palider /** Type used to retrieve NPA SSO function */ 321f1704016STomasz Duszynski CNXK_BPHY_MSG_TYPE_SSO_PF_FUNC, 322ca25655eSTomasz Duszynski }; 323ca25655eSTomasz Duszynski 324ca25655eSTomasz Duszynski struct cnxk_bphy_irq_msg { 325d309d1e1SJakub Palider /** Message command type */ 326ca25655eSTomasz Duszynski enum cnxk_bphy_irq_msg_type type; 327d309d1e1SJakub Palider /** 328d309d1e1SJakub Palider * Data depends on message type and whether 329d309d1e1SJakub Palider * it is a request or a response 330e50cb223STomasz Duszynski */ 331ca25655eSTomasz Duszynski void *data; 332ca25655eSTomasz Duszynski }; 333ca25655eSTomasz Duszynski 3347cf19768STomasz Duszynski struct cnxk_bphy_irq_info { 335d309d1e1SJakub Palider /** Interrupt number */ 3367cf19768STomasz Duszynski int irq_num; 337d309d1e1SJakub Palider /** Interrupt handler */ 3387cf19768STomasz Duszynski cnxk_bphy_intr_handler_t handler; 339d309d1e1SJakub Palider /** Interrupt handler cookie */ 3407cf19768STomasz Duszynski void *data; 341d309d1e1SJakub Palider /** CPU zero-based number for interrupt execution */ 3427cf19768STomasz Duszynski int cpu; 3437cf19768STomasz Duszynski }; 3447cf19768STomasz Duszynski 345d309d1e1SJakub Palider /** @internal helper routine for enqueuing/dequeuing messages */ 3467cf19768STomasz Duszynski static __rte_always_inline int 347bb85a78dSTomasz Duszynski __rte_pmd_bphy_enq_deq(uint16_t dev_id, unsigned int queue, void *req, 348bb85a78dSTomasz Duszynski void *rsp, size_t rsp_size) 349bb85a78dSTomasz Duszynski { 350bb85a78dSTomasz Duszynski struct rte_rawdev_buf *bufs[1]; 351bb85a78dSTomasz Duszynski struct rte_rawdev_buf buf; 352bb85a78dSTomasz Duszynski void *q; 353bb85a78dSTomasz Duszynski int ret; 354bb85a78dSTomasz Duszynski 355bb85a78dSTomasz Duszynski q = (void *)(size_t)queue; 356bb85a78dSTomasz Duszynski buf.buf_addr = req; 357bb85a78dSTomasz Duszynski bufs[0] = &buf; 358bb85a78dSTomasz Duszynski 359bb85a78dSTomasz Duszynski ret = rte_rawdev_enqueue_buffers(dev_id, bufs, RTE_DIM(bufs), q); 360bb85a78dSTomasz Duszynski if (ret < 0) 361bb85a78dSTomasz Duszynski return ret; 362bb85a78dSTomasz Duszynski if (ret != RTE_DIM(bufs)) 363bb85a78dSTomasz Duszynski return -EIO; 364bb85a78dSTomasz Duszynski 365bb85a78dSTomasz Duszynski if (!rsp) 366bb85a78dSTomasz Duszynski return 0; 367bb85a78dSTomasz Duszynski 368bb85a78dSTomasz Duszynski ret = rte_rawdev_dequeue_buffers(dev_id, bufs, RTE_DIM(bufs), q); 369bb85a78dSTomasz Duszynski if (ret < 0) 370bb85a78dSTomasz Duszynski return ret; 371bb85a78dSTomasz Duszynski if (ret != RTE_DIM(bufs)) 372bb85a78dSTomasz Duszynski return -EIO; 373bb85a78dSTomasz Duszynski 374bb85a78dSTomasz Duszynski rte_memcpy(rsp, buf.buf_addr, rsp_size); 375bb85a78dSTomasz Duszynski rte_free(buf.buf_addr); 376bb85a78dSTomasz Duszynski 377bb85a78dSTomasz Duszynski return 0; 378bb85a78dSTomasz Duszynski } 379bb85a78dSTomasz Duszynski 380d309d1e1SJakub Palider /** 381d309d1e1SJakub Palider * Initialize BPHY subsystem 382d309d1e1SJakub Palider * 383d309d1e1SJakub Palider * @param dev_id 384d309d1e1SJakub Palider * The identifier of the device 385d309d1e1SJakub Palider * 386d309d1e1SJakub Palider * @return 387d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 388d309d1e1SJakub Palider */ 389bb85a78dSTomasz Duszynski static __rte_always_inline int 3907cf19768STomasz Duszynski rte_pmd_bphy_intr_init(uint16_t dev_id) 3917cf19768STomasz Duszynski { 3927cf19768STomasz Duszynski struct cnxk_bphy_irq_msg msg = { 3937cf19768STomasz Duszynski .type = CNXK_BPHY_IRQ_MSG_TYPE_INIT, 3947cf19768STomasz Duszynski }; 3957cf19768STomasz Duszynski 396bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 397bb85a78dSTomasz Duszynski NULL, 0); 3987cf19768STomasz Duszynski } 3997cf19768STomasz Duszynski 400d309d1e1SJakub Palider /** 401d309d1e1SJakub Palider * Deinitialize BPHY subsystem 402d309d1e1SJakub Palider * 403d309d1e1SJakub Palider * @param dev_id 404d309d1e1SJakub Palider * The identifier of the device 405d309d1e1SJakub Palider * 406d309d1e1SJakub Palider * @return 407d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 408d309d1e1SJakub Palider */ 409bb85a78dSTomasz Duszynski static __rte_always_inline int 4107cf19768STomasz Duszynski rte_pmd_bphy_intr_fini(uint16_t dev_id) 4117cf19768STomasz Duszynski { 4127cf19768STomasz Duszynski struct cnxk_bphy_irq_msg msg = { 4137cf19768STomasz Duszynski .type = CNXK_BPHY_IRQ_MSG_TYPE_FINI, 4147cf19768STomasz Duszynski }; 4157cf19768STomasz Duszynski 416bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 417bb85a78dSTomasz Duszynski NULL, 0); 4187cf19768STomasz Duszynski } 4197cf19768STomasz Duszynski 420d309d1e1SJakub Palider /** 421d309d1e1SJakub Palider * Register BPHY interrupt handler 422d309d1e1SJakub Palider * 423d309d1e1SJakub Palider * @param dev_id 424d309d1e1SJakub Palider * The identifier of the device 425d309d1e1SJakub Palider * @param irq_num 426d309d1e1SJakub Palider * Zero-based interrupt number 427d309d1e1SJakub Palider * @param handler 428d309d1e1SJakub Palider * Interrupt handler to be executed 429d309d1e1SJakub Palider * @param data 430d309d1e1SJakub Palider * Data to be passed to interrupt handler 431d309d1e1SJakub Palider * @param cpu 432d309d1e1SJakub Palider * CPU number which will be handling interrupt 433d309d1e1SJakub Palider * 434d309d1e1SJakub Palider * @return 435d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 436d309d1e1SJakub Palider */ 43764fa1ebdSTomasz Duszynski static __rte_always_inline int 43864fa1ebdSTomasz Duszynski rte_pmd_bphy_intr_register(uint16_t dev_id, int irq_num, 43964fa1ebdSTomasz Duszynski cnxk_bphy_intr_handler_t handler, void *data, 44064fa1ebdSTomasz Duszynski int cpu) 44164fa1ebdSTomasz Duszynski { 44264fa1ebdSTomasz Duszynski struct cnxk_bphy_irq_info info = { 44364fa1ebdSTomasz Duszynski .irq_num = irq_num, 44464fa1ebdSTomasz Duszynski .handler = handler, 44564fa1ebdSTomasz Duszynski .data = data, 44664fa1ebdSTomasz Duszynski .cpu = cpu, 44764fa1ebdSTomasz Duszynski }; 44864fa1ebdSTomasz Duszynski struct cnxk_bphy_irq_msg msg = { 44964fa1ebdSTomasz Duszynski .type = CNXK_BPHY_IRQ_MSG_TYPE_REGISTER, 45064fa1ebdSTomasz Duszynski .data = &info 45164fa1ebdSTomasz Duszynski }; 45264fa1ebdSTomasz Duszynski 453bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 454bb85a78dSTomasz Duszynski NULL, 0); 45564fa1ebdSTomasz Duszynski } 45664fa1ebdSTomasz Duszynski 457d309d1e1SJakub Palider /** 458d309d1e1SJakub Palider * Unregister BPHY interrupt handler 459d309d1e1SJakub Palider * 460d309d1e1SJakub Palider * @param dev_id 461d309d1e1SJakub Palider * The identifier of the device 462d309d1e1SJakub Palider * @param irq_num 463d309d1e1SJakub Palider * Zero-based interrupt number used during registration 464d309d1e1SJakub Palider * 465d309d1e1SJakub Palider * @return 466d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 467d309d1e1SJakub Palider */ 468bb85a78dSTomasz Duszynski static __rte_always_inline int 46964fa1ebdSTomasz Duszynski rte_pmd_bphy_intr_unregister(uint16_t dev_id, int irq_num) 47064fa1ebdSTomasz Duszynski { 47164fa1ebdSTomasz Duszynski struct cnxk_bphy_irq_info info = { 47264fa1ebdSTomasz Duszynski .irq_num = irq_num, 47364fa1ebdSTomasz Duszynski }; 47464fa1ebdSTomasz Duszynski struct cnxk_bphy_irq_msg msg = { 47564fa1ebdSTomasz Duszynski .type = CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER, 47664fa1ebdSTomasz Duszynski .data = &info 47764fa1ebdSTomasz Duszynski }; 47864fa1ebdSTomasz Duszynski 479bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 480bb85a78dSTomasz Duszynski NULL, 0); 48164fa1ebdSTomasz Duszynski } 48264fa1ebdSTomasz Duszynski 483d309d1e1SJakub Palider /** 484d309d1e1SJakub Palider * Obtain BPHY memory 485d309d1e1SJakub Palider * 486d309d1e1SJakub Palider * @param dev_id 487d309d1e1SJakub Palider * The identifier of the device 488d309d1e1SJakub Palider * @param mem 489d309d1e1SJakub Palider * Memory structure which will be filled for memory access 490d309d1e1SJakub Palider * 491d309d1e1SJakub Palider * @return 492d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 493d309d1e1SJakub Palider */ 494bb85a78dSTomasz Duszynski static __rte_always_inline int 495bb85a78dSTomasz Duszynski rte_pmd_bphy_intr_mem_get(uint16_t dev_id, struct cnxk_bphy_mem *mem) 496e50cb223STomasz Duszynski { 497e50cb223STomasz Duszynski struct cnxk_bphy_irq_msg msg = { 498e50cb223STomasz Duszynski .type = CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET, 499e50cb223STomasz Duszynski }; 500e50cb223STomasz Duszynski 501bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 502bb85a78dSTomasz Duszynski mem, sizeof(*mem)); 503e50cb223STomasz Duszynski } 504e50cb223STomasz Duszynski 505d309d1e1SJakub Palider /** 506d309d1e1SJakub Palider * Obtain NPA PF func 507d309d1e1SJakub Palider * 508d309d1e1SJakub Palider * @param dev_id 509d309d1e1SJakub Palider * The identifier of the device 510d309d1e1SJakub Palider * @param pf_func 511d309d1e1SJakub Palider * NPA PF function to obtain 512d309d1e1SJakub Palider * 513d309d1e1SJakub Palider * @return 514d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 515d309d1e1SJakub Palider */ 516bb85a78dSTomasz Duszynski static __rte_always_inline int 517bb85a78dSTomasz Duszynski rte_pmd_bphy_npa_pf_func_get(uint16_t dev_id, uint16_t *pf_func) 518f1704016STomasz Duszynski { 519f1704016STomasz Duszynski struct cnxk_bphy_irq_msg msg = { 520f1704016STomasz Duszynski .type = CNXK_BPHY_MSG_TYPE_NPA_PF_FUNC, 521f1704016STomasz Duszynski }; 522f1704016STomasz Duszynski 523bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 524bb85a78dSTomasz Duszynski pf_func, sizeof(*pf_func)); 525f1704016STomasz Duszynski } 526f1704016STomasz Duszynski 527d309d1e1SJakub Palider /** 528d309d1e1SJakub Palider * Obtain SSO PF func 529d309d1e1SJakub Palider * 530d309d1e1SJakub Palider * @param dev_id 531d309d1e1SJakub Palider * The identifier of the device 532d309d1e1SJakub Palider * @param pf_func 533d309d1e1SJakub Palider * SSO PF function to obtain 534d309d1e1SJakub Palider * 535d309d1e1SJakub Palider * @return 536d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 537d309d1e1SJakub Palider */ 538bb85a78dSTomasz Duszynski static __rte_always_inline int 539bb85a78dSTomasz Duszynski rte_pmd_bphy_sso_pf_func_get(uint16_t dev_id, uint16_t *pf_func) 540f1704016STomasz Duszynski { 541f1704016STomasz Duszynski struct cnxk_bphy_irq_msg msg = { 542f1704016STomasz Duszynski .type = CNXK_BPHY_MSG_TYPE_SSO_PF_FUNC, 543f1704016STomasz Duszynski }; 544f1704016STomasz Duszynski 545bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, CNXK_BPHY_DEF_QUEUE, &msg, 546bb85a78dSTomasz Duszynski pf_func, sizeof(*pf_func)); 547bb85a78dSTomasz Duszynski } 548f1704016STomasz Duszynski 549d309d1e1SJakub Palider /** 550d309d1e1SJakub Palider * Obtain link information 551d309d1e1SJakub Palider * 552d309d1e1SJakub Palider * @param dev_id 553d309d1e1SJakub Palider * The identifier of the device 554d309d1e1SJakub Palider * @param lmac 555d309d1e1SJakub Palider * LMAC number for operation 556d309d1e1SJakub Palider * @param info 557d309d1e1SJakub Palider * Link information structure 558d309d1e1SJakub Palider * 559d309d1e1SJakub Palider * @return 560d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 561d309d1e1SJakub Palider */ 562bb85a78dSTomasz Duszynski static __rte_always_inline int 563bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_get_link_info(uint16_t dev_id, uint16_t lmac, 564bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg_link_info *info) 565bb85a78dSTomasz Duszynski { 566bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 567bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_GET_LINKINFO, 568bb85a78dSTomasz Duszynski }; 569f1704016STomasz Duszynski 570bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, info, sizeof(*info)); 571bb85a78dSTomasz Duszynski } 572f1704016STomasz Duszynski 573d309d1e1SJakub Palider /** 574d309d1e1SJakub Palider * Disable loopback mode for an interface 575d309d1e1SJakub Palider * 576d309d1e1SJakub Palider * @param dev_id 577d309d1e1SJakub Palider * The identifier of the device 578d309d1e1SJakub Palider * @param lmac 579d309d1e1SJakub Palider * LMAC number for operation 580d309d1e1SJakub Palider * 581d309d1e1SJakub Palider * @return 582d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 583d309d1e1SJakub Palider */ 584bb85a78dSTomasz Duszynski static __rte_always_inline int 585bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_intlbk_disable(uint16_t dev_id, uint16_t lmac) 586bb85a78dSTomasz Duszynski { 587bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 588bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_INTLBK_DISABLE, 589bb85a78dSTomasz Duszynski }; 590bb85a78dSTomasz Duszynski 591bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 592bb85a78dSTomasz Duszynski } 593bb85a78dSTomasz Duszynski 594d309d1e1SJakub Palider /** 595d309d1e1SJakub Palider * Enable loopback mode for an interface 596d309d1e1SJakub Palider * 597d309d1e1SJakub Palider * @param dev_id 598d309d1e1SJakub Palider * The identifier of the device 599d309d1e1SJakub Palider * @param lmac 600d309d1e1SJakub Palider * LMAC number for operation 601d309d1e1SJakub Palider * 602d309d1e1SJakub Palider * @return 603d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 604d309d1e1SJakub Palider */ 605bb85a78dSTomasz Duszynski static __rte_always_inline int 606bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_intlbk_enable(uint16_t dev_id, uint16_t lmac) 607bb85a78dSTomasz Duszynski { 608bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 609bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_INTLBK_ENABLE, 610bb85a78dSTomasz Duszynski }; 611bb85a78dSTomasz Duszynski 612bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 613bb85a78dSTomasz Duszynski } 614bb85a78dSTomasz Duszynski 615d309d1e1SJakub Palider /** 616d309d1e1SJakub Palider * Disable PTP on RX path 617d309d1e1SJakub Palider * 618d309d1e1SJakub Palider * @param dev_id 619d309d1e1SJakub Palider * The identifier of the device 620d309d1e1SJakub Palider * @param lmac 621d309d1e1SJakub Palider * LMAC number for operation 622d309d1e1SJakub Palider * 623d309d1e1SJakub Palider * @return 624d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 625d309d1e1SJakub Palider */ 626bb85a78dSTomasz Duszynski static __rte_always_inline int 627bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_ptp_rx_disable(uint16_t dev_id, uint16_t lmac) 628bb85a78dSTomasz Duszynski { 629bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 630bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_DISABLE, 631bb85a78dSTomasz Duszynski }; 632bb85a78dSTomasz Duszynski 633bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 634bb85a78dSTomasz Duszynski } 635bb85a78dSTomasz Duszynski 636d309d1e1SJakub Palider /** 637d309d1e1SJakub Palider * Enable PTP on RX path 638d309d1e1SJakub Palider * 639d309d1e1SJakub Palider * @param dev_id 640d309d1e1SJakub Palider * The identifier of the device 641d309d1e1SJakub Palider * @param lmac 642d309d1e1SJakub Palider * LMAC number for operation 643d309d1e1SJakub Palider * 644d309d1e1SJakub Palider * @return 645d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 646d309d1e1SJakub Palider */ 647bb85a78dSTomasz Duszynski static __rte_always_inline int 648bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_ptp_rx_enable(uint16_t dev_id, uint16_t lmac) 649bb85a78dSTomasz Duszynski { 650bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 651bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_PTP_RX_ENABLE, 652bb85a78dSTomasz Duszynski }; 653bb85a78dSTomasz Duszynski 654bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 655bb85a78dSTomasz Duszynski } 656bb85a78dSTomasz Duszynski 657d309d1e1SJakub Palider /** 658d309d1e1SJakub Palider * Set link mode for a CGX 659d309d1e1SJakub Palider * 660d309d1e1SJakub Palider * @param dev_id 661d309d1e1SJakub Palider * The identifier of the device 662d309d1e1SJakub Palider * @param lmac 663d309d1e1SJakub Palider * LMAC number for operation 664d309d1e1SJakub Palider * @param mode 665d309d1e1SJakub Palider * Link mode to set 666d309d1e1SJakub Palider * 667d309d1e1SJakub Palider * @return 668d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 669d309d1e1SJakub Palider */ 670bb85a78dSTomasz Duszynski static __rte_always_inline int 671bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_set_link_mode(uint16_t dev_id, uint16_t lmac, 672bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg_link_mode *mode) 673bb85a78dSTomasz Duszynski { 674bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 675bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_MODE, 676bb85a78dSTomasz Duszynski .data = mode, 677bb85a78dSTomasz Duszynski }; 678bb85a78dSTomasz Duszynski 679bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 680bb85a78dSTomasz Duszynski } 681bb85a78dSTomasz Duszynski 682d309d1e1SJakub Palider /** 683d309d1e1SJakub Palider * Set link state for a CGX 684d309d1e1SJakub Palider * 685d309d1e1SJakub Palider * @param dev_id 686d309d1e1SJakub Palider * The identifier of the device 687d309d1e1SJakub Palider * @param lmac 688d309d1e1SJakub Palider * LMAC number for operation 6896576ef65STomasz Duszynski * @param state 690d309d1e1SJakub Palider * Link state to set 691d309d1e1SJakub Palider * 692d309d1e1SJakub Palider * @return 693d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 694d309d1e1SJakub Palider */ 695bb85a78dSTomasz Duszynski static __rte_always_inline int 6966576ef65STomasz Duszynski rte_pmd_bphy_cgx_set_link_state(uint16_t dev_id, uint16_t lmac, 6976576ef65STomasz Duszynski struct cnxk_bphy_cgx_msg_set_link_state *state) 698bb85a78dSTomasz Duszynski { 699bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 700bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_SET_LINK_STATE, 7016576ef65STomasz Duszynski .data = state, 702bb85a78dSTomasz Duszynski }; 703bb85a78dSTomasz Duszynski 704bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 705bb85a78dSTomasz Duszynski } 706bb85a78dSTomasz Duszynski 707d309d1e1SJakub Palider /** 708d309d1e1SJakub Palider * Start CGX 709d309d1e1SJakub Palider * 710d309d1e1SJakub Palider * @param dev_id 711d309d1e1SJakub Palider * The identifier of the device 712d309d1e1SJakub Palider * @param lmac 713d309d1e1SJakub Palider * LMAC number for operation 714d309d1e1SJakub Palider * 715d309d1e1SJakub Palider * @return 716d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 717d309d1e1SJakub Palider */ 718bb85a78dSTomasz Duszynski static __rte_always_inline int 719bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_start_rxtx(uint16_t dev_id, uint16_t lmac) 720bb85a78dSTomasz Duszynski { 721bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 722bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_START_RXTX, 723bb85a78dSTomasz Duszynski }; 724bb85a78dSTomasz Duszynski 725bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 726bb85a78dSTomasz Duszynski } 727bb85a78dSTomasz Duszynski 728d309d1e1SJakub Palider /** 729d309d1e1SJakub Palider * Stop CGX 730d309d1e1SJakub Palider * 731d309d1e1SJakub Palider * @param dev_id 732d309d1e1SJakub Palider * The identifier of the device 733d309d1e1SJakub Palider * @param lmac 734d309d1e1SJakub Palider * LMAC number for operation 735d309d1e1SJakub Palider * 736d309d1e1SJakub Palider * @return 737d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 738d309d1e1SJakub Palider */ 739bb85a78dSTomasz Duszynski static __rte_always_inline int 740bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_stop_rxtx(uint16_t dev_id, uint16_t lmac) 741bb85a78dSTomasz Duszynski { 742bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 743bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_STOP_RXTX, 744bb85a78dSTomasz Duszynski }; 745bb85a78dSTomasz Duszynski 746bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 747bb85a78dSTomasz Duszynski } 748bb85a78dSTomasz Duszynski 749d309d1e1SJakub Palider /** 750d309d1e1SJakub Palider * Get supported list FEC mode 751d309d1e1SJakub Palider * 752d309d1e1SJakub Palider * @param dev_id 753d309d1e1SJakub Palider * The identifier of the device 754d309d1e1SJakub Palider * @param lmac 755d309d1e1SJakub Palider * LMAC number for operation 756d309d1e1SJakub Palider * @param fec 757d309d1e1SJakub Palider * FEC structure which holds information 758d309d1e1SJakub Palider * 759d309d1e1SJakub Palider * @return 760d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 761d309d1e1SJakub Palider */ 762bb85a78dSTomasz Duszynski static __rte_always_inline int 763bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_get_supported_fec(uint16_t dev_id, uint16_t lmac, 764bb85a78dSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_fec *fec) 765bb85a78dSTomasz Duszynski { 766bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 767bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_GET_SUPPORTED_FEC, 768bb85a78dSTomasz Duszynski }; 769bb85a78dSTomasz Duszynski 770bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, fec, sizeof(*fec)); 771bb85a78dSTomasz Duszynski } 772bb85a78dSTomasz Duszynski 773d309d1e1SJakub Palider /** 774d309d1e1SJakub Palider * Set FEC mode for a device 775d309d1e1SJakub Palider * 776d309d1e1SJakub Palider * @param dev_id 777d309d1e1SJakub Palider * The identifier of the device 778d309d1e1SJakub Palider * @param lmac 779d309d1e1SJakub Palider * LMAC number for operation 780d309d1e1SJakub Palider * @param fec 781d309d1e1SJakub Palider * FEC structure which holds information to set 782d309d1e1SJakub Palider * 783d309d1e1SJakub Palider * @return 784d309d1e1SJakub Palider * Returns 0 on success, negative error code otherwise 785d309d1e1SJakub Palider */ 786bb85a78dSTomasz Duszynski static __rte_always_inline int 787bb85a78dSTomasz Duszynski rte_pmd_bphy_cgx_set_fec(uint16_t dev_id, uint16_t lmac, 788bb85a78dSTomasz Duszynski enum cnxk_bphy_cgx_eth_link_fec fec) 789bb85a78dSTomasz Duszynski { 790bb85a78dSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 791bb85a78dSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_SET_FEC, 792bb85a78dSTomasz Duszynski .data = &fec, 793bb85a78dSTomasz Duszynski }; 794bb85a78dSTomasz Duszynski 795bb85a78dSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 796f1704016STomasz Duszynski } 797f1704016STomasz Duszynski 7987af3e7aaSTomasz Duszynski /** 7997af3e7aaSTomasz Duszynski * Switch from eCPRI to CPRI and change 8007af3e7aaSTomasz Duszynski * 8017af3e7aaSTomasz Duszynski * @param dev_id 8027af3e7aaSTomasz Duszynski * The identifier of the device 8037af3e7aaSTomasz Duszynski * @param lmac 8047af3e7aaSTomasz Duszynski * LMAC number for operation 8057af3e7aaSTomasz Duszynski * @param mode 8067af3e7aaSTomasz Duszynski * CPRI structure which holds configuration data 8077af3e7aaSTomasz Duszynski * 8087af3e7aaSTomasz Duszynski * @return 8097af3e7aaSTomasz Duszynski * Returns 0 on success, negative error code otherwise 8107af3e7aaSTomasz Duszynski */ 8117af3e7aaSTomasz Duszynski static __rte_always_inline int 8127af3e7aaSTomasz Duszynski rte_pmd_bphy_cgx_cpri_mode_change(uint16_t dev_id, uint16_t lmac, 8137af3e7aaSTomasz Duszynski struct cnxk_bphy_cgx_msg_cpri_mode_change *mode) 8147af3e7aaSTomasz Duszynski { 8157af3e7aaSTomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 8167af3e7aaSTomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_CPRI_MODE_CHANGE, 8177af3e7aaSTomasz Duszynski .data = mode, 8187af3e7aaSTomasz Duszynski }; 8197af3e7aaSTomasz Duszynski 8207af3e7aaSTomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 8217af3e7aaSTomasz Duszynski } 8227af3e7aaSTomasz Duszynski 823283c9175STomasz Duszynski /** 824283c9175STomasz Duszynski * Enable TX for SERDES configured in CPRI mode 825283c9175STomasz Duszynski * 826283c9175STomasz Duszynski * @param dev_id 827283c9175STomasz Duszynski * The identifier of the device 828283c9175STomasz Duszynski * @param lmac 829283c9175STomasz Duszynski * LMAC number for operation 830283c9175STomasz Duszynski * @param mode 831283c9175STomasz Duszynski * CPRI TX control structure holding control data 832283c9175STomasz Duszynski * 833283c9175STomasz Duszynski * @return 834283c9175STomasz Duszynski * Returns 0 on success, negative error code otherwise 835283c9175STomasz Duszynski */ 836283c9175STomasz Duszynski static __rte_always_inline int 837283c9175STomasz Duszynski rte_pmd_bphy_cgx_cpri_tx_control(uint16_t dev_id, uint16_t lmac, 838283c9175STomasz Duszynski struct cnxk_bphy_cgx_msg_cpri_mode_tx_ctrl *mode) 839283c9175STomasz Duszynski { 840283c9175STomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 841283c9175STomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_CPRI_TX_CONTROL, 842283c9175STomasz Duszynski .data = mode, 843283c9175STomasz Duszynski }; 844283c9175STomasz Duszynski 845283c9175STomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 846283c9175STomasz Duszynski } 847283c9175STomasz Duszynski 848888123a6STomasz Duszynski /** 849888123a6STomasz Duszynski * CPRI misc settings 850888123a6STomasz Duszynski * 851888123a6STomasz Duszynski * @param dev_id 852888123a6STomasz Duszynski * The identifier of the device 853888123a6STomasz Duszynski * @param lmac 854888123a6STomasz Duszynski * LMAC number for operation 855888123a6STomasz Duszynski * @param mode 856888123a6STomasz Duszynski * CPRI settings holding misc control data 857888123a6STomasz Duszynski * 858888123a6STomasz Duszynski * @return 859888123a6STomasz Duszynski * Returns 0 on success, negative error code otherwise 860888123a6STomasz Duszynski */ 861888123a6STomasz Duszynski static __rte_always_inline int 862888123a6STomasz Duszynski rte_pmd_bphy_cgx_cpri_mode_misc(uint16_t dev_id, uint16_t lmac, 863888123a6STomasz Duszynski struct cnxk_bphy_cgx_msg_cpri_mode_misc *mode) 864888123a6STomasz Duszynski { 865888123a6STomasz Duszynski struct cnxk_bphy_cgx_msg msg = { 866888123a6STomasz Duszynski .type = CNXK_BPHY_CGX_MSG_TYPE_CPRI_MODE_MISC, 867888123a6STomasz Duszynski .data = mode, 868888123a6STomasz Duszynski }; 869888123a6STomasz Duszynski 870888123a6STomasz Duszynski return __rte_pmd_bphy_enq_deq(dev_id, lmac, &msg, NULL, 0); 871888123a6STomasz Duszynski } 872888123a6STomasz Duszynski 873c22752e6SJakub Palider /** 874c22752e6SJakub Palider * Obtain NPA PF func 875c22752e6SJakub Palider * 876c22752e6SJakub Palider * @param pf_func 877c22752e6SJakub Palider * Address of an NPA PF and function for NPA free pointer 878c22752e6SJakub Palider * requests to obtain 879c22752e6SJakub Palider * 880c22752e6SJakub Palider * @return 881c22752e6SJakub Palider * Returns 0 on success, negative error code otherwise 882c22752e6SJakub Palider */ 883c22752e6SJakub Palider int rte_pmd_bphy_npa_pf_func_get_rmt(uint16_t *pf_func); 884c22752e6SJakub Palider 885c22752e6SJakub Palider /** 886c22752e6SJakub Palider * Obtain SSO PF func 887c22752e6SJakub Palider * 888c22752e6SJakub Palider * @param pf_func 889c22752e6SJakub Palider * Address SSO PF and function for SSO add-work requests to obtain 890c22752e6SJakub Palider * 891c22752e6SJakub Palider * @return 892c22752e6SJakub Palider * Returns 0 on success, negative error code otherwise 893c22752e6SJakub Palider */ 894c22752e6SJakub Palider int rte_pmd_bphy_sso_pf_func_get_rmt(uint16_t *pf_func); 895c22752e6SJakub Palider 8962f6ac042SJakub Palider #ifdef __cplusplus 8972f6ac042SJakub Palider } 8982f6ac042SJakub Palider #endif 8992f6ac042SJakub Palider 900df39890fSTomasz Duszynski #endif /* _CNXK_BPHY_H_ */ 901