1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Cedrus VPU driver
4  *
5  * Copyright (c) 2019 Jernej Skrabec <jernej.skrabec@siol.net>
6  */
7 
8 /*
9  * VP8 in Cedrus shares same engine as H264.
10  *
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.
17  */
18 
19 #include <linux/delay.h>
20 #include <linux/types.h>
21 
22 #include <media/videobuf2-dma-contig.h>
23 
24 #include "cedrus.h"
25 #include "cedrus_hw.h"
26 #include "cedrus_regs.h"
27 
28 #define CEDRUS_ENTROPY_PROBS_SIZE 0x2400
29 #define VP8_PROB_HALF 128
30 #define QUANT_DELTA_COUNT 5
31 
32 /*
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.
37  */
38 static const u8 prob_table_init[] = {
39 	/* k_coeff_entropy_update_probs */
40 	/* block 0 */
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,
49 
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,
58 
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,
67 
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,
76 
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,
85 
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,
94 
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,
103 
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,
112 
113 	/* block 1 */
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,
122 
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,
131 
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,
140 
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,
149 
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,
158 
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,
167 
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,
176 
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,
185 
186 	/* block 2 */
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,
195 
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,
204 
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,
213 
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,
222 
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,
231 
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,
240 
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,
249 
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,
258 
259 	/* block 3 */
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,
268 
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,
277 
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,
286 
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,
295 
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,
304 
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,
313 
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,
322 
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,
331 
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,
345 
346 	/* split_mv_probs */
347 	0x6E, 0x6F, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
348 
349 	/* bmode_prob */
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,
354 
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,
363 
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,
379 
380 	/* kf_y_mode_tree */
381 	0x84, 0x02, 0x04, 0x06, 0x80, 0x81, 0x82, 0x83,
382 
383 	/* y_mode_tree */
384 	0x80, 0x02, 0x04, 0x06, 0x81, 0x82, 0x83, 0x84,
385 
386 	/* uv_mode_tree */
387 	0x80, 0x02, 0x81, 0x04, 0x82, 0x83, 0x00, 0x00,
388 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389 	0x00, 0x00,
390 
391 	/* small_mv_tree */
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,
396 
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,
402 
403 	/* split_mv_tree */
404 	0x83, 0x02, 0x82, 0x04, 0x80, 0x81, 0x00, 0x00,
405 
406 	/* b_mode_tree */
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,
411 
412 	/* submv_ref_tree */
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,
417 
418 	/* mv_ref_tree */
419 	0x87, 0x02, 0x85, 0x04, 0x86, 0x06, 0x88, 0x89,
420 };
421 
422 /*
423  * This table is a copy of k_mv_entropy_update_probs from the VP8
424  * specification.
425  *
426  * FIXME: If any other driver uses it, we can consider moving
427  * this table so it can be shared.
428  */
429 static const u8 k_mv_entropy_update_probs[2][V4L2_VP8_MV_PROB_CNT] = {
430 	{ 237, 246, 253, 253, 254, 254, 254, 254, 254,
431 	  254, 254, 254, 254, 254, 250, 250, 252, 254, 254 },
432 	{ 231, 243, 245, 253, 254, 254, 254, 254, 254,
433 	  254, 254, 254, 254, 254, 251, 251, 254, 254, 254 }
434 };
435 
436 static uint8_t read_bits(struct cedrus_dev *dev, unsigned int bits_count,
437 			 unsigned int probability)
438 {
439 	cedrus_write(dev, VE_H264_TRIGGER_TYPE,
440 		     VE_H264_TRIGGER_TYPE_VP8_GET_BITS |
441 		     VE_H264_TRIGGER_TYPE_BIN_LENS(bits_count) |
442 		     VE_H264_TRIGGER_TYPE_PROBABILITY(probability));
443 
444 	cedrus_wait_for(dev, VE_H264_STATUS, VE_H264_STATUS_VLD_BUSY);
445 
446 	return cedrus_read(dev, VE_H264_BASIC_BITS);
447 }
448 
449 static void get_delta_q(struct cedrus_dev *dev)
450 {
451 	if (read_bits(dev, 1, VP8_PROB_HALF)) {
452 		read_bits(dev, 4, VP8_PROB_HALF);
453 		read_bits(dev, 1, VP8_PROB_HALF);
454 	}
455 }
456 
457 static void process_segmentation_info(struct cedrus_dev *dev)
458 {
459 	int update, i;
460 
461 	update = read_bits(dev, 1, VP8_PROB_HALF);
462 
463 	if (read_bits(dev, 1, VP8_PROB_HALF)) {
464 		read_bits(dev, 1, VP8_PROB_HALF);
465 
466 		for (i = 0; i < 4; i++)
467 			if (read_bits(dev, 1, VP8_PROB_HALF)) {
468 				read_bits(dev, 7, VP8_PROB_HALF);
469 				read_bits(dev, 1, VP8_PROB_HALF);
470 			}
471 
472 		for (i = 0; i < 4; i++)
473 			if (read_bits(dev, 1, VP8_PROB_HALF)) {
474 				read_bits(dev, 6, VP8_PROB_HALF);
475 				read_bits(dev, 1, VP8_PROB_HALF);
476 			}
477 	}
478 
479 	if (update)
480 		for (i = 0; i < 3; i++)
481 			if (read_bits(dev, 1, VP8_PROB_HALF))
482 				read_bits(dev, 8, VP8_PROB_HALF);
483 }
484 
485 static void process_ref_lf_delta_info(struct cedrus_dev *dev)
486 {
487 	if (read_bits(dev, 1, VP8_PROB_HALF)) {
488 		int i;
489 
490 		for (i = 0; i < 4; i++)
491 			if (read_bits(dev, 1, VP8_PROB_HALF)) {
492 				read_bits(dev, 6, VP8_PROB_HALF);
493 				read_bits(dev, 1, VP8_PROB_HALF);
494 			}
495 
496 		for (i = 0; i < 4; i++)
497 			if (read_bits(dev, 1, VP8_PROB_HALF)) {
498 				read_bits(dev, 6, VP8_PROB_HALF);
499 				read_bits(dev, 1, VP8_PROB_HALF);
500 			}
501 	}
502 }
503 
504 static void process_ref_frame_info(struct cedrus_dev *dev)
505 {
506 	u8 refresh_golden_frame = read_bits(dev, 1, VP8_PROB_HALF);
507 	u8 refresh_alt_ref_frame = read_bits(dev, 1, VP8_PROB_HALF);
508 
509 	if (!refresh_golden_frame)
510 		read_bits(dev, 2, VP8_PROB_HALF);
511 
512 	if (!refresh_alt_ref_frame)
513 		read_bits(dev, 2, VP8_PROB_HALF);
514 
515 	read_bits(dev, 1, VP8_PROB_HALF);
516 	read_bits(dev, 1, VP8_PROB_HALF);
517 }
518 
519 static void cedrus_irq_clear(struct cedrus_dev *dev)
520 {
521 	cedrus_write(dev, VE_H264_STATUS,
522 		     VE_H264_STATUS_INT_MASK);
523 }
524 
525 static void cedrus_read_header(struct cedrus_dev *dev,
526 			       const struct v4l2_ctrl_vp8_frame *slice)
527 {
528 	int i, j;
529 
530 	if (V4L2_VP8_FRAME_IS_KEY_FRAME(slice)) {
531 		read_bits(dev, 1, VP8_PROB_HALF);
532 		read_bits(dev, 1, VP8_PROB_HALF);
533 	}
534 
535 	if (read_bits(dev, 1, VP8_PROB_HALF))
536 		process_segmentation_info(dev);
537 
538 	read_bits(dev, 1, VP8_PROB_HALF);
539 	read_bits(dev, 6, VP8_PROB_HALF);
540 	read_bits(dev, 3, VP8_PROB_HALF);
541 
542 	if (read_bits(dev, 1, VP8_PROB_HALF))
543 		process_ref_lf_delta_info(dev);
544 
545 	read_bits(dev, 2, VP8_PROB_HALF);
546 
547 	/* y_ac_qi */
548 	read_bits(dev, 7, VP8_PROB_HALF);
549 
550 	/* Parses y_dc_delta, y2_dc_delta, etc. */
551 	for (i = 0; i < QUANT_DELTA_COUNT; i++)
552 		get_delta_q(dev);
553 
554 	if (!V4L2_VP8_FRAME_IS_KEY_FRAME(slice))
555 		process_ref_frame_info(dev);
556 
557 	read_bits(dev, 1, VP8_PROB_HALF);
558 
559 	if (!V4L2_VP8_FRAME_IS_KEY_FRAME(slice))
560 		read_bits(dev, 1, VP8_PROB_HALF);
561 
562 	cedrus_write(dev, VE_H264_TRIGGER_TYPE, VE_H264_TRIGGER_TYPE_VP8_UPDATE_COEF);
563 	cedrus_wait_for(dev, VE_H264_STATUS, VE_H264_STATUS_VP8_UPPROB_BUSY);
564 	cedrus_irq_clear(dev);
565 
566 	if (read_bits(dev, 1, VP8_PROB_HALF))
567 		read_bits(dev, 8, VP8_PROB_HALF);
568 
569 	if (!V4L2_VP8_FRAME_IS_KEY_FRAME(slice)) {
570 		read_bits(dev, 8, VP8_PROB_HALF);
571 		read_bits(dev, 8, VP8_PROB_HALF);
572 		read_bits(dev, 8, VP8_PROB_HALF);
573 
574 		if (read_bits(dev, 1, 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);
578 			read_bits(dev, 8, VP8_PROB_HALF);
579 		}
580 
581 		if (read_bits(dev, 1, VP8_PROB_HALF)) {
582 			read_bits(dev, 8, VP8_PROB_HALF);
583 			read_bits(dev, 8, VP8_PROB_HALF);
584 			read_bits(dev, 8, VP8_PROB_HALF);
585 		}
586 
587 		for (i = 0; i < 2; i++)
588 			for (j = 0; j < V4L2_VP8_MV_PROB_CNT; j++)
589 				if (read_bits(dev, 1, k_mv_entropy_update_probs[i][j]))
590 					read_bits(dev, 7, VP8_PROB_HALF);
591 	}
592 }
593 
594 static void cedrus_vp8_update_probs(const struct v4l2_ctrl_vp8_frame *slice,
595 				    u8 *prob_table)
596 {
597 	int i, j, k;
598 
599 	memcpy(&prob_table[0x1008], slice->entropy.y_mode_probs,
600 	       sizeof(slice->entropy.y_mode_probs));
601 	memcpy(&prob_table[0x1010], slice->entropy.uv_mode_probs,
602 	       sizeof(slice->entropy.uv_mode_probs));
603 
604 	memcpy(&prob_table[0x1018], slice->segment.segment_probs,
605 	       sizeof(slice->segment.segment_probs));
606 
607 	prob_table[0x101c] = slice->prob_skip_false;
608 	prob_table[0x101d] = slice->prob_intra;
609 	prob_table[0x101e] = slice->prob_last;
610 	prob_table[0x101f] = slice->prob_gf;
611 
612 	memcpy(&prob_table[0x1020], slice->entropy.mv_probs[0],
613 	       V4L2_VP8_MV_PROB_CNT);
614 	memcpy(&prob_table[0x1040], slice->entropy.mv_probs[1],
615 	       V4L2_VP8_MV_PROB_CNT);
616 
617 	for (i = 0; i < 4; ++i)
618 		for (j = 0; j < 8; ++j)
619 			for (k = 0; k < 3; ++k)
620 				memcpy(&prob_table[i * 512 + j * 64 + k * 16],
621 				       slice->entropy.coeff_probs[i][j][k], 11);
622 }
623 
624 static enum cedrus_irq_status
625 cedrus_vp8_irq_status(struct cedrus_ctx *ctx)
626 {
627 	struct cedrus_dev *dev = ctx->dev;
628 	u32 reg = cedrus_read(dev, VE_H264_STATUS);
629 
630 	if (reg & (VE_H264_STATUS_DECODE_ERR_INT |
631 		   VE_H264_STATUS_VLD_DATA_REQ_INT))
632 		return CEDRUS_IRQ_ERROR;
633 
634 	if (reg & VE_H264_CTRL_SLICE_DECODE_INT)
635 		return CEDRUS_IRQ_OK;
636 
637 	return CEDRUS_IRQ_NONE;
638 }
639 
640 static void cedrus_vp8_irq_clear(struct cedrus_ctx *ctx)
641 {
642 	cedrus_irq_clear(ctx->dev);
643 }
644 
645 static void cedrus_vp8_irq_disable(struct cedrus_ctx *ctx)
646 {
647 	struct cedrus_dev *dev = ctx->dev;
648 	u32 reg = cedrus_read(dev, VE_H264_CTRL);
649 
650 	cedrus_write(dev, VE_H264_CTRL,
651 		     reg & ~VE_H264_CTRL_INT_MASK);
652 }
653 
654 static int cedrus_vp8_setup(struct cedrus_ctx *ctx, struct cedrus_run *run)
655 {
656 	const struct v4l2_ctrl_vp8_frame *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;
662 	int header_size;
663 	u32 reg;
664 
665 	cedrus_engine_enable(ctx);
666 
667 	cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8);
668 
669 	cedrus_vp8_update_probs(slice, ctx->codec.vp8.entropy_probs_buf);
670 
671 	reg = slice->first_part_size * 8;
672 	cedrus_write(dev, VE_VP8_FIRST_DATA_PART_LEN, reg);
673 
674 	header_size = V4L2_VP8_FRAME_IS_KEY_FRAME(slice) ? 10 : 3;
675 
676 	reg = slice->first_part_size + header_size;
677 	cedrus_write(dev, VE_VP8_PART_SIZE_OFFSET, reg);
678 
679 	reg = vb2_plane_size(src_buf, 0) * 8;
680 	cedrus_write(dev, VE_H264_VLD_LEN, reg);
681 
682 	/*
683 	 * FIXME: There is a problem if frame header is skipped (adding
684 	 * first_part_header_bits to offset). It seems that functions
685 	 * for parsing bitstreams change internal state of VPU in some
686 	 * way that can't be otherwise set. Maybe this can be bypassed
687 	 * by somehow fixing probability table buffer?
688 	 */
689 	reg = header_size * 8;
690 	cedrus_write(dev, VE_H264_VLD_OFFSET, reg);
691 
692 	src_buf_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0);
693 	cedrus_write(dev, VE_H264_VLD_END,
694 		     src_buf_addr + vb2_get_plane_payload(src_buf, 0));
695 	cedrus_write(dev, VE_H264_VLD_ADDR,
696 		     VE_H264_VLD_ADDR_VAL(src_buf_addr) |
697 		     VE_H264_VLD_ADDR_FIRST | VE_H264_VLD_ADDR_VALID |
698 		     VE_H264_VLD_ADDR_LAST);
699 
700 	cedrus_write(dev, VE_H264_TRIGGER_TYPE,
701 		     VE_H264_TRIGGER_TYPE_INIT_SWDEC);
702 
703 	cedrus_write(dev, VE_VP8_ENTROPY_PROBS_ADDR,
704 		     ctx->codec.vp8.entropy_probs_buf_dma);
705 
706 	reg = 0;
707 	switch (slice->version) {
708 	case 1:
709 		reg |= VE_VP8_PPS_FILTER_TYPE_SIMPLE;
710 		reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
711 		break;
712 	case 2:
713 		reg |= VE_VP8_PPS_LPF_DISABLE;
714 		reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
715 		break;
716 	case 3:
717 		reg |= VE_VP8_PPS_LPF_DISABLE;
718 		reg |= VE_VP8_PPS_FULL_PIXEL;
719 		break;
720 	}
721 	if (slice->segment.flags & V4L2_VP8_SEGMENT_FLAG_UPDATE_MAP)
722 		reg |= VE_VP8_PPS_UPDATE_MB_SEGMENTATION_MAP;
723 	if (!(slice->segment.flags & V4L2_VP8_SEGMENT_FLAG_DELTA_VALUE_MODE))
724 		reg |= VE_VP8_PPS_MB_SEGMENT_ABS_DELTA;
725 	if (slice->segment.flags & V4L2_VP8_SEGMENT_FLAG_ENABLED)
726 		reg |= VE_VP8_PPS_SEGMENTATION_ENABLE;
727 	if (ctx->codec.vp8.last_filter_type)
728 		reg |= VE_VP8_PPS_LAST_LOOP_FILTER_SIMPLE;
729 	reg |= VE_VP8_PPS_SHARPNESS_LEVEL(slice->lf.sharpness_level);
730 	if (slice->lf.flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE)
731 		reg |= VE_VP8_PPS_LOOP_FILTER_SIMPLE;
732 	reg |= VE_VP8_PPS_LOOP_FILTER_LEVEL(slice->lf.level);
733 	if (slice->lf.flags & V4L2_VP8_LF_ADJ_ENABLE)
734 		reg |= VE_VP8_PPS_MODE_REF_LF_DELTA_ENABLE;
735 	if (slice->lf.flags & V4L2_VP8_LF_DELTA_UPDATE)
736 		reg |= VE_VP8_PPS_MODE_REF_LF_DELTA_UPDATE;
737 	reg |= VE_VP8_PPS_TOKEN_PARTITION(ilog2(slice->num_dct_parts));
738 	if (slice->flags & V4L2_VP8_FRAME_FLAG_MB_NO_SKIP_COEFF)
739 		reg |= VE_VP8_PPS_MB_NO_COEFF_SKIP;
740 	reg |= VE_VP8_PPS_RELOAD_ENTROPY_PROBS;
741 	if (slice->flags & V4L2_VP8_FRAME_FLAG_SIGN_BIAS_GOLDEN)
742 		reg |= VE_VP8_PPS_GOLDEN_SIGN_BIAS;
743 	if (slice->flags & V4L2_VP8_FRAME_FLAG_SIGN_BIAS_ALT)
744 		reg |= VE_VP8_PPS_ALTREF_SIGN_BIAS;
745 	if (ctx->codec.vp8.last_frame_p_type)
746 		reg |= VE_VP8_PPS_LAST_PIC_TYPE_P_FRAME;
747 	reg |= VE_VP8_PPS_LAST_SHARPNESS_LEVEL(ctx->codec.vp8.last_sharpness_level);
748 	if (!(slice->flags & V4L2_VP8_FRAME_FLAG_KEY_FRAME))
749 		reg |= VE_VP8_PPS_PIC_TYPE_P_FRAME;
750 	cedrus_write(dev, VE_VP8_PPS, reg);
751 
752 	cedrus_read_header(dev, slice);
753 
754 	/* reset registers changed by HW */
755 	cedrus_write(dev, VE_H264_CUR_MB_NUM, 0);
756 	cedrus_write(dev, VE_H264_MB_ADDR, 0);
757 	cedrus_write(dev, VE_H264_ERROR_CASE, 0);
758 
759 	reg = 0;
760 	reg |= VE_VP8_QP_INDEX_DELTA_UVAC(slice->quant.uv_ac_delta);
761 	reg |= VE_VP8_QP_INDEX_DELTA_UVDC(slice->quant.uv_dc_delta);
762 	reg |= VE_VP8_QP_INDEX_DELTA_Y2AC(slice->quant.y2_ac_delta);
763 	reg |= VE_VP8_QP_INDEX_DELTA_Y2DC(slice->quant.y2_dc_delta);
764 	reg |= VE_VP8_QP_INDEX_DELTA_Y1DC(slice->quant.y_dc_delta);
765 	reg |= VE_VP8_QP_INDEX_DELTA_BASE_QINDEX(slice->quant.y_ac_qi);
766 	cedrus_write(dev, VE_VP8_QP_INDEX_DELTA, reg);
767 
768 	reg = 0;
769 	reg |= VE_VP8_FSIZE_WIDTH(slice->width);
770 	reg |= VE_VP8_FSIZE_HEIGHT(slice->height);
771 	cedrus_write(dev, VE_VP8_FSIZE, reg);
772 
773 	reg = 0;
774 	reg |= VE_VP8_PICSIZE_WIDTH(slice->width);
775 	reg |= VE_VP8_PICSIZE_HEIGHT(slice->height);
776 	cedrus_write(dev, VE_VP8_PICSIZE, reg);
777 
778 	reg = 0;
779 	reg |= VE_VP8_SEGMENT3(slice->segment.quant_update[3]);
780 	reg |= VE_VP8_SEGMENT2(slice->segment.quant_update[2]);
781 	reg |= VE_VP8_SEGMENT1(slice->segment.quant_update[1]);
782 	reg |= VE_VP8_SEGMENT0(slice->segment.quant_update[0]);
783 	cedrus_write(dev, VE_VP8_SEGMENT_FEAT_MB_LV0, reg);
784 
785 	reg = 0;
786 	reg |= VE_VP8_SEGMENT3(slice->segment.lf_update[3]);
787 	reg |= VE_VP8_SEGMENT2(slice->segment.lf_update[2]);
788 	reg |= VE_VP8_SEGMENT1(slice->segment.lf_update[1]);
789 	reg |= VE_VP8_SEGMENT0(slice->segment.lf_update[0]);
790 	cedrus_write(dev, VE_VP8_SEGMENT_FEAT_MB_LV1, reg);
791 
792 	reg = 0;
793 	reg |= VE_VP8_LF_DELTA3(slice->lf.ref_frm_delta[3]);
794 	reg |= VE_VP8_LF_DELTA2(slice->lf.ref_frm_delta[2]);
795 	reg |= VE_VP8_LF_DELTA1(slice->lf.ref_frm_delta[1]);
796 	reg |= VE_VP8_LF_DELTA0(slice->lf.ref_frm_delta[0]);
797 	cedrus_write(dev, VE_VP8_REF_LF_DELTA, reg);
798 
799 	reg = 0;
800 	reg |= VE_VP8_LF_DELTA3(slice->lf.mb_mode_delta[3]);
801 	reg |= VE_VP8_LF_DELTA2(slice->lf.mb_mode_delta[2]);
802 	reg |= VE_VP8_LF_DELTA1(slice->lf.mb_mode_delta[1]);
803 	reg |= VE_VP8_LF_DELTA0(slice->lf.mb_mode_delta[0]);
804 	cedrus_write(dev, VE_VP8_MODE_LF_DELTA, reg);
805 
806 	luma_addr = cedrus_dst_buf_addr(ctx, &run->dst->vb2_buf, 0);
807 	chroma_addr = cedrus_dst_buf_addr(ctx, &run->dst->vb2_buf, 1);
808 	cedrus_write(dev, VE_VP8_REC_LUMA, luma_addr);
809 	cedrus_write(dev, VE_VP8_REC_CHROMA, chroma_addr);
810 
811 	cedrus_write_ref_buf_addr(ctx, cap_q, slice->last_frame_ts,
812 				  VE_VP8_FWD_LUMA, VE_VP8_FWD_CHROMA);
813 	cedrus_write_ref_buf_addr(ctx, cap_q, slice->golden_frame_ts,
814 				  VE_VP8_BWD_LUMA, VE_VP8_BWD_CHROMA);
815 	cedrus_write_ref_buf_addr(ctx, cap_q, slice->alt_frame_ts,
816 				  VE_VP8_ALT_LUMA, VE_VP8_ALT_CHROMA);
817 
818 	cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8 |
819 		     VE_H264_CTRL_DECODE_ERR_INT |
820 		     VE_H264_CTRL_SLICE_DECODE_INT);
821 
822 	if (slice->lf.level) {
823 		ctx->codec.vp8.last_filter_type =
824 			!!(slice->lf.flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE);
825 		ctx->codec.vp8.last_frame_p_type =
826 			!V4L2_VP8_FRAME_IS_KEY_FRAME(slice);
827 		ctx->codec.vp8.last_sharpness_level =
828 			slice->lf.sharpness_level;
829 	}
830 
831 	return 0;
832 }
833 
834 static int cedrus_vp8_start(struct cedrus_ctx *ctx)
835 {
836 	struct cedrus_dev *dev = ctx->dev;
837 
838 	ctx->codec.vp8.entropy_probs_buf =
839 		dma_alloc_coherent(dev->dev, CEDRUS_ENTROPY_PROBS_SIZE,
840 				   &ctx->codec.vp8.entropy_probs_buf_dma,
841 				   GFP_KERNEL);
842 	if (!ctx->codec.vp8.entropy_probs_buf)
843 		return -ENOMEM;
844 
845 	/*
846 	 * This offset has been discovered by reverse engineering, we don’t know
847 	 * what it actually means.
848 	 */
849 	memcpy(&ctx->codec.vp8.entropy_probs_buf[2048],
850 	       prob_table_init, sizeof(prob_table_init));
851 
852 	return 0;
853 }
854 
855 static void cedrus_vp8_stop(struct cedrus_ctx *ctx)
856 {
857 	struct cedrus_dev *dev = ctx->dev;
858 
859 	cedrus_engine_disable(dev);
860 
861 	dma_free_coherent(dev->dev, CEDRUS_ENTROPY_PROBS_SIZE,
862 			  ctx->codec.vp8.entropy_probs_buf,
863 			  ctx->codec.vp8.entropy_probs_buf_dma);
864 }
865 
866 static void cedrus_vp8_trigger(struct cedrus_ctx *ctx)
867 {
868 	struct cedrus_dev *dev = ctx->dev;
869 
870 	cedrus_write(dev, VE_H264_TRIGGER_TYPE,
871 		     VE_H264_TRIGGER_TYPE_VP8_SLICE_DECODE);
872 }
873 
874 struct cedrus_dec_ops cedrus_dec_ops_vp8 = {
875 	.irq_clear	= cedrus_vp8_irq_clear,
876 	.irq_disable	= cedrus_vp8_irq_disable,
877 	.irq_status	= cedrus_vp8_irq_status,
878 	.setup		= cedrus_vp8_setup,
879 	.start		= cedrus_vp8_start,
880 	.stop		= cedrus_vp8_stop,
881 	.trigger	= cedrus_vp8_trigger,
882 };
883