xref: /dpdk/drivers/net/mlx5/windows/mlx5_ethdev_os.c (revision 07cae8ffabc18f492174b56a60e90e74cc48b313)
193cc4f0dSTal Shnaiderman /* SPDX-License-Identifier: BSD-3-Clause
293cc4f0dSTal Shnaiderman  * Copyright 2020 Mellanox Technologies, Ltd
393cc4f0dSTal Shnaiderman  */
493cc4f0dSTal Shnaiderman #include <stdio.h>
593cc4f0dSTal Shnaiderman 
693cc4f0dSTal Shnaiderman #include <rte_errno.h>
793cc4f0dSTal Shnaiderman #include <rte_ether.h>
893cc4f0dSTal Shnaiderman #include <rte_ethdev_driver.h>
993cc4f0dSTal Shnaiderman #include <rte_interrupts.h>
1093cc4f0dSTal Shnaiderman 
1193cc4f0dSTal Shnaiderman #include <mlx5_glue.h>
1293cc4f0dSTal Shnaiderman #include <mlx5_devx_cmds.h>
1393cc4f0dSTal Shnaiderman #include <mlx5_common.h>
1493cc4f0dSTal Shnaiderman #include <mlx5_win_ext.h>
1593cc4f0dSTal Shnaiderman #include <mlx5_malloc.h>
1693cc4f0dSTal Shnaiderman #include <mlx5.h>
1799d7c45cSTal Shnaiderman #include <mlx5_utils.h>
1893cc4f0dSTal Shnaiderman 
1993cc4f0dSTal Shnaiderman /**
2093cc4f0dSTal Shnaiderman  * Get MAC address by querying netdevice.
2193cc4f0dSTal Shnaiderman  *
2293cc4f0dSTal Shnaiderman  * @param[in] dev
2393cc4f0dSTal Shnaiderman  *   Pointer to Ethernet device.
2493cc4f0dSTal Shnaiderman  * @param[out] mac
2593cc4f0dSTal Shnaiderman  *   MAC address output buffer.
2693cc4f0dSTal Shnaiderman  *
2793cc4f0dSTal Shnaiderman  * @return
2893cc4f0dSTal Shnaiderman  *   0 on success, a negative errno value otherwise and rte_errno is set.
2993cc4f0dSTal Shnaiderman  */
3093cc4f0dSTal Shnaiderman int
3193cc4f0dSTal Shnaiderman mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[RTE_ETHER_ADDR_LEN])
3293cc4f0dSTal Shnaiderman {
3393cc4f0dSTal Shnaiderman 	struct mlx5_priv *priv;
3493cc4f0dSTal Shnaiderman 	mlx5_context_st *context_obj;
3593cc4f0dSTal Shnaiderman 
3693cc4f0dSTal Shnaiderman 	if (!dev) {
3793cc4f0dSTal Shnaiderman 		rte_errno = EINVAL;
3893cc4f0dSTal Shnaiderman 		return -rte_errno;
3993cc4f0dSTal Shnaiderman 	}
4093cc4f0dSTal Shnaiderman 	priv = dev->data->dev_private;
4193cc4f0dSTal Shnaiderman 	context_obj = (mlx5_context_st *)priv->sh->ctx;
4293cc4f0dSTal Shnaiderman 	memcpy(mac, context_obj->mlx5_dev.eth_mac, RTE_ETHER_ADDR_LEN);
4393cc4f0dSTal Shnaiderman 	return 0;
4493cc4f0dSTal Shnaiderman }
45b653ce1dSOphir Munk 
46b653ce1dSOphir Munk /**
47*07cae8ffSTal Shnaiderman  * Get device MTU.
48*07cae8ffSTal Shnaiderman  *
49*07cae8ffSTal Shnaiderman  * @param dev
50*07cae8ffSTal Shnaiderman  *   Pointer to Ethernet device.
51*07cae8ffSTal Shnaiderman  * @param[out] mtu
52*07cae8ffSTal Shnaiderman  *   MTU value output buffer.
53*07cae8ffSTal Shnaiderman  *
54*07cae8ffSTal Shnaiderman  * @return
55*07cae8ffSTal Shnaiderman  *   0 on success, a negative errno value otherwise and rte_errno is set.
56*07cae8ffSTal Shnaiderman  */
57*07cae8ffSTal Shnaiderman int
58*07cae8ffSTal Shnaiderman mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu)
59*07cae8ffSTal Shnaiderman {
60*07cae8ffSTal Shnaiderman 	struct mlx5_priv *priv;
61*07cae8ffSTal Shnaiderman 	mlx5_context_st *context_obj;
62*07cae8ffSTal Shnaiderman 
63*07cae8ffSTal Shnaiderman 	if (!dev) {
64*07cae8ffSTal Shnaiderman 		rte_errno = EINVAL;
65*07cae8ffSTal Shnaiderman 		return -rte_errno;
66*07cae8ffSTal Shnaiderman 	}
67*07cae8ffSTal Shnaiderman 	priv = dev->data->dev_private;
68*07cae8ffSTal Shnaiderman 	context_obj = (mlx5_context_st *)priv->sh->ctx;
69*07cae8ffSTal Shnaiderman 	*mtu = context_obj->mlx5_dev.mtu_bytes;
70*07cae8ffSTal Shnaiderman 	return 0;
71*07cae8ffSTal Shnaiderman }
72*07cae8ffSTal Shnaiderman 
73*07cae8ffSTal Shnaiderman /**
74b653ce1dSOphir Munk  * Set device MTU.
75b653ce1dSOphir Munk  *
76b653ce1dSOphir Munk  * @param dev
77b653ce1dSOphir Munk  *   Pointer to Ethernet device.
78b653ce1dSOphir Munk  * @param mtu
79b653ce1dSOphir Munk  *   MTU value to set.
80b653ce1dSOphir Munk  *
81b653ce1dSOphir Munk  * @return
82b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise and rte_errno is set.
83b653ce1dSOphir Munk  */
84b653ce1dSOphir Munk int
85b653ce1dSOphir Munk mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
86b653ce1dSOphir Munk {
87b653ce1dSOphir Munk 	RTE_SET_USED(dev);
88b653ce1dSOphir Munk 	RTE_SET_USED(mtu);
89b653ce1dSOphir Munk 	return -ENOTSUP;
90b653ce1dSOphir Munk }
91b653ce1dSOphir Munk 
92b653ce1dSOphir Munk /*
93b653ce1dSOphir Munk  * Unregister callback handler safely. The handler may be active
94b653ce1dSOphir Munk  * while we are trying to unregister it, in this case code -EAGAIN
95b653ce1dSOphir Munk  * is returned by rte_intr_callback_unregister(). This routine checks
96b653ce1dSOphir Munk  * the return code and tries to unregister handler again.
97b653ce1dSOphir Munk  *
98b653ce1dSOphir Munk  * @param handle
99b653ce1dSOphir Munk  *   interrupt handle
100b653ce1dSOphir Munk  * @param cb_fn
101b653ce1dSOphir Munk  *   pointer to callback routine
102b653ce1dSOphir Munk  * @cb_arg
103b653ce1dSOphir Munk  *   opaque callback parameter
104b653ce1dSOphir Munk  */
105b653ce1dSOphir Munk void
106b653ce1dSOphir Munk mlx5_intr_callback_unregister(const struct rte_intr_handle *handle,
107b653ce1dSOphir Munk 			      rte_intr_callback_fn cb_fn, void *cb_arg)
108b653ce1dSOphir Munk {
109b653ce1dSOphir Munk 	RTE_SET_USED(handle);
110b653ce1dSOphir Munk 	RTE_SET_USED(cb_fn);
111b653ce1dSOphir Munk 	RTE_SET_USED(cb_arg);
112b653ce1dSOphir Munk }
113b653ce1dSOphir Munk 
114b653ce1dSOphir Munk /**
115b653ce1dSOphir Munk  * DPDK callback to get flow control status.
116b653ce1dSOphir Munk  *
117b653ce1dSOphir Munk  * @param dev
118b653ce1dSOphir Munk  *   Pointer to Ethernet device structure.
119b653ce1dSOphir Munk  * @param[out] fc_conf
120b653ce1dSOphir Munk  *   Flow control output buffer.
121b653ce1dSOphir Munk  *
122b653ce1dSOphir Munk  * @return
123b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise and rte_errno is set.
124b653ce1dSOphir Munk  */
125b653ce1dSOphir Munk int
126b653ce1dSOphir Munk mlx5_dev_get_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
127b653ce1dSOphir Munk {
128b653ce1dSOphir Munk 	RTE_SET_USED(dev);
129b653ce1dSOphir Munk 	RTE_SET_USED(fc_conf);
130b653ce1dSOphir Munk 	return -ENOTSUP;
131b653ce1dSOphir Munk }
132b653ce1dSOphir Munk 
133b653ce1dSOphir Munk /**
134b653ce1dSOphir Munk  * DPDK callback to modify flow control parameters.
135b653ce1dSOphir Munk  *
136b653ce1dSOphir Munk  * @param dev
137b653ce1dSOphir Munk  *   Pointer to Ethernet device structure.
138b653ce1dSOphir Munk  * @param[in] fc_conf
139b653ce1dSOphir Munk  *   Flow control parameters.
140b653ce1dSOphir Munk  *
141b653ce1dSOphir Munk  * @return
142b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise and rte_errno is set.
143b653ce1dSOphir Munk  */
144b653ce1dSOphir Munk int
145b653ce1dSOphir Munk mlx5_dev_set_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
146b653ce1dSOphir Munk {
147b653ce1dSOphir Munk 	RTE_SET_USED(dev);
148b653ce1dSOphir Munk 	RTE_SET_USED(fc_conf);
149b653ce1dSOphir Munk 	return -ENOTSUP;
150b653ce1dSOphir Munk }
151b653ce1dSOphir Munk 
152b653ce1dSOphir Munk /**
153b653ce1dSOphir Munk  * Query the number of statistics provided by ETHTOOL.
154b653ce1dSOphir Munk  *
155b653ce1dSOphir Munk  * @param dev
156b653ce1dSOphir Munk  *   Pointer to Ethernet device.
157b653ce1dSOphir Munk  *
158b653ce1dSOphir Munk  * @return
159b653ce1dSOphir Munk  *   Number of statistics on success, negative errno value otherwise and
160b653ce1dSOphir Munk  *   rte_errno is set.
161b653ce1dSOphir Munk  */
162b653ce1dSOphir Munk int
163b653ce1dSOphir Munk mlx5_os_get_stats_n(struct rte_eth_dev *dev)
164b653ce1dSOphir Munk {
165b653ce1dSOphir Munk 	RTE_SET_USED(dev);
166b653ce1dSOphir Munk 	return -ENOTSUP;
167b653ce1dSOphir Munk }
168b653ce1dSOphir Munk 
169b653ce1dSOphir Munk /**
170b653ce1dSOphir Munk  * Init the structures to read device counters.
171b653ce1dSOphir Munk  *
172b653ce1dSOphir Munk  * @param dev
173b653ce1dSOphir Munk  *   Pointer to Ethernet device.
174b653ce1dSOphir Munk  */
175b653ce1dSOphir Munk void
176b653ce1dSOphir Munk mlx5_os_stats_init(struct rte_eth_dev *dev)
177b653ce1dSOphir Munk {
178b653ce1dSOphir Munk 	RTE_SET_USED(dev);
179b653ce1dSOphir Munk }
180b653ce1dSOphir Munk 
181b653ce1dSOphir Munk /**
182b653ce1dSOphir Munk  * Read device counters table.
183b653ce1dSOphir Munk  *
184b653ce1dSOphir Munk  * @param dev
185b653ce1dSOphir Munk  *   Pointer to Ethernet device.
186b653ce1dSOphir Munk  * @param[out] stats
187b653ce1dSOphir Munk  *   Counters table output buffer.
188b653ce1dSOphir Munk  *
189b653ce1dSOphir Munk  * @return
190b653ce1dSOphir Munk  *   0 on success and stats is filled, negative errno value otherwise and
191b653ce1dSOphir Munk  *   rte_errno is set.
192b653ce1dSOphir Munk  */
193b653ce1dSOphir Munk int
194b653ce1dSOphir Munk mlx5_os_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats)
195b653ce1dSOphir Munk {
196b653ce1dSOphir Munk 	RTE_SET_USED(dev);
197b653ce1dSOphir Munk 	RTE_SET_USED(stats);
198b653ce1dSOphir Munk 	return -ENOTSUP;
199b653ce1dSOphir Munk }
200b653ce1dSOphir Munk 
201b653ce1dSOphir Munk /**
2026fbd7370STal Shnaiderman  * DPDK callback to retrieve physical link information.
2036fbd7370STal Shnaiderman  *
2046fbd7370STal Shnaiderman  * @param dev
2056fbd7370STal Shnaiderman  *   Pointer to Ethernet device structure.
2066fbd7370STal Shnaiderman  * @param wait_to_complete
2076fbd7370STal Shnaiderman  *   Wait for request completion.
2086fbd7370STal Shnaiderman  *
2096fbd7370STal Shnaiderman  * @return
2106fbd7370STal Shnaiderman  *   0 if link status was not updated, positive if it was, a negative errno
2116fbd7370STal Shnaiderman  *   value otherwise and rte_errno is set.
2126fbd7370STal Shnaiderman  */
2136fbd7370STal Shnaiderman int
2146fbd7370STal Shnaiderman mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)
2156fbd7370STal Shnaiderman {
2166fbd7370STal Shnaiderman 	RTE_SET_USED(wait_to_complete);
2176fbd7370STal Shnaiderman 	struct mlx5_priv *priv;
2186fbd7370STal Shnaiderman 	mlx5_context_st *context_obj;
2196fbd7370STal Shnaiderman 	struct rte_eth_link dev_link;
2206fbd7370STal Shnaiderman 	int ret;
2216fbd7370STal Shnaiderman 
2226fbd7370STal Shnaiderman 	ret = 0;
2236fbd7370STal Shnaiderman 	if (!dev) {
2246fbd7370STal Shnaiderman 		rte_errno = EINVAL;
2256fbd7370STal Shnaiderman 		return -rte_errno;
2266fbd7370STal Shnaiderman 	}
2276fbd7370STal Shnaiderman 	priv = dev->data->dev_private;
2286fbd7370STal Shnaiderman 	context_obj = (mlx5_context_st *)priv->sh->ctx;
2296fbd7370STal Shnaiderman 	dev_link.link_speed = context_obj->mlx5_dev.link_speed / (1024 * 1024);
2306fbd7370STal Shnaiderman 	dev_link.link_status =
2316fbd7370STal Shnaiderman 	      (context_obj->mlx5_dev.link_state == 1 && !mlx5_is_removed(dev))
2326fbd7370STal Shnaiderman 	      ? 1 : 0;
2336fbd7370STal Shnaiderman 	dev_link.link_duplex = 1;
2346fbd7370STal Shnaiderman 	if (dev->data->dev_link.link_speed != dev_link.link_speed ||
2356fbd7370STal Shnaiderman 	    dev->data->dev_link.link_duplex != dev_link.link_duplex ||
2366fbd7370STal Shnaiderman 	    dev->data->dev_link.link_autoneg != dev_link.link_autoneg ||
2376fbd7370STal Shnaiderman 	    dev->data->dev_link.link_status != dev_link.link_status)
2386fbd7370STal Shnaiderman 		ret = 1;
2396fbd7370STal Shnaiderman 	else
2406fbd7370STal Shnaiderman 		ret = 0;
2416fbd7370STal Shnaiderman 	dev->data->dev_link = dev_link;
2426fbd7370STal Shnaiderman 	return ret;
2436fbd7370STal Shnaiderman }
2446fbd7370STal Shnaiderman 
2456fbd7370STal Shnaiderman /**
246b653ce1dSOphir Munk  * DPDK callback to bring the link DOWN.
247b653ce1dSOphir Munk  *
248b653ce1dSOphir Munk  * @param dev
249b653ce1dSOphir Munk  *   Pointer to Ethernet device structure.
250b653ce1dSOphir Munk  *
251b653ce1dSOphir Munk  * @return
252b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise
253b653ce1dSOphir Munk  */
254b653ce1dSOphir Munk int
255b653ce1dSOphir Munk mlx5_set_link_down(struct rte_eth_dev *dev)
256b653ce1dSOphir Munk {
257b653ce1dSOphir Munk 	RTE_SET_USED(dev);
258b653ce1dSOphir Munk 	return -ENOTSUP;
259b653ce1dSOphir Munk }
260b653ce1dSOphir Munk 
261b653ce1dSOphir Munk /**
262b653ce1dSOphir Munk  * DPDK callback to bring the link UP.
263b653ce1dSOphir Munk  *
264b653ce1dSOphir Munk  * @param dev
265b653ce1dSOphir Munk  *   Pointer to Ethernet device structure.
266b653ce1dSOphir Munk  *
267b653ce1dSOphir Munk  * @return
268b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise
269b653ce1dSOphir Munk  */
270b653ce1dSOphir Munk int
271b653ce1dSOphir Munk mlx5_set_link_up(struct rte_eth_dev *dev)
272b653ce1dSOphir Munk {
273b653ce1dSOphir Munk 	RTE_SET_USED(dev);
274b653ce1dSOphir Munk 	return -ENOTSUP;
275b653ce1dSOphir Munk }
276b653ce1dSOphir Munk 
277b653ce1dSOphir Munk /**
278b653ce1dSOphir Munk  * DPDK callback to retrieve plug-in module EEPROM information (type and size).
279b653ce1dSOphir Munk  *
280b653ce1dSOphir Munk  * @param dev
281b653ce1dSOphir Munk  *   Pointer to Ethernet device structure.
282b653ce1dSOphir Munk  * @param[out] modinfo
283b653ce1dSOphir Munk  *   Storage for plug-in module EEPROM information.
284b653ce1dSOphir Munk  *
285b653ce1dSOphir Munk  * @return
286b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise and rte_errno is set.
287b653ce1dSOphir Munk  */
288b653ce1dSOphir Munk int
289b653ce1dSOphir Munk mlx5_get_module_info(struct rte_eth_dev *dev,
290b653ce1dSOphir Munk 		     struct rte_eth_dev_module_info *modinfo)
291b653ce1dSOphir Munk {
292b653ce1dSOphir Munk 	RTE_SET_USED(dev);
293b653ce1dSOphir Munk 	RTE_SET_USED(modinfo);
294b653ce1dSOphir Munk 	return -ENOTSUP;
295b653ce1dSOphir Munk }
296b653ce1dSOphir Munk 
297b653ce1dSOphir Munk /**
298b653ce1dSOphir Munk  * DPDK callback to retrieve plug-in module EEPROM data.
299b653ce1dSOphir Munk  *
300b653ce1dSOphir Munk  * @param dev
301b653ce1dSOphir Munk  *   Pointer to Ethernet device structure.
302b653ce1dSOphir Munk  * @param[out] info
303b653ce1dSOphir Munk  *   Storage for plug-in module EEPROM data.
304b653ce1dSOphir Munk  *
305b653ce1dSOphir Munk  * @return
306b653ce1dSOphir Munk  *   0 on success, a negative errno value otherwise and rte_errno is set.
307b653ce1dSOphir Munk  */
308b653ce1dSOphir Munk int mlx5_get_module_eeprom(struct rte_eth_dev *dev,
309b653ce1dSOphir Munk 			   struct rte_dev_eeprom_info *info)
310b653ce1dSOphir Munk {
311b653ce1dSOphir Munk 	RTE_SET_USED(dev);
312b653ce1dSOphir Munk 	RTE_SET_USED(info);
313b653ce1dSOphir Munk 	return -ENOTSUP;
314b653ce1dSOphir Munk }
31599d7c45cSTal Shnaiderman 
31699d7c45cSTal Shnaiderman /**
31799d7c45cSTal Shnaiderman  * Get device current raw clock counter
31899d7c45cSTal Shnaiderman  *
31999d7c45cSTal Shnaiderman  * @param dev
32099d7c45cSTal Shnaiderman  *   Pointer to Ethernet device structure.
32199d7c45cSTal Shnaiderman  * @param[out] time
32299d7c45cSTal Shnaiderman  *   Current raw clock counter of the device.
32399d7c45cSTal Shnaiderman  *
32499d7c45cSTal Shnaiderman  * @return
32599d7c45cSTal Shnaiderman  *   0 if the clock has correctly been read
32699d7c45cSTal Shnaiderman  *   The value of errno in case of error
32799d7c45cSTal Shnaiderman  */
32899d7c45cSTal Shnaiderman int
32999d7c45cSTal Shnaiderman mlx5_read_clock(struct rte_eth_dev *dev, uint64_t *clock)
33099d7c45cSTal Shnaiderman {
33199d7c45cSTal Shnaiderman 	int err;
33299d7c45cSTal Shnaiderman 	struct mlx5_devx_clock mlx5_clock;
33399d7c45cSTal Shnaiderman 	struct mlx5_priv *priv = dev->data->dev_private;
33499d7c45cSTal Shnaiderman 	mlx5_context_st *context_obj = (mlx5_context_st *)priv->sh->ctx;
33599d7c45cSTal Shnaiderman 
33699d7c45cSTal Shnaiderman 	err = mlx5_glue->query_rt_values(context_obj, &mlx5_clock);
33799d7c45cSTal Shnaiderman 	if (err != 0) {
33899d7c45cSTal Shnaiderman 		DRV_LOG(WARNING, "Could not query the clock");
33999d7c45cSTal Shnaiderman 		return err;
34099d7c45cSTal Shnaiderman 	}
34199d7c45cSTal Shnaiderman 	*clock = *(uint64_t volatile *)mlx5_clock.p_iseg_internal_timer;
34299d7c45cSTal Shnaiderman 	return 0;
34399d7c45cSTal Shnaiderman }
344