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