net/hns3: add max number of segments compatibility
[dpdk.git] / drivers / event / octeontx2 / otx2_tim_evdev.c
index 206ed43..4c24cc8 100644 (file)
@@ -254,7 +254,6 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
        struct tim_ring_req *free_req;
        struct tim_lf_alloc_req *req;
        struct tim_lf_alloc_rsp *rsp;
-       uint64_t nb_timers;
        int i, rc;
 
        if (dev == NULL)
@@ -300,7 +299,7 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
        tim_ring->max_tout = rcfg->max_tmo_ns;
        tim_ring->nb_bkts = (tim_ring->max_tout / tim_ring->tck_nsec);
        tim_ring->chunk_sz = dev->chunk_sz;
-       nb_timers = rcfg->nb_timers;
+       tim_ring->nb_timers = rcfg->nb_timers;
        tim_ring->disable_npa = dev->disable_npa;
        tim_ring->enable_stats = dev->enable_stats;
 
@@ -316,7 +315,7 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
                }
        }
 
-       tim_ring->nb_chunks = nb_timers / OTX2_TIM_NB_CHUNK_SLOTS(
+       tim_ring->nb_chunks = tim_ring->nb_timers / OTX2_TIM_NB_CHUNK_SLOTS(
                                                        tim_ring->chunk_sz);
        tim_ring->nb_chunk_slots = OTX2_TIM_NB_CHUNK_SLOTS(tim_ring->chunk_sz);
 
@@ -328,7 +327,11 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
                        tim_optimze_bkt_param(tim_ring);
        }
 
-       tim_ring->nb_chunks = tim_ring->nb_chunks * tim_ring->nb_bkts;
+       if (tim_ring->disable_npa)
+               tim_ring->nb_chunks = tim_ring->nb_chunks * tim_ring->nb_bkts;
+       else
+               tim_ring->nb_chunks = tim_ring->nb_chunks + tim_ring->nb_bkts;
+
        /* Create buckets. */
        tim_ring->bkt = rte_zmalloc("otx2_tim_bucket", (tim_ring->nb_bkts) *
                                    sizeof(struct otx2_tim_bkt),
@@ -373,10 +376,15 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
        tim_set_fp_ops(tim_ring);
 
        /* Update SSO xae count. */
-       sso_updt_xae_cnt(sso_pmd_priv(dev->event_dev), (void *)&nb_timers,
+       sso_updt_xae_cnt(sso_pmd_priv(dev->event_dev), (void *)tim_ring,
                         RTE_EVENT_TYPE_TIMER);
        sso_xae_reconfigure(dev->event_dev);
 
+       otx2_tim_dbg("Total memory used %"PRIu64"MB\n",
+                       (uint64_t)(((tim_ring->nb_chunks * tim_ring->chunk_sz)
+                       + (tim_ring->nb_bkts * sizeof(struct otx2_tim_bkt))) /
+                       BIT_ULL(20)));
+
        return rc;
 
 chnk_mem_err:
@@ -390,6 +398,31 @@ rng_mem_err:
        return rc;
 }
 
+static void
+otx2_tim_calibrate_start_tsc(struct otx2_tim_ring *tim_ring)
+{
+#define OTX2_TIM_CALIB_ITER    1E6
+       uint32_t real_bkt, bucket;
+       int icount, ecount = 0;
+       uint64_t bkt_cyc;
+
+       for (icount = 0; icount < OTX2_TIM_CALIB_ITER; icount++) {
+               real_bkt = otx2_read64(tim_ring->base + TIM_LF_RING_REL) >> 44;
+               bkt_cyc = rte_rdtsc();
+               bucket = (bkt_cyc - tim_ring->ring_start_cyc) /
+                                                       tim_ring->tck_int;
+               bucket = bucket % (tim_ring->nb_bkts);
+               tim_ring->ring_start_cyc = bkt_cyc - (real_bkt *
+                                                       tim_ring->tck_int);
+               if (bucket != real_bkt)
+                       ecount++;
+       }
+       tim_ring->last_updt_cyc = bkt_cyc;
+       otx2_tim_dbg("Bucket mispredict %3.2f distance %d\n",
+                    100 - (((double)(icount - ecount) / (double)icount) * 100),
+                    bucket - real_bkt);
+}
+
 static int
 otx2_tim_ring_start(const struct rte_event_timer_adapter *adptr)
 {
@@ -424,8 +457,11 @@ otx2_tim_ring_start(const struct rte_event_timer_adapter *adptr)
        tim_ring->ring_start_cyc = rsp->timestarted;
 #endif
        tim_ring->tck_int = NSEC2TICK(tim_ring->tck_nsec, rte_get_timer_hz());
+       tim_ring->tot_int = tim_ring->tck_int * tim_ring->nb_bkts;
        tim_ring->fast_div = rte_reciprocal_value_u64(tim_ring->tck_int);
 
+       otx2_tim_calibrate_start_tsc(tim_ring);
+
 fail:
        return rc;
 }
@@ -490,7 +526,8 @@ otx2_tim_stats_get(const struct rte_event_timer_adapter *adapter,
        uint64_t bkt_cyc = rte_rdtsc() - tim_ring->ring_start_cyc;
 
 
-       stats->evtim_exp_count = rte_atomic64_read(&tim_ring->arm_cnt);
+       stats->evtim_exp_count = __atomic_load_n(&tim_ring->arm_cnt,
+                                                __ATOMIC_RELAXED);
        stats->ev_enq_count = stats->evtim_exp_count;
        stats->adapter_tick_count = rte_reciprocal_divide_u64(bkt_cyc,
                                &tim_ring->fast_div);
@@ -502,7 +539,7 @@ otx2_tim_stats_reset(const struct rte_event_timer_adapter *adapter)
 {
        struct otx2_tim_ring *tim_ring = adapter->data->adapter_priv;
 
-       rte_atomic64_clear(&tim_ring->arm_cnt);
+       __atomic_store_n(&tim_ring->arm_cnt, 0, __ATOMIC_RELAXED);
        return 0;
 }