xref: /dpdk/drivers/common/dpaax/caamflib/rta/seq_in_out_ptr_cmd.h (revision c0ded849131598760a25e96ff368d035838af0b3)
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2008-2016 Freescale Semiconductor Inc.
4  * Copyright 2016,2019 NXP
5  */
6 
7 #ifndef __RTA_SEQ_IN_OUT_PTR_CMD_H__
8 #define __RTA_SEQ_IN_OUT_PTR_CMD_H__
9 
10 extern enum rta_sec_era rta_sec_era;
11 
12 /* Allowed SEQ IN PTR flags for each SEC Era. */
13 static const uint32_t seq_in_ptr_flags[] = {
14 	RBS | INL | SGF | PRE | EXT | RTO,
15 	RBS | INL | SGF | PRE | EXT | RTO | RJD,
16 	RBS | INL | SGF | PRE | EXT | RTO | RJD,
17 	RBS | INL | SGF | PRE | EXT | RTO | RJD,
18 	RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
19 	RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
20 	RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
21 	RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
22 	RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
23 	RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP
24 };
25 
26 /* Allowed SEQ OUT PTR flags for each SEC Era. */
27 static const uint32_t seq_out_ptr_flags[] = {
28 	SGF | PRE | EXT,
29 	SGF | PRE | EXT | RTO,
30 	SGF | PRE | EXT | RTO,
31 	SGF | PRE | EXT | RTO,
32 	SGF | PRE | EXT | RTO | RST | EWS,
33 	SGF | PRE | EXT | RTO | RST | EWS,
34 	SGF | PRE | EXT | RTO | RST | EWS,
35 	SGF | PRE | EXT | RTO | RST | EWS,
36 	SGF | PRE | EXT | RTO | RST | EWS,
37 	SGF | PRE | EXT | RTO | RST | EWS
38 };
39 
40 static inline int
rta_seq_in_ptr(struct program * program,uint64_t src,uint32_t length,uint32_t flags)41 rta_seq_in_ptr(struct program *program, uint64_t src,
42 	       uint32_t length, uint32_t flags)
43 {
44 	uint32_t opcode = CMD_SEQ_IN_PTR;
45 	unsigned int start_pc = program->current_pc;
46 	int ret = -EINVAL;
47 
48 	/* Parameters checking */
49 	if ((flags & RTO) && (flags & PRE)) {
50 		pr_err("SEQ IN PTR: Invalid usage of RTO and PRE flags\n");
51 		goto err;
52 	}
53 	if (flags & ~seq_in_ptr_flags[rta_sec_era]) {
54 		pr_err("SEQ IN PTR: Flag(s) not supported by SEC Era %d\n",
55 		       USER_SEC_ERA(rta_sec_era));
56 		goto err;
57 	}
58 	if ((flags & INL) && (flags & RJD)) {
59 		pr_err("SEQ IN PTR: Invalid usage of INL and RJD flags\n");
60 		goto err;
61 	}
62 	if ((src) && (flags & (SOP | RTO | PRE))) {
63 		pr_err("SEQ IN PTR: Invalid usage of RTO or PRE flag\n");
64 		goto err;
65 	}
66 	if ((flags & SOP) && (flags & (RBS | PRE | RTO | EXT))) {
67 		pr_err("SEQ IN PTR: Invalid usage of SOP and (RBS or PRE or RTO or EXT) flags\n");
68 		goto err;
69 	}
70 
71 	/* write flag fields */
72 	if (flags & RBS)
73 		opcode |= SQIN_RBS;
74 	if (flags & INL)
75 		opcode |= SQIN_INL;
76 	if (flags & SGF)
77 		opcode |= SQIN_SGF;
78 	if (flags & PRE)
79 		opcode |= SQIN_PRE;
80 	if (flags & RTO)
81 		opcode |= SQIN_RTO;
82 	if (flags & RJD)
83 		opcode |= SQIN_RJD;
84 	if (flags & SOP)
85 		opcode |= SQIN_SOP;
86 	if ((length >> 16) || (flags & EXT)) {
87 		if (flags & SOP) {
88 			pr_err("SEQ IN PTR: Invalid usage of SOP and EXT flags\n");
89 			goto err;
90 		}
91 
92 		opcode |= SQIN_EXT;
93 	} else {
94 		opcode |= length & SQIN_LEN_MASK;
95 	}
96 
97 	__rta_out32(program, opcode);
98 	program->current_instruction++;
99 
100 	/* write pointer or immediate data field */
101 	if (!(opcode & (SQIN_PRE | SQIN_RTO | SQIN_SOP)))
102 		__rta_out64(program, program->ps, src);
103 
104 	/* write extended length field */
105 	if (opcode & SQIN_EXT)
106 		__rta_out32(program, length);
107 
108 	return (int)start_pc;
109 
110  err:
111 	program->first_error_pc = start_pc;
112 	program->current_instruction++;
113 	return ret;
114 }
115 
116 static inline int
rta_seq_out_ptr(struct program * program,uint64_t dst,uint32_t length,uint32_t flags)117 rta_seq_out_ptr(struct program *program, uint64_t dst,
118 		uint32_t length, uint32_t flags)
119 {
120 	uint32_t opcode = CMD_SEQ_OUT_PTR;
121 	unsigned int start_pc = program->current_pc;
122 	int ret = -EINVAL;
123 
124 	/* Parameters checking */
125 	if (flags & ~seq_out_ptr_flags[rta_sec_era]) {
126 		pr_err("SEQ OUT PTR: Flag(s) not supported by SEC Era %d\n",
127 		       USER_SEC_ERA(rta_sec_era));
128 		goto err;
129 	}
130 	if ((flags & RTO) && (flags & PRE)) {
131 		pr_err("SEQ OUT PTR: Invalid usage of RTO and PRE flags\n");
132 		goto err;
133 	}
134 	if ((dst) && (flags & (RTO | PRE))) {
135 		pr_err("SEQ OUT PTR: Invalid usage of RTO or PRE flag\n");
136 		goto err;
137 	}
138 	if ((flags & RST) && !(flags & RTO)) {
139 		pr_err("SEQ OUT PTR: RST flag must be used with RTO flag\n");
140 		goto err;
141 	}
142 
143 	/* write flag fields */
144 	if (flags & SGF)
145 		opcode |= SQOUT_SGF;
146 	if (flags & PRE)
147 		opcode |= SQOUT_PRE;
148 	if (flags & RTO)
149 		opcode |= SQOUT_RTO;
150 	if (flags & RST)
151 		opcode |= SQOUT_RST;
152 	if (flags & EWS)
153 		opcode |= SQOUT_EWS;
154 	if ((length >> 16) || (flags & EXT))
155 		opcode |= SQOUT_EXT;
156 	else
157 		opcode |= length & SQOUT_LEN_MASK;
158 
159 	__rta_out32(program, opcode);
160 	program->current_instruction++;
161 
162 	/* write pointer or immediate data field */
163 	if (!(opcode & (SQOUT_PRE | SQOUT_RTO)))
164 		__rta_out64(program, program->ps, dst);
165 
166 	/* write extended length field */
167 	if (opcode & SQOUT_EXT)
168 		__rta_out32(program, length);
169 
170 	return (int)start_pc;
171 
172  err:
173 	program->first_error_pc = start_pc;
174 	program->current_instruction++;
175 	return ret;
176 }
177 
178 #endif /* __RTA_SEQ_IN_OUT_PTR_CMD_H__ */
179