Skip to content

Commit 8b05b45

Browse files
authored
DEV-5708 and DEV-5709: add mvpp2 timestamping (#1)
DEV-5709: add support for HW RX TS in mvpp2 Adds: * enables HW RX TS using offload flags, but configuration is done separately in Linux using Timestamping API * detection of mvpp2 TAI using Linux ethtool * PHC read using Linux PTP subsystem * handling of timestamps with convertion from u32 to u64 nsec * alarm worker that triggers PHC gettimex64() in Linux every 2 seconds DEV-5708: add support for HW TX TS in mvpp2 Adds: * includes unification changes for HW RX TS (see prev. commit) * enables HW TX TS using offload flags on per-packet basis, but configuration is done separately in Linux using Timestamping API before VPP start * adds data structures to keep track of egress queue of timestamps * adds 1ms poll for new timestamps, masks IRQ for new timestamps (see TODOs) * adds hardcoded TX descriptor setup (see TODOs) * adds support for 1 TX timesramp queue (see TODOs) TODO: * add support for PTP packet classifier and parser * add support for PTP IRQs * add support for 2 TX timesramp queues
1 parent 4ac3f3d commit 8b05b45

File tree

5 files changed

+620
-12
lines changed

5 files changed

+620
-12
lines changed

drivers/net/mvpp2/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ sources = files(
2424
'mrvl_qos.c',
2525
'mrvl_mtr.c',
2626
'mrvl_tm.c',
27+
'mrvl_ptp.c',
2728
)
2829

2930
deps += ['cfgfile', 'common_mvep']

drivers/net/mvpp2/mrvl_ethdev.c

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "mrvl_flow.h"
2828
#include "mrvl_mtr.h"
2929
#include "mrvl_tm.h"
30+
#include "mrvl_ptp.h"
3031

3132
/* bitmask with reserved hifs */
3233
#define MRVL_MUSDK_HIFS_RESERVED 0x0F
@@ -60,7 +61,8 @@
6061
/** Port Rx offload capabilities */
6162
#define MRVL_RX_OFFLOADS (DEV_RX_OFFLOAD_VLAN_FILTER | \
6263
DEV_RX_OFFLOAD_JUMBO_FRAME | \
63-
DEV_RX_OFFLOAD_CHECKSUM)
64+
DEV_RX_OFFLOAD_CHECKSUM | \
65+
DEV_RX_OFFLOAD_TIMESTAMP)
6466

6567
/** Port Tx offloads capabilities */
6668
#define MRVL_TX_OFFLOAD_CHECKSUM (DEV_TX_OFFLOAD_IPV4_CKSUM | \
@@ -71,7 +73,8 @@
7173

7274
#define MRVL_TX_PKT_OFFLOADS (PKT_TX_IP_CKSUM | \
7375
PKT_TX_TCP_CKSUM | \
74-
PKT_TX_UDP_CKSUM)
76+
PKT_TX_UDP_CKSUM | \
77+
PKT_TX_IEEE1588_TMST)
7578

7679
static const char * const valid_args[] = {
7780
MRVL_IFACE_NAME_ARG,
@@ -117,16 +120,6 @@ struct mrvl_shadow_txq {
117120
struct buff_release_entry ent[MRVL_PP2_TX_SHADOWQ_SIZE]; /* q entries */
118121
};
119122

120-
struct mrvl_rxq {
121-
struct mrvl_priv *priv;
122-
struct rte_mempool *mp;
123-
int queue_id;
124-
int port_id;
125-
int cksum_enabled;
126-
uint64_t bytes_recv;
127-
uint64_t drop_mac;
128-
};
129-
130123
struct mrvl_txq {
131124
struct mrvl_priv *priv;
132125
int queue_id;
@@ -508,6 +501,12 @@ mrvl_dev_configure(struct rte_eth_dev *dev)
508501
}
509502
}
510503

504+
if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_TIMESTAMP) {
505+
if (!mvpp2_enable_rx_ts(dev->data->port_id)) {
506+
return -1;
507+
}
508+
}
509+
511510
if (dev->data->dev_conf.txmode.offloads & DEV_TX_OFFLOAD_MULTI_SEGS)
512511
priv->multiseg = 1;
513512

@@ -653,6 +652,17 @@ mrvl_dev_set_link_up(struct rte_eth_dev *dev)
653652
return ret;
654653
}
655654

655+
if (priv->tai != CLOCK_INVALID) {
656+
if (mvpp2_schedule_phc_alarm(priv)) {
657+
MRVL_LOG(ERR, "%u-%u: failed to schedule PHC poll alarm",
658+
priv->ppio->pp2_id, priv->ppio->port_id);
659+
}
660+
if (mvpp2_schedule_tx_ts_alarm(priv)) {
661+
MRVL_LOG(ERR, "%u-%u: failed to schedule TX TS poll alarm",
662+
priv->ppio->pp2_id, priv->ppio->port_id);
663+
}
664+
}
665+
656666
dev->data->dev_link.link_status = ETH_LINK_UP;
657667
return 0;
658668
}
@@ -676,6 +686,12 @@ mrvl_dev_set_link_down(struct rte_eth_dev *dev)
676686
dev->data->dev_link.link_status = ETH_LINK_DOWN;
677687
return 0;
678688
}
689+
690+
if (priv->tai != CLOCK_INVALID) {
691+
mvpp2_cancel_tx_ts_alarm(priv);
692+
mvpp2_cancel_phc_alarm(priv);
693+
}
694+
679695
ret = pp2_ppio_disable(priv->ppio);
680696
if (ret)
681697
return ret;
@@ -1154,6 +1170,13 @@ mrvl_dev_close(struct rte_eth_dev *dev)
11541170
priv->bpool = NULL;
11551171
}
11561172

1173+
if (priv->tai != CLOCK_INVALID) {
1174+
mvpp2_cancel_tx_ts_alarm(priv);
1175+
mvpp2_cancel_phc_alarm(priv);
1176+
phc_close(priv->tai);
1177+
priv->tai = CLOCK_INVALID;
1178+
}
1179+
11571180
mrvl_dev_num--;
11581181

11591182
if (mrvl_dev_num == 0) {
@@ -2654,6 +2677,10 @@ mrvl_rx_pkt_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
26542677
mrvl_desc_to_ol_flags(&descs[i],
26552678
mbuf->packet_type);
26562679

2680+
if (mvpp2_is_rx_ts_enabled(q)) {
2681+
mvpp2_read_rx_ts(q->priv, &descs[i], mbuf);
2682+
}
2683+
26572684
rx_pkts[rx_done++] = mbuf;
26582685
q->bytes_recv += mbuf->pkt_len;
26592686
}
@@ -2871,6 +2898,12 @@ mrvl_tx_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
28712898
mrvl_fill_desc(&descs[i], mbuf);
28722899

28732900
bytes_sent += rte_pktmbuf_pkt_len(mbuf);
2901+
2902+
mvpp2_txdesc_clear_ptp(&descs[i]);
2903+
if (unlikely(mbuf->ol_flags & PKT_TX_IEEE1588_TMST)) {
2904+
mvpp2_tx_hw_tstamp(q->priv, mbuf, &descs[i]);
2905+
}
2906+
28742907
/*
28752908
* in case unsupported ol_flags were passed
28762909
* do not update descriptor offload information
@@ -3008,6 +3041,12 @@ mrvl_tx_sg_pkt_burst(void *txq, struct rte_mbuf **tx_pkts,
30083041
mrvl_fill_desc(&descs[tail++], seg);
30093042

30103043
bytes_sent += rte_pktmbuf_pkt_len(mbuf);
3044+
3045+
mvpp2_txdesc_clear_ptp(&descs[i]);
3046+
if (unlikely(mbuf->ol_flags & PKT_TX_IEEE1588_TMST)) {
3047+
mvpp2_tx_hw_tstamp(q->priv, mbuf, &descs[i]);
3048+
}
3049+
30113050
/* In case unsupported ol_flags were passed
30123051
* do not update descriptor offload information
30133052
*/
@@ -3046,6 +3085,7 @@ mrvl_tx_sg_pkt_burst(void *txq, struct rte_mbuf **tx_pkts,
30463085
return nb_pkts;
30473086
}
30483087

3088+
30493089
/**
30503090
* Create private device structure.
30513091
*
@@ -3099,6 +3139,10 @@ mrvl_priv_create(const char *dev_name)
30993139
priv->ppio_params.type = PP2_PPIO_T_NIC;
31003140
rte_spinlock_init(&priv->lock);
31013141

3142+
if (sk_get_dev_phc(dev_name, &priv->tai)) {
3143+
MRVL_LOG(ERR, "failed to open TAI using Linux PHC");
3144+
}
3145+
31023146
return priv;
31033147
out_clear_bpool_bit:
31043148
used_bpools[priv->pp_id] &= ~(1 << priv->bpool_bit);

drivers/net/mvpp2/mrvl_ethdev.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ struct mrvl_tm_node {
138138
uint64_t stats_mask;
139139
};
140140

141+
struct mvpp2_hwtstamp_queue {
142+
rte_spinlock_t lock;
143+
u8 next; // iterator 0..31
144+
struct rte_mbuf *mbuf[32];
145+
};
146+
141147
struct mrvl_priv {
142148
/* Hot fields, used in fast path. */
143149
struct pp2_bpool *bpool; /**< BPool pointer */
@@ -146,6 +152,8 @@ struct mrvl_priv {
146152
uint16_t bpool_max_size; /**< BPool maximum size */
147153
uint16_t bpool_min_size; /**< BPool minimum size */
148154
uint16_t bpool_init_size; /**< Configured BPool size */
155+
clockid_t tai; /**< Linux PHC id */
156+
struct mvpp2_hwtstamp_queue tx_hwtstamp_queue[2];
149157

150158
/** Mapping for DPDK rx queue->(TC, MRVL relative inq) */
151159
struct {
@@ -187,9 +195,22 @@ struct mrvl_priv {
187195
uint8_t forward_bad_frames;
188196
uint32_t fill_bpool_buffs;
189197

198+
bool scheduled_get_time_alarm;
199+
bool scheduled_get_tx_ts_alarm;
200+
190201
uint8_t configured; /** indicates if device has been configured */
191202
};
192203

204+
struct mrvl_rxq {
205+
struct mrvl_priv *priv;
206+
struct rte_mempool *mp;
207+
int queue_id;
208+
int port_id;
209+
int cksum_enabled;
210+
uint64_t bytes_recv;
211+
uint64_t drop_mac;
212+
};
213+
193214
/** Flow operations forward declaration. */
194215
extern const struct rte_flow_ops mrvl_flow_ops;
195216

0 commit comments

Comments
 (0)