Lines Matching +full:mbox +full:-

1 // SPDX-License-Identifier: GPL-2.0
19 if (!ptp->nic) in is_tstmp_atomic_update_supported()
22 mutex_lock(&ptp->nic->mbox.lock); in is_tstmp_atomic_update_supported()
23 req = otx2_mbox_alloc_msg_ptp_get_cap(&ptp->nic->mbox); in is_tstmp_atomic_update_supported()
25 mutex_unlock(&ptp->nic->mbox.lock); in is_tstmp_atomic_update_supported()
29 err = otx2_sync_mbox_msg(&ptp->nic->mbox); in is_tstmp_atomic_update_supported()
31 mutex_unlock(&ptp->nic->mbox.lock); in is_tstmp_atomic_update_supported()
34 rsp = (struct ptp_get_cap_rsp *)otx2_mbox_get_rsp(&ptp->nic->mbox.mbox, 0, in is_tstmp_atomic_update_supported()
35 &req->hdr); in is_tstmp_atomic_update_supported()
36 mutex_unlock(&ptp->nic->mbox.lock); in is_tstmp_atomic_update_supported()
41 if (rsp->cap & PTP_CAP_HW_ATOMIC_UPDATE) in is_tstmp_atomic_update_supported()
51 struct otx2_nic *pfvf = ptp->nic; in otx2_ptp_hw_adjtime()
55 if (!ptp->nic) in otx2_ptp_hw_adjtime()
56 return -ENODEV; in otx2_ptp_hw_adjtime()
58 mutex_lock(&pfvf->mbox.lock); in otx2_ptp_hw_adjtime()
59 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in otx2_ptp_hw_adjtime()
61 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_hw_adjtime()
62 return -ENOMEM; in otx2_ptp_hw_adjtime()
64 req->op = PTP_OP_ADJTIME; in otx2_ptp_hw_adjtime()
65 req->delta = delta; in otx2_ptp_hw_adjtime()
66 rc = otx2_sync_mbox_msg(&ptp->nic->mbox); in otx2_ptp_hw_adjtime()
67 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_hw_adjtime()
78 if (!ptp->nic) in otx2_ptp_get_clock()
81 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in otx2_ptp_get_clock()
85 req->op = PTP_OP_GET_CLOCK; in otx2_ptp_get_clock()
87 err = otx2_sync_mbox_msg(&ptp->nic->mbox); in otx2_ptp_get_clock()
91 rsp = (struct ptp_rsp *)otx2_mbox_get_rsp(&ptp->nic->mbox.mbox, 0, in otx2_ptp_get_clock()
92 &req->hdr); in otx2_ptp_get_clock()
96 return rsp->clk; in otx2_ptp_get_clock()
117 struct otx2_nic *pfvf = ptp->nic; in otx2_ptp_hw_settime()
122 if (!ptp->nic) in otx2_ptp_hw_settime()
123 return -ENODEV; in otx2_ptp_hw_settime()
127 mutex_lock(&pfvf->mbox.lock); in otx2_ptp_hw_settime()
128 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in otx2_ptp_hw_settime()
130 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_hw_settime()
131 return -ENOMEM; in otx2_ptp_hw_settime()
134 req->op = PTP_OP_SET_CLOCK; in otx2_ptp_hw_settime()
135 req->clk = nsec; in otx2_ptp_hw_settime()
136 rc = otx2_sync_mbox_msg(&ptp->nic->mbox); in otx2_ptp_hw_settime()
137 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_hw_settime()
148 if (!ptp->nic) in otx2_ptp_adjfine()
149 return -ENODEV; in otx2_ptp_adjfine()
151 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in otx2_ptp_adjfine()
153 return -ENOMEM; in otx2_ptp_adjfine()
155 req->op = PTP_OP_ADJFINE; in otx2_ptp_adjfine()
156 req->scaled_ppm = scaled_ppm; in otx2_ptp_adjfine()
158 return otx2_sync_mbox_msg(&ptp->nic->mbox); in otx2_ptp_adjfine()
165 if (!ptp->nic) in ptp_set_thresh()
166 return -ENODEV; in ptp_set_thresh()
168 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in ptp_set_thresh()
170 return -ENOMEM; in ptp_set_thresh()
172 req->op = PTP_OP_SET_THRESH; in ptp_set_thresh()
173 req->thresh = thresh; in ptp_set_thresh()
175 return otx2_sync_mbox_msg(&ptp->nic->mbox); in ptp_set_thresh()
182 if (!ptp->nic) in ptp_pps_on()
183 return -ENODEV; in ptp_pps_on()
185 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in ptp_pps_on()
187 return -ENOMEM; in ptp_pps_on()
189 req->op = PTP_OP_PPS_ON; in ptp_pps_on()
190 req->pps_on = on; in ptp_pps_on()
191 req->period = period; in ptp_pps_on()
193 return otx2_sync_mbox_msg(&ptp->nic->mbox); in ptp_pps_on()
209 if (!ptp->nic) in ptp_tstmp_read()
212 req = otx2_mbox_alloc_msg_ptp_op(&ptp->nic->mbox); in ptp_tstmp_read()
216 req->op = PTP_OP_GET_TSTMP; in ptp_tstmp_read()
218 err = otx2_sync_mbox_msg(&ptp->nic->mbox); in ptp_tstmp_read()
222 rsp = (struct ptp_rsp *)otx2_mbox_get_rsp(&ptp->nic->mbox.mbox, 0, in ptp_tstmp_read()
223 &req->hdr); in ptp_tstmp_read()
227 return rsp->clk; in ptp_tstmp_read()
234 struct otx2_nic *pfvf = ptp->nic; in otx2_ptp_tc_adjtime()
236 mutex_lock(&pfvf->mbox.lock); in otx2_ptp_tc_adjtime()
237 timecounter_adjtime(&ptp->time_counter, delta); in otx2_ptp_tc_adjtime()
238 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_tc_adjtime()
250 mutex_lock(&ptp->nic->mbox.lock); in otx2_ptp_tc_gettime()
251 tstamp = timecounter_read(&ptp->time_counter); in otx2_ptp_tc_gettime()
252 mutex_unlock(&ptp->nic->mbox.lock); in otx2_ptp_tc_gettime()
267 mutex_lock(&ptp->nic->mbox.lock); in otx2_ptp_tc_settime()
268 timecounter_init(&ptp->time_counter, &ptp->cycle_counter, nsec); in otx2_ptp_tc_settime()
269 mutex_unlock(&ptp->nic->mbox.lock); in otx2_ptp_tc_settime()
283 return -1; in otx2_ptp_verify_pin()
301 mutex_lock(&ptp->nic->mbox.lock); in otx2_ptp_extts_check()
303 mutex_unlock(&ptp->nic->mbox.lock); in otx2_ptp_extts_check()
305 if (tstmp != ptp->last_extts) { in otx2_ptp_extts_check()
308 event.timestamp = ptp->ptp_tstamp2nsec(&ptp->time_counter, tstmp); in otx2_ptp_extts_check()
309 ptp_clock_event(ptp->ptp_clock, &event); in otx2_ptp_extts_check()
311 if (ptp->thresh != new_thresh) { in otx2_ptp_extts_check()
312 mutex_lock(&ptp->nic->mbox.lock); in otx2_ptp_extts_check()
314 mutex_unlock(&ptp->nic->mbox.lock); in otx2_ptp_extts_check()
315 ptp->thresh = new_thresh; in otx2_ptp_extts_check()
317 ptp->last_extts = tstmp; in otx2_ptp_extts_check()
319 schedule_delayed_work(&ptp->extts_work, msecs_to_jiffies(200)); in otx2_ptp_extts_check()
326 struct otx2_nic *pfvf = ptp->nic; in otx2_sync_tstamp()
329 mutex_lock(&pfvf->mbox.lock); in otx2_sync_tstamp()
331 mutex_unlock(&pfvf->mbox.lock); in otx2_sync_tstamp()
333 ptp->tstamp = ptp->ptp_tstamp2nsec(&ptp->time_counter, tstamp); in otx2_sync_tstamp()
334 ptp->base_ns = tstamp % NSEC_PER_SEC; in otx2_sync_tstamp()
336 schedule_delayed_work(&ptp->synctstamp_work, msecs_to_jiffies(250)); in otx2_sync_tstamp()
347 if (!ptp->nic) in otx2_ptp_enable()
348 return -ENODEV; in otx2_ptp_enable()
350 switch (rq->type) { in otx2_ptp_enable()
352 pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS, in otx2_ptp_enable()
353 rq->extts.index); in otx2_ptp_enable()
355 return -EBUSY; in otx2_ptp_enable()
357 schedule_delayed_work(&ptp->extts_work, msecs_to_jiffies(200)); in otx2_ptp_enable()
359 cancel_delayed_work_sync(&ptp->extts_work); in otx2_ptp_enable()
363 if (rq->perout.flags) in otx2_ptp_enable()
364 return -EOPNOTSUPP; in otx2_ptp_enable()
366 if (rq->perout.index >= ptp_info->n_pins) in otx2_ptp_enable()
367 return -EINVAL; in otx2_ptp_enable()
369 period = rq->perout.period.sec * NSEC_PER_SEC + in otx2_ptp_enable()
370 rq->perout.period.nsec; in otx2_ptp_enable()
379 return -EOPNOTSUPP; in otx2_ptp_enable()
389 if (is_otx2_lbkvf(pfvf->pdev)) { in otx2_ptp_init()
390 pfvf->ptp = NULL; in otx2_ptp_init()
394 mutex_lock(&pfvf->mbox.lock); in otx2_ptp_init()
396 req = otx2_mbox_alloc_msg_ptp_op(&pfvf->mbox); in otx2_ptp_init()
398 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_init()
399 return -ENOMEM; in otx2_ptp_init()
402 req->op = PTP_OP_GET_CLOCK; in otx2_ptp_init()
404 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_ptp_init()
406 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_init()
409 mutex_unlock(&pfvf->mbox.lock); in otx2_ptp_init()
413 err = -ENOMEM; in otx2_ptp_init()
417 ptp_ptr->nic = pfvf; in otx2_ptp_init()
419 snprintf(ptp_ptr->extts_config.name, sizeof(ptp_ptr->extts_config.name), "TSTAMP"); in otx2_ptp_init()
420 ptp_ptr->extts_config.index = 0; in otx2_ptp_init()
421 ptp_ptr->extts_config.func = PTP_PF_NONE; in otx2_ptp_init()
423 ptp_ptr->ptp_info = (struct ptp_clock_info) { in otx2_ptp_init()
431 .pin_config = &ptp_ptr->extts_config, in otx2_ptp_init()
439 ptp_ptr->ptp_info.adjtime = otx2_ptp_hw_adjtime; in otx2_ptp_init()
440 ptp_ptr->ptp_info.gettime64 = otx2_ptp_hw_gettime; in otx2_ptp_init()
441 ptp_ptr->ptp_info.settime64 = otx2_ptp_hw_settime; in otx2_ptp_init()
443 ptp_ptr->ptp_tstamp2nsec = otx2_ptp_hw_tstamp2time; in otx2_ptp_init()
445 ptp_ptr->ptp_info.adjtime = otx2_ptp_tc_adjtime; in otx2_ptp_init()
446 ptp_ptr->ptp_info.gettime64 = otx2_ptp_tc_gettime; in otx2_ptp_init()
447 ptp_ptr->ptp_info.settime64 = otx2_ptp_tc_settime; in otx2_ptp_init()
449 cc = &ptp_ptr->cycle_counter; in otx2_ptp_init()
450 cc->read = ptp_cc_read; in otx2_ptp_init()
451 cc->mask = CYCLECOUNTER_MASK(64); in otx2_ptp_init()
452 cc->mult = 1; in otx2_ptp_init()
453 cc->shift = 0; in otx2_ptp_init()
454 ptp_ptr->ptp_tstamp2nsec = timecounter_cyc2time; in otx2_ptp_init()
456 timecounter_init(&ptp_ptr->time_counter, &ptp_ptr->cycle_counter, in otx2_ptp_init()
460 INIT_DELAYED_WORK(&ptp_ptr->extts_work, otx2_ptp_extts_check); in otx2_ptp_init()
462 ptp_ptr->ptp_clock = ptp_clock_register(&ptp_ptr->ptp_info, pfvf->dev); in otx2_ptp_init()
463 if (IS_ERR_OR_NULL(ptp_ptr->ptp_clock)) { in otx2_ptp_init()
464 err = ptp_ptr->ptp_clock ? in otx2_ptp_init()
465 PTR_ERR(ptp_ptr->ptp_clock) : -ENODEV; in otx2_ptp_init()
470 if (is_dev_otx2(pfvf->pdev)) { in otx2_ptp_init()
471 ptp_ptr->convert_rx_ptp_tstmp = &otx2_ptp_convert_rx_timestamp; in otx2_ptp_init()
472 ptp_ptr->convert_tx_ptp_tstmp = &otx2_ptp_convert_tx_timestamp; in otx2_ptp_init()
474 ptp_ptr->convert_rx_ptp_tstmp = &cn10k_ptp_convert_timestamp; in otx2_ptp_init()
475 ptp_ptr->convert_tx_ptp_tstmp = &cn10k_ptp_convert_timestamp; in otx2_ptp_init()
478 INIT_DELAYED_WORK(&ptp_ptr->synctstamp_work, otx2_sync_tstamp); in otx2_ptp_init()
480 pfvf->ptp = ptp_ptr; in otx2_ptp_init()
489 struct otx2_ptp *ptp = pfvf->ptp; in otx2_ptp_destroy()
494 cancel_delayed_work(&pfvf->ptp->synctstamp_work); in otx2_ptp_destroy()
496 ptp_clock_unregister(ptp->ptp_clock); in otx2_ptp_destroy()
498 pfvf->ptp = NULL; in otx2_ptp_destroy()
504 if (!pfvf->ptp) in otx2_ptp_clock_index()
505 return -ENODEV; in otx2_ptp_clock_index()
507 return ptp_clock_index(pfvf->ptp->ptp_clock); in otx2_ptp_clock_index()
513 if (!pfvf->ptp) in otx2_ptp_tstamp2time()
514 return -ENODEV; in otx2_ptp_tstamp2time()
516 *tsns = pfvf->ptp->ptp_tstamp2nsec(&pfvf->ptp->time_counter, tstamp); in otx2_ptp_tstamp2time()