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
20union 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
37union opcode_info {
38 u16 flags;
39 struct {
40 u8 major;
41 u8 minor;
42 } s;
43};
44
45struct cptvf_request {
46 union opcode_info opcode;
47 u16 param1;
48 u16 param2;
49 u16 dlen;
50};
51
52struct buf_ptr {
53 u8 *vptr;
54 dma_addr_t dma_addr;
55 u16 size;
56};
57
58struct 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
74struct 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
90struct 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 */
114union vq_cmd_word0 {
115 u64 u64;
116 struct {
117 __be16 opcode;
118 __be16 param1;
119 __be16 param2;
120 __be16 dlen;
121 } s;
122};
123
124union 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
137struct cpt_vq_command {
138 union vq_cmd_word0 cmd;
139 u64 dptr;
140 u64 rptr;
141 union vq_cmd_word3 cptr;
142};
143
144void vq_post_process(struct cpt_vf *cptvf, u32 qno);
145int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req);
146#endif /* __REQUEST_MANAGER_H */
147

source code of linux/drivers/crypto/cavium/cpt/request_manager.h