xref: /openbmc/linux/drivers/net/ethernet/marvell/octeontx2/nic/otx2_ptp.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1  // SPDX-License-Identifier: GPL-2.0
2  /* Marvell RVU Ethernet driver
3   *
4   * Copyright (C) 2020 Marvell.
5   *
6   */
7  
8  #include <linux/module.h>
9  
10  #include "otx2_common.h"
11  #include "otx2_ptp.h"
12  
is_tstmp_atomic_update_supported(struct otx2_ptp * ptp)13  static bool is_tstmp_atomic_update_supported(struct otx2_ptp *ptp)
14  {
15  	struct ptp_get_cap_rsp *rsp;
16  	struct msg_req *req;
17  	int err;
18  
19  	if (!ptp->nic)
20  		return false;
21  
22  	mutex_lock(&ptp->nic->mbox.lock);
23  	req = otx2_mbox_alloc_msg_ptp_get_cap(&ptp->nic->mbox);
24  	if (!req) {
25  		mutex_unlock(&ptp->nic->mbox.lock);
26  		return false;
27  	}
28  
29  	err = otx2_sync_mbox_msg(&ptp->nic->mbox);
30  	if (err) {
31  		mutex_unlock(&ptp->nic->mbox.lock);
32  		return false;
33  	}
34  	rsp = (struct ptp_get_cap_rsp *)otx2_mbox_get_rsp(&ptp->nic->mbox.mbox, 0,
35  							  &req->hdr);
36  	mutex_unlock(&ptp->nic->mbox.lock);
37  
38  	if (IS_ERR(rsp))
39  		return false;
40  
41  	if (rsp->cap & PTP_CAP_HW_ATOMIC_UPDATE)
42  		return true;
43  
44  	return false;
45  }
46  
otx2_ptp_hw_adjtime(struct ptp_clock_info * ptp_info,s64 delta)47  static int otx2_ptp_hw_adjtime(struct ptp_clock_info *ptp_info, s64 delta)
48  {
49  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
50  					    ptp_info);
51  	struct otx2_nic *pfvf = ptp->nic;
52  	struct ptp_req *req;
53  	int rc;
54  
55  	if (!ptp->nic)
56  		return -ENODEV;
57  
58  	mutex_lock(&pfvf->mbox.lock);
59  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
60  	if (!req) {
61  		mutex_unlock(&pfvf->mbox.lock);
62  		return -ENOMEM;
63  	}
64  	req->op = PTP_OP_ADJTIME;
65  	req->delta = delta;
66  	rc = otx2_sync_mbox_msg(&ptp->nic->mbox);
67  	mutex_unlock(&pfvf->mbox.lock);
68  
69  	return rc;
70  }
71  
otx2_ptp_get_clock(struct otx2_ptp * ptp)72  static u64 otx2_ptp_get_clock(struct otx2_ptp *ptp)
73  {
74  	struct ptp_req *req;
75  	struct ptp_rsp *rsp;
76  	int err;
77  
78  	if (!ptp->nic)
79  		return 0;
80  
81  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
82  	if (!req)
83  		return 0;
84  
85  	req->op = PTP_OP_GET_CLOCK;
86  
87  	err = otx2_sync_mbox_msg(&ptp->nic->mbox);
88  	if (err)
89  		return 0;
90  
91  	rsp = (struct ptp_rsp *)otx2_mbox_get_rsp(&ptp->nic->mbox.mbox, 0,
92  						  &req->hdr);
93  	if (IS_ERR(rsp))
94  		return 0;
95  
96  	return rsp->clk;
97  }
98  
otx2_ptp_hw_gettime(struct ptp_clock_info * ptp_info,struct timespec64 * ts)99  static int otx2_ptp_hw_gettime(struct ptp_clock_info *ptp_info,
100  			       struct timespec64 *ts)
101  {
102  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
103  					    ptp_info);
104  	u64 tstamp;
105  
106  	tstamp = otx2_ptp_get_clock(ptp);
107  
108  	*ts = ns_to_timespec64(tstamp);
109  	return 0;
110  }
111  
otx2_ptp_hw_settime(struct ptp_clock_info * ptp_info,const struct timespec64 * ts)112  static int otx2_ptp_hw_settime(struct ptp_clock_info *ptp_info,
113  			       const struct timespec64 *ts)
114  {
115  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
116  					    ptp_info);
117  	struct otx2_nic *pfvf = ptp->nic;
118  	struct ptp_req *req;
119  	u64 nsec;
120  	int rc;
121  
122  	if (!ptp->nic)
123  		return -ENODEV;
124  
125  	nsec = timespec64_to_ns(ts);
126  
127  	mutex_lock(&pfvf->mbox.lock);
128  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
129  	if (!req) {
130  		mutex_unlock(&pfvf->mbox.lock);
131  		return -ENOMEM;
132  	}
133  
134  	req->op = PTP_OP_SET_CLOCK;
135  	req->clk = nsec;
136  	rc = otx2_sync_mbox_msg(&ptp->nic->mbox);
137  	mutex_unlock(&pfvf->mbox.lock);
138  
139  	return rc;
140  }
141  
otx2_ptp_adjfine(struct ptp_clock_info * ptp_info,long scaled_ppm)142  static int otx2_ptp_adjfine(struct ptp_clock_info *ptp_info, long scaled_ppm)
143  {
144  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
145  					    ptp_info);
146  	struct ptp_req *req;
147  
148  	if (!ptp->nic)
149  		return -ENODEV;
150  
151  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
152  	if (!req)
153  		return -ENOMEM;
154  
155  	req->op = PTP_OP_ADJFINE;
156  	req->scaled_ppm = scaled_ppm;
157  
158  	return otx2_sync_mbox_msg(&ptp->nic->mbox);
159  }
160  
ptp_set_thresh(struct otx2_ptp * ptp,u64 thresh)161  static int ptp_set_thresh(struct otx2_ptp *ptp, u64 thresh)
162  {
163  	struct ptp_req *req;
164  
165  	if (!ptp->nic)
166  		return -ENODEV;
167  
168  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
169  	if (!req)
170  		return -ENOMEM;
171  
172  	req->op = PTP_OP_SET_THRESH;
173  	req->thresh = thresh;
174  
175  	return otx2_sync_mbox_msg(&ptp->nic->mbox);
176  }
177  
ptp_extts_on(struct otx2_ptp * ptp,int on)178  static int ptp_extts_on(struct otx2_ptp *ptp, int on)
179  {
180  	struct ptp_req *req;
181  
182  	if (!ptp->nic)
183  		return -ENODEV;
184  
185  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
186  	if (!req)
187  		return -ENOMEM;
188  
189  	req->op = PTP_OP_EXTTS_ON;
190  	req->extts_on = on;
191  
192  	return otx2_sync_mbox_msg(&ptp->nic->mbox);
193  }
194  
ptp_cc_read(const struct cyclecounter * cc)195  static u64 ptp_cc_read(const struct cyclecounter *cc)
196  {
197  	struct otx2_ptp *ptp = container_of(cc, struct otx2_ptp, cycle_counter);
198  
199  	return otx2_ptp_get_clock(ptp);
200  }
201  
ptp_tstmp_read(struct otx2_ptp * ptp)202  static u64 ptp_tstmp_read(struct otx2_ptp *ptp)
203  {
204  	struct ptp_req *req;
205  	struct ptp_rsp *rsp;
206  	int err;
207  
208  	if (!ptp->nic)
209  		return 0;
210  
211  	req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox);
212  	if (!req)
213  		return 0;
214  
215  	req->op = PTP_OP_GET_TSTMP;
216  
217  	err = otx2_sync_mbox_msg(&ptp->nic->mbox);
218  	if (err)
219  		return 0;
220  
221  	rsp = (struct ptp_rsp *)otx2_mbox_get_rsp(&ptp->nic->mbox.mbox, 0,
222  						  &req->hdr);
223  	if (IS_ERR(rsp))
224  		return 0;
225  
226  	return rsp->clk;
227  }
228  
otx2_ptp_tc_adjtime(struct ptp_clock_info * ptp_info,s64 delta)229  static int otx2_ptp_tc_adjtime(struct ptp_clock_info *ptp_info, s64 delta)
230  {
231  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
232  					    ptp_info);
233  	struct otx2_nic *pfvf = ptp->nic;
234  
235  	mutex_lock(&pfvf->mbox.lock);
236  	timecounter_adjtime(&ptp->time_counter, delta);
237  	mutex_unlock(&pfvf->mbox.lock);
238  
239  	return 0;
240  }
241  
otx2_ptp_tc_gettime(struct ptp_clock_info * ptp_info,struct timespec64 * ts)242  static int otx2_ptp_tc_gettime(struct ptp_clock_info *ptp_info,
243  			       struct timespec64 *ts)
244  {
245  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
246  					    ptp_info);
247  	u64 tstamp;
248  
249  	mutex_lock(&ptp->nic->mbox.lock);
250  	tstamp = timecounter_read(&ptp->time_counter);
251  	mutex_unlock(&ptp->nic->mbox.lock);
252  	*ts = ns_to_timespec64(tstamp);
253  
254  	return 0;
255  }
256  
otx2_ptp_tc_settime(struct ptp_clock_info * ptp_info,const struct timespec64 * ts)257  static int otx2_ptp_tc_settime(struct ptp_clock_info *ptp_info,
258  			       const struct timespec64 *ts)
259  {
260  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
261  					    ptp_info);
262  	u64 nsec;
263  
264  	nsec = timespec64_to_ns(ts);
265  
266  	mutex_lock(&ptp->nic->mbox.lock);
267  	timecounter_init(&ptp->time_counter, &ptp->cycle_counter, nsec);
268  	mutex_unlock(&ptp->nic->mbox.lock);
269  
270  	return 0;
271  }
272  
otx2_ptp_verify_pin(struct ptp_clock_info * ptp,unsigned int pin,enum ptp_pin_function func,unsigned int chan)273  static int otx2_ptp_verify_pin(struct ptp_clock_info *ptp, unsigned int pin,
274  			       enum ptp_pin_function func, unsigned int chan)
275  {
276  	switch (func) {
277  	case PTP_PF_NONE:
278  	case PTP_PF_EXTTS:
279  		break;
280  	case PTP_PF_PEROUT:
281  	case PTP_PF_PHYSYNC:
282  		return -1;
283  	}
284  	return 0;
285  }
286  
otx2_ptp_hw_tstamp2time(const struct timecounter * time_counter,u64 tstamp)287  static u64 otx2_ptp_hw_tstamp2time(const struct timecounter *time_counter, u64 tstamp)
288  {
289  	/* On HW which supports atomic updates, timecounter is not initialized */
290  	return tstamp;
291  }
292  
otx2_ptp_extts_check(struct work_struct * work)293  static void otx2_ptp_extts_check(struct work_struct *work)
294  {
295  	struct otx2_ptp *ptp = container_of(work, struct otx2_ptp,
296  					    extts_work.work);
297  	struct ptp_clock_event event;
298  	u64 tstmp, new_thresh;
299  
300  	mutex_lock(&ptp->nic->mbox.lock);
301  	tstmp = ptp_tstmp_read(ptp);
302  	mutex_unlock(&ptp->nic->mbox.lock);
303  
304  	if (tstmp != ptp->last_extts) {
305  		event.type = PTP_CLOCK_EXTTS;
306  		event.index = 0;
307  		event.timestamp = ptp->ptp_tstamp2nsec(&ptp->time_counter, tstmp);
308  		ptp_clock_event(ptp->ptp_clock, &event);
309  		new_thresh = tstmp % 500000000;
310  		if (ptp->thresh != new_thresh) {
311  			mutex_lock(&ptp->nic->mbox.lock);
312  			ptp_set_thresh(ptp, new_thresh);
313  			mutex_unlock(&ptp->nic->mbox.lock);
314  			ptp->thresh = new_thresh;
315  		}
316  		ptp->last_extts = tstmp;
317  	}
318  	schedule_delayed_work(&ptp->extts_work, msecs_to_jiffies(200));
319  }
320  
otx2_sync_tstamp(struct work_struct * work)321  static void otx2_sync_tstamp(struct work_struct *work)
322  {
323  	struct otx2_ptp *ptp = container_of(work, struct otx2_ptp,
324  					    synctstamp_work.work);
325  	struct otx2_nic *pfvf = ptp->nic;
326  	u64 tstamp;
327  
328  	mutex_lock(&pfvf->mbox.lock);
329  	tstamp = otx2_ptp_get_clock(ptp);
330  	mutex_unlock(&pfvf->mbox.lock);
331  
332  	ptp->tstamp = ptp->ptp_tstamp2nsec(&ptp->time_counter, tstamp);
333  	ptp->base_ns = tstamp % NSEC_PER_SEC;
334  
335  	schedule_delayed_work(&ptp->synctstamp_work, msecs_to_jiffies(250));
336  }
337  
otx2_ptp_enable(struct ptp_clock_info * ptp_info,struct ptp_clock_request * rq,int on)338  static int otx2_ptp_enable(struct ptp_clock_info *ptp_info,
339  			   struct ptp_clock_request *rq, int on)
340  {
341  	struct otx2_ptp *ptp = container_of(ptp_info, struct otx2_ptp,
342  					    ptp_info);
343  	int pin;
344  
345  	if (!ptp->nic)
346  		return -ENODEV;
347  
348  	switch (rq->type) {
349  	case PTP_CLK_REQ_EXTTS:
350  		pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS,
351  				   rq->extts.index);
352  		if (pin < 0)
353  			return -EBUSY;
354  		if (on) {
355  			ptp_extts_on(ptp, on);
356  			schedule_delayed_work(&ptp->extts_work, msecs_to_jiffies(200));
357  		} else {
358  			ptp_extts_on(ptp, on);
359  			cancel_delayed_work_sync(&ptp->extts_work);
360  		}
361  		return 0;
362  	default:
363  		break;
364  	}
365  	return -EOPNOTSUPP;
366  }
367  
otx2_ptp_init(struct otx2_nic * pfvf)368  int otx2_ptp_init(struct otx2_nic *pfvf)
369  {
370  	struct otx2_ptp *ptp_ptr;
371  	struct cyclecounter *cc;
372  	struct ptp_req *req;
373  	int err;
374  
375  	if (is_otx2_lbkvf(pfvf->pdev)) {
376  		pfvf->ptp = NULL;
377  		return 0;
378  	}
379  
380  	mutex_lock(&pfvf->mbox.lock);
381  	/* check if PTP block is available */
382  	req = otx2_mbox_alloc_msg_ptp_op(&pfvf->mbox);
383  	if (!req) {
384  		mutex_unlock(&pfvf->mbox.lock);
385  		return -ENOMEM;
386  	}
387  
388  	req->op = PTP_OP_GET_CLOCK;
389  
390  	err = otx2_sync_mbox_msg(&pfvf->mbox);
391  	if (err) {
392  		mutex_unlock(&pfvf->mbox.lock);
393  		return err;
394  	}
395  	mutex_unlock(&pfvf->mbox.lock);
396  
397  	ptp_ptr = kzalloc(sizeof(*ptp_ptr), GFP_KERNEL);
398  	if (!ptp_ptr) {
399  		err = -ENOMEM;
400  		goto error;
401  	}
402  
403  	ptp_ptr->nic = pfvf;
404  
405  	snprintf(ptp_ptr->extts_config.name, sizeof(ptp_ptr->extts_config.name), "TSTAMP");
406  	ptp_ptr->extts_config.index = 0;
407  	ptp_ptr->extts_config.func = PTP_PF_NONE;
408  
409  	ptp_ptr->ptp_info = (struct ptp_clock_info) {
410  		.owner          = THIS_MODULE,
411  		.name           = "OcteonTX2 PTP",
412  		.max_adj        = 1000000000ull,
413  		.n_ext_ts       = 1,
414  		.n_pins         = 1,
415  		.pps            = 0,
416  		.pin_config     = &ptp_ptr->extts_config,
417  		.adjfine        = otx2_ptp_adjfine,
418  		.enable         = otx2_ptp_enable,
419  		.verify         = otx2_ptp_verify_pin,
420  	};
421  
422  	/* Check whether hardware supports atomic updates to timestamp */
423  	if (is_tstmp_atomic_update_supported(ptp_ptr)) {
424  		ptp_ptr->ptp_info.adjtime = otx2_ptp_hw_adjtime;
425  		ptp_ptr->ptp_info.gettime64 = otx2_ptp_hw_gettime;
426  		ptp_ptr->ptp_info.settime64 = otx2_ptp_hw_settime;
427  
428  		ptp_ptr->ptp_tstamp2nsec = otx2_ptp_hw_tstamp2time;
429  	} else {
430  		ptp_ptr->ptp_info.adjtime = otx2_ptp_tc_adjtime;
431  		ptp_ptr->ptp_info.gettime64 = otx2_ptp_tc_gettime;
432  		ptp_ptr->ptp_info.settime64 = otx2_ptp_tc_settime;
433  
434  		cc = &ptp_ptr->cycle_counter;
435  		cc->read = ptp_cc_read;
436  		cc->mask = CYCLECOUNTER_MASK(64);
437  		cc->mult = 1;
438  		cc->shift = 0;
439  		ptp_ptr->ptp_tstamp2nsec = timecounter_cyc2time;
440  
441  		timecounter_init(&ptp_ptr->time_counter, &ptp_ptr->cycle_counter,
442  				 ktime_to_ns(ktime_get_real()));
443  	}
444  
445  	INIT_DELAYED_WORK(&ptp_ptr->extts_work, otx2_ptp_extts_check);
446  
447  	ptp_ptr->ptp_clock = ptp_clock_register(&ptp_ptr->ptp_info, pfvf->dev);
448  	if (IS_ERR_OR_NULL(ptp_ptr->ptp_clock)) {
449  		err = ptp_ptr->ptp_clock ?
450  		      PTR_ERR(ptp_ptr->ptp_clock) : -ENODEV;
451  		kfree(ptp_ptr);
452  		goto error;
453  	}
454  
455  	if (is_dev_otx2(pfvf->pdev)) {
456  		ptp_ptr->convert_rx_ptp_tstmp = &otx2_ptp_convert_rx_timestamp;
457  		ptp_ptr->convert_tx_ptp_tstmp = &otx2_ptp_convert_tx_timestamp;
458  	} else {
459  		ptp_ptr->convert_rx_ptp_tstmp = &cn10k_ptp_convert_timestamp;
460  		ptp_ptr->convert_tx_ptp_tstmp = &cn10k_ptp_convert_timestamp;
461  	}
462  
463  	INIT_DELAYED_WORK(&ptp_ptr->synctstamp_work, otx2_sync_tstamp);
464  
465  	pfvf->ptp = ptp_ptr;
466  
467  error:
468  	return err;
469  }
470  EXPORT_SYMBOL_GPL(otx2_ptp_init);
471  
otx2_ptp_destroy(struct otx2_nic * pfvf)472  void otx2_ptp_destroy(struct otx2_nic *pfvf)
473  {
474  	struct otx2_ptp *ptp = pfvf->ptp;
475  
476  	if (!ptp)
477  		return;
478  
479  	cancel_delayed_work(&pfvf->ptp->synctstamp_work);
480  
481  	ptp_clock_unregister(ptp->ptp_clock);
482  	kfree(ptp);
483  	pfvf->ptp = NULL;
484  }
485  EXPORT_SYMBOL_GPL(otx2_ptp_destroy);
486  
otx2_ptp_clock_index(struct otx2_nic * pfvf)487  int otx2_ptp_clock_index(struct otx2_nic *pfvf)
488  {
489  	if (!pfvf->ptp)
490  		return -ENODEV;
491  
492  	return ptp_clock_index(pfvf->ptp->ptp_clock);
493  }
494  EXPORT_SYMBOL_GPL(otx2_ptp_clock_index);
495  
otx2_ptp_tstamp2time(struct otx2_nic * pfvf,u64 tstamp,u64 * tsns)496  int otx2_ptp_tstamp2time(struct otx2_nic *pfvf, u64 tstamp, u64 *tsns)
497  {
498  	if (!pfvf->ptp)
499  		return -ENODEV;
500  
501  	*tsns = pfvf->ptp->ptp_tstamp2nsec(&pfvf->ptp->time_counter, tstamp);
502  
503  	return 0;
504  }
505  EXPORT_SYMBOL_GPL(otx2_ptp_tstamp2time);
506  
507  MODULE_AUTHOR("Sunil Goutham <sgoutham@marvell.com>");
508  MODULE_DESCRIPTION("Marvell RVU NIC PTP Driver");
509  MODULE_LICENSE("GPL v2");
510