net/iavf/base: adjust indentation
[dpdk.git] / drivers / event / octeontx2 / otx2_tim_evdev.c
index 5f0233f..cd0dcde 100644 (file)
@@ -327,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),
@@ -376,6 +380,11 @@ otx2_tim_ring_create(struct rte_event_timer_adapter *adptr)
                         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:
@@ -389,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)
 {
@@ -423,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;
 }