1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2016 Cavium, Inc.
4  */
5 
6 #ifndef __REQUEST_MANAGER_H
7 #define __REQUEST_MANAGER_H
8 
9 #include "cpt_common.h"
10 
11 #define TIME_IN_RESET_COUNT  5
12 #define COMPLETION_CODE_SIZE 8
13 #define COMPLETION_CODE_INIT 0
14 #define PENDING_THOLD  100
15 #define MAX_SG_IN_CNT 12
16 #define MAX_SG_OUT_CNT 13
17 #define SG_LIST_HDR_SIZE  8
18 #define MAX_BUF_CNT	16
19 
20 union ctrl_info {
21 	u32 flags;
22 	struct {
23 #if defined(__BIG_ENDIAN_BITFIELD)
24 		u32 reserved0:26;
25 		u32 grp:3; /* Group bits */
26 		u32 dma_mode:2; /* DMA mode */
27 		u32 se_req:1;/* To SE core */
28 #else
29 		u32 se_req:1; /* To SE core */
30 		u32 dma_mode:2; /* DMA mode */
31 		u32 grp:3; /* Group bits */
32 		u32 reserved0:26;
33 #endif
34 	} s;
35 };
36 
37 union opcode_info {
38 	u16 flags;
39 	struct {
40 		u8 major;
41 		u8 minor;
42 	} s;
43 };
44 
45 struct cptvf_request {
46 	union opcode_info opcode;
47 	u16 param1;
48 	u16 param2;
49 	u16 dlen;
50 };
51 
52 struct buf_ptr {
53 	u8 *vptr;
54 	dma_addr_t dma_addr;
55 	u16 size;
56 };
57 
58 struct cpt_request_info {
59 	u8 incnt; /* Number of input buffers */
60 	u8 outcnt; /* Number of output buffers */
61 	u16 rlen; /* Output length */
62 	union ctrl_info ctrl; /* User control information */
63 	struct cptvf_request req; /* Request Information (Core specific) */
64 
65 	bool may_sleep;
66 
67 	struct buf_ptr in[MAX_BUF_CNT];
68 	struct buf_ptr out[MAX_BUF_CNT];
69 
70 	void (*callback)(int, void *); /* Kernel ASYNC request callabck */
71 	void *callback_arg; /* Kernel ASYNC request callabck arg */
72 };
73 
74 struct sglist_component {
75 	union {
76 		u64 len;
77 		struct {
78 			__be16 len0;
79 			__be16 len1;
80 			__be16 len2;
81 			__be16 len3;
82 		} s;
83 	} u;
84 	__be64 ptr0;
85 	__be64 ptr1;
86 	__be64 ptr2;
87 	__be64 ptr3;
88 };
89 
90 struct cpt_info_buffer {
91 	struct cpt_vf *cptvf;
92 	unsigned long time_in;
93 	u8 extra_time;
94 
95 	struct cpt_request_info *req;
96 	dma_addr_t dptr_baddr;
97 	u32 dlen;
98 	dma_addr_t rptr_baddr;
99 	dma_addr_t comp_baddr;
100 	u8 *in_buffer;
101 	u8 *out_buffer;
102 	u8 *gather_components;
103 	u8 *scatter_components;
104 
105 	struct pending_entry *pentry;
106 	volatile u64 *completion_addr;
107 	volatile u64 *alternate_caddr;
108 };
109 
110 /*
111  * CPT_INST_S software command definitions
112  * Words EI (0-3)
113  */
114 union vq_cmd_word0 {
115 	u64 u64;
116 	struct {
117 		__be16 opcode;
118 		__be16 param1;
119 		__be16 param2;
120 		__be16 dlen;
121 	} s;
122 };
123 
124 union vq_cmd_word3 {
125 	u64 u64;
126 	struct {
127 #if defined(__BIG_ENDIAN_BITFIELD)
128 		u64 grp:3;
129 		u64 cptr:61;
130 #else
131 		u64 cptr:61;
132 		u64 grp:3;
133 #endif
134 	} s;
135 };
136 
137 struct cpt_vq_command {
138 	union vq_cmd_word0 cmd;
139 	u64 dptr;
140 	u64 rptr;
141 	union vq_cmd_word3 cptr;
142 };
143 
144 void vq_post_process(struct cpt_vf *cptvf, u32 qno);
145 int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req);
146 #endif /* __REQUEST_MANAGER_H */
147