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