1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2019 Mellanox Technologies. All rights reserved */
3 
4 #ifndef _MLXSW_SPECTRUM_PTP_H
5 #define _MLXSW_SPECTRUM_PTP_H
6 
7 #include <linux/device.h>
8 #include <linux/rhashtable.h>
9 
10 struct mlxsw_sp;
11 struct mlxsw_sp_port;
12 struct mlxsw_sp_ptp_clock;
13 
mlxsw_sp_ptp_get_ts_info_noptp(struct ethtool_ts_info * info)14 static inline int mlxsw_sp_ptp_get_ts_info_noptp(struct ethtool_ts_info *info)
15 {
16 	info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
17 				SOF_TIMESTAMPING_SOFTWARE;
18 	info->phc_index = -1;
19 	return 0;
20 }
21 
22 #if IS_REACHABLE(CONFIG_PTP_1588_CLOCK)
23 
24 struct mlxsw_sp_ptp_clock *
25 mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev);
26 
27 void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock);
28 
29 struct mlxsw_sp_ptp_state *mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp);
30 
31 void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state);
32 
33 void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
34 			   u16 local_port);
35 
36 void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
37 			       struct sk_buff *skb, u16 local_port);
38 
39 void mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
40 				 u16 local_port, u8 message_type,
41 				 u8 domain_number, u16 sequence_id,
42 				 u64 timestamp);
43 
44 int mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
45 			       struct hwtstamp_config *config);
46 
47 int mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
48 			       struct hwtstamp_config *config);
49 
50 void mlxsw_sp1_ptp_shaper_work(struct work_struct *work);
51 
52 int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
53 			      struct ethtool_ts_info *info);
54 
55 int mlxsw_sp1_get_stats_count(void);
56 void mlxsw_sp1_get_stats_strings(u8 **p);
57 void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port,
58 			 u64 *data, int data_index);
59 
60 int mlxsw_sp_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core,
61 				 struct mlxsw_sp_port *mlxsw_sp_port,
62 				 struct sk_buff *skb,
63 				 const struct mlxsw_tx_info *tx_info);
64 
65 struct mlxsw_sp_ptp_clock *
66 mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev);
67 
68 void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock);
69 
70 struct mlxsw_sp_ptp_state *mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp);
71 
72 void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state);
73 
74 void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
75 			   u16 local_port);
76 
77 void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
78 			       struct sk_buff *skb, u16 local_port);
79 
80 int mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
81 			       struct hwtstamp_config *config);
82 
83 int mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
84 			       struct hwtstamp_config *config);
85 
86 int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
87 			      struct ethtool_ts_info *info);
88 
89 int mlxsw_sp2_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core,
90 				  struct mlxsw_sp_port *mlxsw_sp_port,
91 				  struct sk_buff *skb,
92 				  const struct mlxsw_tx_info *tx_info);
93 
94 #else
95 
96 static inline struct mlxsw_sp_ptp_clock *
mlxsw_sp1_ptp_clock_init(struct mlxsw_sp * mlxsw_sp,struct device * dev)97 mlxsw_sp1_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev)
98 {
99 	return NULL;
100 }
101 
mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock * clock)102 static inline void mlxsw_sp1_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock)
103 {
104 }
105 
106 static inline struct mlxsw_sp_ptp_state *
mlxsw_sp1_ptp_init(struct mlxsw_sp * mlxsw_sp)107 mlxsw_sp1_ptp_init(struct mlxsw_sp *mlxsw_sp)
108 {
109 	return NULL;
110 }
111 
mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state * ptp_state)112 static inline void mlxsw_sp1_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state)
113 {
114 }
115 
mlxsw_sp1_ptp_receive(struct mlxsw_sp * mlxsw_sp,struct sk_buff * skb,u16 local_port)116 static inline void mlxsw_sp1_ptp_receive(struct mlxsw_sp *mlxsw_sp,
117 					 struct sk_buff *skb, u16 local_port)
118 {
119 	mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp);
120 }
121 
mlxsw_sp1_ptp_transmitted(struct mlxsw_sp * mlxsw_sp,struct sk_buff * skb,u16 local_port)122 static inline void mlxsw_sp1_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
123 					     struct sk_buff *skb, u16 local_port)
124 {
125 	dev_kfree_skb_any(skb);
126 }
127 
128 static inline void
mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp * mlxsw_sp,bool ingress,u16 local_port,u8 message_type,u8 domain_number,u16 sequence_id,u64 timestamp)129 mlxsw_sp1_ptp_got_timestamp(struct mlxsw_sp *mlxsw_sp, bool ingress,
130 			    u16 local_port, u8 message_type,
131 			    u8 domain_number,
132 			    u16 sequence_id, u64 timestamp)
133 {
134 }
135 
136 static inline int
mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port * mlxsw_sp_port,struct hwtstamp_config * config)137 mlxsw_sp1_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
138 			   struct hwtstamp_config *config)
139 {
140 	return -EOPNOTSUPP;
141 }
142 
143 static inline int
mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port * mlxsw_sp_port,struct hwtstamp_config * config)144 mlxsw_sp1_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
145 			   struct hwtstamp_config *config)
146 {
147 	return -EOPNOTSUPP;
148 }
149 
mlxsw_sp1_ptp_shaper_work(struct work_struct * work)150 static inline void mlxsw_sp1_ptp_shaper_work(struct work_struct *work)
151 {
152 }
153 
mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp * mlxsw_sp,struct ethtool_ts_info * info)154 static inline int mlxsw_sp1_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
155 					    struct ethtool_ts_info *info)
156 {
157 	return mlxsw_sp_ptp_get_ts_info_noptp(info);
158 }
159 
mlxsw_sp1_get_stats_count(void)160 static inline int mlxsw_sp1_get_stats_count(void)
161 {
162 	return 0;
163 }
164 
mlxsw_sp1_get_stats_strings(u8 ** p)165 static inline void mlxsw_sp1_get_stats_strings(u8 **p)
166 {
167 }
168 
mlxsw_sp1_get_stats(struct mlxsw_sp_port * mlxsw_sp_port,u64 * data,int data_index)169 static inline void mlxsw_sp1_get_stats(struct mlxsw_sp_port *mlxsw_sp_port,
170 				       u64 *data, int data_index)
171 {
172 }
173 
174 static inline int
mlxsw_sp_ptp_txhdr_construct(struct mlxsw_core * mlxsw_core,struct mlxsw_sp_port * mlxsw_sp_port,struct sk_buff * skb,const struct mlxsw_tx_info * tx_info)175 mlxsw_sp_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core,
176 			     struct mlxsw_sp_port *mlxsw_sp_port,
177 			     struct sk_buff *skb,
178 			     const struct mlxsw_tx_info *tx_info)
179 {
180 	return -EOPNOTSUPP;
181 }
182 
183 static inline struct mlxsw_sp_ptp_clock *
mlxsw_sp2_ptp_clock_init(struct mlxsw_sp * mlxsw_sp,struct device * dev)184 mlxsw_sp2_ptp_clock_init(struct mlxsw_sp *mlxsw_sp, struct device *dev)
185 {
186 	return NULL;
187 }
188 
mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock * clock)189 static inline void mlxsw_sp2_ptp_clock_fini(struct mlxsw_sp_ptp_clock *clock)
190 {
191 }
192 
193 static inline struct mlxsw_sp_ptp_state *
mlxsw_sp2_ptp_init(struct mlxsw_sp * mlxsw_sp)194 mlxsw_sp2_ptp_init(struct mlxsw_sp *mlxsw_sp)
195 {
196 	return NULL;
197 }
198 
mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state * ptp_state)199 static inline void mlxsw_sp2_ptp_fini(struct mlxsw_sp_ptp_state *ptp_state)
200 {
201 }
202 
mlxsw_sp2_ptp_receive(struct mlxsw_sp * mlxsw_sp,struct sk_buff * skb,u16 local_port)203 static inline void mlxsw_sp2_ptp_receive(struct mlxsw_sp *mlxsw_sp,
204 					 struct sk_buff *skb, u16 local_port)
205 {
206 	mlxsw_sp_rx_listener_no_mark_func(skb, local_port, mlxsw_sp);
207 }
208 
mlxsw_sp2_ptp_transmitted(struct mlxsw_sp * mlxsw_sp,struct sk_buff * skb,u16 local_port)209 static inline void mlxsw_sp2_ptp_transmitted(struct mlxsw_sp *mlxsw_sp,
210 					     struct sk_buff *skb, u16 local_port)
211 {
212 	dev_kfree_skb_any(skb);
213 }
214 
215 static inline int
mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port * mlxsw_sp_port,struct hwtstamp_config * config)216 mlxsw_sp2_ptp_hwtstamp_get(struct mlxsw_sp_port *mlxsw_sp_port,
217 			   struct hwtstamp_config *config)
218 {
219 	return -EOPNOTSUPP;
220 }
221 
222 static inline int
mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port * mlxsw_sp_port,struct hwtstamp_config * config)223 mlxsw_sp2_ptp_hwtstamp_set(struct mlxsw_sp_port *mlxsw_sp_port,
224 			   struct hwtstamp_config *config)
225 {
226 	return -EOPNOTSUPP;
227 }
228 
mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp * mlxsw_sp,struct ethtool_ts_info * info)229 static inline int mlxsw_sp2_ptp_get_ts_info(struct mlxsw_sp *mlxsw_sp,
230 					    struct ethtool_ts_info *info)
231 {
232 	return mlxsw_sp_ptp_get_ts_info_noptp(info);
233 }
234 
235 static inline int
mlxsw_sp2_ptp_txhdr_construct(struct mlxsw_core * mlxsw_core,struct mlxsw_sp_port * mlxsw_sp_port,struct sk_buff * skb,const struct mlxsw_tx_info * tx_info)236 mlxsw_sp2_ptp_txhdr_construct(struct mlxsw_core *mlxsw_core,
237 			      struct mlxsw_sp_port *mlxsw_sp_port,
238 			      struct sk_buff *skb,
239 			      const struct mlxsw_tx_info *tx_info)
240 {
241 	return -EOPNOTSUPP;
242 }
243 #endif
244 
mlxsw_sp2_ptp_shaper_work(struct work_struct * work)245 static inline void mlxsw_sp2_ptp_shaper_work(struct work_struct *work)
246 {
247 }
248 
mlxsw_sp2_get_stats_count(void)249 static inline int mlxsw_sp2_get_stats_count(void)
250 {
251 	return 0;
252 }
253 
mlxsw_sp2_get_stats_strings(u8 ** p)254 static inline void mlxsw_sp2_get_stats_strings(u8 **p)
255 {
256 }
257 
mlxsw_sp2_get_stats(struct mlxsw_sp_port * mlxsw_sp_port,u64 * data,int data_index)258 static inline void mlxsw_sp2_get_stats(struct mlxsw_sp_port *mlxsw_sp_port,
259 				       u64 *data, int data_index)
260 {
261 }
262 
263 #endif
264