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()
1792 * @pf: Board private structure
1801 static int ice_ptp_cfg_perout(struct ice_pf *pf, struct ptp_perout_request *rq, in ice_ptp_cfg_perout() argument
1806 struct ice_hw *hw = &pf->hw; in ice_ptp_cfg_perout()
1812 pin_desc_idx = ice_ptp_find_pin_idx(pf, PTP_PF_PEROUT, rq->index); in ice_ptp_cfg_perout()
1816 gpio_pin = pf->ptp.ice_pin_desc[pin_desc_idx].gpio[1]; in ice_ptp_cfg_perout()
1817 prop_delay_ns = pf->ptp.ice_pin_desc[pin_desc_idx].delay[1]; in ice_ptp_cfg_perout()
1826 if (strncmp(pf->ptp.pin_desc[pin_desc_idx].name, "1PPS", 64) == 0 && in ice_ptp_cfg_perout()
1828 dev_err(ice_pf_to_dev(pf), "1PPS pin supports only 1 s period\n"); in ice_ptp_cfg_perout()
1833 dev_err(ice_pf_to_dev(pf), "CLK Period must be an even value\n"); in ice_ptp_cfg_perout()
1848 clk = ice_ptp_read_src_clk_reg(pf, NULL); in ice_ptp_cfg_perout()
1860 * @pf: Board private structure
1866 static void ice_ptp_disable_all_perout(struct ice_pf *pf) in ice_ptp_disable_all_perout() argument
1868 for (unsigned int i = 0; i < pf->ptp.info.n_per_out; i++) in ice_ptp_disable_all_perout()
1869 if (pf->ptp.perout_rqs[i].period.sec || in ice_ptp_disable_all_perout()
1870 pf->ptp.perout_rqs[i].period.nsec) in ice_ptp_disable_all_perout()
1871 ice_ptp_cfg_perout(pf, &pf->ptp.perout_rqs[i], in ice_ptp_disable_all_perout()
1877 * @pf: Board private structure
1883 static void ice_ptp_enable_all_perout(struct ice_pf *pf) in ice_ptp_enable_all_perout() argument
1885 for (unsigned int i = 0; i < pf->ptp.info.n_per_out; i++) in ice_ptp_enable_all_perout()
1886 if (pf->ptp.perout_rqs[i].period.sec || in ice_ptp_enable_all_perout()
1887 pf->ptp.perout_rqs[i].period.nsec) in ice_ptp_enable_all_perout()
1888 ice_ptp_cfg_perout(pf, &pf->ptp.perout_rqs[i], in ice_ptp_enable_all_perout()
1894 * @pf: Board private structure
1900 static int ice_ptp_disable_shared_pin(struct ice_pf *pf, unsigned int pin, in ice_ptp_disable_shared_pin() argument
1907 gpio_pin = pf->ptp.ice_pin_desc[pin].gpio[1]; in ice_ptp_disable_shared_pin()
1910 gpio_pin = pf->ptp.ice_pin_desc[pin].gpio[0]; in ice_ptp_disable_shared_pin()
1916 for (unsigned int i = 0; i < pf->ptp.info.n_pins; i++) { in ice_ptp_disable_shared_pin()
1917 struct ptp_pin_desc *pin_desc = &pf->ptp.pin_desc[i]; in ice_ptp_disable_shared_pin()
1925 pf->ptp.ice_pin_desc[i].gpio[1] == gpio_pin) { in ice_ptp_disable_shared_pin()
1926 pf->ptp.perout_rqs[chan].period.sec = 0; in ice_ptp_disable_shared_pin()
1927 pf->ptp.perout_rqs[chan].period.nsec = 0; in ice_ptp_disable_shared_pin()
1930 dev_dbg(ice_pf_to_dev(pf), "Disabling pin %u with shared output GPIO pin %u\n", in ice_ptp_disable_shared_pin()
1932 return ice_ptp_cfg_perout(pf, &pf->ptp.perout_rqs[chan], in ice_ptp_disable_shared_pin()
1934 } else if (pf->ptp.pin_desc->func == PTP_PF_EXTTS && in ice_ptp_disable_shared_pin()
1935 pf->ptp.ice_pin_desc[i].gpio[0] == gpio_pin) { in ice_ptp_disable_shared_pin()
1936 pf->ptp.extts_rqs[chan].flags &= ~PTP_ENABLE_FEATURE; in ice_ptp_disable_shared_pin()
1939 dev_dbg(ice_pf_to_dev(pf), "Disabling pin %u with shared input GPIO pin %u\n", in ice_ptp_disable_shared_pin()
1941 return ice_ptp_cfg_extts(pf, &pf->ptp.extts_rqs[chan], in ice_ptp_disable_shared_pin()
1961 struct ice_pf *pf = ptp_info_to_pf(info); in ice_verify_pin() local
1964 pin_desc = &pf->ptp.ice_pin_desc[pin]; in ice_verify_pin()
1984 if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) { in ice_verify_pin()
1985 ice_ptp_disable_shared_pin(pf, pin, func); in ice_verify_pin()
1986 pf->ptp.pin_desc[pin].func = func; in ice_verify_pin()
1987 pf->ptp.pin_desc[pin].chan = chan; in ice_verify_pin()
1988 return ice_ptp_set_sma_cfg(pf); in ice_verify_pin()
2005 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_gpio_enable() local
2012 &pf->ptp.perout_rqs[rq->perout.index]; in ice_ptp_gpio_enable()
2014 err = ice_ptp_cfg_perout(pf, &rq->perout, on); in ice_ptp_gpio_enable()
2026 &pf->ptp.extts_rqs[rq->extts.index]; in ice_ptp_gpio_enable()
2028 err = ice_ptp_cfg_extts(pf, &rq->extts, on); in ice_ptp_gpio_enable()
2054 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_gettimex64() local
2057 time_ns = ice_ptp_read_src_clk_reg(pf, sts); in ice_ptp_gettimex64()
2073 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_settime64() local
2075 struct ice_hw *hw = &pf->hw; in ice_ptp_settime64()
2084 dev_warn(ice_pf_to_dev(pf), "Failed to mark timestamps as invalid before settime\n"); in ice_ptp_settime64()
2093 ice_ptp_disable_all_perout(pf); in ice_ptp_settime64()
2095 err = ice_ptp_write_init(pf, &ts64); in ice_ptp_settime64()
2099 ice_ptp_reset_cached_phctime(pf); in ice_ptp_settime64()
2102 ice_ptp_enable_all_perout(pf); in ice_ptp_settime64()
2106 ice_ptp_restart_all_phy(pf); in ice_ptp_settime64()
2109 dev_err(ice_pf_to_dev(pf), "PTP failed to set time %d\n", err); in ice_ptp_settime64()
2142 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_adjtime() local
2143 struct ice_hw *hw = &pf->hw; in ice_ptp_adjtime()
2147 dev = ice_pf_to_dev(pf); in ice_ptp_adjtime()
2164 ice_ptp_disable_all_perout(pf); in ice_ptp_adjtime()
2166 err = ice_ptp_write_adj(pf, delta); in ice_ptp_adjtime()
2169 ice_ptp_enable_all_perout(pf); in ice_ptp_adjtime()
2178 ice_ptp_reset_cached_phctime(pf); in ice_ptp_adjtime()
2198 struct ice_pf *pf = (struct ice_pf *)ctx; in ice_ptp_get_syncdevicetime() local
2199 struct ice_hw *hw = &pf->hw; in ice_ptp_get_syncdevicetime()
2216 dev_err(ice_pf_to_dev(pf), "PTP failed to get hh lock\n"); in ice_ptp_get_syncdevicetime()
2287 struct ice_pf *pf = ptp_info_to_pf(info); in ice_ptp_getcrosststamp_e82x() local
2290 pf, NULL, cts); in ice_ptp_getcrosststamp_e82x()
2296 * @pf: Board private structure
2301 int ice_ptp_get_ts_config(struct ice_pf *pf, struct ifreq *ifr) in ice_ptp_get_ts_config() argument
2305 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_get_ts_config()
2308 config = &pf->ptp.tstamp_config; in ice_ptp_get_ts_config()
2316 * @pf: Board private structure
2320 ice_ptp_set_timestamp_mode(struct ice_pf *pf, struct hwtstamp_config *config) in ice_ptp_set_timestamp_mode() argument
2324 pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_OFF; in ice_ptp_set_timestamp_mode()
2327 pf->ptp.tstamp_config.tx_type = HWTSTAMP_TX_ON; in ice_ptp_set_timestamp_mode()
2335 pf->ptp.tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in ice_ptp_set_timestamp_mode()
2351 pf->ptp.tstamp_config.rx_filter = HWTSTAMP_FILTER_ALL; in ice_ptp_set_timestamp_mode()
2358 ice_ptp_restore_timestamp_mode(pf); in ice_ptp_set_timestamp_mode()
2365 * @pf: Board private structure
2370 int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr) in ice_ptp_set_ts_config() argument
2375 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_set_ts_config()
2381 err = ice_ptp_set_timestamp_mode(pf, &config); in ice_ptp_set_ts_config()
2386 config = pf->ptp.tstamp_config; in ice_ptp_set_ts_config()
2415 * PHC value, rather than accessing the PF. This also allows us to in ice_ptp_get_rx_hwts()
2428 * @pf: Board private structure
2430 static void ice_ptp_setup_pin_cfg(struct ice_pf *pf) in ice_ptp_setup_pin_cfg() argument
2432 for (unsigned int i = 0; i < pf->ptp.info.n_pins; i++) { in ice_ptp_setup_pin_cfg()
2433 const struct ice_ptp_pin_desc *desc = &pf->ptp.ice_pin_desc[i]; in ice_ptp_setup_pin_cfg()
2434 struct ptp_pin_desc *pin = &pf->ptp.pin_desc[i]; in ice_ptp_setup_pin_cfg()
2437 if (!ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) in ice_ptp_setup_pin_cfg()
2447 pf->ptp.info.pin_config = pf->ptp.pin_desc; in ice_ptp_setup_pin_cfg()
2452 * @pf: pointer to the PF structure
2457 static void ice_ptp_disable_pins(struct ice_pf *pf) in ice_ptp_disable_pins() argument
2459 struct ptp_clock_info *info = &pf->ptp.info; in ice_ptp_disable_pins()
2461 dev_warn(ice_pf_to_dev(pf), "Failed to configure PTP pin control\n"); in ice_ptp_disable_pins()
2472 * @pf: pointer to the PF structure
2479 static int ice_ptp_parse_sdp_entries(struct ice_pf *pf, __le16 *entries, in ice_ptp_parse_sdp_entries() argument
2521 strscpy(pf->ptp.pin_desc[idx].name, in ice_ptp_parse_sdp_entries()
2523 sizeof(pf->ptp.pin_desc[idx] in ice_ptp_parse_sdp_entries()
2533 dev_dbg(ice_pf_to_dev(pf), in ice_ptp_parse_sdp_entries()
2538 pf->ptp.info.n_pins = n_pins; in ice_ptp_parse_sdp_entries()
2544 * @pf: Board private structure
2551 static void ice_ptp_set_funcs_e82x(struct ice_pf *pf) in ice_ptp_set_funcs_e82x() argument
2556 pf->ptp.info.getcrosststamp = ice_ptp_getcrosststamp_e82x; in ice_ptp_set_funcs_e82x()
2559 if (ice_is_e825c(&pf->hw)) { in ice_ptp_set_funcs_e82x()
2560 pf->ptp.ice_pin_desc = ice_pin_desc_e825c; in ice_ptp_set_funcs_e82x()
2561 pf->ptp.info.n_pins = ICE_PIN_DESC_ARR_LEN(ice_pin_desc_e825c); in ice_ptp_set_funcs_e82x()
2563 pf->ptp.ice_pin_desc = ice_pin_desc_e82x; in ice_ptp_set_funcs_e82x()
2564 pf->ptp.info.n_pins = ICE_PIN_DESC_ARR_LEN(ice_pin_desc_e82x); in ice_ptp_set_funcs_e82x()
2566 ice_ptp_setup_pin_cfg(pf); in ice_ptp_set_funcs_e82x()
2571 * @pf: Board private structure
2578 static void ice_ptp_set_funcs_e810(struct ice_pf *pf) in ice_ptp_set_funcs_e810() argument
2582 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_set_funcs_e810()
2586 err = ice_ptp_read_sdp_ac(&pf->hw, entries, &num_entries); in ice_ptp_set_funcs_e810()
2589 if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) { in ice_ptp_set_funcs_e810()
2594 pf->ptp.ice_pin_desc = ice_pin_desc_e810; in ice_ptp_set_funcs_e810()
2595 pf->ptp.info.n_pins = in ice_ptp_set_funcs_e810()
2600 desc = devm_kcalloc(ice_pf_to_dev(pf), ICE_N_PINS_MAX, in ice_ptp_set_funcs_e810()
2606 err = ice_ptp_parse_sdp_entries(pf, entries, num_entries, desc); in ice_ptp_set_funcs_e810()
2614 ice_ptp_setup_pin_cfg(pf); in ice_ptp_set_funcs_e810()
2616 if (ice_is_feature_supported(pf, ICE_F_SMA_CTRL)) in ice_ptp_set_funcs_e810()
2617 err = ice_ptp_set_sma_cfg(pf); in ice_ptp_set_funcs_e810()
2620 devm_kfree(ice_pf_to_dev(pf), desc); in ice_ptp_set_funcs_e810()
2621 ice_ptp_disable_pins(pf); in ice_ptp_set_funcs_e810()
2627 * @pf: Board private structure
2629 static void ice_ptp_set_caps(struct ice_pf *pf) in ice_ptp_set_caps() argument
2631 struct ptp_clock_info *info = &pf->ptp.info; in ice_ptp_set_caps()
2632 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_set_caps()
2647 if (ice_is_e810(&pf->hw)) in ice_ptp_set_caps()
2648 ice_ptp_set_funcs_e810(pf); in ice_ptp_set_caps()
2650 ice_ptp_set_funcs_e82x(pf); in ice_ptp_set_caps()
2655 * @pf: Board private structure
2662 static long ice_ptp_create_clock(struct ice_pf *pf) in ice_ptp_create_clock() argument
2668 if (pf->ptp.clock) in ice_ptp_create_clock()
2671 ice_ptp_set_caps(pf); in ice_ptp_create_clock()
2673 info = &pf->ptp.info; in ice_ptp_create_clock()
2674 dev = ice_pf_to_dev(pf); in ice_ptp_create_clock()
2677 pf->ptp.clock = ptp_clock_register(info, dev); in ice_ptp_create_clock()
2678 if (IS_ERR(pf->ptp.clock)) { in ice_ptp_create_clock()
2679 dev_err(ice_pf_to_dev(pf), "Failed to register PTP clock device"); in ice_ptp_create_clock()
2680 return PTR_ERR(pf->ptp.clock); in ice_ptp_create_clock()
2736 * @pf: Board private structure
2741 enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf) in ice_ptp_process_ts() argument
2743 switch (pf->ptp.tx_interrupt_mode) { in ice_ptp_process_ts()
2749 return ice_ptp_tx_tstamp(&pf->ptp.port.tx); in ice_ptp_process_ts()
2752 return ice_ptp_tx_tstamp_owner(pf); in ice_ptp_process_ts()
2755 pf->ptp.tx_interrupt_mode); in ice_ptp_process_ts()
2762 * @pf: Board private structure
2773 static void ice_ptp_maybe_trigger_tx_interrupt(struct ice_pf *pf) in ice_ptp_maybe_trigger_tx_interrupt() argument
2775 struct device *dev = ice_pf_to_dev(pf); in ice_ptp_maybe_trigger_tx_interrupt()
2776 struct ice_hw *hw = &pf->hw; in ice_ptp_maybe_trigger_tx_interrupt()
2783 if (!ice_pf_src_tmr_owned(pf)) in ice_ptp_maybe_trigger_tx_interrupt()
2790 err = ice_get_phy_tx_tstamp_ready(&pf->hw, i, &tstamp_ready); in ice_ptp_maybe_trigger_tx_interrupt()
2811 struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp); in ice_ptp_periodic_work() local
2814 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_periodic_work()
2817 err = ice_ptp_update_cached_phctime(pf); in ice_ptp_periodic_work()
2819 ice_ptp_maybe_trigger_tx_interrupt(pf); in ice_ptp_periodic_work()
2828 * @pf: Board private structure
2831 void ice_ptp_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type) in ice_ptp_prepare_for_reset() argument
2833 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_prepare_for_reset()
2842 ice_ptp_disable_timestamp_mode(pf); in ice_ptp_prepare_for_reset()
2849 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_prepare_for_reset()
2852 ice_ptp_disable_all_perout(pf); in ice_ptp_prepare_for_reset()
2854 src_tmr = ice_get_ptp_src_clock_index(&pf->hw); in ice_ptp_prepare_for_reset()
2857 wr32(&pf->hw, GLTSYN_ENA(src_tmr), (u32)~GLTSYN_ENA_TSYN_ENA_M); in ice_ptp_prepare_for_reset()
2865 * @pf: Board private structure
2870 static int ice_ptp_rebuild_owner(struct ice_pf *pf) in ice_ptp_rebuild_owner() argument
2872 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_rebuild_owner()
2873 struct ice_hw *hw = &pf->hw; in ice_ptp_rebuild_owner()
2889 err = ice_ptp_write_incval(hw, ice_base_incval(pf)); in ice_ptp_rebuild_owner()
2903 err = ice_ptp_write_init(pf, &ts); in ice_ptp_rebuild_owner()
2913 ice_ptp_flush_all_tx_tracker(pf); in ice_ptp_rebuild_owner()
2917 err = ice_ptp_cfg_phy_interrupt(pf, true, 1); in ice_ptp_rebuild_owner()
2921 ice_ptp_restart_all_phy(pf); in ice_ptp_rebuild_owner()
2925 ice_ptp_enable_all_perout(pf); in ice_ptp_rebuild_owner()
2926 ice_ptp_enable_all_extts(pf); in ice_ptp_rebuild_owner()
2937 * @pf: Board private structure
2940 void ice_ptp_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type) in ice_ptp_rebuild() argument
2942 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_rebuild()
2946 ice_ptp_prepare_for_reset(pf, reset_type); in ice_ptp_rebuild()
2949 dev_err(ice_pf_to_dev(pf), "PTP was not initialized\n"); in ice_ptp_rebuild()
2953 if (ice_pf_src_tmr_owned(pf) && reset_type != ICE_RESET_PFR) { in ice_ptp_rebuild()
2954 err = ice_ptp_rebuild_owner(pf); in ice_ptp_rebuild()
2964 dev_info(ice_pf_to_dev(pf), "PTP reset successful\n"); in ice_ptp_rebuild()
2969 dev_err(ice_pf_to_dev(pf), "PTP reset failed %d\n", err); in ice_ptp_rebuild()
2978 static int ice_ptp_setup_adapter(struct ice_pf *pf) in ice_ptp_setup_adapter() argument
2980 if (!ice_pf_src_tmr_owned(pf) || !ice_is_primary(&pf->hw)) in ice_ptp_setup_adapter()
2983 pf->adapter->ctrl_pf = pf; in ice_ptp_setup_adapter()
2988 static int ice_ptp_setup_pf(struct ice_pf *pf) in ice_ptp_setup_pf() argument
2990 struct ice_ptp *ctrl_ptp = ice_get_ctrl_ptp(pf); in ice_ptp_setup_pf()
2991 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_setup_pf()
2993 if (WARN_ON(!ctrl_ptp) || ice_get_phy_model(&pf->hw) == ICE_PHY_UNSUP) in ice_ptp_setup_pf()
2997 mutex_lock(&pf->adapter->ports.lock); in ice_ptp_setup_pf()
3000 &pf->adapter->ports.ports); in ice_ptp_setup_pf()
3001 mutex_unlock(&pf->adapter->ports.lock); in ice_ptp_setup_pf()
3006 static void ice_ptp_cleanup_pf(struct ice_pf *pf) in ice_ptp_cleanup_pf() argument
3008 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_cleanup_pf()
3010 if (ice_get_phy_model(&pf->hw) != ICE_PHY_UNSUP) { in ice_ptp_cleanup_pf()
3011 mutex_lock(&pf->adapter->ports.lock); in ice_ptp_cleanup_pf()
3013 mutex_unlock(&pf->adapter->ports.lock); in ice_ptp_cleanup_pf()
3019 * @pf: Board private structure
3021 * Returns: the PTP clock index associated with this PF, or -1 if no PTP clock
3024 int ice_ptp_clock_index(struct ice_pf *pf) in ice_ptp_clock_index() argument
3026 struct ice_ptp *ctrl_ptp = ice_get_ctrl_ptp(pf); in ice_ptp_clock_index()
3038 * @pf: Board private structure
3044 static int ice_ptp_init_owner(struct ice_pf *pf) in ice_ptp_init_owner() argument
3046 struct ice_hw *hw = &pf->hw; in ice_ptp_init_owner()
3052 dev_err(ice_pf_to_dev(pf), "Failed to initialize PHC, err %d\n", in ice_ptp_init_owner()
3064 err = ice_ptp_write_incval(hw, ice_base_incval(pf)); in ice_ptp_init_owner()
3070 err = ice_ptp_write_init(pf, &ts); in ice_ptp_init_owner()
3078 err = ice_ptp_cfg_phy_interrupt(pf, true, 1); in ice_ptp_init_owner()
3083 err = ice_ptp_create_clock(pf); in ice_ptp_init_owner()
3089 pf->ptp.clock = NULL; in ice_ptp_init_owner()
3100 * @pf: Board private structure
3101 * @ptp: PF PTP structure
3103 static int ice_ptp_init_work(struct ice_pf *pf, struct ice_ptp *ptp) in ice_ptp_init_work() argument
3114 dev_name(ice_pf_to_dev(pf))); in ice_ptp_init_work()
3128 * @pf: Board private structure
3131 static int ice_ptp_init_port(struct ice_pf *pf, struct ice_ptp_port *ptp_port) in ice_ptp_init_port() argument
3133 struct ice_hw *hw = &pf->hw; in ice_ptp_init_port()
3139 return ice_ptp_init_tx_eth56g(pf, &ptp_port->tx, in ice_ptp_init_port()
3142 return ice_ptp_init_tx_e810(pf, &ptp_port->tx); in ice_ptp_init_port()
3147 return ice_ptp_init_tx_e82x(pf, &ptp_port->tx, in ice_ptp_init_port()
3156 * @pf: Board private structure
3159 * types, each PF processes the interrupt and manages its own timestamps. For
3163 static void ice_ptp_init_tx_interrupt_mode(struct ice_pf *pf) in ice_ptp_init_tx_interrupt_mode() argument
3165 switch (ice_get_phy_model(&pf->hw)) { in ice_ptp_init_tx_interrupt_mode()
3170 if (ice_pf_src_tmr_owned(pf)) in ice_ptp_init_tx_interrupt_mode()
3171 pf->ptp.tx_interrupt_mode = ICE_PTP_TX_INTERRUPT_ALL; in ice_ptp_init_tx_interrupt_mode()
3173 pf->ptp.tx_interrupt_mode = ICE_PTP_TX_INTERRUPT_NONE; in ice_ptp_init_tx_interrupt_mode()
3177 pf->ptp.tx_interrupt_mode = ICE_PTP_TX_INTERRUPT_SELF; in ice_ptp_init_tx_interrupt_mode()
3183 * @pf: Board private structure
3193 void ice_ptp_init(struct ice_pf *pf) in ice_ptp_init() argument
3195 struct ice_ptp *ptp = &pf->ptp; in ice_ptp_init()
3196 struct ice_hw *hw = &pf->hw; in ice_ptp_init()
3210 ice_ptp_init_tx_interrupt_mode(pf); in ice_ptp_init()
3215 if (ice_pf_src_tmr_owned(pf) && ice_is_primary(hw)) { in ice_ptp_init()
3216 err = ice_ptp_setup_adapter(pf); in ice_ptp_init()
3219 err = ice_ptp_init_owner(pf); in ice_ptp_init()
3224 err = ice_ptp_setup_pf(pf); in ice_ptp_init()
3228 err = ice_ptp_init_port(pf, &ptp->port); in ice_ptp_init()
3233 ice_ptp_reset_phy_timestamping(pf); in ice_ptp_init()
3236 ice_ptp_cfg_tx_interrupt(pf); in ice_ptp_init()
3240 err = ice_ptp_init_work(pf, ptp); in ice_ptp_init()
3244 dev_info(ice_pf_to_dev(pf), "PTP init successful\n"); in ice_ptp_init()
3249 if (pf->ptp.clock) { in ice_ptp_init()
3251 pf->ptp.clock = NULL; in ice_ptp_init()
3254 dev_err(ice_pf_to_dev(pf), "PTP failed %d\n", err); in ice_ptp_init()
3259 * @pf: Board private structure
3264 void ice_ptp_release(struct ice_pf *pf) in ice_ptp_release() argument
3266 if (pf->ptp.state != ICE_PTP_READY) in ice_ptp_release()
3269 pf->ptp.state = ICE_PTP_UNINIT; in ice_ptp_release()
3272 ice_ptp_disable_timestamp_mode(pf); in ice_ptp_release()
3274 ice_ptp_cleanup_pf(pf); in ice_ptp_release()
3276 ice_ptp_release_tx_tracker(pf, &pf->ptp.port.tx); in ice_ptp_release()
3278 ice_ptp_disable_all_extts(pf); in ice_ptp_release()
3280 kthread_cancel_delayed_work_sync(&pf->ptp.work); in ice_ptp_release()
3282 ice_ptp_port_phy_stop(&pf->ptp.port); in ice_ptp_release()
3283 mutex_destroy(&pf->ptp.port.ps_lock); in ice_ptp_release()
3284 if (pf->ptp.kworker) { in ice_ptp_release()
3285 kthread_destroy_worker(pf->ptp.kworker); in ice_ptp_release()
3286 pf->ptp.kworker = NULL; in ice_ptp_release()
3289 if (!pf->ptp.clock) in ice_ptp_release()
3293 ice_ptp_disable_all_perout(pf); in ice_ptp_release()
3295 ptp_clock_unregister(pf->ptp.clock); in ice_ptp_release()
3296 pf->ptp.clock = NULL; in ice_ptp_release()
3298 dev_info(ice_pf_to_dev(pf), "Removed PTP clock\n"); in ice_ptp_release()