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