net/cnxk: add SoC specific PTP timestamp read

Timestamp resolution for an incoming and outgoing packets
is different for CN10k and CN9K. Added SoC specific
callback to retrieve timestamp in correct format
when read by application.

Signed-off-by: Rakesh Kudurumalla <rkudurumalla@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
This commit is contained in:
Rakesh Kudurumalla 2022-02-24 13:32:16 +05:30 committed by Jerin Jacob
parent 8fbad405c2
commit 68c48ab318
7 changed files with 108 additions and 34 deletions

View File

@ -179,7 +179,7 @@ cn10k_process_vwqe(uintptr_t vwqe, uint16_t port_id, const uint32_t flags,
/* Extracting tstamp, if PTP enabled*/
tstamp_ptr = *(uint64_t *)(((struct nix_wqe_hdr_s *)cqe) +
CNXK_SSO_WQE_SG_PTR);
cnxk_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf, tstamp,
cn10k_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf, tstamp,
flags & NIX_RX_OFFLOAD_TSTAMP_F,
(uint64_t *)tstamp_ptr);
wqe[0] = (uint64_t *)mbuf;
@ -269,7 +269,7 @@ cn10k_sso_hws_get_work(struct cn10k_sso_hws *ws, struct rte_event *ev,
tstamp_ptr = *(uint64_t *)(((struct nix_wqe_hdr_s *)
gw.u64[1]) +
CNXK_SSO_WQE_SG_PTR);
cnxk_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf,
cn10k_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf,
ws->tstamp,
flags & NIX_RX_OFFLOAD_TSTAMP_F,
(uint64_t *)tstamp_ptr);

View File

@ -228,7 +228,7 @@ cn9k_sso_hws_dual_get_work(uint64_t base, uint64_t pair_base,
tstamp_ptr = *(uint64_t *)(((struct nix_wqe_hdr_s *)
gw.u64[1]) +
CNXK_SSO_WQE_SG_PTR);
cnxk_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf,
cn9k_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf,
dws->tstamp,
flags & NIX_RX_OFFLOAD_TSTAMP_F,
(uint64_t *)tstamp_ptr);
@ -304,7 +304,7 @@ cn9k_sso_hws_get_work(struct cn9k_sso_hws *ws, struct rte_event *ev,
tstamp_ptr = *(uint64_t *)(((struct nix_wqe_hdr_s *)
gw.u64[1]) +
CNXK_SSO_WQE_SG_PTR);
cnxk_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf,
cn9k_nix_mbuf_to_tstamp((struct rte_mbuf *)mbuf,
ws->tstamp,
flags & NIX_RX_OFFLOAD_TSTAMP_F,
(uint64_t *)tstamp_ptr);

View File

@ -428,6 +428,27 @@ cn10k_nix_timesync_disable(struct rte_eth_dev *eth_dev)
return 0;
}
static int
cn10k_nix_timesync_read_tx_timestamp(struct rte_eth_dev *eth_dev,
struct timespec *timestamp)
{
struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
struct cnxk_timesync_info *tstamp = &dev->tstamp;
uint64_t ns;
if (*tstamp->tx_tstamp == 0)
return -EINVAL;
*tstamp->tx_tstamp = ((*tstamp->tx_tstamp >> 32) * NSEC_PER_SEC) +
(*tstamp->tx_tstamp & 0xFFFFFFFFUL);
ns = rte_timecounter_update(&dev->tx_tstamp_tc, *tstamp->tx_tstamp);
*timestamp = rte_ns_to_timespec(ns);
*tstamp->tx_tstamp = 0;
rte_wmb();
return 0;
}
static int
cn10k_nix_dev_start(struct rte_eth_dev *eth_dev)
{
@ -499,6 +520,8 @@ nix_eth_dev_ops_override(void)
cnxk_eth_dev_ops.timesync_disable = cn10k_nix_timesync_disable;
cnxk_eth_dev_ops.rx_metadata_negotiate =
cn10k_nix_rx_metadata_negotiate;
cnxk_eth_dev_ops.timesync_read_tx_timestamp =
cn10k_nix_timesync_read_tx_timestamp;
}
static void

View File

@ -432,6 +432,36 @@ nix_rx_nb_pkts(struct cn10k_eth_rxq *rxq, const uint64_t wdata,
return RTE_MIN(pkts, available);
}
static __rte_always_inline void
cn10k_nix_mbuf_to_tstamp(struct rte_mbuf *mbuf,
struct cnxk_timesync_info *tstamp,
const uint8_t ts_enable, uint64_t *tstamp_ptr)
{
if (ts_enable) {
mbuf->pkt_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
mbuf->data_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
/* Reading the rx timestamp inserted by CGX, viz at
* starting of the packet data.
*/
*tstamp_ptr = ((*tstamp_ptr >> 32) * NSEC_PER_SEC) +
(*tstamp_ptr & 0xFFFFFFFFUL);
*cnxk_nix_timestamp_dynfield(mbuf, tstamp) =
rte_be_to_cpu_64(*tstamp_ptr);
/* RTE_MBUF_F_RX_IEEE1588_TMST flag needs to be set only in case
* PTP packets are received.
*/
if (mbuf->packet_type == RTE_PTYPE_L2_ETHER_TIMESYNC) {
tstamp->rx_tstamp =
*cnxk_nix_timestamp_dynfield(mbuf, tstamp);
tstamp->rx_ready = 1;
mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP |
RTE_MBUF_F_RX_IEEE1588_TMST |
tstamp->rx_tstamp_dynflag;
}
}
}
static __rte_always_inline uint16_t
cn10k_nix_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts,
const uint16_t flags)
@ -486,7 +516,7 @@ cn10k_nix_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts,
cn10k_nix_cqe_to_mbuf(cq, cq->tag, mbuf, lookup_mem, mbuf_init,
flags);
cnxk_nix_mbuf_to_tstamp(mbuf, rxq->tstamp,
cn10k_nix_mbuf_to_tstamp(mbuf, rxq->tstamp,
(flags & NIX_RX_OFFLOAD_TSTAMP_F),
(uint64_t *)((uint8_t *)mbuf
+ data_off));

View File

@ -450,6 +450,25 @@ cn9k_nix_dev_start(struct rte_eth_dev *eth_dev)
return 0;
}
static int
cn9k_nix_timesync_read_tx_timestamp(struct rte_eth_dev *eth_dev,
struct timespec *timestamp)
{
struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
struct cnxk_timesync_info *tstamp = &dev->tstamp;
uint64_t ns;
if (*tstamp->tx_tstamp == 0)
return -EINVAL;
ns = rte_timecounter_update(&dev->tx_tstamp_tc, *tstamp->tx_tstamp);
*timestamp = rte_ns_to_timespec(ns);
*tstamp->tx_tstamp = 0;
rte_wmb();
return 0;
}
static int
cn9k_nix_rx_metadata_negotiate(struct rte_eth_dev *eth_dev, uint64_t *features)
{
@ -492,6 +511,8 @@ nix_eth_dev_ops_override(void)
cnxk_eth_dev_ops.timesync_disable = cn9k_nix_timesync_disable;
cnxk_eth_dev_ops.mtr_ops_get = NULL;
cnxk_eth_dev_ops.rx_metadata_negotiate = cn9k_nix_rx_metadata_negotiate;
cnxk_eth_dev_ops.timesync_read_tx_timestamp =
cn9k_nix_timesync_read_tx_timestamp;
}
static void

View File

@ -435,6 +435,34 @@ nix_rx_nb_pkts(struct cn9k_eth_rxq *rxq, const uint64_t wdata,
return RTE_MIN(pkts, available);
}
static __rte_always_inline void
cn9k_nix_mbuf_to_tstamp(struct rte_mbuf *mbuf,
struct cnxk_timesync_info *tstamp,
const uint8_t ts_enable, uint64_t *tstamp_ptr)
{
if (ts_enable) {
mbuf->pkt_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
mbuf->data_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
/* Reading the rx timestamp inserted by CGX, viz at
* starting of the packet data.
*/
*cnxk_nix_timestamp_dynfield(mbuf, tstamp) =
rte_be_to_cpu_64(*tstamp_ptr);
/* RTE_MBUF_F_RX_IEEE1588_TMST flag needs to be set only in case
* PTP packets are received.
*/
if (mbuf->packet_type == RTE_PTYPE_L2_ETHER_TIMESYNC) {
tstamp->rx_tstamp =
*cnxk_nix_timestamp_dynfield(mbuf, tstamp);
tstamp->rx_ready = 1;
mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP |
RTE_MBUF_F_RX_IEEE1588_TMST |
tstamp->rx_tstamp_dynflag;
}
}
}
static __rte_always_inline uint16_t
cn9k_nix_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts,
const uint16_t flags)
@ -463,7 +491,7 @@ cn9k_nix_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t pkts,
cn9k_nix_cqe_to_mbuf(cq, cq->tag, mbuf, lookup_mem, mbuf_init,
flags);
cnxk_nix_mbuf_to_tstamp(mbuf, rxq->tstamp,
cn9k_nix_mbuf_to_tstamp(mbuf, rxq->tstamp,
(flags & NIX_RX_OFFLOAD_TSTAMP_F),
(uint64_t *)((uint8_t *)mbuf
+ data_off));

View File

@ -714,34 +714,6 @@ cnxk_nix_timestamp_dynfield(struct rte_mbuf *mbuf,
rte_mbuf_timestamp_t *);
}
static __rte_always_inline void
cnxk_nix_mbuf_to_tstamp(struct rte_mbuf *mbuf,
struct cnxk_timesync_info *tstamp,
const uint8_t ts_enable, uint64_t *tstamp_ptr)
{
if (ts_enable) {
mbuf->pkt_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
mbuf->data_len -= CNXK_NIX_TIMESYNC_RX_OFFSET;
/* Reading the rx timestamp inserted by CGX, viz at
* starting of the packet data.
*/
*cnxk_nix_timestamp_dynfield(mbuf, tstamp) =
rte_be_to_cpu_64(*tstamp_ptr);
/* RTE_MBUF_F_RX_IEEE1588_TMST flag needs to be set only in case
* PTP packets are received.
*/
if (mbuf->packet_type == RTE_PTYPE_L2_ETHER_TIMESYNC) {
tstamp->rx_tstamp =
*cnxk_nix_timestamp_dynfield(mbuf, tstamp);
tstamp->rx_ready = 1;
mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP |
RTE_MBUF_F_RX_IEEE1588_TMST |
tstamp->rx_tstamp_dynflag;
}
}
}
static __rte_always_inline uintptr_t
cnxk_nix_sa_base_get(uint16_t port, const void *lookup_mem)
{