1/*
2 * Copyright (C) 2005-2006 Micronas USA Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License (Version 2) as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * GNU General Public License for more details.
12 */
13
14/*
15 * This file contains code to generate a firmware image for the GO7007SB
16 * encoder.  Much of the firmware is read verbatim from a file, but some of
17 * it concerning bitrate control and other things that can be configured at
18 * run-time are generated dynamically.  Note that the format headers
19 * generated here do not affect the functioning of the encoder; they are
20 * merely parroted back to the host at the start of each frame.
21 */
22
23#include <linux/module.h>
24#include <linux/time.h>
25#include <linux/mm.h>
26#include <linux/device.h>
27#include <linux/i2c.h>
28#include <linux/firmware.h>
29#include <linux/slab.h>
30#include <asm/byteorder.h>
31
32#include "go7007-priv.h"
33
34#define GO7007_FW_NAME "go7007/go7007tv.bin"
35
36/* Constants used in the source firmware image to describe code segments */
37
38#define	FLAG_MODE_MJPEG		(1)
39#define	FLAG_MODE_MPEG1		(1<<1)
40#define	FLAG_MODE_MPEG2		(1<<2)
41#define	FLAG_MODE_MPEG4		(1<<3)
42#define	FLAG_MODE_H263		(1<<4)
43#define FLAG_MODE_ALL		(FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
44					FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
45					FLAG_MODE_H263)
46#define FLAG_SPECIAL		(1<<8)
47
48#define SPECIAL_FRM_HEAD	0
49#define SPECIAL_BRC_CTRL	1
50#define SPECIAL_CONFIG		2
51#define SPECIAL_SEQHEAD		3
52#define SPECIAL_AV_SYNC		4
53#define SPECIAL_FINAL		5
54#define SPECIAL_AUDIO		6
55#define SPECIAL_MODET		7
56
57/* Little data class for creating MPEG headers bit-by-bit */
58
59struct code_gen {
60	unsigned char *p; /* destination */
61	u32 a; /* collects bits at the top of the variable */
62	int b; /* bit position of most recently-written bit */
63	int len; /* written out so far */
64};
65
66#define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
67
68#define CODE_ADD(name, val, length) do { \
69	name.b -= (length); \
70	name.a |= (val) << name.b; \
71	while (name.b <= 24) { \
72		*name.p = name.a >> 24; \
73		++name.p; \
74		name.a <<= 8; \
75		name.b += 8; \
76		name.len += 8; \
77	} \
78} while (0)
79
80#define CODE_LENGTH(name) (name.len + (32 - name.b))
81
82/* Tables for creating the bitrate control data */
83
84static const s16 converge_speed_ip[101] = {
85	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
86	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
87	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
88	1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
89	2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
90	3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
91	5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
92	9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
93	19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
94	41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
95	100
96};
97
98static const s16 converge_speed_ipb[101] = {
99	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
100	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
101	3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
102	4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
103	6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
104	9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
105	15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
106	28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
107	57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
108	125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
109	300
110};
111
112static const s16 LAMBDA_table[4][101] = {
113	{	16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
114		19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
115		22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
116		27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
117		32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
118		39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
119		46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
120		56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
121		67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
122		80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
123		96
124	},
125	{
126		20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
127		23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
128		28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
129		34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
130		40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
131		48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
132		58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
133		70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
134		83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
135		100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
136		120
137	},
138	{
139		24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
140		28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
141		34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
142		41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
143		49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
144		58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
145		70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
146		84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
147		100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
148		120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
149		144
150	},
151	{
152		32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
153		38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
154		45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
155		54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
156		65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
157		78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
158		93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
159		112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
160		134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
161		160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
162		192
163	}
164};
165
166/* MPEG blank frame generation tables */
167
168enum mpeg_frame_type {
169	PFRAME,
170	BFRAME_PRE,
171	BFRAME_POST,
172	BFRAME_BIDIR,
173	BFRAME_EMPTY
174};
175
176static const u32 addrinctab[33][2] = {
177	{ 0x01, 1 },	{ 0x03, 3 },	{ 0x02, 3 },	{ 0x03, 4 },
178	{ 0x02, 4 },	{ 0x03, 5 },	{ 0x02, 5 },	{ 0x07, 7 },
179	{ 0x06, 7 },	{ 0x0b, 8 },	{ 0x0a, 8 },	{ 0x09, 8 },
180	{ 0x08, 8 },	{ 0x07, 8 },	{ 0x06, 8 },	{ 0x17, 10 },
181	{ 0x16, 10 },	{ 0x15, 10 },	{ 0x14, 10 },	{ 0x13, 10 },
182	{ 0x12, 10 },	{ 0x23, 11 },	{ 0x22, 11 },	{ 0x21, 11 },
183	{ 0x20, 11 },	{ 0x1f, 11 },	{ 0x1e, 11 },	{ 0x1d, 11 },
184	{ 0x1c, 11 },	{ 0x1b, 11 },	{ 0x1a, 11 },	{ 0x19, 11 },
185	{ 0x18, 11 }
186};
187
188/* Standard JPEG tables */
189
190static const u8 default_intra_quant_table[] = {
191	 8, 16, 19, 22, 26, 27, 29, 34,
192	16, 16, 22, 24, 27, 29, 34, 37,
193	19, 22, 26, 27, 29, 34, 34, 38,
194	22, 22, 26, 27, 29, 34, 37, 40,
195	22, 26, 27, 29, 32, 35, 40, 48,
196	26, 27, 29, 32, 35, 40, 48, 58,
197	26, 27, 29, 34, 38, 46, 56, 69,
198	27, 29, 35, 38, 46, 56, 69, 83
199};
200
201static const u8 bits_dc_luminance[] = {
202	0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
203};
204
205static const u8 val_dc_luminance[] = {
206	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
207};
208
209static const u8 bits_dc_chrominance[] = {
210	0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
211};
212
213static const u8 val_dc_chrominance[] = {
214	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
215};
216
217static const u8 bits_ac_luminance[] = {
218	0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
219};
220
221static const u8 val_ac_luminance[] = {
222	0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
223	0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
224	0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
225	0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
226	0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
227	0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
228	0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
229	0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
230	0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
231	0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
232	0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
233	0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
234	0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
235	0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
236	0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
237	0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
238	0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
239	0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
240	0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
241	0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
242	0xf9, 0xfa
243};
244
245static const u8 bits_ac_chrominance[] = {
246	0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
247};
248
249static const u8 val_ac_chrominance[] = {
250	0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
251	0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
252	0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
253	0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
254	0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
255	0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
256	0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
257	0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
258	0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
259	0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
260	0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
261	0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
262	0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
263	0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
264	0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
265	0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
266	0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
267	0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
268	0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
269	0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
270	0xf9, 0xfa
271};
272
273/* Zig-zag mapping for quant table
274 *
275 * OK, let's do this mapping on the actual table above so it doesn't have
276 * to be done on the fly.
277 */
278static const int zz[64] = {
279	0,   1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
280	12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
281	35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
282	58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
283};
284
285static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
286{
287	int i, cnt = pkg_cnt * 32;
288
289	if (space < cnt)
290		return -1;
291
292	for (i = 0; i < cnt; ++i)
293		dest[i] = cpu_to_le16p(src + i);
294
295	return cnt;
296}
297
298static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
299{
300	int i, p = 0;
301
302	buf[p++] = 0xff;
303	buf[p++] = 0xd8;
304	buf[p++] = 0xff;
305	buf[p++] = 0xdb;
306	buf[p++] = 0;
307	buf[p++] = 2 + 65;
308	buf[p++] = 0;
309	buf[p++] = default_intra_quant_table[0];
310	for (i = 1; i < 64; ++i)
311		/* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
312		buf[p++] = (default_intra_quant_table[zz[i]] * q) >> 3;
313	buf[p++] = 0xff;
314	buf[p++] = 0xc0;
315	buf[p++] = 0;
316	buf[p++] = 17;
317	buf[p++] = 8;
318	buf[p++] = go->height >> 8;
319	buf[p++] = go->height & 0xff;
320	buf[p++] = go->width >> 8;
321	buf[p++] = go->width & 0xff;
322	buf[p++] = 3;
323	buf[p++] = 1;
324	buf[p++] = 0x22;
325	buf[p++] = 0;
326	buf[p++] = 2;
327	buf[p++] = 0x11;
328	buf[p++] = 0;
329	buf[p++] = 3;
330	buf[p++] = 0x11;
331	buf[p++] = 0;
332	buf[p++] = 0xff;
333	buf[p++] = 0xc4;
334	buf[p++] = 418 >> 8;
335	buf[p++] = 418 & 0xff;
336	buf[p++] = 0x00;
337	memcpy(buf + p, bits_dc_luminance + 1, 16);
338	p += 16;
339	memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
340	p += sizeof(val_dc_luminance);
341	buf[p++] = 0x01;
342	memcpy(buf + p, bits_dc_chrominance + 1, 16);
343	p += 16;
344	memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
345	p += sizeof(val_dc_chrominance);
346	buf[p++] = 0x10;
347	memcpy(buf + p, bits_ac_luminance + 1, 16);
348	p += 16;
349	memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
350	p += sizeof(val_ac_luminance);
351	buf[p++] = 0x11;
352	memcpy(buf + p, bits_ac_chrominance + 1, 16);
353	p += 16;
354	memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
355	p += sizeof(val_ac_chrominance);
356	buf[p++] = 0xff;
357	buf[p++] = 0xda;
358	buf[p++] = 0;
359	buf[p++] = 12;
360	buf[p++] = 3;
361	buf[p++] = 1;
362	buf[p++] = 0x00;
363	buf[p++] = 2;
364	buf[p++] = 0x11;
365	buf[p++] = 3;
366	buf[p++] = 0x11;
367	buf[p++] = 0;
368	buf[p++] = 63;
369	buf[p++] = 0;
370	return p;
371}
372
373static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
374{
375	u8 *buf;
376	u16 mem = 0x3e00;
377	unsigned int addr = 0x19;
378	int size = 0, i, off = 0, chunk;
379
380	buf = kzalloc(4096, GFP_KERNEL);
381	if (buf == NULL)
382		return -1;
383
384	for (i = 1; i < 32; ++i) {
385		mjpeg_frame_header(go, buf + size, i);
386		size += 80;
387	}
388	chunk = mjpeg_frame_header(go, buf + size, 1);
389	memmove(buf + size, buf + size + 80, chunk - 80);
390	size += chunk - 80;
391
392	for (i = 0; i < size; i += chunk * 2) {
393		if (space - off < 32) {
394			off = -1;
395			goto done;
396		}
397
398		code[off + 1] = __cpu_to_le16(0x8000 | mem);
399
400		chunk = 28;
401		if (mem + chunk > 0x4000)
402			chunk = 0x4000 - mem;
403		if (i + 2 * chunk > size)
404			chunk = (size - i) / 2;
405
406		if (chunk < 28) {
407			code[off] = __cpu_to_le16(0x4000 | chunk);
408			code[off + 31] = __cpu_to_le16(addr++);
409			mem = 0x3e00;
410		} else {
411			code[off] = __cpu_to_le16(0x1000 | 28);
412			code[off + 31] = 0;
413			mem += 28;
414		}
415
416		memcpy(&code[off + 2], buf + i, chunk * 2);
417		off += 32;
418	}
419done:
420	kfree(buf);
421	return off;
422}
423
424static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
425		int modulo, int pict_struct, enum mpeg_frame_type frame)
426{
427	int i, j, mb_code, mb_len;
428	int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
429	CODE_GEN(c, buf + 6);
430
431	switch (frame) {
432	case PFRAME:
433		mb_code = 0x1;
434		mb_len = 3;
435		break;
436	case BFRAME_PRE:
437		mb_code = 0x2;
438		mb_len = 4;
439		break;
440	case BFRAME_POST:
441		mb_code = 0x2;
442		mb_len = 3;
443		break;
444	case BFRAME_BIDIR:
445		mb_code = 0x2;
446		mb_len = 2;
447		break;
448	default: /* keep the compiler happy */
449		mb_code = mb_len = 0;
450		break;
451	}
452
453	CODE_ADD(c, frame == PFRAME ? 0x2 : 0x3, 13);
454	CODE_ADD(c, 0xffff, 16);
455	CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
456	if (frame != PFRAME)
457		CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
458	else
459		CODE_ADD(c, 0, 4); /* Is this supposed to be here?? */
460	CODE_ADD(c, 0, 3); /* What is this?? */
461	/* Byte-align with zeros */
462	j = 8 - (CODE_LENGTH(c) % 8);
463	if (j != 8)
464		CODE_ADD(c, 0, j);
465
466	if (go->format == V4L2_PIX_FMT_MPEG2) {
467		CODE_ADD(c, 0x1, 24);
468		CODE_ADD(c, 0xb5, 8);
469		CODE_ADD(c, 0x844, 12);
470		CODE_ADD(c, frame == PFRAME ? 0xff : 0x44, 8);
471		if (go->interlace_coding) {
472			CODE_ADD(c, pict_struct, 4);
473			if (go->dvd_mode)
474				CODE_ADD(c, 0x000, 11);
475			else
476				CODE_ADD(c, 0x200, 11);
477		} else {
478			CODE_ADD(c, 0x3, 4);
479			CODE_ADD(c, 0x20c, 11);
480		}
481		/* Byte-align with zeros */
482		j = 8 - (CODE_LENGTH(c) % 8);
483		if (j != 8)
484			CODE_ADD(c, 0, j);
485	}
486
487	for (i = 0; i < rows; ++i) {
488		CODE_ADD(c, 1, 24);
489		CODE_ADD(c, i + 1, 8);
490		CODE_ADD(c, 0x2, 6);
491		CODE_ADD(c, 0x1, 1);
492		CODE_ADD(c, mb_code, mb_len);
493		if (go->interlace_coding) {
494			CODE_ADD(c, 0x1, 2);
495			CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
496		}
497		if (frame == BFRAME_BIDIR) {
498			CODE_ADD(c, 0x3, 2);
499			if (go->interlace_coding)
500				CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
501		}
502		CODE_ADD(c, 0x3, 2);
503		for (j = (go->width >> 4) - 2; j >= 33; j -= 33)
504			CODE_ADD(c, 0x8, 11);
505		CODE_ADD(c, addrinctab[j][0], addrinctab[j][1]);
506		CODE_ADD(c, mb_code, mb_len);
507		if (go->interlace_coding) {
508			CODE_ADD(c, 0x1, 2);
509			CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
510		}
511		if (frame == BFRAME_BIDIR) {
512			CODE_ADD(c, 0x3, 2);
513			if (go->interlace_coding)
514				CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
515		}
516		CODE_ADD(c, 0x3, 2);
517
518		/* Byte-align with zeros */
519		j = 8 - (CODE_LENGTH(c) % 8);
520		if (j != 8)
521			CODE_ADD(c, 0, j);
522	}
523
524	i = CODE_LENGTH(c) + 4 * 8;
525	buf[2] = 0x00;
526	buf[3] = 0x00;
527	buf[4] = 0x01;
528	buf[5] = 0x00;
529	return i;
530}
531
532static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
533{
534	int i, aspect_ratio, picture_rate;
535	CODE_GEN(c, buf + 6);
536
537	if (go->format == V4L2_PIX_FMT_MPEG1) {
538		switch (go->aspect_ratio) {
539		case GO7007_RATIO_4_3:
540			aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
541			break;
542		case GO7007_RATIO_16_9:
543			aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
544			break;
545		default:
546			aspect_ratio = 1;
547			break;
548		}
549	} else {
550		switch (go->aspect_ratio) {
551		case GO7007_RATIO_4_3:
552			aspect_ratio = 2;
553			break;
554		case GO7007_RATIO_16_9:
555			aspect_ratio = 3;
556			break;
557		default:
558			aspect_ratio = 1;
559			break;
560		}
561	}
562	switch (go->sensor_framerate) {
563	case 24000:
564		picture_rate = 1;
565		break;
566	case 24024:
567		picture_rate = 2;
568		break;
569	case 25025:
570		picture_rate = go->interlace_coding ? 6 : 3;
571		break;
572	case 30000:
573		picture_rate = go->interlace_coding ? 7 : 4;
574		break;
575	case 30030:
576		picture_rate = go->interlace_coding ? 8 : 5;
577		break;
578	default:
579		picture_rate = 5; /* 30 fps seems like a reasonable default */
580		break;
581	}
582
583	CODE_ADD(c, go->width, 12);
584	CODE_ADD(c, go->height, 12);
585	CODE_ADD(c, aspect_ratio, 4);
586	CODE_ADD(c, picture_rate, 4);
587	CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 20000 : 0x3ffff, 18);
588	CODE_ADD(c, 1, 1);
589	CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 112 : 20, 10);
590	CODE_ADD(c, 0, 3);
591
592	/* Byte-align with zeros */
593	i = 8 - (CODE_LENGTH(c) % 8);
594	if (i != 8)
595		CODE_ADD(c, 0, i);
596
597	if (go->format == V4L2_PIX_FMT_MPEG2) {
598		CODE_ADD(c, 0x1, 24);
599		CODE_ADD(c, 0xb5, 8);
600		CODE_ADD(c, 0x148, 12);
601		if (go->interlace_coding)
602			CODE_ADD(c, 0x20001, 20);
603		else
604			CODE_ADD(c, 0xa0001, 20);
605		CODE_ADD(c, 0, 16);
606
607		/* Byte-align with zeros */
608		i = 8 - (CODE_LENGTH(c) % 8);
609		if (i != 8)
610			CODE_ADD(c, 0, i);
611
612		if (ext) {
613			CODE_ADD(c, 0x1, 24);
614			CODE_ADD(c, 0xb52, 12);
615			CODE_ADD(c, go->standard == GO7007_STD_NTSC ? 2 : 1, 3);
616			CODE_ADD(c, 0x105, 9);
617			CODE_ADD(c, 0x505, 16);
618			CODE_ADD(c, go->width, 14);
619			CODE_ADD(c, 1, 1);
620			CODE_ADD(c, go->height, 14);
621
622			/* Byte-align with zeros */
623			i = 8 - (CODE_LENGTH(c) % 8);
624			if (i != 8)
625				CODE_ADD(c, 0, i);
626		}
627	}
628
629	i = CODE_LENGTH(c) + 4 * 8;
630	buf[0] = i & 0xff;
631	buf[1] = i >> 8;
632	buf[2] = 0x00;
633	buf[3] = 0x00;
634	buf[4] = 0x01;
635	buf[5] = 0xb3;
636	return i;
637}
638
639static int gen_mpeg1hdr_to_package(struct go7007 *go,
640					__le16 *code, int space, int *framelen)
641{
642	u8 *buf;
643	u16 mem = 0x3e00;
644	unsigned int addr = 0x19;
645	int i, off = 0, chunk;
646
647	buf = kzalloc(5120, GFP_KERNEL);
648	if (buf == NULL)
649		return -1;
650
651	framelen[0] = mpeg1_frame_header(go, buf, 0, 1, PFRAME);
652	if (go->interlace_coding)
653		framelen[0] += mpeg1_frame_header(go, buf + framelen[0] / 8,
654							0, 2, PFRAME);
655	buf[0] = framelen[0] & 0xff;
656	buf[1] = framelen[0] >> 8;
657	i = 368;
658	framelen[1] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_PRE);
659	if (go->interlace_coding)
660		framelen[1] += mpeg1_frame_header(go, buf + i + framelen[1] / 8,
661							0, 2, BFRAME_PRE);
662	buf[i] = framelen[1] & 0xff;
663	buf[i + 1] = framelen[1] >> 8;
664	i += 1632;
665	framelen[2] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_POST);
666	if (go->interlace_coding)
667		framelen[2] += mpeg1_frame_header(go, buf + i + framelen[2] / 8,
668							0, 2, BFRAME_POST);
669	buf[i] = framelen[2] & 0xff;
670	buf[i + 1] = framelen[2] >> 8;
671	i += 1432;
672	framelen[3] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_BIDIR);
673	if (go->interlace_coding)
674		framelen[3] += mpeg1_frame_header(go, buf + i + framelen[3] / 8,
675							0, 2, BFRAME_BIDIR);
676	buf[i] = framelen[3] & 0xff;
677	buf[i + 1] = framelen[3] >> 8;
678	i += 1632 + 16;
679	mpeg1_sequence_header(go, buf + i, 0);
680	i += 40;
681	for (i = 0; i < 5120; i += chunk * 2) {
682		if (space - off < 32) {
683			off = -1;
684			goto done;
685		}
686
687		code[off + 1] = __cpu_to_le16(0x8000 | mem);
688
689		chunk = 28;
690		if (mem + chunk > 0x4000)
691			chunk = 0x4000 - mem;
692		if (i + 2 * chunk > 5120)
693			chunk = (5120 - i) / 2;
694
695		if (chunk < 28) {
696			code[off] = __cpu_to_le16(0x4000 | chunk);
697			code[off + 31] = __cpu_to_le16(addr);
698			if (mem + chunk == 0x4000) {
699				mem = 0x3e00;
700				++addr;
701			}
702		} else {
703			code[off] = __cpu_to_le16(0x1000 | 28);
704			code[off + 31] = 0;
705			mem += 28;
706		}
707
708		memcpy(&code[off + 2], buf + i, chunk * 2);
709		off += 32;
710	}
711done:
712	kfree(buf);
713	return off;
714}
715
716static int vti_bitlen(struct go7007 *go)
717{
718	unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
719
720	for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i)
721		;
722	return i + 1;
723}
724
725static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
726		int modulo, enum mpeg_frame_type frame)
727{
728	int i;
729	CODE_GEN(c, buf + 6);
730	int mb_count = (go->width >> 4) * (go->height >> 4);
731
732	CODE_ADD(c, frame == PFRAME ? 0x1 : 0x2, 2);
733	if (modulo)
734		CODE_ADD(c, 0x1, 1);
735	CODE_ADD(c, 0x1, 2);
736	CODE_ADD(c, 0, vti_bitlen(go));
737	CODE_ADD(c, 0x3, 2);
738	if (frame == PFRAME)
739		CODE_ADD(c, 0, 1);
740	CODE_ADD(c, 0xc, 11);
741	if (frame != PFRAME)
742		CODE_ADD(c, 0x4, 3);
743	if (frame != BFRAME_EMPTY) {
744		for (i = 0; i < mb_count; ++i) {
745			switch (frame) {
746			case PFRAME:
747				CODE_ADD(c, 0x1, 1);
748				break;
749			case BFRAME_PRE:
750				CODE_ADD(c, 0x47, 8);
751				break;
752			case BFRAME_POST:
753				CODE_ADD(c, 0x27, 7);
754				break;
755			case BFRAME_BIDIR:
756				CODE_ADD(c, 0x5f, 8);
757				break;
758			case BFRAME_EMPTY: /* keep compiler quiet */
759				break;
760			}
761		}
762	}
763
764	/* Byte-align with a zero followed by ones */
765	i = 8 - (CODE_LENGTH(c) % 8);
766	CODE_ADD(c, 0, 1);
767	CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
768
769	i = CODE_LENGTH(c) + 4 * 8;
770	buf[0] = i & 0xff;
771	buf[1] = i >> 8;
772	buf[2] = 0x00;
773	buf[3] = 0x00;
774	buf[4] = 0x01;
775	buf[5] = 0xb6;
776	return i;
777}
778
779static int mpeg4_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
780{
781	const unsigned char head[] = { 0x00, 0x00, 0x01, 0xb0, go->pali,
782		0x00, 0x00, 0x01, 0xb5, 0x09,
783		0x00, 0x00, 0x01, 0x00,
784		0x00, 0x00, 0x01, 0x20, };
785	int i, aspect_ratio;
786	int fps = go->sensor_framerate / go->fps_scale;
787	CODE_GEN(c, buf + 2 + sizeof(head));
788
789	switch (go->aspect_ratio) {
790	case GO7007_RATIO_4_3:
791		aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
792		break;
793	case GO7007_RATIO_16_9:
794		aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
795		break;
796	default:
797		aspect_ratio = 1;
798		break;
799	}
800
801	memcpy(buf + 2, head, sizeof(head));
802	CODE_ADD(c, 0x191, 17);
803	CODE_ADD(c, aspect_ratio, 4);
804	CODE_ADD(c, 0x1, 4);
805	CODE_ADD(c, fps, 16);
806	CODE_ADD(c, 0x3, 2);
807	CODE_ADD(c, 1001, vti_bitlen(go));
808	CODE_ADD(c, 1, 1);
809	CODE_ADD(c, go->width, 13);
810	CODE_ADD(c, 1, 1);
811	CODE_ADD(c, go->height, 13);
812	CODE_ADD(c, 0x2830, 14);
813
814	/* Byte-align */
815	i = 8 - (CODE_LENGTH(c) % 8);
816	CODE_ADD(c, 0, 1);
817	CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
818
819	i = CODE_LENGTH(c) + sizeof(head) * 8;
820	buf[0] = i & 0xff;
821	buf[1] = i >> 8;
822	return i;
823}
824
825static int gen_mpeg4hdr_to_package(struct go7007 *go,
826					__le16 *code, int space, int *framelen)
827{
828	u8 *buf;
829	u16 mem = 0x3e00;
830	unsigned int addr = 0x19;
831	int i, off = 0, chunk;
832
833	buf = kzalloc(5120, GFP_KERNEL);
834	if (buf == NULL)
835		return -1;
836
837	framelen[0] = mpeg4_frame_header(go, buf, 0, PFRAME);
838	i = 368;
839	framelen[1] = mpeg4_frame_header(go, buf + i, 0, BFRAME_PRE);
840	i += 1632;
841	framelen[2] = mpeg4_frame_header(go, buf + i, 0, BFRAME_POST);
842	i += 1432;
843	framelen[3] = mpeg4_frame_header(go, buf + i, 0, BFRAME_BIDIR);
844	i += 1632;
845	mpeg4_frame_header(go, buf + i, 0, BFRAME_EMPTY);
846	i += 16;
847	mpeg4_sequence_header(go, buf + i, 0);
848	i += 40;
849	for (i = 0; i < 5120; i += chunk * 2) {
850		if (space - off < 32) {
851			off = -1;
852			goto done;
853		}
854
855		code[off + 1] = __cpu_to_le16(0x8000 | mem);
856
857		chunk = 28;
858		if (mem + chunk > 0x4000)
859			chunk = 0x4000 - mem;
860		if (i + 2 * chunk > 5120)
861			chunk = (5120 - i) / 2;
862
863		if (chunk < 28) {
864			code[off] = __cpu_to_le16(0x4000 | chunk);
865			code[off + 31] = __cpu_to_le16(addr);
866			if (mem + chunk == 0x4000) {
867				mem = 0x3e00;
868				++addr;
869			}
870		} else {
871			code[off] = __cpu_to_le16(0x1000 | 28);
872			code[off + 31] = 0;
873			mem += 28;
874		}
875
876		memcpy(&code[off + 2], buf + i, chunk * 2);
877		off += 32;
878	}
879	mem = 0x3e00;
880	addr = go->ipb ? 0x14f9 : 0x0af9;
881	memset(buf, 0, 5120);
882	framelen[4] = mpeg4_frame_header(go, buf, 1, PFRAME);
883	i = 368;
884	framelen[5] = mpeg4_frame_header(go, buf + i, 1, BFRAME_PRE);
885	i += 1632;
886	framelen[6] = mpeg4_frame_header(go, buf + i, 1, BFRAME_POST);
887	i += 1432;
888	framelen[7] = mpeg4_frame_header(go, buf + i, 1, BFRAME_BIDIR);
889	i += 1632;
890	mpeg4_frame_header(go, buf + i, 1, BFRAME_EMPTY);
891	i += 16;
892	for (i = 0; i < 5120; i += chunk * 2) {
893		if (space - off < 32) {
894			off = -1;
895			goto done;
896		}
897
898		code[off + 1] = __cpu_to_le16(0x8000 | mem);
899
900		chunk = 28;
901		if (mem + chunk > 0x4000)
902			chunk = 0x4000 - mem;
903		if (i + 2 * chunk > 5120)
904			chunk = (5120 - i) / 2;
905
906		if (chunk < 28) {
907			code[off] = __cpu_to_le16(0x4000 | chunk);
908			code[off + 31] = __cpu_to_le16(addr);
909			if (mem + chunk == 0x4000) {
910				mem = 0x3e00;
911				++addr;
912			}
913		} else {
914			code[off] = __cpu_to_le16(0x1000 | 28);
915			code[off + 31] = 0;
916			mem += 28;
917		}
918
919		memcpy(&code[off + 2], buf + i, chunk * 2);
920		off += 32;
921	}
922done:
923	kfree(buf);
924	return off;
925}
926
927static int brctrl_to_package(struct go7007 *go,
928					__le16 *code, int space, int *framelen)
929{
930	int converge_speed = 0;
931	int lambda = (go->format == V4L2_PIX_FMT_MJPEG || go->dvd_mode) ?
932				100 : 0;
933	int peak_rate = 6 * go->bitrate / 5;
934	int vbv_buffer = go->format == V4L2_PIX_FMT_MJPEG ?
935				go->bitrate :
936				(go->dvd_mode ? 900000 : peak_rate);
937	int fps = go->sensor_framerate / go->fps_scale;
938	int q = 0;
939	/* Bizarre math below depends on rounding errors in division */
940	u32 sgop_expt_addr = go->bitrate / 32 * (go->ipb ? 3 : 1) * 1001 / fps;
941	u32 sgop_peak_addr = peak_rate / 32 * 1001 / fps;
942	u32 total_expt_addr = go->bitrate / 32 * 1000 / fps * (fps / 1000);
943	u32 vbv_alert_addr = vbv_buffer * 3 / (4 * 32);
944	u32 cplx[] = {
945		q > 0 ? sgop_expt_addr * q :
946			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
947		q > 0 ? sgop_expt_addr * q :
948			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
949		q > 0 ? sgop_expt_addr * q :
950			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
951		q > 0 ? sgop_expt_addr * q :
952			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
953	};
954	u32 calc_q = q > 0 ? q : cplx[0] / sgop_expt_addr;
955	u16 pack[] = {
956		0x200e,		0x0000,
957		0xBF20,		go->ipb ? converge_speed_ipb[converge_speed]
958					: converge_speed_ip[converge_speed],
959		0xBF21,		go->ipb ? 2 : 0,
960		0xBF22,		go->ipb ? LAMBDA_table[0][lambda / 2 + 50]
961					: 32767,
962		0xBF23,		go->ipb ? LAMBDA_table[1][lambda] : 32767,
963		0xBF24,		32767,
964		0xBF25,		lambda > 99 ? 32767 : LAMBDA_table[3][lambda],
965		0xBF26,		sgop_expt_addr & 0x0000FFFF,
966		0xBF27,		sgop_expt_addr >> 16,
967		0xBF28,		sgop_peak_addr & 0x0000FFFF,
968		0xBF29,		sgop_peak_addr >> 16,
969		0xBF2A,		vbv_alert_addr & 0x0000FFFF,
970		0xBF2B,		vbv_alert_addr >> 16,
971		0xBF2C,		0,
972		0xBF2D,		0,
973		0,		0,
974
975		0x200e,		0x0000,
976		0xBF2E,		vbv_alert_addr & 0x0000FFFF,
977		0xBF2F,		vbv_alert_addr >> 16,
978		0xBF30,		cplx[0] & 0x0000FFFF,
979		0xBF31,		cplx[0] >> 16,
980		0xBF32,		cplx[1] & 0x0000FFFF,
981		0xBF33,		cplx[1] >> 16,
982		0xBF34,		cplx[2] & 0x0000FFFF,
983		0xBF35,		cplx[2] >> 16,
984		0xBF36,		cplx[3] & 0x0000FFFF,
985		0xBF37,		cplx[3] >> 16,
986		0xBF38,		0,
987		0xBF39,		0,
988		0xBF3A,		total_expt_addr & 0x0000FFFF,
989		0xBF3B,		total_expt_addr >> 16,
990		0,		0,
991
992		0x200e,		0x0000,
993		0xBF3C,		total_expt_addr & 0x0000FFFF,
994		0xBF3D,		total_expt_addr >> 16,
995		0xBF3E,		0,
996		0xBF3F,		0,
997		0xBF48,		0,
998		0xBF49,		0,
999		0xBF4A,		calc_q < 4 ? 4 : (calc_q > 124 ? 124 : calc_q),
1000		0xBF4B,		4,
1001		0xBF4C,		0,
1002		0xBF4D,		0,
1003		0xBF4E,		0,
1004		0xBF4F,		0,
1005		0xBF50,		0,
1006		0xBF51,		0,
1007		0,		0,
1008
1009		0x200e,		0x0000,
1010		0xBF40,		sgop_expt_addr & 0x0000FFFF,
1011		0xBF41,		sgop_expt_addr >> 16,
1012		0xBF42,		0,
1013		0xBF43,		0,
1014		0xBF44,		0,
1015		0xBF45,		0,
1016		0xBF46,		(go->width >> 4) * (go->height >> 4),
1017		0xBF47,		0,
1018		0xBF64,		0,
1019		0xBF65,		0,
1020		0xBF18,		framelen[4],
1021		0xBF19,		framelen[5],
1022		0xBF1A,		framelen[6],
1023		0xBF1B,		framelen[7],
1024		0,		0,
1025
1026#if 0
1027		/* Remove once we don't care about matching */
1028		0x200e,		0x0000,
1029		0xBF56,		4,
1030		0xBF57,		0,
1031		0xBF58,		5,
1032		0xBF59,		0,
1033		0xBF5A,		6,
1034		0xBF5B,		0,
1035		0xBF5C,		8,
1036		0xBF5D,		0,
1037		0xBF5E,		1,
1038		0xBF5F,		0,
1039		0xBF60,		1,
1040		0xBF61,		0,
1041		0xBF62,		0,
1042		0xBF63,		0,
1043		0,		0,
1044#else
1045		0x2008,		0x0000,
1046		0xBF56,		4,
1047		0xBF57,		0,
1048		0xBF58,		5,
1049		0xBF59,		0,
1050		0xBF5A,		6,
1051		0xBF5B,		0,
1052		0xBF5C,		8,
1053		0xBF5D,		0,
1054		0,		0,
1055		0,		0,
1056		0,		0,
1057		0,		0,
1058		0,		0,
1059		0,		0,
1060		0,		0,
1061#endif
1062
1063		0x200e,		0x0000,
1064		0xBF10,		0,
1065		0xBF11,		0,
1066		0xBF12,		0,
1067		0xBF13,		0,
1068		0xBF14,		0,
1069		0xBF15,		0,
1070		0xBF16,		0,
1071		0xBF17,		0,
1072		0xBF7E,		0,
1073		0xBF7F,		1,
1074		0xBF52,		framelen[0],
1075		0xBF53,		framelen[1],
1076		0xBF54,		framelen[2],
1077		0xBF55,		framelen[3],
1078		0,		0,
1079	};
1080
1081	return copy_packages(code, pack, 6, space);
1082}
1083
1084static int config_package(struct go7007 *go, __le16 *code, int space)
1085{
1086	int fps = go->sensor_framerate / go->fps_scale / 1000;
1087	int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1088	int brc_window_size = fps;
1089	int q_min = 2, q_max = 31;
1090	int THACCoeffSet0 = 0;
1091	u16 pack[] = {
1092		0x200e,		0x0000,
1093		0xc002,		0x14b4,
1094		0xc003,		0x28b4,
1095		0xc004,		0x3c5a,
1096		0xdc05,		0x2a77,
1097		0xc6c3,		go->format == V4L2_PIX_FMT_MPEG4 ? 0 :
1098				(go->format == V4L2_PIX_FMT_H263 ? 0 : 1),
1099		0xc680,		go->format == V4L2_PIX_FMT_MPEG4 ? 0xf1 :
1100				(go->format == V4L2_PIX_FMT_H263 ? 0x61 :
1101									0xd3),
1102		0xc780,		0x0140,
1103		0xe009,		0x0001,
1104		0xc60f,		0x0008,
1105		0xd4ff,		0x0002,
1106		0xe403,		2340,
1107		0xe406,		75,
1108		0xd411,		0x0001,
1109		0xd410,		0xa1d6,
1110		0x0001,		0x2801,
1111
1112		0x200d,		0x0000,
1113		0xe402,		0x018b,
1114		0xe401,		0x8b01,
1115		0xd472,		(go->board_info->sensor_flags &
1116							GO7007_SENSOR_TV) &&
1117						(!go->interlace_coding) ?
1118					0x01b0 : 0x0170,
1119		0xd475,		(go->board_info->sensor_flags &
1120							GO7007_SENSOR_TV) &&
1121						(!go->interlace_coding) ?
1122					0x0008 : 0x0009,
1123		0xc404,		go->interlace_coding ? 0x44 :
1124				(go->format == V4L2_PIX_FMT_MPEG4 ? 0x11 :
1125				(go->format == V4L2_PIX_FMT_MPEG1 ? 0x02 :
1126				(go->format == V4L2_PIX_FMT_MPEG2 ? 0x04 :
1127				(go->format == V4L2_PIX_FMT_H263  ? 0x08 :
1128								     0x20)))),
1129		0xbf0a,		(go->format == V4L2_PIX_FMT_MPEG4 ? 8 :
1130				(go->format == V4L2_PIX_FMT_MPEG1 ? 1 :
1131				(go->format == V4L2_PIX_FMT_MPEG2 ? 2 :
1132				(go->format == V4L2_PIX_FMT_H263 ? 4 : 16)))) |
1133				((go->repeat_seqhead ? 1 : 0) << 6) |
1134				((go->dvd_mode ? 1 : 0) << 9) |
1135				((go->gop_header_enable ? 1 : 0) << 10),
1136		0xbf0b,		0,
1137		0xdd5a,		go->ipb ? 0x14 : 0x0a,
1138		0xbf0c,		0,
1139		0xbf0d,		0,
1140		0xc683,		THACCoeffSet0,
1141		0xc40a,		(go->width << 4) | rows,
1142		0xe01a,		go->board_info->hpi_buffer_cap,
1143		0,		0,
1144		0,		0,
1145
1146		0x2008,		0,
1147		0xe402,		0x88,
1148		0xe401,		0x8f01,
1149		0xbf6a,		0,
1150		0xbf6b,		0,
1151		0xbf6c,		0,
1152		0xbf6d,		0,
1153		0xbf6e,		0,
1154		0xbf6f,		0,
1155		0,		0,
1156		0,		0,
1157		0,		0,
1158		0,		0,
1159		0,		0,
1160		0,		0,
1161		0,		0,
1162
1163		0x200e,		0,
1164		0xbf66,		brc_window_size,
1165		0xbf67,		0,
1166		0xbf68,		q_min,
1167		0xbf69,		q_max,
1168		0xbfe0,		0,
1169		0xbfe1,		0,
1170		0xbfe2,		0,
1171		0xbfe3,		go->ipb ? 3 : 1,
1172		0xc031,		go->board_info->sensor_flags &
1173					GO7007_SENSOR_VBI ? 1 : 0,
1174		0xc01c,		0x1f,
1175		0xdd8c,		0x15,
1176		0xdd94,		0x15,
1177		0xdd88,		go->ipb ? 0x1401 : 0x0a01,
1178		0xdd90,		go->ipb ? 0x1401 : 0x0a01,
1179		0,		0,
1180
1181		0x200e,		0,
1182		0xbfe4,		0,
1183		0xbfe5,		0,
1184		0xbfe6,		0,
1185		0xbfe7,		fps << 8,
1186		0xbfe8,		0x3a00,
1187		0xbfe9,		0,
1188		0xbfea,		0,
1189		0xbfeb,		0,
1190		0xbfec,		(go->interlace_coding ? 1 << 15 : 0) |
1191					(go->modet_enable ? 0xa : 0) |
1192					(go->board_info->sensor_flags &
1193						GO7007_SENSOR_VBI ? 1 : 0),
1194		0xbfed,		0,
1195		0xbfee,		0,
1196		0xbfef,		0,
1197		0xbff0,		go->board_info->sensor_flags &
1198					GO7007_SENSOR_TV ? 0xf060 : 0xb060,
1199		0xbff1,		0,
1200		0,		0,
1201	};
1202
1203	return copy_packages(code, pack, 5, space);
1204}
1205
1206static int seqhead_to_package(struct go7007 *go, __le16 *code, int space,
1207	int (*sequence_header_func)(struct go7007 *go,
1208		unsigned char *buf, int ext))
1209{
1210	int vop_time_increment_bitlength = vti_bitlen(go);
1211	int fps = go->sensor_framerate / go->fps_scale *
1212					(go->interlace_coding ? 2 : 1);
1213	unsigned char buf[40] = { };
1214	int len = sequence_header_func(go, buf, 1);
1215	u16 pack[] = {
1216		0x2006,		0,
1217		0xbf08,		fps,
1218		0xbf09,		0,
1219		0xbff2,		vop_time_increment_bitlength,
1220		0xbff3,		(1 << vop_time_increment_bitlength) - 1,
1221		0xbfe6,		0,
1222		0xbfe7,		(fps / 1000) << 8,
1223		0,		0,
1224		0,		0,
1225		0,		0,
1226		0,		0,
1227		0,		0,
1228		0,		0,
1229		0,		0,
1230		0,		0,
1231		0,		0,
1232
1233		0x2007,		0,
1234		0xc800,		buf[2] << 8 | buf[3],
1235		0xc801,		buf[4] << 8 | buf[5],
1236		0xc802,		buf[6] << 8 | buf[7],
1237		0xc803,		buf[8] << 8 | buf[9],
1238		0xc406,		64,
1239		0xc407,		len - 64,
1240		0xc61b,		1,
1241		0,		0,
1242		0,		0,
1243		0,		0,
1244		0,		0,
1245		0,		0,
1246		0,		0,
1247		0,		0,
1248		0,		0,
1249
1250		0x200e,		0,
1251		0xc808,		buf[10] << 8 | buf[11],
1252		0xc809,		buf[12] << 8 | buf[13],
1253		0xc80a,		buf[14] << 8 | buf[15],
1254		0xc80b,		buf[16] << 8 | buf[17],
1255		0xc80c,		buf[18] << 8 | buf[19],
1256		0xc80d,		buf[20] << 8 | buf[21],
1257		0xc80e,		buf[22] << 8 | buf[23],
1258		0xc80f,		buf[24] << 8 | buf[25],
1259		0xc810,		buf[26] << 8 | buf[27],
1260		0xc811,		buf[28] << 8 | buf[29],
1261		0xc812,		buf[30] << 8 | buf[31],
1262		0xc813,		buf[32] << 8 | buf[33],
1263		0xc814,		buf[34] << 8 | buf[35],
1264		0xc815,		buf[36] << 8 | buf[37],
1265		0,		0,
1266		0,		0,
1267		0,		0,
1268	};
1269
1270	return copy_packages(code, pack, 3, space);
1271}
1272
1273static int relative_prime(int big, int little)
1274{
1275	int remainder;
1276
1277	while (little != 0) {
1278		remainder = big % little;
1279		big = little;
1280		little = remainder;
1281	}
1282	return big;
1283}
1284
1285static int avsync_to_package(struct go7007 *go, __le16 *code, int space)
1286{
1287	int arate = go->board_info->audio_rate * 1001 * go->fps_scale;
1288	int ratio = arate / go->sensor_framerate;
1289	int adjratio = ratio * 215 / 100;
1290	int rprime = relative_prime(go->sensor_framerate,
1291					arate % go->sensor_framerate);
1292	int f1 = (arate % go->sensor_framerate) / rprime;
1293	int f2 = (go->sensor_framerate - arate % go->sensor_framerate) / rprime;
1294	u16 pack[] = {
1295		0x200e,		0,
1296		0xbf98,		(u16)((-adjratio) & 0xffff),
1297		0xbf99,		(u16)((-adjratio) >> 16),
1298		0xbf92,		0,
1299		0xbf93,		0,
1300		0xbff4,		f1 > f2 ? f1 : f2,
1301		0xbff5,		f1 < f2 ? f1 : f2,
1302		0xbff6,		f1 < f2 ? ratio : ratio + 1,
1303		0xbff7,		f1 > f2 ? ratio : ratio + 1,
1304		0xbff8,		0,
1305		0xbff9,		0,
1306		0xbffa,		adjratio & 0xffff,
1307		0xbffb,		adjratio >> 16,
1308		0xbf94,		0,
1309		0xbf95,		0,
1310		0,		0,
1311	};
1312
1313	return copy_packages(code, pack, 1, space);
1314}
1315
1316static int final_package(struct go7007 *go, __le16 *code, int space)
1317{
1318	int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1319	u16 pack[] = {
1320		0x8000,
1321		0,
1322		0,
1323		0,
1324		0,
1325		0,
1326		0,
1327		2,
1328		((go->board_info->sensor_flags & GO7007_SENSOR_TV) &&
1329						(!go->interlace_coding) ?
1330					(1 << 14) | (1 << 9) : 0) |
1331			((go->encoder_subsample ? 1 : 0) << 8) |
1332			(go->board_info->sensor_flags &
1333				GO7007_SENSOR_CONFIG_MASK),
1334		((go->encoder_v_halve ? 1 : 0) << 14) |
1335			(go->encoder_v_halve ? rows << 9 : rows << 8) |
1336			(go->encoder_h_halve ? 1 << 6 : 0) |
1337			(go->encoder_h_halve ? go->width >> 3 : go->width >> 4),
1338		(1 << 15) | (go->encoder_v_offset << 6) |
1339			(1 << 7) | (go->encoder_h_offset >> 2),
1340		(1 << 6),
1341		0,
1342		0,
1343		((go->fps_scale - 1) << 8) |
1344			(go->board_info->sensor_flags & GO7007_SENSOR_TV ?
1345						(1 << 7) : 0) |
1346			0x41,
1347		go->ipb ? 0xd4c : 0x36b,
1348		(rows << 8) | (go->width >> 4),
1349		go->format == V4L2_PIX_FMT_MPEG4 ? 0x0404 : 0,
1350		(1 << 15) | ((go->interlace_coding ? 1 : 0) << 13) |
1351			((go->closed_gop ? 1 : 0) << 12) |
1352			((go->format == V4L2_PIX_FMT_MPEG4 ? 1 : 0) << 11) |
1353		/*	(1 << 9) |   */
1354			((go->ipb ? 3 : 0) << 7) |
1355			((go->modet_enable ? 1 : 0) << 2) |
1356			((go->dvd_mode ? 1 : 0) << 1) | 1,
1357		(go->format == V4L2_PIX_FMT_MPEG1 ? 0x89a0 :
1358			(go->format == V4L2_PIX_FMT_MPEG2 ? 0x89a0 :
1359			(go->format == V4L2_PIX_FMT_MJPEG ? 0x89a0 :
1360			(go->format == V4L2_PIX_FMT_MPEG4 ? 0x8920 :
1361			(go->format == V4L2_PIX_FMT_H263 ? 0x8920 : 0))))),
1362		go->ipb ? 0x1f15 : 0x1f0b,
1363		go->ipb ? 0x0015 : 0x000b,
1364		go->ipb ? 0xa800 : 0x5800,
1365		0xffff,
1366		0x0020 + 0x034b * 0,
1367		0x0020 + 0x034b * 1,
1368		0x0020 + 0x034b * 2,
1369		0x0020 + 0x034b * 3,
1370		0x0020 + 0x034b * 4,
1371		0x0020 + 0x034b * 5,
1372		go->ipb ? (go->gop_size / 3) : go->gop_size,
1373		(go->height >> 4) * (go->width >> 4) * 110 / 100,
1374	};
1375
1376	return copy_packages(code, pack, 1, space);
1377}
1378
1379static int audio_to_package(struct go7007 *go, __le16 *code, int space)
1380{
1381	int clock_config = ((go->board_info->audio_flags &
1382				GO7007_AUDIO_I2S_MASTER ? 1 : 0) << 11) |
1383			((go->board_info->audio_flags &
1384				GO7007_AUDIO_OKI_MODE ? 1 : 0) << 8) |
1385			(((go->board_info->audio_bclk_div / 4) - 1) << 4) |
1386			(go->board_info->audio_main_div - 1);
1387	u16 pack[] = {
1388		0x200d,		0,
1389		0x9002,		0,
1390		0x9002,		0,
1391		0x9031,		0,
1392		0x9032,		0,
1393		0x9033,		0,
1394		0x9034,		0,
1395		0x9035,		0,
1396		0x9036,		0,
1397		0x9037,		0,
1398		0x9040,		0,
1399		0x9000,		clock_config,
1400		0x9001,		(go->board_info->audio_flags & 0xffff) |
1401					(1 << 9),
1402		0x9000,		((go->board_info->audio_flags &
1403						GO7007_AUDIO_I2S_MASTER ?
1404						1 : 0) << 10) |
1405					clock_config,
1406		0,		0,
1407		0,		0,
1408		0x2005,		0,
1409		0x9041,		0,
1410		0x9042,		256,
1411		0x9043,		0,
1412		0x9044,		16,
1413		0x9045,		16,
1414		0,		0,
1415		0,		0,
1416		0,		0,
1417		0,		0,
1418		0,		0,
1419		0,		0,
1420		0,		0,
1421		0,		0,
1422		0,		0,
1423		0,		0,
1424	};
1425
1426	return copy_packages(code, pack, 2, space);
1427}
1428
1429static int modet_to_package(struct go7007 *go, __le16 *code, int space)
1430{
1431	bool has_modet0 = go->modet[0].enable;
1432	bool has_modet1 = go->modet[1].enable;
1433	bool has_modet2 = go->modet[2].enable;
1434	bool has_modet3 = go->modet[3].enable;
1435	int ret, mb, i, addr, cnt = 0;
1436	u16 pack[32];
1437	u16 thresholds[] = {
1438		0x200e,		0,
1439		0xbf82,		has_modet0 ? go->modet[0].pixel_threshold : 32767,
1440		0xbf83,		has_modet1 ? go->modet[1].pixel_threshold : 32767,
1441		0xbf84,		has_modet2 ? go->modet[2].pixel_threshold : 32767,
1442		0xbf85,		has_modet3 ? go->modet[3].pixel_threshold : 32767,
1443		0xbf86,		has_modet0 ? go->modet[0].motion_threshold : 32767,
1444		0xbf87,		has_modet1 ? go->modet[1].motion_threshold : 32767,
1445		0xbf88,		has_modet2 ? go->modet[2].motion_threshold : 32767,
1446		0xbf89,		has_modet3 ? go->modet[3].motion_threshold : 32767,
1447		0xbf8a,		has_modet0 ? go->modet[0].mb_threshold : 32767,
1448		0xbf8b,		has_modet1 ? go->modet[1].mb_threshold : 32767,
1449		0xbf8c,		has_modet2 ? go->modet[2].mb_threshold : 32767,
1450		0xbf8d,		has_modet3 ? go->modet[3].mb_threshold : 32767,
1451		0xbf8e,		0,
1452		0xbf8f,		0,
1453		0,		0,
1454	};
1455
1456	ret = copy_packages(code, thresholds, 1, space);
1457	if (ret < 0)
1458		return -1;
1459	cnt += ret;
1460
1461	addr = 0xbac0;
1462	memset(pack, 0, 64);
1463	i = 0;
1464	for (mb = 0; mb < 1624; ++mb) {
1465		pack[i * 2 + 3] <<= 2;
1466		pack[i * 2 + 3] |= go->modet_map[mb];
1467		if (mb % 8 != 7)
1468			continue;
1469		pack[i * 2 + 2] = addr++;
1470		++i;
1471		if (i == 10 || mb == 1623) {
1472			pack[0] = 0x2000 | i;
1473			ret = copy_packages(code + cnt, pack, 1, space - cnt);
1474			if (ret < 0)
1475				return -1;
1476			cnt += ret;
1477			i = 0;
1478			memset(pack, 0, 64);
1479		}
1480		pack[i * 2 + 3] = 0;
1481	}
1482
1483	memset(pack, 0, 64);
1484	i = 0;
1485	for (addr = 0xbb90; addr < 0xbbfa; ++addr) {
1486		pack[i * 2 + 2] = addr;
1487		pack[i * 2 + 3] = 0;
1488		++i;
1489		if (i == 10 || addr == 0xbbf9) {
1490			pack[0] = 0x2000 | i;
1491			ret = copy_packages(code + cnt, pack, 1, space - cnt);
1492			if (ret < 0)
1493				return -1;
1494			cnt += ret;
1495			i = 0;
1496			memset(pack, 0, 64);
1497		}
1498	}
1499	return cnt;
1500}
1501
1502static int do_special(struct go7007 *go, u16 type, __le16 *code, int space,
1503			int *framelen)
1504{
1505	switch (type) {
1506	case SPECIAL_FRM_HEAD:
1507		switch (go->format) {
1508		case V4L2_PIX_FMT_MJPEG:
1509			return gen_mjpeghdr_to_package(go, code, space);
1510		case V4L2_PIX_FMT_MPEG1:
1511		case V4L2_PIX_FMT_MPEG2:
1512			return gen_mpeg1hdr_to_package(go, code, space,
1513								framelen);
1514		case V4L2_PIX_FMT_MPEG4:
1515			return gen_mpeg4hdr_to_package(go, code, space,
1516								framelen);
1517		}
1518	case SPECIAL_BRC_CTRL:
1519		return brctrl_to_package(go, code, space, framelen);
1520	case SPECIAL_CONFIG:
1521		return config_package(go, code, space);
1522	case SPECIAL_SEQHEAD:
1523		switch (go->format) {
1524		case V4L2_PIX_FMT_MPEG1:
1525		case V4L2_PIX_FMT_MPEG2:
1526			return seqhead_to_package(go, code, space,
1527					mpeg1_sequence_header);
1528		case V4L2_PIX_FMT_MPEG4:
1529			return seqhead_to_package(go, code, space,
1530					mpeg4_sequence_header);
1531		default:
1532			return 0;
1533		}
1534	case SPECIAL_AV_SYNC:
1535		return avsync_to_package(go, code, space);
1536	case SPECIAL_FINAL:
1537		return final_package(go, code, space);
1538	case SPECIAL_AUDIO:
1539		return audio_to_package(go, code, space);
1540	case SPECIAL_MODET:
1541		return modet_to_package(go, code, space);
1542	}
1543	dev_err(go->dev,
1544		"firmware file contains unsupported feature %04x\n", type);
1545	return -1;
1546}
1547
1548int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen)
1549{
1550	const struct firmware *fw_entry;
1551	__le16 *code, *src;
1552	int framelen[8] = { }; /* holds the lengths of empty frame templates */
1553	int codespace = 64 * 1024, i = 0, srclen, chunk_len, chunk_flags;
1554	int mode_flag;
1555	int ret;
1556
1557	switch (go->format) {
1558	case V4L2_PIX_FMT_MJPEG:
1559		mode_flag = FLAG_MODE_MJPEG;
1560		break;
1561	case V4L2_PIX_FMT_MPEG1:
1562		mode_flag = FLAG_MODE_MPEG1;
1563		break;
1564	case V4L2_PIX_FMT_MPEG2:
1565		mode_flag = FLAG_MODE_MPEG2;
1566		break;
1567	case V4L2_PIX_FMT_MPEG4:
1568		mode_flag = FLAG_MODE_MPEG4;
1569		break;
1570	default:
1571		return -1;
1572	}
1573	if (request_firmware(&fw_entry, GO7007_FW_NAME, go->dev)) {
1574		dev_err(go->dev,
1575			"unable to load firmware from file \"%s\"\n",
1576			GO7007_FW_NAME);
1577		return -1;
1578	}
1579	code = kzalloc(codespace * 2, GFP_KERNEL);
1580	if (code == NULL)
1581		goto fw_failed;
1582
1583	src = (__le16 *)fw_entry->data;
1584	srclen = fw_entry->size / 2;
1585	while (srclen >= 2) {
1586		chunk_flags = __le16_to_cpu(src[0]);
1587		chunk_len = __le16_to_cpu(src[1]);
1588		if (chunk_len + 2 > srclen) {
1589			dev_err(go->dev,
1590				"firmware file \"%s\" appears to be corrupted\n",
1591				GO7007_FW_NAME);
1592			goto fw_failed;
1593		}
1594		if (chunk_flags & mode_flag) {
1595			if (chunk_flags & FLAG_SPECIAL) {
1596				ret = do_special(go, __le16_to_cpu(src[2]),
1597					&code[i], codespace - i, framelen);
1598				if (ret < 0) {
1599					dev_err(go->dev,
1600						"insufficient memory for firmware construction\n");
1601					goto fw_failed;
1602				}
1603				i += ret;
1604			} else {
1605				if (codespace - i < chunk_len) {
1606					dev_err(go->dev,
1607						"insufficient memory for firmware construction\n");
1608					goto fw_failed;
1609				}
1610				memcpy(&code[i], &src[2], chunk_len * 2);
1611				i += chunk_len;
1612			}
1613		}
1614		srclen -= chunk_len + 2;
1615		src += chunk_len + 2;
1616	}
1617	release_firmware(fw_entry);
1618	*fw = (u8 *)code;
1619	*fwlen = i * 2;
1620	return 0;
1621
1622fw_failed:
1623	kfree(code);
1624	release_firmware(fw_entry);
1625	return -1;
1626}
1627
1628MODULE_FIRMWARE(GO7007_FW_NAME);
1629