Commit 9031d5f4 authored by Larysa Zaremba's avatar Larysa Zaremba Committed by Alexei Starovoitov
Browse files

ice: Support HW timestamp hint



Use previously refactored code and create a function
that allows XDP code to read HW timestamp.

Also, introduce packet context, where hints-related data will be stored.
ice_xdp_buff contains only a pointer to this structure, to avoid copying it
in ZC mode later in the series.

HW timestamp is the first supported hint in the driver,
so also add xdp_metadata_ops.

Reviewed-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: default avatarLarysa Zaremba <larysa.zaremba@intel.com>
Link: https://lore.kernel.org/r/20231205210847.28460-6-larysa.zaremba@intel.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent d951c14a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -996,4 +996,6 @@ static inline void ice_clear_rdma_cap(struct ice_pf *pf)
	set_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags);
	clear_bit(ICE_FLAG_RDMA_ENA, pf->flags);
}

extern const struct xdp_metadata_ops ice_xdp_md_ops;
#endif /* _ICE_H_ */
+1 −0
Original line number Diff line number Diff line
@@ -575,6 +575,7 @@ int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)

	xdp_init_buff(&ring->xdp, ice_rx_pg_size(ring) / 2, &ring->xdp_rxq);
	ring->xdp.data = NULL;
	ring->xdp_ext.pkt_ctx = &ring->pkt_ctx;
	err = ice_setup_rx_ctx(ring);
	if (err) {
		dev_err(dev, "ice_setup_rx_ctx failed for RxQ %d, err %d\n",
+1 −0
Original line number Diff line number Diff line
@@ -3397,6 +3397,7 @@ static void ice_set_ops(struct ice_vsi *vsi)

	netdev->netdev_ops = &ice_netdev_ops;
	netdev->udp_tunnel_nic_info = &pf->hw.udp_tunnel_nic;
	netdev->xdp_metadata_ops = &ice_xdp_md_ops;
	ice_set_ethtool_ops(netdev);

	if (vsi->type != ICE_VSI_PF)
+3 −3
Original line number Diff line number Diff line
@@ -2129,12 +2129,12 @@ int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr)
/**
 * ice_ptp_get_rx_hwts - Get packet Rx timestamp in ns
 * @rx_desc: Receive descriptor
 * @rx_ring: Ring to get the cached time
 * @pkt_ctx: Packet context to get the cached time
 *
 * The driver receives a notification in the receive descriptor with timestamp.
 */
u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
			struct ice_rx_ring *rx_ring)
			const struct ice_pkt_ctx *pkt_ctx)
{
	u64 ts_ns, cached_time;
	u32 ts_high;
@@ -2142,7 +2142,7 @@ u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
	if (!(rx_desc->wb.time_stamp_low & ICE_PTP_TS_VALID))
		return 0;

	cached_time = READ_ONCE(rx_ring->cached_phctime);
	cached_time = READ_ONCE(pkt_ctx->cached_phctime);

	/* Do not report a timestamp if we don't have a cached PHC time */
	if (!cached_time)
+2 −2
Original line number Diff line number Diff line
@@ -299,7 +299,7 @@ s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb);
enum ice_tx_tstamp_work ice_ptp_process_ts(struct ice_pf *pf);

u64 ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
			struct ice_rx_ring *rx_ring);
			const struct ice_pkt_ctx *pkt_ctx);
void ice_ptp_reset(struct ice_pf *pf);
void ice_ptp_prepare_for_reset(struct ice_pf *pf);
void ice_ptp_init(struct ice_pf *pf);
@@ -331,7 +331,7 @@ static inline bool ice_ptp_process_ts(struct ice_pf *pf)

static inline u64
ice_ptp_get_rx_hwts(const union ice_32b_rx_flex_desc *rx_desc,
		    struct ice_rx_ring *rx_ring)
		    const struct ice_pkt_ctx *pkt_ctx)
{
	return 0;
}
Loading