From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6C9F6A0C47; Thu, 14 Oct 2021 13:51:57 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 04F0C41235; Thu, 14 Oct 2021 13:51:57 +0200 (CEST) Received: from mail-io1-f54.google.com (mail-io1-f54.google.com [209.85.166.54]) by mails.dpdk.org (Postfix) with ESMTP id 729C940041 for ; Thu, 14 Oct 2021 13:51:55 +0200 (CEST) Received: by mail-io1-f54.google.com with SMTP id h196so3405667iof.2 for ; Thu, 14 Oct 2021 04:51:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=zUCDoMNnPAVlt1tofwdL96dQBoI0dH4xckA/gLXbhKE=; b=PEBvJPcCLd52jOgD5ghi8L4X9P6JH3g1PthneXRStkfiBt9nS5EPv2YXMvBkbxaA/5 DJT6+kwkK2TntsuxoSIMr5irtgLrsjAYA19IYW6UTLUxrZ2mYcFsPyI1KKNztVmZlx1D TY0IdgVNzigM5qlkIi6DKiERTakYReGhCCJ8oG2LAW8szHVv/nicUZus8N1/fYPAGFAI DCpw98S+xOCvLuBu7PHE+kC6/kY5c2nPwYdV1z5lP+Ylg4IQA84CjUJPWyONhHRKsq8d b9jhTeYFSK27IzzDpGrmRwtvbGGyUHpSRa+dWI48AjE3zCLJXT+gGAv1ykIaJSLFVeko sswg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=zUCDoMNnPAVlt1tofwdL96dQBoI0dH4xckA/gLXbhKE=; b=ebTlOZGp6Q+8EDhAaM3gF/Bkej7nRTf6qtZRtKryU6d52Viy4CkCOfu4OWcvI+IkPg aeA8KneC5kUt/o8GPCam33aI17n9XTD9v7EfSI4tPa7bgnqPov68ViqsX/+tehFhMmVr dPH9YNvDgsW0rxu70csHPsBlEveeKHOU+VMzQ/eNkHFn8Jc229uJnwvCRsfsmsvcv5bK Q6Ez+au1a7ZBhuWF6IMaCBDHJ4n6Me34Q5nNmZ7TIX1StKBvALaxR5LtJDtgCxVzNrm1 fdz7zKMr/yMiEQTMCi31/BtuR4SAaP0RIUhaDHYobqFc8ataAFBC+jlG22xXpSCy2/+h nZdA== X-Gm-Message-State: AOAM530L8CAFa82R7d5H2JwSV8bYbRSwsvhTzftVhRrJMkQv5ACnMUHs arlzz3jK4q1I/i35LCTADR5z3qxJXrxWZxEHksk= X-Google-Smtp-Source: ABdhPJysq7pi5W+06wfVplgm3WGiS2zx64W5+65bZjvzb1oPLNWLe99M8BCRp8+rDlJi27v9qx7kGE4DgkuSNG51EWY= X-Received: by 2002:a05:6638:23a:: with SMTP id f26mr3754092jaq.2.1634212314608; Thu, 14 Oct 2021 04:51:54 -0700 (PDT) MIME-Version: 1.0 References: <20210923213046.3157-1-pbhagavatula@marvell.com> <20211009080426.18482-1-pbhagavatula@marvell.com> In-Reply-To: <20211009080426.18482-1-pbhagavatula@marvell.com> From: Jerin Jacob Date: Thu, 14 Oct 2021 17:21:28 +0530 Message-ID: To: Pavan Nikhilesh Cc: Jerin Jacob , Nithin Dabilpuram , Kiran Kumar K , Sunil Kumar Kori , Satha Rao , Ray Kinsella , Shijith Thotton , dpdk-dev Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH v4 1/2] event/cnxk: update min interval calculation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Sat, Oct 9, 2021 at 1:34 PM wrote: > > From: Pavan Nikhilesh > > Minimum supported interval should now be retrieved from > mailbox based on the clock source and clock frequency. > > Signed-off-by: Pavan Nikhilesh > --- > v4: > - Rebase on master, fix NULL checks. > v3: > - Add new mbox interface. > v2: > - Fixed devargs parsing and rebased. Please rebase [for-main]dell[dpdk-next-eventdev] $ git pw series apply 19482 Applying: event/cnxk: update min interval calculation Applying: event/cnxk: add external clock support for timer error: sha1 information is lacking or useless (drivers/event/cnxk/cnxk_tim_evdev.c). error: could not build fake ancestor hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0002 event/cnxk: add external clock support for timer When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". > > drivers/common/cnxk/roc_mbox.h | 17 +++++++ > drivers/common/cnxk/roc_tim.c | 32 +++++++++++- > drivers/common/cnxk/roc_tim.h | 9 +++- > drivers/common/cnxk/version.map | 1 + > drivers/event/cnxk/cnxk_tim_evdev.c | 69 +++++++++++++++++-------- > drivers/event/cnxk/cnxk_tim_evdev.h | 79 ++++++++++++++++++----------- > 6 files changed, 155 insertions(+), 52 deletions(-) > > diff --git a/drivers/common/cnxk/roc_mbox.h b/drivers/common/cnxk/roc_mbox.h > index 75d1ff1ef3..c3688de065 100644 > --- a/drivers/common/cnxk/roc_mbox.h > +++ b/drivers/common/cnxk/roc_mbox.h > @@ -131,6 +131,8 @@ struct mbox_msghdr { > M(TIM_ENABLE_RING, 0x803, tim_enable_ring, tim_ring_req, \ > tim_enable_rsp) \ > M(TIM_DISABLE_RING, 0x804, tim_disable_ring, tim_ring_req, msg_rsp) \ > + M(TIM_GET_MIN_INTVL, 0x805, tim_get_min_intvl, tim_intvl_req, \ > + tim_intvl_rsp) \ > /* CPT mbox IDs (range 0xA00 - 0xBFF) */ \ > M(CPT_LF_ALLOC, 0xA00, cpt_lf_alloc, cpt_lf_alloc_req_msg, msg_rsp) \ > M(CPT_LF_FREE, 0xA01, cpt_lf_free, msg_req, msg_rsp) \ > @@ -1756,6 +1758,9 @@ struct tim_config_req { > uint32_t __io chunksize; > uint32_t __io interval; > uint8_t __io gpioedge; > + uint8_t __io rsvd[7]; > + uint64_t __io intervalns; > + uint64_t __io clockfreq; > }; > > struct tim_lf_alloc_rsp { > @@ -1769,6 +1774,18 @@ struct tim_enable_rsp { > uint32_t __io currentbucket; > }; > > +struct tim_intvl_req { > + struct mbox_msghdr hdr; > + uint8_t __io clocksource; > + uint64_t __io clockfreq; > +}; > + > +struct tim_intvl_rsp { > + struct mbox_msghdr hdr; > + uint64_t __io intvl_cyc; > + uint64_t __io intvl_ns; > +}; > + > struct sdp_node_info { > /* Node to which this PF belons to */ > uint8_t __io node_id; > diff --git a/drivers/common/cnxk/roc_tim.c b/drivers/common/cnxk/roc_tim.c > index 387164bb1d..eefa8253bc 100644 > --- a/drivers/common/cnxk/roc_tim.c > +++ b/drivers/common/cnxk/roc_tim.c > @@ -145,7 +145,7 @@ 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, > - uint32_t interval) > + uint32_t interval, uint64_t intervalns, uint64_t clockfreq) > { > struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev; > struct tim_config_req *req; > @@ -162,6 +162,8 @@ roc_tim_lf_config(struct roc_tim *roc_tim, uint8_t ring_id, > req->enableperiodic = ena_periodic; > req->enabledontfreebuffer = ena_dfb; > req->interval = interval; > + req->intervalns = intervalns; > + req->clockfreq = clockfreq; > req->gpioedge = TIM_GPIO_LTOH_TRANS; > > rc = mbox_process(dev->mbox); > @@ -173,6 +175,34 @@ roc_tim_lf_config(struct roc_tim *roc_tim, uint8_t ring_id, > return 0; > } > > +int > +roc_tim_lf_interval(struct roc_tim *roc_tim, enum roc_tim_clk_src clk_src, > + uint64_t clockfreq, uint64_t *intervalns, > + uint64_t *interval) > +{ > + struct dev *dev = &roc_sso_to_sso_priv(roc_tim->roc_sso)->dev; > + struct tim_intvl_req *req; > + struct tim_intvl_rsp *rsp; > + int rc = -ENOSPC; > + > + req = mbox_alloc_msg_tim_get_min_intvl(dev->mbox); > + if (req == NULL) > + return rc; > + > + req->clockfreq = clockfreq; > + req->clocksource = clk_src; > + rc = mbox_process_msg(dev->mbox, (void **)&rsp); > + if (rc < 0) { > + tim_err_desc(rc); > + return rc; > + } > + > + *intervalns = rsp->intvl_ns; > + *interval = rsp->intvl_cyc; > + > + return 0; > +} > + > int > roc_tim_lf_alloc(struct roc_tim *roc_tim, uint8_t ring_id, uint64_t *clk) > { > diff --git a/drivers/common/cnxk/roc_tim.h b/drivers/common/cnxk/roc_tim.h > index 159b021a31..392732eae2 100644 > --- a/drivers/common/cnxk/roc_tim.h > +++ b/drivers/common/cnxk/roc_tim.h > @@ -10,6 +10,8 @@ enum roc_tim_clk_src { > ROC_TIM_CLK_SRC_GPIO, > ROC_TIM_CLK_SRC_GTI, > ROC_TIM_CLK_SRC_PTP, > + ROC_TIM_CLK_SRC_SYNCE, > + ROC_TIM_CLK_SRC_BTS, > ROC_TIM_CLK_SRC_INVALID, > }; > > @@ -33,7 +35,12 @@ 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, > - uint32_t interval); > + uint32_t interval, uint64_t intervalns, > + uint64_t clockfreq); > +int __roc_api roc_tim_lf_interval(struct roc_tim *roc_tim, > + enum roc_tim_clk_src clk_src, > + uint64_t clockfreq, uint64_t *intervalns, > + uint64_t *interval); > int __roc_api roc_tim_lf_alloc(struct roc_tim *roc_tim, uint8_t ring_id, > uint64_t *clk); > int __roc_api roc_tim_lf_free(struct roc_tim *roc_tim, uint8_t ring_id); > diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map > index fff7902b25..5791629ce9 100644 > --- a/drivers/common/cnxk/version.map > +++ b/drivers/common/cnxk/version.map > @@ -279,6 +279,7 @@ INTERNAL { > roc_tim_lf_disable; > roc_tim_lf_enable; > roc_tim_lf_free; > + roc_tim_lf_interval; > roc_se_ctx_swap; > > local: *; > diff --git a/drivers/event/cnxk/cnxk_tim_evdev.c b/drivers/event/cnxk/cnxk_tim_evdev.c > index 9d40e336d7..369f198444 100644 > --- a/drivers/event/cnxk/cnxk_tim_evdev.c > +++ b/drivers/event/cnxk/cnxk_tim_evdev.c > @@ -2,6 +2,8 @@ > * Copyright(C) 2021 Marvell. > */ > > +#include > + > #include "cnxk_eventdev.h" > #include "cnxk_tim_evdev.h" > > @@ -120,7 +122,10 @@ cnxk_tim_ring_create(struct rte_event_timer_adapter *adptr) > { > struct rte_event_timer_adapter_conf *rcfg = &adptr->data->conf; > struct cnxk_tim_evdev *dev = cnxk_tim_priv_get(); > + uint64_t min_intvl_ns, min_intvl_cyc; > struct cnxk_tim_ring *tim_ring; > + enum roc_tim_clk_src clk_src; > + uint64_t clk_freq = 0; > int i, rc; > > if (dev == NULL) > @@ -139,25 +144,52 @@ cnxk_tim_ring_create(struct rte_event_timer_adapter *adptr) > goto tim_ring_free; > } > > - if (NSEC2TICK(RTE_ALIGN_MUL_CEIL( > - rcfg->timer_tick_ns, > - cnxk_tim_min_resolution_ns(cnxk_tim_cntfrq())), > - cnxk_tim_cntfrq()) < > - cnxk_tim_min_tmo_ticks(cnxk_tim_cntfrq())) { > - if (rcfg->flags & RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES) > - rcfg->timer_tick_ns = TICK2NSEC( > - cnxk_tim_min_tmo_ticks(cnxk_tim_cntfrq()), > - cnxk_tim_cntfrq()); > - else { > + clk_src = cnxk_tim_convert_clk_src(rcfg->clk_src); > + if (clk_src == ROC_TIM_CLK_SRC_INVALID) { > + plt_err("Invalid clock source"); > + goto tim_hw_free; > + } > + > + rc = cnxk_tim_get_clk_freq(dev, clk_src, &clk_freq); > + if (rc < 0) { > + plt_err("Failed to get clock frequency"); > + goto tim_hw_free; > + } > + > + rc = roc_tim_lf_interval(&dev->tim, clk_src, clk_freq, &min_intvl_ns, > + &min_intvl_cyc); > + if (rc < 0) { > + plt_err("Failed to get min interval details"); > + goto tim_hw_free; > + } > + > + if (rcfg->timer_tick_ns < min_intvl_ns) { > + if (rcfg->flags & RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES) { > + rcfg->timer_tick_ns = min_intvl_ns; > + } else { > rc = -ERANGE; > goto tim_hw_free; > } > } > + > + if (rcfg->timer_tick_ns > rcfg->max_tmo_ns) { > + plt_err("Max timeout to too high"); > + rc = -ERANGE; > + goto tim_hw_free; > + } > + > + /* Round */ > + tim_ring->tck_nsec = > + round(RTE_ALIGN_MUL_NEAR((long double)rcfg->timer_tick_ns, > + cnxk_tim_ns_per_tck(clk_freq))); > + > + tim_ring->tck_int = round((long double)tim_ring->tck_nsec / > + cnxk_tim_ns_per_tck(clk_freq)); > + tim_ring->tck_nsec = > + ceil(tim_ring->tck_int * cnxk_tim_ns_per_tck(clk_freq)); > + > tim_ring->ring_id = adptr->data->id; > - tim_ring->clk_src = (int)rcfg->clk_src; > - tim_ring->tck_nsec = RTE_ALIGN_MUL_CEIL( > - rcfg->timer_tick_ns, > - cnxk_tim_min_resolution_ns(cnxk_tim_cntfrq())); > + tim_ring->clk_src = clk_src; > tim_ring->max_tout = rcfg->max_tmo_ns; > tim_ring->nb_bkts = (tim_ring->max_tout / tim_ring->tck_nsec); > tim_ring->nb_timers = rcfg->nb_timers; > @@ -201,11 +233,9 @@ cnxk_tim_ring_create(struct rte_event_timer_adapter *adptr) > if (rc < 0) > goto tim_bkt_free; > > - rc = roc_tim_lf_config( > - &dev->tim, tim_ring->ring_id, > - cnxk_tim_convert_clk_src(tim_ring->clk_src), 0, 0, > - tim_ring->nb_bkts, tim_ring->chunk_sz, > - NSEC2TICK(tim_ring->tck_nsec, cnxk_tim_cntfrq())); > + rc = roc_tim_lf_config(&dev->tim, tim_ring->ring_id, clk_src, 0, 0, > + tim_ring->nb_bkts, tim_ring->chunk_sz, > + tim_ring->tck_int, tim_ring->tck_nsec, clk_freq); > if (rc < 0) { > plt_err("Failed to configure timer ring"); > goto tim_chnk_free; > @@ -300,7 +330,6 @@ cnxk_tim_ring_start(const struct rte_event_timer_adapter *adptr) > if (rc < 0) > return rc; > > - tim_ring->tck_int = NSEC2TICK(tim_ring->tck_nsec, cnxk_tim_cntfrq()); > tim_ring->tot_int = tim_ring->tck_int * tim_ring->nb_bkts; > tim_ring->fast_div = rte_reciprocal_value_u64(tim_ring->tck_int); > tim_ring->fast_bkt = rte_reciprocal_value_u64(tim_ring->nb_bkts); > diff --git a/drivers/event/cnxk/cnxk_tim_evdev.h b/drivers/event/cnxk/cnxk_tim_evdev.h > index c369f6f472..4afbcb8fb2 100644 > --- a/drivers/event/cnxk/cnxk_tim_evdev.h > +++ b/drivers/event/cnxk/cnxk_tim_evdev.h > @@ -97,13 +97,6 @@ struct cnxk_tim_evdev { > struct cnxk_tim_ctl *ring_ctl_data; > }; > > -enum cnxk_tim_clk_src { > - CNXK_TIM_CLK_SRC_10NS = RTE_EVENT_TIMER_ADAPTER_CPU_CLK, > - CNXK_TIM_CLK_SRC_GPIO = RTE_EVENT_TIMER_ADAPTER_EXT_CLK0, > - CNXK_TIM_CLK_SRC_GTI = RTE_EVENT_TIMER_ADAPTER_EXT_CLK1, > - CNXK_TIM_CLK_SRC_PTP = RTE_EVENT_TIMER_ADAPTER_EXT_CLK2, > -}; > - > struct cnxk_tim_bkt { > uint64_t first_chunk; > union { > @@ -146,7 +139,7 @@ struct cnxk_tim_ring { > uint64_t max_tout; > uint64_t nb_chunks; > uint64_t chunk_sz; > - enum cnxk_tim_clk_src clk_src; > + enum roc_tim_clk_src clk_src; > } __rte_cache_aligned; > > struct cnxk_tim_ent { > @@ -166,32 +159,13 @@ cnxk_tim_priv_get(void) > return mz->addr; > } > > -static inline uint64_t > -cnxk_tim_min_tmo_ticks(uint64_t freq) > +static inline long double > +cnxk_tim_ns_per_tck(uint64_t freq) > { > - if (roc_model_runtime_is_cn9k()) > - return CN9K_TIM_MIN_TMO_TKS; > - else /* CN10K min tick is of 1us */ > - return freq / USECPERSEC; > + return (long double)NSECPERSEC / freq; > } > > -static inline uint64_t > -cnxk_tim_min_resolution_ns(uint64_t freq) > -{ > - return NSECPERSEC / freq; > -} > > -static inline enum roc_tim_clk_src > -cnxk_tim_convert_clk_src(enum cnxk_tim_clk_src clk_src) > -{ > - switch (clk_src) { > - case RTE_EVENT_TIMER_ADAPTER_CPU_CLK: > - return roc_model_runtime_is_cn9k() ? ROC_TIM_CLK_SRC_10NS : > - ROC_TIM_CLK_SRC_GTI; > - default: > - return ROC_TIM_CLK_SRC_INVALID; > - } > -} > > #ifdef RTE_ARCH_ARM64 > static inline uint64_t > @@ -225,6 +199,51 @@ cnxk_tim_cntfrq(void) > } > #endif > > +static inline enum roc_tim_clk_src > +cnxk_tim_convert_clk_src(enum rte_event_timer_adapter_clk_src clk_src) > +{ > + switch (clk_src) { > + case RTE_EVENT_TIMER_ADAPTER_CPU_CLK: > + return ROC_TIM_CLK_SRC_GTI; > + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK0: > + return ROC_TIM_CLK_SRC_10NS; > + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK1: > + return ROC_TIM_CLK_SRC_GPIO; > + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK2: > + return ROC_TIM_CLK_SRC_PTP; > + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK3: > + return roc_model_constant_is_cn9k() ? ROC_TIM_CLK_SRC_INVALID : > + ROC_TIM_CLK_SRC_SYNCE; > + default: > + return ROC_TIM_CLK_SRC_INVALID; > + } > +} > + > +static inline int > +cnxk_tim_get_clk_freq(struct cnxk_tim_evdev *dev, enum roc_tim_clk_src clk_src, > + uint64_t *freq) > +{ > + if (freq == NULL) > + return -EINVAL; > + > + PLT_SET_USED(dev); > + switch (clk_src) { > + case ROC_TIM_CLK_SRC_GTI: > + *freq = cnxk_tim_cntfrq(); > + break; > + case ROC_TIM_CLK_SRC_10NS: > + *freq = 1E8; > + break; > + case ROC_TIM_CLK_SRC_GPIO: > + case ROC_TIM_CLK_SRC_PTP: > + case ROC_TIM_CLK_SRC_SYNCE: > + default: > + return -EINVAL; > + } > + > + return 0; > +} > + > #define TIM_ARM_FASTPATH_MODES \ > FP(sp, 0, 0, 0, CNXK_TIM_ENA_DFB | CNXK_TIM_SP) \ > FP(mp, 0, 0, 1, CNXK_TIM_ENA_DFB | CNXK_TIM_MP) \ > -- > 2.17.1 >