From: Pavan Nikhilesh <[email protected]> cn20k timer needs chunk buffers to be 256B aligned. Align the chunk buffer header and size. Update HWWQE response types and base code.
Signed-off-by: Pavan Nikhilesh <[email protected]> --- drivers/common/cnxk/hw/tim.h | 2 +- drivers/common/cnxk/roc_mbox.h | 11 ++++- drivers/common/cnxk/roc_tim.c | 5 +- drivers/common/cnxk/roc_tim.h | 4 +- drivers/event/cnxk/cnxk_tim_evdev.c | 71 +++++++++++++++------------- drivers/event/cnxk/cnxk_tim_evdev.h | 1 + drivers/event/cnxk/cnxk_tim_worker.h | 5 +- 7 files changed, 58 insertions(+), 41 deletions(-) diff --git a/drivers/common/cnxk/hw/tim.h b/drivers/common/cnxk/hw/tim.h index 75700a11b868..4333256ab836 100644 --- a/drivers/common/cnxk/hw/tim.h +++ b/drivers/common/cnxk/hw/tim.h @@ -56,6 +56,6 @@ #define TIM_MIN_BUCKET_SIZE 1 #define TIM_BUCKET_WRAP_SIZE 3 #define TIM_BUCKET_MIN_GAP 1 -#define TIM_NPA_TMO 0xFFFF +#define TIM_NPA_TMO 0 #endif /* __TIM_HW_H__ */ diff --git a/drivers/common/cnxk/roc_mbox.h b/drivers/common/cnxk/roc_mbox.h index 52ecde656378..f5ea84b7341e 100644 --- a/drivers/common/cnxk/roc_mbox.h +++ b/drivers/common/cnxk/roc_mbox.h @@ -3196,7 +3196,9 @@ struct tim_config_req { uint32_t __io chunksize; uint32_t __io interval_lo; uint8_t __io gpioedge; - uint8_t __io rsvd[3]; + uint8_t __io priority : 1; + uint8_t __io rsvd8 : 7; + uint8_t __io rsvd[2]; uint32_t __io interval_hi; uint64_t __io intervalns; uint64_t __io clockfreq; @@ -3222,7 +3224,12 @@ struct tim_feat_info { uint8_t __io engines; uint8_t __io hwwqe : 1; uint8_t __io intvl_ext : 1; - uint8_t __io rsvd8[4]; + uint16_t __io max_prd_timers; +#define TIM_HWWQE_VER_0 0 +#define TIM_HWWQE_VER_1 1 + uint8_t __io hwwqe_ver : 4; + uint8_t __io rsvd4 : 4; + uint8_t __io rsvd8; uint64_t __io rsvd[2]; }; diff --git a/drivers/common/cnxk/roc_tim.c b/drivers/common/cnxk/roc_tim.c index a1461fedb1b4..54204c10783b 100644 --- a/drivers/common/cnxk/roc_tim.c +++ b/drivers/common/cnxk/roc_tim.c @@ -194,8 +194,8 @@ roc_tim_lf_base_get(struct roc_tim *roc_tim, uint8_t ring_id) int roc_tim_lf_config(struct roc_tim *roc_tim, uint8_t ring_id, enum roc_tim_clk_src clk_src, - uint8_t ena_periodic, uint8_t ena_dfb, uint32_t bucket_sz, uint32_t chunk_sz, - uint64_t interval, uint64_t intervalns, uint64_t clockfreq) + uint8_t ena_periodic, uint8_t ena_dfb, uint8_t prio, uint32_t bucket_sz, + uint32_t chunk_sz, uint64_t interval, uint64_t intervalns, uint64_t clockfreq) { struct sso *sso = roc_sso_to_sso_priv(roc_tim->roc_sso); struct dev *dev = &sso->dev; @@ -217,6 +217,7 @@ roc_tim_lf_config(struct roc_tim *roc_tim, uint8_t ring_id, enum roc_tim_clk_src req->interval_hi = interval >> 32; req->intervalns = intervalns; req->clockfreq = clockfreq; + req->priority = prio; req->gpioedge = TIM_GPIO_LTOH_TRANS; rc = mbox_process(mbox); diff --git a/drivers/common/cnxk/roc_tim.h b/drivers/common/cnxk/roc_tim.h index 2eb6e6962bd1..d6302585f37e 100644 --- a/drivers/common/cnxk/roc_tim.h +++ b/drivers/common/cnxk/roc_tim.h @@ -47,8 +47,8 @@ int __roc_api roc_tim_lf_enable(struct roc_tim *roc_tim, uint8_t ring_id, int __roc_api roc_tim_lf_disable(struct roc_tim *roc_tim, uint8_t ring_id); int __roc_api roc_tim_lf_config(struct roc_tim *roc_tim, uint8_t ring_id, enum roc_tim_clk_src clk_src, uint8_t ena_periodic, uint8_t ena_dfb, - uint32_t bucket_sz, uint32_t chunk_sz, uint64_t interval, - uint64_t intervalns, uint64_t clockfreq); + uint8_t prio, uint32_t bucket_sz, uint32_t chunk_sz, + uint64_t interval, uint64_t intervalns, uint64_t clockfreq); int __roc_api roc_tim_lf_config_hwwqe(struct roc_tim *roc_tim, uint8_t ring_id, struct roc_tim_hwwqe_cfg *cfg); int __roc_api roc_tim_lf_interval(struct roc_tim *roc_tim, diff --git a/drivers/event/cnxk/cnxk_tim_evdev.c b/drivers/event/cnxk/cnxk_tim_evdev.c index 8cdb8a72dd3c..75414408776d 100644 --- a/drivers/event/cnxk/cnxk_tim_evdev.c +++ b/drivers/event/cnxk/cnxk_tim_evdev.c @@ -18,6 +18,7 @@ cnxk_tim_chnk_pool_create(struct cnxk_tim_ring *tim_ring, { unsigned int mp_flags = 0; unsigned int cache_sz; + const char *ops; char pool_name[25]; int rc; @@ -33,41 +34,43 @@ cnxk_tim_chnk_pool_create(struct cnxk_tim_ring *tim_ring, cache_sz = CNXK_TIM_MAX_POOL_CACHE_SZ; tim_ring->nb_chunks += (cache_sz * rte_lcore_count()); - if (!tim_ring->disable_npa) { - tim_ring->chunk_pool = rte_mempool_create_empty( - pool_name, tim_ring->nb_chunks, tim_ring->chunk_sz, - cache_sz, 0, rte_socket_id(), mp_flags); - if (tim_ring->chunk_pool == NULL) { - plt_err("Unable to create chunkpool."); - return -ENOMEM; - } + tim_ring->chunk_pool = rte_mempool_create_empty(pool_name, tim_ring->nb_chunks, + tim_ring->chunk_sz, cache_sz, 0, + rte_socket_id(), mp_flags); + if (tim_ring->chunk_pool == NULL) { + plt_err("Unable to create chunkpool."); + return -ENOMEM; + } - rc = rte_mempool_set_ops_byname(tim_ring->chunk_pool, - rte_mbuf_platform_mempool_ops(), - NULL); - if (rc < 0) { - plt_err("Unable to set chunkpool ops"); - goto free; - } + /* cn20k needs 256B-aligned chunk buffers (cn20k-tim 14.2). */ + if (roc_model_is_cn20k()) + tim_ring->chunk_pool->header_size = RTE_ALIGN_CEIL( + tim_ring->chunk_pool->header_size, CNXK_TIM_CN20K_CHUNK_BUF_ALIGN); - rc = rte_mempool_populate_default(tim_ring->chunk_pool); - if (rc < 0) { - plt_err("Unable to set populate chunkpool."); - goto free; - } - tim_ring->aura = roc_npa_aura_handle_to_aura( - tim_ring->chunk_pool->pool_id); + if (!tim_ring->disable_npa) + ops = rte_mbuf_platform_mempool_ops(); + else if (mp_flags & RTE_MEMPOOL_F_SP_PUT) + ops = "ring_sp_sc"; + else + ops = "ring_mp_mc"; + + rc = rte_mempool_set_ops_byname(tim_ring->chunk_pool, ops, NULL); + if (rc < 0) { + plt_err("Unable to set chunkpool ops"); + goto free; + } + + rc = rte_mempool_populate_default(tim_ring->chunk_pool); + if (rc < 0) { + plt_err("Unable to populate chunkpool."); + goto free; + } + + if (!tim_ring->disable_npa) { + tim_ring->aura = roc_npa_aura_handle_to_aura(tim_ring->chunk_pool->pool_id); tim_ring->ena_dfb = tim_ring->ena_periodic ? 1 : 0; } else { - tim_ring->chunk_pool = rte_mempool_create( - pool_name, tim_ring->nb_chunks, tim_ring->chunk_sz, - cache_sz, 0, NULL, NULL, NULL, NULL, rte_socket_id(), - mp_flags); - if (tim_ring->chunk_pool == NULL) { - plt_err("Unable to create chunkpool."); - return -ENOMEM; - } tim_ring->ena_dfb = 1; } @@ -250,6 +253,10 @@ cnxk_tim_ring_create(struct rte_event_timer_adapter *adptr) } } + if (roc_model_is_cn20k()) + tim_ring->chunk_sz = + RTE_ALIGN_CEIL(tim_ring->chunk_sz, CNXK_TIM_CN20K_CHUNK_BUF_ALIGN); + if (!dev->tim.feat.hwwqe && tim_ring->disable_npa) { tim_ring->nb_chunks = tim_ring->nb_timers / @@ -274,7 +281,7 @@ cnxk_tim_ring_create(struct rte_event_timer_adapter *adptr) goto tim_bkt_free; rc = roc_tim_lf_config(&dev->tim, tim_ring->ring_id, clk_src, - tim_ring->ena_periodic, tim_ring->ena_dfb, + tim_ring->ena_periodic, tim_ring->ena_dfb, 0, tim_ring->nb_bkts, tim_ring->chunk_sz, tim_ring->tck_int, tim_ring->tck_nsec, clk_freq); if (rc < 0) { @@ -282,7 +289,7 @@ cnxk_tim_ring_create(struct rte_event_timer_adapter *adptr) goto tim_chnk_free; } - if (dev->tim.feat.hwwqe) { + if (dev->tim.feat.hwwqe && dev->tim.feat.hwwqe_ver != TIM_HWWQE_VER_0) { rc = cnxk_tim_enable_hwwqe(dev, tim_ring); if (rc < 0) { plt_err("Failed to enable hwwqe"); diff --git a/drivers/event/cnxk/cnxk_tim_evdev.h b/drivers/event/cnxk/cnxk_tim_evdev.h index 114a89ee5aec..83e9cfd458fb 100644 --- a/drivers/event/cnxk/cnxk_tim_evdev.h +++ b/drivers/event/cnxk/cnxk_tim_evdev.h @@ -25,6 +25,7 @@ #define CNXK_TIM_MAX_BUCKETS (0xFFFFF) #define CNXK_TIM_RING_DEF_CHUNK_SZ (1024) #define CNXK_TIM_CHUNK_ALIGNMENT (16) +#define CNXK_TIM_CN20K_CHUNK_BUF_ALIGN (256) #define CNXK_TIM_MAX_BURST (16) #define CNXK_TIM_NB_CHUNK_SLOTS(sz) (((sz) / CNXK_TIM_CHUNK_ALIGNMENT) - 1) #define CNXK_TIM_MIN_CHUNK_SLOTS (0x1) diff --git a/drivers/event/cnxk/cnxk_tim_worker.h b/drivers/event/cnxk/cnxk_tim_worker.h index 09f84091abba..6a9099a23f3a 100644 --- a/drivers/event/cnxk/cnxk_tim_worker.h +++ b/drivers/event/cnxk/cnxk_tim_worker.h @@ -625,14 +625,15 @@ cnxk_tim_add_entry_hwwqe(struct cnxk_tim_ring *const tim_ring, struct rte_event_ rsp >>= 4; switch (rsp) { case 0x3: - tim->state = RTE_EVENT_TIMER_ERROR_TOOEARLY; + tim->state = RTE_EVENT_TIMER_ERROR_TOOLATE; rc = !rc; break; case 0x4: - tim->state = RTE_EVENT_TIMER_ERROR_TOOLATE; + tim->state = RTE_EVENT_TIMER_ERROR_TOOEARLY; rc = !rc; break; case 0x1: + case 0x5: tim->state = RTE_EVENT_TIMER_ARMED; break; default: -- 2.50.1 (Apple Git-155)

