xref: /dpdk/drivers/common/cpt/cpt_common.h (revision e12a0166c80f65e35408f4715b2f3a60763c3741)
10dc1cffaSAnkur Dwivedi /* SPDX-License-Identifier: BSD-3-Clause
20dc1cffaSAnkur Dwivedi  * Copyright(c) 2018 Cavium, Inc
30dc1cffaSAnkur Dwivedi  */
40dc1cffaSAnkur Dwivedi 
50dc1cffaSAnkur Dwivedi #ifndef _CPT_COMMON_H_
60dc1cffaSAnkur Dwivedi #define _CPT_COMMON_H_
70dc1cffaSAnkur Dwivedi 
8c9902a15SDavid George #include <rte_prefetch.h>
9ec54bc9dSAnoob Joseph #include <rte_mempool.h>
10ec54bc9dSAnoob Joseph 
110dc1cffaSAnkur Dwivedi /*
120dc1cffaSAnkur Dwivedi  * This file defines common macros and structs
130dc1cffaSAnkur Dwivedi  */
140dc1cffaSAnkur Dwivedi 
1589f1a8d6STejasree Kondoj #define TIME_IN_RESET_COUNT	5
1689f1a8d6STejasree Kondoj 
17ac4d88afSTejasree Kondoj /* Default command timeout in seconds */
18ac4d88afSTejasree Kondoj #define DEFAULT_COMMAND_TIMEOUT	4
19ac4d88afSTejasree Kondoj 
200961348fSMurthy NSSR #define CPT_COUNT_THOLD		32
210961348fSMurthy NSSR #define CPT_TIMER_THOLD		0x3F
220961348fSMurthy NSSR 
238846a756SAnoob Joseph #define MOD_INC(i, l)   ((i) == (l - 1) ? (i) = 0 : (i)++)
248846a756SAnoob Joseph 
25ec54bc9dSAnoob Joseph struct cpt_qp_meta_info {
26ec54bc9dSAnoob Joseph 	struct rte_mempool *pool;
27ec54bc9dSAnoob Joseph 	int sg_mlen;
28ec54bc9dSAnoob Joseph 	int lb_mlen;
290dc1cffaSAnkur Dwivedi };
300dc1cffaSAnkur Dwivedi 
310dc1cffaSAnkur Dwivedi /*
320dc1cffaSAnkur Dwivedi  * Pending queue structure
330dc1cffaSAnkur Dwivedi  *
340dc1cffaSAnkur Dwivedi  */
350dc1cffaSAnkur Dwivedi struct pending_queue {
36a03a7bfbSAnoob Joseph 	/** Array of pending requests */
37c9902a15SDavid George 	void **rid_queue;
380dc1cffaSAnkur Dwivedi 	/** Tail of queue to be used for enqueue */
39c9902a15SDavid George 	unsigned int tail;
400dc1cffaSAnkur Dwivedi 	/** Head of queue to be used for dequeue */
41c9902a15SDavid George 	unsigned int head;
420dc1cffaSAnkur Dwivedi };
430dc1cffaSAnkur Dwivedi 
4427595cd8STyler Retzlaff struct __rte_aligned(8) cpt_request_info {
458846a756SAnoob Joseph 	/** Data path fields */
468846a756SAnoob Joseph 	uint64_t comp_baddr;
478846a756SAnoob Joseph 	volatile uint64_t *completion_addr;
488846a756SAnoob Joseph 	volatile uint64_t *alternate_caddr;
498846a756SAnoob Joseph 	void *op;
508846a756SAnoob Joseph 	struct {
518846a756SAnoob Joseph 		uint64_t ei0;
528846a756SAnoob Joseph 		uint64_t ei1;
538846a756SAnoob Joseph 		uint64_t ei2;
548846a756SAnoob Joseph 	} ist;
55e9a356e2SSunila Sahu 	uint8_t *rptr;
5644a2cebbSShijith Thotton 	const void *qp;
578846a756SAnoob Joseph 
588846a756SAnoob Joseph 	/** Control path fields */
598846a756SAnoob Joseph 	uint64_t time_out;
608846a756SAnoob Joseph 	uint8_t extra_time;
6127595cd8STyler Retzlaff };
628846a756SAnoob Joseph 
63c9902a15SDavid George static __rte_always_inline void
pending_queue_push(struct pending_queue * q,void * rid,unsigned int off,const int qsize)64c9902a15SDavid George pending_queue_push(struct pending_queue *q, void *rid, unsigned int off,
65c9902a15SDavid George 			const int qsize)
66c9902a15SDavid George {
67c9902a15SDavid George 	/* NOTE: no free space check, but it is expected that one is made */
68c9902a15SDavid George 	q->rid_queue[(q->tail + off) & (qsize - 1)] = rid;
69c9902a15SDavid George }
70c9902a15SDavid George 
71c9902a15SDavid George static __rte_always_inline void
pending_queue_commit(struct pending_queue * q,unsigned int cnt,const unsigned int qsize)72c9902a15SDavid George pending_queue_commit(struct pending_queue *q, unsigned int cnt,
73c9902a15SDavid George 			const unsigned int qsize)
74c9902a15SDavid George {
75c9902a15SDavid George 	/* Ensure ordering between setting the entry and updating the tail */
76*e12a0166STyler Retzlaff 	rte_atomic_thread_fence(rte_memory_order_release);
77c9902a15SDavid George 
78c9902a15SDavid George 	q->tail = (q->tail + cnt) & (qsize - 1);
79c9902a15SDavid George }
80c9902a15SDavid George 
81c9902a15SDavid George static __rte_always_inline void
pending_queue_pop(struct pending_queue * q,const int qsize)82c9902a15SDavid George pending_queue_pop(struct pending_queue *q, const int qsize)
83c9902a15SDavid George {
84c9902a15SDavid George 	/* NOTE: no empty check, but it is expected that one is made prior */
85c9902a15SDavid George 
86c9902a15SDavid George 	q->head = (q->head + 1) & (qsize - 1);
87c9902a15SDavid George }
88c9902a15SDavid George 
89c9902a15SDavid George static __rte_always_inline void
pending_queue_peek(struct pending_queue * q,void ** rid,const int qsize,int prefetch_next)90c9902a15SDavid George pending_queue_peek(struct pending_queue *q, void **rid, const int qsize,
91c9902a15SDavid George 			int prefetch_next)
92c9902a15SDavid George {
93c9902a15SDavid George 	void *next_rid;
94c9902a15SDavid George 	/* NOTE: no empty check, but it is expected that one is made */
95c9902a15SDavid George 
96c9902a15SDavid George 	*rid = q->rid_queue[q->head];
97c9902a15SDavid George 
98c9902a15SDavid George 	if (likely(prefetch_next)) {
99c9902a15SDavid George 		next_rid = q->rid_queue[(q->head + 1) & (qsize - 1)];
100c9902a15SDavid George 		rte_prefetch_non_temporal((void *)next_rid);
101c9902a15SDavid George 	}
102c9902a15SDavid George }
103c9902a15SDavid George 
104c9902a15SDavid George static __rte_always_inline unsigned int
pending_queue_level(struct pending_queue * q,const int qsize)105c9902a15SDavid George pending_queue_level(struct pending_queue *q, const int qsize)
106c9902a15SDavid George {
107c9902a15SDavid George 	return (q->tail - q->head) & (qsize - 1);
108c9902a15SDavid George }
109c9902a15SDavid George 
110c9902a15SDavid George static __rte_always_inline unsigned int
pending_queue_free_slots(struct pending_queue * q,const int qsize,const int reserved_slots)111c9902a15SDavid George pending_queue_free_slots(struct pending_queue *q, const int qsize,
112c9902a15SDavid George 		const int reserved_slots)
113c9902a15SDavid George {
114c9902a15SDavid George 	int free_slots;
115c9902a15SDavid George 
116c9902a15SDavid George 	free_slots = qsize - pending_queue_level(q, qsize);
117c9902a15SDavid George 
118c9902a15SDavid George 	/* Use only use qsize - 1 */
119c9902a15SDavid George 	free_slots -= 1 + reserved_slots;
120c9902a15SDavid George 
121c9902a15SDavid George 	if (unlikely(free_slots < 0))
122c9902a15SDavid George 		return 0;
123c9902a15SDavid George 
124c9902a15SDavid George 	return free_slots;
125c9902a15SDavid George }
126c9902a15SDavid George 
1270dc1cffaSAnkur Dwivedi #endif /* _CPT_COMMON_H_ */
128