[dpdk-dev] [PATCH v2 4/6] event/octeontx2: add PTP support for SSO
pbhagavatula at marvell.com
pbhagavatula at marvell.com
Mon Jun 3 12:34:26 CEST 2019
From: Harman Kalra <hkalra at marvell.com>
Add PTP support for SSO based on rx_offloads of the queue connected to
it.
Signed-off-by: Harman Kalra <hkalra at marvell.com>
Signed-off-by: Nithin Dabilpuram <ndabilpuram at marvell.com>
Signed-off-by: Pavan Nikhilesh <pbhagavatula at marvell.com>
---
drivers/event/octeontx2/otx2_evdev.c | 2 ++
drivers/event/octeontx2/otx2_evdev.h | 6 ++++++
drivers/event/octeontx2/otx2_evdev_adptr.c | 1 +
drivers/event/octeontx2/otx2_worker.h | 6 ++++++
drivers/event/octeontx2/otx2_worker_dual.c | 18 ++++++++++++------
drivers/event/octeontx2/otx2_worker_dual.h | 6 +++++-
6 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c
index 2352895bb..138f4e4fa 100644
--- a/drivers/event/octeontx2/otx2_evdev.c
+++ b/drivers/event/octeontx2/otx2_evdev.c
@@ -1092,6 +1092,7 @@ otx2_sso_port_setup(struct rte_eventdev *event_dev, uint8_t port_id,
sizeof(uintptr_t) * OTX2_SSO_MAX_VHGRP);
ws->fc_mem = dev->fc_mem;
ws->xaq_lmt = dev->xaq_lmt;
+ ws->tstamp = dev->tstamp;
otx2_write64(val, OTX2_SSOW_GET_BASE_ADDR(
ws->ws_state[0].getwrk_op) + SSOW_LF_GWS_NW_TIM);
otx2_write64(val, OTX2_SSOW_GET_BASE_ADDR(
@@ -1104,6 +1105,7 @@ otx2_sso_port_setup(struct rte_eventdev *event_dev, uint8_t port_id,
sizeof(uintptr_t) * OTX2_SSO_MAX_VHGRP);
ws->fc_mem = dev->fc_mem;
ws->xaq_lmt = dev->xaq_lmt;
+ ws->tstamp = dev->tstamp;
otx2_write64(val, base + SSOW_LF_GWS_NW_TIM);
}
diff --git a/drivers/event/octeontx2/otx2_evdev.h b/drivers/event/octeontx2/otx2_evdev.h
index 8c8ba8bc3..dd493715b 100644
--- a/drivers/event/octeontx2/otx2_evdev.h
+++ b/drivers/event/octeontx2/otx2_evdev.h
@@ -134,6 +134,8 @@ struct otx2_sso_evdev {
/* MSIX offsets */
uint16_t sso_msixoff[OTX2_SSO_MAX_VHGRP];
uint16_t ssow_msixoff[OTX2_SSO_MAX_VHWS];
+ /* PTP timestamp */
+ struct otx2_timesync_info *tstamp;
} __rte_cache_aligned;
#define OTX2_SSOGWS_OPS \
@@ -158,6 +160,8 @@ struct otx2_ssogws {
uint64_t xaq_lmt __rte_cache_aligned;
uint64_t *fc_mem;
uintptr_t grps_base[OTX2_SSO_MAX_VHGRP];
+ /* PTP timestamp */
+ struct otx2_timesync_info *tstamp;
} __rte_cache_aligned;
struct otx2_ssogws_state {
@@ -175,6 +179,8 @@ struct otx2_ssogws_dual {
uint64_t xaq_lmt __rte_cache_aligned;
uint64_t *fc_mem;
uintptr_t grps_base[OTX2_SSO_MAX_VHGRP];
+ /* PTP timestamp */
+ struct otx2_timesync_info *tstamp;
} __rte_cache_aligned;
static inline struct otx2_sso_evdev *
diff --git a/drivers/event/octeontx2/otx2_evdev_adptr.c b/drivers/event/octeontx2/otx2_evdev_adptr.c
index 0656d1081..c2cf4196e 100644
--- a/drivers/event/octeontx2/otx2_evdev_adptr.c
+++ b/drivers/event/octeontx2/otx2_evdev_adptr.c
@@ -275,6 +275,7 @@ otx2_sso_rx_adapter_queue_add(const struct rte_eventdev *event_dev,
}
dev->rx_offloads |= otx2_eth_dev->rx_offload_flags;
+ dev->tstamp = &otx2_eth_dev->tstamp;
sso_fastpath_fns_set((struct rte_eventdev *)(uintptr_t)event_dev);
return 0;
diff --git a/drivers/event/octeontx2/otx2_worker.h b/drivers/event/octeontx2/otx2_worker.h
index 2146587aa..9d116f1ac 100644
--- a/drivers/event/octeontx2/otx2_worker.h
+++ b/drivers/event/octeontx2/otx2_worker.h
@@ -69,6 +69,9 @@ otx2_ssogws_get_work(struct otx2_ssogws *ws, struct rte_event *ev,
get_work1 = otx2_wqe_to_mbuf(get_work1, mbuf,
(get_work0 >> 20) & 0xFF, flags,
lookup_mem);
+ /* Extracting tstamp, if PTP enabled*/
+ otx2_nix_mbuf_to_tstamp((struct rte_mbuf *)get_work1,
+ ws->tstamp, flags);
}
ev->event = get_work0;
@@ -127,6 +130,9 @@ otx2_ssogws_get_work_empty(struct otx2_ssogws *ws, struct rte_event *ev,
get_work1 = otx2_wqe_to_mbuf(get_work1, mbuf,
(get_work0 >> 20) & 0xFF, flags,
ws->lookup_mem);
+ /* Extracting tstamp, if PTP enabled*/
+ otx2_nix_mbuf_to_tstamp((struct rte_mbuf *)get_work1,
+ ws->tstamp, flags);
}
ev->event = get_work0;
diff --git a/drivers/event/octeontx2/otx2_worker_dual.c b/drivers/event/octeontx2/otx2_worker_dual.c
index b5cf9ac12..cbe03c1bb 100644
--- a/drivers/event/octeontx2/otx2_worker_dual.c
+++ b/drivers/event/octeontx2/otx2_worker_dual.c
@@ -158,7 +158,8 @@ otx2_ssogws_dual_deq_ ##name(void *port, struct rte_event *ev, \
\
gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws], \
&ws->ws_state[!ws->vws], ev, \
- flags, ws->lookup_mem); \
+ flags, ws->lookup_mem, \
+ ws->tstamp); \
ws->vws = !ws->vws; \
\
return gw; \
@@ -191,13 +192,15 @@ otx2_ssogws_dual_deq_timeout_ ##name(void *port, struct rte_event *ev, \
\
gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws], \
&ws->ws_state[!ws->vws], ev, \
- flags, ws->lookup_mem); \
+ flags, ws->lookup_mem, \
+ ws->tstamp); \
ws->vws = !ws->vws; \
for (iter = 1; iter < timeout_ticks && (gw == 0); iter++) { \
gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws], \
&ws->ws_state[!ws->vws], \
ev, flags, \
- ws->lookup_mem); \
+ ws->lookup_mem, \
+ ws->tstamp); \
ws->vws = !ws->vws; \
} \
\
@@ -234,7 +237,8 @@ otx2_ssogws_dual_deq_seg_ ##name(void *port, struct rte_event *ev, \
gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws], \
&ws->ws_state[!ws->vws], ev, \
flags | NIX_RX_MULTI_SEG_F, \
- ws->lookup_mem); \
+ ws->lookup_mem, \
+ ws->tstamp); \
ws->vws = !ws->vws; \
\
return gw; \
@@ -271,14 +275,16 @@ otx2_ssogws_dual_deq_seg_timeout_ ##name(void *port, \
gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws], \
&ws->ws_state[!ws->vws], ev, \
flags | NIX_RX_MULTI_SEG_F, \
- ws->lookup_mem); \
+ ws->lookup_mem, \
+ ws->tstamp); \
ws->vws = !ws->vws; \
for (iter = 1; iter < timeout_ticks && (gw == 0); iter++) { \
gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws], \
&ws->ws_state[!ws->vws], \
ev, flags | \
NIX_RX_MULTI_SEG_F, \
- ws->lookup_mem); \
+ ws->lookup_mem, \
+ ws->tstamp); \
ws->vws = !ws->vws; \
} \
\
diff --git a/drivers/event/octeontx2/otx2_worker_dual.h b/drivers/event/octeontx2/otx2_worker_dual.h
index b6e4dd738..855b167ca 100644
--- a/drivers/event/octeontx2/otx2_worker_dual.h
+++ b/drivers/event/octeontx2/otx2_worker_dual.h
@@ -16,7 +16,8 @@ static __rte_always_inline uint16_t
otx2_ssogws_dual_get_work(struct otx2_ssogws_state *ws,
struct otx2_ssogws_state *ws_pair,
struct rte_event *ev, const uint32_t flags,
- const void * const lookup_mem)
+ const void * const lookup_mem,
+ struct otx2_timesync_info * const tstamp)
{
const uint64_t set_gw = BIT_ULL(16) | 1;
uint64_t get_work0;
@@ -70,6 +71,9 @@ otx2_ssogws_dual_get_work(struct otx2_ssogws_state *ws,
get_work1 = otx2_wqe_to_mbuf(get_work1, mbuf,
(get_work0 >> 20) & 0xFF,
flags, lookup_mem);
+ /* Extracting tstamp, if PTP enabled*/
+ otx2_nix_mbuf_to_tstamp((struct rte_mbuf *)get_work1,
+ tstamp, flags);
}
ev->event = get_work0;
--
2.21.0
More information about the dev
mailing list