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