1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 2019 Jernej Skrabec <jernej.skrabec@siol.net>
9 * VP8 in Cedrus shares same engine as H264.
11 * Note that it seems necessary to call bitstream parsing functions,
12 * to parse frame header, otherwise decoded image is garbage. This is
13 * contrary to what is driver supposed to do. However, values are not
14 * really used, so this might be acceptable. It's possible that bitstream
15 * parsing functions set some internal VPU state, which is later necessary
16 * for proper decoding. Biggest suspect is "VP8 probs update" trigger.
19 #include <linux/delay.h>
20 #include <linux/types.h>
22 #include <media/videobuf2-dma-contig.h>
25 #include "cedrus_hw.h"
26 #include "cedrus_regs.h"
28 #define CEDRUS_ENTROPY_PROBS_SIZE 0x2400
29 #define VP8_PROB_HALF 128
30 #define QUANT_DELTA_COUNT 5
33 * This table comes from the concatenation of k_coeff_entropy_update_probs,
34 * kf_ymode_prob, default_mv_context, etc. It is provided in this form in
35 * order to avoid computing it every time the driver is initialised, and is
36 * suitable for direct consumption by the hardware.
38 static const u8 prob_table_init[] = {
39 /* k_coeff_entropy_update_probs */
41 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
42 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
43 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
44 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
45 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
46 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 0xB0, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
51 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
52 0xDF, 0xF1, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
53 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0xF9, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
55 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0xFF, 0xF4, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
60 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
61 0xEA, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
62 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
64 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0xFF, 0xF6, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
69 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
70 0xEF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
71 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
72 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
73 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77 0xFF, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
78 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
79 0xFB, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
80 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
82 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
87 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
88 0xFB, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
89 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
91 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0xFF, 0xFE, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
96 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0xFA, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
98 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
100 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
105 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
107 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
109 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
115 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0xE1, 0xFC, 0xF1, 0xFD, 0xFF, 0xFF, 0xFE, 0xFF,
117 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
118 0xEA, 0xFA, 0xF1, 0xFA, 0xFD, 0xFF, 0xFD, 0xFE,
119 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
124 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
125 0xDF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
126 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0xEE, 0xFD, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
128 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0xFF, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
133 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
134 0xF9, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
135 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
136 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
137 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
142 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0xF7, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
144 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
146 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
151 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
153 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
155 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
160 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
162 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
164 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168 0xFF, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
169 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
171 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
173 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
178 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
179 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
180 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
182 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187 0xBA, 0xFB, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
188 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0xEA, 0xFB, 0xF4, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
190 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0xFB, 0xFB, 0xF3, 0xFD, 0xFE, 0xFF, 0xFE, 0xFF,
192 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
197 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
198 0xEC, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
199 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0xFB, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
201 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
206 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
208 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
210 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
215 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
216 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
217 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
219 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
224 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
226 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
228 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
233 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
235 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
237 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
242 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
244 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
246 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
251 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
253 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
255 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
261 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0xFA, 0xFE, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
263 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0xF8, 0xFE, 0xF9, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
265 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0xFF, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
270 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
271 0xF6, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
272 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
273 0xFC, 0xFE, 0xFB, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
274 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
278 0xFF, 0xFE, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
279 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
280 0xF8, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
281 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
282 0xFD, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
283 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0xFF, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
288 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0xF5, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
290 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0xFD, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
292 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296 0xFF, 0xFB, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
297 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0xFC, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
299 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
301 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
306 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0xF9, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
308 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
310 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
315 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
317 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
318 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
319 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
324 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
326 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
328 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332 /* kf_y_mode_probs */
333 0x91, 0x9C, 0xA3, 0x80, 0x00, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347 0x6E, 0x6F, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
350 0x78, 0x5A, 0x4F, 0x85, 0x57, 0x55, 0x50, 0x6F,
351 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 /* sub_mv_ref_prob */
356 0x93, 0x88, 0x12, 0x00,
357 0x6A, 0x91, 0x01, 0x00,
358 0xB3, 0x79, 0x01, 0x00,
359 0xDF, 0x01, 0x22, 0x00,
360 0xD0, 0x01, 0x01, 0x00,
361 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364 /* mv_counts_to_probs */
365 0x07, 0x01, 0x01, 0x8F,
366 0x0E, 0x12, 0x0E, 0x6B,
367 0x87, 0x40, 0x39, 0x44,
368 0x3C, 0x38, 0x80, 0x41,
369 0x9F, 0x86, 0x80, 0x22,
370 0xEA, 0xBC, 0x80, 0x1C,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381 0x84, 0x02, 0x04, 0x06, 0x80, 0x81, 0x82, 0x83,
384 0x80, 0x02, 0x04, 0x06, 0x81, 0x82, 0x83, 0x84,
387 0x80, 0x02, 0x81, 0x04, 0x82, 0x83, 0x00, 0x00,
388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392 0x02, 0x08, 0x04, 0x06, 0x80, 0x81, 0x82, 0x83,
393 0x0A, 0x0C, 0x84, 0x85, 0x86, 0x87, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 /* small_mv_tree again */
398 0x02, 0x08, 0x04, 0x06, 0x80, 0x81, 0x82, 0x83,
399 0x0A, 0x0C, 0x84, 0x85, 0x86, 0x87, 0x00, 0x00,
400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404 0x83, 0x02, 0x82, 0x04, 0x80, 0x81, 0x00, 0x00,
407 0x80, 0x02, 0x81, 0x04, 0x82, 0x06, 0x08, 0x0C,
408 0x83, 0x0A, 0x85, 0x86, 0x84, 0x0E, 0x87, 0x10,
409 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x8A, 0x02, 0x8B, 0x04, 0x8C, 0x8D, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x87, 0x02, 0x85, 0x04, 0x86, 0x06, 0x88, 0x89,
423 * This table is a copy of k_mv_entropy_update_probs from the VP8
426 * FIXME: If any other driver uses it, move this table to media/vp8-ctrls.h
428 static const u8 k_mv_entropy_update_probs[2][V4L2_VP8_MV_PROB_CNT] = {
429 { 237, 246, 253, 253, 254, 254, 254, 254, 254,
430 254, 254, 254, 254, 254, 250, 250, 252, 254, 254 },
431 { 231, 243, 245, 253, 254, 254, 254, 254, 254,
432 254, 254, 254, 254, 254, 251, 251, 254, 254, 254 }
435 static uint8_t read_bits(struct cedrus_dev *dev, unsigned int bits_count,
436 unsigned int probability)
438 cedrus_write(dev, VE_H264_TRIGGER_TYPE,
439 VE_H264_TRIGGER_TYPE_VP8_GET_BITS |
440 VE_H264_TRIGGER_TYPE_BIN_LENS(bits_count) |
441 VE_H264_TRIGGER_TYPE_PROBABILITY(probability));
443 cedrus_wait_for(dev, VE_H264_STATUS, VE_H264_STATUS_VLD_BUSY);
445 return cedrus_read(dev, VE_H264_BASIC_BITS);
448 static void get_delta_q(struct cedrus_dev *dev)
450 if (read_bits(dev, 1, VP8_PROB_HALF)) {
451 read_bits(dev, 4, VP8_PROB_HALF);
452 read_bits(dev, 1, VP8_PROB_HALF);
456 static void process_segmentation_info(struct cedrus_dev *dev)
460 update = read_bits(dev, 1, VP8_PROB_HALF);
462 if (read_bits(dev, 1, VP8_PROB_HALF)) {
463 read_bits(dev, 1, VP8_PROB_HALF);
465 for (i = 0; i < 4; i++)
466 if (read_bits(dev, 1, VP8_PROB_HALF)) {
467 read_bits(dev, 7, VP8_PROB_HALF);
468 read_bits(dev, 1, VP8_PROB_HALF);
471 for (i = 0; i < 4; i++)
472 if (read_bits(dev, 1, VP8_PROB_HALF)) {
473 read_bits(dev, 6, VP8_PROB_HALF);
474 read_bits(dev, 1, VP8_PROB_HALF);
479 for (i = 0; i < 3; i++)
480 if (read_bits(dev, 1, VP8_PROB_HALF))
481 read_bits(dev, 8, VP8_PROB_HALF);
484 static void process_ref_lf_delta_info(struct cedrus_dev *dev)
486 if (read_bits(dev, 1, VP8_PROB_HALF)) {
489 for (i = 0; i < 4; i++)
490 if (read_bits(dev, 1, VP8_PROB_HALF)) {
491 read_bits(dev, 6, VP8_PROB_HALF);
492 read_bits(dev, 1, VP8_PROB_HALF);
495 for (i = 0; i < 4; i++)
496 if (read_bits(dev, 1, VP8_PROB_HALF)) {
497 read_bits(dev, 6, VP8_PROB_HALF);
498 read_bits(dev, 1, VP8_PROB_HALF);
503 static void process_ref_frame_info(struct cedrus_dev *dev)
505 u8 refresh_golden_frame = read_bits(dev, 1, VP8_PROB_HALF);
506 u8 refresh_alt_ref_frame = read_bits(dev, 1, VP8_PROB_HALF);
508 if (!refresh_golden_frame)
509 read_bits(dev, 2, VP8_PROB_HALF);
511 if (!refresh_alt_ref_frame)
512 read_bits(dev, 2, VP8_PROB_HALF);
514 read_bits(dev, 1, VP8_PROB_HALF);
515 read_bits(dev, 1, VP8_PROB_HALF);
518 static void cedrus_irq_clear(struct cedrus_dev *dev)
520 cedrus_write(dev, VE_H264_STATUS,
521 VE_H264_STATUS_INT_MASK);
524 static void cedrus_read_header(struct cedrus_dev *dev,
525 const struct v4l2_ctrl_vp8_frame_header *slice)
529 if (VP8_FRAME_IS_KEY_FRAME(slice)) {
530 read_bits(dev, 1, VP8_PROB_HALF);
531 read_bits(dev, 1, VP8_PROB_HALF);
534 if (read_bits(dev, 1, VP8_PROB_HALF))
535 process_segmentation_info(dev);
537 read_bits(dev, 1, VP8_PROB_HALF);
538 read_bits(dev, 6, VP8_PROB_HALF);
539 read_bits(dev, 3, VP8_PROB_HALF);
541 if (read_bits(dev, 1, VP8_PROB_HALF))
542 process_ref_lf_delta_info(dev);
544 read_bits(dev, 2, VP8_PROB_HALF);
547 read_bits(dev, 7, VP8_PROB_HALF);
549 /* Parses y_dc_delta, y2_dc_delta, etc. */
550 for (i = 0; i < QUANT_DELTA_COUNT; i++)
553 if (!VP8_FRAME_IS_KEY_FRAME(slice))
554 process_ref_frame_info(dev);
556 read_bits(dev, 1, VP8_PROB_HALF);
558 if (!VP8_FRAME_IS_KEY_FRAME(slice))
559 read_bits(dev, 1, VP8_PROB_HALF);
561 cedrus_write(dev, VE_H264_TRIGGER_TYPE, VE_H264_TRIGGER_TYPE_VP8_UPDATE_COEF);
562 cedrus_wait_for(dev, VE_H264_STATUS, VE_H264_STATUS_VP8_UPPROB_BUSY);
563 cedrus_irq_clear(dev);
565 if (read_bits(dev, 1, VP8_PROB_HALF))
566 read_bits(dev, 8, VP8_PROB_HALF);
568 if (!VP8_FRAME_IS_KEY_FRAME(slice)) {
569 read_bits(dev, 8, VP8_PROB_HALF);
570 read_bits(dev, 8, VP8_PROB_HALF);
571 read_bits(dev, 8, VP8_PROB_HALF);
573 if (read_bits(dev, 1, VP8_PROB_HALF)) {
574 read_bits(dev, 8, VP8_PROB_HALF);
575 read_bits(dev, 8, VP8_PROB_HALF);
576 read_bits(dev, 8, VP8_PROB_HALF);
577 read_bits(dev, 8, VP8_PROB_HALF);
580 if (read_bits(dev, 1, VP8_PROB_HALF)) {
581 read_bits(dev, 8, VP8_PROB_HALF);
582 read_bits(dev, 8, VP8_PROB_HALF);
583 read_bits(dev, 8, VP8_PROB_HALF);
586 for (i = 0; i < 2; i++)
587 for (j = 0; j < V4L2_VP8_MV_PROB_CNT; j++)
588 if (read_bits(dev, 1, k_mv_entropy_update_probs[i][j]))
589 read_bits(dev, 7, VP8_PROB_HALF);
593 static void cedrus_vp8_update_probs(const struct v4l2_ctrl_vp8_frame_header *slice,
598 memcpy(&prob_table[0x1008], slice->entropy_header.y_mode_probs,
599 sizeof(slice->entropy_header.y_mode_probs));
600 memcpy(&prob_table[0x1010], slice->entropy_header.uv_mode_probs,
601 sizeof(slice->entropy_header.uv_mode_probs));
603 memcpy(&prob_table[0x1018], slice->segment_header.segment_probs,
604 sizeof(slice->segment_header.segment_probs));
606 prob_table[0x101c] = slice->prob_skip_false;
607 prob_table[0x101d] = slice->prob_intra;
608 prob_table[0x101e] = slice->prob_last;
609 prob_table[0x101f] = slice->prob_gf;
611 memcpy(&prob_table[0x1020], slice->entropy_header.mv_probs[0],
612 V4L2_VP8_MV_PROB_CNT);
613 memcpy(&prob_table[0x1040], slice->entropy_header.mv_probs[1],
614 V4L2_VP8_MV_PROB_CNT);
616 for (i = 0; i < 4; ++i)
617 for (j = 0; j < 8; ++j)
618 for (k = 0; k < 3; ++k)
619 memcpy(&prob_table[i * 512 + j * 64 + k * 16],
620 slice->entropy_header.coeff_probs[i][j][k], 11);
623 static enum cedrus_irq_status
624 cedrus_vp8_irq_status(struct cedrus_ctx *ctx)
626 struct cedrus_dev *dev = ctx->dev;
627 u32 reg = cedrus_read(dev, VE_H264_STATUS);
629 if (reg & (VE_H264_STATUS_DECODE_ERR_INT |
630 VE_H264_STATUS_VLD_DATA_REQ_INT))
631 return CEDRUS_IRQ_ERROR;
633 if (reg & VE_H264_CTRL_SLICE_DECODE_INT)
634 return CEDRUS_IRQ_OK;
636 return CEDRUS_IRQ_NONE;
639 static void cedrus_vp8_irq_clear(struct cedrus_ctx *ctx)
641 cedrus_irq_clear(ctx->dev);
644 static void cedrus_vp8_irq_disable(struct cedrus_ctx *ctx)
646 struct cedrus_dev *dev = ctx->dev;
647 u32 reg = cedrus_read(dev, VE_H264_CTRL);
649 cedrus_write(dev, VE_H264_CTRL,
650 reg & ~VE_H264_CTRL_INT_MASK);
653 static void cedrus_vp8_setup(struct cedrus_ctx *ctx,
654 struct cedrus_run *run)
656 const struct v4l2_ctrl_vp8_frame_header *slice = run->vp8.frame_params;
657 struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q;
658 struct vb2_buffer *src_buf = &run->src->vb2_buf;
659 struct cedrus_dev *dev = ctx->dev;
660 dma_addr_t luma_addr, chroma_addr;
661 dma_addr_t src_buf_addr;
666 cedrus_engine_enable(ctx, CEDRUS_CODEC_VP8);
668 cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8);
670 cedrus_vp8_update_probs(slice, ctx->codec.vp8.entropy_probs_buf);
672 reg = slice->first_part_size * 8;
673 cedrus_write(dev, VE_VP8_FIRST_DATA_PART_LEN, reg);
675 header_size = VP8_FRAME_IS_KEY_FRAME(slice) ? 10 : 3;
677 reg = slice->first_part_size + header_size;
678 cedrus_write(dev, VE_VP8_PART_SIZE_OFFSET, reg);
680 reg = vb2_plane_size(src_buf, 0) * 8;
681 cedrus_write(dev, VE_H264_VLD_LEN, reg);
684 * FIXME: There is a problem if frame header is skipped (adding
685 * first_part_header_bits to offset). It seems that functions
686 * for parsing bitstreams change internal state of VPU in some
687 * way that can't be otherwise set. Maybe this can be bypassed
688 * by somehow fixing probability table buffer?
690 reg = header_size * 8;
691 cedrus_write(dev, VE_H264_VLD_OFFSET, reg);
693 src_buf_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0);
694 cedrus_write(dev, VE_H264_VLD_END,
695 src_buf_addr + vb2_get_plane_payload(src_buf, 0));
696 cedrus_write(dev, VE_H264_VLD_ADDR,
697 VE_H264_VLD_ADDR_VAL(src_buf_addr) |
698 VE_H264_VLD_ADDR_FIRST | VE_H264_VLD_ADDR_VALID |
699 VE_H264_VLD_ADDR_LAST);
701 cedrus_write(dev, VE_H264_TRIGGER_TYPE,
702 VE_H264_TRIGGER_TYPE_INIT_SWDEC);
704 cedrus_write(dev, VE_VP8_ENTROPY_PROBS_ADDR,
705 ctx->codec.vp8.entropy_probs_buf_dma);
708 switch (slice->version) {
710 reg |= VE_VP8_PPS_FILTER_TYPE_SIMPLE;
711 reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
714 reg |= VE_VP8_PPS_LPF_DISABLE;
715 reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
718 reg |= VE_VP8_PPS_LPF_DISABLE;
719 reg |= VE_VP8_PPS_FULL_PIXEL;
722 if (slice->segment_header.flags & V4L2_VP8_SEGMENT_HEADER_FLAG_UPDATE_MAP)
723 reg |= VE_VP8_PPS_UPDATE_MB_SEGMENTATION_MAP;
724 if (!(slice->segment_header.flags & V4L2_VP8_SEGMENT_HEADER_FLAG_DELTA_VALUE_MODE))
725 reg |= VE_VP8_PPS_MB_SEGMENT_ABS_DELTA;
726 if (slice->segment_header.flags & V4L2_VP8_SEGMENT_HEADER_FLAG_ENABLED)
727 reg |= VE_VP8_PPS_SEGMENTATION_ENABLE;
728 if (ctx->codec.vp8.last_filter_type)
729 reg |= VE_VP8_PPS_LAST_LOOP_FILTER_SIMPLE;
730 reg |= VE_VP8_PPS_SHARPNESS_LEVEL(slice->lf_header.sharpness_level);
731 if (slice->lf_header.flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE)
732 reg |= VE_VP8_PPS_LOOP_FILTER_SIMPLE;
733 reg |= VE_VP8_PPS_LOOP_FILTER_LEVEL(slice->lf_header.level);
734 if (slice->lf_header.flags & V4L2_VP8_LF_HEADER_ADJ_ENABLE)
735 reg |= VE_VP8_PPS_MODE_REF_LF_DELTA_ENABLE;
736 if (slice->lf_header.flags & V4L2_VP8_LF_HEADER_DELTA_UPDATE)
737 reg |= VE_VP8_PPS_MODE_REF_LF_DELTA_UPDATE;
738 reg |= VE_VP8_PPS_TOKEN_PARTITION(ilog2(slice->num_dct_parts));
739 if (slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_MB_NO_SKIP_COEFF)
740 reg |= VE_VP8_PPS_MB_NO_COEFF_SKIP;
741 reg |= VE_VP8_PPS_RELOAD_ENTROPY_PROBS;
742 if (slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_SIGN_BIAS_GOLDEN)
743 reg |= VE_VP8_PPS_GOLDEN_SIGN_BIAS;
744 if (slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_SIGN_BIAS_ALT)
745 reg |= VE_VP8_PPS_ALTREF_SIGN_BIAS;
746 if (ctx->codec.vp8.last_frame_p_type)
747 reg |= VE_VP8_PPS_LAST_PIC_TYPE_P_FRAME;
748 reg |= VE_VP8_PPS_LAST_SHARPNESS_LEVEL(ctx->codec.vp8.last_sharpness_level);
749 if (!(slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_KEY_FRAME))
750 reg |= VE_VP8_PPS_PIC_TYPE_P_FRAME;
751 cedrus_write(dev, VE_VP8_PPS, reg);
753 cedrus_read_header(dev, slice);
755 /* reset registers changed by HW */
756 cedrus_write(dev, VE_H264_CUR_MB_NUM, 0);
757 cedrus_write(dev, VE_H264_MB_ADDR, 0);
758 cedrus_write(dev, VE_H264_ERROR_CASE, 0);
761 reg |= VE_VP8_QP_INDEX_DELTA_UVAC(slice->quant_header.uv_ac_delta);
762 reg |= VE_VP8_QP_INDEX_DELTA_UVDC(slice->quant_header.uv_dc_delta);
763 reg |= VE_VP8_QP_INDEX_DELTA_Y2AC(slice->quant_header.y2_ac_delta);
764 reg |= VE_VP8_QP_INDEX_DELTA_Y2DC(slice->quant_header.y2_dc_delta);
765 reg |= VE_VP8_QP_INDEX_DELTA_Y1DC(slice->quant_header.y_dc_delta);
766 reg |= VE_VP8_QP_INDEX_DELTA_BASE_QINDEX(slice->quant_header.y_ac_qi);
767 cedrus_write(dev, VE_VP8_QP_INDEX_DELTA, reg);
770 reg |= VE_VP8_FSIZE_WIDTH(slice->width);
771 reg |= VE_VP8_FSIZE_HEIGHT(slice->height);
772 cedrus_write(dev, VE_VP8_FSIZE, reg);
775 reg |= VE_VP8_PICSIZE_WIDTH(slice->width);
776 reg |= VE_VP8_PICSIZE_HEIGHT(slice->height);
777 cedrus_write(dev, VE_VP8_PICSIZE, reg);
780 reg |= VE_VP8_SEGMENT3(slice->segment_header.quant_update[3]);
781 reg |= VE_VP8_SEGMENT2(slice->segment_header.quant_update[2]);
782 reg |= VE_VP8_SEGMENT1(slice->segment_header.quant_update[1]);
783 reg |= VE_VP8_SEGMENT0(slice->segment_header.quant_update[0]);
784 cedrus_write(dev, VE_VP8_SEGMENT_FEAT_MB_LV0, reg);
787 reg |= VE_VP8_SEGMENT3(slice->segment_header.lf_update[3]);
788 reg |= VE_VP8_SEGMENT2(slice->segment_header.lf_update[2]);
789 reg |= VE_VP8_SEGMENT1(slice->segment_header.lf_update[1]);
790 reg |= VE_VP8_SEGMENT0(slice->segment_header.lf_update[0]);
791 cedrus_write(dev, VE_VP8_SEGMENT_FEAT_MB_LV1, reg);
794 reg |= VE_VP8_LF_DELTA3(slice->lf_header.ref_frm_delta[3]);
795 reg |= VE_VP8_LF_DELTA2(slice->lf_header.ref_frm_delta[2]);
796 reg |= VE_VP8_LF_DELTA1(slice->lf_header.ref_frm_delta[1]);
797 reg |= VE_VP8_LF_DELTA0(slice->lf_header.ref_frm_delta[0]);
798 cedrus_write(dev, VE_VP8_REF_LF_DELTA, reg);
801 reg |= VE_VP8_LF_DELTA3(slice->lf_header.mb_mode_delta[3]);
802 reg |= VE_VP8_LF_DELTA2(slice->lf_header.mb_mode_delta[2]);
803 reg |= VE_VP8_LF_DELTA1(slice->lf_header.mb_mode_delta[1]);
804 reg |= VE_VP8_LF_DELTA0(slice->lf_header.mb_mode_delta[0]);
805 cedrus_write(dev, VE_VP8_MODE_LF_DELTA, reg);
807 luma_addr = cedrus_dst_buf_addr(ctx, run->dst->vb2_buf.index, 0);
808 chroma_addr = cedrus_dst_buf_addr(ctx, run->dst->vb2_buf.index, 1);
809 cedrus_write(dev, VE_VP8_REC_LUMA, luma_addr);
810 cedrus_write(dev, VE_VP8_REC_CHROMA, chroma_addr);
812 qindex = vb2_find_timestamp(cap_q, slice->last_frame_ts, 0);
814 luma_addr = cedrus_dst_buf_addr(ctx, qindex, 0);
815 chroma_addr = cedrus_dst_buf_addr(ctx, qindex, 1);
816 cedrus_write(dev, VE_VP8_FWD_LUMA, luma_addr);
817 cedrus_write(dev, VE_VP8_FWD_CHROMA, chroma_addr);
819 cedrus_write(dev, VE_VP8_FWD_LUMA, 0);
820 cedrus_write(dev, VE_VP8_FWD_CHROMA, 0);
823 qindex = vb2_find_timestamp(cap_q, slice->golden_frame_ts, 0);
825 luma_addr = cedrus_dst_buf_addr(ctx, qindex, 0);
826 chroma_addr = cedrus_dst_buf_addr(ctx, qindex, 1);
827 cedrus_write(dev, VE_VP8_BWD_LUMA, luma_addr);
828 cedrus_write(dev, VE_VP8_BWD_CHROMA, chroma_addr);
830 cedrus_write(dev, VE_VP8_BWD_LUMA, 0);
831 cedrus_write(dev, VE_VP8_BWD_CHROMA, 0);
834 qindex = vb2_find_timestamp(cap_q, slice->alt_frame_ts, 0);
836 luma_addr = cedrus_dst_buf_addr(ctx, qindex, 0);
837 chroma_addr = cedrus_dst_buf_addr(ctx, qindex, 1);
838 cedrus_write(dev, VE_VP8_ALT_LUMA, luma_addr);
839 cedrus_write(dev, VE_VP8_ALT_CHROMA, chroma_addr);
841 cedrus_write(dev, VE_VP8_ALT_LUMA, 0);
842 cedrus_write(dev, VE_VP8_ALT_CHROMA, 0);
845 cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8 |
846 VE_H264_CTRL_DECODE_ERR_INT |
847 VE_H264_CTRL_SLICE_DECODE_INT);
849 if (slice->lf_header.level) {
850 ctx->codec.vp8.last_filter_type =
851 !!(slice->lf_header.flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE);
852 ctx->codec.vp8.last_frame_p_type =
853 !VP8_FRAME_IS_KEY_FRAME(slice);
854 ctx->codec.vp8.last_sharpness_level =
855 slice->lf_header.sharpness_level;
859 static int cedrus_vp8_start(struct cedrus_ctx *ctx)
861 struct cedrus_dev *dev = ctx->dev;
863 ctx->codec.vp8.entropy_probs_buf =
864 dma_alloc_coherent(dev->dev, CEDRUS_ENTROPY_PROBS_SIZE,
865 &ctx->codec.vp8.entropy_probs_buf_dma,
867 if (!ctx->codec.vp8.entropy_probs_buf)
871 * This offset has been discovered by reverse engineering, we don’t know
872 * what it actually means.
874 memcpy(&ctx->codec.vp8.entropy_probs_buf[2048],
875 prob_table_init, sizeof(prob_table_init));
880 static void cedrus_vp8_stop(struct cedrus_ctx *ctx)
882 struct cedrus_dev *dev = ctx->dev;
884 cedrus_engine_disable(dev);
886 dma_free_coherent(dev->dev, CEDRUS_ENTROPY_PROBS_SIZE,
887 ctx->codec.vp8.entropy_probs_buf,
888 ctx->codec.vp8.entropy_probs_buf_dma);
891 static void cedrus_vp8_trigger(struct cedrus_ctx *ctx)
893 struct cedrus_dev *dev = ctx->dev;
895 cedrus_write(dev, VE_H264_TRIGGER_TYPE,
896 VE_H264_TRIGGER_TYPE_VP8_SLICE_DECODE);
899 struct cedrus_dec_ops cedrus_dec_ops_vp8 = {
900 .irq_clear = cedrus_vp8_irq_clear,
901 .irq_disable = cedrus_vp8_irq_disable,
902 .irq_status = cedrus_vp8_irq_status,
903 .setup = cedrus_vp8_setup,
904 .start = cedrus_vp8_start,
905 .stop = cedrus_vp8_stop,
906 .trigger = cedrus_vp8_trigger,