[dpdk-dev] [PATCH v3 03/12] event/octeontx: add support to create and free timer adapter
Jerin Jacob
jerin.jacob at caviumnetworks.com
Sun Apr 8 09:39:30 CEST 2018
-----Original Message-----
> Date: Tue, 3 Apr 2018 20:35:05 +0530
> From: Pavan Nikhilesh <pbhagavatula at caviumnetworks.com>
> To: jerin.jacob at caviumnetworks.com, santosh.shukla at caviumnetworks.com,
> erik.g.carrillo at intel.com
> Cc: dev at dpdk.org, Pavan Nikhilesh <pbhagavatula at caviumnetworks.com>
> Subject: [dpdk-dev] [PATCH v3 03/12] event/octeontx: add support to create
> and free timer adapter
> X-Mailer: git-send-email 2.16.3
>
> When the application requests to create a timer device, Octeontx TIM
> create does the following:
> - Get the requested TIMvf ring based on adapter_id.
> - Verify the config parameters supplied.
> - Allocate memory required for
> * Buckets based on min and max timeout supplied.
> * Allocate the chunk pool based on the number of timers.
> - Clear the interrupts.
>
> On Free:
> - Free the allocated bucket and chunk memory.
> - Free private data used by TIMvf.
>
> Signed-off-by: Pavan Nikhilesh <pbhagavatula at caviumnetworks.com>
> ---
> +static int
> +timvf_ring_create(struct rte_event_timer_adapter *adptr)
> +{
> +
> + switch (rcfg->clk_src) {
> + case RTE_EVENT_TIMER_ADAPTER_CPU_CLK:
while defining the enum, equate TIM_CLK_SRC_SCLK, TIM_CLK_SRC_GPIO..
values to RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
RTE_EVENT_TIMER_ADAPTER_EXT_CLK0 ..
etc to avoid switch case.
> + timr->clk_src = TIM_CLK_SRC_SCLK;
> + break;
> + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK0:
> + timr->clk_src = TIM_CLK_SRC_GPIO;
> + break;
> + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK1:
> + timr->clk_src = TIM_CLK_SRC_GTI;
> + break;
> + case RTE_EVENT_TIMER_ADAPTER_EXT_CLK2:
> + timr->clk_src = TIM_CLK_SRC_PTP;
> + break;
> + default:
> + timvf_log_err("Invalid clk source specified.");
> + goto cfg_err;
> + }
> +
> + timvf_write64(0, (uint8_t *)timr->vbar0 + TIM_VRING_BASE);
> + timvf_write64(0, (uint8_t *)timr->vbar0 + TIM_VF_NRSPERR_INT);
> + timvf_write64(0, (uint8_t *)timr->vbar0 + TIM_VF_NRSPERR_INT_W1S);
> + timvf_write64(0x7, (uint8_t *)timr->vbar0 + TIM_VF_NRSPERR_ENA_W1C);
> + timvf_write64(0x7, (uint8_t *)timr->vbar0 + TIM_VF_NRSPERR_ENA_W1S);
> +
> + return 0;
> +mem_err:
> + rte_free(timr);
> + return -ENOMEM;
> +cfg_err:
> + rte_free(timr);
> + return -EINVAL;
> +}
> +
> +static int
> +timvf_ring_free(struct rte_event_timer_adapter *adptr)
> +{
> + struct timvf_ring *timr = adptr->data->adapter_priv;
> + rte_mempool_free(timr->meta.chunk_pool);
> + rte_free(timr->meta.bkt);
> + rte_free(adptr->data->adapter_priv);
> + return 0;
> +}
> +
> +static struct rte_event_timer_adapter_ops timvf_ops = {
use const
> + .init = timvf_ring_create,
Found additional tab
> + .uninit = timvf_ring_free,
> + .get_info = timvf_ring_info_get,
> +};
> +
> +int
> +timvf_timer_adapter_caps_get(const struct rte_eventdev *dev, uint64_t flags,
> + uint32_t *caps, const struct rte_event_timer_adapter_ops **ops)
> +{
> + RTE_SET_USED(dev);
> + RTE_SET_USED(flags);
> + *caps = RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT;
> + *ops = &timvf_ops;
> + return -EINVAL;
> +}
> +enum timvf_clk_src {
> + TIM_CLK_SRC_SCLK,
See above comment.
> + TIM_CLK_SRC_GPIO,
> + TIM_CLK_SRC_GTI,
> + TIM_CLK_SRC_PTP,
> +};
> +
> +struct timvf_meta {
> + bkt_id get_target_bkt;
> + refill_chunk refill_chunk;
> + struct rte_reciprocal_u64 fast_div;
> + uint64_t ring_start_cyc;
> + uint32_t nb_bkts;
> + struct tim_mem_bucket *bkt;
> + void *chunk_pool;
> + uint64_t tck_int;
> +};
> +
> +struct timvf_ring {
> + struct timvf_meta meta;
IMO, Additional 'meta' indirection can be avoid to reduce the code
clutter.
> + uint64_t tck_nsec;
> + void *vbar0;
> + void *bkt_pos;
> + uint64_t max_tout;
> + uint64_t nb_chunks;
> + enum timvf_clk_src clk_src;
> + uint16_t tim_ring_id;
> +} __rte_cache_aligned;
> +
More information about the dev
mailing list