Lines Matching full:pf

60 static struct ice_pf *ice_get_ctrl_pf(struct ice_pf *pf)  in ice_get_ctrl_pf()  argument
62 return !pf->adapter ? NULL : pf->adapter->ctrl_pf; in ice_get_ctrl_pf()
65 static struct ice_ptp *ice_get_ctrl_ptp(struct ice_pf *pf) in ice_get_ctrl_ptp() argument
67 struct ice_pf *ctrl_pf = ice_get_ctrl_pf(pf); in ice_get_ctrl_ptp()
74 * @pf: Board private structure
80 static int ice_ptp_find_pin_idx(struct ice_pf *pf, enum ptp_pin_function func, in ice_ptp_find_pin_idx() argument
83 const struct ptp_clock_info *info = &pf->ptp.info; in ice_ptp_find_pin_idx()
97 * @pf: Board private structure
101 static void ice_ptp_update_sma_data(struct ice_pf *pf, unsigned int sma_pins[], in ice_ptp_update_sma_data() argument
147 dev_dbg(ice_pf_to_dev(pf), "%s, %s\n", state1, state2); in ice_ptp_update_sma_data()
152 * @pf: Board private structure
156 static int ice_ptp_set_sma_cfg(struct ice_pf *pf) in ice_ptp_set_sma_cfg() argument
158 const struct ice_ptp_pin_desc *ice_pins = pf->ptp.ice_pin_desc; in ice_ptp_set_sma_cfg()
159 struct ptp_pin_desc *pins = pf->ptp.pin_desc; in ice_ptp_set_sma_cfg()
165 err = ice_read_sma_ctrl(&pf->hw, &data); in ice_ptp_set_sma_cfg()
170 for (int i = 0; i < pf->ptp.info.n_pins; i++) in ice_ptp_set_sma_cfg()
186 ice_ptp_update_sma_data(pf, sma_pins, &data); in ice_ptp_set_sma_cfg()
187 return ice_write_sma_ctrl(&pf->hw, data); in ice_ptp_set_sma_cfg()
192 * @pf: Board private structure
197 static void ice_ptp_cfg_tx_interrupt(struct ice_pf *pf) in ice_ptp_cfg_tx_interrupt() argument
199 struct ice_hw *hw = &pf->hw; in ice_ptp_cfg_tx_interrupt()
203 switch (pf->ptp.tx_interrupt_mode) { in ice_ptp_cfg_tx_interrupt()
216 enable = pf->ptp.tstamp_config.tx_type == HWTSTAMP_TX_ON; in ice_ptp_cfg_tx_interrupt()
231 * @pf: The PF pointer to search in
234 static void ice_set_rx_tstamp(struct ice_pf *pf, bool on) in ice_set_rx_tstamp() argument
239 vsi = ice_get_main_vsi(pf); in ice_set_rx_tstamp()
253 * @pf: Board private structure
259 static void ice_ptp_disable_timestamp_mode(struct ice_pf *pf) in ice_ptp_disable_timestamp_mode() argument
261 struct ice_hw *hw = &pf->hw; in ice_ptp_disable_timestamp_mode()
268 ice_set_rx_tstamp(pf, false); in ice_ptp_disable_timestamp_mode()
273 * @pf: Board private structure
278 void ice_ptp_restore_timestamp_mode(struct ice_pf *pf) in ice_ptp_restore_timestamp_mode() argument
280 struct ice_hw *hw = &pf->hw; in ice_ptp_restore_timestamp_mode()
283 ice_ptp_cfg_tx_interrupt(pf); in ice_ptp_restore_timestamp_mode()
285 enable_rx = pf->ptp.tstamp_config.rx_filter == HWTSTAMP_FILTER_ALL; in ice_ptp_restore_timestamp_mode()
286 ice_set_rx_tstamp(pf, enable_rx); in ice_ptp_restore_timestamp_mode()
297 * @pf: Board private structure
302 ice_ptp_read_src_clk_reg(struct ice_pf *pf, struct ptp_system_timestamp *sts) in ice_ptp_read_src_clk_reg() argument
304 struct ice_hw *hw = &pf->hw; in ice_ptp_read_src_clk_reg()
309 guard(spinlock)(&pf->adapter->ptp_gltsyn_time_lock); in ice_ptp_read_src_clk_reg()
403 * @pf: Board private structure
427 static u64 ice_ptp_extend_40b_ts(struct ice_pf *pf, u64 in_tstamp) in ice_ptp_extend_40b_ts() argument
433 discard_time = pf->ptp.cached_phc_jiffies + msecs_to_jiffies(2000); in ice_ptp_extend_40b_ts()
435 pf->ptp.tx_hwtstamp_discarded++; in ice_ptp_extend_40b_ts()
439 return ice_ptp_extend_32b_ts(pf->ptp.cached_phc_time, in ice_ptp_extend_40b_ts()
471 struct ice_pf *pf; in ice_ptp_req_tx_single_tstamp() local
477 pf = ptp_port_to_pf(ptp_port); in ice_ptp_req_tx_single_tstamp()
478 params = &pf->hw.ptp.phy.e810; in ice_ptp_req_tx_single_tstamp()
483 pf->ptp.tx_hwtstamp_timeouts++; in ice_ptp_req_tx_single_tstamp()
499 /* Write TS index to read to the PF register so the FW can read it */ in ice_ptp_req_tx_single_tstamp()
500 wr32(&pf->hw, REG_LL_PROXY_H, in ice_ptp_req_tx_single_tstamp()
523 struct ice_pf *pf; in ice_ptp_complete_tx_single_tstamp() local
530 pf = ptp_port_to_pf(ptp_port); in ice_ptp_complete_tx_single_tstamp()
531 dev = ice_pf_to_dev(pf); in ice_ptp_complete_tx_single_tstamp()
532 params = &pf->hw.ptp.phy.e810; in ice_ptp_complete_tx_single_tstamp()
543 raw_tstamp = rd32(&pf->hw, REG_LL_PROXY_L); in ice_ptp_complete_tx_single_tstamp()
545 reg_ll_high = rd32(&pf->hw, REG_LL_PROXY_H); in ice_ptp_complete_tx_single_tstamp()
556 dev_err(ice_pf_to_dev(pf), "Failed to get the Tx tstamp - FW not ready"); in ice_ptp_complete_tx_single_tstamp()
585 tstamp = ice_ptp_extend_40b_ts(pf, raw_tstamp); in ice_ptp_complete_tx_single_tstamp()
647 struct ice_pf *pf; in ice_ptp_process_tx_tstamp() local
655 pf = ptp_port_to_pf(ptp_port); in ice_ptp_process_tx_tstamp()
656 hw = &pf->hw; in ice_ptp_process_tx_tstamp()
680 pf->ptp.tx_hwtstamp_timeouts++; in ice_ptp_process_tx_tstamp()
743 tstamp = ice_ptp_extend_40b_ts(pf, raw_tstamp); in ice_ptp_process_tx_tstamp()
756 * @pf: Board private structure
758 static enum ice_tx_tstamp_work ice_ptp_tx_tstamp_owner(struct ice_pf *pf) in ice_ptp_tx_tstamp_owner() argument
763 mutex_lock(&pf->adapter->ports.lock); in ice_ptp_tx_tstamp_owner()
764 list_for_each_entry(port, &pf->adapter->ports.ports, list_node) { in ice_ptp_tx_tstamp_owner()
772 mutex_unlock(&pf->adapter->ports.lock); in ice_ptp_tx_tstamp_owner()
774 for (i = 0; i < ICE_GET_QUAD_NUM(pf->hw.ptp.num_lports); i++) { in ice_ptp_tx_tstamp_owner()
779 err = ice_get_phy_tx_tstamp_ready(&pf->hw, i, &tstamp_ready); in ice_ptp_tx_tstamp_owner()
856 * @pf: Board private structure
862 ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_flush_tx_tracker() argument
864 struct ice_hw *hw = &pf->hw; in ice_ptp_flush_tx_tracker()
872 dev_dbg(ice_pf_to_dev(pf), "Failed to get the Tx tstamp ready bitmap for block %u, err %d\n", in ice_ptp_flush_tx_tracker()
897 pf->ptp.tx_hwtstamp_flushed++; in ice_ptp_flush_tx_tracker()
927 * @pf: Board private structure
933 ice_ptp_flush_all_tx_tracker(struct ice_pf *pf) in ice_ptp_flush_all_tx_tracker() argument
937 list_for_each_entry(port, &pf->adapter->ports.ports, list_node) in ice_ptp_flush_all_tx_tracker()
943 * @pf: Board private structure
949 ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_release_tx_tracker() argument
958 synchronize_irq(pf->oicr_irq.virq); in ice_ptp_release_tx_tracker()
960 ice_ptp_flush_tx_tracker(pf, tx); in ice_ptp_release_tx_tracker()
976 * @pf: Board private structure
985 static int ice_ptp_init_tx_eth56g(struct ice_pf *pf, struct ice_ptp_tx *tx, in ice_ptp_init_tx_eth56g() argument
998 * @pf: Board private structure
1008 ice_ptp_init_tx_e82x(struct ice_pf *pf, struct ice_ptp_tx *tx, u8 port) in ice_ptp_init_tx_e82x() argument
1020 * @pf: Board private structure
1023 * Initialize the Tx timestamp tracker for this PF. For E810 devices, each
1027 ice_ptp_init_tx_e810(struct ice_pf *pf, struct ice_ptp_tx *tx) in ice_ptp_init_tx_e810() argument
1029 tx->block = pf->hw.port_info->lport; in ice_ptp_init_tx_e810()
1043 * @pf: Board specific private structure
1045 * This function updates the system time values which are cached in the PF
1051 * Note that the cached copy in the PF PTP structure is always updated, even
1056 * * -EAGAIN - PF was busy, need to reschedule the update
1058 static int ice_ptp_update_cached_phctime(struct ice_pf *pf) in ice_ptp_update_cached_phctime() argument
1060 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_update_cached_phctime()
1065 update_before = pf->ptp.cached_phc_jiffies + msecs_to_jiffies(2000); in ice_ptp_update_cached_phctime()
1066 if (pf->ptp.cached_phc_time && in ice_ptp_update_cached_phctime()
1068 unsigned long time_taken = jiffies - pf->ptp.cached_phc_jiffies; in ice_ptp_update_cached_phctime()
1072 pf->ptp.late_cached_phc_updates++; in ice_ptp_update_cached_phctime()
1076 systime = ice_ptp_read_src_clk_reg(pf, NULL); in ice_ptp_update_cached_phctime()
1078 /* Update the cached PHC time stored in the PF structure */ in ice_ptp_update_cached_phctime()
1079 WRITE_ONCE(pf->ptp.cached_phc_time, systime); in ice_ptp_update_cached_phctime()
1080 WRITE_ONCE(pf->ptp.cached_phc_jiffies, jiffies); in ice_ptp_update_cached_phctime()
1082 if (test_and_set_bit(ICE_CFG_BUSY, pf->state)) in ice_ptp_update_cached_phctime()
1085 ice_for_each_vsi(pf, i) { in ice_ptp_update_cached_phctime()
1086 struct ice_vsi *vsi = pf->vsi[i]; in ice_ptp_update_cached_phctime()
1101 clear_bit(ICE_CFG_BUSY, pf->state); in ice_ptp_update_cached_phctime()
1108 * @pf: Board specific private structure
1112 * timestamps as stale and updates the cached PHC time for both the PF and Rx
1119 static void ice_ptp_reset_cached_phctime(struct ice_pf *pf) in ice_ptp_reset_cached_phctime() argument
1121 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_reset_cached_phctime()
1127 err = ice_ptp_update_cached_phctime(pf); in ice_ptp_reset_cached_phctime()
1137 kthread_queue_delayed_work(pf->ptp.kworker, &pf->ptp.work, in ice_ptp_reset_cached_phctime()
1146 ice_ptp_mark_tx_tracker_stale(&pf->ptp.port.tx); in ice_ptp_reset_cached_phctime()
1151 * @pf: Board private structure
1156 static int ice_ptp_write_init(struct ice_pf *pf, struct timespec64 *ts) in ice_ptp_write_init() argument
1159 struct ice_hw *hw = &pf->hw; in ice_ptp_write_init()
1166 * @pf: Board private structure
1172 static int ice_ptp_write_adj(struct ice_pf *pf, s32 adj) in ice_ptp_write_adj() argument
1174 struct ice_hw *hw = &pf->hw; in ice_ptp_write_adj()
1181 * @pf: Board private structure
1188 static u64 ice_base_incval(struct ice_pf *pf) in ice_base_incval() argument
1190 struct ice_hw *hw = &pf->hw; in ice_base_incval()
1195 dev_dbg(ice_pf_to_dev(pf), "PTP: using base increment value of 0x%016llx\n", in ice_base_incval()
1209 struct ice_pf *pf; in ice_ptp_check_tx_fifo() local
1214 pf = ptp_port_to_pf(port); in ice_ptp_check_tx_fifo()
1215 hw = &pf->hw; in ice_ptp_check_tx_fifo()
1229 dev_err(ice_pf_to_dev(pf), "PTP failed to check port %d Tx FIFO, err %d\n", in ice_ptp_check_tx_fifo()
1246 dev_dbg(ice_pf_to_dev(pf), "Try %d, port %d FIFO not empty\n", in ice_ptp_check_tx_fifo()
1250 dev_dbg(ice_pf_to_dev(pf), in ice_ptp_check_tx_fifo()
1279 struct ice_pf *pf; in ice_ptp_wait_for_offsets() local
1285 pf = ptp_port_to_pf(port); in ice_ptp_wait_for_offsets()
1286 hw = &pf->hw; in ice_ptp_wait_for_offsets()
1288 if (ice_is_reset_in_progress(pf->state)) { in ice_ptp_wait_for_offsets()
1290 kthread_queue_delayed_work(pf->ptp.kworker, in ice_ptp_wait_for_offsets()
1302 kthread_queue_delayed_work(pf->ptp.kworker, in ice_ptp_wait_for_offsets()
1316 struct ice_pf *pf = ptp_port_to_pf(ptp_port); in ice_ptp_port_phy_stop() local
1318 struct ice_hw *hw = &pf->hw; in ice_ptp_port_phy_stop()
1339 dev_err(ice_pf_to_dev(pf), "PTP failed to set PHY port %d down, err %d\n", in ice_ptp_port_phy_stop()
1358 struct ice_pf *pf = ptp_port_to_pf(ptp_port); in ice_ptp_port_phy_restart() local
1360 struct ice_hw *hw = &pf->hw; in ice_ptp_port_phy_restart()
1398 kthread_queue_delayed_work(pf->ptp.kworker, &ptp_port->ov_work, in ice_ptp_port_phy_restart()
1406 dev_err(ice_pf_to_dev(pf), "PTP failed to set PHY port %d up, err %d\n", in ice_ptp_port_phy_restart()
1416 * @pf: Board private structure
1419 void ice_ptp_link_change(struct ice_pf *pf, bool linkup) in ice_ptp_link_change() argument
1422 struct ice_hw *hw = &pf->hw; in ice_ptp_link_change()
1424 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_link_change()
1427 ptp_port = &pf->ptp.port; in ice_ptp_link_change()
1433 if (pf->hw.reset_ongoing) in ice_ptp_link_change()
1444 dev_warn(ice_pf_to_dev(pf), "%s: Unknown PHY type\n", __func__); in ice_ptp_link_change()
1450 * @pf: PF private structure
1461 static int ice_ptp_cfg_phy_interrupt(struct ice_pf *pf, bool ena, u32 threshold) in ice_ptp_cfg_phy_interrupt() argument
1463 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_cfg_phy_interrupt()
1464 struct ice_hw *hw = &pf->hw; in ice_ptp_cfg_phy_interrupt()
1514 * @pf: Board private structure
1516 static void ice_ptp_reset_phy_timestamping(struct ice_pf *pf) in ice_ptp_reset_phy_timestamping() argument
1518 ice_ptp_port_phy_restart(&pf->ptp.port); in ice_ptp_reset_phy_timestamping()
1523 * @pf: Board private structure
1525 static void ice_ptp_restart_all_phy(struct ice_pf *pf) in ice_ptp_restart_all_phy() argument
1529 list_for_each(entry, &pf->adapter->ports.ports) { in ice_ptp_restart_all_phy()
1549 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_adjfine() local
1550 struct ice_hw *hw = &pf->hw; in ice_ptp_adjfine()
1554 incval = adjust_by_scaled_ppm(ice_base_incval(pf), scaled_ppm); in ice_ptp_adjfine()
1557 dev_err(ice_pf_to_dev(pf), "PTP failed to set incval, err %d\n", in ice_ptp_adjfine()
1567 * @pf: Board private structure
1569 void ice_ptp_extts_event(struct ice_pf *pf) in ice_ptp_extts_event() argument
1572 struct ice_hw *hw = &pf->hw; in ice_ptp_extts_event()
1577 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_extts_event()
1590 if (!(pf->ptp.ext_ts_irq & (1 << chan))) in ice_ptp_extts_event()
1598 pin_desc_idx = ice_ptp_find_pin_idx(pf, PTP_PF_EXTTS, chan); in ice_ptp_extts_event()
1602 desc = &pf->ptp.ice_pin_desc[pin_desc_idx]; in ice_ptp_extts_event()
1608 pf->ptp.ext_ts_irq &= ~(1 << chan); in ice_ptp_extts_event()
1609 ptp_clock_event(pf->ptp.clock, &event); in ice_ptp_extts_event()
1615 * @pf: Board private structure
1623 static int ice_ptp_cfg_extts(struct ice_pf *pf, struct ptp_extts_request *rq, in ice_ptp_cfg_extts() argument
1627 struct ice_hw *hw = &pf->hw; in ice_ptp_cfg_extts()
1643 pin_desc_idx = ice_ptp_find_pin_idx(pf, PTP_PF_EXTTS, chan); in ice_ptp_cfg_extts()
1647 gpio_pin = pf->ptp.ice_pin_desc[pin_desc_idx].gpio[0]; in ice_ptp_cfg_extts()
1677 for (unsigned int i = 0; i < pf->ptp.info.n_ext_ts; i++) in ice_ptp_cfg_extts()
1678 if ((pf->ptp.extts_rqs[i].flags & in ice_ptp_cfg_extts()
1697 * @pf: Board private structure
1699 static void ice_ptp_disable_all_extts(struct ice_pf *pf) in ice_ptp_disable_all_extts() argument
1701 for (unsigned int i = 0; i < pf->ptp.info.n_ext_ts ; i++) in ice_ptp_disable_all_extts()
1702 if (pf->ptp.extts_rqs[i].flags & PTP_ENABLE_FEATURE) in ice_ptp_disable_all_extts()
1703 ice_ptp_cfg_extts(pf, &pf->ptp.extts_rqs[i], in ice_ptp_disable_all_extts()
1706 synchronize_irq(pf->oicr_irq.virq); in ice_ptp_disable_all_extts()
1711 * @pf: Board private structure
1715 static void ice_ptp_enable_all_extts(struct ice_pf *pf) in ice_ptp_enable_all_extts() argument
1717 for (unsigned int i = 0; i < pf->ptp.info.n_ext_ts ; i++) in ice_ptp_enable_all_extts()
1718 if (pf->ptp.extts_rqs[i].flags & PTP_ENABLE_FEATURE) in ice_ptp_enable_all_extts()
1719 ice_ptp_cfg_extts(pf, &pf->ptp.extts_rqs[i], in ice_ptp_enable_all_extts()
1793 * @pf: Board private structure
1802 static int ice_ptp_cfg_perout(struct ice_pf *pf, struct ptp_perout_request *rq, in ice_ptp_cfg_perout() argument
1807 struct ice_hw *hw = &pf->hw; in ice_ptp_cfg_perout()
1813 pin_desc_idx = ice_ptp_find_pin_idx(pf, PTP_PF_PEROUT, rq->index); in ice_ptp_cfg_perout()
1817 gpio_pin = pf->ptp.ice_pin_desc[pin_desc_idx].gpio[1]; in ice_ptp_cfg_perout()
1818 prop_delay_ns = pf->ptp.ice_pin_desc[pin_desc_idx].delay[1]; in ice_ptp_cfg_perout()
1827 if (strncmp(pf->ptp.pin_desc[pin_desc_idx].name, "1PPS", 64) == 0 && in ice_ptp_cfg_perout()
1829 dev_err(ice_pf_to_dev(pf), "1PPS pin supports only 1 s period\n"); in ice_ptp_cfg_perout()
1834 dev_err(ice_pf_to_dev(pf), "CLK Period must be an even value\n"); in ice_ptp_cfg_perout()
1850 clk = ice_ptp_read_src_clk_reg(pf, NULL) + NSEC_PER_MSEC * 500; in ice_ptp_cfg_perout()
1862 * @pf: Board private structure
1868 static void ice_ptp_disable_all_perout(struct ice_pf *pf) in ice_ptp_disable_all_perout() argument
1870 for (unsigned int i = 0; i < pf->ptp.info.n_per_out; i++) in ice_ptp_disable_all_perout()
1871 if (pf->ptp.perout_rqs[i].period.sec || in ice_ptp_disable_all_perout()
1872 pf->ptp.perout_rqs[i].period.nsec) in ice_ptp_disable_all_perout()
1873 ice_ptp_cfg_perout(pf, &pf->ptp.perout_rqs[i], in ice_ptp_disable_all_perout()
1879 * @pf: Board private structure
1885 static void ice_ptp_enable_all_perout(struct ice_pf *pf) in ice_ptp_enable_all_perout() argument
1887 for (unsigned int i = 0; i < pf->ptp.info.n_per_out; i++) in ice_ptp_enable_all_perout()
1888 if (pf->ptp.perout_rqs[i].period.sec || in ice_ptp_enable_all_perout()
1889 pf->ptp.perout_rqs[i].period.nsec) in ice_ptp_enable_all_perout()
1890 ice_ptp_cfg_perout(pf, &pf->ptp.perout_rqs[i], in ice_ptp_enable_all_perout()
1896 * @pf: Board private structure
1902 static int ice_ptp_disable_shared_pin(struct ice_pf *pf, unsigned int pin, in ice_ptp_disable_shared_pin() argument
1909 gpio_pin = pf->ptp.ice_pin_desc[pin].gpio[1]; in ice_ptp_disable_shared_pin()
1912 gpio_pin = pf->ptp.ice_pin_desc[pin].gpio[0]; in ice_ptp_disable_shared_pin()
1918 for (unsigned int i = 0; i < pf->ptp.info.n_pins; i++) { in ice_ptp_disable_shared_pin()
1919 struct ptp_pin_desc *pin_desc = &pf->ptp.pin_desc[i]; in ice_ptp_disable_shared_pin()
1927 pf->ptp.ice_pin_desc[i].gpio[1] == gpio_pin) { in ice_ptp_disable_shared_pin()
1928 pf->ptp.perout_rqs[chan].period.sec = 0; in ice_ptp_disable_shared_pin()
1929 pf->ptp.perout_rqs[chan].period.nsec = 0; in ice_ptp_disable_shared_pin()
1932 dev_dbg(ice_pf_to_dev(pf), "Disabling pin %u with shared output GPIO pin %u\n", in ice_ptp_disable_shared_pin()
1934 return ice_ptp_cfg_perout(pf, &pf->ptp.perout_rqs[chan], in ice_ptp_disable_shared_pin()
1936 } else if (pf->ptp.pin_desc->func == PTP_PF_EXTTS && in ice_ptp_disable_shared_pin()
1937 pf->ptp.ice_pin_desc[i].gpio[0] == gpio_pin) { in ice_ptp_disable_shared_pin()
1938 pf->ptp.extts_rqs[chan].flags &= ~PTP_ENABLE_FEATURE; in ice_ptp_disable_shared_pin()
1941 dev_dbg(ice_pf_to_dev(pf), "Disabling pin %u with shared input GPIO pin %u\n", in ice_ptp_disable_shared_pin()
1943 return ice_ptp_cfg_extts(pf, &pf->ptp.extts_rqs[chan], in ice_ptp_disable_shared_pin()
1963 struct ice_pf *pf = ptp_info_to_pf(info); in ice_verify_pin() local
1966 pin_desc = &pf->ptp.ice_pin_desc[pin]; in ice_verify_pin()
1986 if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) { in ice_verify_pin()
1987 ice_ptp_disable_shared_pin(pf, pin, func); in ice_verify_pin()
1988 pf->ptp.pin_desc[pin].func = func; in ice_verify_pin()
1989 pf->ptp.pin_desc[pin].chan = chan; in ice_verify_pin()
1990 return ice_ptp_set_sma_cfg(pf); in ice_verify_pin()
2007 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_gpio_enable() local
2014 &pf->ptp.perout_rqs[rq->perout.index]; in ice_ptp_gpio_enable()
2016 err = ice_ptp_cfg_perout(pf, &rq->perout, on); in ice_ptp_gpio_enable()
2028 &pf->ptp.extts_rqs[rq->extts.index]; in ice_ptp_gpio_enable()
2030 err = ice_ptp_cfg_extts(pf, &rq->extts, on); in ice_ptp_gpio_enable()
2056 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_gettimex64() local
2059 time_ns = ice_ptp_read_src_clk_reg(pf, sts); in ice_ptp_gettimex64()
2075 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_settime64() local
2077 struct ice_hw *hw = &pf->hw; in ice_ptp_settime64()
2086 dev_warn(ice_pf_to_dev(pf), "Failed to mark timestamps as invalid before settime\n"); in ice_ptp_settime64()
2095 ice_ptp_disable_all_perout(pf); in ice_ptp_settime64()
2097 err = ice_ptp_write_init(pf, &ts64); in ice_ptp_settime64()
2101 ice_ptp_reset_cached_phctime(pf); in ice_ptp_settime64()
2104 ice_ptp_enable_all_perout(pf); in ice_ptp_settime64()
2108 ice_ptp_restart_all_phy(pf); in ice_ptp_settime64()
2111 dev_err(ice_pf_to_dev(pf), "PTP failed to set time %d\n", err); in ice_ptp_settime64()
2144 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_adjtime() local
2145 struct ice_hw *hw = &pf->hw; in ice_ptp_adjtime()
2149 dev = ice_pf_to_dev(pf); in ice_ptp_adjtime()
2166 ice_ptp_disable_all_perout(pf); in ice_ptp_adjtime()
2168 err = ice_ptp_write_adj(pf, delta); in ice_ptp_adjtime()
2171 ice_ptp_enable_all_perout(pf); in ice_ptp_adjtime()
2180 ice_ptp_reset_cached_phctime(pf); in ice_ptp_adjtime()
2200 struct ice_pf *pf = (struct ice_pf *)ctx; in ice_ptp_get_syncdevicetime() local
2201 struct ice_hw *hw = &pf->hw; in ice_ptp_get_syncdevicetime()
2218 dev_err(ice_pf_to_dev(pf), "PTP failed to get hh lock\n"); in ice_ptp_get_syncdevicetime()
2289 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_getcrosststamp_e82x() local
2292 pf, NULL, cts); in ice_ptp_getcrosststamp_e82x()
2298 * @pf: Board private structure
2303 int ice_ptp_get_ts_config(struct ice_pf *pf, struct ifreq *ifr) in ice_ptp_get_ts_config() argument
2307 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_get_ts_config()
2310 config = &pf->ptp.tstamp_config; in ice_ptp_get_ts_config()
2318 * @pf: Board private structure
2322 ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config) in ice_ptp_set_timestamp_mode() argument
2326 pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_OFF; in ice_ptp_set_timestamp_mode()
2329 pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_ON; in ice_ptp_set_timestamp_mode()
2337 pf->ptp.tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in ice_ptp_set_timestamp_mode()
2353 pf->ptp.tstamp_config.rx_filter = HWTSTAMP_FILTER_ALL; in ice_ptp_set_timestamp_mode()
2360 ice_ptp_restore_timestamp_mode(pf); in ice_ptp_set_timestamp_mode()
2367 * @pf: Board private structure
2372 int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr) in ice_ptp_set_ts_config() argument
2377 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_set_ts_config()
2383 err = ice_ptp_set_timestamp_mode(pf, &config); in ice_ptp_set_ts_config()
2388 config = pf->ptp.tstamp_config; in ice_ptp_set_ts_config()
2417 * PHC value, rather than accessing the PF. This also allows us to in ice_ptp_get_rx_hwts()
2430 * @pf: Board private structure
2432 static void ice_ptp_setup_pin_cfg(struct ice_pf *pf) in ice_ptp_setup_pin_cfg() argument
2434 for (unsigned int i = 0; i < pf->ptp.info.n_pins; i++) { in ice_ptp_setup_pin_cfg()
2435 const struct ice_ptp_pin_desc *desc = &pf->ptp.ice_pin_desc[i]; in ice_ptp_setup_pin_cfg()
2436 struct ptp_pin_desc *pin = &pf->ptp.pin_desc[i]; in ice_ptp_setup_pin_cfg()
2439 if (!ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) in ice_ptp_setup_pin_cfg()
2449 pf->ptp.info.pin_config = pf->ptp.pin_desc; in ice_ptp_setup_pin_cfg()
2454 * @pf: pointer to the PF structure
2459 static void ice_ptp_disable_pins(struct ice_pf *pf) in ice_ptp_disable_pins() argument
2461 struct ptp_clock_info *info = &pf->ptp.info; in ice_ptp_disable_pins()
2463 dev_warn(ice_pf_to_dev(pf), "Failed to configure PTP pin control\n"); in ice_ptp_disable_pins()
2474 * @pf: pointer to the PF structure
2481 static int ice_ptp_parse_sdp_entries(struct ice_pf *pf, __le16 *entries, in ice_ptp_parse_sdp_entries() argument
2523 strscpy(pf->ptp.pin_desc[idx].name, in ice_ptp_parse_sdp_entries()
2525 sizeof(pf->ptp.pin_desc[idx] in ice_ptp_parse_sdp_entries()
2535 dev_dbg(ice_pf_to_dev(pf), in ice_ptp_parse_sdp_entries()
2540 pf->ptp.info.n_pins = n_pins; in ice_ptp_parse_sdp_entries()
2546 * @pf: Board private structure
2553 static void ice_ptp_set_funcs_e82x(struct ice_pf *pf) in ice_ptp_set_funcs_e82x() argument
2558 pf->ptp.info.getcrosststamp = ice_ptp_getcrosststamp_e82x; in ice_ptp_set_funcs_e82x()
2561 if (ice_is_e825c(&pf->hw)) { in ice_ptp_set_funcs_e82x()
2562 pf->ptp.ice_pin_desc = ice_pin_desc_e825c; in ice_ptp_set_funcs_e82x()
2563 pf->ptp.info.n_pins = ICE_PIN_DESC_ARR_LEN(ice_pin_desc_e825c); in ice_ptp_set_funcs_e82x()
2565 pf->ptp.ice_pin_desc = ice_pin_desc_e82x; in ice_ptp_set_funcs_e82x()
2566 pf->ptp.info.n_pins = ICE_PIN_DESC_ARR_LEN(ice_pin_desc_e82x); in ice_ptp_set_funcs_e82x()
2568 ice_ptp_setup_pin_cfg(pf); in ice_ptp_set_funcs_e82x()
2573 * @pf: Board private structure
2580 static void ice_ptp_set_funcs_e810(struct ice_pf *pf) in ice_ptp_set_funcs_e810() argument
2584 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_set_funcs_e810()
2588 err = ice_ptp_read_sdp_ac(&pf->hw, entries, &num_entries); in ice_ptp_set_funcs_e810()
2591 if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) { in ice_ptp_set_funcs_e810()
2596 pf->ptp.ice_pin_desc = ice_pin_desc_e810; in ice_ptp_set_funcs_e810()
2597 pf->ptp.info.n_pins = in ice_ptp_set_funcs_e810()
2602 desc = devm_kcalloc(ice_pf_to_dev(pf), ICE_N_PINS_MAX, in ice_ptp_set_funcs_e810()
2608 err = ice_ptp_parse_sdp_entries(pf, entries, num_entries, desc); in ice_ptp_set_funcs_e810()
2616 ice_ptp_setup_pin_cfg(pf); in ice_ptp_set_funcs_e810()
2618 if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) in ice_ptp_set_funcs_e810()
2619 err = ice_ptp_set_sma_cfg(pf); in ice_ptp_set_funcs_e810()
2622 devm_kfree(ice_pf_to_dev(pf), desc); in ice_ptp_set_funcs_e810()
2623 ice_ptp_disable_pins(pf); in ice_ptp_set_funcs_e810()
2629 * @pf: Board private structure
2631 static void ice_ptp_set_caps(struct ice_pf *pf) in ice_ptp_set_caps() argument
2633 struct ptp_clock_info *info = &pf->ptp.info; in ice_ptp_set_caps()
2634 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_set_caps()
2649 if (ice_is_e810(&pf->hw)) in ice_ptp_set_caps()
2650 ice_ptp_set_funcs_e810(pf); in ice_ptp_set_caps()
2652 ice_ptp_set_funcs_e82x(pf); in ice_ptp_set_caps()
2657 * @pf: Board private structure
2664 static long ice_ptp_create_clock(struct ice_pf *pf) in ice_ptp_create_clock() argument
2670 if (pf->ptp.clock) in ice_ptp_create_clock()
2673 ice_ptp_set_caps(pf); in ice_ptp_create_clock()
2675 info = &pf->ptp.info; in ice_ptp_create_clock()
2676 dev = ice_pf_to_dev(pf); in ice_ptp_create_clock()
2679 pf->ptp.clock = ptp_clock_register(info, dev); in ice_ptp_create_clock()
2680 if (IS_ERR(pf->ptp.clock)) { in ice_ptp_create_clock()
2681 dev_err(ice_pf_to_dev(pf), "Failed to register PTP clock device"); in ice_ptp_create_clock()
2682 return PTR_ERR(pf->ptp.clock); in ice_ptp_create_clock()
2738 * @pf: Board private structure
2743 enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf) in ice_ptp_process_ts() argument
2745 switch (pf->ptp.tx_interrupt_mode) { in ice_ptp_process_ts()
2751 return ice_ptp_tx_tstamp(&pf->ptp.port.tx); in ice_ptp_process_ts()
2754 return ice_ptp_tx_tstamp_owner(pf); in ice_ptp_process_ts()
2757 pf->ptp.tx_interrupt_mode); in ice_ptp_process_ts()
2764 * @pf: Board private structure
2775 static void ice_ptp_maybe_trigger_tx_interrupt(struct ice_pf *pf) in ice_ptp_maybe_trigger_tx_interrupt() argument
2777 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_maybe_trigger_tx_interrupt()
2778 struct ice_hw *hw = &pf->hw; in ice_ptp_maybe_trigger_tx_interrupt()
2785 if (!ice_pf_src_tmr_owned(pf)) in ice_ptp_maybe_trigger_tx_interrupt()
2792 err = ice_get_phy_tx_tstamp_ready(&pf->hw, i, &tstamp_ready); in ice_ptp_maybe_trigger_tx_interrupt()
2813 struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp); in ice_ptp_periodic_work() local
2816 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_periodic_work()
2819 err = ice_ptp_update_cached_phctime(pf); in ice_ptp_periodic_work()
2821 ice_ptp_maybe_trigger_tx_interrupt(pf); in ice_ptp_periodic_work()
2830 * @pf: Board private structure
2833 void ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type) in ice_ptp_prepare_for_reset() argument
2835 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_prepare_for_reset()
2844 ice_ptp_disable_timestamp_mode(pf); in ice_ptp_prepare_for_reset()
2851 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_prepare_for_reset()
2854 ice_ptp_disable_all_perout(pf); in ice_ptp_prepare_for_reset()
2856 src_tmr = ice_get_ptp_src_clock_index(&pf->hw); in ice_ptp_prepare_for_reset()
2859 wr32(&pf->hw, GLTSYN_ENA(src_tmr), (u32)~GLTSYN_ENA_TSYN_ENA_M); in ice_ptp_prepare_for_reset()
2867 * @pf: Board private structure
2872 static int ice_ptp_rebuild_owner(struct ice_pf *pf) in ice_ptp_rebuild_owner() argument
2874 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_rebuild_owner()
2875 struct ice_hw *hw = &pf->hw; in ice_ptp_rebuild_owner()
2891 err = ice_ptp_write_incval(hw, ice_base_incval(pf)); in ice_ptp_rebuild_owner()
2905 err = ice_ptp_write_init(pf, &ts); in ice_ptp_rebuild_owner()
2915 ice_ptp_flush_all_tx_tracker(pf); in ice_ptp_rebuild_owner()
2919 err = ice_ptp_cfg_phy_interrupt(pf, true, 1); in ice_ptp_rebuild_owner()
2923 ice_ptp_restart_all_phy(pf); in ice_ptp_rebuild_owner()
2927 ice_ptp_enable_all_perout(pf); in ice_ptp_rebuild_owner()
2928 ice_ptp_enable_all_extts(pf); in ice_ptp_rebuild_owner()
2939 * @pf: Board private structure
2942 void ice_ptp_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type) in ice_ptp_rebuild() argument
2944 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_rebuild()
2948 ice_ptp_prepare_for_reset(pf, reset_type); in ice_ptp_rebuild()
2951 dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n"); in ice_ptp_rebuild()
2955 if (ice_pf_src_tmr_owned(pf) && reset_type != ICE_RESET_PFR) { in ice_ptp_rebuild()
2956 err = ice_ptp_rebuild_owner(pf); in ice_ptp_rebuild()
2966 dev_info(ice_pf_to_dev(pf), "PTP reset successful\n"); in ice_ptp_rebuild()
2971 dev_err(ice_pf_to_dev(pf), "PTP reset failed %d\n", err); in ice_ptp_rebuild()
2980 static int ice_ptp_setup_adapter(struct ice_pf *pf) in ice_ptp_setup_adapter() argument
2982 if (!ice_pf_src_tmr_owned(pf) || !ice_is_primary(&pf->hw)) in ice_ptp_setup_adapter()
2985 pf->adapter->ctrl_pf = pf; in ice_ptp_setup_adapter()
2990 static int ice_ptp_setup_pf(struct ice_pf *pf) in ice_ptp_setup_pf() argument
2992 struct ice_ptp *ctrl_ptp = ice_get_ctrl_ptp(pf); in ice_ptp_setup_pf()
2993 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_setup_pf()
2995 if (WARN_ON(!ctrl_ptp) || ice_get_phy_model(&pf->hw) == ICE_PHY_UNSUP) in ice_ptp_setup_pf()
2999 mutex_lock(&pf->adapter->ports.lock); in ice_ptp_setup_pf()
3002 &pf->adapter->ports.ports); in ice_ptp_setup_pf()
3003 mutex_unlock(&pf->adapter->ports.lock); in ice_ptp_setup_pf()
3008 static void ice_ptp_cleanup_pf(struct ice_pf *pf) in ice_ptp_cleanup_pf() argument
3010 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_cleanup_pf()
3012 if (ice_get_phy_model(&pf->hw) != ICE_PHY_UNSUP) { in ice_ptp_cleanup_pf()
3013 mutex_lock(&pf->adapter->ports.lock); in ice_ptp_cleanup_pf()
3015 mutex_unlock(&pf->adapter->ports.lock); in ice_ptp_cleanup_pf()
3021 * @pf: Board private structure
3023 * Returns: the PTP clock index associated with this PF, or -1 if no PTP clock
3026 int ice_ptp_clock_index(struct ice_pf *pf) in ice_ptp_clock_index() argument
3028 struct ice_ptp *ctrl_ptp = ice_get_ctrl_ptp(pf); in ice_ptp_clock_index()
3040 * @pf: Board private structure
3046 static int ice_ptp_init_owner(struct ice_pf *pf) in ice_ptp_init_owner() argument
3048 struct ice_hw *hw = &pf->hw; in ice_ptp_init_owner()
3054 dev_err(ice_pf_to_dev(pf), "Failed to initialize PHC, err %d\n", in ice_ptp_init_owner()
3066 err = ice_ptp_write_incval(hw, ice_base_incval(pf)); in ice_ptp_init_owner()
3072 err = ice_ptp_write_init(pf, &ts); in ice_ptp_init_owner()
3080 err = ice_ptp_cfg_phy_interrupt(pf, true, 1); in ice_ptp_init_owner()
3085 err = ice_ptp_create_clock(pf); in ice_ptp_init_owner()
3091 pf->ptp.clock = NULL; in ice_ptp_init_owner()
3102 * @pf: Board private structure
3103 * @ptp: PF PTP structure
3105 static int ice_ptp_init_work(struct ice_pf *pf, struct ice_ptp *ptp) in ice_ptp_init_work() argument
3116 dev_name(ice_pf_to_dev(pf))); in ice_ptp_init_work()
3130 * @pf: Board private structure
3133 static int ice_ptp_init_port(struct ice_pf *pf, struct ice_ptp_port *ptp_port) in ice_ptp_init_port() argument
3135 struct ice_hw *hw = &pf->hw; in ice_ptp_init_port()
3141 return ice_ptp_init_tx_eth56g(pf, &ptp_port->tx, in ice_ptp_init_port()
3144 return ice_ptp_init_tx_e810(pf, &ptp_port->tx); in ice_ptp_init_port()
3149 return ice_ptp_init_tx_e82x(pf, &ptp_port->tx, in ice_ptp_init_port()
3158 * @pf: Board private structure
3161 * types, each PF processes the interrupt and manages its own timestamps. For
3165 static void ice_ptp_init_tx_interrupt_mode(struct ice_pf *pf) in ice_ptp_init_tx_interrupt_mode() argument
3167 switch (ice_get_phy_model(&pf->hw)) { in ice_ptp_init_tx_interrupt_mode()
3172 if (ice_pf_src_tmr_owned(pf)) in ice_ptp_init_tx_interrupt_mode()
3173 pf->ptp.tx_interrupt_mode = ICE_PTP_TX_INTERRUPT_ALL; in ice_ptp_init_tx_interrupt_mode()
3175 pf->ptp.tx_interrupt_mode = ICE_PTP_TX_INTERRUPT_NONE; in ice_ptp_init_tx_interrupt_mode()
3179 pf->ptp.tx_interrupt_mode = ICE_PTP_TX_INTERRUPT_SELF; in ice_ptp_init_tx_interrupt_mode()
3185 * @pf: Board private structure
3195 void ice_ptp_init(struct ice_pf *pf) in ice_ptp_init() argument
3197 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_init()
3198 struct ice_hw *hw = &pf->hw; in ice_ptp_init()
3212 ice_ptp_init_tx_interrupt_mode(pf); in ice_ptp_init()
3217 if (ice_pf_src_tmr_owned(pf) && ice_is_primary(hw)) { in ice_ptp_init()
3218 err = ice_ptp_setup_adapter(pf); in ice_ptp_init()
3221 err = ice_ptp_init_owner(pf); in ice_ptp_init()
3226 err = ice_ptp_setup_pf(pf); in ice_ptp_init()
3230 err = ice_ptp_init_port(pf, &ptp->port); in ice_ptp_init()
3235 ice_ptp_reset_phy_timestamping(pf); in ice_ptp_init()
3238 ice_ptp_cfg_tx_interrupt(pf); in ice_ptp_init()
3242 err = ice_ptp_init_work(pf, ptp); in ice_ptp_init()
3246 dev_info(ice_pf_to_dev(pf), "PTP init successful\n"); in ice_ptp_init()
3251 if (pf->ptp.clock) { in ice_ptp_init()
3253 pf->ptp.clock = NULL; in ice_ptp_init()
3256 dev_err(ice_pf_to_dev(pf), "PTP failed %d\n", err); in ice_ptp_init()
3261 * @pf: Board private structure
3266 void ice_ptp_release(struct ice_pf *pf) in ice_ptp_release() argument
3268 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_release()
3271 pf->ptp.state = ICE_PTP_UNINIT; in ice_ptp_release()
3274 ice_ptp_disable_timestamp_mode(pf); in ice_ptp_release()
3276 ice_ptp_cleanup_pf(pf); in ice_ptp_release()
3278 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_release()
3280 ice_ptp_disable_all_extts(pf); in ice_ptp_release()
3282 kthread_cancel_delayed_work_sync(&pf->ptp.work); in ice_ptp_release()
3284 ice_ptp_port_phy_stop(&pf->ptp.port); in ice_ptp_release()
3285 mutex_destroy(&pf->ptp.port.ps_lock); in ice_ptp_release()
3286 if (pf->ptp.kworker) { in ice_ptp_release()
3287 kthread_destroy_worker(pf->ptp.kworker); in ice_ptp_release()
3288 pf->ptp.kworker = NULL; in ice_ptp_release()
3291 if (!pf->ptp.clock) in ice_ptp_release()
3295 ice_ptp_disable_all_perout(pf); in ice_ptp_release()
3297 ptp_clock_unregister(pf->ptp.clock); in ice_ptp_release()
3298 pf->ptp.clock = NULL; in ice_ptp_release()
3300 dev_info(ice_pf_to_dev(pf), "Removed PTP clock\n"); in ice_ptp_release()