xref: /dpdk/drivers/raw/cnxk_bphy/rte_pmd_bphy.h (revision 2b843cac232eb3f2fa79e4254e21766817e2019f)
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