ff613ebd11802777c51c62050c07ce5b89b83d18
[linux-2.6-microblaze.git] / drivers / staging / media / sunxi / cedrus / cedrus_vp8.c
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, move this table to media/vp8-ctrls.h
427  */
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 }
433 };
434
435 static uint8_t read_bits(struct cedrus_dev *dev, unsigned int bits_count,
436                          unsigned int probability)
437 {
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));
442
443         cedrus_wait_for(dev, VE_H264_STATUS, VE_H264_STATUS_VLD_BUSY);
444
445         return cedrus_read(dev, VE_H264_BASIC_BITS);
446 }
447
448 static void get_delta_q(struct cedrus_dev *dev)
449 {
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);
453         }
454 }
455
456 static void process_segmentation_info(struct cedrus_dev *dev)
457 {
458         int update, i;
459
460         update = read_bits(dev, 1, VP8_PROB_HALF);
461
462         if (read_bits(dev, 1, VP8_PROB_HALF)) {
463                 read_bits(dev, 1, VP8_PROB_HALF);
464
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);
469                         }
470
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);
475                         }
476         }
477
478         if (update)
479                 for (i = 0; i < 3; i++)
480                         if (read_bits(dev, 1, VP8_PROB_HALF))
481                                 read_bits(dev, 8, VP8_PROB_HALF);
482 }
483
484 static void process_ref_lf_delta_info(struct cedrus_dev *dev)
485 {
486         if (read_bits(dev, 1, VP8_PROB_HALF)) {
487                 int i;
488
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);
493                         }
494
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);
499                         }
500         }
501 }
502
503 static void process_ref_frame_info(struct cedrus_dev *dev)
504 {
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);
507
508         if (!refresh_golden_frame)
509                 read_bits(dev, 2, VP8_PROB_HALF);
510
511         if (!refresh_alt_ref_frame)
512                 read_bits(dev, 2, VP8_PROB_HALF);
513
514         read_bits(dev, 1, VP8_PROB_HALF);
515         read_bits(dev, 1, VP8_PROB_HALF);
516 }
517
518 static void cedrus_irq_clear(struct cedrus_dev *dev)
519 {
520         cedrus_write(dev, VE_H264_STATUS,
521                      VE_H264_STATUS_INT_MASK);
522 }
523
524 static void cedrus_read_header(struct cedrus_dev *dev,
525                                const struct v4l2_ctrl_vp8_frame_header *slice)
526 {
527         int i, j;
528
529         if (VP8_FRAME_IS_KEY_FRAME(slice)) {
530                 read_bits(dev, 1, VP8_PROB_HALF);
531                 read_bits(dev, 1, VP8_PROB_HALF);
532         }
533
534         if (read_bits(dev, 1, VP8_PROB_HALF))
535                 process_segmentation_info(dev);
536
537         read_bits(dev, 1, VP8_PROB_HALF);
538         read_bits(dev, 6, VP8_PROB_HALF);
539         read_bits(dev, 3, VP8_PROB_HALF);
540
541         if (read_bits(dev, 1, VP8_PROB_HALF))
542                 process_ref_lf_delta_info(dev);
543
544         read_bits(dev, 2, VP8_PROB_HALF);
545
546         /* y_ac_qi */
547         read_bits(dev, 7, VP8_PROB_HALF);
548
549         /* Parses y_dc_delta, y2_dc_delta, etc. */
550         for (i = 0; i < QUANT_DELTA_COUNT; i++)
551                 get_delta_q(dev);
552
553         if (!VP8_FRAME_IS_KEY_FRAME(slice))
554                 process_ref_frame_info(dev);
555
556         read_bits(dev, 1, VP8_PROB_HALF);
557
558         if (!VP8_FRAME_IS_KEY_FRAME(slice))
559                 read_bits(dev, 1, VP8_PROB_HALF);
560
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);
564
565         if (read_bits(dev, 1, VP8_PROB_HALF))
566                 read_bits(dev, 8, VP8_PROB_HALF);
567
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);
572
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);
578                 }
579
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);
584                 }
585
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);
590         }
591 }
592
593 static void cedrus_vp8_update_probs(const struct v4l2_ctrl_vp8_frame_header *slice,
594                                     u8 *prob_table)
595 {
596         int i, j, k;
597
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));
602
603         memcpy(&prob_table[0x1018], slice->segment_header.segment_probs,
604                sizeof(slice->segment_header.segment_probs));
605
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;
610
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);
615
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);
621 }
622
623 static enum cedrus_irq_status
624 cedrus_vp8_irq_status(struct cedrus_ctx *ctx)
625 {
626         struct cedrus_dev *dev = ctx->dev;
627         u32 reg = cedrus_read(dev, VE_H264_STATUS);
628
629         if (reg & (VE_H264_STATUS_DECODE_ERR_INT |
630                    VE_H264_STATUS_VLD_DATA_REQ_INT))
631                 return CEDRUS_IRQ_ERROR;
632
633         if (reg & VE_H264_CTRL_SLICE_DECODE_INT)
634                 return CEDRUS_IRQ_OK;
635
636         return CEDRUS_IRQ_NONE;
637 }
638
639 static void cedrus_vp8_irq_clear(struct cedrus_ctx *ctx)
640 {
641         cedrus_irq_clear(ctx->dev);
642 }
643
644 static void cedrus_vp8_irq_disable(struct cedrus_ctx *ctx)
645 {
646         struct cedrus_dev *dev = ctx->dev;
647         u32 reg = cedrus_read(dev, VE_H264_CTRL);
648
649         cedrus_write(dev, VE_H264_CTRL,
650                      reg & ~VE_H264_CTRL_INT_MASK);
651 }
652
653 static void cedrus_vp8_setup(struct cedrus_ctx *ctx,
654                              struct cedrus_run *run)
655 {
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;
662         int header_size;
663         int qindex;
664         u32 reg;
665
666         cedrus_engine_enable(ctx, CEDRUS_CODEC_VP8);
667
668         cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8);
669
670         cedrus_vp8_update_probs(slice, ctx->codec.vp8.entropy_probs_buf);
671
672         reg = slice->first_part_size * 8;
673         cedrus_write(dev, VE_VP8_FIRST_DATA_PART_LEN, reg);
674
675         header_size = VP8_FRAME_IS_KEY_FRAME(slice) ? 10 : 3;
676
677         reg = slice->first_part_size + header_size;
678         cedrus_write(dev, VE_VP8_PART_SIZE_OFFSET, reg);
679
680         reg = vb2_plane_size(src_buf, 0) * 8;
681         cedrus_write(dev, VE_H264_VLD_LEN, reg);
682
683         /*
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?
689          */
690         reg = header_size * 8;
691         cedrus_write(dev, VE_H264_VLD_OFFSET, reg);
692
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);
700
701         cedrus_write(dev, VE_H264_TRIGGER_TYPE,
702                      VE_H264_TRIGGER_TYPE_INIT_SWDEC);
703
704         cedrus_write(dev, VE_VP8_ENTROPY_PROBS_ADDR,
705                      ctx->codec.vp8.entropy_probs_buf_dma);
706
707         reg = 0;
708         switch (slice->version) {
709         case 1:
710                 reg |= VE_VP8_PPS_FILTER_TYPE_SIMPLE;
711                 reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
712                 break;
713         case 2:
714                 reg |= VE_VP8_PPS_LPF_DISABLE;
715                 reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
716                 break;
717         case 3:
718                 reg |= VE_VP8_PPS_LPF_DISABLE;
719                 reg |= VE_VP8_PPS_FULL_PIXEL;
720                 break;
721         }
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);
752
753         cedrus_read_header(dev, slice);
754
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);
759
760         reg = 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);
768
769         reg = 0;
770         reg |= VE_VP8_FSIZE_WIDTH(slice->width);
771         reg |= VE_VP8_FSIZE_HEIGHT(slice->height);
772         cedrus_write(dev, VE_VP8_FSIZE, reg);
773
774         reg = 0;
775         reg |= VE_VP8_PICSIZE_WIDTH(slice->width);
776         reg |= VE_VP8_PICSIZE_HEIGHT(slice->height);
777         cedrus_write(dev, VE_VP8_PICSIZE, reg);
778
779         reg = 0;
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);
785
786         reg = 0;
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);
792
793         reg = 0;
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);
799
800         reg = 0;
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);
806
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);
811
812         qindex = vb2_find_timestamp(cap_q, slice->last_frame_ts, 0);
813         if (qindex >= 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);
818         } else {
819                 cedrus_write(dev, VE_VP8_FWD_LUMA, 0);
820                 cedrus_write(dev, VE_VP8_FWD_CHROMA, 0);
821         }
822
823         qindex = vb2_find_timestamp(cap_q, slice->golden_frame_ts, 0);
824         if (qindex >= 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);
829         } else {
830                 cedrus_write(dev, VE_VP8_BWD_LUMA, 0);
831                 cedrus_write(dev, VE_VP8_BWD_CHROMA, 0);
832         }
833
834         qindex = vb2_find_timestamp(cap_q, slice->alt_frame_ts, 0);
835         if (qindex >= 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);
840         } else {
841                 cedrus_write(dev, VE_VP8_ALT_LUMA, 0);
842                 cedrus_write(dev, VE_VP8_ALT_CHROMA, 0);
843         }
844
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);
848
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;
856         }
857 }
858
859 static int cedrus_vp8_start(struct cedrus_ctx *ctx)
860 {
861         struct cedrus_dev *dev = ctx->dev;
862
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,
866                                    GFP_KERNEL);
867         if (!ctx->codec.vp8.entropy_probs_buf)
868                 return -ENOMEM;
869
870         /*
871          * This offset has been discovered by reverse engineering, we don’t know
872          * what it actually means.
873          */
874         memcpy(&ctx->codec.vp8.entropy_probs_buf[2048],
875                prob_table_init, sizeof(prob_table_init));
876
877         return 0;
878 }
879
880 static void cedrus_vp8_stop(struct cedrus_ctx *ctx)
881 {
882         struct cedrus_dev *dev = ctx->dev;
883
884         cedrus_engine_disable(dev);
885
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);
889 }
890
891 static void cedrus_vp8_trigger(struct cedrus_ctx *ctx)
892 {
893         struct cedrus_dev *dev = ctx->dev;
894
895         cedrus_write(dev, VE_H264_TRIGGER_TYPE,
896                      VE_H264_TRIGGER_TYPE_VP8_SLICE_DECODE);
897 }
898
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,
907 };