Lines Matching +full:scaled +full:- +full:sync

1 // SPDX-License-Identifier: GPL-2.0-only
8 * idpf_ptp_get_access - Determine the access type of the PTP features
18 if (adapter->ptp->caps & direct) in idpf_ptp_get_access()
20 else if (adapter->ptp->caps & mailbox) in idpf_ptp_get_access()
27 * idpf_ptp_get_features_access - Determine the access type of PTP features
35 struct idpf_ptp *ptp = adapter->ptp; in idpf_ptp_get_features_access()
41 ptp->get_dev_clk_time_access = idpf_ptp_get_access(adapter, in idpf_ptp_get_features_access()
48 ptp->get_cross_tstamp_access = idpf_ptp_get_access(adapter, in idpf_ptp_get_features_access()
55 ptp->set_dev_clk_time_access = idpf_ptp_get_access(adapter, in idpf_ptp_get_features_access()
62 ptp->adj_dev_clk_time_access = idpf_ptp_get_access(adapter, in idpf_ptp_get_features_access()
69 ptp->tx_tstamp_access = idpf_ptp_get_access(adapter, in idpf_ptp_get_features_access()
75 * idpf_ptp_enable_shtime - Enable shadow time and execute a command
83 shtime_enable = adapter->ptp->cmd.shtime_enable_mask; in idpf_ptp_enable_shtime()
84 exec_cmd = adapter->ptp->cmd.exec_cmd_mask; in idpf_ptp_enable_shtime()
86 /* Set the shtime en and the sync field */ in idpf_ptp_enable_shtime()
87 writel(shtime_enable, adapter->ptp->dev_clk_regs.cmd_sync); in idpf_ptp_enable_shtime()
88 writel(exec_cmd | shtime_enable, adapter->ptp->dev_clk_regs.cmd_sync); in idpf_ptp_enable_shtime()
92 * idpf_ptp_read_src_clk_reg_direct - Read directly the main timer value
102 struct idpf_ptp *ptp = adapter->ptp; in idpf_ptp_read_src_clk_reg_direct()
105 spin_lock(&ptp->read_dev_clk_lock); in idpf_ptp_read_src_clk_reg_direct()
115 lo = readl(ptp->dev_clk_regs.dev_clk_ns_l); in idpf_ptp_read_src_clk_reg_direct()
116 hi = readl(ptp->dev_clk_regs.dev_clk_ns_h); in idpf_ptp_read_src_clk_reg_direct()
118 spin_unlock(&ptp->read_dev_clk_lock); in idpf_ptp_read_src_clk_reg_direct()
124 * idpf_ptp_read_src_clk_reg_mailbox - Read the main timer value through mailbox
130 * Return: 0 on success, -errno otherwise.
155 * idpf_ptp_read_src_clk_reg - Read the main timer value
161 * Return: the device clock time on success, -errno otherwise.
166 switch (adapter->ptp->get_dev_clk_time_access) { in idpf_ptp_read_src_clk_reg()
168 return -EOPNOTSUPP; in idpf_ptp_read_src_clk_reg()
175 return -EOPNOTSUPP; in idpf_ptp_read_src_clk_reg()
183 * idpf_ptp_get_sync_device_time_direct - Get the cross time stamp values
193 struct idpf_ptp *ptp = adapter->ptp; in idpf_ptp_get_sync_device_time_direct()
195 spin_lock(&ptp->read_dev_clk_lock); in idpf_ptp_get_sync_device_time_direct()
199 dev_time_lo = readl(ptp->dev_clk_regs.dev_clk_ns_l); in idpf_ptp_get_sync_device_time_direct()
200 dev_time_hi = readl(ptp->dev_clk_regs.dev_clk_ns_h); in idpf_ptp_get_sync_device_time_direct()
202 sys_time_lo = readl(ptp->dev_clk_regs.sys_time_ns_l); in idpf_ptp_get_sync_device_time_direct()
203 sys_time_hi = readl(ptp->dev_clk_regs.sys_time_ns_h); in idpf_ptp_get_sync_device_time_direct()
205 spin_unlock(&ptp->read_dev_clk_lock); in idpf_ptp_get_sync_device_time_direct()
212 * idpf_ptp_get_sync_device_time_mailbox - Get the cross time stamp values
218 * Return: 0 on success, -errno otherwise.
237 * idpf_ptp_get_sync_device_time - Get the cross time stamp info
244 * Return: 0 on success, -errno otherwise.
254 switch (adapter->ptp->get_cross_tstamp_access) { in idpf_ptp_get_sync_device_time()
256 return -EOPNOTSUPP; in idpf_ptp_get_sync_device_time()
269 return -EOPNOTSUPP; in idpf_ptp_get_sync_device_time()
274 system->cs_id = IS_ENABLED(CONFIG_X86) ? CSID_X86_ART in idpf_ptp_get_sync_device_time()
276 system->cycles = ns_time_sys; in idpf_ptp_get_sync_device_time()
277 system->use_nsecs = true; in idpf_ptp_get_sync_device_time()
283 * idpf_ptp_get_crosststamp - Capture a device cross timestamp
290 * Return: cross timestamp value on success, -errno on failure.
303 * idpf_ptp_gettimex64 - Get the time of the clock
310 * struct on success, -errno otherwise.
322 return -EACCES; in idpf_ptp_gettimex64()
330 * idpf_ptp_update_phctime_rxq_grp - Update the cached PHC time for a given Rx
344 for (i = 0; i < grp->singleq.num_rxq; i++) { in idpf_ptp_update_phctime_rxq_grp()
345 rxq = grp->singleq.rxqs[i]; in idpf_ptp_update_phctime_rxq_grp()
347 WRITE_ONCE(rxq->cached_phc_time, systime); in idpf_ptp_update_phctime_rxq_grp()
350 for (i = 0; i < grp->splitq.num_rxq_sets; i++) { in idpf_ptp_update_phctime_rxq_grp()
351 rxq = &grp->splitq.rxq_sets[i]->rxq; in idpf_ptp_update_phctime_rxq_grp()
353 WRITE_ONCE(rxq->cached_phc_time, systime); in idpf_ptp_update_phctime_rxq_grp()
359 * idpf_ptp_update_cached_phctime - Update the cached PHC time values
368 * Return: 0 on success, -errno otherwise.
377 return -EACCES; in idpf_ptp_update_cached_phctime()
383 WRITE_ONCE(adapter->ptp->cached_phc_time, systime); in idpf_ptp_update_cached_phctime()
384 WRITE_ONCE(adapter->ptp->cached_phc_jiffies, jiffies); in idpf_ptp_update_cached_phctime()
389 if (!vport || !vport->rxq_grps) in idpf_ptp_update_cached_phctime()
392 split = idpf_is_queue_model_split(vport->rxq_model); in idpf_ptp_update_cached_phctime()
394 for (u16 i = 0; i < vport->num_rxq_grp; i++) { in idpf_ptp_update_cached_phctime()
395 struct idpf_rxq_group *grp = &vport->rxq_grps[i]; in idpf_ptp_update_cached_phctime()
405 * idpf_ptp_settime64 - Set the time of the clock
412 * Return: 0 on success, -errno otherwise.
422 access = adapter->ptp->set_dev_clk_time_access; in idpf_ptp_settime64()
424 return -EOPNOTSUPP; in idpf_ptp_settime64()
430 pci_err(adapter->pdev, "Failed to set the time, err: %pe\n", in idpf_ptp_settime64()
437 pci_warn(adapter->pdev, in idpf_ptp_settime64()
444 * idpf_ptp_adjtime_nonatomic - Do a non-atomic clock adjustment
448 * Return: 0 on success, -errno otherwise.
466 * idpf_ptp_adjtime - Adjust the time of the clock by the indicated delta
470 * Return: 0 on success, -errno otherwise.
478 access = adapter->ptp->adj_dev_clk_time_access; in idpf_ptp_adjtime()
480 return -EOPNOTSUPP; in idpf_ptp_adjtime()
482 /* Hardware only supports atomic adjustments using signed 32-bit in idpf_ptp_adjtime()
484 * a non-atomic get->adjust->set flow. in idpf_ptp_adjtime()
491 pci_err(adapter->pdev, "Failed to adjust the clock with delta %lld err: %pe\n", in idpf_ptp_adjtime()
498 pci_warn(adapter->pdev, in idpf_ptp_adjtime()
505 * idpf_ptp_adjfine - Adjust clock increment rate
507 * @scaled_ppm: Parts per million with 16-bit fractional field
509 * Adjust the frequency of the clock by the indicated scaled ppm from the
512 * Return: 0 on success, -errno otherwise.
521 access = adapter->ptp->adj_dev_clk_time_access; in idpf_ptp_adjfine()
523 return -EOPNOTSUPP; in idpf_ptp_adjfine()
525 incval = adapter->ptp->base_incval; in idpf_ptp_adjfine()
530 pci_err(adapter->pdev, "Failed to adjust clock increment rate for scaled ppm %ld %pe\n", in idpf_ptp_adjfine()
537 * idpf_ptp_verify_pin - Verify if pin supports requested pin function
548 return -EOPNOTSUPP; in idpf_ptp_verify_pin()
552 * idpf_ptp_gpio_enable - Enable/disable ancillary features of PHC
562 return -EOPNOTSUPP; in idpf_ptp_gpio_enable()
566 * idpf_ptp_tstamp_extend_32b_to_64b - Convert a 32b nanoseconds Tx or Rx
587 delta = in_timestamp - phc_time_lo; in idpf_ptp_tstamp_extend_32b_to_64b()
591 delta = phc_time_lo - in_timestamp; in idpf_ptp_tstamp_extend_32b_to_64b()
592 ns = cached_phc_time - delta; in idpf_ptp_tstamp_extend_32b_to_64b()
601 * idpf_ptp_extend_ts - Convert a 40b timestamp to 64b nanoseconds
616 struct idpf_ptp *ptp = vport->adapter->ptp; in idpf_ptp_extend_ts()
619 discard_time = ptp->cached_phc_jiffies + 2 * HZ; in idpf_ptp_extend_ts()
622 u64_stats_update_begin(&vport->tstamp_stats.stats_sync); in idpf_ptp_extend_ts()
623 u64_stats_inc(&vport->tstamp_stats.discarded); in idpf_ptp_extend_ts()
624 u64_stats_update_end(&vport->tstamp_stats.stats_sync); in idpf_ptp_extend_ts()
629 return idpf_ptp_tstamp_extend_32b_to_64b(ptp->cached_phc_time, in idpf_ptp_extend_ts()
634 * idpf_ptp_request_ts - Request an available Tx timestamp index
643 * -errno otherwise.
652 spin_lock(&tx_q->cached_tstamp_caps->latches_lock); in idpf_ptp_request_ts()
654 head = &tx_q->cached_tstamp_caps->latches_free; in idpf_ptp_request_ts()
656 spin_unlock(&tx_q->cached_tstamp_caps->latches_lock); in idpf_ptp_request_ts()
657 return -ENOBUFS; in idpf_ptp_request_ts()
662 list_del(&ptp_tx_tstamp->list_member); in idpf_ptp_request_ts()
664 ptp_tx_tstamp->skb = skb_get(skb); in idpf_ptp_request_ts()
665 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in idpf_ptp_request_ts()
668 list_add(&ptp_tx_tstamp->list_member, in idpf_ptp_request_ts()
669 &tx_q->cached_tstamp_caps->latches_in_use); in idpf_ptp_request_ts()
670 spin_unlock(&tx_q->cached_tstamp_caps->latches_lock); in idpf_ptp_request_ts()
672 *idx = ptp_tx_tstamp->idx; in idpf_ptp_request_ts()
678 * idpf_ptp_set_rx_tstamp - Enable or disable Rx timestamping
686 splitq = idpf_is_queue_model_split(vport->rxq_model); in idpf_ptp_set_rx_tstamp()
690 vport->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in idpf_ptp_set_rx_tstamp()
692 vport->tstamp_config.rx_filter = HWTSTAMP_FILTER_ALL; in idpf_ptp_set_rx_tstamp()
695 for (u16 i = 0; i < vport->num_rxq_grp; i++) { in idpf_ptp_set_rx_tstamp()
696 struct idpf_rxq_group *grp = &vport->rxq_grps[i]; in idpf_ptp_set_rx_tstamp()
701 num_rxq = grp->splitq.num_rxq_sets; in idpf_ptp_set_rx_tstamp()
703 num_rxq = grp->singleq.num_rxq; in idpf_ptp_set_rx_tstamp()
707 rx_queue = &grp->splitq.rxq_sets[j]->rxq; in idpf_ptp_set_rx_tstamp()
709 rx_queue = grp->singleq.rxqs[j]; in idpf_ptp_set_rx_tstamp()
720 * idpf_ptp_set_timestamp_mode - Setup driver for requested timestamp mode
724 * Return: 0 on success, -errno otherwise.
729 switch (config->tx_type) { in idpf_ptp_set_timestamp_mode()
734 return -EINVAL; in idpf_ptp_set_timestamp_mode()
737 return -EINVAL; in idpf_ptp_set_timestamp_mode()
740 vport->tstamp_config.tx_type = config->tx_type; in idpf_ptp_set_timestamp_mode()
741 idpf_ptp_set_rx_tstamp(vport, config->rx_filter); in idpf_ptp_set_timestamp_mode()
742 *config = vport->tstamp_config; in idpf_ptp_set_timestamp_mode()
748 * idpf_tstamp_task - Delayed task to handle Tx tstamps
761 * idpf_ptp_do_aux_work - Do PTP periodic work
776 * idpf_ptp_set_caps - Set PTP capabilities
783 struct ptp_clock_info *info = &adapter->ptp->info; in idpf_ptp_set_caps()
785 snprintf(info->name, sizeof(info->name), "%s-%s-clk", in idpf_ptp_set_caps()
786 KBUILD_MODNAME, pci_name(adapter->pdev)); in idpf_ptp_set_caps()
788 info->owner = THIS_MODULE; in idpf_ptp_set_caps()
789 info->max_adj = adapter->ptp->max_adj; in idpf_ptp_set_caps()
790 info->gettimex64 = idpf_ptp_gettimex64; in idpf_ptp_set_caps()
791 info->settime64 = idpf_ptp_settime64; in idpf_ptp_set_caps()
792 info->adjfine = idpf_ptp_adjfine; in idpf_ptp_set_caps()
793 info->adjtime = idpf_ptp_adjtime; in idpf_ptp_set_caps()
794 info->verify = idpf_ptp_verify_pin; in idpf_ptp_set_caps()
795 info->enable = idpf_ptp_gpio_enable; in idpf_ptp_set_caps()
796 info->do_aux_work = idpf_ptp_do_aux_work; in idpf_ptp_set_caps()
798 info->getcrosststamp = idpf_ptp_get_crosststamp; in idpf_ptp_set_caps()
800 if (pcie_ptm_enabled(adapter->pdev) && in idpf_ptp_set_caps()
803 info->getcrosststamp = idpf_ptp_get_crosststamp; in idpf_ptp_set_caps()
808 * idpf_ptp_create_clock - Create PTP clock device for userspace
813 * Return: 0 on success, -errno otherwise.
822 clock = ptp_clock_register(&adapter->ptp->info, in idpf_ptp_create_clock()
823 &adapter->pdev->dev); in idpf_ptp_create_clock()
825 pci_err(adapter->pdev, "PTP clock creation failed: %pe\n", in idpf_ptp_create_clock()
830 adapter->ptp->clock = clock; in idpf_ptp_create_clock()
836 * idpf_ptp_release_vport_tstamp - Release the Tx timestamps trakcers for a
848 cancel_work_sync(&vport->tstamp_task); in idpf_ptp_release_vport_tstamp()
851 spin_lock_bh(&vport->tx_tstamp_caps->latches_lock); in idpf_ptp_release_vport_tstamp()
853 head = &vport->tx_tstamp_caps->latches_free; in idpf_ptp_release_vport_tstamp()
855 list_del(&ptp_tx_tstamp->list_member); in idpf_ptp_release_vport_tstamp()
860 head = &vport->tx_tstamp_caps->latches_in_use; in idpf_ptp_release_vport_tstamp()
861 u64_stats_update_begin(&vport->tstamp_stats.stats_sync); in idpf_ptp_release_vport_tstamp()
863 u64_stats_inc(&vport->tstamp_stats.flushed); in idpf_ptp_release_vport_tstamp()
865 list_del(&ptp_tx_tstamp->list_member); in idpf_ptp_release_vport_tstamp()
866 if (ptp_tx_tstamp->skb) in idpf_ptp_release_vport_tstamp()
867 consume_skb(ptp_tx_tstamp->skb); in idpf_ptp_release_vport_tstamp()
871 u64_stats_update_end(&vport->tstamp_stats.stats_sync); in idpf_ptp_release_vport_tstamp()
873 spin_unlock_bh(&vport->tx_tstamp_caps->latches_lock); in idpf_ptp_release_vport_tstamp()
875 kfree(vport->tx_tstamp_caps); in idpf_ptp_release_vport_tstamp()
876 vport->tx_tstamp_caps = NULL; in idpf_ptp_release_vport_tstamp()
880 * idpf_ptp_release_tstamp - Release the Tx timestamps trackers
896 * idpf_ptp_get_txq_tstamp_capability - Verify the timestamping capability
908 if (!txq || !txq->cached_tstamp_caps) in idpf_ptp_get_txq_tstamp_capability()
910 else if (txq->cached_tstamp_caps->access) in idpf_ptp_get_txq_tstamp_capability()
917 * idpf_ptp_init - Initialize PTP hardware clock support
924 * Return: 0 on success, -errno otherwise.
932 pci_dbg(adapter->pdev, "PTP capability is not detected\n"); in idpf_ptp_init()
933 return -EOPNOTSUPP; in idpf_ptp_init()
936 adapter->ptp = kzalloc(sizeof(*adapter->ptp), GFP_KERNEL); in idpf_ptp_init()
937 if (!adapter->ptp) in idpf_ptp_init()
938 return -ENOMEM; in idpf_ptp_init()
941 adapter->ptp->adapter = adapter; in idpf_ptp_init()
943 if (adapter->dev_ops.reg_ops.ptp_reg_init) in idpf_ptp_init()
944 adapter->dev_ops.reg_ops.ptp_reg_init(adapter); in idpf_ptp_init()
948 pci_err(adapter->pdev, "Failed to get PTP caps err %d\n", err); in idpf_ptp_init()
956 if (adapter->ptp->get_dev_clk_time_access != IDPF_PTP_NONE) in idpf_ptp_init()
957 ptp_schedule_worker(adapter->ptp->clock, 0); in idpf_ptp_init()
962 if (adapter->ptp->adj_dev_clk_time_access != IDPF_PTP_NONE) { in idpf_ptp_init()
964 adapter->ptp->base_incval); in idpf_ptp_init()
970 if (adapter->ptp->set_dev_clk_time_access != IDPF_PTP_NONE) { in idpf_ptp_init()
972 err = idpf_ptp_settime64(&adapter->ptp->info, &ts); in idpf_ptp_init()
977 spin_lock_init(&adapter->ptp->read_dev_clk_lock); in idpf_ptp_init()
979 pci_dbg(adapter->pdev, "PTP init successful\n"); in idpf_ptp_init()
984 if (adapter->ptp->get_dev_clk_time_access != IDPF_PTP_NONE) in idpf_ptp_init()
985 ptp_cancel_worker_sync(adapter->ptp->clock); in idpf_ptp_init()
987 ptp_clock_unregister(adapter->ptp->clock); in idpf_ptp_init()
988 adapter->ptp->clock = NULL; in idpf_ptp_init()
991 kfree(adapter->ptp); in idpf_ptp_init()
992 adapter->ptp = NULL; in idpf_ptp_init()
998 * idpf_ptp_release - Clear PTP hardware clock support
1003 struct idpf_ptp *ptp = adapter->ptp; in idpf_ptp_release()
1008 if (ptp->tx_tstamp_access != IDPF_PTP_NONE && in idpf_ptp_release()
1009 ptp->get_dev_clk_time_access != IDPF_PTP_NONE) in idpf_ptp_release()
1012 if (ptp->clock) { in idpf_ptp_release()
1013 if (adapter->ptp->get_dev_clk_time_access != IDPF_PTP_NONE) in idpf_ptp_release()
1014 ptp_cancel_worker_sync(adapter->ptp->clock); in idpf_ptp_release()
1016 ptp_clock_unregister(ptp->clock); in idpf_ptp_release()
1020 adapter->ptp = NULL; in idpf_ptp_release()