From: YiFei Zhu <[email protected]>

The logic is similar to idpf_rx_hwtstamp, but the data is exported
as a BPF kfunc instead of appended to an skb.

A idpf_queue_has(PTP, rxq) condition is added to check the queue
supports PTP similar to idpf_rx_process_skb_fields.

Cc: [email protected]

Signed-off-by: YiFei Zhu <[email protected]>
Signed-off-by: Mina Almasry <[email protected]>
---
 drivers/net/ethernet/intel/idpf/xdp.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/drivers/net/ethernet/intel/idpf/xdp.c 
b/drivers/net/ethernet/intel/idpf/xdp.c
index 21ce25b0567f..850389ca66b6 100644
--- a/drivers/net/ethernet/intel/idpf/xdp.c
+++ b/drivers/net/ethernet/intel/idpf/xdp.c
@@ -2,6 +2,7 @@
 /* Copyright (C) 2025 Intel Corporation */
 
 #include "idpf.h"
+#include "idpf_ptp.h"
 #include "idpf_virtchnl.h"
 #include "xdp.h"
 #include "xsk.h"
@@ -369,6 +370,31 @@ int idpf_xdp_xmit(struct net_device *dev, int n, struct 
xdp_frame **frames,
                                       idpf_xdp_tx_finalize);
 }
 
+static int idpf_xdpmo_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
+{
+       const struct virtchnl2_rx_flex_desc_adv_nic_3 *rx_desc;
+       const struct libeth_xdp_buff *xdp = (typeof(xdp))ctx;
+       const struct idpf_rx_queue *rxq;
+       u64 cached_time, ts_ns;
+       u32 ts_high;
+
+       rx_desc = xdp->desc;
+       rxq = libeth_xdp_buff_to_rq(xdp, typeof(*rxq), xdp_rxq);
+
+       if (!idpf_queue_has(PTP, rxq))
+               return -ENODATA;
+       if (!(rx_desc->ts_low & VIRTCHNL2_RX_FLEX_TSTAMP_VALID))
+               return -ENODATA;
+
+       cached_time = READ_ONCE(rxq->cached_phc_time);
+
+       ts_high = le32_to_cpu(rx_desc->ts_high);
+       ts_ns = idpf_ptp_tstamp_extend_32b_to_64b(cached_time, ts_high);
+
+       *timestamp = ts_ns;
+       return 0;
+}
+
 static int idpf_xdpmo_rx_hash(const struct xdp_md *ctx, u32 *hash,
                              enum xdp_rss_hash_type *rss_type)
 {
@@ -392,6 +418,7 @@ static int idpf_xdpmo_rx_hash(const struct xdp_md *ctx, u32 
*hash,
 }
 
 static const struct xdp_metadata_ops idpf_xdpmo = {
+       .xmo_rx_timestamp       = idpf_xdpmo_rx_timestamp,
        .xmo_rx_hash            = idpf_xdpmo_rx_hash,
 };
 

base-commit: e05021a829b834fecbd42b173e55382416571b2c
-- 
2.52.0.rc2.455.g230fcf2819-goog

Reply via email to