2 * Copyright 2008-2016 Freescale Semiconductor, Inc.
4 * SPDX-License-Identifier: BSD-3-Clause or GPL-2.0+
7 #ifndef __RTA_SEQ_IN_OUT_PTR_CMD_H__
8 #define __RTA_SEQ_IN_OUT_PTR_CMD_H__
10 extern enum rta_sec_era rta_sec_era;
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
24 /* Allowed SEQ OUT PTR flags for each SEC Era. */
25 static const uint32_t seq_out_ptr_flags[] = {
27 SGF | PRE | EXT | RTO,
28 SGF | PRE | EXT | RTO,
29 SGF | PRE | EXT | RTO,
30 SGF | PRE | EXT | RTO | RST | EWS,
31 SGF | PRE | EXT | RTO | RST | EWS,
32 SGF | PRE | EXT | RTO | RST | EWS,
33 SGF | PRE | EXT | RTO | RST | EWS
37 rta_seq_in_ptr(struct program *program, uint64_t src,
38 uint32_t length, uint32_t flags)
40 uint32_t opcode = CMD_SEQ_IN_PTR;
41 unsigned int start_pc = program->current_pc;
44 /* Parameters checking */
45 if ((flags & RTO) && (flags & PRE)) {
46 pr_err("SEQ IN PTR: Invalid usage of RTO and PRE flags\n");
49 if (flags & ~seq_in_ptr_flags[rta_sec_era]) {
50 pr_err("SEQ IN PTR: Flag(s) not supported by SEC Era %d\n",
51 USER_SEC_ERA(rta_sec_era));
54 if ((flags & INL) && (flags & RJD)) {
55 pr_err("SEQ IN PTR: Invalid usage of INL and RJD flags\n");
58 if ((src) && (flags & (SOP | RTO | PRE))) {
59 pr_err("SEQ IN PTR: Invalid usage of RTO or PRE flag\n");
62 if ((flags & SOP) && (flags & (RBS | PRE | RTO | EXT))) {
63 pr_err("SEQ IN PTR: Invalid usage of SOP and (RBS or PRE or RTO or EXT) flags\n");
67 /* write flag fields */
82 if ((length >> 16) || (flags & EXT)) {
84 pr_err("SEQ IN PTR: Invalid usage of SOP and EXT flags\n");
90 opcode |= length & SQIN_LEN_MASK;
93 __rta_out32(program, opcode);
94 program->current_instruction++;
96 /* write pointer or immediate data field */
97 if (!(opcode & (SQIN_PRE | SQIN_RTO | SQIN_SOP)))
98 __rta_out64(program, program->ps, src);
100 /* write extended length field */
101 if (opcode & SQIN_EXT)
102 __rta_out32(program, length);
104 return (int)start_pc;
107 program->first_error_pc = start_pc;
108 program->current_instruction++;
113 rta_seq_out_ptr(struct program *program, uint64_t dst,
114 uint32_t length, uint32_t flags)
116 uint32_t opcode = CMD_SEQ_OUT_PTR;
117 unsigned int start_pc = program->current_pc;
120 /* Parameters checking */
121 if (flags & ~seq_out_ptr_flags[rta_sec_era]) {
122 pr_err("SEQ OUT PTR: Flag(s) not supported by SEC Era %d\n",
123 USER_SEC_ERA(rta_sec_era));
126 if ((flags & RTO) && (flags & PRE)) {
127 pr_err("SEQ OUT PTR: Invalid usage of RTO and PRE flags\n");
130 if ((dst) && (flags & (RTO | PRE))) {
131 pr_err("SEQ OUT PTR: Invalid usage of RTO or PRE flag\n");
134 if ((flags & RST) && !(flags & RTO)) {
135 pr_err("SEQ OUT PTR: RST flag must be used with RTO flag\n");
139 /* write flag fields */
150 if ((length >> 16) || (flags & EXT))
153 opcode |= length & SQOUT_LEN_MASK;
155 __rta_out32(program, opcode);
156 program->current_instruction++;
158 /* write pointer or immediate data field */
159 if (!(opcode & (SQOUT_PRE | SQOUT_RTO)))
160 __rta_out64(program, program->ps, dst);
162 /* write extended length field */
163 if (opcode & SQOUT_EXT)
164 __rta_out32(program, length);
166 return (int)start_pc;
169 program->first_error_pc = start_pc;
170 program->current_instruction++;
174 #endif /* __RTA_SEQ_IN_OUT_PTR_CMD_H__ */