1
2
3
4
5
6
7#ifndef __RTA_SEQ_IN_OUT_PTR_CMD_H__
8#define __RTA_SEQ_IN_OUT_PTR_CMD_H__
9
10extern enum rta_sec_era rta_sec_era;
11
12
13static 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
27static 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
40static inline int
41rta_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
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
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
101 if (!(opcode & (SQIN_PRE | SQIN_RTO | SQIN_SOP)))
102 __rta_out64(program, program->ps, src);
103
104
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
116static inline int
117rta_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
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
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
163 if (!(opcode & (SQOUT_PRE | SQOUT_RTO)))
164 __rta_out64(program, program->ps, dst);
165
166
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
179